白话“卡方检验”

什么是卡方检验

卡方检验是假设检验的一种,用于分析两个类别变量的相关关系,是一种非参数假设检验,得出的结论无非就是相关或者不相关,因此有的教材上又叫“独立性检验”,因此若是不是很清楚假设检验的朋友们,要好好复习一下假设检验了。提起假设检验,会扯出一堆东西,这里我简单为你们梳理一下。python

什么是“类别变量”?

类别变量就是取值为离散值的变量,“性别”就是一个类别变量,它的取值只有“男”和“女”,相似还有”婚否“、”国籍“等。面试

什么是“分析两个类别变量的相关关系”

卡方检验用于分析两个类别变量的相关关系,这是什么意思呢?以咱们熟知的 Kaggle 平台上的泰坦尼克号幸存者预测提供的数据为例,”性别“对于”是否幸存“的关系研究,就属于这方面的内容。研究代表,泰坦尼克号上的乘客秉承”女士优先,照顾弱势群体“的基本原则,所以女性幸存的几率比男性要大,这就说明,”性别“对于”是否幸存“有相关关系,咱们后面会使用卡方检验来验证这一事实。app

假设检验

假设检验,顾名思义,就是提出一个假设,而后检验你提出的假设是否正确。假设检验的流程实际上是固定的,关键其实在于理解假设检验的设计原则。函数

什么是假设?

那么咱们假设什么呢?这里就要引入“原假设”和“备择假设”的概念了,“原假设”是“备择假设”的对立面。下面这个原则很重要:测试

备择假设一般是研究者想收集证据予以支持的假设。原假设是研究者想收集证据予以推翻的假设。spa

重要的事情,我再写两遍:若是你想经过种种论证,证实一件事情,就要把这件事情写成“备择假设”。备择假设一般用于表达研究者本身倾向于支持的见解(这很主观),而后就是想办法收集证据拒绝原假设,以支持备择假设设计

特别要说明的一点是:若是你不遵照这个“原假设”和“备择假设”设计的基本原则,你极可能会获得相反的结论。code

假设检验很像司法界对于一个事实的认定,本着“疑罪从无”的原则,若是你要说明一我的有罪,你必须提供充足的证据,不然被告人的罪名就不能成立,这个说法叫“没有充分的证据证实被告有罪”。blog

所以,若是咱们最后的结论是“原假设”成立,咱们通常不这么说,即咱们不说“原假设”成立,咱们不说“原假设”是真的。咱们说不能拒绝“原假设”,或者说没有充分的证据拒绝“原假设”,或者说没有充分的证据证实“备择假设”成立教程

卡方检验的“原假设”与“备择假设”

由于咱们作假设检验必定是以为两个类别变量有关系,才去作检验。再想一想那个“疑罪从无”原则,咱们是以为一我的有罪,才去举证。所以卡方检验的“原假设”必定是假设独立,“备择假设”必定是假设相关,即:

原假设:类别变量 \(A\) 与类别变量 \(B\) 独立
备择假设:类别变量 \(A\) 与类别变量 \(B\) 不独立

这一点应该是极其明确的,咱们的统计软件中都是这样设定的。

如何检验?

作“检验”这件事情,就很像咱们之前作的“反证法”,咱们假定要证实的结论的对立面成立,而后推出矛盾,即说明了咱们的假设是错误的,即原命题成立。请看下面这个例子:

请你证实:这个餐厅的菜很难吃。
证实:假设这个餐厅的菜很好吃,那么周末的晚上生意必定很好,然而实际观察下来,顾客流量和平时同样,推出矛盾,因此假设不成立,即这个餐厅的菜很难吃。

用假设检验的思路,在这个例子中:

原假设:这个餐厅的菜很好吃;
备择假设:这个餐厅的菜很难吃。

咱们把倾向于要证实的结论设置为“备择假设”,而推理是基于“原假设”成立进行的,推理得出矛盾,说明“原假设”错误,从错误的起点推出了错误的结论,所以“原假设”不成立,这就是假设检验里面说的“拒绝原假设”。

所以,检验其实很简单,就是一个是非论证的过程,是单选题,只有两个选项,选择其一。

假设检验如何论证

假设检验的论证实际上是固定的,就是基于“小几率事件在一次试验中几乎不可能发生”,一般,咱们获得的矛盾就在于:

经过计算统计量,发现经过一次试验获得这个统计量是一个“小几率事件”,“小几率事件”在一次试验中,竟然发生了,咱们就认为这是很“诡异”的,必定是以前的某个环节出了问题,即“原假设”不成立,因而拒绝“原假设”,即证实了“备择假设”成立。

为何叫“卡方检验”,何为“卡方检验”?

“卡方分布”(也写做 “\(\chi^2 分布\)”)是统计学领域的三大分布之一,另外两个分布是“\(t\) 分布”与“\(F\) 分布”,这些分布都是由正态分布推导出来的,能够认为它们是咱们熟知的分布,由于它们能够取哪些值,以及取这些值的几率都是彻底弄清楚了的。

统计学的研究任务是经过样本研究整体,由于咱们没法把全部的整体都作一次测试,通常可行的作法就是从整体中抽取一部分数据,根据对这一部分数据的研究,推测整体的一些性质。

而“三大分布”就是咱们研究样本的时候选取的参照物。通常咱们研究的思路是这样的:若是通过分析,得出待研究的样本符合这些咱们已知的分布之一,由于三大分布是被咱们的统计学家彻底研究透了的,能够认为是无比正确的,就能够经过查表获得这些分布的信息,进而获得样本的一些性质,帮助咱们决策。

这里举一个例子,好比你是一个面试官,你手上掌握着“北京”、“上海”、“广州”三个省市的人才信息库(至关于上面咱们说的统计学的三大分布),来了一个面试者,从简历中得知这我的来自“北京”,那么咱们就能够直接从“北京”市的人才信息库中查阅到他的详细履历,掌握到他更全面的信息。

作假设检验的时候,咱们也是相似的思路,咱们须要利用整体的样本构造出合适的统计量(或枢轴量),并使其服从或近似地服从已知的肯定分布,这样咱们就能够查阅这些肯定分布的相关信息,获得待研究样本所反映出来的整体的一些性质。

上面说到了“统计量”和“枢轴量”,下面简单谈一谈。

统计量:不含整体分布未知参数的函数称为样本的统计量。

统计量常常做为一个样本的表明,例如平均数、众数、最大值、最小值,统计量由多个数映射成一个数。

枢轴量:仅含有一个未知参数,而且分布已知的样本的函数,称为枢轴量。

枢轴量的思想其实就是解方程,或者说解不等式,这一部分很是重要的理论基础是“抽样分布定理”。若是忘记了的朋友们必定要翻翻之前的教程,“抽样分布定理”是很是重要的。根据抽样分布定理,咱们常常是这样用的:样本的某个含有未知参数的函数符合某个已知分布,已知分布能够查表,所以未知参数的性质就知道了。求“置信区间”与作“假设检验”一般就是这样的思路。

卡方检验的统计量

\[ \chi^2=\sum\sum \frac{(f_o-f_e)^2}{f_e} \]

说明:\(f_o\) 是观测频数(实际值),\(f_e\) 是指望频数(能够认为是理论值),指望频数的计算公式咱们立刻会介绍到。这个统计量服从自由度为 \((r-1)(c-1)\)\(\chi^2\) 分布,\(r\) 为行数,\(c\) 为列数。

这里必定要举例才能说清楚了:

如下内容摘抄自中国人民大学龙永红主编《几率论与数理统计》(第三版)P190 “独立性检验”一节例 5.32。

研究青少年行为与家庭情况的关系,调查结果以下:

青少年行为\家庭情况 离异家庭 和气家庭 合计
犯罪 \(178\) \(272\) \(450\)
未犯罪 \(38\) \(502\) \(540\)
合计 \(216\) \(774\) \(990\)

分析:“青少年行为”是离散型变量,有“犯罪”与“未犯罪”两个取值;“家庭情况”是也离散型变量,有“离异家庭”与“和气家庭”两个取值,从直觉上,咱们认为它们是相关的。所以

第 1 步:创建统计假设。

原假设:“青少年行为”与“家庭情况”独立。
备择假设:“青少年行为”与“家庭情况”不独立。

第 2 步:计算指望频数与检验统计量。

要计算出检验统计量,关键是计算出指望频数。咱们以前说到了,假设检验是基于原假设进行论证,所以,咱们的指望频数应该是基于【“青少年行为”与“家庭情况”独立】获得的。所以有:

两个类别的交叉项的几率能够根据独立事件的几率乘法公式获得。具体是这样作的,从上面那张表中:

  • 一行一行看,这 \(990\) 个青少年里,\(P(犯罪)=\cfrac{450}{990}\)\(P(未犯罪)=\cfrac{540}{990}\)
  • 一列一列看,这 \(990\) 个青少年里,\(P(离异家庭)=\cfrac{216}{990}\)\(P(和气家庭)=\cfrac{774}{990}\)

在【“青少年行为”与“家庭情况”独立】这个假设下有:

\[ P(“犯罪”而且“离异家庭”) = P(犯罪) \times P(离异家庭) = \cfrac{450}{990} \times \cfrac{216}{990} \]

\[ P(“犯罪”而且“和气家庭”) = P(犯罪) \times P(和气家庭) = \cfrac{450}{990} \times \cfrac{774}{990} \]

\[ P(“未犯罪”而且“离异家庭”) = P(犯罪) \times P(离异家庭) = \cfrac{540}{990} \times \cfrac{216}{990} \]

\[ P(“未犯罪”而且“离异家庭”) = P(犯罪) \times P(离异家庭) = \cfrac{540}{990} \times \cfrac{774}{990} \]

咱们要计算指望频数,就把上面这 \(4\) 个几率分别乘以样本总数 \(990\) 就能够了:

青少年行为\家庭情况 离异家庭 和气家庭
犯罪 \(450\times \frac{216}{990} \approx 98.18\) \(450 \times \frac{774}{990} \approx 351.82\)
未犯罪 \(540 \times \frac{216}{990} \approx 117.82\) \(540 \times \frac{774}{990} \approx 422.18\)

下面将每一个单元格的 \(\frac{(f_o-f_e)^2}{f_e}\) 加起来,就能够获得 \(\chi^2\) 统计量:

\[ \begin{aligned} \chi^2 &= \cfrac{(178-98.18)^2}{98.18} + \cfrac{(272-351.82)^2}{351.82} + \cfrac{(38-117.82)^2}{117.82} + \cfrac{(502-422.18)^2}{422.18} \\ & \approx 64.89 + 18.11 + 54.06 + 15.09 \\ & \approx 152.15 \end{aligned} \]

上面说服从自由度为 \((r-1)(c-1)\)\(\chi^2\) 分布,\(r\) 为行数,\(c\) 为列数,即服从 \((2-1)\times (2-1) = 1\)\(\chi^2\) 分布,接下来,咱们就要看获得这个统计量的几率有多大:

from scipy import stats
import seaborn as sns
import matplotlib.pyplot as plt


samples = stats.chi2.rvs(size=10000, df=1)
sns.distplot(samples)
plt.title('$\chi^2$,df=1')
plt.show()

获得图像以下:

Figure_1.png

能够看到,\(152.15\) 都不在能图像显示到的范围以内,说明这个几率很低。下面咱们或者使用 Python 查一下,这个几率是多少:

from scipy import stats


stats.chi2.pdf(152.15, df=1)

获得:\(2.956796099836173e-35\),确实是一个几乎为 \(0\) 的数。这说明了什么呢?

说明了,在咱们的假设【“青少年行为”与“家庭情况”独立】下,获得这组观测数据的几率很低很低,基于小几率事件在一次试验中几乎不会发生,但它却发生了,就证实了咱们的“原假设”是不正确的,即有充分证据决绝“原假设”。(这一部分有点绕,其实很简单,多看几遍就很是清楚了。)

其实到这里,咱们对卡方检验就已经介绍完了,是否是以为很简单。可是在实际操做的过程当中,咱们还会引入 \(p\) 值,不少统计软件也会帮咱们计算出 \(p\) 值,这个 \(p\) 值是个什么鬼呢?下面先给出个人结论:

什么是 \(p\) 值?

\(p\) 值统一了假设检验的比较标准,把计算统计量的几率大小统一变成计算 \(p\) 值,若是这个 \(p\) 值小于一个预先设定好的数,咱们称之为“显著性水平”,用 \(\alpha\) 表示,通常取 \(\alpha = 0.05\),则拒绝原假设,若是 \(p\) 值大于“显著性水平”,则说明没有充分证据拒绝原假设。使用 \(p\) 值进行假设检验的时候,会更便利。所以,使用 \(p\) 值进行假设检验的评判标准就只要一个,就是记住这句话“小拒大接”,即比 \(0.05\) 小,就拒绝“原假设”,比 \(0.05\) 大,结论是“没有理由拒绝原假设”。

特别说明:这个结论是我根据对 \(p\) 值的理解本身总结的,是人话,但不必定准确。

\(p\) 值在不一样的检验问题中,计算方法会不一样,在这里,咱们就以卡方检验为例,若是咱们计算出来的统计量的值为 \(1\),那么看图:

Figure_1.png

这个时候,统计量取 \(1\) 的几率就很高了,从图中能够看出大于 \(0.2\)。咱们做以下分析:

  • \(\chi^2\) 分布长尾在右边,是个右偏分布,在 \(0\) 附近的几率是很是高的,咱们要找一个临界值,若是统计量取到这个临界值,以及这个临界值的右边,咱们认为这样的事情发生的几率是很低的,这里就要借助累计几率和分位点的概念;

(说明:累计积分和分位点的概念都是十分重要的,在这里就不赘述了,读者能够查阅相关统计学的教材。)

  • 咱们认为,在 \(\chi^2\) 分布,若是一个点到右边无穷的累计积分小于“显著性水平”,咱们就认为这个点以及右边全部的点的取值,都是小几率事件。

因而,对于卡方检验而言,获得的统计量,咱们能够计算这个从统计量到正无穷的积分,若是这个积分值小于“显著性水平”,即认为这个统计量的几率必定在“显著性水平”所肯定的临界点的右边,即它是比“小几率事件”发生的几率还小的“小几率事件”

下面,咱们本身写一个函数来实现卡方检验相关的计算,实现和 scipy 软件包提供的卡方检验一样的效果。

from scipy import stats
from scipy.stats import chi2_contingency


def custom_chi2_contingency(observed):
    """
    本身编写的卡方检验的函数,返回
    """
    # 每一行求和
    row = observed.sum(axis=1)
    # 每一列求和
    col = observed.sum(axis=0)
    # 总数求和
    all_sum = observed.sum()

    # meshgrid 生成网格
    x1, x2 = np.meshgrid(col, row)
    # 指望频数
    expected_count = x1 * x2 / all_sum
    # 统计量,即卡方值
    chi2 = ((observed - expected_count)**2 / expected_count).sum()
    # 自由度
    df = (len(row) - 1) * (len(col) - 1)
    # 计算 p 值,这里用到了卡方分布的几率积累函数,
    # 由于这个 cdf 是计算从左边到这点的累计积分,所以用 1 减它
    p = 1 - stats.chi2.cdf(chi2, df=df)
    return chi2, p, df, expected_count

下面验证自定义函数的正确性:

obs = np.array([[178, 272], [38, 502]])
result1 = custom_chi2_contingency(obs)
result2 = chi2_contingency(obs)
print('自定义卡方检验的函数返回:')
print(result1)
print()
print('scipy 提供的卡方检验返回:')
print(result2)

显示:

自定义卡方检验的函数返回:
(152.16271892047084, 0.0, 1, array([[ 98.18181818, 351.81818182],
       [117.81818182, 422.18181818]]))

scipy 提供的卡方检验返回:
(150.2623232486362, 1.5192261812214016e-34, 1, array([[ 98.18181818, 351.81818182],
       [117.81818182, 422.18181818]]))
相关文章
相关标签/搜索