数据科学项目的核心任务是总结、描述和可视化数据。要创建最佳的模型,必须深入了解数据及其属性。通过探索数据的特征和属性,可以使用描述性统计来获得洞察和数值总结,这有助于更有效地理解和处理数据,以完成机器学习任务。描述性统计是数据分析的默认过程,没有描述性统计分析,探索性数据分析(EDA)是不完整的。
在开始分析之前,需要完成数据收集和清洗过程。将从特定来源收集数据,并且只使用测试数据进行分析。以下是清洗训练数据的代码示例。
# Python代码示例
# 假设已经导入了必要的库和数据集
# 以下是处理空值的代码
# 选择替换空值,而不是删除包含空值的行或列
# 首先,找到Item_Identifier及其对应的Item_Weight
# 然后,用相应item_identifier的已知Item_weight替换Item_Weight中的空值
# 对于Item_Visibility,认为0可视为空值,并采取上述步骤
# 由于Outlet_Size对分析和模型预测不太重要,选择删除该列
# 将Item_fat_content列中的LF和reg替换为Low Fat和Regular Fat
# 计算商店的年龄,并将这些值保存在Outlet_years列中,然后删除Outlet_Establishment_year列
从代码中可以了解到,处理空值有多种策略,包括删除包含空值的行、删除包含空值的列或替换空值。在数据量不大的情况下,前两种策略是可行的。选择第三种策略来解决空值问题。
描述性统计分析包括中心趋势的度量和离散程度的度量。中心趋势的度量是通过均值、中位数和众数来寻找数值和分类数据的中心。
使用Python计算数据集属性的均值、中位数、计数和众数。计数并不直接帮助找到数据集属性的中心,但它用于均值、中位数和众数的计算。还计算了分类变量每个类别的总计数,以及数值列数据的总计数。
# 以下是计算分类列类别及其计数的代码
# 循环遍历分类列以绘制类别及其计数
从输出分析中,可以了解到数据是否平衡。例如,可以从图中看出,Fruits和Vegetables类别的行数远多于Seafood类别。还可以假设,在Fruits和Vegetables类别下的销售量远多于Seafood类别。
列中值的总和除以该列的总行数称为均值,也称为平均值。使用train.mean()计算训练数据集数值列的均值。以下是分类列的代码示例。
# 计算分类列的均值
print(train[['Item_Outlet_Sales','Outlet_Type']].groupby(['Outlet_Type']).agg({'Item_Outlet_Sales':'mean'}))
输出分析显示,平均商店年龄为15年,平均商店销售量为2100。Outlet_Type类别中,超市类型3的销售量远高于杂货店类别。还可以假设,超市类别比杂货店类别更受欢迎。
属性的中心值称为中位数。计算中位数值的方法是首先将列数据按升序或降序排序,然后找到总行数并除以2。输出值是该列的中位数。中位数将数据点分为两部分,意味着50%的数据点位于中位数之上,50%位于中位数之下。通常,同一数据的中位数和均值是不同的。中位数不受异常值的影响。由于异常值,均值和中位数之间的差异会增加。
# 计算数值列的中位数
print(train[['Item_Outlet_Sales','Outlet_Type']].groupby(['Outlet_Type']).agg({'Item_Outlet_Sales':'median'}))
大多数观察结果与均值观察结果相同。均值和中位数之间的差异是由于异常值造成的。在分类变量中也可以观察到这种差异。
众数是列中出现次数最多的数据点。每个列只有一个均值和中位数,但属性可以有多个众数值。使用train.mode()计算数据集数值列的众数。以下是分类列的代码示例。
# 计算分类列的众数
print(train[['Item_Outlet_Sales','Outlet_Type','Outlet_Identifier','Item_Identifier']].groupby(['Outlet_Type']).agg(lambda x:x.value_counts().index[0]))
输出分析显示,Outlet_Type的众数值为超市类型1。超市类型1类别中最畅销的商品或众数值是FDZ15。Item_Identifier FDH50是Outlet_Type类别中最畅销的商品。
离散程度的度量解释了数据集中属性值的多样性。它也被称为扩散度量。从这个统计数据中,可以了解数据是如何从一个点扩散到另一个点的。以下是属于离散程度度量的统计数据。
列中最大值和最小值之间的差称为范围。以下是计算范围的代码。
# 计算数值列的范围
for i in num_col:
print(f"Column: {i} Max_Value: {max(train[i])} Min_Value: {min(train[i])} Range: {round(max(train[i]) - min(train[i]),2)}")
输出分析显示,Item_MRP和Item_Outlet_sales的范围很高,可能需要转换。在超市类型3类别下,Item_MRP的变化很大。
可以通过计算多个百分位的摘要来描述列值的扩散。中位数也被称为数据的第50百分位数。以下是不同的百分位数。最小值等于第0百分位数。最大值等于第100百分位数。第一四分位数等于第25百分位数。第三四分位数等于第75百分位数。以下是计算四分位数的代码。
# 计算四分位数
第三四分位数和第一四分位数之间的差也称为四分位距(IQR)。此外,大多数数据点落在IQR之下。
标准差值告诉所有数据点与均值的偏离程度。标准差受异常值的影响,因为它使用均值进行计算。
# 计算标准差
for i in num_col:
print(i , round(train[i].std(),2))
Pandas还提供了一个快捷方式来计算所有上述统计值。
# 使用Pandas计算描述性统计值
Train.describe()
方差是标准差的平方。在异常值的情况下,方差值变得大且明显。因此,它也受异常值的影响。
# 计算方差
for i in num_col:
print(i , round(train[i].var(),2))
# 计算偏度
train.skew()