[큰 수의 법칙] - 파이썬 동전던지기로 실험해보기딥상어동의 딥한 통계학2022. 3. 21. 01:04
Table of Contents
0. 큰 수의 법칙
큰 수의 법칙(law of large numbers, LLN)은 경험적 확률과 수학적 확률 사이의 관계를 나타내는 법칙으로, 표본집단의 크기가 커지면 그 표본평균이 모평균에 가까워짐을 의미한다
- 갓무위키 -
실험을 반복하면 진리에 가까워진다. 다만, 비용이나 시간의 한계가 있을뿐.
$lim_{n\to\infty}P(\lvert\frac{S_n}{n}\rvert < \epsilon) = 1$
S(실행횟수)가 무한히 많아지면 경험적 확률 S_n/n 와 수학적 확률 p와의 차이는 아주 미세한 수(엡실론)보다 작게된다. 이를 큰 수의 법칙이라고 한다.
큰수의 법칙은 실제로 작동할까? 오늘은 파이썬 동전던지기 코드로 한번 테스트를 해보려 한다.
1. 동전던지기 함수 생성
import numpy as np
import matplotlib.pyplot as plt
# 한글 폰트
plt.rc('font', family='NanumGothic')
필요한 라이브러리를 먼저 설치해준다.
class TossCoin:
def __init__(self, array_size, prob, experiments_num):
self.array_size = array_size
self.prob = prob
self.experiments_num = experiments_num
def get_prob_array(self):
prob_array = []
for _ in range(self.experiments_num):
toss_coin_array = np.random.choice(['0.head', '1.tail']
, size=self.array_size
, p=[self.prob, 1-self.prob])
_, toss_coin_cnt = np.unique(toss_coin_array, return_counts=True)
prob_array.append(toss_coin_cnt[0]/self.array_size)
return prob_array
일단, 여러 함수를 제작해보려다가 시간 관계상.. 동전던지기 결과값만 얻는 함수를 작성하였다.
1. np.random.choice에서 동전의 앞면과 뒷면의 확률을 정해준다. 그리고, 정해진 횟수 만큼 동전을 던진다.
2. np.unique에서 return_counts를 True로 설정하면 np.array의 각 원소별 개수를 구할 수 있다.
3. 이를 이용하여 앞면의 개수 / 전체 횟수로 경험적 확률을 구해준다.
4. 이러한 시행을 experiments_num 만큼 시행해본다.
2. 그래프로 결과 확인해보기
coin_instance_10 = TossCoin(10, 0.5, 100)
coin_instance_100 = TossCoin(100, 0.5, 100)
coin_instance_10000 = TossCoin(10000, 0.5, 100)
coin_instance_100000 = TossCoin(100000, 0.5, 100)
이에 따라 위와 같이 4개의 실험을 생성하였다. 확률과 실험 횟수는 각각 0.5와 100으로 동일하고 개별 실험당 동전을 던지는 횟수만 다르게 설정하였다. 예를 들어, coin_instance_100은 개별 실험당 동전을 100번씩 던지는 실험이다.
fig, axes = plt.subplots(2, 2, figsize=(15, 12))
axes[0, 0].hist(coin_instance_10.get_prob_array())
axes[0, 0].set_xlim([0, 1])
axes[0, 0].set_title("앞면 확률 - 개별 실험당 동전던지기 10회")
axes[0, 1].hist(coin_instance_100.get_prob_array())
axes[0, 1].set_xlim([0, 1])
axes[0, 1].set_title("앞면 확률 - 개별 실험당 동전던지기 100회")
axes[1, 0].hist(coin_instance_10000.get_prob_array())
axes[1, 0].set_xlim([0, 1])
axes[1, 0].set_title("앞면 확률 - 개별 실험당 동전던지기 10000회")
axes[1, 1].hist(coin_instance_100000.get_prob_array())
axes[1, 1].set_xlim([0, 1])
axes[1, 1].set_title("앞면 확률 - 개별 실험당 동전던지기 100000회")
plt.show()
확인 결과 개별 실험당 동전던지기 횟수가 많아질수록 경험적 확률이 수학적 확률(=0.5)에 근사하는 것을 알 수 있다.
(=그래프4의 분포가 가장 0.5 부근에 몰려있다.)
'딥상어동의 딥한 통계학' 카테고리의 다른 글
분포를 살펴보는 이유 (0) | 2022.06.25 |
---|---|
두번 빼면 인과 효과가 보이는 이유 - 이중차분법(Difference in Difference) (0) | 2022.04.22 |
내생 변수(endogenous variable) - 하늘 아래 태양은 하나다. (0) | 2022.04.15 |
다중공선성에서 tolerance의 의미 - 해석의 용이성 (2) | 2022.01.04 |
[통계학] 다중공선성에 대한 고찰 - 해석과 모델 성능의 관점에서 (3) | 2020.11.08 |
@딥상어동의 딥한생각 :: 딥상어동의 딥한생각
제 블로그에 와주셔서 감사합니다! 다들 오늘 하루도 좋은 일 있으시길~~
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!