Python ks_2samp返回1.0的p值

Python ks_2samp返回1.0的p值,python,python-3.x,pandas,scipy,statistics,Python,Python 3.x,Pandas,Scipy,Statistics,我有两个pandaDataFramedata1和data2,两个DataFrame都有一个整数列h,填充了从1到50不等的不同值 data1的样本量约为55000,而data2的样本量约为8000。由于数据的大小,我无法上传准确的数据,但下面是我创建的data1['h']与data2['h']的直方图: (为了便于观察,我应用了matplotlib.yscale('log')) 为了比较分布,我使用了scipy.stats中的ks_2amp。我组成了一个双尾测试和两个单尾测试来观察优势的两个

我有两个
panda
DataFrame
data1
data2
,两个DataFrame都有一个整数列
h
,填充了从1到50不等的不同值

data1
的样本量约为55000,而
data2
的样本量约为8000。由于数据的大小,我无法上传准确的数据,但下面是我创建的
data1['h']
data2['h']
的直方图:

(为了便于观察,我应用了
matplotlib.yscale('log')

为了比较分布,我使用了
scipy.stats
中的
ks_2amp
。我组成了一个双尾测试和两个单尾测试来观察优势的两个方向:

# 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)
我以前在其他项目中练习过
ks2amp
,但看到如此模糊的p值对我来说是相当陌生的。特别是第二个结果,让我怀疑我是否执行了错误的测试,因为p值为1.0似乎非常荒谬

我已经研究了一些类似的问题,包括下面的StackOverflow问题(),但不幸的是,这个问题与目前报道的任何问题都不相同


我很想获得任何见解来解释这些结果或修正我的方法。

问题似乎不在于代码,而在于您的解释。我们可以看到data1向右移动,所以我构造了正态分布,绘制了它们的直方图,并运行了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检验拒绝了分布相等的零假设,并且它以高置信度(pvalue基本上为零)这样做。第二条告诉我们,我们不能拒绝样本1大于样本2的假设。从我们所知道的情况来看,这是显而易见的——样本1与样本2来自同一人群,但向右移动。第三种方法再次拒绝了无效假设,但这个h0表示样本1小于样本2。请注意,这里的pvalue是最小的-样本1小于样本2的可能性小于从等效分布中提取的可能性。这又是意料之中的事


还请注意,在本例中,这两种分布都是正态分布,并且非常相似。但是KS测试告诉你“人群可能在中位数、变异性或分布形状上有所不同”()。在这里,它们的中间值不同,但形状不同,这是可以检测到的。

我建议您使用标准化的y轴绘制第一个绘图,而不是像现在这样使用“计数”。如果您希望直观地比较分布,这将非常有帮助。由于data2的数据点大约少7倍,而且在我看来,直方图中的所有橙色“条”的高度大约少7倍,很可能这两个数据帧共享底层分布。