문제 5. 파이썬으로 중심극한정리(CLT) 1.데이터 생성하기
- 출제의도
- 이론을 시뮬레이션하여 간접 증명을 할 수 있다.
- 중심극한 정리를 위한 데이터 생성을 scipy 모듈의 rvs 함수를 이용해 할 수 있다.
- matplot을 이용하여 데이터를 시각화 할 수 있다.
- 문제
- scipy.stats 모듈에서 다음 분포를 생성하고 히스토그램으로 표현하기(subplots권장)
- 변수
- 이항 분포 샘플 변수명 binomial_data: 확률 0.5의 시행을 10번 시행했을때 성공할 갯수의 1000개의 표본 생성
- ex 동전 10번 던졌을때 앞면이 나올 수 있는 수는 0부터 10개
- 균등 분포 샘플 변수명 uniform_data : 시작 0, 끝 10의 표본 1000개 생성
- 표준 정규 분포 샘플 변수명 normal_data : 표본 1000개 생성
- 이항 분포 샘플 변수명 binomial_data: 확률 0.5의 시행을 10번 시행했을때 성공할 갯수의 1000개의 표본 생성
- 위 분포 3개를 히스토그램으로 표현하되 plt.subplots(1,3)을 이용하여 동시에 표현하고, bins 는 20개로 설정
- Skeleton code
np.random.seed(42)
# scipy를 통한 샘플 생성
'''
여기에 코드를 작성해주세요.
'''
#시각화
plt.figure(figsize=(15, 5))
'''
여기에 코드를 작성해주세요.
'''
출력 결과 예시
💡 문제 풀이
`모범답안`
np.random.seed(42)
import matplotlib.pyplot as plt
from scipy.stats import * #binom, norm, uniform
sample_size = 1000
uniform_data = uniform.rvs(loc= 0, scale = 10, size = sample_size)
binomial_data = binom.rvs(n = 10, p = 0.5, size = sample_size)
normal_data = norm.rvs(loc = 0, scale = 1, size = sample_size)
# normal_data[:10]
# plt.hist(normal_data)
#시각화
plt.figure(figsize=(15, 5))
plt.subplot(1, 3, 1)
plt.hist(binomial_data, bins=20, color="blue", alpha=0.7)
plt.title("Binomial Distribution")
plt.xlabel("Value")
plt.xticks(range(0,11))
plt.ylabel("Frequency")
plt.subplot(1, 3, 2)
plt.hist(uniform_data, bins=20, color="green", alpha=0.7)
plt.title("Uniform Distribution")
plt.xlabel("Value")
plt.ylabel("Frequency")
plt.xticks(range(0,11))
plt.subplot(1, 3, 3)
plt.hist(normal_data, bins=20, color="red", alpha=0.7)
plt.title("Normal Distribution")
plt.xlabel("Value")
plt.ylabel("Frequency")
plt.tight_layout()
plt.show()
`출력결과`
`오답노트★★`
- seaborn이 아니어도 그래프 예쁘게 만들 수 있다..!
- from scipy.stats import * 을 통해 하나씩 나열 안 하고 binom, uniform, norm 다 불러올 수 있음
- 참고) plt.hist(alpha=0.7)는 그래프의 투명도
`내 풀이`
1. matplotlib.pyplot으로 풀기
import numpy as np
import matplotlib.pyplot as plt
np.random.seed(42)
# scipy를 통한 샘플 생성
from scipy.stats import binom, uniform, norm
binomial_data = binom.rvs(n=10,p=0.5, size=1000)
uniform_data = uniform.rvs(loc=0, scale=10, size=1000)
normal_data = norm.rvs(size=1000)
#시각화
plt.figure(figsize=(15, 5)) # figure는 그래프가 그려지는 화면
fig, ax = plt.subplots(1,3) # subplot은 그래프, (1,3)은 화면을 1행 3열로 분류
ax[0].hist(binomial_data, bins=20, color='blue')
ax[0].set(xlabel='Value', ylabel='Frequency')
ax[0].set_title('Binomial Distribution')
ax[1].hist(uniform_data, bins=20, color='green')
ax[1].set(xlabel='Value', ylabel='Frequency')
ax[1].set_title('Uniform Distribution')
ax[2].hist(normal_data, bins=20, color='red')
ax[2].set(xlabel='Value', ylabel='Frequency')
ax[2].set_title('Normal Distribution')
`출력결과`
`오답노트`
- 그래프가 겹치고 못생기게 나오는 이유는???
- 맨 아래 plt.tight_layout() 작성하면 그래프끼리 글자가 겹치지 않음
- figure의 size를 좀 더 넓게 바꾸면 좀 더 보기 좋아짐 plt.figure(figsize=(20, 5))
2. seaborn으로 풀기
import pandas as pd
import numpy as np
from scipy.stats import binom, uniform, norm
import matplotlib.pyplot as plt
import seaborn as sns
np.random.seed(42)
# scipy를 통한 샘플 생성
binomial_data = binom.rvs(n=10,p=0.5, size=1000)
uniform_data = uniform.rvs(loc=0, scale=10, size=1000)
normal_data = norm.rvs(size=1000)
#시각화
plt.figure(figsize=(15, 5)) # figure는 그래프가 그려지는 화면
# Binomial
plt.subplot(1,3,1) # subplot은 그래프, (1,3)은 화면을 1행 3열로 분류
sns.histplot(data = binomial_data, bins=20, color='blue', edgecolor=None)
plt.xlabel('value')
plt.ylabel('frequency')
plt.title('Binomial Distribution')
# Uniform
plt.subplot(1,3,2) # subplot은 그래프, (1,3)은 화면을 1행 3열로 분류
sns.histplot(data = uniform_data, bins=20, color='green', edgecolor=None)
plt.xlabel('value')
plt.ylabel('frequency')
plt.title('Uniform Distribution')
# Normal
plt.subplot(1,3,3) # subplot은 그래프, (1,3)은 화면을 1행 3열로 분류
sns.histplot(data = normal_data, bins=20, color='red', edgecolor=None)
plt.xlabel('value')
plt.ylabel('frequency')
plt.title('Normal Distribution')
`출력결과`