今天主要给大家讲讲卡方分箱算法ChiMerge。先给大家介绍一下经常被提到的卡方分布和卡方检验是什么。
一、卡方分布
卡方分布(chi-square distribution, χ2-distribution)是概率统计里常用的一种概率分布,也是统计推断里应用最广泛的概率分布之一,在假设检验与置信区间的计算中经常能见到卡方分布的身影。
卡方分布的定义如下:
若k个独立的随机变量Z1, Z2,..., Zk 满足标准正态分布 N(0,1) , 则这k个随机变量的平方和:
为服从自由度为k的卡方分布,记作:
或者记作
。
二、卡方检验
χ2检验是以χ2分布为基础的一种假设检验方法,主要用于分类变量之间的独立性检验。
其基本思想是根据样本数据推断总体的分布与期望分布是否有显著性差异,或者推断两个分类变量是否相关或者独立。
一般可以设原假设为 :观察频数与期望频数没有差异,或者两个变量相互独立不相关。
实际应用中,我们先假设原假设成立,计算出卡方的值,卡方表示观察值与理论值间的偏离程度。
卡方值的计算公式为:
其中A为实际频数,E为期望频数。卡方值用于衡量实际值与理论值的差异程度,这也是卡方检验的核心思想。
卡方值包含了以下两个信息:
1.实际值与理论值偏差的绝对大小。 2.差异程度与理论值的相对大小。
上述计算的卡方值服从卡方分布。根据卡方分布,卡方统计量以及自由度,可以确定在原假设成立的情况下获得当前统计量以及更极端情况的概率p。如果p很小,说明观察值与理论值的偏离程度大,应该拒绝原假设。否则不能拒绝原假设。
三、卡方检验实例
某医院对某种病症的患者使用了A,B两种不同的疗法,结果如表1,问两种疗法有无差别?
表1 两种疗法治疗卵巢癌的疗效比较
组别
有效
无效
合计
有效率(%)
A组
19
24
43
44.2
B组
34
10
44
77.3
合计
53
34
87
60.9
可以计算出各格内的期望频数。
第1行1列: 43×53/87=26.2
第1行2列: 43×34/87=16.8
第2行1列: 44×53/87=26.8
第2行2列: 4×34/87=17.2
先建立原假设:A、B两种疗法没有区别。根据卡方值的计算公式,计算:
算得卡方值=10.01。
得到卡方值以后,接下来需要查询卡方分布表来判断p值,从而做出接受或拒绝原假设的决定。
首先我们明确自由度的概念:自由度k=(行数-1)*(列数-1)。 这里k=1.然后看卡方分布的临界概率表,我们可以用如下代码生成:
import numpy as np
from scipy.stats import chi2
import pandas as pd
# chi square distribution
percents = [ 0.95, 0.90, 0.5,0.1, 0.05, 0.025, 0.01, 0.005]
df =pd.DataFrame(np.array([chi2.isf(percents, df=i) for i in range(1, 30)]))
df.columns = percents
df.index =df.index+1
pd.set_option('precision', 3)
df
查表自由度为1,p=0.05的卡方值为3.841,而此例卡方值10.01>3.841,因此 p < 0.05,说明原假设在0.05的显著性水平下是可以拒绝的。也就是说,原假设不成立。
四、ChiMerge分箱算法
ChiMerge卡方分箱算法由Kerber于1992提出。
它主要包括两个阶段:初始化阶段和自底向上的合并阶段。
1.初始化阶段:
首先按照属性值的大小进行排序(对于非连续特征,需要先做数值转换,比如转为坏人率,然后排序),然后每个属性值单独作为一组。
2.合并阶段:
(1)对每一对相邻的组,计算卡方值。
(2)根据计算的卡方值,对其中最小的一对邻组合并为一组。
(3)不断重复(1),(2)直到计算出的卡方值都不低于事先设定的阈值,或者分组数达到一定的条件(如最小分组数5,最大分组数8)。
值得注意的是,小编之前发现有的实现方法在合并阶段,计算的并非相邻组的卡方值(只考虑在此两组内的样本,并计算期望频数),因为他们用整体样本来计算此相邻两组的期望频数。
下图是著名的鸢尾花数据集sepal-length属性值的分组及相邻组的卡方值。最左侧是属性值,中间3列是class的频数,最右是卡方值。这个分箱是以卡方阈值1.4的结果。可以看出,最小的组为[6.7,7.0),它的卡方值是1.5。
如果进一步提高阈值,如设置为4.6,那么以上分箱还将继续合并,最终的分箱如下图:
卡方分箱除了用阈值来做约束条件,还可以进一步的加入分箱数约束,以及最小箱占比,坏人率约束等。