为什么scipy.ststs.contingency.expected_freq不返回预期的频率?

时间:2019-08-26 12:55:38

标签: python pandas scipy contingency

我有一个数据框,我想为其计算卡方和p值。但是,当我打印出期望值时,它们不是我期望的值。我期望代码要测试的零假设是Q7不依赖于“关注改善”,因此我希望每个Q7条目的减少,增加和不变的“预期频率”都是相同的

这是我观察到的数据框,称为LikelihoodConcern

ConcernImprovement  Decrease  Increase  No change
Q7                                               
Likely                   2.0      18.0       21.0
Not likely at all        0.0       2.0        1.0
Not very likely          3.0      11.0        5.0
Somewhat likely          4.0      24.0       14.0
Very likely              1.0      16.0        8.0

我尝试了以下代码:

from scipy.stats import chi2_contingency
chi2, p, dof, expected = chi2_contingency(LikelihoodConcern, correction=False)
expected

它以预期的频率返回此值:

array([[ 3.15384615, 22.39230769, 15.45384615],
       [ 0.23076923,  1.63846154,  1.13076923],
       [ 1.46153846, 10.37692308,  7.16153846],
       [ 3.23076923, 22.93846154, 15.83076923],
       [ 1.92307692, 13.65384615,  9.42307692]])

我希望它返回:

array([[ 13.67777777, 13.67777777, 13.67777777],
       [ 1.00000000,  1.00000000,  1.00000000],
       [ 6.33333333, 6.33333333,  6.33333333],
       [ 14.00000000, 14.00000000, 14.00000000],
       [ 8.33333333, 8.33333333,  8.33333333]])

我查看了expected_freq函数的源代码,因为该文档没有太多细节-但我仍然不明白为什么我没有明白我的期望

1 个答案:

答案 0 :(得分:0)

我在那里进行了测试,并使用了与您相同的输入数据:

array([[ 2., 18., 21.],
   [ 0.,  2.,  1.],
   [ 3., 11.,  5.],
   [ 4., 24., 14.],
   [ 1., 16.,  8.]])

,并获得与预期频率相同的结果。如果我们看第一个单元格(行“ Likely”,列“ Decrease”)。 “ Likely”的边际总和为42,“ Decrease”的边际总和为10。表的边际总和为130。因此,对于第一个单元格,我们的期望值为:

(10 * 41) / 130 = 3.1538461538461537

对于右下角的单元格(行“非常可能”,列“无变化”),我们有:

(49 * 25) / 130 = 9.423076923076923

等这些与stats.scipy的结果相符。