Python/Matplotlib에서 양측 95% 신뢰 구간을 그림에 추가

기본 그리기



예를 들어, 이러한 느낌의 데이터 프레임이 있다고 가정합니다.
    x         y
0   2  0.954025
1   3  0.146810
2   1  0.409961
3   1  0.164558
4   3  0.782152
5   2  0.905869
6   3  0.210528
7   1  0.437970
8   1  0.801206
9   3  0.089576
10  2  0.960357
11  2  0.670732

이 데이터 프레임에서 표준 오차가있는 그림을 그리려고하면 이러한 느낌.
import numpy as np
import matplotlib.pyplot as plt

m = df.pivot_table(index='x', values='y', aggfunc='mean')
e = df.pivot_table(index='x', values='y', aggfunc='sem')
m.plot(xlim=[0.8, 3.2], yerr=e)



따라서 yerr에 오류의 크기를 지정하여 오류 막대를 만들 수 있습니다.

신뢰 구간을 이용한 도면



따라서 신뢰 구간의 길이를 결정하는 cilen을 정의하고 사용합니다.
import numpy as np
from scipy import stats
import matplotlib.pyplot as plt


def cilen(arr, alpha=0.95):
    if len(arr) <= 1:
        return 0
    m, e, df = np.mean(arr), stats.sem(arr), len(arr) - 1
    interval = stats.t.interval(alpha, df, loc=m, scale=e)
    cilen = np.max(interval) - np.mean(interval)
    return cilen

m = df.pivot_table(index='x', values='y', aggfunc='mean')
e = df.pivot_table(index='x', values='y', aggfunc=cilen)
m.plot(xlim=[0.8, 3.2], yerr=e)



신뢰 구간이있는 다이어그램을 만들 수있었습니다.



신뢰 구간을 계산하는 방법은 「n인가 n-1인가」문제의 탓으로 엉망입니다.
「바퀴의 재발명은 피하라」에 따라, 우선 「신뢰 구간 Python」등으로 검색한 사람은,
  • 파이썬에서 정규 분포의 평균값에 대한 신뢰 구간을 계산하는 방법
  • keiskS @technote – 파이썬에서 신뢰 구간

  • 근처를 보고, 미묘하게 다르게 곤란하면서도 둘 다 시험해보고, 그리고 결과가 다른 것에 능숙하게 된다고 생각합니다 (되었습니다).
    R과 같은 대답이 되는 것은 1의 쪽. 다른 것은 2쪽입니다. 조금 시도해 보겠습니다.
    > x <- c(1, 1, 3, 3)
    > t.test(x)
    
        One Sample t-test
    
    data:  x
    t = 3.4641, df = 3, p-value = 0.04052
    alternative hypothesis: true mean is not equal to 0
    95 percent confidence interval:
     0.1626138 3.8373862
    sample estimates:
    mean of x
            2
    

    1가지 방법


    import numpy as np
    from scipy import stats
    
    alpha     = 0.95
    data = [1, 1, 3, 3]
    
    mean_val = np.mean(data)
    sem_val  = stats.sem(data)  # standared error of the mean
    ci       = stats.t.interval(alpha, len(data)-1, loc=mean_val, scale=sem_val)
    
    print(ci)
    
    >> (0.16261376896260105, 3.837386231037399)
    

    2가지 방법


    import math
    import numpy as np
    from scipy import stats
    
    alpha     = 0.95
    data = [1, 1, 3, 3]
    
    mean_val = np.mean(data)
    std_val = np.std(data)
    ci = stats.t.interval(alpha,len(data)-1,loc=mean_val,scale=std_val/math.sqrt(len(data)))
    print(ci)
    
    >> (0.40877684735786857, 3.5912231526421312)
    

    이번은 천하의 R에 따르기로 했으므로 1을 채용하고 있습니다.
    덧붙여 2는 무엇이 다른가 하면, ci를 계산하는 개소의 마지막 쪽
    math.sqrt(len(data))
    

    이것입니다. n으로 나눕니다. 그러나 추측 통계를 수행한다면 n-1로 나누는 것이 좋습니다. t 분포를 가정하기 때문입니다. 사실,
    math.sqrt(len(data) - 1)
    

    그렇다면 방법 2의 대답도 R과 정확히 일치합니다.

    좋은 웹페이지 즐겨찾기