正規分布を仮定して、信頼区間を計算したいサンプルデータがあります。
Numpyパッケージとscipyパッケージを見つけてインストールし、平均値と標準偏差を返すようにnumpyを取得しました(データがリストであるnumpy.mean(data))。サンプルの信頼区間の取得に関するアドバイスをいただければ幸いです。
import numpy as np
import scipy.stats
def mean_confidence_interval(data, confidence=0.95):
a = 1.0 * np.array(data)
n = len(a)
m, se = np.mean(a), scipy.stats.sem(a)
h = se * scipy.stats.t.ppf((1 + confidence) / 2., n-1)
return m, m-h, m+h
このように計算できます。
ここで、配列a
の平均の95%信頼区間を計算するshasanのコードの短縮版:
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のコメントの1つ)。
正しいオプションが(本質的に)同一の信頼区間を与える例:
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)
ルックアップテーブル から目的の信頼区間の z-value を検索することから始めます。信頼区間はmean +/- z*sigma
です。ここで、sigma
はsigma = s / sqrt(n)
で与えられるサンプル平均の推定標準偏差です。ここで、s
はサンプルデータから計算された標準偏差です。 n
はサンプルサイズです。
Python 3.8
から、標準ライブラリは NormalDist
モジュールの一部として statistics
オブジェクトを提供します。
from statistics import NormalDist
def confidence_interval(data, confidence=0.95):
dist = NormalDist.from_samples(data)
z = NormalDist().inv_cdf((1 + confidence) / 2.)
h = dist.stdev * z / ((len(data) - 1) ** .5)
return dist.mean - h, dist.mean + h
この:
データサンプルからNormalDist
オブジェクトを作成します( NormalDist.from_samples(data)
。これにより、 NormalDist.mean
および NormalDist.stdev
を介してサンプルの平均と標準偏差にアクセスできます。
累積分布関数の逆関数( Z-score
)を使用して、指定された信頼度の標準正規分布(NormalDist()
で表される)に基づいてinv_cdf
を計算します。
サンプルの標準偏差と平均に基づいて信頼区間を作成します。
これは、スチューデントのt分布ではなく標準の正規分布を使用してz
値を計算するために、サンプルサイズが十分に大きい(たとえば100ポイント以上)ことを前提としています。