샘플 데이터에서 신뢰 구간 계산


109

정규 분포를 가정하여 신뢰 구간을 계산하려는 샘플 데이터가 있습니다.

numpy 및 scipy 패키지를 찾아 설치했으며 평균과 표준 편차를 반환하기 위해 numpy를 얻었습니다 (데이터가 목록 인 numpy.mean (data)). 샘플 신뢰 구간을 얻는 것에 대한 조언을 주시면 감사하겠습니다.


1
표본 평균 또는 모집단 평균에 대한 CI를 계산할지 여부를 지정한다고 생각합니다. 그러면 z- 점수를 계산하기 위해 정규 분포를 사용할 것인지 t 분포를 사용할 것인지 결정할 수 있습니다. 그리고 아래의 최상위 답변은 표본 평균에 대한 것이므로 at 분포가 사용됩니다.
Jake

답변:


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. 무해 할 수도 있지만 안전하지 않은 최적화 시도 일 수도 있습니다.
러스

*ss.t._ppf((1+conf)/2.,n-1) 내장 된 pandas 데이터 프레임 .sem방법 에 추가 할 수 있으므로 걱정할 필요가 없기 때문에 마음에 듭니다apply
TNT

1
이 계산은 샘플 평균에 대한 것이므로 at 분포가 사용됩니다. 질문이 모집단 평균 계산 인 경우 정규 분포를 사용해야하며 동일한 신뢰 수준에 대해 신뢰 구간이 더 작아집니다.
Jake

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의 의견에서 제 안됨). 그러나 위의 솔루션은 st.norm.interval()너무 좁은 신뢰 구간 (예 : "가짜 신뢰")을 제공 하는 작은 n에 대해서도 정확합니다 . 자세한 내용 은 비슷한 질문에 대한 내 대답 을 참조하십시오 (그리고 여기에 Russ의 의견 중 하나).

다음은 올바른 옵션이 (본질적으로) 동일한 신뢰 구간을 제공하는 예입니다.

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.t. 하지만 SciPy의 주장 이름은 alpha이상적이지 않은 것 같습니다.
Ulrich Stern

두 개의 데이터 배열이 있고 평균의 차이를 계산하면. 이 평균 차이에 대해 95 % CI를 얻을 수있는 방법이 있습니까? StatsModelsl을 사용하여 여기에 제공하는 것과 같은 쉬운 방법을 생각할 수 있습니까?
steven

@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
원래 asker는 정규 분포를 가정해야한다고 지적했지만 작은 표본 모집단 (N <100 정도) 경우 정규 분포 대신 Student t 분포 에서 z를 찾는 것이 더 낫다는 점을 지적 할 가치가 있습니다. . 샤산의 대답은 이미 이것을하고 있습니다.
Russ 2014 년

3
@bogatron, 신뢰 구간에 대해 제안 된 미적분은 평균 +/- z * sigma / sqrt (n) 이 아닙니다 . 여기서 n은 표본 크기입니까?
David

3
@David, 당신이 맞습니다. 의 의미를 놓쳤습니다 sigma. sigma내 대답은 분포의 추정 표준 편차가 아니라 표본 평균의 추정 표준 편차 여야합니다. 이를 명확히하기 위해 답변을 업데이트했습니다. 지적 해 주셔서 감사합니다.
bogatron

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.