Level 2: 수학 기초
📐

Level 2

확률분포

정규분포와 AI 활용

3분 17초
확률분포 강의 영상
강의 영상 보기 (새 탭에서 재생)YouTube

학습 내용

확률분포 - 랜덤의 레시피

학습 목표

이 레슨을 마치면 여러분은:

  • 확률분포가 뭔지, 왜 필요한지 직관적으로 이해합니다
  • 이산분포(균등, 베르누이, 이항)와 연속분포(정규분포)를 구분합니다
  • 정규분포의 평균, 표준편차, 68-95-99.7 법칙을 설명할 수 있습니다
  • Python으로 확률분포를 직접 시뮬레이션하고 시각화합니다
  • AI에서 확률분포가 어떻게 쓰이는지 구체적으로 압니다

"확률분포는 랜덤의 레시피다. AI가 세상을 이해하는 언어이기도 하다."


1. 확률분포란? - 시험 성적 비유

비유: 반 전체 시험 성적

여러분 반에서 수학 시험을 봤다고 해봅시다. 30명 학생의 점수를 모아보면 어떤 패턴이 보일까요?

  • 대부분의 학생은 평균 근처 점수를 받습니다 (60~80점 사이가 많음)
  • 아주 높은 점수(95점 이상)나 아주 낮은 점수(30점 이하)는 드물게 나옵니다
  • 점수를 막대그래프로 그리면 가운데가 높고 양쪽이 낮은 종 모양이 됩니다

이 패턴, 즉 "어떤 값이 얼마나 자주 나오는가"를 수학적으로 정리한 것이 바로 확률분포입니다.

확률분포 = 랜덤의 레시피

요리에 레시피가 있듯이, 랜덤에도 레시피가 있습니다.

요리 레시피확률분포
재료 목록가능한 결과값들
재료 비율각 결과가 나올 확률
완성된 요리랜덤 데이터의 패턴

주사위를 던지면 1~6이 골고루 나옵니다 - 균등분포 레시피입니다. 시험 점수는 평균 근처에 몰립니다 - 정규분포 레시피입니다. 같은 "랜덤"이지만 레시피가 다르면 결과 패턴이 완전히 달라집니다!

두 가지 대분류

분류결과값예시비유
이산분포셀 수 있는 값 (1, 2, 3...)주사위, 동전, 합격/불합격계단 - 딱딱 끊어지는 값
연속분포연속적인 실수 값키, 몸무게, 온도경사로 - 매끄럽게 이어지는 값

2. 이산분포 - 셀 수 있는 랜덤

2-1. 균등분포 (Uniform Distribution)

가장 단순한 분포입니다. 모든 결과가 똑같은 확률로 나옵니다.

주사위가 대표적이죠. 1부터 6까지, 각각 1/6 = 약 16.7% 확률입니다. "공평한 랜덤"이라고 생각하면 됩니다.

실행해보기: 주사위 1만번 던지기

정말 균등하게 나오는지 직접 확인해봅시다!

python
import numpy as np import matplotlib.pyplot as plt # 주사위를 10,000번 던지는 시뮬레이션 np.random.seed(42) rolls = np.random.randint(1, 7, size=10000) # 1~6 정수 # 각 눈이 나온 횟수 세기 values, counts = np.unique(rolls, return_counts=True) plt.figure(figsize=(8, 5)) colors = ['#FF6B6B', '#4ECDC4', '#45B7D1', '#96CEB4', '#FFEAA7', '#DDA0DD'] bars = plt.bar(values, counts, color=colors, edgecolor='black', linewidth=1.2) plt.axhline(y=10000/6, color='red', linestyle='--', linewidth=2, label='Expected: 1667') # 각 막대 위에 횟수 표시 for bar, count in zip(bars, counts): plt.text(bar.get_x() + bar.get_width()/2., bar.get_height() + 50, str(count), ha='center', fontsize=11, fontweight='bold') plt.xlabel('Dice Face', fontsize=13) plt.ylabel('Count', fontsize=13) plt.title('Rolling a Die 10,000 Times - Uniform Distribution', fontsize=14, fontweight='bold') plt.legend(fontsize=12) plt.ylim(0, max(counts) + 300) plt.tight_layout() plt.show() print('Each face count:') for v, c in zip(values, counts): print(f' {v}: {c}') expected = 10000 / 6 print(f'Expected per face: {expected:.1f}') print(f'Max-min difference: {max(counts)-min(counts)} (nearly uniform!)')

보이시나요? 10,000번 던지면 각 눈이 거의 비슷한 횟수로 나옵니다. 이것이 균등분포의 핵심입니다!

2-2. 베르누이분포 (Bernoulli Distribution)

결과가 딱 두 가지뿐인 분포입니다.

  • 동전: 앞면(1) / 뒷면(0)
  • 시험: 합격(1) / 불합격(0)
  • AI 분류: 스팸(1) / 정상(0)

성공 확률 p 하나만 정하면 됩니다. 실패 확률은 자동으로 (1-p)가 됩니다.

2-3. 이항분포 (Binomial Distribution)

베르누이 시행을 여러 번 반복한 것입니다. "동전을 10번 던져서 앞면이 몇 번 나오는가?"가 이항분포를 따릅니다.

python
import numpy as np import matplotlib.pyplot as plt # 동전 10번 던지기를 5000번 반복 np.random.seed(42) n_trials = 10 n_experiments = 5000 p = 0.5 heads_counts = np.random.binomial(n_trials, p, size=n_experiments) plt.figure(figsize=(9, 5)) vals = range(0, n_trials + 1) hist_counts = [np.sum(heads_counts == v) for v in vals] colors = ['#FF6B6B' if v == 5 else '#45B7D1' for v in vals] bars = plt.bar(vals, hist_counts, color=colors, edgecolor='black', linewidth=1) for v, c in zip(vals, hist_counts): if c > 50: plt.text(v, c + 30, str(c), ha='center', fontsize=9) plt.xlabel('Number of Heads (out of 10)', fontsize=13) plt.ylabel('Experiments (out of 5000)', fontsize=13) plt.title('Binomial Distribution: 10 Coin Flips x 5000', fontsize=14, fontweight='bold') plt.xticks(list(vals)) plt.tight_layout() plt.show() mean_heads = np.mean(heads_counts) print(f'Average heads: {mean_heads:.2f} (theoretical: {n_trials * p})') ratio_5 = np.sum(heads_counts == 5) / n_experiments print(f'P(exactly 5 heads): {ratio_5:.1%}') print('The center (5) is most frequent - bell-shaped!')

이항분포도 시행 횟수가 많아지면 종 모양(정규분포 모양)에 가까워집니다. 이게 바로 다음에 배울 정규분포로 연결되는 핵심입니다!


3. 연속분포 - 정규분포 (Normal Distribution)

비유: 자연이 가장 좋아하는 패턴

키, 몸무게, IQ, 시험 점수, 측정 오차... 자연에서 데이터를 모아보면 놀라울 정도로 같은 패턴이 반복됩니다. 가운데가 높고, 양쪽으로 갈수록 낮아지는 종 모양(bell curve). 이것이 바로 정규분포(가우시안 분포)입니다.

두 개의 파라미터만 알면 된다

정규분포는 딱 두 숫자로 완전히 결정됩니다.

파라미터기호역할비유
평균 (mean)mu종의 중심 위치종을 좌우로 밀기
표준편차 (std)sigma종의 종을 납작하게/뾰족하게

실행해보기: 평균과 표준편차 바꿔보기

python
import numpy as np import matplotlib.pyplot as plt x = np.linspace(-10, 15, 300) def normal_pdf(x, mu, sigma): coeff = 1 / (sigma * np.sqrt(2 * np.pi)) exponent = -0.5 * ((x - mu) / sigma) ** 2 return coeff * np.exp(exponent) plt.figure(figsize=(10, 5)) configs = [ (0, 1, '#FF6B6B', 'mu=0, sigma=1 (standard normal)'), (0, 2, '#4ECDC4', 'mu=0, sigma=2 (wider spread)'), (5, 1, '#45B7D1', 'mu=5, sigma=1 (shifted right)'), ] for mu, sigma, color, label in configs: y = normal_pdf(x, mu, sigma) plt.plot(x, y, color=color, linewidth=2.5, label=label) plt.fill_between(x, y, alpha=0.15, color=color) plt.xlabel('x', fontsize=13) plt.ylabel('Probability Density', fontsize=13) plt.title('Normal Distribution: Effect of mu and sigma', fontsize=14, fontweight='bold') plt.legend(fontsize=11) plt.grid(True, alpha=0.3) plt.tight_layout() plt.show() print('Red: Standard normal N(0,1) - the baseline') print('Green: Larger sigma = wider and flatter') print('Blue: Larger mu = shifted to the right')

4. 68-95-99.7 법칙 - 정규분포의 황금 규칙

비유: 과녁의 동심원

양궁 과녁을 생각해보세요. 가운데 원에 68%의 화살이, 중간 원에 95%가, 바깥 원에 99.7%가 꽂힙니다. 정규분포에서 평균을 중심으로 표준편차 1배, 2배, 3배 범위도 똑같은 원리입니다.

범위포함 비율의미
mu +/- 1 sigma68%약 2/3의 데이터
mu +/- 2 sigma95%거의 모든 데이터
mu +/- 3 sigma99.7%사실상 전부

실행해보기: 68-95-99.7 시각화

python
import numpy as np import matplotlib.pyplot as plt mu, sigma = 0, 1 x = np.linspace(-4, 4, 500) y = (1 / (sigma * np.sqrt(2 * np.pi))) * np.exp(-0.5 * ((x - mu) / sigma) ** 2) plt.figure(figsize=(10, 6)) plt.plot(x, y, 'k-', linewidth=2) # 3sigma -> 2sigma -> 1sigma (widest first) for k, color, alpha, label in [ (3, '#45B7D1', 0.2, '99.7% (mu +/- 3 sigma)'), (2, '#4ECDC4', 0.3, '95% (mu +/- 2 sigma)'), (1, '#FF6B6B', 0.4, '68% (mu +/- 1 sigma)'), ]: mask = (x >= mu - k*sigma) & (x <= mu + k*sigma) x_k = x[mask] y_k = (1 / (sigma * np.sqrt(2 * np.pi))) * np.exp(-0.5 * ((x_k - mu) / sigma) ** 2) plt.fill_between(x_k, y_k, alpha=alpha, color=color, label=label) for k in [1, 2, 3]: plt.axvline(mu - k*sigma, color='gray', linestyle=':', alpha=0.5) plt.axvline(mu + k*sigma, color='gray', linestyle=':', alpha=0.5) plt.xlabel('x (in standard deviations)', fontsize=13) plt.ylabel('Probability Density', fontsize=13) plt.title('The 68-95-99.7 Rule', fontsize=14, fontweight='bold') plt.legend(fontsize=11, loc='upper right') plt.xticks([-3, -2, -1, 0, 1, 2, 3], ['-3s', '-2s', '-1s', 'mu', '+1s', '+2s', '+3s'], fontsize=11) plt.grid(True, alpha=0.3) plt.tight_layout() plt.show() print('This rule helps you intuitively understand data spread!') print('Example: height with mean=170cm, std=5cm') print(' 68% are between 165-175cm') print(' 95% are between 160-180cm')

5. 실습: 랜덤 데이터 생성과 히스토그램

실행해보기: 정규분포에서 데이터 뽑기

이론이 아니라 실제로 정규분포에서 데이터를 뽑아보겠습니다.

python
import numpy as np import matplotlib.pyplot as plt np.random.seed(42) # 평균 70점, 표준편차 15점인 시험 성적 시뮬레이션 mu = 70 sigma = 15 n_students = 1000 scores = np.random.normal(mu, sigma, n_students) plt.figure(figsize=(10, 6)) # 히스토그램 plt.hist(scores, bins=30, density=True, alpha=0.7, color='#4ECDC4', edgecolor='black', linewidth=0.8, label='Simulated data (n=1000)') # 이론적 정규분포 곡선 x = np.linspace(mu - 4*sigma, mu + 4*sigma, 200) y = (1 / (sigma * np.sqrt(2 * np.pi))) * np.exp(-0.5 * ((x - mu) / sigma) ** 2) plt.plot(x, y, 'r-', linewidth=2.5, label='Theoretical curve') # 평균선 actual_mean = np.mean(scores) plt.axvline(actual_mean, color='blue', linestyle='--', linewidth=2, label=f'Sample mean: {actual_mean:.1f}') plt.xlabel('Test Score', fontsize=13) plt.ylabel('Probability Density', fontsize=13) plt.title('Simulated Test Scores (Normal Distribution)', fontsize=14, fontweight='bold') plt.legend(fontsize=11) plt.grid(True, alpha=0.3) plt.tight_layout() plt.show() # 68-95-99.7 법칙 검증 within_1s = np.sum((scores >= mu - sigma) & (scores <= mu + sigma)) / n_students within_2s = np.sum((scores >= mu - 2*sigma) & (scores <= mu + 2*sigma)) / n_students within_3s = np.sum((scores >= mu - 3*sigma) & (scores <= mu + 3*sigma)) / n_students print('=== 68-95-99.7 Rule Verification ===') print(f'mu +/- 1 sigma ({mu-sigma}~{mu+sigma}): {within_1s:.1%} (theory: 68%)') print(f'mu +/- 2 sigma ({mu-2*sigma}~{mu+2*sigma}): {within_2s:.1%} (theory: 95%)') print(f'mu +/- 3 sigma ({mu-3*sigma}~{mu+3*sigma}): {within_3s:.1%} (theory: 99.7%)') print() print(f'Sample mean: {np.mean(scores):.2f} (target: {mu})') print(f'Sample std: {np.std(scores):.2f} (target: {sigma})')

1000개 데이터만으로도 이론값에 꽤 가깝습니다! 데이터가 많아질수록 이론적 정규분포 곡선에 더 가까워집니다.


6. AI에서 확률분포가 쓰이는 곳

6-1. 가중치 초기화 (Weight Initialization)

신경망 학습의 출발점은 가중치를 랜덤으로 설정하는 것입니다. 이때 정규분포 N(0, 작은 값)에서 뽑습니다.

왜 정규분포일까요?

  • 0 근처에 집중: 초기 가중치가 너무 크면 학습이 불안정해짐
  • 약간의 다양성: 완전히 같으면 뉴런들이 똑같이 학습해버림
  • 대칭: 양수/음수가 균형 있게 나옴

6-2. 생성 AI (Generative AI)

GAN, VAE, Diffusion Model 같은 생성 AI는 정규분포에서 랜덤 노이즈를 뽑아서 이미지/텍스트를 만듭니다. 매번 다른 노이즈가 들어가니 매번 다른 결과가 나오는 것이죠.

6-3. 드롭아웃 (Dropout)

학습 중 뉴런을 랜덤하게 끄는 기법입니다. 각 뉴런이 "이번 라운드에 참여할까?"를 베르누이분포로 결정합니다. (p=0.5면 50% 확률로 꺼짐)

6-4. 다음 단어 예측

ChatGPT는 다음에 올 단어의 확률분포를 계산합니다. "오늘 날씨가" 다음에 "좋다"가 40%, "춥다"가 30%, "덥다"가 20%... 그 확률분포에서 샘플링해서 단어를 고릅니다.

AI 활용사용하는 분포역할
가중치 초기화정규분포학습 시작점 설정
생성 AI (GAN, VAE)정규분포랜덤 노이즈 생성
드롭아웃베르누이분포뉴런 랜덤 비활성화
다음 단어 예측이산 확률분포단어 선택
데이터 증강균등/정규분포랜덤 변환 적용

핵심 요약

분포특징파라미터AI 활용
균등분포모든 결과 확률 동일범위 (a, b)랜덤 초기화, 데이터 증강
베르누이분포성공/실패 두 가지성공확률 p이진분류, 드롭아웃
이항분포베르누이 n번 반복n, p여러 번의 예/아니오 판단
정규분포종 모양, 좌우 대칭mu, sigma가중치 초기화, 생성 AI

학습 체크리스트

  • 확률분포가 "랜덤의 레시피"라는 비유를 설명할 수 있다
  • 이산분포(균등, 베르누이, 이항)의 차이를 안다
  • 정규분포의 두 파라미터(mu, sigma)가 모양을 어떻게 바꾸는지 안다
  • 68-95-99.7 법칙을 설명하고, Python으로 검증할 수 있다
  • AI에서 정규분포가 쓰이는 3가지 이상의 사례를 댈 수 있다

다음 강의 예고

"통계 기초" - 평균, 분산, 상관계수, 정규화, 표준화! 데이터를 요약하고 비교하는 핵심 도구를 배웁니다. Level 2 마지막 강의이니 끝까지 화이팅!

레슨 정보

레벨
Level 2: 수학 기초
예상 소요 시간
3분 17초
참고 영상
YouTube 링크

💡실습 환경 안내

코드 블록의 ▶ 실행 버튼을 누르면 브라우저에서 바로 Python을 실행할 수 있습니다.

별도 설치 없이 NumPy, Matplotlib 등 기본 라이브러리를 사용할 수 있습니다.