본문 바로가기
데이터 사이언스 코딩/Python 프로그래밍

정규분포 통계 머신러닝 표준정규분포 확률밀도함수 평균 표준편차 시각화 데이터샘플링 히스토그램

by 윤슬새벽 2025. 7. 9.
반응형

✅ 정규분포 PDF 함수 구현 및 시각화 코드 (주석 포함)

import numpy as np
import matplotlib.pyplot as plt
import platform
import matplotlib.font_manager as fm

# ✅ 한글 폰트 설정
if platform.system() == 'Windows':
    plt.rc('font', family='Malgun Gothic')
elif platform.system() == 'Darwin':
    plt.rc('font', family='AppleGothic')
else:
    plt.rc('font', family='NanumGothic')
plt.rcParams['axes.unicode_minus'] = False

# 정규분포 PDF 함수 정의
def f(x, mu, sigma):
    return (1 / (sigma * np.sqrt(2 * np.pi))) * np.exp(-((x - mu)**2) / (2 * sigma**2))

# 평균과 표준편차
mu, sigma = 0, 1

# x 범위와 PDF 계산
x = np.linspace(-4, 4, 1000)
y = f(x, mu, sigma)

# 샘플 데이터 생성
samples = np.random.normal(mu, sigma, 1000)

# 그래프 그리기
plt.figure(figsize=(10, 6))
plt.plot(x, y, label="PDF (정규분포)", color='blue')
plt.hist(samples, bins=30, density=True, alpha=0.5, label="샘플 히스토그램", color='orange')
plt.title("정규분포 PDF와 샘플 데이터 비교")
plt.xlabel("x 값")
plt.ylabel("확률 밀도")
plt.legend()
plt.grid(True)
plt.tight_layout()
plt.show()

🔍 실행 결과 해석

  • 파란 곡선: 직접 구현한 정규분포 PDF — 이론적인 모델
  • 주황색 히스토그램: 실제 생성한 1000개의 난수 분포
  • 두 그래프가 거의 일치하면, np.random.normal()이 정규분포를 잘 따르고 있다는 뜻입니다.

위 그래프는 **직접 구현한 정규분포 확률 밀도 함수(PDF)**와 np.random.normal()로 생성한 샘플 데이터의 히스토그램을 비교한 결과입니다.

📌 구성 설명:

  • 파란 선 (PDF): 평균 0, 표준편차 1인 정규분포의 이론적 곡선입니다.
  • 주황색 히스토그램: 1000개의 난수를 표준 정규분포에서 추출한 실제 데이터 분포입니다.
  • 두 그래프는 유사한 종(bell) 모양을 나타내며, 이론적 곡선과 실제 샘플의 일치 여부를 시각적으로 검증할 수 있습니다.

💡 참고: 그래프 제목, 라벨 등에 한글이 깨진 것은 런타임 환경에서 한글 폰트(예: NanumGothic, Malgun Gothic)가 없기 때문입니다. 실제 로컬 환경에서 실행 시 plt.rc('font', family='Malgun Gothic') 같은 설정을 추가해주면 한글이 잘 표시됩니다.


 

✅ 왜 정규분포를 많이 사용할까?

1. 자연현상에서 정규분포가 자주 나타남

  • 키, 몸무게, 시험 점수, 노이즈 등 다양한 실세계 데이터가 대부분 평균 근처에 몰리고 양 끝이 점점 줄어드는 형태를 보입니다 → 바로 정규분포입니다.
  • 이는 중심극한정리(Central Limit Theorem)에 의해 설명됩니다.
  • "여러 독립적인 랜덤 변수의 평균은 정규분포에 수렴한다."

✅ 지금 작성한 코드의 핵심

🔷 f(x, mu, sigma)

  • 정규분포의 확률 밀도 함수(PDF) 직접 구현
  • 이론적인 곡선을 그릴 수 있음 → 종모양 확인 가능
def f(x, mu, sigma):
    return (1 / (sigma * np.sqrt(2 * np.pi))) * np.exp(-((x - mu)**2) / (2 * sigma**2))

🔷 samples = np.random.normal(mu, sigma, 1000)

  • 정규분포에서 샘플링한 실제 데이터
  • 실제 데이터가 PDF와 잘 일치하는지 히스토그램으로 시각화 가능

✅ 시각화 결과의 의미

plt.plot(x, y)              # 이론적 PDF (종모양)
plt.hist(samples, density=True)  # 샘플 데이터 히스토그램
  • 이 두 그래프가 잘 일치하면, np.random.normal()로 생성한 데이터가 실제 정규분포를 따른다는 것을 직관적으로 확인할 수 있습니다.

✅ 정규분포는 어디에 쓰이는가?

분야 사용 예시
통계 평균, 표준편차 분석, 신뢰구간 계산
머신러닝 노이즈 생성, 가우시안 모델, 베이지안 추론
신호처리 측정 오차 모델링
금융공학 주가 수익률 모델링 등

 

반응형