正規分布を仮定して、信頼区間を計算したいサンプルデータがあります。
numpy および scipy パッケージを見つけてインストールし、numpy が平均値と標準偏差 (データがリストの numpy.mean(data)) を返すようにしました。サンプル信頼区間の取得に関するアドバイスは大歓迎です。
正規分布を仮定して、信頼区間を計算したいサンプルデータがあります。
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
このように計算できます。
これは shasan のコードの短縮版で、 array の平均値の 95% 信頼区間を計算していますa
。
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()
信頼区間が狭すぎます (つまり、「偽の信頼」)。詳細については、同様の質問に対する私の回答を参照してください (およびここでのラスのコメントの 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 値を検索することから始めます。ここで、はサンプル平均の推定標準偏差で、はサンプル データから計算された標準偏差で、サンプル サイズはで与えられます。mean +/- z*sigma
sigma
sigma = s / sqrt(n)
s
n