拓冰建站拓冰建站
首页 / 资讯中心 / 正文

统计学公式详解:从方差、t检验到回归分析,避开数据分析中的常见坑

简介这是一份针对贾俊平《统计学》核心内容的公式精华整理适合备战期末考试、考研初试或快速回顾统计基础的读者使用。文档以PDF单文件形式提供共1个文件体积仅163KB便于移动端随时翻阅。内容系统覆盖描述统计与推断统计两大模块包括扁平尖峰分布与偏态系数、经验法则、离散系数、置信区间与样本量确定、参数估计以及假设检验中总体均值、总体比例、独立样本检验、列联分析、方差分析和相关分析等主题每种方法均给出公式形式、适用条件与判断规则可帮助读者快速定位所需统计量。已有1088人学习该资料对于需要考前冲刺或日常查漏补缺的统计学学习者而言具有较高的参考价值。1. 统计学公式不用背但必须知道“分母为什么减一”做AB实验的p值明明小于0.05第二天换个口径运行却变成0.06同一份订单数据Excel里的STDEV和STDEVP算出的波动率相差近一倍——这类问题几乎都出在统计公式的细节口径上。贾俊平《统计学》教材的公式体系在国内应用型教学中很有代表性它把描述统计、参数估计、假设检验、回归分析这几大块的公式讲得比较规整适合作为公式速查的基准。这篇博文不推导公式而是按“公式含义 → 参数边界 → 代码复现 → 常见坑”的顺序把最常用的一批统计学公式串起来重点放在方差的无偏修正、检验统计量的自由度、回归系数的解释这三件容易混淆的事情上。适合经常处理数据、写分析报告、做AB实验的一线工程师和数据分析师。2. 描述统计公式均值、方差和标准差的口径选择数据分析的第一步永远是对样本做描述统计而这一步最容易在公式口径上出错。贾俊平教材把描述统计分成集中趋势和离散程度两类前者包括均值、加权均值、几何均值后者包括方差、标准差、变异系数。这些公式看起来简单但“总体还是样本”“加权还是等权”“算术还是几何”三个选择题直接决定了结果是否能被业务方接受。2.1 总体方差与样本方差n和n-1的选择总体方差和样本方差的公式结构完全一致唯一区别在分母。总体方差的分母是N样本方差的分母是n-1这个“减一”是贝塞尔修正目的是让样本方差成为总体方差的无偏估计。如果拿样本数据直接除以n算出的方差会系统性偏小。样本方差公式s² Σ(xi - x̄)² / (n - 1) 总体方差公式σ² Σ(xi - μ)² / N在numpy里具体使用哪个口径由参数ddofdelta degrees of freedom自由度偏移量控制默认ddof0时按总体公式计算设成ddof1才按样本公式计算。很多人在Jupyter里直接跑np.var(data)拿到的其实是总体方差如果样本量只有几十条这个误差会相当可观。import numpy as np orders np.array([120, 132, 128, 145, 138, 121, 130, 142]) pop_var np.var(orders) # ddof0按总体公式除以n sample_var np.var(orders, ddof1) # 按样本公式除以n-1 sample_std np.std(orders, ddof1) # 样本标准差 print(f总体方差: {pop_var:.2f}) print(f样本方差: {sample_var:.2f}) print(f样本标准差: {sample_std:.2f})这段代码的关键点在ddof参数。ddof的含义是计算方差时分母要减去的自由度数量样本方差用n-1作为分母所以ddof1总体方差分母是n本身所以ddof0。需要注意的是pandas里DataFrame的var()和std()方法默认就是按样本口径计算的所以同一列数据在pandas和numpy里跑出来的结果可能不一样这不算bug是默认口径不同。提示如果样本量超过1000n和n-1的差异可以忽略但样本量小于50时两个口径的标准差差距会明显影响到后续置信区间和检验统计量的计算结果。2.2 加权均值与几何均值换个公式结论更稳普通均值假设每个观测值的权重相同但在业务报表里常见的场景是各层级的数量不一样比如计算全站平均客单价时不同品类订单量差异巨大直接用均值会被大品类带偏。加权均值公式为加权均值x̄_w Σ(wi × xi) / Σwi几何均值则用于计算平均增长率或平均收益率。假设某业务连续四个月的增长率为10%、20%、-15%、30%算术平均值是11.25%但实际复利效果需要用几何均值来算几何均值G (x1 × x2 × ... × xn)^(1/n)用numpy实现这两个公式很简单但需要注意w和x必须是相同的长度且权重不能包含负值否则结果没有业务上的解释意义。import numpy as np growth_rates np.array([1.10, 1.20, 0.85, 1.30]) geo_mean growth_rates.prod() ** (1 / len(growth_rates)) arithmetic_mean np.mean(growth_rates) print(f算术均值: {arithmetic_mean:.4f}) print(f几何均值: {geo_mean:.4f}) # 加权均值品类均价与销量权重 prices np.array([25.0, 60.0, 120.0]) weights np.array([1500, 800, 300]) weighted_mean np.sum(prices * weights) / np.sum(weights) print(f加权均值: {weighted_mean:.2f})growth_rates先转成“1 增长率”再连乘开根最后减1才是平均增长率。权重如果代表销量加权均值就是实际的“按销量加权的平均价格”。这里最容易犯的错误是直接用np.mean(growth_rates)当平均增长率在数据有正有负时会严重高估真实水平。2.3 偏度与峰度量化分布形态的两个数字报表里经常提到“这波数据偏了”偏在哪里偏度skewness衡量分布的非对称程度峰度kurtosis衡量分布的尾部厚度。两者的公式都基于三阶和四阶中心矩偏度 Skew [Σ(xi - x̄)³ / n] / s³ 峰度 Kurt [Σ(xi - x̄)⁴ / n] / s⁴ - 3峰度减3是让标准正态分布的峰度归零称为超额峰度。正的偏度表示右尾更长负的偏度表示左尾更长超额峰度大于0表示分布比正态更“尖”尾部更厚。from scipy.stats import skew, kurtosis data np.random.default_rng(42).gamma(2, size1000) sk skew(data) ku kurtosis(data, fisherTrue) print(f偏度: {sk:.3f}) print(f超额峰度: {ku:.3f})scipy的skew和kurtosis直接返回标准化后的无量纲值。scipy的kurtosis默认fisherTrue即返回超额峰度也就是已经减过3了如果fisherFalse则返回原始峰度。绘分布图之前先算这两个值能快速判断后续该用正态分布假设还是该做对数变换。3. 抽样分布与参数估计公式样本到总体的桥梁描述统计解决“这批数据长什么样”推断统计解决“样本背后那个总体是怎么样的”。统计学公式中抽样分布是衔接两者的关键从总体中反复抽样的统计量服从什么分布答案直接决定置信区间和检验的构造方式。3.1 标准误为什么是s除以根号n样本均值x̄的抽样分布其标准差称为标准误。公式是标准误SE(x̄) s / √n这里用的是样本标准差s而不是总体标准差σ。如果总体σ已知标准误可以精确写成σ/√n但绝大多数业务场景拿不到总体参数所以用s代替。标准误的含义是如果反复抽样x̄围绕总体均值μ的波动程度。SE越小说明样本均值越可靠这也是为什么增加样本量可以缩窄置信区间。标准差和标准误是两件事前者描述单次观测的离散程度后者描述样本均值的离散程度。很多人把误差线画成±1个标准差如果目的是展示均值的可信范围应该画±1个标准误。3.2 t分布、卡方分布与F分布的关键公式3.2.1 t分布小样本下替换正态分布当样本量小于30且总体标准差未知时样本均值的标准化统计量不再服从标准正态分布而是服从自由度为n-1的t分布。t统计量公式t (x̄ - μ) / (s / √n) 自由度 df n - 1t分布比正态分布有更厚的尾巴自由度越小尾部越厚随着df增大逐渐逼近标准正态。用scipy.stats.t的ppf方法可以查任意置信水平和自由度下的临界值。from scipy import stats alpha 0.05 n 10 t_crit stats.t.ppf(1 - alpha / 2, dfn-1) z_crit stats.norm.ppf(1 - alpha / 2) print(fn10的t临界值: {t_crit:.4f}) print(f正态分布z临界值: {z_crit:.4f})同一置信水平下t临界值比z临界值更大所以小样本的置信区间更宽这是更保守的做法避免样本少时做出过于自信的估计。3.2.2 卡方分布与F分布卡方分布在方差估计和独立性检验中出场。样本方差的抽样分布满足χ² (n - 1)s² / σ²自由度 df n - 1F分布用于比较两个总体的方差是否相等是两个卡方变量除以各自自由度后的比值F (s1²/σ1²) / (s2²/σ2²)自由度 (n1-1, n2-1)3.3 置信区间公式三种常见构造法置信区间的基本形态是“点估计 ± 临界值 × 标准误”。按不同的总体和已知条件公式有三种常见形式。估计对象条件置信区间公式总体均值μσ已知x̄ ± z_(α/2) × σ/√n总体均值μσ未知x̄ ± t_(α/2, n-1) × s/√n总体比例p大样本p̂ ± z_(α/2) × √(p̂(1-p̂)/n)写代码实现时关键是选对临界值和标准误的分母。下面用一个实际例子计算总体均值置信区间import numpy as np from scipy import stats sample np.array([5.2, 4.8, 5.5, 4.9, 5.1, 5.3, 4.7, 5.0]) n len(sample) x_bar np.mean(sample) s np.std(sample, ddof1) se s / np.sqrt(n) t_crit stats.t.ppf(0.975, dfn-1) lower x_bar - t_crit * se upper x_bar t_crit * se print(f均值: {x_bar:.2f}, 标准误: {se:.4f}) print(f95%置信区间: [{lower:.3f}, {upper:.3f}])ppf(0.975)是因为95%置信区间在双侧各留2.5%的概率对应0.025和0.975两个分位点。由于t分布对称只用一个上分位点即可。标准误的计算固定用s除以根号n如果用的是样本方差记得先开根号再除。注意置信区间说的是“重复抽样中95%的区间会包含总体参数”不是“总体参数有95%概率落在区间内”。这两种表述在频率派框架下不等价。4. 假设检验公式检验统计量、临界值与p值的协同假设检验的核心套路是先构造一个在原假设成立的条件下分布已知的统计量再把这个统计量与被抽样的数据算出来的值进行比较。公式层面的关键就是统计量怎么构造、自由度怎么取、p值怎么算。4.1 单样本t检验公式与代码实现单样本t检验用来检验样本均值是否等于某个给定值μ0。统计量公式t (x̄ - μ0) / (s / √n)自由度 df n - 1分子是“样本均值减去原假设的均值”分母是标准误。这个统计量的绝对值越大说明样本均值与原假设的差距相对抽样误差来说越明显。import numpy as np from scipy import stats page_time np.array([32, 28, 35, 40, 25, 30, 33, 29, 38, 31]) mu0 30 t_stat, p_value stats.ttest_1samp(page_time, mu0) print(ft统计量: {t_stat:.4f}) print(fp值: {p_value:.4f})ttest_1samp的第二个参数就是μ0返回值是t统计量和双尾p值。p值表示在原假设成立的条件下观察到这样或更极端数据的概率。p小于0.05通常拒绝原假设但要注意0.05是业务约定的阈值不是天然真理。如果事先设定α0.01同样的数据可能得出相反结论。4.2 独立t检验和配对t检验公式差在哪独立双样本t检验比较两组独立样本的均值。当两组方差不等时使用Welch修正不需要事先做方差齐性检验。统计量公式t (x̄1 - x̄2) / √(s1²/n1 s2²/n2) 自由度用Welch-Satterthwaite公式近似配对样本t检验则适用于“同一批对象测两次”的场景比如用户实验前和实验后的指标对比。公式直接对差值d做单样本t检验t d̄ / (sd / √n)其中di xi_after - xi_beforefrom scipy import stats group_ctrl np.random.default_rng(1).normal(50, 5, 30) group_exp np.random.default_rng(1).normal(53, 5, 30) t_ind, p_ind stats.ttest_ind(group_ctrl, group_exp, equal_varFalse) before np.random.default_rng(2).normal(50, 5, 30) after before np.random.default_rng(3).normal(2, 1, 30) t_rel, p_rel stats.ttest_rel(before, after)ttest_ind的equal_varFalse表示使用Welch修正不假定两组方差相等这是更稳健的默认选择。对于AB实验这种典型独立样本场景直接用它就行不必先跑Levene检验来决定是否修正。4.3 卡方检验公式观测频数与期望频数的距离卡方检验处理的是分类数据检验两个分类变量是否独立。统计量公式χ² Σ (Oij - Eij)² / Eij 其中Eij (行合计 × 列合计) / 总样本量O是观测频数E是在“行列独立”假设下的期望频数。每个格子的期望频数不能太小一般要求不能有超过20%的格子期望频数小于5否则检验结果不可靠。from scipy.stats import chi2_contingency # 列联表行变量是方案A/B列变量是转化/未转化 cont_table np.array([[120, 380], [150, 350]]) chi2_stat, p_val, dof, expected chi2_contingency(cont_table) print(fχ²统计量: {chi2_stat:.4f}) print(fp值: {p_val:.4f}) print(f自由度: {dof}) print(f期望频数:\n{expected})chi2_contingency返回的expected就是公式中的Eij矩阵。如果期望频数里有太多格子小于5需要考虑合并类别或者改用Fisher精确检验。自由度在列联表中等于(行数-1)×(列数-1)这个值会直接影响p值的计算。5. 回归分析公式最小二乘估计与拟合优度回归分析是统计学公式在业务中使用频率最高的一类从简单的销量预测到因果推断的初筛都离不开。核心是最小二乘法估计回归系数以及用判定系数判断拟合质量。5.1 一元线性回归的系数推导一元线性回归模型y α βx ε。最小二乘法选择使残差平方和最小的α和β。系数公式斜率 β̂ Σ(xi - x̄)(yi - ȳ) / Σ(xi - x̄)² 截距 α̂ ȳ - β̂x̄公式的本质是分子的协方差刻画x和y的线性关联方向分母刻画x自身的离散程度。用numpy的linalg.lstsq可以一步求解但需要先把x构造成包含截距列的设计矩阵。import numpy as np x np.array([1, 2, 3, 4, 5]) y np.array([2.1, 3.8, 6.1, 7.9, 10.2]) X_design np.column_stack([np.ones_like(x), x]) beta, residuals, rank, sv np.linalg.lstsq(X_design, y, rcondNone) print(f截距α̂: {beta[0]:.4f}) print(f斜率β̂: {beta[1]:.4f})X_design第一列全为1对应截距项第二列是x的原始值。lstsq返回四个值beta是系数向量residuals是残差平方和rank是设计矩阵的秩sv是奇异值数组。如果特征有多个把额外的特征列追加到X_design右侧即可公式本身不需要结构变化。5.2 判定系数R²与调整R²R²衡量回归模型解释了多少比例的总变差。公式R² SSR / SST 1 - SSE / SST SST Σ(yi - ȳ)² —— 总离差平方和 SSE Σ(yi - ŷi)² —— 残差平方和 SSR Σ(ŷi - ȳ)² —— 回归平方和R²等于1表示完美拟合等于0表示模型不优于直接用均值预测。随着自变量个数增加R²只会上升不会下降所以需要调整R²来惩罚无效变量。调整R²公式adjR² 1 - (1 - R²)(n - 1) / (n - k - 1)k是自变量个数。当新增变量对模型的解释力贡献很小时调整R²会下降它是判断变量取舍的重要参考。y_pred X_design beta ss_res np.sum((y - y_pred) ** 2) ss_tot np.sum((y - np.mean(y)) ** 2) r_squared 1 - ss_res / ss_tot n len(y) k 1 adj_r_squared 1 - (1 - r_squared) * (n - 1) / (n - k - 1) print(fR²: {r_squared:.4f}) print(f调整R²: {adj_r_squared:.4f})公式里是矩阵乘法等价于np.dot。ss_res和ss_tot都可以手动计算不依赖额外库。调整R²的分母(n-k-1)体现了自由度惩罚变量越多分母越小惩罚越重。5.3 回归系数的显著性检验回归系数的t检验公式与前面假设检验里的t统计量一致区别在于标准误的估计方式。对斜率β̂t β̂ / SE(β̂)自由度 df n - 2n减2是因为一元回归要估计两个参数α和β。如果p值大于0.05说明在当前数据下无法证明该自变量与因变量存在显著线性关系。from scipy import stats n len(x) beta_slope beta[1] y_pred X_design beta delta y - y_pred sigma_sq np.sum(delta ** 2) / (n - 2) std_err_slope np.sqrt(sigma_sq / np.sum((x - np.mean(x)) ** 2)) t_stat_slope beta_slope / std_err_slope p_val_slope 2 * (1 - stats.t.cdf(abs(t_stat_slope), dfn-2)) print(f斜率的t统计量: {t_stat_slope:.4f}) print(f斜率p值: {p_val_slope:.4f})手动计算标准误时sigma_sq用的是残差方差分母是n-2而非n这一步是公式系数检验与描述统计方差最大口径差异。p值用2乘以单尾概率是因为这里做的是双尾检验。6. 把统计学公式嵌进日常分析工作流很多工程师不是不会用公式而是用错公式之后很难察觉。比如同一个显著性检验Excel里的T.TEST默认假设方差相等和Python里ttest_ind的默认行为不一致再比如计算标准差时pandas的std默认ddof1而numpy的var默认ddof0。这些默认值差异最容易在团队协作中引发回归性问题。一个小技巧是在自己常用的分析工具里封装统一的统计口径函数把方差的口径、置信水平、检验类型都固定在参数里。下面这个函数可以复用import numpy as np from scipy import stats def conf_interval(data, confidence0.95): n len(data) x_bar np.mean(data) se np.std(data, ddof1) / np.sqrt(n) t_crit stats.t.ppf(1 - (1 - confidence) / 2, dfn-1) return x_bar - t_crit * se, x_bar t_crit * se # 使用示例 sample np.array([12.3, 12.1, 13.0, 11.9, 12.5, 12.8]) print(conf_interval(sample))函数内部固定了三个细节标准差用ddof1、置信区间用t分布临界值、参数confidence默认0.95。把这些决定封装在函数里团队成员使用时不用每次回忆公式。判断AB实验是否显著时先看p值再看置信区间的下限是否跨过业务意义上的最小收益值两者结合而不是只看p值一个数。提示p值小于0.05只代表“统计显著”不代表“实际显著”。样本量大时很小的差异也会p值极低这时候要回到置信区间看业务实际效果。本文还有配套的精品资源点击获取
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门