上QQ阅读APP看书,第一时间看更新
1.3.3 示例:人口和谋杀率的位置估计
表 1-2 给出了数据集的前几行,其中包括了美国各州的人口和谋杀率(单位为每年每十万人中被谋杀的数量)的数据(来自于 2010 年人口普查数据)。
表1-2:名为state
的data.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'])
在这种情况下,加权均值和加权中位数基本上是一样的。
本节要点
- 均值是对位置的基本度量,但它对极端值(离群值)非常敏感。
- 其他度量(中位数、截尾均值)对离群值和非正常分布更不敏感,因此更健壮。