[英]ks_2samp returns p-value of 1.0
I have two pandas
DataFrame data1
and data2
, and both DataFrame have an integer column h
filled with different values varying from 1 to 50.
data1
的樣本大小約為 55000,而data2
的樣本大小約為 8000。由於它們的大小,我無法上傳確切的數據,但下面是我創建的data1['h']
與data2['h']
的直方圖data2['h']
:
(我應用matplotlib.yscale('log')
以便於觀察)
為了比較分布,我使用了ks_2samp
中的scipy.stats
。 我編寫了一個雙尾測試和兩個單尾測試來觀察優勢的兩個方向:
# h indices are significantly different
print(ks_2samp(data1['h'], data2['h']))
# data1 h indices are greater
print(ks_2samp(data1['h'], data2['h'], alternative='greater'))
# data2 h indices are greater
print(ks_2samp(data1['h'], data2['h'], alternative='less'))
結果如下:
Ks_2sampResult(statistic=0.1293719140156916, pvalue=3.448839769104661e-105)
Ks_2sampResult(statistic=0.0, pvalue=1.0)
Ks_2sampResult(statistic=0.1293719140156916, pvalue=1.5636837258561576e-105)
我之前在其他項目中練習ks_2samp
,但是看到如此晦澀的 p 值對我來說還是很新鮮的。 尤其是第二個結果,讓我懷疑我是否錯誤地執行了測試,因為 p 值為 1.0 似乎非常荒謬。
我研究了一些類似的問題,包括以下 StackOverflow 問題( scipy p-value returns 0.0 ),但不幸的是,這個問題與任何報告的問題都不相同。
我很想獲得任何見解來解釋這些結果或修正我的方法。
問題似乎不在於您的代碼,而在於您的解釋。 我們可以看到data1向右移動了,所以我構造了正態分布,plot他們的直方圖,運行ksmirnov檢驗,你得到的結果符合我們的預期。
設置:
from scipy.stats import ks_2samp
from numpy import random
import pandas as pd
from matplotlib import pyplot
random.seed(1)
n=4000
l1=[random.normal(1) for x in range(n)]
l2=[random.normal() for x in range(n)]
df=pd.DataFrame(list(zip(l1,l2)),columns=['1','2'])
測試:
print(ks_2samp(df['1'], df['2']))
print(ks_2samp(df['1'], df['2'], alternative='greater'))
print(ks_2samp(df['1'], df['2'], alternative='less'))
回報:
KstestResult(statistic=0.3965, pvalue=3.8418108959960396e-281)
KstestResult(statistic=0.0, pvalue=1.0)
KstestResult(statistic=0.3965, pvalue=1.9209054479980054e-281)
圖示:
bins=50
pyplot.hist(l1,bins, alpha=.5, label='Sample 1')
pyplot.hist(l2,bins, alpha=.5, label='Sample 2')
pyplot.legend()
pyplot.show
那么這里發生了什么?
第一個 KS 檢驗拒絕了 null 假設,即分布是等價的,並且它以高置信度做到這一點(p 值基本上為零)。 第二個告訴我們,我們不能拒絕樣本 1 大於樣本 2 的假設。從我們所知道的情況來看,這很明顯 - 樣本 1 是從與樣本 2 相同的總體中提取的,但向右移動。 第三個再次拒絕了 null 假設,但是這個 h0 是樣本 1 小於樣本 2。請注意,這里的 pvalue 是最小的 - 樣本 1 小於樣本 2 的可能性小於它們從等效項中提取的可能性分布。 這再次符合預期。
還要注意,在這個例子中,兩個分布都是正態分布並且非常相似。 但是 KS 測試告訴您“人口可能在中位數、變異性或分布形狀方面有所不同”( 參考)。 在這里,它們的中位數不同,但形狀不同,這被檢測到了。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.