サンプルデータから信頼区間を計算する


109

正規分布を仮定して、信頼区間を計算したいサンプルデータがあります。

私はnumpyおよびscipyパッケージを見つけてインストールし、numpyに平均値と標準偏差(numpy.mean(data)とデータがリストになっている)を返すようにしました。サンプルの信頼区間を取得する上でのアドバイスは大歓迎です。


1
標本平均または母集団平均のCIを計算するかどうかを確実に指定すると思います。これにより、正規分布とt分布のどちらを使用してzスコアを計算するかが決まります。そして、以下の一番上の答えはサンプルの平均に対するものなので、分布で使用されます。
ジェイク、

回答:


162
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

このように計算できます。


1
sp.stats.stderrは廃止されました。私はsp.stats.semを置き換えましたが、うまくいきました!
Bmayer0122 2013

1
インポートによってscipy、必ずしもすべてのサブパッケージが自動的にインポートされるとは限りません。サブパッケージをscipy.stats明示的にインポートすることをお勧めします。
Vikram 2013

31
の「プライベート」使用に注意してくださいsp.stats.t._ppf。それ以上の説明がなければ、私はそこにいるのはそれほど快適ではありません。sp.stats.t.ppf自分が何をしているのかがはっきりしている場合を除いて、直接使用することをお勧めします。ソースをすばやく検査すると、でスキップされるかなりの量のコードがあり_ppfます。おそらく無害ですが、おそらく安全でない最適化の試みですか?
Russ

*ss.t._ppf((1+conf)/2.,n-1) 組み込みのパンダデータフレーム.semメソッドに追加できるので、心配する必要がないので、気に入っていますapply
TNT

1
この計算がサンプル平均のためであることを明確にしたいので、分布が使用されます。質問が母平均を計算することである場合、正規分布が使用されるべきであり、信頼区間は同じ信頼水準に対してより小さくなります。
ジェイク、

133

ここで、配列の平均の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)

1
st.t.interval(0.05)95%の信頼区間を得るために電話をかけるべきだと思います。
Scimonster

5
いいえ、st.t.interval(0.95)95%信頼区間では正しいです。のドキュメントを参照してくださいscipy.stats.talphaただし、SciPyが引数に名前を付けるのは理想的とは言えません。
Ulrich Stern

データの2つの配列があり、それらの平均の差を計算した場合。この平均差の95%CIを取得する方法はありますか?StatsModelslを使用して、ここで提供するような簡単な方法を考えられますか?
スティーブン

@steven、結局、私これについての質問に答えました。:)
Ulrich Stern

16

まず、目的の信頼区間のZ値ルックアップテーブルから検索します。次に、信頼区間はですmean +/- z*sigma。ここで、sigmaはサンプル平均の推定標準偏差です。sigma = s / sqrt(n)ここで、sはサンプルデータから計算された標準偏差でnあり、サンプルサイズです。


29
scipy.stats.norm.interval(confidence, loc=mean, scale=sigma)
Jaime

4
元の質問者は正規分布が仮定されることを示していましたが、小さなサンプル母集団(N <100程度)の場合、正規分布ではなくスチューデントt分布で zを調べるほうが良いことを指摘する価値があります。。シャサンの答えはすでにこれを行っています。
Russ

3
@bogatronは、信頼区間の推奨される計算について、平均+/- z * sigma / sqrt(n)ではありません nはサンプルサイズ)。
デビッド

3
@David、あなたは正しい。の意味を間違えてしまいましたsigmasigma私の答えでは、分布の推定標準偏差ではなく、標本平均の推定標準偏差を指定する必要があります。それを明確にするために答えを更新しました。ご指摘いただきありがとうございます。
bogatron、2015

15

以降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.meanNormalDist.stdev

  • 累積分布関数の逆関数()を使用して、指定された信頼度Z-scoreの標準正規分布(で表されるNormalDist())に基づいてを計算しinv_cdfます。

  • サンプルの標準偏差と平均に基づいて信頼区間を作成します。


これは、スチューデントのt分布ではなく標準正規分布を使用してz値を計算するために、サンプルサイズが十分に大きい(100ポイントを超えるとしましょう)と想定しています。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.