这里是 shasan 代码的缩短版,计算数组a 的均值的 95% 置信区间:
import numpy as np, scipy.stats as st
st.t.interval(0.95, len(a)-1, loc=np.mean(a), scale=st.sem(a))
但是使用 StatsModels 的tconfint_mean 可以说更好:
import statsmodels.stats.api as sms
sms.DescrStatsW(a).tconfint_mean()
两者的基本假设是样本(数组a)独立于具有未知标准偏差的正态分布(请参阅MathWorld 或Wikipedia)。
对于大样本量 n,样本均值呈正态分布,可以使用 st.norm.interval() 计算其置信区间(如 Jaime 的评论中所建议的那样)。但上述解决方案对于小 n 也是正确的,其中st.norm.interval() 给出的置信区间太窄(即“假置信”)。有关更多详细信息,请参阅我的answer 到类似问题(以及此处的 Russ 的 cmets 之一)。
这是一个示例,其中正确的选项给出(基本上)相同的置信区间:
In [9]: a = range(10,14)
In [10]: mean_confidence_interval(a)
Out[10]: (11.5, 9.4457397432391215, 13.554260256760879)
In [11]: st.t.interval(0.95, len(a)-1, loc=np.mean(a), scale=st.sem(a))
Out[11]: (9.4457397432391215, 13.554260256760879)
In [12]: sms.DescrStatsW(a).tconfint_mean()
Out[12]: (9.4457397432391197, 13.55426025676088)
最后,使用st.norm.interval() 的结果不正确:
In [13]: st.norm.interval(0.95, loc=np.mean(a), scale=st.sem(a))
Out[13]: (10.23484868811834, 12.76515131188166)