试图弄清楚如何使用statsmodel
计算Tukey的HSD。我可以使它工作,结果看起来不错,但是有一些我看不到的方法差异的图解。一定是我在做傻事。
这是对象plot_simultaneous
中的TukeyHSDResults
方法(请参阅doc)。
这是我用来尝试的代码:
import pandas as pd
import numpy as np
from sklearn.cross_validation import train_test_split
from scipy import stats
from statsmodels.stats.multicomp import (pairwise_tukeyhsd,
MultiComparison)
red_wine = pd.DataFrame.from_csv(".../winequality-red.csv",
sep=';', header=0, index_col=False)
white_wine = pd.DataFrame.from_csv(".../winequality-white.csv",
sep=';', header=0, index_col=False)
white1, white2 = train_test_split(white_wine['quality'], test_size=0.5, random_state=1812)
# compute anova
f, p = stats.f_oneway(red_wine['quality'], white1, white2)
print("F value: " + str(f))
print("p value: " + str(p))
# tukey HSD
red = pd.DataFrame(red_wine['quality'], columns=['quality'])
red['wine'] = map(lambda x: 'red', red['quality'])
w1 = pd.DataFrame(white1, columns=['quality'])
w1['wine'] = map(lambda x: 'white1', w1['quality'])
w2 = pd.DataFrame(white2, columns=['quality'])
w2['wine'] = map(lambda x: 'white2', w2['quality'])
total = pd.concat([red, w1, w2], axis=0)
res = pairwise_tukeyhsd(endog=total['quality'], groups=total['wine'], alpha=0.01)
print(res.summary())
res.plot_simultaneous()
mod = MultiComparison(total['quality'], total['wine'])
results = mod.tukeyhsd(0.01)
## plot does not work!
results.plot_simultaneous()
csv文件是公共(public)数据集,可以从here获得。代码的一点解释:我将白葡萄酒随机分配,以便我知道这两个样本来自相同的种群,而红色样本的第三个样本则来自不同的种群。只需简单的设置即可尝试使用该库。
我已经尝试过使用
pydev
和以防万一ipython notebook
。在pydev
中,我保持沉默,没有图表,在notebook
中,我得到以下简洁输出:In [3]: results.plot_simultaneous('red')
Out[3]: <matplotlib.figure.Figure at 0x1105b2b90>
没有太多的python/pandas经验,但是如果我坚持足够长的时间,我通常确实可以看到这些图。
我还尝试了文档中的示例(上面的链接):
In [3]:
cylinders = np.array([8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 4, 8, 8, 8, 8, 8, 8, 8, 8, 8, 4, 6, 6, 6, 4, 4,
4, 4, 4, 4, 6, 8, 8, 8, 8, 4, 4, 4, 4, 8, 8, 8, 8, 6, 6, 6, 6, 4, 4, 4, 4, 6, 6,
6, 6, 4, 4, 4, 4, 4, 8, 4, 6, 6, 8, 8, 8, 8, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
4, 4, 4, 4, 4, 4, 4, 6, 6, 4, 6, 4, 4, 4, 4, 4, 4, 4, 4])
cyl_labels = np.array(['USA', 'USA', 'USA', 'USA', 'USA', 'USA', 'USA', 'USA', 'USA', 'USA', 'France',
'USA', 'USA', 'USA', 'USA', 'USA', 'USA', 'USA', 'USA', 'USA', 'Japan', 'USA', 'USA', 'USA', 'Japan',
'Germany', 'France', 'Germany', 'Sweden', 'Germany', 'USA', 'USA', 'USA', 'USA', 'USA', 'Germany',
'USA', 'USA', 'France', 'USA', 'USA', 'USA', 'USA', 'USA', 'USA', 'USA', 'USA', 'USA', 'USA', 'Germany',
'Japan', 'USA', 'USA', 'USA', 'USA', 'Germany', 'Japan', 'Japan', 'USA', 'Sweden', 'USA', 'France',
'Japan', 'Germany', 'USA', 'USA', 'USA', 'USA', 'USA', 'USA', 'USA', 'USA', 'USA', 'USA', 'USA', 'USA',
'Germany', 'Japan', 'Japan', 'USA', 'USA', 'Japan', 'Japan', 'Japan', 'Japan', 'Japan', 'Japan', 'USA',
'USA', 'USA', 'USA', 'Japan', 'USA', 'USA', 'USA', 'Germany', 'USA', 'USA', 'USA'])
from statsmodels.stats.multicomp import MultiComparison
cardata = MultiComparison(cylinders, cyl_labels)
results = cardata.tukeyhsd()
results.plot_simultaneous()
Out[3]:
<matplotlib.figure.Figure at 0x10b5bb610>
结果相同。
最佳答案
您可能需要告诉matplotlib
使用哪个后端。
在ipython notebook中,尝试在导入%matplotlib inline
之前添加一 strip 有matplotlib
的行。
在笔记本之外运行的模块中,尝试添加:
import matplotlib
matplotlib.use('qtagg')
有关后端的更多信息,请参见here。
关于python statsmodel : tukey HSD plot not working,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29368634/