探索性数据分析实例

探索性数据分析(EDA)是任何数据分析或数据科学项目中的重要步骤。EDA的过程是调查数据集以发现模式和异常值(离群值),并根据对数据集的理解形成假设。EDA涉及为数据集中的数值数据生成摘要统计信息,并创建各种图形表示以更好地理解数据。本文将通过一个示例数据集帮助理解EDA。将为此目的使用Python语言(Pandas库)进行操作。

导入库

将从导入执行EDA所需的库开始。这些包括NumPy、Pandas、Matplotlib和Seaborn。

import numpy as np import pandas as pd import matplotlib.pyplot as plt %matplotlib inline import seaborn as sns

读取数据

现在将从CSV文件中读取数据到PandasDataFrame。可以下载数据集以供参考。

import pandas as pd df = pd.read_csv('StudentsPerformance.csv') print(df.head())

让使用df.head()查看数据集的外观。输出应该如下所示:

描述性统计

太好了!数据看起来正是想要的。可以通过查看数据集轻松地知道它包含有关不同学生在学校/学院的分数以及他们在3个科目中的得分。让首先查看数据集的描述性统计参数。将为此使用describe()。

df.describe(include='all')

通过将include属性分配值为‘all’,确保分类特征也包含在结果中。输出DataFrame应该如下所示:

对于数值参数,字段如均值、标准差、百分位数和最大值已填充。对于分类特征,计数、唯一值、顶部(最频繁值)和相应的频率已填充。这为提供了对数据集的大致了解。

缺失值插补

现在将检查数据集中的缺失值。如果有缺失项,将用适当的值(分类特征的众数,数值特征的中位数或均值)进行插补。将为此目的使用isnull()函数。

df.isnull().sum()

这将告诉数据集中每个列有多少缺失值。输出(PandasSeries)应该如下所示:

幸运的是,此数据集中没有缺失值。现在将继续分析此数据集,观察模式,并借助图表和图形识别离群值。

图形表示

将从单变量分析开始。将为此目的使用条形图。将查看学生在性别、种族/民族、午餐状态以及是否有考试准备课程的分布。

plt.subplot(221) df['gender'].value_counts().plot(kind='bar', title='学生性别', figsize=(16,9)) plt.xticks(rotation=0) plt.subplot(222) df['race/ethnicity'].value_counts().plot(kind='bar', title='学生种族/民族') plt.xticks(rotation=0) plt.subplot(223) df['lunch'].value_counts().plot(kind='bar', title='学生午餐状态') plt.xticks(rotation=0) plt.subplot(224) df['test preparation course'].value_counts().plot(kind='bar', title='考试准备课程') plt.xticks(rotation=0) plt.show()

输出应该如下所示:

可以从图表中推断出许多事情。学校里女生比男生多。大多数学生属于C和D组。超过60%的学生在学校吃标准午餐。此外,超过60%的学生没有参加任何考试准备课程。

继续单变量分析

接下来,将制作数据集中数值列(数学成绩、阅读成绩和写作成绩)的箱线图。箱线图有助于根据四分位数可视化数据。它还可以识别数据集中的离群值(如果有)。将为此使用boxplot()函数。

df.boxplot()

输出应该如下所示:

中间部分代表四分位距(IQR)。中间的绿色水平线代表数据的中位数。尾部附近的空心圆圈代表数据集中的离群值。然而,由于学生在测试中得分极低是非常可能的,不会移除这些离群值。

分布图

现在将制作学生数学成绩的分布图。分布图告诉数据是如何分布的。将为此使用distplot函数。

sns.distplot(df['math score'])

输出图表应该如下所示:

图表代表一个接近完美的钟形曲线。峰值大约在65分,即数据集中学生数学成绩的平均值。类似的分布图也可以为阅读成绩和写作成绩制作。

相关性分析

现在将使用热图查看3个成绩之间的相关性。为此,将使用corr()和heatmap()函数进行此练习。

corr = df.corr() sns.heatmap(corr, annot=True, square=True) plt.yticks(rotation=0) plt.show()

输出图表应该如下所示:

热图显示3个成绩高度相关。阅读成绩与写作成绩的相关系数为0.95。数学成绩与阅读成绩的相关系数为0.82,与写作成绩的相关系数为0.80。

双变量分析

现在将进行双变量分析。将查看Seaborn中的关联图。它帮助了解不同数据子集中两个变量之间的关系。将尝试了解不同性别学生数学成绩和写作成绩之间的关系。

sns.relplot(x='math score', y='writing score', hue='gender', data=df)

关联图应该如下所示:

图表显示了男女学生成绩之间的明显差异。对于相同的数学成绩,女学生比男学生更有可能具有更高的写作成绩。然而,对于相同的写作成绩,预计男学生比女学生具有更高的数学成绩。

首先,让使用折线图看看父母的教育水平对孩子的学校表现的影响。

df.groupby('parental level of education')[['math score', 'reading score', 'writing score']].mean().T.plot(figsize=(12,8))

输出将如下所示:

从这个图表中可以非常清楚地看出,父母受过更多教育的学生(硕士学位、学士学位和副学士学位)平均表现优于父母受教育较少的学生(高中)。这可能是遗传差异,或者仅仅是学生家庭环境的差异。受过更多教育的父母更有可能推动他们的学生学习。

其次,让看看考试准备课程对学生表现的影响,使用水平条形图。

df.groupby('test preparation course')[['math score', 'reading score', 'writing score']].mean().T.plot(kind='barh', figsize=(10,10))
沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485