pbj0812의 코딩 일기

[통계학] python을 통한 자유도에 따른 카이제곱 분포 그리기 본문

Science/통계학

[통계학] python을 통한 자유도에 따른 카이제곱 분포 그리기

pbj0812 2020. 8. 19. 01:18

0. 목표

 - python을 통한 자유도에 따른 카이제곱 분포 그리기

 - 카이제곱 분포는 정규분포를 따르는 여러 데이터를 한꺼번에 취급할 수 있어, 분산분석에 이용가능

1. 실습

 1) library 호출

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

 2) 카이제곱 리스트 생성

  - np.normal.random을 통해 정규분포의 무작위 값 획득

  - 1000번을 돌려 각 값에 대한 제곱값을 획득

def normal(inp):
    result = []
    for i in range(1,1001):
        tmp = np.random.normal(size = inp)
        dummy = 0
        for i in range(inp):
            tmp2  = tmp[i] ** 2
            dummy += tmp2
        result.append(dummy)
    return result

 3) 얻은 값들을 조건에 따른 데이터 그룹화

  - 실수의 값을 그대로 사용하면 값이 일치하지 않으므로, 1 간격의 범주화

  - 20이 넘는 값들은 over20으로 저장하게 함

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
    num_11 = 0
    num_12 = 0
    num_13 = 0
    num_14 = 0
    num_15 = 0
    num_16 = 0
    num_17 = 0
    num_18 = 0
    num_19 = 0
    num_20 = 0
    for i in inp:
        if i >= 20:
            num_20 += 1
        elif i >= 19:
            num_19 += 1
        elif i >= 18:
            num_18 += 1
        elif i >= 17:
            num_17 += 1
        elif i >= 16:
            num_16 += 1
        elif i >= 15:
            num_15 += 1
        elif i >= 14:
            num_14 += 1
        elif i >= 13:
            num_13 += 1
        elif i >= 12:
            num_12 += 1
        elif i >= 11:
            num_11 += 1
        elif i >= 10:
            num_10 += 1
        elif i >= 9:
            num_9 += 1
        elif i >= 8:
            num_8 += 1
        elif i >= 7:
            num_7 += 1
        elif i >= 6:
            num_6 += 1
        elif i >= 5:
            num_5 += 1
        elif i >= 4:
            num_4 += 1
        elif i >= 3:
            num_3 += 1
        elif i >= 2:
            num_2 += 1
        elif i >= 1:
            num_1 += 1
        elif i >= 0:
            num_0 += 1
    result = pd.DataFrame({
        'standard' : ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12', '13', '14', '15', '16', '17', '18', '19', 'over20'],
        'result' : [num_0, num_1, num_2, num_3, num_4, num_5, num_6, num_7, num_8, num_9, num_10,
                   num_11, num_12, num_13, num_14, num_15, num_16, num_17, num_18, num_19, num_20]
    })
    return result

 4) 그래프 생성 모듈

  - 여러 인풋에 대한 자동처리를 하기 위한 구성

def make_graph(inp):
    # y pixel size
    len_inp = len(inp)
    size_y = 5 * len_inp
    fig = plt.figure()
    fig.set_size_inches(15, size_y)
    for i in range(len_inp):
        # subplot 추가
        fig.add_subplot(len_inp, 1, i+1)
        title = str(inp[i]) + ' df'
        plt.title(title)
        # 연산
        result = make_group(normal(inp[i]))
        plt.bar(result['standard'], result['result'])
    plt.show()

 5) 인풋 데이터 생성

  - 각 값은 자유도를 의미

  - 1 ~ 10까지

df = [i for i in range(1, 11)]

2. 결과

 - 자유도가 커짐에 따라 분포가 오른쪽으로 이동하는 것을 볼 수 있음

make_graph(df)

3. 참고

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

 - 무작위 표본 추출

 - 자유도

Comments