FEATURED · 精选文章

用Python重算数理统计答案:抽样分布、参数估计与假设检验校验指南

发布时间 / 2026/9/18 19:15:46
来源 / 创域科博编辑部
栏目 / 资讯中心
用Python重算数理统计答案:抽样分布、参数估计与假设检验校验指南 简介庄楚强版《应用数理统计基础》第二至四章答案文档面向理工科学生、考研备考者及统计入门读者用于课后习题对照与核心知识点梳理。压缩包共1个doc文件整体大小8.03MBdoc格式便于直接查看和打印文档按章节排布、逐条对应习题。已有357人学习下载是应用数理统计复习中较实用的配套材料对习题练习和概念辨析均有不错的辅助作用。内容不仅包含答案还串联了第二章的数据类型、数据收集、描述统计、图表表示、数据清洗与准备以及第三章的假设检验、常用检验统计量、相关回归分析、方差分析、非参数检验与Bootstrap技术等关键知识适合用来检验学习效果、补足薄弱环节也能作为期末或考研冲刺时快速回顾知识框架的参考资料。适用于平时作业自查、期末系统复习以及考研专业课冲刺等多种场景。1. 为什么一份“应用数理统计基础第二至四章答案”值得当成代码用例读在指标波动归因、A/B实验显著性判断、容量预估这三类日常任务里最后都会落到同一个问题这个差异是随机的还是真实的。庄楚强版《应用数理统计基础》第二至四章恰好把这块的理论链条串了起来。很多人拿到答案文档只想对数字但我建议把它当成一组已经标定好结果的数据集每道题都是一个测试用例答案就是测例的期望输出。适合读的人不只是复习考试的学生还有手里攒了一堆业务数据、想确认自己有没有用错统计公式的研发和算法工程师。带着“我要把答案重算一遍”的心态去读比对着抄一行数有用得多。2. 第二至四章讲什么抽样分布、参数估计与假设检验的骨架先说版本问题。庄楚强的教材不同印次章节号有小幅调整我手边这一版的第二至四章对应的是统计量与抽样分布、参数估计、假设检验三块。前接概率论后接回归与方差分析中间这三章是整套推断统计的承重墙。看答案文档时如果不先分清题目属于这三块里的哪一块很容易出现“公式套对了、结论方向反了”的情况。2.1 统计量为什么总是绕不开分布统计方法里几乎没有“样本均值等于某个数”这种确定性答案只有“样本均值落在某个区间的概率是多大”。一个具体样本是总体的一次观测换个样本数字就变要让结论可迁移必须知道样本统计量在重复抽样下服从什么分布。比如样本均值在总体方差已知时服从正态分布方差未知、用样本标准差顶替时就服从 t 分布差出来的正是“自由度”。第二至四章答案里大量题目的关键中间步骤其实都是在算自由度、判断该查哪一张分布表。我习惯先用一个小模拟把抽样分布这个概念落在地上import numpy as np rng np.random.default_rng(2026) # 生成 10000 组样本量为 30 的正态样本计算每组均值 means [rng.normal(loc5, scale2, size30).mean() for _ in range(10000)] print(f10000 个样本均值的标准差{np.std(means):.3f})这段代码做的事是从均值为 5、标准差为 2 的正态总体中重复抽 10000 次样本每次抽 30 个观测并计算均值。rng.normal(loc5, scale2, size30)是核心参数loc是总体均值scale是总体标准差size30是单次样本量。理论上样本均值的标准差应该是 $2/\sqrt{30} \approx 0.365$模拟输出会非常接近这个值。这就是“统计量也有分布”的直接证据。2.2 参数估计的两种口径与区间报告的坑参数估计的答案通常差在口径矩估计和极大似然估计看起来都在求估计量但目标函数不同结果在部分题型里会不一样。常见情况是矩估计计算简单极大似然估计需要先写似然函数再求导答案文档往往两种都给了核对时先看题目问的是哪一种。估计口径核心思路常见结果最容易踩的坑矩估计令样本矩等于总体矩解方程均值、方差估计量二阶中心矩记成总体方差忘记除 n极大似然估计构造似然函数对参数求导取最大值正态均值、指数分布参数等求导后忘记验证二阶导为负区间估计在点估计周围按抽样分布给出范围$(\bar{x} - t \cdot \frac{s}{\sqrt{n}},\ \bar{x} t \cdot \frac{s}{\sqrt{n}})$混淆 z 分位数和 t 分位数区间估计的答案核对起来最花时间因为一个区间有三个变量中心、分位数、标准误。中心是点估计分位数取决于置信水平和分布类型标准误取决于样本量和自由度数。我核对时不会只看“区间对不对”而是先单独把标准误算出来再对照答案里的半径这样能快速定位错在哪个环节。2.3 假设检验先定风险再定结论假设检验章节的答案格式高度统一原假设、备择假设、检验统计量、p 值或临界值、结论。最容易出错的是备择假设的写法因为单侧检验的备择假设决定了拒绝域在左边还是右边。比如要检验新算法耗时是否“小于”旧算法备择假设是 $\mu_1 \mu_2$ 还是 $\mu_1 \mu_2$ 会直接改变临界值方向。一个常识是显著水平是预先定好的“允许犯错上限”。答案里如果说了“在 0.05 水平上显著”那么所有围绕显著水平的说法都要以这个前提展开。我用一个小脚本验证 p 值和临界值的关系from scipy import stats df 29 alpha 0.05 # 双侧检验0.025 左侧 0.025 右侧 t_crit_two stats.t.ppf(1 - alpha / 2, df) # 单侧检验拒绝域只在右侧 t_crit_one stats.t.ppf(1 - alpha, df) print(f双侧临界值 t{t_crit_two:.3f}单侧临界值 t{t_crit_one:.3f})stats.t.ppf(q, df)是 t 分布的分位点函数q传入累积概率返回值是对应的临界值。双侧检验要把显著水平切一半所以用1 - alpha / 2单侧检验把整个错误概率放在一侧用1 - alpha。自由度为 29 时两者临界值相差大约 0.2足够改变一个小 p 值样本的结论。核对答案看到“拒绝原假设”时先看题目到底写的是单侧还是双侧再决定用哪个临界值对。3. 用 Python 把答案“重算一遍”的最小校验方案答案文档里最终结果可能需要合入自己的知识库。只靠肉眼对数字看不出思路问题。我一般会把题干里的关键数值抽出来用 Python 重算再与答案做差。这样既能发现文档里可能的打印错误也能验证自己是否理解了抽样分布和自由度。3.1 搭建校验环境与数据组织方式环境上不需要装重型平台三个包足够numpy做数值计算scipy.stats提供分布函数statsmodels处理回归和方差分析。创建虚拟环境并安装的命令如下python -m venv stat-check source stat-check/bin/activate pip install numpy scipy statsmodelspython -m venv stat-check创建名为stat-check的虚拟环境source激活它pip install安装三个依赖。之后所有的校验脚本都跑在这个环境里不会污染系统 Python。注意statsmodels依赖的版本可能不同在全新环境安装最干净。接下来把答案文档里的题目整理成一个 Python 列表每条记录包含题号、章节、公式类型、答案数值和容差。这样做的意义是让“对答案”变成“跑测试”。一个示例结构如下cases [ { id: 3-12, chapter: 参数估计, formula: t_interval, expected: (5.09, 7.31), tolerance: 0.01, }, ]每个字典字段都要理解清楚id是题号用于失败时定位expected是文档答案区间formula是随后工厂函数要分发的计算类型tolerance是允许的计算误差。把整理好的cases存成 JSON 或 Python 文件后续每次重算都从这里读。3.2 用 scipy.stats 复算 t 区间与双样本检验第二至四章里 t 检验和 t 区间出现频率非常高。我写一个函数同时覆盖这两种情况便于批量校验import numpy as np from scipy import stats def calc_t_interval(data, conf_level0.95): data np.asarray(data) n len(data) mean data.mean() se stats.sem(data) # 默认 ddof1即样本标准差 t_crit stats.t.ppf((1 conf_level) / 2, dfn - 1) return (mean - t_crit * se, mean t_crit * se) sample np.array([5.2, 5.8, 5.4, 6.1, 4.9, 5.5]) print(calc_t_interval(sample))stats.sem(data)计算标准误默认ddof1对应样本标准差公式中的 $n-1$ 自由度。stats.t.ppf的dfn-1是核心参数少传这一项会直接沿用标准正态分布的分位数结果偏窄。这个函数返回一个元组再与答案区间逐项比较。双样本场景用stats.ttest_ind更省事x np.array([5.2, 5.8, 5.4, 6.1, 4.9, 5.5]) y np.array([6.0, 6.3, 5.9, 6.5, 5.8, 6.2]) t_stat, p_value stats.ttest_ind(x, y, equal_varFalse) print(ft{t_stat:.3f}, p{p_value:.4f})ttest_ind做的是独立样本 t 检验equal_varFalse表示不假设两组方差相等即 Welch 检验。返回的p_value默认是双侧概率。如果答案文档给的是单侧 p 值要自己做一次除法单侧 p 值等于双侧 p 值除以 2前提是检验统计量方向与观测方向一致。3.3 用 statsmodels 核对方差分析与回归系数庄楚强版第二至四章之后常常紧跟方差分析但章节内的回归相关内容也可能用statsmodels核对。方差分析表最关键的列是PR(F)它直接对应答案里的显著性判断。一个最小可用的方差分析代码块如下import pandas as pd import statsmodels.api as sm from statsmodels.formula.api import ols df pd.DataFrame({ group: [A] * 6 [B] * 6 [C] * 6, value: [5.2, 5.8, 5.4, 6.1, 4.9, 5.5, 6.0, 6.3, 5.9, 6.5, 5.8, 6.2, 4.8, 5.1, 5.0, 5.3, 4.7, 5.2], }) model ols(value ~ group, datadf).fit() print(sm.stats.anova_lm(model))ols(value ~ group, datadf)指定因变量value和分组变量groupfit()拟合线性模型。anova_lm从拟合结果里提取组间平方和、组内平方和、F 统计量及 p 值。核对答案时重点看df这一列组间自由度是组数减一组内自由度是总样本量减组数。如果答案里的自由度数和这里对不上说明原始数据里某个组的样本量被记错了。3.4 把每章答案做成可回归校验的表格所有校验脚本最终要落到一张能重复执行的检查表上。我把第二至四章常用方法整理成一个固定模板章节主题校验函数关键参数容差设置抽样分布stats.t.ppf/stats.chi2.ppf自由度df0.001参数估计自写calc_t_intervalddof1、置信水平0.005假设检验stats.ttest_ind/stats.ttest_1sampequal_var、单双侧p 值容差 0.001方差分析sm.stats.anova_lm组间、组内自由度0.001这张表的意义不只是“怎么算”而是“怎么排查”。比如 t 区间结果比答案宽先看是不是sem默认ddof1被改成了 0p 值正好卡在显著水平附近先看单双侧是否选对。容差不要设成 0因为答案文档是保留小数位数后打印的四舍五入会造成微小的尾差。4. 核对答案时必须盯住的三个数值边界第二至四章答案里最容易抄错、也最容易让人自我怀疑的是几个数值边界。它们不会写在最终答案里但决定了答案是否成立。我每次重算都按下面三个顺序检查。4.1 自由度是 n-1、n-2 还是 n-k自由度是抽样分布里最本质的参数。一个样本量为 30 的 t 区间自由度是 29如果做了线性回归残差自由度是 $n-k-1$$k$ 是自变量个数多组方差分析里组内自由度是 $n-k$$k$ 是组数。少一个自由度临界值只会差一点点但累积下来的误判风险不小。from scipy import stats alpha 0.05 df_wrong 30 df_right 29 wrong_crit stats.t.ppf(1 - alpha / 2, df_wrong) right_crit stats.t.ppf(1 - alpha / 2, df_right) print(fdf30 临界值 {wrong_crit:.3f}df29 临界值 {right_crit:.3f})输出结果里两个临界值可能只差 0.01这就是为什么肉眼核对难以发现自由度错误。但把这个差乘上标准误后区间边界会出现约 0.1 的偏移足以让某个值的显著性判断翻转。核对答案时直接检查所有t.ppf、chi2.ppf调用里的df参数比检查置信区间本身更有效。4.2 单侧、双侧与 p 值方向很多答案只写“p 值小于 0.05拒绝原假设”不写单双侧。这时需要根据题干中的措辞判断题干出现“是否相同”“是否相等”是双侧检验出现“是否大于”“是否小于”“是否更优”通常是单侧检验。最危险的情况是题干既有“差多少”又有“是否更优”必须以最后一句结论性问法为准。from scipy import stats t_obs 2.31 df 18 # 双侧 p 值 p_two 2 * (1 - stats.t.cdf(abs(t_obs), df)) # 假设方向为右侧的 p 值 p_one 1 - stats.t.cdf(t_obs, df) print(f双侧 p{p_two:.4f}单侧 p{p_one:.4f})stats.t.cdf(t_obs, df)计算累积分布函数得到左侧概率。双侧 p 值先取绝对值再算右侧尾部最后乘以 2单侧 p 值直接用右侧尾部概率。如果一方小于 0.05 而另一方大于 0.05而题目没有明确说明单双侧答案就只能按题目原意去对不能由自己选择更有利的结论。4.3 区间估计里用 z 还是 t大样本和总体方差已知时正态分布 z 分位数和 t 分位数结果接近但在样本量小于 30 或方差未知时t 分布是更稳妥的选择。答案文档里如果题目给了总体标准差用scipy.stats.norm.interval如果只给了样本标准差用stats.t.interval。两者混用是区间估计题最典型的错误。场景分位数来源标准误公式核对方式总体方差已知stats.norm.ppf$\sigma / \sqrt{n}$与答案标准差列比较总体方差未知样本量小stats.t.ppf(dfn-1)$s / \sqrt{n}$检查自由度是否为 n-1总体方差未知样本量大两者均可$s / \sqrt{n}$结果差异小于 0.02 时可忽略关键点在于标准误公式而不是临界值本身。一个常见错觉是“样本量大于 30 就用 z”这其实是以结果近似度代替了理论假设。如果题目明说是正态总体且方差未知即使样本量 50教材答案很可能仍在用 t。我核对时会先看题目给的标准差是总体符号 $\sigma$ 还是样本符号 $s$再决定接受哪一种答案。5. 一个能长期用的技巧把答案文档转成“考点-参数-数值”速查表与其每次翻 doc 文件里的题目不如把第二至四章答案按自己的理解重新编码成一张结构化速查表。我做这件事的核心工具是 Python 里的dataclass加一个简单的 Markdown 导出函数整个过程不需要额外平台。先定义三类记录的格式分布类、估计类、检验类。每一类都带“章节来源”“关键参数”“答案要点”三个字段。from dataclasses import dataclass dataclass class CheckRecord: chapter: str method: str key_params: dict answer_summary: str使用的时候直接构造实例比如记录 t 区间的自由度计算思路records [ CheckRecord( chapter参数估计, methodt_interval, key_params{df: n - 1, conf_level: 0.95}, answer_summary自由度用样本量减一标准误用样本标准差除以根号样本量, ), ]chapter用来分组method是以后写代码时的函数名key_params保存公式参数answer_summary用一两句话解释答案背后的方向。这样做的价值在于下次遇到业务数据我不用重新打开答案文档只需要看key_params里记录的“自由度公式”和“标准误公式”就能直接写出核对代码。导出成 Markdown 也很简单写一个生成表格的函数让速查表变得可搜索def export_markdown(records): lines [| 章节 | 方法 | 关键参数 | 答案要点 |, | --- | --- | --- | --- |] for r in records: params , .join(f{k}{v} for k, v in r.key_params.items()) lines.append(f| {r.chapter} | {r.method} | {params} | {r.answer_summary} |) return \n.join(lines)export_markdown把每条记录拼成 Markdown 表格行key_params里的字典被展开成dfn-1, conf_level0.95这种可读格式。导出结果可以直接放进自己的文档库和代码脚本放在同一个仓库每次跑校验脚本时顺手更新。这个习惯最直接的收益是复习和排错可以共用一套索引。处理线上 A/B 实验时看到params {df: 29}就能立即想起对应的临界值是 2.045而不是重新翻教材。答案文档里的数字会随时间忘记但“这道题考的是哪个参数这个参数怎么推导”不会。本文还有配套的精品资源点击获取
RELATED — 相关阅读

相关资讯

LATEST — 最新资讯

最新发布

TODAY — 本日精选

新闻

WEEKLY — 本周精选

新闻

MONTHLY — 本月精选

新闻