카테고리 없음

[본캠프] 데이터기반 QA/QC 부트캠프 29일차

min0jun 2026. 6. 22. 20:03

1. 오늘의 학습 목표

오늘은 크게 통계학 개념과 머신러닝 기초 개념을 함께 학습했다.

통계학에서는 여러 확률분포와 가설검정을 중심으로 배웠고,
머신러닝에서는 회귀분석 평가 지표와 모델 성능을 어떻게 판단하는지에 대해 정리했다.

처음에는 분포, 검정, 회귀 평가 지표가 한 번에 나와서 조금 복잡하게 느껴졌다.
특히 통계학은 이름부터 어려운 개념이 많아서 처음 볼 때는 괜히 더 멀게 느껴지는 것 같다.

그래도 오늘 학습의 목표는 모든 공식을 완벽하게 외우는 것보다는,
각 개념이 어떤 상황에서 사용되는지 이해하는 것에 두었다.

오늘의 학습 목표는 다음과 같다.

  • 회귀분석 모델의 평가 지표를 이해한다.
  • 정규분포, t분포, 카이제곱분포, 이항분포, 푸아송분포의 특징을 구분한다.
  • A/B 테스트와 가설검정의 기본 흐름을 이해한다.
  • p-value, 유의수준, 귀무가설, 대립가설의 의미를 정리한다.
  • 제 1종 오류와 제 2종 오류의 차이를 이해한다.
  • 통계학 개념이 머신러닝 모델 평가와 어떻게 연결되는지 생각해본다.

2. 오늘 학습한 내용

통계학

2-1. 확률분포

통계학에서 분포는 데이터를 이해하는 기본적인 기준이 된다.

처음에는 정규분포, t분포, 카이제곱분포, 이항분포, 푸아송분포처럼 이름이 많이 나와서 조금 헷갈렸다.
그런데 하나씩 정리해보니, 결국 핵심은 데이터가 어떤 형태로 나타나는지 파악하는 것이었다.

분포를 이해하면 데이터가 평균 근처에 몰려 있는지, 한쪽으로 치우쳐 있는지, 특정 사건이 몇 번 발생하는지 등을 설명할 수 있다.


2-2. 정규분포

정규분포는 평균을 중심으로 좌우가 대칭인 종 모양의 분포이다.

일상에서 많이 볼 수 있는 키, 몸무게, 시험 점수 같은 데이터가 정규분포 형태를 따르는 경우가 많다.
대부분의 값은 평균 근처에 모이고, 평균에서 멀어질수록 데이터의 빈도는 줄어든다.

정규분포는 통계학에서 가장 기본이 되는 분포라고 볼 수 있다.

처음에는 “정규분포가 왜 이렇게 중요하지?” 싶었는데,
많은 통계 기법들이 정규분포를 기준으로 만들어져 있어서 기본 개념으로 계속 등장하는 느낌이었다.

import numpy as np
import matplotlib.pyplot as plt
from scipy import stats

normal_dist = np.random.normal(170, 10, 1000)

plt.hist(normal_dist, bins=30, density=True, alpha=0.6, color='g')

xmin, xmax = plt.xlim()
x = np.linspace(xmin, xmax, 100)
p = stats.norm.pdf(x, 170, 10)

plt.plot(x, p, 'k', linewidth=2)
plt.title('normal distribution histogram')
plt.show()

2-3. 긴 꼬리 분포

긴 꼬리 분포는 데이터가 한쪽에 많이 몰려 있고, 반대쪽으로 긴 꼬리가 이어지는 형태이다.

정규분포처럼 좌우가 대칭인 형태가 아니라, 특정 방향으로 치우친 비대칭 분포이다.

예를 들면 소득 분포가 있다.
대부분의 사람은 일정한 소득 구간에 몰려 있지만, 일부 고소득자는 매우 큰 값을 가진다.

온라인 쇼핑몰에서도 비슷한 구조를 볼 수 있다.
소수의 인기 상품이 대부분의 매출을 만들고, 나머지 많은 상품들은 조금씩 판매되는 형태이다.

긴 꼬리 분포는 일부 값이 전체에 큰 영향을 주는 상황을 설명할 때 유용하다.


2-4. t분포

t분포는 표본의 크기가 작고, 모집단의 표준편차를 모를 때 사용하는 분포이다.

정규분포와 모양이 비슷하지만, t분포는 꼬리가 더 두껍다.
이는 표본이 작을수록 불확실성이 크기 때문이다.

자유도가 커질수록 t분포는 정규분포에 가까워진다.
즉, 표본 수가 충분히 많아지면 정규분포와 비슷하게 볼 수 있다.

처음에는 정규분포랑 비슷해 보여서 굳이 따로 배워야 하나 싶었는데,
표본이 작을 때 더 조심스럽게 판단하기 위한 분포라고 생각하니 이해가 조금 쉬웠다.


2-5. 카이제곱분포

카이제곱분포는 주로 범주형 데이터와 관련된 검정에서 사용된다.

대표적으로 독립성 검정과 적합도 검정에서 많이 사용한다.

  • 독립성 검정: 두 범주형 변수가 서로 관련이 있는지 확인
  • 적합도 검정: 관찰된 데이터가 기대한 분포와 잘 맞는지 확인

예를 들어 성별과 흡연 여부가 관련이 있는지 확인하거나,
주사위가 각 면마다 동일한 확률로 나오는지 확인할 때 사용할 수 있다.

카이제곱이라는 이름이 처음에는 꽤 부담스러웠는데,
핵심은 범주별 빈도가 기대한 값과 얼마나 다른지 보는 것이라고 정리할 수 있었다.

import numpy as np
import scipy.stats as stats

observed = [20, 30, 25, 25]
expected = [25, 25, 25, 25]

chi2_stat, p_value = stats.chisquare(observed, f_exp=expected)

print(f"카이제곱 통계량: {chi2_stat}")
print(f"p-value: {p_value}")
observed = np.array([[30, 10], [20, 40]])

chi2_stat, p_value, dof, expected = stats.chi2_contingency(observed)

print(f"카이제곱 통계량: {chi2_stat}")
print(f"p-value: {p_value}")

2-6. 이항분포

이항분포는 결과가 두 가지로 나뉘는 상황에서 사용한다.

예를 들면 성공/실패, 구매/미구매, 앞면/뒷면 같은 경우이다.

동전을 10번 던졌을 때 앞면이 몇 번 나오는지,
광고를 본 고객 100명 중 몇 명이 구매하는지 같은 상황을 생각하면 된다.

이항분포는 연속적인 값이 아니라 특정 정수 값으로 나타난다.
그래서 이산형 분포에 해당한다.


2-7. 푸아송분포

푸아송분포는 일정 시간이나 공간 안에서 어떤 사건이 몇 번 발생하는지를 다룰 때 사용한다.

예를 들면 한 시간 동안 콜센터에 전화가 몇 번 오는지,
하루 동안 특정 웹페이지에서 오류가 몇 번 발생하는지 같은 상황이다.

푸아송분포는 드물게 발생하는 사건의 횟수를 다룰 때 자주 사용된다.

이항분포와 마찬가지로 사건의 발생 횟수를 다루기 때문에 이산형 분포에 해당한다.


2-8. 가설검정

가설검정은 표본 데이터를 바탕으로 모집단에 대한 주장을 검증하는 과정이다.

기본적으로 귀무가설과 대립가설을 세운 뒤,
p-value를 기준으로 귀무가설을 기각할지 판단한다.

  • 귀무가설 H0: 차이가 없다, 효과가 없다
  • 대립가설 H1: 차이가 있다, 효과가 있다

가설검정의 흐름은 다음과 같다.

  1. 귀무가설과 대립가설 설정
  2. 유의수준 설정
  3. 검정통계량 계산
  4. p-value 확인
  5. 결론 도출

p-value는 귀무가설이 참이라고 가정했을 때,
현재 관찰된 결과 또는 그보다 더 극단적인 결과가 나올 확률이다.

일반적으로 p-value가 0.05보다 작으면 귀무가설을 기각한다.

처음에는 p-value 설명이 뭔가 말장난처럼 느껴졌는데,
조금 쉽게 생각하면 **“이 결과가 우연히 나왔다고 보기엔 너무 드문 일인가?”**를 확인하는 과정이라고 볼 수 있다.


2-9. A/B 테스트

A/B 테스트는 두 그룹을 비교해서 어떤 쪽이 더 효과적인지 확인하는 방법이다.

예를 들어 웹사이트 버튼 색상을 A안과 B안으로 나누어 보여주고,
어떤 버튼이 더 높은 클릭률이나 구매 전환율을 만드는지 확인할 수 있다.

A/B 테스트에서 중요한 점은 단순히 숫자가 더 높다고 바로 좋은 결과라고 판단하지 않는 것이다.

B안의 전환율이 더 높게 나왔더라도,
그 차이가 우연히 발생한 것인지 실제로 의미 있는 차이인지 확인해야 한다.

그래서 A/B 테스트에서도 통계적 검정이 필요하다.

import numpy as np
import scipy.stats as stats

group_a = np.random.binomial(1, 0.30, 100)
group_b = np.random.binomial(1, 0.45, 100)

t_stat, p_val = stats.ttest_ind(group_a, group_b)

print(f"T-Statistic: {t_stat}, P-value: {p_val}")

이 부분은 처음엔 단순히 A와 B 중 숫자가 높은 쪽을 고르면 되는 줄 알았다.
그런데 막상 배워보니, 차이가 실제 의미 있는 차이인지 검정하는 과정이 훨씬 중요했다.


2-10. t검정

t검정은 두 집단의 평균 차이가 통계적으로 유의미한지 확인하는 검정 방법이다.

대표적으로 독립표본 t검정과 대응표본 t검정이 있다.

  • 독립표본 t검정: 서로 다른 두 그룹의 평균 비교
  • 대응표본 t검정: 같은 그룹의 전후 평균 비교

예를 들어 A반과 B반의 시험 점수를 비교할 때는 독립표본 t검정을 사용할 수 있다.
반대로 운동 전후 몸무게처럼 같은 사람의 변화를 비교할 때는 대응표본 t검정을 사용할 수 있다.

import scipy.stats as stats

t_stat, p_value = stats.ttest_ind(group_a, group_b)

print(t_stat)
print(p_value)

2-11. 다중검정

다중검정은 여러 가설을 동시에 검정할 때 발생하는 문제이다.

검정을 여러 번 반복하면, 우연히 유의미한 결과가 나올 가능성이 커진다.
즉, 실제로는 차이가 없는데 차이가 있다고 판단하는 제 1종 오류가 증가할 수 있다.

그래서 본페로니 보정 같은 방법을 사용한다.

본페로니 보정은 유의수준을 검정 개수로 나누어 더 엄격하게 판단하는 방식이다.

import numpy as np
import scipy.stats as stats

np.random.seed(42)

group_A = np.random.normal(10, 2, 30)
group_B = np.random.normal(12, 2, 30)
group_C = np.random.normal(11, 2, 30)

p_values = []
p_values.append(stats.ttest_ind(group_A, group_B).pvalue)
p_values.append(stats.ttest_ind(group_A, group_C).pvalue)
p_values.append(stats.ttest_ind(group_B, group_C).pvalue)

alpha = 0.05
adjusted_alpha = alpha / len(p_values)

print(f"본페로니 보정된 유의수준: {adjusted_alpha:.4f}")

처음에는 검정을 많이 하면 더 정확해지는 줄 알았는데,
오히려 많이 할수록 우연히 걸리는 결과가 생길 수 있다는 점이 인상적이었다.


2-12. 제 1종 오류와 제 2종 오류

가설검정에서는 오류를 완전히 피할 수 없다.

그래서 제 1종 오류와 제 2종 오류를 구분해야 한다.

제 1종 오류는 귀무가설이 참인데도 기각하는 오류이다.
즉, 실제로는 효과가 없는데 효과가 있다고 판단하는 경우이다.

제 2종 오류는 귀무가설이 거짓인데도 기각하지 못하는 오류이다.
즉, 실제로는 효과가 있는데 효과가 없다고 판단하는 경우이다.

처음에는 둘이 계속 헷갈렸는데,
제 1종 오류는 “없는 효과를 있다고 착각하는 것”,
제 2종 오류는 “있는 효과를 없다고 놓치는 것”으로 외우면 조금 편했다.

가설검정은 정답을 100% 맞히는 도구라기보다, 오류 가능성을 감수하면서 합리적인 판단을 내리는 과정이다.


머신러닝

2-13. 회귀분석 평가 지표

머신러닝에서는 회귀분석 모델의 성능을 평가하는 지표를 학습했다.

회귀분석은 실제값과 예측값의 차이를 줄이는 것이 핵심이다.
그래서 모델이 잘 예측했는지 확인하려면 오차를 어떻게 계산할지 알아야 한다.

대표적인 회귀 평가 지표는 MSE, RMSE, MAE, R²가 있다.


2-14. MSE

MSE는 평균 제곱 오차이다.

실제값과 예측값의 차이를 구한 뒤, 그 값을 제곱하고 평균을 낸다.
오차를 제곱하기 때문에 큰 오차에 더 민감하게 반응한다.

처음에는 왜 굳이 제곱을 하는지 헷갈렸는데,
음수 오차와 양수 오차가 서로 상쇄되지 않게 만들기 위한 과정이라고 생각하니 이해가 쉬웠다.


2-15. RMSE

RMSE는 MSE에 루트를 씌운 값이다.

MSE는 오차를 제곱하기 때문에 원래 데이터와 단위가 달라진다.
그래서 다시 루트를 씌워 원래 단위와 비슷하게 맞춰준다.

RMSE는 실제 오차 크기를 직관적으로 보고 싶을 때 유용하다.

예를 들어 집값 예측 모델에서 RMSE가 작다면,
모델의 예측값이 실제 집값과 비교적 가깝다고 볼 수 있다.


2-16. MAE

MAE는 평균 절대 오차이다.

실제값과 예측값의 차이에 절댓값을 씌운 뒤 평균을 낸다.
MSE처럼 제곱하지 않기 때문에 큰 오차에 대한 민감도는 상대적으로 낮다.

즉, 이상치의 영향을 조금 덜 받는 평가 지표라고 볼 수 있다.

MSE는 큰 오차를 더 크게 벌주는 느낌이고,
MAE는 전체적인 평균 오차를 비교적 담백하게 보는 느낌이었다.


2-17. R²

R²는 결정계수라고 부른다.

모델이 데이터를 얼마나 잘 설명하는지를 나타내는 지표이다.
값이 1에 가까울수록 모델이 데이터를 잘 설명한다고 볼 수 있다.

다만 R²가 높다고 무조건 좋은 모델이라고 판단하면 안 된다.
데이터 상황이나 모델의 복잡도도 함께 봐야 한다.

그래도 회귀분석 모델의 설명력을 확인할 때 기본적으로 많이 사용되는 지표이다.


2-18. 통계학과 머신러닝의 연결

오늘 학습하면서 통계학과 머신러닝이 완전히 따로 떨어진 개념은 아니라는 생각이 들었다.

통계학에서는 표본을 바탕으로 모집단을 추론하고,
머신러닝에서는 데이터를 바탕으로 새로운 값을 예측한다.

방향은 조금 다르지만 둘 다 데이터를 보고 판단한다는 점은 같다.

특히 가설검정이나 p-value 같은 개념은 데이터 분석에서 결과를 해석할 때 필요하고,
회귀 평가 지표는 머신러닝 모델이 얼마나 잘 예측하는지 판단할 때 필요하다.

통계학은 데이터를 해석하는 기준을 잡아주고, 머신러닝은 데이터를 바탕으로 예측하는 방법을 제공한다.


3. 나의 간단 소감

오늘은 통계학과 머신러닝 개념을 함께 학습해서 내용이 꽤 많았다.

처음에는 분포 이름도 많고 검정 방법도 많아서 조금 정신이 없었다.
정규분포까지는 익숙한 느낌이 있었는데, t분포, 카이제곱분포, 푸아송분포까지 나오니까 머릿속에서 살짝 섞이는 느낌이었다.

그래도 하나씩 정리하다 보니 공식보다 중요한 건 따로 있었다.

각 개념이 어떤 상황에서 쓰이는지 아는 것.

정규분포는 평균 중심의 데이터,
t분포는 표본이 작을 때의 평균 비교,
카이제곱검정은 범주형 데이터,
이항분포는 성공과 실패,
푸아송분포는 일정 시간 안의 사건 발생 횟수처럼 생각하니 훨씬 정리가 잘 됐다.

머신러닝 쪽에서는 회귀 평가 지표가 인상적이었다.
MSE, RMSE, MAE, R²가 처음에는 다 비슷한 오차 지표처럼 보였는데,
막상 비교해보니 각각 보는 관점이 조금씩 달랐다.

특히 RMSE는 단위를 다시 맞춰준다는 점에서 실제 해석이 더 직관적으로 느껴졌다.

오늘 내용은 한 번에 완전히 익숙해지기는 어려운 내용이었다.
그래도 직접 정리하면서 통계학과 머신러닝이 어떻게 연결되는지 조금은 보이기 시작했다.

결국 데이터 분석에서는 단순히 코드를 돌리는 것보다,
결과를 어떤 기준으로 해석하고 판단할지 아는 것이 중요하다는 생각이 들었다.

아직 p-value나 다중검정 같은 부분은 더 연습이 필요하지만,
오늘은 적어도 통계학과 머신러닝을 각각 어떤 관점으로 봐야 하는지 감을 잡은 하루였다.