探索性数据分析(EDA)是数据科学项目中一个被低估且使用不足的方法。它是数据科学家进行的第一步,通过研究数据并从中提取有价值的信息和非显而易见的洞察,这最终有助于模型构建。在对数据进行建模和测试之前,需要与数据建立关系。可以通过探索数据、将数据与目标变量绘制在一起并观察数据的行为来建立这种关系。这种在建模之前的分析过程被称为探索性数据分析。
本文将对Kaggle上的一个复杂数据集(高级房价预测)进行实际操作的EDA。数据集的链接如下:
数据科学项目的生命周期包括以下步骤:
将对一个包含大约81个独立特征和1个目标变量(销售价格)的复杂数据集进行操作。这是一个回归问题。EDA将包含一些基本步骤,如分析缺失值、数值和分类特征的分布、异常值、多重共线性等。将逐一查看每个步骤。
获得的数据大多包含缺失值,需要找出缺失数据与销售价格(目标变量)之间是否存在任何关系。根据这个关系,可以用该列的中位数等值替换缺失值。以下是Python代码,用于捕获大型数据集中的缺失值,并将其替换为1,将非缺失值替换为0,并绘制与销售价格中位数的关系图,以查看是否存在缺失值与目标变量之间的关系。
# 假设df是包含数据的DataFrame
missing_values = df.isnull().astype(int)
missing_values['LotFrontage'].plot(kind='scatter', x='LotFrontage', y='SalePrice')
从图中可以看出,LotFrontage特征的缺失值对目标变量有影响,因为它随着销售价格的增加而增加。因此,存在两者之间的关系,需要用该特征的中位数等实质性的值替换缺失值。
由于这是一个大型数据集,需要可视化不同类型的变量,如日期时间(年份)、离散和连续数值特征、分类特征及其与目标变量的行为。数据集中有39个数值特征。字符串或数字和字符串混合的数据类型被给定为对象,可以使用types属性进行检查。
# 检查数据类型
print(df.dtypes)
以下是Python代码,用于查找年份特征,并查看这些四个特征与目标变量的行为。
# 假设df是包含数据的DataFrame
df['YearSold'] = pd.to_datetime(df['YearSold']).dt.year
df.groupby('YearSold')['SalePrice'].mean().plot(kind='line')
从图中可以看出,随着销售年份的增加,成本降低。这必须是一个异常,因为这是不可能的,所以需要进行更多的分析并得出更好的结论。这只是显示了EDA的重要性以及它如何影响结论。
异常值是位于数据集分布之外的任何数据点。数据集中的异常值可能会影响模型的准确性。线性回归等算法对异常值非常敏感,因此需要小心处理。
标准差方法是识别和替换异常值的常用方法,任何位于3个标准差之外的数据点都被认为是异常值。尽管该阈值标准差可以根据数据集的大小而变化。
在EDA中,让使用箱线图分析数据集中的异常值。
# 假设df是包含数据的DataFrame
df.boxplot(column='SalePrice')
黑色点表示存在的异常值,它们远离分布。矩形框的下线是25%ile,上线是75%ile。因此,这些黑色点是需要移除或替换的值,将在特征工程中看到。
分类特征的数据类型是对象,可以使用pandas的types属性进行检查。通常将特征的分类值转换为虚拟变量,以便算法理解。这被称为独热编码。如果特定类别的基数非常高,则不使用独热编码,因为它可能导致维度的诅咒。
# 假设df是包含数据的DataFrame
df['MSZoning'] = pd.get_dummies(df['MSZoning'], drop_first=True)
以下是Python代码,用于检查分类特征与目标变量中位数之间的关系。
# 假设df是包含数据的DataFrame
for column in categorical_columns:
plt.scatter(df[column], df['SalePrice'])
plt.title(column)
plt.show()
选择的类别阈值是10,以执行独热编码。现在让检查分类特征与目标变量中位数之间是否存在任何关系。
在任何数据集中,当独立特征内部相互关联时,它会降低模型的准确性,因为无法获得特征的个体贡献。这被称为多重共线性。
# 假设df是包含数据的DataFrame
corr_matrix = df.corr()
sns.heatmap(corr_matrix, annot=True)