数据科学中的实用统计学(第2版)
上QQ阅读APP看书,第一时间看更新

1.3.3 示例:人口和谋杀率的位置估计

表 1-2 给出了数据集的前几行,其中包括了美国各州的人口和谋杀率(单位为每年每十万人中被谋杀的数量)的数据(来自于 2010 年人口普查数据)。

表1-2:名为statedata.frame中的几行数据,按州列出了人口和谋杀率

使用 R 计算出人口的均值、截尾均值和中位数:

> state <- read.csv('state.csv')
> mean(state[['Population']])
[1] 6162876
> mean(state[['Population']], trim=0.1)
[1] 4783697
> median(state[['Population']])
[1] 4436370

如果要使用 Python 计算均值和中位数,可以使用数据框的 pandas 方法。计算截尾均值则需要使用 scipy.stats 中的 trim_mean 函数:

state = pd.read_csv('state.csv')
state['Population'].mean()
trim_mean(state['Population'], 0.1)
state['Population'].median()

均值大于截尾均值,而截尾均值大于中位数。

这是因为截尾均值分别去掉了人口最多和最少的五个州(trim=0.1 在数据两端各去除 10% 的值)。如果我们想计算美国的平均谋杀率,就需要使用加权均值或加权中位数,以体现出各州的人口差异。因为 R 的基础程序中没有计算加权中位数的函数,所以需要安装一个额外的包,比如 matrixStats

> weighted.mean(state[['Murder.Rate']], w=state[['Population']])
[1] 4.445834
> library('matrixStats')
> weightedMedian(state[['Murder.Rate']], w=state[['Population']])
[1] 4.4

NumPy 可以计算加权均值。对于加权中位数,我们可以使用 wquantiles 这个专门的程序包。

np.average(state['Murder.Rate'], weights=state['Population'])
wquantiles.median(state['Murder.Rate'], weights=state['Population'])

在这种情况下,加权均值和加权中位数基本上是一样的。

本节要点

  • 均值是对位置的基本度量,但它对极端值(离群值)非常敏感。
  • 其他度量(中位数、截尾均值)对离群值和非正常分布更不敏感,因此更健壮。