探索性数据分析(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))