pbj0812의 코딩 일기

[통계학] python으로 포아송 분포 함수 구현하기 본문

Science/통계학

[통계학] python으로 포아송 분포 함수 구현하기

pbj0812 2020. 8. 18. 00:24

0. 목표

 - python으로 포아송 분포 함수 구현

1. 사전 이론 준비

 - 시행 횟수가 아주 많고, 사상 발생의 확률이 아주 작을때의 이항분포

 - ex) 공장에서의 불량품 수

2. 실습

 1) 네이피어 수 구현 및 확인

  - 1000번 까지만 구함

  - 결과 :2.7169239322355936

def exp(inp):
    result = (1 + 1/1000) ** 1000
    result = result ** (inp)
    return result
    
print(exp(1))    

 2) factorial 함수 구현 및 확인

  - 0을 input으로 넣었을 때는 1이 출력되도록 조건 추가

  - 결과 : 6

def factorial(inp):
    result = inp
    i = inp
    while i > 1:
        i -= 1
        result *= i
    if result == 0:
        result = 1
    return result
    
print(factorial(3))    

 

 3) 포아송분포 구현 및 확인

# inp1 : 시행횟수
# inp2 : 확률
# inp3 : 사상 발생 횟수
def poisson(inp1, inp2, inp3):
    mean = inp1 * inp2
    result = ((exp(-mean)) * (mean ** inp3)) / factorial(inp3)
    return result

 - 문제 : 불량품이 나올 확률이 0.002(0.2 %)인 공장이 있다고 할 때 1000번을 돌려서 불량품이 0개가 나올 확률

 - 결과 : 0.1354705959640027

poisson(1000, 0.002, 0)

 4) 0 ~ 10회가 일어날 확률의 데이터 프레임화

  - inp3 부분을 list 형태로 받아 내부의 for 문을 통하여 계산하는 형태

# inp1 : 시행횟수
# inp2 : 확률
# inp3 : 사상 발생 횟수리스트
def make_list(inp1, inp2, inp3):
    result = []
    for i in inp3:
        result.append(poisson(inp1, inp2, i))
    result_df = pd.DataFrame({'standard' : inp3, 'result' : result})
    return result_df
    
inp_list = [i for i in range(11)]

result = make_list(1000, 0.002, inp_list)
print(result)

 5) 그래프 생성을 위한 library 호출

  - 한글 입력을 위한 rc 호출

import matplotlib.pyplot as plt
from matplotlib import rc
rc('font', family='AppleGothic')
plt.rcParams['axes.unicode_minus'] = False

 6) 그래프 생성

plt.bar(result['standard'], result['result'])
plt.title('1000번 중 해당 개수의 불량품이 나올 확률')
plt.xlabel('불량품의 개수')
plt.ylabel('불량품이 나올 확률')

 - 결과

4. 참고

 - 푸아송 분포

 - 0!, (1/2)!은 뭘까?

 - 네이피어 수(오일러 수)

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

 - 맥에서 matplotlib 한글 문제 해결하기

 

Comments