通常,当我们拿到一个陌生的数据集时,都需要先进行“探索性数据分析”。本节将和大家一起学习探索性数据分析的基本概念与步骤。
要了解“探索性数据分析”的基本概念,也可以让ChatGPT给我们介绍。在ChatGPT对话框中输入“什么是探索性数据分析”,会得到如下答复。
ChatGPT探索性数据分析(Exploratory Data Analysis, EDA)是一种数据分析方法,其主要目的是通过可视化和统计分析等方法,深入挖掘数据中的信息和关系,发现数据中的规律和趋势,为后续的数据建模和预测提供支持。探索性数据分析通常包括以下步骤。
1.数据预处理:包括数据清洗、数据转换和数据缺失值填充等,以确保数据的质量和可用性。
2.可视化分析:使用图表、直方图、箱线图等可视化工具,将数据可视化,以便更好地理解数据的分布、相关性和异常点等。
3.统计分析:应用统计学方法,如描述统计、假设检验、回归分析等,对数据进行分析,从而了解数据的规律和关系。
4.特征工程:对数据进行特征工程处理,包括特征提取、特征选择和特征变换等,以便为后续的数据建模和预测提供更好的特征。
探索性数据分析是数据分析的一个重要环节,它可以帮助数据分析人员快速了解数据集的特征和结构,发现数据中的模式、趋势和异常点,以便为后续的数据挖掘和建模提供有力的支持。EDA在实际应用中非常重要,尤其是在机器学习和数据挖掘领域,探索性数据分析是建立有效模型和进行预测分析的必要前提。
从ChatGPT的答复中,我们了解到探索性数据分析的一般步骤包括“数据预处理”“可视化分析”“统计分析”“特征工程”4个部分。除此之外,我们还了解到,探索性数据分析对于模型的训练非常重要,是实际工作中必不可少的一步。
在了解了探索性数据分析的基本概念后,我们就可以动手操作了。这里我们先试试让ChatGPT帮我们做一些工作,然后再对ChatGPT给出的答案进行验证。在ChatGPT对话框中输入“对Wine酒数据集进行探索性数据分析”,会得到如下答复。
ChatGPT为了对Wine酒数据集进行探索性数据分析,我们需要先进行数据导入和预处理,然后进行可视化和统计分析等。
以下是对Wine酒数据集进行探索性数据分析的一般步骤。
1.数据导入和预处理。
·导入数据集,并检查数据的基本信息和格式。
·去除重复值和缺失值,并对数据进行清洗和转换。
·对数据进行标准化处理,以确保各个特征之间的尺度一致。
2.数据可视化。
·使用直方图、散点图、箱线图等可视化工具,对数据的分布和相关性进行可视化。
·对于分类变量,使用条形图和饼图等可视化工具,了解各个类别之间的比例和分布情况。
3.统计分析。
·对数据进行描述性统计分析,计算各个特征的均值、方差、偏度和峰度等。
·使用相关系数和协方差等方法,分析各个特征之间的相关性和协方差关系。
·对数据进行假设检验,分析各个特征之间的差异和显著性。
下面是在Python环境下对Wine酒数据集进行探索性数据分析的代码实现。
上述代码实现了对Wine酒数据集的探索性数据分析,其中包括数据导入和预处理、可视化和统计分析环节。
从上面的答复中可以看到,ChatGPT不仅给出了对Wine酒数据集进行探索性数据分析的步骤,还把代码写好了。接下来我们把代码复制到Jupyter Notebook中,并使用“Ctrl+Shift+-”组合键,将整段代码拆分到不同的单元格中,便于我们观察运行结果。导入库的代码如下。
上面的代码中,首先导入了读取数据的Pandas并重命名为pd,然后分别导入了两个画图工具——Seaborn和Matplotlib。可能有读者还不是很熟悉这两个库,下面我们让ChatGPT简单介绍一下它们。
在ChatGPT对话框中输入“简单介绍一下Seaborn,50字以内”,可以得到如下答复。
ChatGPT Seaborn是一个基于Matplotlib的Python可视化库,它提供了一种高度可定制化的界面,用于绘制统计图形。Seaborn内置了许多经典的数据集和颜色,可以帮助我们更加轻松地进行数据可视化和分析。
再输入“简单介绍一下Matplotlib,100字以内”,会得到如下答复。
ChatGPT Matplotlib是一个Python绘图库,用于生成高质量的2D图形,可用于数据可视化、交互式图形应用等多个领域。Matplotlib提供了各种绘图方法,包括线图、散点图、柱状图、等高线图等,同时也支持自定义图形元素和样式。Matplotlib可以与NumPy和Pandas等常用数据处理库结合使用,能够方便地处理各种数据,并将其可视化。Matplotlib还支持多种输出格式,包括PNG、PDF、SVG等,可用于生成各种图形报告和论文。
在了解了Seaborn和Matplotlib之后,我们继续研究代码。
因为前面我们已经知道pd.read_csv()和df.head()的作用,所以我们直接从df.shape和df.info()开始。首先是下面这行代码。
在Jupyter Notebook中运行上面这行代码,会得到以下结果。
这里我们使用了Pandas中DataFrame的shape属性查看数据的格式。关于shape属性,我们可以让ChatGPT给出简要的解释。在ChatGPT对话框中输入“解释shape属性的作用”,会得到如下答复。
ChatGPT在Pandas中,DataFrame的shape属性可以用于获取数据框的行数和列数。它返回一个包含两个值的元组,第一个值表示数据框的行数,第二个值表示数据框的列数。通常,我们可以使用shape属性快速了解数据框的规模,以便在进行数据处理和分析之前对其进行必要的准备。例如,我们可以使用shape属性检查数据框是否具有所需的行数和列数,或者是否需要进行维度调整和数据清理等操作。
从ChatGPT的答复中我们可以了解到,DataFrame的shape属性返回的是数据框的行数和列数。这里我们得到(178,14)这个结果,代表Wine酒数据集有178行、14列。
接下来我们运行下面这行代码。
会得到以下的结果。
我们使用了DataFrame的info()方法查看数据信息。如果需要让ChatGPT给出详细解释,可以在ChatGPT对话框中输入“解释info()方法的作用”,会得到如下答复。
ChatGPT在Pandas中,DataFrame的info()方法可以用来获取数据框的基本信息和概要统计。它会显示数据框的列名、数据类型、非空值数量及每个列的内存占用等信息,通常用于快速了解数据框的数据类型、缺失值和内存使用等情况。通过info()方法,我们可以了解数据框的整体情况。此外,info()方法还可以帮助我们判断数据框中是否存在数据类型错误、缺失值和异常值等数据质量问题,以便在数据处理和分析之前进行必要的数据清理和修复。
从答复中可以看到,info()方法返回了数据框的列名、数据类型、非空值数量等信息。以“Class”这一列为例,我们看到它的非空值数量是“178 non-null”,得知这个数据框有178行,也就是说“Class”这一列中是没有空值的;同时它的数据类型是“int64”,也就是64位整数类型。
接下来,我们可以使用下面这行代码检查数据中是否有重复值。
运行这行代码,会得到以下结果。
上面的代码中,我们先使用了DataFrame的duplicated()方法让程序寻找数据框中的重复值,然后使用sum()方法对重复值的数量进行求和。程序返回的结果是0,说明我们的数据框中并没有重复值。
如果读者希望进一步了解duplicated()方法,可以自行向ChatGPT提问,看看它的答复是否能够让你获得更详细的信息。
如果在处理其他数据时,遇到有重复值的情况,可以使用ChatGPT给出的下面这行代码去除重复值。
上面的代码使用了drop_duplicates()方法去除重复值。同样,读者也可以用提问的方法,向ChatGPT查询关于drop_duplicates()方法的详细信息。
下面这行代码的主要作用是查看数据框中每一列所包含的空值数量。
在Jupyter Notebook中运行这行代码,会得到如下结果。
与duplicated()方法类似,isnull()方法用于检查数据框中是否有空值,并且用sum()方法计算空值的数量。从代码运行结果可以看出,每一个字段名后面的数字都是0,说明我们的数据框中任何一列都不包含空值。这里也鼓励读者向ChatGPT提问,获得关于isnull()方法的更多信息。
在确认了数据框中没有重复值和空值后,我们还可以对数据进一步进行处理。以ChatGPT给出的代码为例,如下所示。
在这段代码中,我们使用了scikit-learn(简称为“sklearn”)中的StandardScaler对数据进行了标准化处理。这是很常用的数据处理方法。下面我们让ChatGPT讲解一下这个知识点。在ChatGPT对话框中输入“什么是数据标准化处理”,会得到如下答复。
ChatGPT数据标准化是一种常见的数据预处理技术,用于将不同尺度和单位的数据转换为具有统一尺度和单位的标准化数据。它通常通过将原始数据按照一定的比例缩放和平移,将数据转换为均值为0、标准差为1的标准正态分布,或者将数据转换为0到1之间的归一化数据。数据标准化处理的目的是消除数据间的量纲影响,使不同变量之间具有可比性和可解释性,同时也可以提高某些机器学习算法的性能和稳定性。数据标准化处理常用的方法包括Z-score标准化、Min-max标准化、小数定标标准化等。
我们可以这样理解ChatGPT给出的答复:我们的数据中有两个特征,其中一个特征的范围为0~1,而另一个特征的范围为0~100000。在这种情况下,模型可能会认为第二个特征更加重要。为了消除这种量纲不同带来的差异,我们就需要使用标准化的方法对数据进行预处理。
在上面的代码中,我们使用了scikit-learn中的StandardScaler对数据进行标准化处理。我们还可以让ChatGPT“介绍scikit-learn中的StandardScaler”,ChatGPT给出的答复如下。
ChatGPT StandardScaler是scikit-learn中的一个数据预处理类,用于对数据进行标准化处理。它可以通过将每个特征的值减去该特征的均值,然后除以该特征的标准差,将数据转换为均值为0、方差为1的标准正态分布。标准化处理可以消除不同特征之间的量纲差异,避免某些特征对模型的影响过大或过小,提高模型的准确性和鲁棒性。在使用StandardScaler时,需要先用fit()方法对数据进行拟合,然后再用transform()方法对数据进行转换。StandardScaler还可以用于交叉验证和管道等机器学习任务中,以便对数据进行预处理和特征提取。
从上面的答复可知,StandardScaler的原理是通过一系列的计算,将数据转换成均值为0、方差为1的标准正态分布。这样一来,不同特征因为量纲差异给模型带来的影响就可以消除了。
接下来,我们再来看一下ChatGPT给出的数据可视化代码——它先用pairplot绘制图形,展示特征之间的关系。这部分代码如下。
为了方便展示,此处对ChatGPT给出的代码进行了修改,在图形中只保留了3个字段。读者在试验时,可以绘制完整的图形进行观察。
运行上面的代码,得到如图2-3所示的结果。
图2-3 根据ChatGPT给出的代码绘制pairplot
初次接触数据分析、数据科学的读者,可能对pairplot还不太熟悉。不用担心,我们可以求助ChatGPT。在ChatGPT对话框中输入“什么是pairplot”,会看到ChatGPT给出如下答复。
ChatGPT在Seaborn中,pairplot是一个用于绘制变量之间关系的图表类型,它可以用于绘制数据集中所有数值型变量之间的两两关系,同时在对角线上绘制变量的直方图或密度估计。它可以帮助我们快速探索数据集中不同变量之间的相关性和分布情况,从而帮助我们选择最相关的特征和变量进行进一步的数据分析和建模。pairplot支持多种绘图样式和参数设置,可以根据数据集的特点和分析目的进行个性化定制,非常适用于数据探索和分析工作。
从上面的答复中可以看到,pairplot主要反映了变量之间的关系。在图2-3中,我们可以看到从左上至右下的对角线上的图形是用直方图描述了各个特征的分布情况;而其他图形则是用散点图描述两个特征之间的关系。以第2行第1列的散点图为例,它反映的是3种不同类型(Class)的酒的酒精含量分布情况。
除此之外,ChatGPT还给出了绘制countplot的代码,这部分代码我们也稍微修改一下再运行。修改后的代码如下。
需要说明的是,在上面的代码中,我们先添加了一行设置图像大小的代码;然后,我们让程序只绘制名为“Class”的字段。这是因为我们希望了解在所有的样本中,不同类型的样本各有多少。运行代码,会得到如图2-4所示的结果。
图2-4 根据ChatGPT给出的代码绘制countplot
从图2-4中可以看到,使用countplot可以很直观地了解不同种类的酒的数量分布情况。类型标签为“1”的酒样本数量为60个左右,类型标签为“2”的酒样本数量为70个左右,而类型标签为“3”的酒样本数量为50个左右。
countplot是非常容易理解的绘图方式,这里我们不再赘述它的基本概念。感兴趣的读者可以自行向ChatGPT提问,获得更加详细的介绍。
前文中ChatGPT告诉过我们,探索性数据分析中还有一个重要的步骤——统计分析。在ChatGPT生成的代码中,也包含了这部分的功能。下面我们就一起研究一下。首先使用describe()方法查看样本特征的统计信息,为了方便展示,这里也修改了代码。
运行代码,可以得到如表2-2所示的结果。
表2-2 查看部分特征的统计信息
续表
从表2-2中可以清楚地看到describe()方法所返回的信息。其中包括该特征的数量(count)、均值(mean)、标准差(std)、最小值(min)、下四分位数(25%)、中位数(50%)、上四分位数(75%)及最大值(max)。
在表2-2中,除Class这一列以外,其他特征都使用了科学记数法。例如,-8.619821e-16表示-8.619821×10 -16 。
除了使用describe()方法查看数据的统计学描述,ChatGPT还使用了corr()方法显示各特征之间的相关性。这里同样修改了代码,只展示部分特征的相关性。
运行这行代码,会得到如表2-3所示的结果。
表2-3 部分特征的相关性分析
这里我们选取了3个特征进行相关性分析,表2-3中显示了各个特征之间的相关系数,值在-1到1之间,值越接近1,说明两个特征越呈现正相关;反之,值越接近-1,说明两个特征越呈现负相关;而如果值接近0,说明两个特征之间几乎没有相关性。
继续看ChatGPT生成的代码,会发现它在最后还使用ttest_ind函数对样本进行了t检验。这是一个统计学中的概念,对统计学不是很熟悉的读者可以在ChatGPT对话框中提问“ttest_ind是什么”,会得到如下答复。
ChatGPT ttest_ind是一个用于执行两个独立样本t检验的函数。ttest_ind函数可以用于比较两个独立样本的平均值是否显著不同,通常用于检验两组数据是否具有显著差异。在执行t检验时,ttest_ind函数需要输入两个独立样本的数据数组,可以选择是否假定两组数据具有相等的方差,还可以设置是否使用双侧或单侧检验。函数的返回值包括t值、p值和自由度等统计量,可以根据p值判断两组数据是否存在显著差异。ttest_ind函数是scipy.stats模块中的一个函数,常用于统计分析和机器学习等领域中。
简单了解了t检验的概念后,我们可以尝试修改代码并运行。修改后的代码如下。
在这段代码中,我们先在scipy.stats模块中导入ttest_ind函数,然后对类型标签为“1”的酒的酒精含量和类型标签为“2”的酒的酒精含量进行t检验。运行代码,会得到如下结果。
从ttest_ind函数返回的结果来看,t检验的p值(p-value)为1.955×10 -33 ,这个值远远小于0.05。那么p值的含义是什么呢?我们在ChatGPT对话框中输入“t检验中的p值”,会得到如下答复。
ChatGPT在统计学中,p值是指当原假设为真时,得到样本统计量或更极端情况的概率。在t检验中,p值表示两组数据在t分布下得到的双侧或单侧检验概率,即当原假设为真时,得到样本差异或更极端差异的概率。p值越小,说明两组数据的差异越显著,通常将p值小于等于0.05的结果视为显著差异,拒绝原假设;而当p值大于0.05时,结果被认为不具有显著差异,接受原假设。p值的大小还受样本大小、显著水平和方差等因素的影响,需要综合考虑。在实际应用中,p值通常是判断统计检验结果是否显著的重要指标之一。
从ChatGPT的答复中我们获知,p值越小,说明两组数据的差异越显著;反之说明两组数据不具有显著差异。在本例中,p值远远小于0.05,说明类型标签为“1”的酒与类型标签为“2”的酒的酒精含量是存在显著差异的。