簡體   English   中英

ks_2samp 返回 p 值 1.0

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM