我正在尝试从Scipy软件包实现两样式的Kolmogorov-Smirnov测试,以测试两个样本的分布是否有差异。样品是在两个不同时期内销售的T恤尺寸(S,M,L,XL和XXL(。我想测试两个周期之间大小的分布是否有所不同。
我遇到的问题是,与使用原始数据相比,预先计算每个尺寸的总数时,我会得到非常不同的结果。我不明白这一点,因为百分比仍然代表相同的分布。
这是我使用过的代码(x和y是原始数据,x1和y1是计算的百分比(:
from scipy.stats import ks_2samp
x = (254, 526, 576, 622, 409)
y = (92, 214, 366, 365, 287)
x1 = (10.6, 21.9, 24.0, 25.9, 17.1)
y1 = (7.0, 16.2, 27.7, 27.7, 21.7)
print(ks_2samp(x, y))
print(ks_2samp(x1, y1))
这是我得到的两个不同结果:
ks_2sampresult(统计= 0.80000000000000004,PVALUE = 0.03614619076928504(KS_2SampResult(统计= 0.40000000000000002,PVALUE = 0.69740487802059081(
如果在两个样本上都应用了相同缩放,则测试在数据缩放下是不变的。通过将样品转换为百分比,您已将不同的尺度应用于两个样品。具体而言,您将第一个数据集乘以100/2387,同时将第二个数据集乘以100/1324。
。顺便说一句,我认为Kolmogorov-Smirnov(KS(测试不适合此数据。KS测试是来自连续分布的样品。我希望将您的数据建模为从离散分布中的样本中观察到的频率,其样品空间为{s,m,l,xl,xxl}。分析此类数据的一种常见工具是Contingency表的卡方测试,该测试在Scipy中以scipy.stats.chi2_contingency
:
In [110]: x
Out[110]: array([254, 526, 576, 622, 409])
In [111]: y
Out[111]: array([ 92, 214, 366, 365, 287])
In [112]: a = np.vstack((x, y))
In [113]: a
Out[113]:
array([[254, 526, 576, 622, 409],
[ 92, 214, 366, 365, 287]])
In [114]: from scipy.stats import chi2_contingency
In [115]: chi2, p, dof, expected = chi2_contingency(a)
In [116]: p
Out[116]: 2.1980217327784848e-08
请小心您如何解释这一点,因为"有足够的数据,一切都很重要"。