处理缺失数据的统计方法
在处理各种数据集时,我们经常在不同的列中缺少值。处理此问题的常用方法是删除缺失值的行或用其列的平均值替换缺失值。 这些方法通常在数据集上运行良好。但是,当您的数据中有很多缺失值时,它们就会失败。 [](https://res.cloudinary.com/practicaldev/image/fetch/s--pufg51db--/c_limit%2Cf_auto%2Cfl_progressiv
在处理各种数据集时,我们经常在不同的列中缺少值。处理此问题的常用方法是删除缺失值的行或用其列的平均值替换缺失值。
这些方法通常在数据集上运行良好。但是,当您的数据中有很多缺失值时,它们就会失败。
[](https://res.cloudinary.com/practicaldev/image/fetch/s--pufg51db--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://dev-to-uploads .s3.amazonaws.com/uploads/articles/br1qtkin6fbtpy75rwxq.gif)
当您重复如此多的值时,它们会产生噪音,如果您决定删除具有缺失值的行,您可能会丢失大量数据。
解决此问题的一种方法是正确研究您的数据,以查看数据集中的一些或所有列之间是否存在某种相关性。
以US Universities Data作为案例研究,我们将介绍如何在统计上替换数据集中的缺失值。
导入依赖
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
import seaborn as sns
进入全屏模式 退出全屏模式
numpy
- 数学和逻辑运算
matplotlib
- 可视化
pandas
- 数据操作
seaborn
- 可视化
加载数据集
us_news_columns = ['FICE (Federal ID number)', 'College name', 'State (postal code)',
'Public/private indicator (public=1, private=2)', 'Average Math SAT score',
'Average Verbal SAT score', 'Average Combined SAT score', 'Average ACT score',
'First quartile - Math SAT', 'Third quartile - Math SAT', 'First quartile - Verbal SAT',
'Third quartile - Verbal SAT', 'First quartile - ACT', 'Third quartile - ACT',
'Number of applications received', 'Number of applicants accepted', 'Number of new students enrolled',
'Pct. new students from top 10% of H.S. class', 'Pct. new students from top 25% of H.S. class',
'Number of fulltime undergraduates', 'Number of parttime undergraduates', 'In-state tuition',
'Out-of-state tuition', 'Room and board costs', 'Room costs', 'Board costs', 'Additional fees',
'Estimated book costs', 'Estimated personal spending', """Pct. of faculty with Ph.D.'s""",
'Pct. of faculty with terminal degree', 'Student/faculty ratio', 'Pct.alumni who donate',
'Instructional expenditure per student', 'Graduation rate']
us_news = pd.read_csv ('usnews.data.txt', names=us_news_columns)
us_news.head()
进入全屏模式 退出全屏模式
[](https://res.cloudinary.com/practicaldev/image/fetch/s--Q5hcuVps--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to -uploads.s3.amazonaws.com/uploads/articles/ai3gs3er59y8arf8xxeu.png)
缺失值
在此数据集中,缺失值表示为*
。我们将其替换为 NaN 值并显示每列 NaN 值的数量。
us_news.replace('*', np.NaN, inplace=True)
us_news.isna().sum()
进入全屏模式 退出全屏模式
[](https://res.cloudinary.com/practicaldev/image/fetch/s--6qXSi_9z--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to- uploads.s3.amazonaws.com/uploads/articles/7e91ofpnb15djvwnzaih.png)
计算至少有一个缺失值的行数,
>>> us_news.isna().any(axis=1).sum()
1148
进入全屏模式 退出全屏模式
我们可以观察到删除或删除包含至少一个缺失值的行将导致大量数据丢失(1302 个点中的 1148 个)。因此,用列的平均值替换缺失值也会创建一个非常有偏差的数据集。
第 1 步 - 分析列名和值
当我们查看我们正在使用的值的类型时,考虑“平均数学 SAT 分数”和“平均语言 SAT 分数”,我们会看到数据是连续的并且有一个边界(或总数,这里是 800)。我们还可以看到,“Average Combined SAT score”列在总和方面与前两个有一定的关系。
第 2 步 - 建立关系
检查某些列之间是否存在强相关性。通过分析列名和值,我们观察到我们正在处理数据集中某些部分的标准化测试分数。可视化测试分数与自身的相关性,我们看到这些列的值之间存在很强的正相关(0.84 到 1)。显然,他们都遵循一个模式。
sns.set(rc = {'figure.figsize':(12,9)})
sns.heatmap(us_news.corr().iloc[2:12, 2:12])
进入全屏模式 退出全屏模式
[](https://res.cloudinary.com/practicaldev/image/fetch/s--aDHelmnk--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to- uploads.s3.amazonaws.com/uploads/articles/icws6eyqqhl3vxik2bhm.png)
第 3 步 - 审查公式
四分位数
查看第一和第三四分位数与平均分之间的关系,这些公式将它们联系起来。
Q1 u003d μ - (0.6745)p
Q3 u003d μ + (0.6745)s
- Q1代表第一个四分位数
- Q3代表第三个四分位数
- μ 表示平均值(平均值)
- σ代表标准差(std)
平均值
与获得具有均值和标准差的四分位数相反,我们还可以找到一个公式将均值仅与四分位数分数联系起来。
平均值 u003d (第一个四分位数 + 第三个四分位数)/2
我用样本数据点对这个公式进行了回测,得到了一个非常小的错误。
组合/加法
正如之前在分析列名称和值时观察到的,“平均数学 SAT 分数”和“平均口头 SAT 分数”的总和得出“平均综合 SAT 分数”。
因此,添加两列将为第三列中的缺失数据提供正确的值。
第 4 步 - 实施/代码
清理和准备数据
检查列的数据类型后,可以观察到大多数格式不正确。
us_news.dtypes
进入全屏模式 退出全屏模式
[](https://res.cloudinary.com/practicaldev/image/fetch/s--B3tXdzJk--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to- uploads.s3.amazonaws.com/uploads/articles/zq8is6scq7528pn0q9e2.png)
第三列中的所有列都包含数字数据,因此我们会将它们转换为该格式。
for col in us_news.dtypes[3:].index:
us_news[col] = pd.to_numeric(us_news[col])
## Defining the columns to be worked on.
average_to_check = ['Average Math SAT score', 'Average Verbal SAT score', 'Average ACT score']
quartiles = [['First quartile - Math SAT', 'Third quartile - Math SAT'], ['First quartile - Verbal SAT',
'Third quartile - Verbal SAT'], ['First quartile - ACT', 'Third quartile - ACT']]
进入全屏模式 退出全屏模式
替换缺失的四分位数
使用为第一个和第三个四分位数建立的公式,我们遍历缺少四分位数值的每一列并应用它。
for index, score in enumerate(average_to_check):
us_news.loc[(us_news[quartiles[index][0]].isna()) & (us_news[score].notna()), quartiles[index][0]] = us_news.loc[(us_news[quartiles[index][0]].isna()) & (us_news[score].notna()), score].map(lambda x: x - (.6745)*us_news[score].std())
us_news.loc[(us_news[quartiles[index][1]].isna()) & (us_news[score].notna()), quartiles[index][1]] = us_news.loc[(us_news[quartiles[index][1]].isna()) & (us_news[score].notna()), score].map(lambda x: x + (.6745)*us_news[score].std())
进入全屏模式 退出全屏模式
第 2 行获取第一个四分位数缺失但平均得分完好的所有列。代码中的&
条件将两个单独的条件联系在一起作为一个布尔值。
它使用已建立的公式计算第一个四分位数,然后用计算值替换缺少第一个四分位数的列。使用的标准偏差是被视为每所学校标准的测试分数列的标准偏差,未提供。这也已经用没有缺失值的数据点进行了回测。
第 3 行作为第 2 行的示例函数,用于缺少第三个四分位数值。
替换缺失平均值(平均值)
使用为平均值建立的公式,我们遍历缺少平均分值的每一列并应用它。
for index, quart in enumerate(quartiles):
first, third = quart
us_news.loc[(us_news[average_to_check[index]].isna()) & (us_news[first].notna() & us_news[third].notna()) , average_to_check[index]] = us_news.loc[(us_news[average_to_check[index]].isna()) & (us_news[first].notna() & us_news[third].notna()), [first,third]].apply(lambda x: (x[first] + x[third])/2, axis=1)
进入全屏模式 退出全屏模式
在第 2 行中取出第一个和第三个四分位数的列名后,我们得到所有平均分值缺失但第一和第三个四分位数值完整的数据点。它应用为计算平均值而定义的公式,并用计算值替换缺失值。
替换缺失的组合分数
我们得到所有缺少“平均组合 SAT 分数”的行,并用计算值替换它们。
math = 'Average Math SAT score'
verbal = 'Average Verbal SAT score'
combined = 'Average Combined SAT score'
us_news.loc[(us_news[combined].isna()) & (us_news[math].notna() & us_news[verbal].notna()), combined] = us_news.loc[(us_news[combined].isna()) & (us_news[math].notna() & us_news[verbal].notna()), [math,verbal]].apply(lambda x: x[math] + x[verbal], axis=1)
进入全屏模式 退出全屏模式
添加数学分数和口头分数,然后替换缺少组合分数的列。
检查
在使用所有这些公式替换缺失值之后,我们现在可以检查我们留下的缺失值的数量。
[](https://res.cloudinary.com/practicaldev/image/fetch/s--Fcyhfw3G--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to -uploads.s3.amazonaws.com/uploads/articles/8v0kggrugmy02vzz2mw6.png)
在测试分数方面,缺失值显着减少。
舍入清洗
再次观察这些列,缺少测试分数的数据点完全是空白的,没有任何类型的记录(平均值或四分位数)。我们可以:
-
选择将这些值替换为其列的平均值。
-
使用没有缺失值的数据集部分训练模型,以预测平均测试分数,然后可以将其用于缺失值。
-
从平均考试成绩的预测,已经建立的公式可以用来计算综合成绩,第一和第三四分位数。
数据集中具有缺失值的其他列也可以替换为其列的平均值,或者使用其他数据点训练模型来预测其缺失值。
谢谢阅读。
更多推荐
所有评论(0)