pbj0812의 코딩 일기

[통계학] 동전 던지기 게임을 통한 정규분포 그래프 만들기 본문

Science/통계학

[통계학] 동전 던지기 게임을 통한 정규분포 그래프 만들기

pbj0812 2020. 8. 15. 01:00

0. 목표

 - 동전 던지기 게임을 통한 정규분포 그래프 생성(python)

 - 규칙 : 게임 1회 당 동전을 10번 던져 각 0, 1점을 부여 및 합산(총 0 ~ 10점)

1. 실습

 1) library 호출

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

 2) 시도(동전을 던지는) 횟수에 따른 점수 합산 함수

  - randint를 사용하여 0 아니면 1이 랜덤으로 나오게 지정

  - sum을 이용하여 모든 시도의 점수를 합산

  - 결과 : 3

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

 3) 게임 횟수(한 게임에 10회 던지기)에 따른 결과 저장하는 함수

  - 결과 : [5, 5, 6, 3, 6, 3, 5, 6, 5, 5]

def game_result(inp):
    result = []
    for i in range(inp):
        result.append(game(10))
    return result
    
game_result(10)

 4) 3)의 결과를 합산 점수별 그룹화 하는 함수

  - 후의 차트를 위해 0 ~ 10점에 해당하는 라벨링 변수를 따로 만들고 for를 통해 해당 변수에 속하면 +1씩 증가

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

 5) 테스트

make_group(game_result(10))

  - 결과

 6) 차트 확인

result = make_group(game_result(10))
plt.bar(result['standard'], result['result'])

  - 결과

 7) 여러 경우의 수(리스트) 입력시 자동으로 그려주는 함수

  - 정수로 이루어진 list를 받아 자동으로 그림을 생성

  - list의 길이에 따라 그림의 크기를 자동 조정하게 제작

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]) + ' cycle'
        plt.title(title)
        # 연산
        result = make_group(game_result(inp[i]))
        plt.bar(result['standard'], result['result'])
    plt.show()

2. 확인

 1) 실험 리스트 작성

cycle = [10, 50, 100, 500, 1000, 2000, 10000]

 2) 실행

make_graph(cycle)

 3) 결과

  - 횟수가 증가할수록 정규분포의 형태를 이루고 있음(대략 1,000번 이상)

3. 참고

 - figure과 subplot

 - Matplotlib로 그려지는 그림의 크기를 어떻게 바꾸나요?

Comments