正規分布を仮定して、信頼区間を計算したいサンプルデータがあります。
私は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
このように計算できます。
scipy
、必ずしもすべてのサブパッケージが自動的にインポートされるとは限りません。サブパッケージをscipy.stats
明示的にインポートすることをお勧めします。
*ss.t._ppf((1+conf)/2.,n-1)
組み込みのパンダデータフレーム.sem
メソッドに追加できるので、心配する必要がないので、気に入っていますapply
ここで、配列の平均の95%信頼区間を計算する、shasanのコードの短縮版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()
信頼区間が狭すぎる(つまり、「偽の信頼」)。私の答えを見てください詳細(およびここでの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)
st.t.interval(0.05)
95%の信頼区間を得るために電話をかけるべきだと思います。
st.t.interval(0.95)
95%信頼区間では正しいです。のドキュメントを参照してくださいscipy.stats.t
。alpha
ただし、SciPyが引数に名前を付けるのは理想的とは言えません。
まず、目的の信頼区間のZ値をルックアップテーブルから検索します。次に、信頼区間はですmean +/- z*sigma
。ここで、sigma
はサンプル平均の推定標準偏差です。sigma = s / sqrt(n)
ここで、s
はサンプルデータから計算された標準偏差でn
あり、サンプルサイズです。
scipy.stats.norm.interval(confidence, loc=mean, scale=sigma)
sigma
。sigma
私の答えでは、分布の推定標準偏差ではなく、標本平均の推定標準偏差を指定する必要があります。それを明確にするために答えを更新しました。ご指摘いただきありがとうございます。
以降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ポイントを超えるとしましょう)と想定しています。