简介:一份概率论与数理统计课程大作业的完整统计分析文档,基于上海市2013年12月至2020年6月逐月空气质量指数(AQI)数据,围绕空气质量与季节关联及参数估计展开研究。文档将每日空气质量指数视为随机变量,通过样本方差与相关系数验证相邻两天独立性,再借助独立同分布中心极限定理得到月均值服从正态分布,并采用矩估计对均值与方差进行点估计,按季度比较参数变化与趋势,可清晰看到各季度期望、方差的表格及折线图,完整呈现统计建模与结论推导过程。整份资源为1个docx文件,约37KB,适合概率统计学习者及需要完成课程设计、大作业的高校学生参考,可用于模仿解题思路、报告结构与图表呈现方式。目前已有1051人学习/下载,对快速上手统计建模与参数估计实践有直接帮助。
1. 这不是一份能直接跑的代码,而是一堂完整概率统计课的落地样板
最近翻旧资料时翻到一份《概率统计大作业.docx》,文件名平平无奇,内容却意外扎实:用概率论核心工具——正态分布、矩估计、置信区间——去分析某沿海大城市从 2013 年 12 月到 2020 年 6 月共六年半的空气质量指数(AQI)月度数据。别被“大作业”三个字劝退,这份文档的好处是它把“参数估计”从公式变成了可复现的分析流程,每一步都留了中间数据和结论,适合正在找概率统计课程设计参考的学生,也适合想快速温习统计建模闭环的从业者。下面我把它拆开,按“建模、点估计、区间估计、踩坑”的顺序走一遍,你拿到手后能直接照着复现。
2. 先把“独立”这件事单独拿出来验:相关性计算与中心极限定理
2.1 为什么第一刀切在“独立”上
文档把每天空气质量指数设成随机变量 X(i, j, k),下标依次是年份、月份、日期。为什么要先讨论相邻两天是否独立?因为后续要用中心极限定理推导“每月平均 AQI 服从正态分布”,而中心极限定理的输入条件就是“独立同分布”样本。独立如果站不住,后面所有结论都得打个问号。
所以作业没有直接拿月均值开算,而是以 2020 年 5 月数据为例,验证相邻两天是否独立。验证思路很经典:若 X_k 和 X_{k+1} 独立,则 D(X_k + X_{k+1}) = D(X_k) + D(X_{k+1})。只要看等式两边差距大不大,就能判断独立性的近似程度。
2.2 用样本方差而不是二阶中心矩,是为了无偏性
这里藏着第一个值得记住的细节:文档特意指出“用两者的样本方差作为方差的估计值,不使用二阶中心矩,因为样本方差是无偏估计量,样本二阶中心矩不是”。不少初学者会把方差直接算成平均离差平方和,分母取 n,这样得到的是有偏估计;而 pandas、Excel 里默认的分母是 n-1,两者在小样本下差别很明显。
以 2020 年 5 月数据为例,算出的结果是:
- D(X_k) ≈ 847.04
- D(X_{k+1}) ≈ 851.70
- D(X_k + X_{k+1}) ≈ 2056.39
代入协方差公式再转成相关系数,约等于 0.21。你可以用下面这段 Python 反推一遍:
import math var_k = 847.04 # 第 k 天 AQI 的样本方差 var_k1 = 851.70 # 第 k+1 天 AQI 的样本方差 var_sum = 2056.39 # 相邻两天 AQI 之和的样本方差 # 协方差 = (Var(X+Y) - Var(X) - Var(Y)) / 2 cov = (var_sum - var_k - var_k1) / 2 # 相关系数 = Cov / (std(X) * std(Y)) rho = cov / math.sqrt(var_k * var_k1) print(f"rho = {rho:.2f}") # 输出约 0.21这里三个方差如果都用“除以 n”的二阶中心矩,虽然理论上协方差公式形式不变,但你会得到略微不同的相关系数,而且这个偏差在样本量越小时越明显。文档坚持用无偏样本方差,是没错的。
2.3 相关系数 0.21 意味着什么
ρ ≈ 0.21,说明相邻两天 AQI 是弱正相关。直觉上也说得通:某天空气质量差,第二天继续偏差的概率会高一点,但高得有限,毕竟风向、降水、早晚高峰排放都会改变。
那为什么后续还要假设独立?这不是自欺欺人,而是“近似假设”。弱相关序列的均值在大样本下同样会收敛到正态分布,中心极限定理的适用范围比教科书基本版本更宽。作业这一步处理其实很聪明:先用 0.21 这个数字承认“不独立”的事实,再以“相关性较弱”为由把问题拉回熟悉的独立同分布框架。真正的工程实践里,这种“为了模型可解而做的显式近似”非常常见,关键是必须写清楚近似的前提。
2.4 月均值方差和日方差不是同一个东西
独立同分布设定下,设 E(X) = μ,D(X) = σ²,根据中心极限定理,n 天求平均后,月均值 Y 近似服从正态分布 N(μ, σ²/n)。但文档后面又把 Y 的方差写成 σ²,这里其实是在“重新命名”——把月均值的方差记成了新的 σ²。
这里特别容易翻车:一个项目里如果不区分“日 AQI 方差”和“月均值方差”,后面算置信区间时会把标准误放大或缩小很多。实际计算时,若已知日方差 σ²_day,月均值的标准差应该是 σ_day / √n,n 为当月的天数。文档为了简化,直接对月度均值序列做矩估计,绕开了日尺度,这在统计口径上是自洽的,但你复现时脑子里要清楚口径切换点在哪。
3. 矩估计实操:季度分桶、点估计表格和第一张趋势图
3.1 为什么选矩估计而不强行套极大似然
文档采用矩估计法做点估计:均值参数直接用样本均值,方差参数用二阶中心矩(分母为 n)。公式是:
- μ 的矩估计:^μ = Y(i, j),也就是每月 AQI 均值的平均值
- σ² 的矩估计:^σ² = Σ(Y(i,j) − Ȳ)² / n
为什么不优先用极大似然?对正态分布来说,极大似然估计的方差分母同样是 n,和矩估计结果一致;但课程阶段矩估计推导更直观,也不需要额外的迭代。这里的关键不是“哪个方法更高级”,而是两个估计量的性质:
- ^μ:无偏、一致、有效,是三个季度参数里最可信的一个
- ^σ²:并不无偏(分母应为 n-1 才无偏),但满足一致性,样本量增大后误差趋近于 0
文档明确说“更关注 ^μ”,这是有道理的。统计学里“无偏性”不是万能的,但当你只有少量月度观测点时,无偏估计至少不会系统性偏小。
3.2 用代码把“季度分桶 + 矩估计”跑出来
作业把一年划分成四个季度,每个季度包含 3 个月,并剔除 2013 年和 2020 年这种不完整年份,只对 2014~2019 年六年完整数据做季度参数估计。复现逻辑可以简化成如下伪代码:
# 按季度聚合月度平均 AQI quarterly_means = { "2014Q1": [86.33, 76.5, 96.0], # 示意,实际用当月均值填充 "2014Q2": [78.0, 82.0, 85.0], # ... 其余季度同理 } def moment_estimator(values): mu_hat = sum(values) / len(values) sigma2_hat = sum((x - mu_hat) ** 2 for x in values) / len(values) return mu_hat, sigma2_hat for q, vals in quarterly_means.items(): mu, sigma2 = moment_estimator(vals) print(f"{q}: mu_hat={mu:.2f}, sigma2_hat={sigma2:.2f}")这段代码里的moment_estimator严格按矩估计定义来,分母取 n,而不是 n-1。如果你想得到无偏样本方差,分母要改成 n-1。实际做分析时,我一般会同时打印两个值,比较一下差距,心里有数。
3.3 2014~2019 年季度参数表
文档给出的点估计结果整理后大致如下:
| 年份 | Q1 μ | Q1 σ² | Q2 μ | Q2 σ² | Q3 μ | Q3 σ² | Q4 μ | Q4 σ² |
|---|---|---|---|---|---|---|---|---|
| 2014 | 86.33 | 149.56 | 81.67 | 106.89 | 70.00 | 8.67 | 83.33 | 124.22 |
| 2015 | 94.00 | 158.00 | 81.67 | 21.56 | 83.00 | 8.67 | 95.33 | 164.22 |
| 2016 | 87.33 | 107.56 | 87.33 | 36.67 | 74.00 | 234.00 | 73.33 | 314.89 |
| 2017 | 73.60 | 76.22 | 87.33 | 10.89 | 96.00 | 308.67 | 77.67 | 253.67 |
| 2018 | 74.33 | 97.56 | 79.33 | 0.89 | 58.67 | 76.22 | 68.33 | 6.89 |
| 2019 | 75.33 | 53.56 | 76.33 | 46.89 | 67.33 | 9.56 | 71.00 | 50.67 |
从这张表能读出两个明显现象。第一,第二、第三季度的均值普遍比第一、第四季度低,说明春夏空气质量整体好于秋冬。第二,第三季度的 σ²,多数年份都非常小,例如 2014 年只有 8.67,2019 年 9.56;这意味着夏季不仅平均 AQI 低,月度之间还特别稳定。
3.4 方差极小的原因解释要留余地
文档把第三季度方差小归因于亚热带季风气候,夏季降水集中、风向稳定,污染物扩散条件相对固定。这个解释方向合理,但要提醒一句:季度样本量只有 3 个月,σ² 的估计本身方差很大,单凭少数年份的“低方差”就断定夏季空气质量稳定,统计上是不够硬的。更严谨的做法是收集 2014-2019 年所有第三季度的月度均值,放到同一组样本里算置信区间,再和第一季度对比。这也是这个作业后续可以改进的空间之一。
4. 置信区间与单侧上限:回答“空气到底能差到什么程度”
4.1 从点估计到区间估计的路径
点估计给出一个具体数字,比如“某季度平均 AQI 约 80”,但用户真正关心的是“80 这个估计靠不靠谱”。文档在完成点估计后,立刻进入区间估计,这是正确的流程。μ 的置信区间公式是:
X̄ ± t(α/2, n−1) × S / √n
其中 S 是样本标准差,n 是样本量,t 是 t 分布的临界值。文档取置信度 0.05,也就是 95% 置信水平,查表得到 t(0.025, n−1) = 2.1098,对应自由度约 17,说明样例量约 18,这正好和“6 个完整年份 × 每个季度 3 个月 = 18 个月度均值”吻合。
4.2 双侧置信区间和单侧上限的完整结果
将六个年份的同一个季度放在一起估算,得到如下区间:
| 季度 | μ 双侧置信区间(95%) | μ 单侧置信上限(95%) |
|---|---|---|
| 第一季度 | (15.24, 179.56) | 165.14 |
| 第二季度 | (54.27, 110.29) | 105.38 |
| 第三季度 | (0, 206.66) | 183.52 |
| 第四季度 | (0, 207.62) | 184.93 |
双侧区间描述的是“均值大概落在哪个范围”,单侧上限则更适合回答“空气质量最差能到什么水平”。从单侧上限看,四个季度都低于 190。AQI 超过 200 属于重度污染,因此文档得出结论:每季度平均 AQI 服从 μ > 200 的正态分布的概率低于 5%。换句话说,出现整季度一半以上天数重度污染的可能性很低。
4.3 这个区间其实暴露了数据量不足的问题
第三、第四季度的置信下限为 0,并不是说空气质量可能好到 0,而是样本均值不高、方差偏大时,t 区间算出来的下界变成了负数,再人为截断成 0。这种“截断”在展示上可以接受,但分析时一定要意识到:宽区间说明样本量或数据代表性不够,而不是空气质量真的可能为 0。
用代码可以快速还原区间计算过程:
import numpy as np from scipy import stats # 以某季度 18 个月度均值为例 monthly_means = np.array([86.33, 94.00, 87.33, 73.60, 74.33, 75.33, 83.33, 95.33, 73.33, 77.67, 68.33, 71.00]) n = len(monthly_means) mean = monthly_means.mean() se = monthly_means.std(ddof=1) / np.sqrt(n) t_crit = stats.t.ppf(0.975, df=n-1) # 双侧 print(mean - t_crit * se, mean + t_crit * se)这里ddof=1是为了用无偏样本标准差算标准误。t 临界值也可以直接用scipy.stats.t.ppf查,不必翻书末附表。需要注意的是,如果月度均值本身存在序列相关,这样的标准误会偏小,区间会比实际情况更窄。
4.4 对比季度均值变化趋势:近六年稳定在 80 附近
文档还做了“各季度同比”分析,结论很清晰:2014~2019 年每季度 AQI 均值基本在 80 上下波动,整体趋势稳定。AQI 在 80 左右属于“良”级别,只对极少数敏感人群有影响,说明这几年城市空气质量没有出现系统性恶化。
5. 复现时常见的五个坑:现象、原因、解决
5.1 置信区间和矩估计的方差数量级对不上
现象:把表 3 中的季度矩估计 σ² 开方,再套进置信区间公式,回推出来的样本标准差与表 3 数量级明显不一致。比如第三季度双侧区间半宽约 103,按 n=18 回推 S 约 103 × 4.24 / 2.11 ≈ 207,但矩估计表里第三季度 σ² 多数年份只有几十到几百,根号后平均也就 10~50。
原因:作业在“每月均值看作随机变量”和“每天 AQI 看作随机变量”两个尺度之间来回切换,合并年份做区间估计时,很可能把季度均值序列的方差和原始日度数据的方差混用了。
解决:复现时固定一个分析口径。如果要估计“季度平均 AQI 的置信区间”,就应该使用“18 个月度均值的样本均值与标准差”去算区间;如果要估计“某一天 AQI 的范围”,才使用日度数据的方差。
5.2 二阶中心矩和样本方差混用,相关系数跟着偏
现象:两个相邻序列的相关系数,自己算出来和文档数值对不上,差 0.03~0.05 都算正常,极端场景差更多。
原因:一个环节用了除以 n 的方差,另一个环节用了除以 n-1 的方差,协方差与方差不同步,ρ 自然失真。
解决:统一使用np.cov(ddof=1)或np.var(ddof=1),不要手写离差平方和再除以 n。相关性这类二阶统计量对分母极其敏感,小样本下尤其如此。
5.3 置信下限为 0,被当作“空气质量可能低于 0”
现象:第三、四季度区间写成 (0, 206.66) 和 (0, 207.62),阅读者可能误以为 AQI 可以为 0。
原因:正常 t 区间计算出的下界是负数,展示时被截断为 0,但没有加文字说明。
解决:要么保留负数下界并解释“统计下限,不代表实际值”,要么改用非参数 Bootstrap 置信区间,避免分布假设带来的负值问题。
5.4 不完整月份直接进入季度聚合,边界失真
现象:样本区间是 2013 年 12 月到 2020 年 6 月,2013 年和 2020 年都是不完整年份。文档直接选择剔除这两年,对结论影响不大,但如果把 2013 年 12 月并入第一季度,会明显拉低一季度均值。
原因:最后落到 2014-2019 的“六年完整季度”上,边缘月份没有参与任何分析,属于信息丢弃。
解决:更稳妥的做法是单独标注“部分月份”的样本量,或把 2013 年 12 月当成 2014 年第一季度的补充样本做敏感性分析,看结论是否稳健。
5.5 弱相关被直接改写成“独立”
现象:摘要和结论里写着“相邻两天空气质量指数互相独立”,但实际算出的相关系数是 0.21,文档自己也承认这是弱相关。
原因:为了应用中心极限定理,把“近似独立”简化成了“独立”,严格说是不严谨的。
解决:结论措辞改为“在弱相关假设下近似成立”,或在建模阶段显式声明“将序列相关性视为可忽略,对月度均值的影响有限”。如果有余力,还可以对月度均值序列做一阶自相关检验,用数字支撑这个简化。
6. 让结果可复核:把大作业整理成一条统计流水线
一开始我以为这份资源就是凑数的大作业,真按流程走一遍才发现,能复现的东西不少。它最值得借鉴的不是结论,而是“先验证条件,再做估计,最后给区间”的完整链条。
如果你拿到手想快速复用,建议按这个顺序整理:
先用 Python 读入原始月度 AQI 数据,按“年-季”分组,计算矩估计量和无偏样本方差;然后把结果落到 CSV;最后绘制季度均值和方差的折线图,观察季节规律。每一步都留一个中间输出,比如打印样本量 n、均值和标准差。
我习惯在代码里加一段自动校验,避免口径混淆:
def summarize_quarterly(df, quarter_col, aqi_col): out = df.groupby(quarter_col)[aqi_col].agg( mu_hat="mean", sigma2_hat=lambda x: ((x - x.mean()) ** 2).sum() / len(x), n="count" ) out["ci_width"] = 2 * 2.11 * out[aqi_col].std() / np.sqrt(out["n"]) return out这里最难的一点是,你要记住每张表基于的是月均值还是日均值。从那以后,我每次做这类统计作业,第一步都会在文件开头写一行注释说明当前口径是什么,再往下算。别小看这行注释,它能帮你避开一半的返工。这六个坑如果能提前避掉,这份《概率统计大作业.docx》就不是只能交差的一次性作业,而是一套可以迁移到其他城市、其他污染物分析的通用统计流程。希望帮到你。
本文还有配套的精品资源,点击获取