pbj0812의 코딩 일기

[통계학] python을 통한 모평균의 신뢰구간 계산 본문

Science/통계학

[통계학] python을 통한 모평균의 신뢰구간 계산

pbj0812 2020. 8. 24. 03:01

0. 목표

 - python을 통한 모평균의 신뢰구간 계산

1. 실습

 1) library 호출

import random
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np

 2) 모집단 생성

  - 0과 1이 나오는 랜덤 게임을 만들고 10번을 던져 더한 값을 10000번 반복하여 저장

def game(inp):
    try_result = []
    for i in range(inp):
        try_result.append(random.randint(0, 1))
    result = sum(try_result)
    return result
    
def game_result(inp):
    result = []
    for i in range(inp):
        result.append(game(10))
    return result
    
mom = game_result(10000)

 3) 표본 생성

  - 랜덤 인덱스를 10000번까지 만든다음 상위 1000개를 지정하여 표본으로 지정

random_index = np.random.permutation(len(mom))
random_index = random_index[:1000]
son = []
for i in random_index:
    son.append(mom[i])

 4) 평균

def mean(inp):
    result = 0
    len_inp = len(inp)    
    for i in inp:
        result += i
    result = result / len_inp
    return result

 5) 분산

def var(inp):
    result = 0
    len_inp = len(inp)
    for i in inp:
        result += (i - mean(inp)) ** 2
    result = result / len_inp
    return result

 6) 제곱근

def sqrt(inp):
    result = inp/2
    for i in range(30):
        result = (result + (inp / result)) / 2
    return result

 7) 표준편차

def std(inp):
    result = sqrt(var(inp))
    return result

 8) 95% 신뢰구간

  - 모분산을 모르고 샘플링이 잘되었다는 가정하에 표본표준편차로 대체

  - 모분산을 모르고 표본이 작을때에는 t 분포를 사용하여 추정

def ci95(inp):
    max95 = mean(inp) + (1.96 * (std(inp) / sqrt(len(inp))))
    min95 = mean(inp) - (1.96 * (std(inp) / sqrt(len(inp))))
    return min95, max95

 9) 99% 신뢰구간

def ci99(inp):
    max99 = mean(inp) + (2.58 * (std(inp) / sqrt(len(inp))))
    min99 = mean(inp) - (2.58 * (std(inp) / sqrt(len(inp))))
    return min99, max99

 10) scipy 라이브러리와 비교

  - 결과

   (1) 95%

     - scipy : 4.87597789414211, 5.07602210585789

     - 계산값 : 4.876147204153314 5.075852795846686

   (2) 99%

    - scipy : 4.84445662758231, 5.10754337241769

    - 계산값 : 4.844561115671199 5.1074388843288006

import numpy as np, scipy.stats as st
# 95
st.t.interval(0.95, len(son)-1, loc=np.mean(son), scale=st.sem(son))
# 99
st.t.interval(0.99, len(son)-1, loc=np.mean(son), scale=st.sem(son))

 11) 데이터 그룹화

def make_group(inp):
    num_0 = 0
    num_1 = 0
    num_2 = 0
    num_3 = 0
    num_4 = 0
    num_5 = 0
    num_6 = 0
    num_7 = 0
    num_8 = 0
    num_9 = 0
    num_10 = 0
    for i in inp:
        if i == 0:
            num_0 +=1
        elif i == 1:
            num_1 +=1
        elif i == 2:
            num_2 +=1
        elif i == 3:
            num_3 +=1
        elif i == 4:
            num_4 +=1
        elif i == 5:
            num_5 +=1
        elif i == 6:
            num_6 +=1
        elif i == 7:
            num_7 +=1
        elif i == 8:
            num_8 +=1
        elif i == 9:
            num_9 +=1
        elif i == 10:
            num_10 +=1
    result = pd.DataFrame({
        'standard' : ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '10'],
        'result' : [num_0, num_1, num_2, num_3, num_4, num_5, num_6, num_7, num_8, num_9, num_10]
    })
    return result

 12) 그래프 생성

  - 빨간색 : 95% 신뢰구간

  - 초록색 : 99% 신뢰구간

def make_plot(inp):
    min95, max95 = ci95(inp)
    min99, max99 = ci99(inp)
    min_inp = min(inp)
    max_inp = max(inp)
    mean_inp = mean(inp)
    # 그래프 그리기
    fig = plt.figure()
    fig.set_size_inches(15, 5)
    result = make_group(son)
    plt.plot(result['result'], color = 'b')
    plt.axvline(min95, color = 'r', linestyle = ':')
    plt.axvline(max95, color = 'r', linestyle = ':')
    plt.axvline(min99, color = 'g', linestyle = ':')
    plt.axvline(max99, color = 'g', linestyle = ':')
    
make_plot(son)

 - 결과

2. 참고

 - 통계학 도감(쿠리하라 신이치, 마루야마 아츠시)

 - axvline

 - 모평균의 신뢰구간 추정하기

Comments