정규확률분포와 표준정규분포
1. 연속확률분포의 이해
- 연속확률변수: 값이 특정 구간 안에서 무한히 많을 수 있는 변수
→ 예: 키(170.2cm, 170.25cm…), 몸무게, 시간 - 확률밀도함수 (PDF):
- 곡선 형태의 그래프
- 특정 구간의 확률 = 곡선 아래 면적
- 곡선 전체 면적 = 1 (100%)
2. 정규확률분포 (Normal Distribution)
- 그래프 모양: 종(bell) 모양, 좌우 대칭
- 특징:
- 평균 = 중앙값 = 최빈값
- 평균($\mu$): 그래프의 중심 위치
- 표준편차($\sigma$): 퍼짐의 정도 ($\sigma$가 크면 납작, $\sigma$가 작으면 뾰족)
📌 예시:
우리 반 키 평균: 170cm, 표준편차: 5cm. 대부분 학생들의 키는 170 ± 5cm 근처에 몰려 있습니다.
📈 시각화 예제 (Python)
import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import norm
mu, sigma = 170, 5 # 평균 170, 표준편차 5
x = np.linspace(150, 190, 100)
y = norm.pdf(x, mu, sigma)
plt.plot(x, y)
plt.title("정규분포 (평균=170, 표준편차=5)")
plt.xlabel("키(cm)")
plt.ylabel("확률밀도")
plt.show()
👉 그래프 해석: 평균 170에서 가장 높고, 양쪽으로 갈수록 확률이 낮아집니다.
3. 표준정규분포 (Standard Normal Distribution)
- 정의: 평균 0, 표준편차 1인 특별한 정규분포
- 표준화 (Standardization):
$$ Z = \frac{X - \mu}{\sigma} $$
- X: 실제 값
- $\mu$: 평균
- $\sigma$: 표준편차
- Z: “평균에서 몇 $\sigma$만큼 떨어져 있는가?”
📌 예시:
시험 평균: 70점, 표준편차: 10점, 한 학생이 85점을 맞으면 $Z = \frac{85 - 70}{10} = 1.5$ → 평균보다 1.5$\sigma$ 위에 있습니다.
📊 시각화 (Python)
mu, sigma = 0, 1 # 표준정규분포
x = np.linspace(-4, 4, 100)
y = norm.pdf(x, mu, sigma)
plt.plot(x, y)
plt.title("표준정규분포 (μ=0, σ=1)")
plt.xlabel("Z 점수")
plt.ylabel("확률밀도")
plt.show()
4. Z-점수 확률 계산 (심화)
- 개념: Z-점수를 구한 뒤, 표준정규분포표(혹은 함수)를 이용해 확률을 계산합니다.
- 예제 ①: Z = 1.5 이상일 확률은?
- 예제 ②: 60점~80점 사이 확률은?
Python 실습 코드
from scipy.stats import norm
# Z=1.5 이상 확률
p1 = 1 - norm.cdf(1.5)
print("Z=1.5 이상 확률:", round(p1, 4)) # 0.0668
# Z=-1 ~ Z=1 사이 확률
p2 = norm.cdf(1) - norm.cdf(-1)
print("Z=-1 ~ 1 사이 확률:", round(p2, 4)) # 0.6826
표본분포와 중심극한정리
1. 표본의 이용
통계적 추론: 모집단 전체를 다 조사하기 어렵기 때문에, 일부(표본)를 조사하고 이를 근거로 모집단을 추론하는 과정입니다.
- 모수 (Parameter): 모집단의 특성 (예: 전체 학생의 평균 키 $\mu$, 전체의 표준편차 $\sigma$)
- 통계량 (Statistic): 표본의 특성 (예: 뽑은 30명의 평균 키 $\bar{x}$, 표본 표준편차 s)
2. 표본평균의 분포
- 개념: 같은 크기의 표본을 여러 번 뽑아 각 표본의 평균을 계산하면, 이 값들이 다시 하나의 “분포”를 만듭니다. 이를 **표본평균의 분포**라고 부릅니다.
3. 표본평균의 분포의 특성
- 표본평균들의 평균 = 모집단 평균($\mu$)
- 표본평균들의 흩어짐 = 표준오차(SE)
$$ \sigma_{\bar{x}} = \frac{\sigma}{\sqrt{n}} $$
👉 표본 크기 $n$이 클수록 표준오차($\sigma_{\bar{x}}$)가 작아져서 모집단 평균 주위로 더 많이 모이게 됩니다.
4. 중심극한정리 (Central Limit Theorem)
핵심 내용: 모집단이 어떤 모양이든 **표본의 크기 $n \ge 30$ 이면, 표본평균의 분포는 정규분포에 가까워집니다.**
5. Python 실습 예시
import numpy as np
import matplotlib.pyplot as plt
# 모집단: 오른쪽으로 치우친 분포 (지수분포)
population = np.random.exponential(scale=2, size=100000)
# 표본평균 분포 시뮬레이션
sample_means = []
n = 30 # 표본 크기
for _ in range(1000):
sample = np.random.choice(population, n)
sample_means.append(np.mean(sample))
# 그래프
plt.figure(figsize=(12,5))
plt.subplot(1,2,1)
plt.hist(population, bins=50, color='lightblue', edgecolor='black')
plt.title("모집단 분포 (치우침)")
plt.subplot(1,2,2)
plt.hist(sample_means, bins=30, color='salmon', edgecolor='black')
plt.title("표본평균의 분포 (n=30, 정규분포 형태)")
plt.show()
👉 결과: 모집단은 한쪽으로 치우쳐 있어도, 표본평균의 분포는 종 모양이 됩니다.
🎲 실습: 주사위 평균과 중심극한정리
1. 활동 목표
주사위를 여러 번 던져 나온 값들의 **평균**을 구하고, 이를 여러 번 반복했을 때 평균들이 어떤 분포를 만드는지 직접 확인하여 “표본평균의 분포가 정규분포에 가까워진다”는 사실을 체험해 보는 실습입니다.
2. 손으로 하는 활동
- 학생들에게 **주사위 3개씩** 나눠줍니다.
- **3번 던져 나온 눈의 평균**을 기록합니다. (예: 4, 2, 5 → 평균 = 3.67)
- 이 과정을 **10명 이상이 반복**해 평균값을 칠판에 적습니다.
- 결과를 모아 보면, 값들이 **가운데 근처(약 3.5)**에 몰려 있음을 확인할 수 있습니다.
3. Python 시뮬레이션 예제
import numpy as np
import matplotlib.pyplot as plt
# 모집단: 주사위 (1~6 균등 분포)
population = [1, 2, 3, 4, 5, 6]
# 표본 크기 (던진 횟수)
n = 5
# 표본평균 여러 번 구하기
sample_means = []
for _ in range(1000): # 1000번 반복
sample = np.random.choice(population, n)
sample_means.append(np.mean(sample))
# 히스토그램 시각화
plt.hist(sample_means, bins=20, color='orange', edgecolor='black')
plt.title(f"주사위 평균 분포 (표본 크기 n={n})")
plt.xlabel("평균값")
plt.ylabel("빈도")
plt.show()
4. 실습 결과 해석
- **n=1 (한 번 던짐):** 균등 분포 (1~6이 고르게 나옴)
- **n=5 (다섯 번 평균):** 가운데(3.5) 근처에 몰린 종 모양
- **n=30 (서른 번 평균):** 거의 완벽한 정규분포
추정 (Estimation)
1. 추정의 개념
- 정의: 표본을 이용해 **모집단의 특성(모수)**을 알아내는 과정
2. 점추정 (Point Estimation)
정의: 모집단의 값을 **하나의 수치**로 추정하는 방법
- 좋은 추정량의 기준: 불편성, 효율성, 일치성, 충족성
3. 구간추정 (Interval Estimation)
정의: 모수가 들어 있을 만한 **범위(구간)**를 제시하는 방법
- 신뢰구간 (Confidence Interval, CI): 점추정값 ± 오차한계
- 공식:
$$ \bar{x} \pm Z_{\alpha/2} \cdot \frac{\sigma}{\sqrt{n}} $$
4. Python 실습 예제
📌 시나리오:
한 공장에서 전구 100개를 뽑아 평균 수명을 조사했더니 **2000시간, 표준편차 100시간**이 나왔습니다. 전체 전구 평균 수명($\mu$)은 몇일까요?
import scipy.stats as st
import numpy as np
# 데이터
sample_mean = 2000 # 표본 평균
sample_std = 100 # 모집단 표준편차 (알고 있다고 가정)
sample_size = 100 # 표본 크기
confidence_level = 0.95
# 표준오차 계산
standard_error = sample_std / np.sqrt(sample_size)
# 95% 신뢰수준 Z값
z_score = st.norm.ppf(1 - (1 - confidence_level) / 2)
# 신뢰구간 계산
margin_of_error = z_score * standard_error
confidence_interval = (sample_mean - margin_of_error, sample_mean + margin_of_error)
print(f"95% 신뢰구간: {confidence_interval}")
5. 결과 해석
출력: (1980.4, 2019.6)
6. 실제 사례: 여론조사와 오차범위
신문이나 뉴스에서 자주 나오는 문장 👇
“이번 여론조사는 전국 성인 1,000명을 대상으로 실시했으며, 표본오차는 95% 신뢰수준에서 ±3.1%p입니다.”
(1) 이 말의 의미는?
오차범위 ±3.1%p: 조사 결과 A후보 지지율이 45%라고 하면, 모집단(전체 국민)의 실제 지지율은 **약 41.9% ~ 48.1%** 범위에 있을 가능성이 큽니다.
(2) Python으로 오차범위 계산하기
import numpy as np
import scipy.stats as st
# 여론조사 설정
p = 0.45 # 지지율 45%
n = 1000 # 표본 크기 1000명
confidence = 0.95 # 신뢰수준 95%
# 표준오차
se = np.sqrt(p*(1-p)/n)
# Z값
z = st.norm.ppf(1 - (1-confidence)/2)
# 오차범위
margin = z * se
ci = (p - margin, p + margin)
print(f"95% 신뢰구간: {ci[0]*100:.1f}% ~ {ci[1]*100:.1f}%")
print(f"오차범위: ±{margin*100:.1f}%p")