我做数据分析这些年,和卡方分布打过无数次交道。列联表里判断两个分类变量有没有关系,用卡方;检验一组样本符不符合某个理论分布,用卡方;做拟合优度检验,顺手看模型是否合理,还是卡方。它几乎是所有分类数据分析的起点。但说实话,很长时间里,我对卡方分布的印象就停留在“一组临界值”上,直到我把它的历史翻了一遍,才发现这个分布背后藏着统计学从描述走向推断的完整线索。今天我想带你沿着这条线索走一遍卡方分布的前世今生——从测量误差中被无意发现的分布形态,到皮尔逊把它变成检验工具,再到费希尔和奈曼把它嵌入整套推断框架,最后落到日常数据分析里怎么用、用得对不对。
这篇文章适合三类人:一是正在学统计学、被公式和表格折磨的学生,弄懂这段演化史会让你对自由度、检验这些概念有完全不同的理解;二是天天和数据打交道的分析师,你能从这里找到处理卡方检验常见坑的直接经验;三是对统计思想史感兴趣的读者,这篇文章不需要太多数学基础,几个关键公式我尽量用大白话讲清楚。
1. 起源:测量误差逼出来的分布
1.1 赫尔默特:他不是统计学家,却发现了卡方
如果问卡方分布的发现者是谁,大多数人会答皮尔逊。实际上,皮尔逊是1900年把它变成检验工具的人,而分布本身要追溯到1875年前后。
当时德国大地测量学家赫尔默特(F. R. Helmert)在处理一个非常实际的问题:测量误差的平方和服从什么分布?
19世纪下半叶,大地测量、天文观测、弹道实验都需要处理大量带误差的观测数据。误差理论在这一时期已经相当成熟——高斯等人建立了最小二乘法和正态误差模型。但对于一个关键问题,过去没人认真追问:如果你对同一个量重复测量很多次,得到一组误差,那么这些误差的“平方和”到底是怎么分布的?
赫尔默特当时的目的是评估一组测量的可靠性。而平方和恰好是衡量离散程度最自然的量。既然单个误差被认为服从正态分布,那“误差平方和”就不是正态了——因为它永远不会是负数。赫尔默特的推导结果表明,把n个独立标准正态变量的平方加起来,得到的分布是一个向右偏斜、只取正值、形状由自由度决定的分布,其密度函数包含Γ函数。这个分布后来被命名为卡方分布(chi-squared distribution)。
这段历史有意思的地方在于,赫尔默特并不是统计学家,他是个搞测量的人。他做这个推导纯粹是“被实际问题逼出来的”。也正是因为这样,卡方分布最初没有立刻进入主流统计研究的视野,而是零零散散地出现在测量学文献里。后来统计学家在追溯时发现,类似的结果在某些误差分析的文章里也出现过,但赫尔默特的推导最完整、最清晰,所以通常把发现权记在他名下。
我每次想到这一段都觉得特别受触动:很多现在看起来高深的统计理论,最初都不是统计学家搞出来的。十二平均律是音乐理论家发现的,最小二乘法是数学家为天文观测发明的,卡方分布也是大地测量学的副产品。这也解释了为什么它最初会以“平方和”的形式出现——测量学里最关心的就是误差的累积和离散程度,而平方和是最自然的度量。
1.2 为什么是“平方和”:卡方分布的数学直觉
先把定义写清楚:如果Z1, Z2, …, Zk是k个相互独立的标准正态随机变量,那么它们的平方和 Q = ΣZi² 服从自由度为k的卡方分布,记作 Q ~ χ²(k)。
为什么“平方和”这么重要?因为几乎所有衡量变异性的指标,最终都会落到平方和上。方差是平方和除以自由度;最小二乘法里最小化的是残差平方和;连机器学习里的L2正则,本质也是在给参数的平方和加约束。可以说,只要统计模型中出现了“平方和”,卡方分布就会冒出来。
卡方分布的密度函数写出来是:
f(x) = x^(k/2 - 1) · e^(-x/2) / (2^(k/2) · Γ(k/2))
x > 0,其中Γ是伽马函数。第一次看到这个公式的人可能会被吓到,但记住三个直观特征就够了。
第一,它只在正半轴上有定义。原因很简单:平方和不可能为负。第二,它是右偏的,自由度为1时最偏,形状像一个倒过来的J字型;自由度越大,分布越对称,当k超过30时,看起来已经非常接近正态分布了。第三,它的均值为k,方差为2k。均值等于自由度,方差是均值的两倍,这个数字关系特别好记。
这里有一个很直观的记忆方式:自由度k就是平方和里“标准正态变量的个数”。如果你只取1个标准正态残差,它的平方服从χ²(1)——这个分布其实就是“标准正态的平方”那个分布的特殊情形。如果有5个独立的标准化残差,平方和就服从χ²(5)。
我经常用一个类比帮助学生理解:把标准正态分布理解为“随机噪声”,把卡方分布理解为“噪声的总能量”。单个噪声可能正可能负,但能量总是正的,而且能量值大多聚在较小的范围,少数情况会非常大——所以卡方分布天然右偏。这个类比虽然粗糙,但在理解卡方检验为什么对少数极端格子特别敏感时非常有用:因为一旦某个格子的偏差特别大,平方项会把它放大,卡方值会迅速飙升。
2. 皮尔逊登场:从“分布”到“检验工具”
2.1 1900年那篇奠定地位的论文
把卡方分布从“测量学公式”变成“统计学核心工具”的人,是英国生物统计学家卡尔·皮尔逊(Karl Pearson)。
皮尔逊当时正在研究生物学和进化论中的问题,经常要判断观测数据是否符合某种理论分布。比如他手里有一批动物形态测量数据,想知道这些数据是否符合正态分布,或者是否符合某个比例的假设。
在那个年代,判断“符合与否”全凭画图和直觉。皮尔逊觉得这太不严谨。1900年,他在《哲学杂志》上发表了一篇论文,题目大意是“关于一组相关变量偏离期望值是否可合理视为随机抽样结果的判定标准”。这个绕口的标题,本质上就是在说:给你一组观测频数,你怎么知道它们和理论频数的差异,是随机波动造成的,还是真有一方不靠谱?
他提出的统计量是这样构造的:对每个类别,计算(观测频数 - 期望频数)² / 期望频数,然后求和。设观测为O,期望为E,则
X² = Σ (O - E)² / E
这个统计量后来被称为皮尔逊卡方统计量。
为什么每一格要除以E?这是整个公式最精妙的地方。如果不除以E,不同量级的格子根本没法比较:期望值1000的格子偏差50看起来很小;期望值10的格子偏差50就非常离谱。除以E相当于把每个格子的偏差“标准化”,让所有格子站在同一个尺度上。E小的格子对卡方值的贡献天然被放大,这也让卡方检验对稀疏类别特别敏感——这一点后面在实际应用部分还要重点讲。
皮尔逊证明,当样本量足够大时,这个统计量近似服从卡方分布,所以可以直接拿它来检验“观测频数是否偏离理论频数”。这个结果的意义不是多了一个公式,而是开启了统计学的假设检验时代。在它之前,人们描述数据用的是图形和汇总统计量;在它之后,人们可以问“这个差异是否显著”,可以给出一个概率值来支撑结论。
今天任何一款统计软件,跑一个卡方检验只是几秒钟的事。但要知道,皮尔逊那个年代没有电脑,分布表是一格一格手算出来的。我们随手点的那个p值,背后是一代统计学家长年累月的计算和推导。
2.2 自由度的陷阱:皮尔逊自己也栽过跟头
关于卡方检验,最深的一个坑是对自由度的理解。皮尔逊本人一开始也掉进过这个坑里。
最初皮尔逊认为,如果把数据分成n个类别,卡方统计量的自由度就是n。但他很快发现,按照这个自由度查卡方分布表,结果常常和实际对不上。
问题出在哪里?关键在于观测频数和期望频数之间有一个必然的约束条件:所有类别的观测数加起来必须等于样本总量,所有类别的期望数加起来也必须等于样本总量。因为两边求和相等,所以扰动不是完全自由的——一旦前n-1个类别的偏差定下来,最后一个类别的偏差就被迫确定了。
换句话说,表面上你看到n个格子,实际能“自由变动”的只有n-1个格子的偏差。再加上如果你不是预先给出理论分布,而是从数据本身估计了参数(比如用样本均值去估计正态分布的期望、用样本标准差估计方差),自由度还要再减去估计的参数个数。所以正确的自由度通常是 n - 1 - r,其中r是估计的参数个数。
这个看起来简单的道理,皮尔逊和费希尔争论了很长时间。皮尔逊始终没有完全接受费希尔的推导,而费希尔用几何方法给出了一个极其漂亮的解释:n个标准化正态残差对应n维空间中的一个点,点到原点的距离平方(也就是平方和)就是卡方值;如果加上“残差总和为0”的约束,这个点就被限制在一个n-1维的超平面内,自由度自然变成n-1。
我第一次读这段历史的时候很有感触:哪怕是卡方检验的发明者,也会在自由度上犯错。这个小小的数字,是整个卡方分布最精密的关节所在。今天我们在软件里跑出一个卡方检验结果,自由度那一栏自动算好了,看起来轻轻松松,实际上当年为了让这个数字正确,统计学家们吵了好几年。后面第五部分我会专门讲自由度的实操错误,因为直到现在,很多分析报告里自由度仍然错得五花八门。
3. 费希尔与奈曼的接力:卡方分布融入推断体系
3.1 费希尔:自由度、F分布和方差分析
卡尔·皮尔逊之后,对卡方分布贡献最大的当属费希尔(R. A. Fisher)。
费希尔的贡献不仅仅是澄清了自由度,他还干了一件更重要的事:把卡方分布放进了整个统计推断体系的中心位置。
费希尔的研究发现,很多关键统计量的分布都可以用卡方分布来表达。最典型的是正态样本方差的分布。设X1, ..., Xn是来自正态总体N(μ, σ²)的独立样本,样本方差为S²,那么:
(n - 1)S² / σ² ~ χ²(n - 1)
这个结果极其有用,因为它直接给出了样本方差的概率属性,进而可以构造方差比检验:如果两个独立样本都来自正态总体,它们的方差之比经过自由度调整后服从F分布;而F分布正是两个独立卡方变量除以其各自自由度后的比值。
顺着这个家族谱系往下看,你会看到一条完整的链条:
- 标准正态变量的平方和 → 卡方分布
- 两个独立卡方变量各自除以自由度后的比值 → F分布
- 标准正态变量除以“独立卡方变量与自由度之比的开方” → t分布
换句话说,卡方分布就是这条链的起点。t检验、F检验、方差分析,它们的分布基础本质上都来源于正态变量平方和的分布性质。这也是为什么在回归分析中,回归平方和和残差平方和都服从卡方分布,它们的比值服从F分布;在t检验中,样本均值的分布(正态)和样本方差(经卡方分布刻画)组合在一起,得到t分布。
可以说,没有卡方分布,就没有现代意义上的回归显著性检验和方差分析。它不是统计工具箱里一个独立的零件,而是整个推断框架的地基之一。
费希尔还做了另一件容易被后人忽略的工作:他系统地计算并编制了卡方分布表,让当时的科研人员可以方便地拿卡方值对照临界水平做判断。今天我们知道,“查表”是一件稀松平常的事,但在费希尔那个年代,这些表是统计分析的基础设施。
3.2 奈曼-皮尔逊框架下的似然比检验
如果说皮尔逊和费希尔让卡方分布成为了“检验工具”,那么奈曼(Jerzy Neyman)和艾贡·皮尔逊(Egon S. Pearson,卡尔·皮尔逊的儿子)在20世纪三四十年代完成的假设检验理论,则让卡方分布变成了“模型选择的通用语言”。
他们提出了一套严谨的假设检验框架:原假设、备择假设、第一类错误、第二类错误、检验功效,所有这些概念最后都落在一个核心量上——似然比。
对于一个关于参数θ的原假设H0和备择假设H1,似然比统计量定义为:
Λ = max L(θ0) / max L(θ1)
也就是在原假设约束下的最大似然值,除以无约束条件下的最大似然值。直觉上,如果原假设是对的,这两个似然值应该很接近,Λ接近1;如果原假设与数据偏差很大,Λ会明显小于1。
现代统计计算中更常用的是对数似然比的变换:-2 log Λ。
关键结论在于:当样本量足够大且原假设成立时,-2 log Λ渐近服从卡方分布,自由度等于原假设中约束参数的个数——也就是无约束参数数目减去约束后的参数数目。
为什么这能成为“通用语言”?因为任何嵌套模型之间的比较,都可以写成似然比检验。线性回归里“加进一个变量是否有显著改善”,逻辑回归里“加入交互项是否值得”,因子分析里“增加潜变量是否正确”——这些问题最终都可以转化为“负两倍对数似然差是否服从卡方分布”的问题。很多模型的p值,包括似然比卡方、偏差(deviance)检验,本质上都在用这个结论。
有趣的是,奈曼-皮尔逊框架把卡方分布从“拟合优度专用”升级成了“一切统计模型的好友”。皮尔逊当年可能没想到,他提出的这个分布会在几十年后成为整个统计推断体系的通用标尺。
4. 现代应用:卡方分布在实际分析中怎么落地
4.1 最经典:拟合优度检验
先看最古老的用法,拟合优度检验。比如你怀疑一个骰子被做过手脚,投了600次,每个面出现的次数是105, 98, 104, 96, 110, 87。按公平骰子,每一面期望应该是100次。这时候就可以用皮尔逊卡方统计量:
X² = (105-100)²/100 + (98-100)²/100 + (104-100)²/100 + (96-100)²/100 + (110-100)²/100 + (87-100)²/100 = 0.25 + 0.04 + 0.16 + 0.16 + 1.00 + 1.69 = 3.30
自由度是6-1=5,因为这里期望频数没有从数据估计任何参数,只损失一个“总数固定”的约束。查χ²(5)分布,0.05水平下临界值大约是11.07。3.30远小于11.07,对应的p值大概在0.65左右。结论是:这组数据没有足够的证据说骰子不均匀。
这是拟合优度检验最朴素的用法,但有一个问题今天的数据分析师经常忽略:期望频数不能太小。经验法则是,一个格子的平均期望频数不低于5,或者至少80%的格子期望频数不低于5。如果某些格子的期望频数只有2或3,卡方近似就会失真,p值可能偏大也可能偏小,完全不可靠。标准做法是合并相邻类别,或者改用Fisher精确检验、似然比G²检验。
这里插一句:G²统计量,也叫似然比卡方,G² = 2Σ O·ln(O/E),和皮尔逊卡方在零假设下渐近服从同一个分布。两者在大样本下结果差不多,但在中间样本量时会有差异。实际工作里,如果两者结论不一致,通常意味着数据里有特别稀疏的格子需要处理。
4.2 最频繁:列联表独立性检验
现代数据分析里,卡方检验用得最多的场景是列联表独立性检验。
比如一家电商平台做活动,想知道不同年龄段的用户对“满减”和“闪购”两种活动形式的偏好是否有差异。收集数据后列出2×3的列联表,或者更一般地r×c列联表。独立性检验统计量和拟合优度检验长得一样:
X² = Σ (O - E)² / E
其中每个格子的期望频数用“行合计 × 列合计 ÷ 总样本量”计算。自由度是(r-1)(c-1)。
为什么是(r-1)(c-1)?还是约束条件的逻辑:一个r×c的表格,总共有rc个格子,但行合计有r个信息(其中r-1个独立),列合计有c个信息(c-1个独立),所以独立变动的格子数是rc - (r-1) - (c-1) - 1 = (r-1)(c-1)。再强调一次,这个“减一”和皮尔逊当年的困惑,道理完全一样。
实操中的建议是:在跑卡方检验的同时,一定要看一眼期望频数。如果超过20%的格子期望频数小于5,就考虑合并类别,或者用Fisher精确检验。很多统计软件会给出警告,但更常见的情况是,你苦思冥想为什么结果不显著,回头一查,原来是期望频数太低,卡方检验根本不适用。
在列联表分析里,还有一个容易忽略的好用的东西:标准化残差。把每个格子的残差除以期望频数的开方得到标准化残差,它近似服从正态分布,绝对值大于2的格子,就是导致卡方显著的主要贡献者。这个工具能帮你定位“到底哪个类别组合偏离了独立假设”,比只看一个总的p值有用得多。
4.3 被低估:方差区间估计与模型比较
卡方分布还有一个日常分析中容易被忽略的重用价值——方差的置信区间。
既然(n-1)S²/σ²服从χ²(n-1),那么可以直接写出σ²的置信区间:
((n-1)S² / χ²_{1-α/2}(n-1), (n-1)S² / χ²_{α/2}(n-1))
通俗地说,就是对方差估计值S²乘上由卡方分位数决定的上限和下限。在做质量控制和生理测量分析时这个特别实用,因为方差本身经常比均值更值得关注——机器加工零件的精度看方差,药物批次间的稳定性看方差,投资组合的风险也看方差。
另一个高价值应用是模型比较。在广义线性模型、生存分析、结构方程模型这些领域,嵌套模型之间的比较普遍使用“负两倍对数似然差”,检验统计量在大样本下服从卡方分布。这就是很多回归分析显著性检验的理论基础。也就是说,你在软件里看到的模型p值,很多都是这个原理在背后支撑。
如果往上追根溯源,这些用法全都来自同一个源头:正态变量平方和的分布。这大概是我觉得卡方分布最迷人的地方——它几十年没有改变过公式,却在不同年代、不同领域里一次次被赋予新身份。
5. 实操排坑:这些年我见过的卡方检验错误
5.1 自由度错得离谱
卡方检验的使用错误里,自由度错排第一。
常见错误有三类。第一类是把单元格数量直接当成自由度,忘了减1。第二类是在做列联表检验时算错了行列数,比如把3×4表格的自由度写成11(正确应该是6)。第三类是在做拟合优度检验时,理论参数是从数据估计出来的,却没把这几个参数从自由度里减掉。
举一个我真实遇到过的例子。有人检验一组数据是否服从正态分布,把数据分为10个区间,得到卡方统计量,直接拿χ²(9)去算p值(10个区间减1)。问题在于,他做检验时用样本均值估计了正态分布的μ,用样本标准差估计了σ,这两个都是估计出来的参数。正确的自由度应该是10 - 1 - 2 = 7。多给两个自由度,临界值变小了,检验变得更容易“不显著”,原本可能显著的差异就被掩盖了。
处理方式是:任何时候看到软件输出的卡方检验,自己心里都算一遍自由度。如果和输出不一致,一定要问清楚软件做了什么校正。
5.2 样本量两头吃:太小不准,太大太信
卡方检验要求大样本近似,但这个“大”是有讲究的。
样本量太小不行。期望频数低于5的格子太多时,卡方分布就不是一个足够的近似,p值会失真。这种情况业界通行做法是:能合并类别就合并,不能合并就上Fisher精确检验。
样本量太大也有问题,而且更隐蔽。当样本量达到几万甚至几十万时,卡方检验几乎必然显著——因为真实世界里的变量几乎没有完全独立的,任何微小的真实差异在超大样本下都会被探测出来。这时候如果只盯着p值,会得出“所有变量都有关”的荒谬结论。
我的建议是:大样本下做卡方检验,永远同时报告效应量。2×2表用phi系数,更大表格用Cramer's V = sqrt(χ² / (n · (min(r,c)-1)))。效应量能告诉你这个“相关”在实践上是否值得关心。p值回答“有没有证据”,效应量回答“影响有多大”,两者缺一不可。
5.3 Yates校正与Fisher精确检验:什么时候较真
关于2×2表,还有一个经典争论:到底要不要做Yates连续校正。
Yates校正的思路是,卡方统计量是离散分布的连续近似,大样本时没问题,但在自由度较小的2×2表上、期望频数比较小的时候会系统性地高估显著性,所以他在计算(O-E)²/E之前,先把每个格子的偏差向0方向收缩0.5,以降低这种系统性偏差。
但现代统计软件普遍倾向于不做校正,原因有二:一是校正会导致检验偏保守,把一些本来显著的差异变得不显著;二是Fisher精确检验在计算能力已经不成问题的今天,可以给出更可靠的精确p值。
我自己处理2×2表时的习惯是:期望频数有低于5的格子,直接看Fisher精确检验的结果;如果样本量足够大,Yates校正和不校正差异很小,用哪个都行。写论文的话,在方法部分明确说明用了哪种检验,免得审稿人问起来说不清。
还有一个很容易忽略的点:卡方检验只告诉你变量之间是否独立,不告诉你关联的方向和强度。它不像相关系数那样有正负号,也不像回归系数那样能给出“增减多少”的量化。所以,如果你要解释“为什么有关、是什么方向”,还需要结合百分比表、残差分析,或者干脆做一个更丰富的模型。一个卡方p值,支撑不了更深的结论。
最后分享一个我在项目里常用的简单检查清单,帮你快速避坑:
| 场景 | 常见错误 | 正确做法 |
|---|---|---|
| 单样本拟合优度,10个区间、估计2个参数 | 自由度=9 | 自由度=7 |
| 2×2列联表,期望频数有格子低于5 | 继续用普通卡方 | 用Fisher精确检验或合并类别 |
| 总体样本量超过5万 | 只看p值下结论 | 报告Cramer's V等效应量 |
| 嵌套模型比较 | 直接比较卡方值 | 用-2log似然差,自由度=参数差 |
这些年来我越来越有一个体会:统计工具用得最多的那几个,往往不是因为数学上多复杂,而是因为解决的问题太普遍。卡方分布从测量误差走进皮尔逊的检验,从费希尔的推断框架走到现代数据分析的日常操作,每一步都是被真实问题推着走的。所以我建议你以后再用卡方检验时,在软件输出之外多留一个心眼:先问自己一句“这个自由度是多少”,再问一句“我的样本量配不配得上这个检验”,最后问一句“即使显著了,它有多大影响”。这三句话我写在每个数据分析项目的开头,也送给看这篇文章的你。