如何在GPT的帮助下利用Python实现数据可视化?(以INT104的Report1为例)

前文

Python是一门上手简单的编程语言,但是对于一些编程不是很熟练的人来说可能我们很难一下上手,或者我们长期没有使用Python对里面的一些语法不是很熟练以至于我们一时间无法完成当前我们上头上的工作,其实像数据可视化这种简单的工作我们可以在GPT的帮助下,快速完成,我们需要学会如何利用GPT完成我们的工作以及一些GPT出错的时候我们该如何解决问题。

本文将以INT104的Report1为例,Report的大背景是希望我们通过学习的知识分析前一年学生们在这门课上的各个特征与对应的专业的关系,其实这里有些东西比较勉强,是因为这个数据不太好,但我会分享我的想法尽量让这篇文章能教会你学会使用GPT、学会基础的人工智能知识

网上的各种GPT的结果都比较相近和类似,我这里以我自己学校的GPT为例。

数据可视化

1.什么是数据可视化?

首先我们得知道什么是数据?数据首先它记录了事物的特征,在我们讨论的这个领域大部分以数学化的符号来表达。他记录了事物的特征但如果我们想知道特征背后的关系或者趋势以数字化呈现的数据我们可能就很难下手了。

比如我们比较容易地可以知道每个人都考了多少分,但是我们想知道这群人的最高分是谁,如果我们只有5个人我们可能一下就能知道最高分是谁,但是如果是50个人?500个人呢?这个关系我们就很难一下子就找出来了。或者我想知道班上人考的分数集中在哪个分数段,这种关系也很难凭肉眼去立刻发现。

数据可视化就是用图表之类的形式将数字化的数据转变成简单理解、清晰直观的形式。在这种形式下人们可以更好地理解特征背后的关系或者趋势。常见的数据可视化形式有直方图、折线图、散点图、饼图。

2.做个箱线图(box plot)试试

拿到一组数据我们可以先尝试做一个箱线图,箱线图会展示数据的中位数、上下四分位数、最大值和最小值。箱线图中的长方形的上边和下边分别代表上下四分位数,长方形中间的线代表中位数,然后向上和向下延长的是上边缘下边缘代表其的最大值最小值,如果还有小圆点,那个是噪点或者异常点,是一些异常值

箱线图可以清晰地反映出数据的分布情况和离散程度,我们还可以通过箱线图知道数据的异常值情况。

我们现在尝试问一下GPT做一个箱线图试一试,但是如果对于GPT3.5这种我们无法将数据丢给他们,所以我们得跟GPT描述清楚我们的背景情况,并且说清楚我们要如何去解决。因此我们应该试着这样问GPT:我现在有一个名为CW_Data的xlsx文件,其中他有11列,分别是Index、Gender、Programme、Grade、Total、MCQ、Q1、Q2、Q3、Q4、Q5,我现在想用Python对这个文件下的数据进行数据可视化,做成一个箱线图呈现出来。(前面告诉它问题的背景,后面告诉我现在需要做什么)

让我们将代码复制下来放到我们的IDE中,如果你的Python没有安装好Anaconda的环境或者没有对应的pip包其中的pandas和matplotlib.pyplot可能报错,你可以将鼠标放到红波浪线的位置然后点击install让IDE自动安装对应的包,你也可以切换到终端输入pip install pandas来下载pandas的裤,同理你需要再次输入pip install matplotlib以下载matplotlib库。当然通过这一步我们可以知道我们可以通过运行“pip install (库名)”从而在我的Python环境中使用某个库。

import pandas as pd
import matplotlib.pyplot as plt

data = pd.read_excel('CW_Data.xlsx')
# 选择需要可视化的数据列
data_to_visualize = data[['Total', 'MCQ', 'Q1', 'Q2', 'Q3', 'Q4', 'Q5']]

# 创建箱线图
plt.figure(figsize=(10, 6))
data_to_visualize.boxplot()
plt.title('Boxplot of Exam Scores')
plt.ylabel('Score')
plt.show()

然后我们可以先检查一下这个代码,前两行是导入库,然后我们在第四行读取了文件,第五行的注释告诉了我们第六行的作用,同理第八行的注释告诉了我们后五行创建了箱线图,其中第一行应该是图的大小,第二行是图的类型,第三行是图的标题,第四行是添加纵坐标的标签,第五行是展现这个图。

然后运行我们的代码,检查是否有结果,这里我的电脑出了一个报错,那我可以将错误复制粘贴给GPT问它为什么会有bug。比如我这里有一个报错,我就问了GPT是怎么回事。按照它的解决方案我成功解决了bug,从而我成功获得了箱线图。

我们借这张图顺便复习一下箱线图

我们成功已经在GPT的帮助下完成了一次数据可视化了,让我们尝试举一反三,先从我们不利用GPT写一下代码,我们可以将可视化的数据列多加几个列,我们把所有列都加进去,因此我们修改了我们的代码为以下代码。

import pandas as pd
import matplotlib.pyplot as plt

data = pd.read_excel('CW_Data.xlsx')
# 选择需要可视化的数据列
data_to_visualize = data[['Index','Gender','Programme','Grade','Total', 'MCQ', 'Q1', 'Q2', 'Q3', 'Q4', 'Q5']]

# 创建箱线图
plt.figure(figsize=(10, 6))
data_to_visualize.boxplot()
plt.title('Boxplot of Exam Scores')
plt.ylabel('Score')
plt.show()

运行结果如下。

这张图它对我们的参考意义就很小,因为我们将Index都考虑了进来因此我们得到的图其他的值都会因为Index值太大,而范围太小无法使我们观察清晰,因此Index在这张图我们不需要放进来,实际上Index只是一个给数据编号或者标识符,他并不是一个真正意义上的数据特征,因为我们可以将这个数据倒着过来编号,它和数据本身的关系就是人为赋予的,因此我们完全可以去掉Index

我们要探究的是学生们在这门课上的各个特征与对应的专业的关系,所以我们后续的很多数据分析也可以去掉Programme

我们还可以通过对数据进行标准化从而减少原始数据的规模影响从而更好地进行数据分析,标准化可以帮助我们调整数据的分布使数据符合标准分布。

因此我们可以让GPT帮我们进行一次标准化再生成对应的图,询问后他给了我一个代码如下。

import pandas as pd
import matplotlib.pyplot as plt
from sklearn.preprocessing import StandardScaler

data = pd.read_excel('CW_Data.xlsx')

# 创建一个StandardScaler对象
scaler = StandardScaler()
# 将scaler适配到数据并进行转换
scaled_data = scaler.fit_transform(data)
# 选择需要可视化的数据列
data_to_visualize = scaled_data[['Gender','Grade','Total', 'MCQ', 'Q1', 'Q2', 'Q3', 'Q4', 'Q5']]

# 创建箱线图
plt.figure(figsize=(10, 6))
data_to_visualize.boxplot()
plt.title('Boxplot of Exam Scores')
plt.ylabel('Score')
plt.show()

然后这个代码报错后,我将错误复制粘贴询问给GPT它指出了标准化后的数据是一个Numpy数组而不是DataFrame因此我让它帮我修改了代码,最后的结果如下。

import pandas as pd
import matplotlib.pyplot as plt
from sklearn.preprocessing import StandardScaler

data = pd.read_excel('CW_Data.xlsx')

# 创建一个StandardScaler对象
scaler = StandardScaler()
# 将scaler适配到数据并进行转换
scaled_data = scaler.fit_transform(data)
scaled_data = pd.DataFrame(scaled_data, columns=data.columns)  # 转换为DataFrame

# 选择需要可视化的数据列
data_to_visualize = scaled_data[['Gender','Grade','Total', 'MCQ', 'Q1', 'Q2', 'Q3', 'Q4', 'Q5']]

# 创建箱线图
plt.figure(figsize=(10, 6))
data_to_visualize.boxplot()
plt.title('Boxplot of Exam Scores')
plt.ylabel('Score')
plt.show()

我们可以很清楚地知道这个代码的第8行和第10行是进行标准化的操作,然后第11行是将Numpy数组转化成了DataFrame,如果你对某些行的代码不理解,你可以选择将对应代码告诉它让它解释一下或者告诉它哪行不理解需要它解释一下,我们用GPT不仅是为了完成代码还是要理解里面的原理。

画出的图如下。

3.PCA(主成分分析)

我们要想探究特征与Programme的关系,我们如果直接将他作为点呈现出来,每一个特征一个坐标轴呈现,很明显不可能,因为我们一共还有9个特征,我们无法画出一个9维的图出来。但是我们可以使用PCA将9维降低为2维或者其他维度的图,从而方便我们去观察里面的关系。

同样像这种概念性问题,你也可以尝试询问GPT,你可以问GPT:“什么是PCA?”

我们现在要让GPT帮助我们完成PCA的代码,我们可以把我们之前的代码进行复制然后粘贴后并问它“能在我的代码的基础上使用PCA然后将这个9维的数据压缩成2维的数据用散点图呈现出来吗?”它给了我们如下代码。

import pandas as pd
import matplotlib.pyplot as plt
from sklearn.preprocessing import StandardScaler
from sklearn.decomposition import PCA

data = pd.read_excel('CW_Data.xlsx')

# 创建一个StandardScaler对象
scaler = StandardScaler()
# 将scaler适配到数据并进行转换
scaled_data = scaler.fit_transform(data)
scaled_data = pd.DataFrame(scaled_data, columns=data.columns)  # 转换为DataFrame

# 使用PCA将数据压缩到2维
pca = PCA(n_components=2)
pca_data = pca.fit_transform(scaled_data)

# 将压缩后的数据转换为DataFrame
pca_df = pd.DataFrame(data=pca_data, columns=['PC1', 'PC2'])

# 创建散点图
plt.figure(figsize=(8, 6))
plt.scatter(pca_df['PC1'], pca_df['PC2'])
plt.title('PCA of Exam Scores (2 Components)')
plt.xlabel('Principal Component 1')
plt.ylabel('Principal Component 2')
plt.show()

运行完后我们发现这里的结果有两个问题:1.我们的图的点都是一个颜色的,我们希望它能以Programme的不同而用不同颜色进行区分,这样我们可以试图寻找一下这里的关系。2.我们本来只选择了数据的其中9个进行PCA操作,但是GPT去掉了,这也是我们不能完全依赖它的原因。我们现在需要跟GPT说出这两个方面的问题以让它改正。

最后的代码如下。

import pandas as pd
import matplotlib.pyplot as plt
from sklearn.preprocessing import StandardScaler
from sklearn.decomposition import PCA

data = pd.read_excel('CW_Data.xlsx')

# 创建一个StandardScaler对象
scaler = StandardScaler()
# 将scaler适配到数据并进行转换
scaled_data = scaler.fit_transform(data)
scaled_data = pd.DataFrame(scaled_data, columns=data.columns)  # 转换为DataFrame

# 选择需要进行PCA处理的数据列
data_to_visualize = scaled_data[['Gender', 'Grade', 'Total', 'MCQ', 'Q1', 'Q2', 'Q3', 'Q4', 'Q5']]

# 使用PCA将数据压缩到2维
pca = PCA(n_components=2)
pca_data = pca.fit_transform(data_to_visualize)

# 将压缩后的数据转换为DataFrame
pca_df = pd.DataFrame(data=pca_data, columns=['PC1', 'PC2'])

# 将原始数据和压缩后的数据合并
pca_result = pd.concat([scaled_data, pca_df], axis=1)

# 创建散点图,并按照不同的Programme进行着色
plt.figure(figsize=(8, 6))
programs = data['Programme'].unique()
colors = ['b', 'g', 'r', 'c']  # 不同Programme对应的颜色
for program, color in zip(programs, colors):
    program_data = pca_result[data['Programme'] == program]
    plt.scatter(program_data['PC1'], program_data['PC2'], c=color, label=program)
plt.title('PCA of Exam Scores (2 Components) by Programme')
plt.xlabel('Principal Component 1')
plt.ylabel('Principal Component 2')
plt.legend()
plt.show()

这个生成的图其实还有很多地方可以改进,比如图的大小可以修改,散点的颜色可以修改。

最后修改一下代码,代码和生成的图如下。

import pandas as pd
import matplotlib.pyplot as plt
from sklearn.preprocessing import StandardScaler
from sklearn.decomposition import PCA

data = pd.read_excel('CW_Data.xlsx')

# 创建一个StandardScaler对象
scaler = StandardScaler()
# 将scaler适配到数据并进行转换
scaled_data = scaler.fit_transform(data)
scaled_data = pd.DataFrame(scaled_data, columns=data.columns)  # 转换为DataFrame

# 选择需要进行PCA处理的数据列
data_to_visualize = scaled_data[['Gender', 'Grade', 'Total', 'MCQ', 'Q1', 'Q2', 'Q3', 'Q4', 'Q5']]

# 使用PCA将数据压缩到2维
pca = PCA(n_components=2)
pca_data = pca.fit_transform(data_to_visualize)

# 将压缩后的数据转换为DataFrame
pca_df = pd.DataFrame(data=pca_data, columns=['PC1', 'PC2'])

# 将原始数据和压缩后的数据合并
pca_result = pd.concat([scaled_data, pca_df], axis=1)

# 创建散点图,并按照不同的Programme进行着色
plt.figure(figsize=(10, 6))
color_map = {1: 'r', 2: 'b', 3: 'g', 4: 'yellow'}  # 不同Programme对应的颜色
for program, color in color_map.items():
    program_data = pca_result[data['Programme'] == program]
    plt.scatter(program_data['PC1'], program_data['PC2'], c=color, label=f'{program}')
plt.title('PCA of Exam Scores (2 Components) by Programme')
plt.xlabel('Principal Component 1')
plt.ylabel('Principal Component 2')
plt.legend(title='Programme', loc='upper right', bbox_to_anchor=(1.13, 1))
plt.show()

 

如果你了解PCA的话,PCA的主成分1和2都是由原始数据中的特征经过变换得到的,换句话说这里的主成分1和2不是某一个特征而是他们的综合性结果,但是我们可以通过loading来获取原始特征再每个主成分中的权重或贡献度,从而了解主成分的构成,生成的代码和结果如下。

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.preprocessing import StandardScaler
from sklearn.decomposition import PCA

data = pd.read_excel('CW_Data.xlsx')

# 创建一个StandardScaler对象
scaler = StandardScaler()
# 将scaler适配到数据并进行转换
scaled_data = scaler.fit_transform(data)
scaled_data = pd.DataFrame(scaled_data, columns=data.columns)  # 转换为DataFrame

# 选择需要进行PCA处理的数据列
data_to_visualize = scaled_data[['Gender', 'Grade', 'Total', 'MCQ', 'Q1', 'Q2', 'Q3', 'Q4', 'Q5']]

# 使用PCA将数据压缩到2维
pca = PCA(n_components=2)
pca_data = pca.fit_transform(data_to_visualize)

# 将压缩后的数据转换为DataFrame
pca_df = pd.DataFrame(data=pca_data, columns=['PC1', 'PC2'])

# 将原始数据和压缩后的数据合并
pca_result = pd.concat([scaled_data, pca_df], axis=1)

# 创建散点图,并按照不同的Programme进行着色
plt.figure(figsize=(10, 6))
color_map = {1: 'r', 2: 'b', 3: 'g', 4: 'yellow'}  # 不同Programme对应的颜色
for program, color in color_map.items():
    program_data = pca_result[data['Programme'] == program]
    plt.scatter(program_data['PC1'], program_data['PC2'], c=color, label=f'{program}')
plt.title('PCA of Exam Scores (2 Components) by Programme')
plt.xlabel('Principal Component 1')
plt.ylabel('Principal Component 2')
plt.legend(title='Programme', loc='upper right', bbox_to_anchor=(1.13, 1))
plt.show()
# 计算特征向量和特征值
eigenvectors = pca.components_
eigenvalues = pca.explained_variance_
loadings = eigenvectors.T * np.sqrt(eigenvalues)

print("Loadings:\n", loadings)

 

同样你可以自己尝试将Loadings的数据进行数据可视化。

我们通过这个Loadings我们可以知道主成分1主要是Total也就是分数构成的,而主成分2主要是由Gender和Grade构成的。

大家因为分数不同很容易理解,就像我们以前数学中的正态分布(高斯分布)一样大部分同学的分数集中在中间,少部分考的很高或者很低,那我们如何理解主成分2呢?

我们现在看到纵轴可以理解成有四个部分组成,上面两部分颜色相近,下面两部分则都是绿色,有没有可能他们的区别是性别呢,或者我们可以试着去掉性别,他们会不会融合在一起呢?

于是我们去掉Gender试了一下,生成的图和Loading值如下。

我们通过刚刚的步骤证明了,的确分成了四个部分其实是因为性别导致的。

而如今Loading的主要构成是Grade,而绿色部分整体表现更高,原因是什么呢?

我们可以猜测可能是因为他们的Grade比另外三个专业的更高,我们可以点进数据里手动查看一下,发现的确是如此,因此那几个跟绿色在一起的点我们也很容易知道,他们应该是因为一些原因导致他们在更高的年纪继续读了这门课。

理解了这些部分有助于你更好地学习下一节课的知识——有监督学习。

当然你还可以试着去掉Total或者Grade从而发现一些的新的结论,这里便不再详细叙述。

4.试试其他数据可视化

我们是想知道特征和专业的关系,那我们是否有什么可以直接找到关系的数据可视化呢?

我们可以试着通过Spearman’s rank correlation coefficient再使用热力图展示这些特征与Programme来计算相关性。

生成的图如下。

你也可以尝试其他的数据可视化图或者使用T-SNE 等方法可视化高维数据。

其他问题

1.每次都要装库好麻烦,有什么好的办法吗?

推荐使用Anaconda,然后选择Anaconda的环境,这个环境会内置很多库比如Numpy,Pandas。

安装以及使用Anaconda请看这篇文章:Anaconda全程详细教学-CSDN博客

2.Python的图如何保存?

首先我这里建议使用Pycharm的Professional版,Pycharm的专业版可以展现生成的图的历史记录,在生成多张图的时候我们可以一起查看,而且我们修改代码后我们也方便将之前的结果与现在的结果进行对比。

如你是学生不知道怎么免费使用Pycharm的Professional版,你可以查看这个教程:IDEA等JetBrains产品(包含PyCharm、Rider等)该如何使用学生认证免费使用其全部功能_jetbrains 学生 激活-CSDN博客

说到保存我们只需要右击我们要保存的图,选择Save as image

再选择保存的地址和并输入保存的文件名即可。

如何你的电脑右击出现的是Save as file可以再之后的界面后在保存名后加上文件的后缀,如此处myplog可以保存名为myplog.png

3.GPT真的是万能的吗?

通过本文你也可以发现GPT有的时候并不聪明,我们在使用GPT的时候我们可以当它是一个比较高级的搜索引擎,在我们想知道某个东西的定义的时候,它的回答还是很靠谱的。但是像做题越需要我们运用所学的定义知识解决的问题时候GPT就越不靠谱了。

因此我们应该学会合理使用GPT,向GPT描述清楚我们的问题,学会分辨GPT的答案,真正让GPT帮助我们提高。

4.Report怎么得高分呢?

首先作为作业,它得按照作业要求,要求不仅是那几个清晰列出来的,更有本文强调的背景分析学生的专业和各个特征之间的关系,作业要完成作业的要求。

其次Report得有Report的格式,表达需要使用学术论文的形式,不能有一些细节上的错误,行文可以是先提出假设,再在后面论证分析,从而得出结论。整体上的思路和这篇教程还是有所区别,这篇教程更多是指导大家如何使用GPT来运用Python进行数据分析,希望大家能学会使用工具,学习到知识,取得好的成绩。

5.PCA的散点图不同是为什么?

如图这是我当时的PCA结果的图,其实与现在的图是反过来的,这可能是Python版本不同或者库版本不同导致的,因为两边我用相同代码跑就是这样不同的结果。

一切还是以自己电脑上的为主,然后按照自己生成的结果说出自己的想法就好,本文只提供思路参考和方法指导,并不代表标准答案,希望能够帮助到大家。 

猜你喜欢

转载自blog.csdn.net/sensen_kiss/article/details/142617308