笔记2-《统计思维:程序员数学之概率统计》描述性统计量  

目录
  1. 描述性统计量
  2. 用 Python 验证
  3. 这章真正的方法论转变

描述性统计量

  • 2.1 均值和平均值

    • 均值的定义

      • 含 nn 个值的样本 xix_i,均值 μ\mu 等于总和除以值的数量

        μ=1n∑i=1nxi\mu = \frac{1}{n}\sum_{i=1}^{n} x_i

    • 「均值」与「平均值」的区别

      • 样本的均值是按上述公式算出的一个汇总统计量
      • 平均值是若干种可用于描述样本的典型值或集中趋势(central tendency)的汇总统计量之一
      • 苹果的例子:6 个苹果总重 3 磅,每个大约半磅 —— 均值很好地描述了这组数据
    • 南瓜的反例

      • 3 个装饰南瓜各 1 磅、2 个制饼南瓜各 3 磅、1 个大西洋巨型南瓜 591 磅
      • 均值被巨型南瓜拽到 119.8 磅,但**「典型」的南瓜并不存在**
      • 「我种的南瓜的平均重量是 100 磅」这种说法至少是一种误导
  • 2.2 方差

    • 方差描述分散情况,均值描述集中趋势

      σ2=1n∑i=1n(xi−μ)2\sigma^2 = \frac{1}{n}\sum_{i=1}^{n}(x_i - \mu)^2

    • xi−μx_i - \mu 叫离均差(deviation from the mean),方差是离均差的方均值,这也解释了为什么用 σ2\sigma^2 记

    • 方差的平方根 σ\sigma 叫标准差

    • 方差本身不好解释,因为单位很奇怪 —— 磅的平方;标准差单位明确,还是磅

    • 注意:这里除数是 nn。若除以 n−1n-1,那是「样本方差」,用于通过样本估计总体的方差,第 8 章会再讲

  • 2.3 分布

    • 「汇总统计量简单明了,但风险也大,因为它们很有可能会掩盖数据的真相」

    • 另一种方法是看分布(distribution),它描述各个值出现的频繁程度

    • 最常用的表示方法是直方图(histogram)

      • 频数:数据集中一个值出现的次数
      • 概率 = 频数 ÷ 样本数量 nn
    • Python 里算频数最简单的是字典

      hist = {}
      for x in t:
      hist[x] = hist.get(x, 0) + 1
    • 归一化(normalization):把频数转成概率

      n = float(len(t))
      pmf = {}
      for x, freq in hist.items():
      pmf[x] = freq / n
    • 归一化后的直方图叫 PMF(Probability Mass Function,概率质量函数),是值到其概率的映射

    • 把 Python 的字典称为「函数」可能让读者困惑,但数学上函数就是一组值到另一组值的映射,字典本身也是「映射」

  • 2.8 异常值

    • 异常值 = 远离集中趋势的值
    • 可能来自数据采集和处理过程的错误,也可能是罕见的正确结果
    • 活婴怀孕周期的最低十个值:{0, 4, 9, 13, 17, 17, 18, 19, 20, 21}
      • 低于 20 周的值肯定是错误的
      • 只有高于 30 周的值正确的可能性才比较大
      • 介于两者之间的值就很难解释了
    • 最高的几个值:43 周 148 次、44 周 46 次、45 周 10 次、46 周 1 次、47 周 1 次、48 周 7 次、50 周 2 次
    • 一种处理方法是对一定比例的最高和最低值修剪(trim)
  • 2.9 其他可视化方法

    • 直方图和 PMF 在探索性数据分析中很有用
    • NSFG 数据中明显的分布差异出现在众数附近,所以有必要放大这一部分
    • 图 2-3 是 PMF 在 35-45 周间的差异,乘以 100 表示差异百分比
    • 趋势很清晰:第一胎婴儿较少在 39 周出生,通常是在 41 周和 42 周出生
  • 2.10 相对风险

    • 分组区间(bin)
      • 提前出生:第 37 周或更早
      • 准时出生:第 38 到 40 周
      • 延后出生:第 41 周或更晚
    • 相对风险 = 两个概率的比值
      • 第一胎提前出生的概率是 18.2%
      • 非第一胎婴儿提前出生的概率是 16.8%
      • 相对风险 = 1.08,意味着第一胎比其他几胎更早出生的可能性有 8%
  • 2.11 条件概率

    • 场景:某人怀孕,现在是第 39 周的开始,宝宝这一周出生的概率是多少?如果是第一胎呢?
    • 条件概率就是依赖于某个条件的概率 —— 条件是「已知宝宝没有在前 38 周出生」
    • 书里给的方法(模拟法)
      1. 根据 PMF 生成一个 1000 名孕妇的模拟人群,每个周数 xx 的孕妇人数为 1000⋅PMF(x)1000 \cdot PMF(x)
      2. 删除所有怀孕周数不足 39 的孕妇
      3. 计算余下怀孕周期的 PMF,这就是一个条件 PMF
      4. 计算 x=39x = 39 时条件 PMF 的值
    • 更简单的替代方案:将小于 39 的值从分布中删除,然后重新归一化
  • 2.12 汇报结果

    • 不同的人需要不同的答案
      • 科学家对实际效果更感兴趣,无论多小
      • 医生只关注临床上有重要意义的结果,即会影响治疗决策的结果
      • 孕妇更关心与自身密切相关的东西,比如条件概率
    • 汇报方式取决于具体目的:要证明显著性就选汇总统计量(如相对风险),要说服患者就选能反映特定情况的统计量
  • 2.13 术语表

    • 区间(bin):将相近数值进行分组的范围
    • 集中趋势(central tendency):样本或总体的一种特征,直观上就是最能代表平均水平的值
    • 临床上有重要意义(clinically significant):分组间差异等跟实践操作有关的结果
    • 条件概率(conditional probability):某些条件成立的情况下计算出的概率
    • 分布(distribution):对样本中的各个值及其频数或概率的总结

用 Python 验证

直方图、归一化、相对风险、条件概率:

def MakeHistFromList(xs):
hist = {}
for x in xs:
hist[x] = hist.get(x, 0) + 1
return hist

def MakePmfFromList(xs):
n = float(len(xs))
return {x: freq / n for x, freq in MakeHistFromList(xs).items()}

def prob_in(pmf, lo, hi):
return sum(v for k, v in pmf.items() if lo <= k <= hi)

def conditional_pmf(pmf, x):
"""已知没在 x 周之前出生时,x 周的条件概率"""
tail = {k: v for k, v in pmf.items() if k >= x}
total = sum(tail.values())
return tail[x] / total if total else 0.0

# 两个 PMF(形态按书里的方向:第一胎更偏向晚周)
pmf_first = {38: 0.050, 39: 0.180, 40: 0.240, 41: 0.260, 42: 0.170, 43: 0.060, 44: 0.040}
pmf_other = {38: 0.070, 39: 0.190, 40: 0.230, 41: 0.240, 42: 0.160, 43: 0.065, 44: 0.045}

print("相对风险(提前 = 37 周及以前)")
for name, lo, hi in [("提前(<=37)", 0, 37), ("准时(38-40)", 38, 40), ("延后(>=41)", 41, 50)]:
a = prob_in(pmf_first, lo, hi)
b = prob_in(pmf_other, lo, hi)
rr = a / b if b else float("nan")
print(f" {name}: 第一胎={a:.3f} 其他={b:.3f} 相对风险={rr:.3f}")

print()
print("条件概率(第一胎)")
for x in [39, 40, 41]:
print(f" 已知未在 {x-1} 周前出生,{x} 周出生 = {conditional_pmf(pmf_first, x):.4f}")

print()
print("书里的真实数字校验")
p1, p2 = 0.182, 0.168
print(f" 第一胎提前={p1} 其他提前={p2} 相对风险={p1/p2:.4f} → 高 {(p1/p2-1)*100:.0f}%")

输出:

相对风险(提前 = 37 周及以前)
提前(<=37): 第一胎=0.000 其他=0.000 相对风险=nan
准时(38-40): 第一胎=0.470 其他=0.490 相对风险=0.959
延后(>=41): 第一胎=0.530 其他=0.510 相对风险=1.039

条件概率(第一胎)
已知未在 38 周前出生,39 周出生 = 0.1895
已知未在 39 周前出生,40 周出生 = 0.3117
已知未在 40 周前出生,41 周出生 = 0.4906

书里的真实数字校验
第一胎提前=0.182 其他提前=0.168 相对风险=1.0833 → 高 8%

书里的真实数字(18.2% / 16.8% → 相对风险 1.08)算出来确实是「高 8%」。

这章真正的方法论转变

三个层次,缺一不可:

层次工具回答什么
汇总均值、方差、中位数大概在什么位置、有多分散
分布直方图、PMF各个值分别出现多少次
对比相对风险两组之间的差距有多大

而第 4 层「这个差距是真的吗」要等到第 7 章的假设检验。

作者在 2.12 节说的那句话是这个方法论的落点:「假设这些结果都是真实的(但要记住,这只是一个假设),我们怎么汇报这些结果?」

探索性数据分析到这一步为止 —— 你已经看到了效应,但还没证明它不是随机波动造成的。这就是为什么书里把「假设检验」放在统计流程的最后一步,而不是开头。

123.8k