본문 바로가기
AI/참고자료

[AI] 확률·통계와 머신러닝

by SeungyubLee 2025. 10. 23.

※ 머신러닝은 "불확실한 세상에서 판단하는 기술"

머신러닝은 현실 세계의 불확실한 상황 속에서 예측을 내리는 기술이다.
이메일이 스팸일 확률은 얼마일까?, 내일 비가 올 가능성은 얼마나 될까?, 이 고객이 제품을 살 확률은 얼마나 될까?
머신러닝은 항상 "정답이 확실하지 않은 세상"에서 일한다.
그래서 '확률'과 '통계'가 세상을 이해하고 추론하는 언어가 되는 것이다.

※ 확률 : "세상은 완벽하지 않다"를 수로 표현하는 도구

확률은 불확실한 사건이 일어날 가능성을 수로 표현한다.
예를 들어,
어떤 이메일이 스팸일 확률이 80%라면, "100통 중 80통 정도는 스팸일 것"이라고 추측하는 것이다.
머신러닝은 이런 확률적 판단을 통해 결정을 내린다.

예시 확률적 사고
스팸 메일 분류 스팸일 확률이 0.9 → 스팸으로 판단
자율주행 앞에 사람이 있을 확률이 0.95 → 브레이크 작동
추천 시스템 이 영화를 좋아할 확률이 0.8 → 추천 목록에 추가

 

즉, 확률은 예측의 핵심 언어이다.

통계 : "데이터로 세상을 이해하는 기술"

통계는 "과거 데이터에서 패턴을 찾아내는 기술"이다.
확률이 "미래의 가능성"이라면, 통계는 "과거의 데이터 분석"이다.
예를 들어,
1,000명의 고객 데이터를 보고, 어떤 사람들이 구매를 많이 하는지 알아내는 것
광고를 봤을 때 클릭률이 얼마나 증가했는지 측정하는 것
이런 것들이 모두 통계적 분석이다.

쉽게 말하면, 확률은 "미래를 예측"하고, 통계는 "과거를 해석"한다.

머신러닝에서 확률·통계가 쓰이는 실제 예시

구분 사용 예시 설명
확률 스팸 필터 이메일 단어 출현 확률(예 : "당첨", "무료")로 스팸 여부 판단
통계 모델 학습 과거 데이터 평균·분산을 보고, 이상치(outlier)나 패턴을 파악
확률 + 통계 베이즈 정리 "새로운 데이터가 들어왔을 때 확률을 다시 계산"
통계적 모델링 회귀분석 "광고비를 늘리면 매출이 얼마나 오를까?" 예측

의사가 병을 진단하는 경우를 예로

환자가 병에 걸렸을 확률을 예측하는 상황을 생각해보자

확률적 판단 :
검사 결과가 양성이 나왔다고 해서 100% 병이라는 뜻은 아니다. 병에 걸렸을 확률을 계산해야 한다. → 확률이 사용됨

통계적 판단 :
과거에 수천 명의 환자 데이터를 분석해서 어떤 증상 조합이 병과 관련 있는지 알아낸다. → 통계가 사용됨

결과적으로, 머신러닝은 확률로 예측하고, 통계로 근거를 세우는 기술이다.

 요약

확률"미래를 예측"하고, 통계"과거를 해석"한다.
머신러닝은 이 둘을 이용해 불확실한 세상 속에서 "가장 그럴듯한 답"을 찾아내는 기술이다.


1) 확률·통계 기본 개념


2) 확률·통계 기본 수식


3) 기본 수식 활용 파이썬 코드

import numpy as np
from scipy.stats import norm

# 1) 기댓값과 분산
X = np.array([1, 2, 3, 4, 5])
p = np.array([0.1, 0.2, 0.4, 0.2, 0.1])
E = np.sum(X * p)
Var = np.sum((X - E)**2 * p)
print("E[X] =", E)
print("Var(X) =", Var)

# 2) 공분산과 상관계수
Y = np.array([2, 4, 6, 8, 10])
cov = np.cov(X, Y, bias=True)[0, 1]
corr = np.corrcoef(X, Y)[0, 1]
print("Cov(X, Y) =", cov)
print("Corr(X, Y) =", corr)

# 3) 정규분포 PDF 값
mu, sigma = 0, 1
xs = np.linspace(-3, 3, 7)
pdf_values = norm.pdf(xs, mu, sigma)
print("Normal PDF values:", np.round(pdf_values, 3))

# 4) 베이즈 정리 예시
P_A = 0.01
P_B_given_A = 0.9
P_B_given_notA = 0.05
P_B = P_B_given_A * P_A + P_B_given_notA * (1 - P_A)
P_A_given_B = (P_B_given_A * P_A) / P_B
print("P(A|B) =", round(P_A_given_B, 3))

4) 머신러닝에 필요한 수식


5) 머신러닝에 필요한 수식 활용 파이썬 코드

▶ 로그우도와 최대우도추정(MLE)

import numpy as np
from scipy.stats import norm

rng = np.random.default_rng(42)
data = rng.normal(loc=5, scale=2, size=200)

def log_likelihood(mu, sigma, data):
    return np.sum(norm.logpdf(data, mu, sigma))

mus = np.linspace(3, 7, 100)
ll_vals = [log_likelihood(m, 2, data) for m in mus]
mu_hat = mus[np.argmax(ll_vals)]
print("MLE mu =", round(mu_hat, 3))

 

크로스엔트로피 손실 (이진분류)

import numpy as np

y = np.array([1, 0, 1, 1, 0])
y_hat = np.array([0.9, 0.2, 0.8, 0.7, 0.1])

eps = 1e-12
cross_entropy = -np.mean(y * np.log(y_hat + eps) + (1 - y) * np.log(1 - y_hat + eps))
print("Cross Entropy Loss =", round(cross_entropy, 4))

 

정규분포 기반 회귀의 확률적 해석

import numpy as np
from scipy.stats import norm

rng = np.random.default_rng(1)
X = rng.normal(size=(100, 1))
true_w, sigma = 2.0, 0.5
y = true_w * X[:, 0] + rng.normal(scale=sigma, size=100)

w_hat = np.sum(X[:, 0] * y) / np.sum(X[:, 0] ** 2)
print("MLE w =", round(w_hat, 3))

y_pred = w_hat * X[:, 0]
log_likelihood = np.sum(norm.logpdf(y, y_pred, sigma))
print("Log-Likelihood =", round(log_likelihood, 2))

 

KL Divergence 계산

import numpy as np

P = np.array([0.1, 0.4, 0.5])
Q = np.array([0.2, 0.3, 0.5])

KL = np.sum(P * np.log((P + 1e-12) / (Q + 1e-12)))
print("KL Divergence =", round(KL, 4))

 

엔트로피 계산

import numpy as np

p = np.array([0.1, 0.1, 0.8])
entropy = -np.sum(p * np.log2(p))
print("Entropy =", round(entropy, 3), "bits")

p_uniform = np.ones(3) / 3
entropy_uniform = -np.sum(p_uniform * np.log2(p_uniform))
print("Uniform Entropy =", round(entropy_uniform, 3), "bits")