web-dev-qa-db-ja.com

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

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

Numpyパッケージとscipyパッケージを見つけてインストールし、平均値と標準偏差を返すようにnumpyを取得しました(データがリストであるnumpy.mean(data))。サンプルの信頼区間の取得に関するアドバイスをいただければ幸いです。

84
Bmayer0122
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

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

124
shasan

ここで、配列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)
88
Ulrich Stern

ルックアップテーブル から目的の信頼区間の z-value を検索することから始めます。信頼区間はmean +/- z*sigmaです。ここで、sigmasigma = s / sqrt(n)で与えられるサンプル平均の推定標準偏差です。ここで、sはサンプルデータから計算された標準偏差です。 nはサンプルサイズです。

14
bogatron

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ポイント以上)ことを前提としています。

3
Xavier Guihot