☰
概率统计大作业实战:用矩估计与置信区间分析AQI月度数据
2026/10/15 4:14:49 网站建设 项目流程

简介:一份概率论与数理统计课程大作业的完整统计分析文档,基于上海市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 σ²
201486.33149.5681.67106.8970.008.6783.33124.22
201594.00158.0081.6721.5683.008.6795.33164.22
201687.33107.5687.3336.6774.00234.0073.33314.89
201773.6076.2287.3310.8996.00308.6777.67253.67
201874.3397.5679.330.8958.6776.2268.336.89
201975.3353.5676.3346.8967.339.5671.0050.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》就不是只能交差的一次性作业,而是一套可以迁移到其他城市、其他污染物分析的通用统计流程。希望帮到你。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询