Menu

R 计算平均值、中位数和标准差

如何在 R 中汇总数据:mean()、median()、sd()、var()、summary()、quantile(),每个函数算的是什么,sd() 背后 n−1 的细节,以及为什么 R 的 mode() 是个陷阱。

本页包含可运行的编辑器。编辑、运行,立即查看输出。

平均值和中位数

整个统计学中最常用的两个汇总指标,各自只需调用一个函数:

mean() 把所有值加起来再除以个数。median() 把值排序后取中间那个(个数为偶数时取中间两个的平均值)。对于 mtcars 中的 32 辆汽车,平均油耗约为 20.1 mpg,中位数是 19.2,两者很接近,说明数据没有严重偏斜。如果两者相差很大,这本身也是一种信息,我们会在最后讲到。

有一件事几乎让每个人都意外:只要向量中有一个 NA,两个函数都会返回 NA:

这是有意为之:R 拒绝悄悄假装缺失值不存在。na.rm = TRUE 的意思是“用你手头有的值来计算”。本文几乎所有汇总函数都接受这个参数。关于 NA 如何传播的完整说明,请看缺失值。

标准差和方差

sd() 衡量离散程度:大致是一个典型值离平均值有多远,单位和数据相同。var() 是它的平方:

标准差约为 6 mpg,意味着汽车的油耗通常落在 20.1 这个平均值上下 6 mpg 左右的范围内。因为 sd() 的单位和数据本身相同,所以报告时用它;var() 主要出现在其他公式内部。

下面这个细节对课程作业很重要:sd() 和 var() 计算的是样本统计量,它们把离差平方和除以 n − 1,而不是 n:

为什么是 n − 1?因为平均值是用同一组数据估计出来的,围绕这个估计平均值的离差会系统性地偏小一点;除以 n − 1 就是在修正这一点。你的数据几乎总是来自某个更大整体的样本,所以你需要的就是 n − 1 版本。如果你手上确实是整个总体(班里的每个学生,目录里的每件商品),就乘一下:var(x) * (n - 1) / n。

平均值的标准误

标准差和标准误经常被混淆,所以要分清楚:sd 描述数据,SE 描述你对平均值的估计。 R 没有内置的 se(),但公式只有一行:

样本越大,标准误越小:数据量增加到四倍,SE 就减半,因为更大的样本能更精确地确定平均值。而 sd 不会随样本量缩小:无论你测量多少辆车,它们本身的差异就是那么大。SE 是置信区间的基础,它真正的用武之地就在那里。

summary():一次调用看全貌

summary() 一次给出五数概括外加平均值,而且对整个数据框都适用:

对数据框调用时,它会汇总每一列:数值列给出最小值、四分位数、平均值和最大值,因子列给出每个水平的计数。拿到任何刚加载的数据集,第一件事就该运行它:不可能出现的值(负数的年龄、最大值为 9999)会立刻显露出来。

分位数、极差和 IQR

quantile() 把中位数推广到任意分割点:

不带参数时,它返回最小值、四分位数和最大值。传入 probs = 可以指定分割点:上面的第 10 和第 90 百分位数框出了大部分数据所在的范围。IQR()(第 25 和第 75 百分位数之间的距离)是一种离散程度指标,和 sd() 不同,它不会被异常值拉偏。range() 以一对值的形式返回最小值和最大值。

众数:R 的 mode() 做不到

这个坑每个人都会踩一次。R 有一个叫 mode() 的函数,但它和统计毫无关系,报告的是对象的存储类型:

要记住的写法是:table(x) 统计每个值出现的次数,which.max() 找出最大的计数,names() 取出那个值本身。注意它返回的是字符串(table 的名称总是字符串);如果需要拿它计算,用 as.numeric() 包起来。如果有两个值并列,which.max() 会悄悄只返回第一个,所以可能出现并列时要自己看一下这个 table。

平均值还是中位数:该报告哪个

平均值用到了每一个值,这既是优点也是缺点:一个极端值就能把它拉偏。中位数只关心中间的值,所以异常值几乎影响不到它:

加入一个值,平均值就从约 49,300 涨到了 155,000 以上,这个数字和数据中的任何一个人都对不上,而中位数只从 48,000 变成了 49,500。这就是为什么收入、房价和住院天数都用中位数报告:带长尾的偏斜数据会让平均值产生误导。对于大致对称的数据,两者一致,用平均值就很好(而且在统计上更有效率)。画一个直方图就能知道你属于哪种情况,而比较平均值和中位数本身就是一行代码的偏斜检查。

要点总结

  • mean(x) 和 median(x):有缺失值时加上 na.rm = TRUE。
  • sd(x) 和 var(x) 计算的是样本统计量(分母为 n − 1),这正是你需要的。
  • 标准误是 sd(x) / sqrt(length(x)):它衡量你对平均值了解得有多准,而不是数据有多分散。
  • 对新数据框运行 summary() 是 R 中最快的合理性检查。
  • 众数是 names(which.max(table(x)));R 的 mode() 讲的是存储类型。
  • 数据偏斜或有异常值:报告中位数。数据对称:用平均值就行。

下一篇:衡量两个变量如何一起变化,即用 cor() 和 cor.test() 计算相关性。

常见问题

在 R 中怎么计算标准差?

用 sd(x)。注意它计算的是样本标准差,除以的是 n − 1,而不是 n。几乎所有真实分析需要的都是这个,因为你的数据几乎总是一个样本,而不是整个总体。

在 R 中怎么求平均值和中位数?

用 mean(x) 和 median(x)。如果向量里有缺失值,两者都会返回 NA,加上 na.rm = TRUE 就能只用已有的值来计算:mean(x, na.rm = TRUE)。

在 R 中怎么求众数?

不能用 mode(),这个函数返回的是对象的存储类型,而不是出现次数最多的值。改用 table 写法:names(which.max(table(x))) 返回出现次数最多的那个值。

R 中的标准误是什么?

R 没有内置的标准误函数,用 sd(x) / sqrt(length(x)) 计算即可。标准差描述数据的离散程度;标准误描述你对平均值的估计有多精确,样本越大,它就越小。

Coddy 编程语言插图

和 Coddy 一起学编程

开始