본 콘텐츠의 이미지 및 내용은 AI로 생성되었습니다.
본 콘텐츠의 이미지 및 내용을 무단으로 복제, 배포, 수정하여 사용할 경우 저작권법에 의해 법적 제재를 받을 수 있습니다.
이미지 로딩 중...
AI Generated
2025. 11. 28. · 19 Views
통계량과 추정 완벽 가이드
데이터 분석의 기초가 되는 통계량과 추정 개념을 Python 코드와 함께 배웁니다. 평균부터 신뢰구간까지, 개발자가 알아야 할 핵심 통계 개념을 실무 예제로 쉽게 설명합니다.
목차
1. 평균 중앙값 최빈값
김개발 씨는 이커머스 회사에서 일하는 주니어 개발자입니다. 어느 날 팀장님이 "지난달 고객 구매 금액의 평균을 뽑아줘"라고 요청했습니다.
김개발 씨는 자신 있게 평균을 계산했지만, 결과를 본 팀장님의 표정이 묘하게 일그러졌습니다. "이 평균이 정말 우리 고객들의 평균적인 모습을 보여주는 걸까?"
평균, 중앙값, 최빈값은 데이터의 중심 경향을 나타내는 세 가지 대표값입니다. 마치 학급의 대표 학생을 뽑는 것처럼, 수많은 데이터 중에서 "이 데이터가 전체를 대표합니다"라고 말할 수 있는 값을 찾는 것입니다.
상황에 따라 어떤 대표값을 사용하느냐에 따라 데이터 해석이 완전히 달라질 수 있습니다.
다음 코드를 살펴봅시다.
import numpy as np
from scipy import stats
# 고객 구매 금액 데이터 (단위: 원)
purchase_amounts = [15000, 22000, 18000, 25000, 19000,
21000, 500000, 17000, 23000, 20000]
# 평균: 모든 값을 더해서 개수로 나눔
mean_value = np.mean(purchase_amounts)
print(f"평균: {mean_value:,.0f}원") # 68,000원
# 중앙값: 정렬 후 가운데 값
median_value = np.median(purchase_amounts)
print(f"중앙값: {median_value:,.0f}원") # 20,500원
# 최빈값: 가장 자주 나타나는 값
mode_result = stats.mode(purchase_amounts, keepdims=True)
print(f"최빈값: {mode_result.mode[0]:,}원")
김개발 씨는 입사한 지 3개월 된 주니어 개발자입니다. 오늘 팀장님이 고객 분석 리포트를 요청했습니다.
"지난달 구매 금액 평균 좀 뽑아줄래?" 간단한 요청이라 생각한 김개발 씨는 곧바로 결과를 제출했습니다. 그런데 팀장님의 반응이 이상했습니다.
"평균이 68,000원이라고? 우리 고객 대부분은 2만 원대에서 구매하는데?" 김개발 씨가 데이터를 다시 살펴보니, 50만 원짜리 구매 건이 하나 있었습니다.
이 한 건이 전체 평균을 크게 끌어올린 것입니다. 선배 개발자 박시니어 씨가 다가와 화면을 보더니 고개를 끄덕였습니다.
"아, 이럴 때는 중앙값을 써야 해요. 평균은 이상치에 민감하거든요." 그렇다면 평균, 중앙값, 최빈값은 정확히 무엇이 다를까요?
평균은 마치 시소의 균형점과 같습니다. 모든 아이들이 시소에 앉았을 때, 시소가 균형을 이루는 지점이 바로 평균입니다.
무거운 아이가 한쪽 끝에 앉으면 균형점도 그쪽으로 기울어집니다. 이처럼 평균은 극단적인 값의 영향을 크게 받습니다.
중앙값은 줄 세우기를 했을 때 정확히 가운데 서 있는 사람입니다. 키가 아무리 큰 사람이 줄 끝에 서 있어도, 가운데 사람의 위치는 변하지 않습니다.
그래서 이상치의 영향을 받지 않습니다. 최빈값은 가장 인기 있는 답입니다.
"오늘 점심 뭐 먹을까요?"라고 물었을 때 가장 많은 표를 받은 메뉴가 최빈값입니다. 연속형 데이터보다는 범주형 데이터에서 더 유용하게 쓰입니다.
위의 코드를 살펴보겠습니다. 먼저 구매 금액 리스트를 만들었습니다.
대부분 15,000원에서 25,000원 사이인데, 500,000원짜리가 하나 섞여 있습니다. np.mean 함수로 평균을 계산하면 68,000원이 나옵니다.
하지만 np.median으로 중앙값을 계산하면 20,500원입니다. 어떤 값이 더 현실을 반영할까요?
실제 현업에서는 상황에 따라 적절한 대표값을 선택해야 합니다. 연봉 통계를 발표할 때 중앙값을 사용하는 이유도 같습니다.
억대 연봉자 몇 명이 평균을 크게 왜곡할 수 있기 때문입니다. 주의할 점도 있습니다.
초보 개발자들이 흔히 하는 실수는 무조건 평균만 사용하는 것입니다. 데이터 분포를 먼저 확인하지 않고 평균만 보고하면, 잘못된 의사결정으로 이어질 수 있습니다.
히스토그램이나 박스플롯으로 분포를 먼저 확인하는 습관을 들이세요. 다시 김개발 씨의 이야기로 돌아가 봅시다.
박시니어 씨의 조언을 듣고 중앙값과 함께 보고한 김개발 씨. 팀장님은 만족스러운 표정으로 고개를 끄덕였습니다.
"이제야 우리 고객이 보이네!"
실전 팁
💡 - 데이터에 이상치가 있다면 중앙값을 우선 고려하세요
- 평균을 보고할 때는 표준편차도 함께 제시하면 더 정확한 정보를 전달할 수 있습니다
2. 분산과 표준편차
김개발 씨가 두 개의 서버 응답 시간 데이터를 비교하고 있습니다. 두 서버 모두 평균 응답 시간은 100ms로 똑같았습니다.
"둘 다 성능이 같네"라고 보고하려던 순간, 박시니어 씨가 말했습니다. "잠깐, 분산은 확인해 봤어요?"
분산과 표준편차는 데이터가 평균으로부터 얼마나 흩어져 있는지를 나타내는 지표입니다. 마치 같은 평균 점수를 받은 두 학생이 있어도, 한 학생은 매번 비슷한 점수를 받고 다른 학생은 들쑥날쑥할 수 있는 것과 같습니다.
평균만으로는 알 수 없는 데이터의 안정성을 보여줍니다.
다음 코드를 살펴봅시다.
import numpy as np
# 서버 A: 안정적인 응답 시간
server_a = [98, 102, 99, 101, 100, 99, 101, 100, 102, 98]
# 서버 B: 불안정한 응답 시간
server_b = [50, 150, 80, 120, 60, 140, 90, 110, 70, 130]
# 평균은 둘 다 100ms로 동일
print(f"서버 A 평균: {np.mean(server_a)}ms")
print(f"서버 B 평균: {np.mean(server_b)}ms")
# 분산: 편차 제곱의 평균
var_a = np.var(server_a, ddof=1) # 표본분산
var_b = np.var(server_b, ddof=1)
print(f"서버 A 분산: {var_a:.2f}") # 약 2.22
print(f"서버 B 분산: {var_b:.2f}") # 약 1222.22
# 표준편차: 분산의 제곱근 (원래 단위로 해석 가능)
std_a = np.std(server_a, ddof=1)
std_b = np.std(server_b, ddof=1)
print(f"서버 A 표준편차: {std_a:.2f}ms") # 약 1.49ms
print(f"서버 B 표준편차: {std_b:.2f}ms") # 약 34.96ms
김개발 씨는 서버 성능 비교 보고서를 작성하고 있었습니다. 서버 A와 서버 B, 두 대의 서버 응답 시간을 분석한 결과 둘 다 평균 100ms였습니다.
"성능이 같으니 아무거나 써도 되겠네"라고 결론 짓는 순간, 박시니어 씨가 옆에서 데이터를 들여다보았습니다. "김개발 씨, 서버 B 데이터 좀 보세요.
50ms일 때도 있고 150ms일 때도 있네요. 이러면 사용자 경험이 들쭉날쭉하지 않을까요?" 그제야 김개발 씨도 깨달았습니다.
평균은 같아도 데이터의 흩어진 정도가 완전히 다른 것입니다. 분산은 마치 다트 게임과 같습니다.
두 사람이 각각 10번씩 다트를 던졌는데, 둘 다 평균적으로 과녁 중심 근처에 맞췄다고 가정해봅시다. 그런데 한 사람은 모든 다트가 중심 가까이에 모여 있고, 다른 사람은 과녁 전체에 흩어져 있다면요?
평균 위치는 같아도 실력은 다른 것입니다. 분산을 계산하는 방법은 다음과 같습니다.
먼저 각 데이터에서 평균을 뺍니다. 이것을 편차라고 합니다.
그런데 편차를 그냥 더하면 양수와 음수가 상쇄되어 0이 됩니다. 그래서 편차를 제곱해서 모두 양수로 만든 뒤 평균을 냅니다.
이것이 분산입니다. 표준편차는 분산에 제곱근을 씌운 값입니다.
왜 이런 과정이 필요할까요? 분산은 원래 단위를 제곱한 단위를 갖기 때문입니다.
응답 시간의 분산은 ms의 제곱이라는 이상한 단위가 됩니다. 제곱근을 씌우면 다시 ms 단위로 돌아와서 직관적으로 해석할 수 있습니다.
코드를 살펴보면, np.var 함수로 분산을, np.std 함수로 표준편차를 계산합니다. 여기서 ddof=1은 표본분산을 계산하라는 의미입니다.
모집단 전체가 아닌 표본 데이터를 분석할 때는 ddof=1을 사용해야 편향되지 않은 추정값을 얻을 수 있습니다. 결과를 보면 서버 A의 표준편차는 약 1.49ms이고, 서버 B는 약 34.96ms입니다.
서버 A는 응답 시간이 매우 안정적이고, 서버 B는 불안정하다는 것을 알 수 있습니다. 실무에서 표준편차는 다양하게 활용됩니다.
품질 관리에서는 제품 규격의 허용 오차를 표준편차로 정의합니다. 금융에서는 투자 수익률의 변동성을 측정합니다.
서버 모니터링에서는 응답 시간의 안정성을 파악합니다. 주의할 점이 있습니다.
분산과 표준편차는 이상치에 민감합니다. 극단적인 값이 하나만 있어도 분산이 크게 늘어납니다.
데이터에 이상치가 있다면 먼저 처리하고 계산하거나, 사분위 범위(IQR) 같은 대안적인 지표를 고려해야 합니다. 김개발 씨는 보고서를 수정했습니다.
"두 서버 모두 평균 응답 시간은 100ms이나, 서버 A는 표준편차 1.49ms로 매우 안정적이고, 서버 B는 표준편차 34.96ms로 불안정합니다. 사용자 경험 일관성을 위해 서버 A를 권장합니다."
실전 팁
💡 - 평균을 보고할 때는 항상 표준편차도 함께 제시하세요
- ddof 파라미터를 주의하세요. 표본 데이터라면 ddof=1, 모집단 전체라면 ddof=0을 사용합니다
3. 공분산과 상관계수
마케팅팀에서 김개발 씨에게 요청이 들어왔습니다. "광고비를 늘리면 매출도 늘어나는지 데이터로 확인해 줄 수 있어요?" 김개발 씨는 두 변수 사이의 관계를 어떻게 숫자로 표현해야 할지 고민에 빠졌습니다.
공분산과 상관계수는 두 변수 사이의 관계를 측정하는 지표입니다. 마치 키가 크면 체중도 많이 나가는 경향이 있는 것처럼, 한 변수가 변할 때 다른 변수도 함께 변하는 패턴을 수치화합니다.
상관계수는 -1에서 1 사이의 값으로 관계의 방향과 강도를 동시에 보여줍니다.
다음 코드를 살펴봅시다.
import numpy as np
# 월별 광고비 (만원)
ad_cost = [100, 150, 200, 250, 300, 350, 400, 450, 500, 550]
# 월별 매출 (만원)
sales = [1200, 1350, 1500, 1800, 1750, 2100, 2000, 2400, 2300, 2700]
# 공분산: 두 변수가 함께 변하는 정도
covariance = np.cov(ad_cost, sales, ddof=1)[0, 1]
print(f"공분산: {covariance:,.0f}")
# 상관계수: 공분산을 정규화 (-1 ~ 1)
correlation = np.corrcoef(ad_cost, sales)[0, 1]
print(f"상관계수: {correlation:.4f}") # 약 0.98
# 해석: 0.98은 매우 강한 양의 상관관계
# 광고비가 늘면 매출도 늘어나는 경향이 뚜렷함
if correlation > 0.7:
print("강한 양의 상관관계가 있습니다")
elif correlation < -0.7:
print("강한 음의 상관관계가 있습니다")
else:
print("뚜렷한 상관관계가 없습니다")
김개발 씨는 마케팅팀의 요청을 받고 고민에 빠졌습니다. 광고비와 매출 데이터는 있는데, 둘 사이에 정말 관계가 있는지 어떻게 증명할 수 있을까요?
박시니어 씨가 커피를 건네며 말했습니다. "상관계수를 구해보면 돼요.
두 변수 사이의 관계를 하나의 숫자로 표현할 수 있거든요." 공분산부터 이해해봅시다. 공분산은 마치 두 친구의 시험 성적 변화를 관찰하는 것과 같습니다.
한 친구 성적이 오를 때 다른 친구 성적도 오르면, 둘은 함께 변하는 경향이 있습니다. 공분산은 이런 함께 변하는 정도를 측정합니다.
공분산의 부호는 관계의 방향을 알려줍니다. 양수면 한 변수가 증가할 때 다른 변수도 증가하는 경향이 있습니다.
음수면 한 변수가 증가할 때 다른 변수는 감소하는 경향이 있습니다. 하지만 공분산에는 문제가 있습니다.
값의 크기가 변수의 단위에 따라 달라집니다. 광고비를 원 단위로 바꾸면 공분산 값도 크게 달라집니다.
비교가 어려워지는 것입니다. 이 문제를 해결한 것이 상관계수입니다.
상관계수는 공분산을 각 변수의 표준편차로 나누어 정규화한 값입니다. 덕분에 항상 -1에서 1 사이의 값을 갖습니다.
상관계수의 해석은 직관적입니다. 1에 가까우면 강한 양의 상관관계, -1에 가까우면 강한 음의 상관관계, 0에 가까우면 상관관계가 거의 없다는 의미입니다.
일반적으로 절댓값이 0.7 이상이면 강한 상관관계로 봅니다. 코드를 살펴보면, np.cov 함수가 공분산 행렬을 반환합니다.
반환값은 2x2 행렬인데, 대각선은 각 변수의 분산이고 비대각선 요소가 공분산입니다. np.corrcoef 함수는 상관계수 행렬을 반환하며, 마찬가지로 비대각선 요소가 우리가 원하는 상관계수입니다.
결과를 보면 상관계수가 약 0.98입니다. 매우 강한 양의 상관관계입니다.
광고비와 매출 사이에 뚜렷한 관계가 있다고 말할 수 있습니다. 그러나 주의해야 할 점이 있습니다.
상관관계는 인과관계가 아닙니다. 광고비와 매출이 함께 증가한다고 해서 광고비 때문에 매출이 늘었다고 단정할 수 없습니다.
계절적 요인이나 제3의 변수가 둘 다에 영향을 미쳤을 수도 있습니다. 또 다른 주의점은 상관계수가 선형 관계만 측정한다는 것입니다.
두 변수가 곡선 형태의 관계를 가지면 상관계수가 0에 가깝게 나올 수 있습니다. 산점도를 먼저 그려보는 것이 좋습니다.
김개발 씨는 분석 결과를 마케팅팀에 전달했습니다. "광고비와 매출 사이에 상관계수 0.98로 매우 강한 양의 상관관계가 있습니다.
다만 이것이 인과관계를 의미하지는 않으므로, 추가적인 실험 설계가 필요합니다."
실전 팁
💡 - 상관계수를 계산하기 전에 산점도를 먼저 그려보세요. 비선형 관계는 상관계수로 파악되지 않습니다
- 상관관계와 인과관계를 혼동하지 마세요. 인과관계 증명에는 통제된 실험이 필요합니다
4. 모집단과 표본
신입 개발자 최신입 씨가 김개발 씨에게 질문했습니다. "선배, 우리 앱 사용자 만족도를 조사하려고 하는데요.
500만 명 전체한테 설문을 보내야 할까요?" 김개발 씨는 웃으며 대답했습니다. "그건 불가능하고, 할 필요도 없어요.
표본 조사라는 게 있거든."
모집단은 우리가 알고 싶은 전체 대상이고, 표본은 그중 일부를 추출한 것입니다. 마치 수프 맛을 보기 위해 냄비 전체를 마실 필요 없이 한 숟갈만 떠보는 것과 같습니다.
핵심은 표본이 모집단을 잘 대표해야 한다는 것입니다.
다음 코드를 살펴봅시다.
import numpy as np
# 모집단: 앱 전체 사용자의 만족도 (실제로는 알 수 없음)
# 여기서는 시뮬레이션을 위해 생성
np.random.seed(42)
population = np.random.normal(loc=7.2, scale=1.5, size=5000000)
# 표본 추출: 무작위로 1000명 선택
sample = np.random.choice(population, size=1000, replace=False)
# 모집단 모수 (실제로는 알 수 없는 값)
pop_mean = np.mean(population)
pop_std = np.std(population)
print(f"모집단 평균(μ): {pop_mean:.2f}")
print(f"모집단 표준편차(σ): {pop_std:.2f}")
# 표본 통계량 (우리가 계산할 수 있는 값)
sample_mean = np.mean(sample)
sample_std = np.std(sample, ddof=1)
print(f"표본 평균(x̄): {sample_mean:.2f}")
print(f"표본 표준편차(s): {sample_std:.2f}")
# 표본 평균은 모집단 평균의 추정치가 됨
print(f"추정 오차: {abs(pop_mean - sample_mean):.3f}")
최신입 씨는 사용자 만족도 조사를 맡게 되었습니다. 우리 앱 사용자 500만 명 모두에게 설문을 보내면 정확한 결과를 얻을 수 있겠지만, 현실적으로 불가능합니다.
비용, 시간, 응답률 문제가 있기 때문입니다. 김개발 씨가 설명했습니다.
"우리가 알고 싶은 건 모집단의 특성이에요. 여기서 모집단은 500만 명 전체죠.
하지만 전수조사는 어려우니까 일부만 뽑아서 조사해요. 이게 표본이에요." 비유하자면 이렇습니다.
어머니가 된장찌개 간을 볼 때 냄비 전체를 다 마시지 않습니다. 국물을 잘 저어서 섞은 뒤 한 숟갈만 떠서 맛을 봅니다.
그 한 숟갈이 표본입니다. 핵심은 잘 섞어야 한다는 것입니다.
위에 뜬 맹물만 떠면 간이 안 된 것처럼 느껴질 테니까요. 통계에서도 마찬가지입니다.
표본이 모집단을 잘 대표해야 합니다. 이를 위해 무작위 추출을 합니다.
특정 그룹에 편향되지 않게 무작위로 뽑아야 합니다. 코드에서는 시뮬레이션을 위해 500만 명의 모집단을 생성했습니다.
평균 7.2, 표준편차 1.5인 정규분포를 따르는 만족도 점수입니다. 실제로는 이 값을 알 수 없지만, 시뮬레이션에서는 비교를 위해 생성합니다.
np.random.choice 함수로 1000명의 표본을 무작위 추출합니다. replace=False는 한 번 뽑힌 사람은 다시 뽑히지 않는다는 의미입니다.
결과를 보면 모집단 평균은 7.20이고, 표본 평균은 7.17입니다. 약 0.03의 오차가 있지만, 1000명만으로도 500만 명의 특성을 꽤 정확하게 추정했습니다.
이것이 표본 추출의 힘입니다. 여기서 중요한 개념이 있습니다.
모집단의 특성을 모수라고 하고, 표본의 특성을 통계량이라고 합니다. 모집단 평균은 그리스 문자 μ(뮤)로, 표본 평균은 x̄(엑스 바)로 표기합니다.
우리가 할 수 있는 것은 통계량을 계산해서 모수를 추정하는 것입니다. 표본 크기가 클수록 추정은 더 정확해집니다.
하지만 무한정 키울 수는 없으니, 적절한 표본 크기를 결정하는 것도 중요한 기술입니다. 주의해야 할 점은 표본 편향입니다.
만약 앱을 자주 사용하는 사람들만 설문에 응답한다면, 만족도가 실제보다 높게 나올 수 있습니다. 무작위 추출과 높은 응답률이 중요한 이유입니다.
최신입 씨는 고개를 끄덕였습니다. "그럼 1000명만 무작위로 뽑아서 설문을 보내면 되겠네요?"
실전 팁
💡 - 표본 크기가 클수록 추정이 정확해지지만, 비용과 시간도 늘어납니다. 적절한 균형을 찾으세요
- 무작위 추출이 핵심입니다. 편향된 표본은 아무리 커도 잘못된 결론을 낳습니다
5. 중심극한정리
김개발 씨가 통계 책을 읽다가 중심극한정리라는 개념을 만났습니다. "표본 평균의 분포는 정규분포에 수렴한다"라는 설명을 봤는데, 도대체 무슨 말일까요?
박시니어 씨에게 물어보기로 했습니다.
중심극한정리는 모집단이 어떤 분포를 따르든, 충분히 큰 표본을 여러 번 추출해서 각 표본의 평균을 구하면, 그 평균들의 분포는 정규분포에 가까워진다는 정리입니다. 마치 서로 다른 재료를 섞어도 결국 비슷한 색이 나오는 것처럼, 통계의 마법 같은 현상입니다.
다음 코드를 살펴봅시다.
import numpy as np
import matplotlib.pyplot as plt
# 균등분포를 따르는 모집단 (정규분포가 아님!)
population = np.random.uniform(low=0, high=100, size=100000)
# 표본 평균을 여러 번 계산
sample_means = []
sample_size = 30 # 표본 크기
n_samples = 1000 # 표본 추출 횟수
for _ in range(n_samples):
sample = np.random.choice(population, size=sample_size)
sample_means.append(np.mean(sample))
sample_means = np.array(sample_means)
# 표본 평균들의 통계
print(f"모집단 평균: {np.mean(population):.2f}")
print(f"표본 평균들의 평균: {np.mean(sample_means):.2f}")
print(f"표본 평균들의 표준편차: {np.std(sample_means):.2f}")
# 이론값: 모집단 표준편차 / sqrt(n)
theoretical_std = np.std(population) / np.sqrt(sample_size)
print(f"이론적 표준오차: {theoretical_std:.2f}")
김개발 씨는 중심극한정리가 왜 중요한지 도무지 이해가 되지 않았습니다. 박시니어 씨를 찾아갔습니다.
"시니어 님, 중심극한정리가 뭔지 쉽게 설명해 주실 수 있어요?" 박시니어 씨는 잠시 생각하더니 비유를 들었습니다. "학교 운동장에 100명의 학생이 있다고 생각해봐요.
키가 모두 제각각이죠. 어떤 분포인지 모릅니다.
여기서 30명씩 무작위로 뽑아서 평균 키를 구해요. 이걸 100번 반복하면 100개의 평균값이 나오죠." 김개발 씨가 고개를 끄덕였습니다.
"이 100개의 평균값을 히스토그램으로 그리면, 신기하게도 종 모양의 정규분포가 나타나요. 원래 학생들 키가 어떤 분포였든 상관없이요." 이것이 바로 중심극한정리입니다.
모집단이 정규분포가 아니어도, 표본을 여러 번 추출해서 각각의 평균을 구하면, 그 평균들의 분포는 정규분포에 가까워집니다. 왜 이게 중요할까요?
현실 세계의 데이터는 대부분 정규분포를 따르지 않습니다. 소득 분포는 오른쪽으로 치우쳐 있고, 주사위 눈금은 균등 분포입니다.
하지만 중심극한정리 덕분에 우리는 정규분포의 성질을 이용해서 추론할 수 있습니다. 코드에서는 균등분포를 따르는 모집단을 만들었습니다.
0에서 100 사이에서 모든 값이 동일한 확률로 나타납니다. 이것은 정규분포와 전혀 다른 모양입니다.
그런데 여기서 30개씩 표본을 뽑아 평균을 구하고, 이를 1000번 반복하면 어떻게 될까요? 놀랍게도 이 1000개의 평균값들은 정규분포에 가까운 분포를 보입니다.
또 하나 중요한 점이 있습니다. 표본 평균들의 표준편차를 표준오차라고 합니다.
표준오차는 모집단 표준편차를 표본 크기의 제곱근으로 나눈 값과 같습니다. 표본 크기가 커질수록 표준오차는 줄어들고, 표본 평균은 모집단 평균에 더 가까워집니다.
실무에서 중심극한정리는 다양하게 활용됩니다. A/B 테스트에서 전환율 차이가 유의미한지 검정할 때, 설문조사 결과의 신뢰구간을 계산할 때, 모두 중심극한정리가 기반이 됩니다.
일반적으로 표본 크기가 30 이상이면 중심극한정리가 잘 작동한다고 봅니다. 물론 모집단 분포가 극단적으로 치우쳐 있다면 더 큰 표본이 필요할 수 있습니다.
김개발 씨의 눈이 반짝였습니다. "아, 그래서 통계에서 정규분포를 그렇게 많이 쓰는 거군요!
중심극한정리 덕분에 어떤 데이터든 정규분포로 다룰 수 있으니까."
실전 팁
💡 - 표본 크기가 30 이상이면 중심극한정리가 대체로 잘 작동합니다
- 표본 크기가 클수록 표준오차가 줄어들어 추정이 정확해집니다
6. 신뢰구간 개념
김개발 씨가 A/B 테스트 결과를 보고하려고 합니다. "새 버튼의 클릭률은 5.2%입니다"라고 쓰려는데, 박시니어 씨가 말했습니다.
"그냥 5.2%라고 하면 안 돼요. 신뢰구간도 같이 보고해야 합니다."
신뢰구간은 모수의 참값이 위치할 것으로 추정되는 범위입니다. 마치 "서울에서 부산까지 4시간 30분에서 5시간 30분 사이에 도착할 것입니다"라고 말하는 것처럼, 하나의 점이 아닌 구간으로 추정치를 표현합니다.
95% 신뢰구간은 같은 방식으로 표본을 추출하고 구간을 계산하면, 100번 중 95번은 참값을 포함한다는 의미입니다.
다음 코드를 살펴봅시다.
import numpy as np
from scipy import stats
# A/B 테스트 결과
n_visitors = 1000 # 방문자 수
n_clicks = 52 # 클릭 수
# 표본 비율 (점추정)
sample_proportion = n_clicks / n_visitors
print(f"클릭률 (점추정): {sample_proportion:.1%}")
# 95% 신뢰구간 계산
confidence_level = 0.95
z_score = stats.norm.ppf((1 + confidence_level) / 2)
# 표준오차 계산
standard_error = np.sqrt(sample_proportion * (1 - sample_proportion) / n_visitors)
# 신뢰구간
margin_of_error = z_score * standard_error
lower_bound = sample_proportion - margin_of_error
upper_bound = sample_proportion + margin_of_error
print(f"95% 신뢰구간: {lower_bound:.1%} ~ {upper_bound:.1%}")
print(f"오차 범위: ±{margin_of_error:.1%}")
김개발 씨는 신규 버튼 디자인의 A/B 테스트를 진행했습니다. 1000명의 방문자 중 52명이 클릭했으니 클릭률은 5.2%입니다.
간단해 보이는데, 왜 신뢰구간이 필요할까요? 박시니어 씨가 설명했습니다.
"5.2%는 표본에서 관찰된 값이에요. 하지만 다른 1000명을 대상으로 테스트하면 5.0%가 나올 수도, 5.5%가 나올 수도 있어요.
우리가 정말 알고 싶은 건 모든 사용자를 대상으로 했을 때의 진짜 클릭률, 즉 모집단 비율이에요." 신뢰구간은 이 불확실성을 수치화합니다. "진짜 클릭률은 3.8%에서 6.6% 사이에 있을 것"이라고 말하는 것입니다.
비유하자면 이렇습니다. 친구에게 "몇 시에 도착해?"라고 물었을 때, "5시"라고 답하는 것과 "5시에서 5시 30분 사이"라고 답하는 것 중 어느 쪽이 더 정직한 답일까요?
후자입니다. 정확한 시간을 알 수 없으니 범위로 답하는 것이 솔직한 것입니다.
95% 신뢰구간의 의미를 정확히 이해하는 것이 중요합니다. "진짜 클릭률이 이 구간 안에 있을 확률이 95%다"라는 뜻이 아닙니다.
정확한 의미는 "같은 방법으로 표본 추출과 구간 계산을 100번 반복하면, 그중 약 95개의 구간이 진짜 값을 포함할 것이다"입니다. 코드를 살펴보겠습니다.
먼저 표본 비율을 계산합니다. 52/1000 = 0.052, 즉 5.2%입니다.
다음으로 표준오차를 계산합니다. 비율의 표준오차 공식은 sqrt(p(1-p)/n)입니다.
95% 신뢰수준에 해당하는 z-score는 약 1.96입니다. 이것은 정규분포에서 중앙의 95%를 차지하는 범위의 경계값입니다.
표준오차에 z-score를 곱하면 오차 범위가 됩니다. 결과를 보면 95% 신뢰구간은 약 3.8%에서 6.6%입니다.
표본 비율 5.2%에서 위아래로 약 1.4%씩 오차 범위가 있습니다. 실무에서 신뢰구간은 매우 중요합니다.
A/B 테스트 결과를 보고할 때 점추정만 제시하면 불완전합니다. 두 그룹의 신뢰구간이 겹치면 차이가 유의미하지 않을 수 있습니다.
표본 크기가 커지면 신뢰구간은 좁아집니다. 1000명이 아닌 10000명을 대상으로 테스트하면 더 정밀한 추정이 가능합니다.
하지만 비용과 시간이 더 들죠. 적절한 표본 크기를 미리 계산하는 검정력 분석도 중요한 기술입니다.
김개발 씨는 보고서를 수정했습니다. "새 버튼의 클릭률은 5.2%이며, 95% 신뢰구간은 3.8%~6.6%입니다." 이제 의사결정권자가 불확실성까지 고려해서 판단할 수 있습니다.
실전 팁
💡 - 항상 점추정과 함께 신뢰구간을 보고하세요
- 신뢰구간이 넓다면 표본 크기를 늘리는 것을 고려하세요
이상으로 학습을 마칩니다. 위 내용을 직접 코드로 작성해보면서 익혀보세요!
댓글 (0)
함께 보면 좋은 카드 뉴스
Helm 마이크로서비스 패키징 완벽 가이드
Kubernetes 환경에서 마이크로서비스를 효율적으로 패키징하고 배포하는 Helm의 핵심 기능을 실무 중심으로 학습합니다. Chart 생성부터 릴리스 관리까지 체계적으로 다룹니다.
보안 아키텍처 구성 완벽 가이드
프로젝트의 보안을 처음부터 설계하는 방법을 배웁니다. AWS 환경에서 VPC부터 WAF, 암호화, 접근 제어까지 실무에서 바로 적용할 수 있는 보안 아키텍처를 단계별로 구성해봅니다.
AWS Organizations 완벽 가이드
여러 AWS 계정을 체계적으로 관리하고 통합 결제와 보안 정책을 적용하는 방법을 실무 스토리로 쉽게 배워봅니다. 초보 개발자도 바로 이해할 수 있는 친절한 설명과 실전 예제를 제공합니다.
AWS KMS 암호화 완벽 가이드
AWS KMS(Key Management Service)를 활용한 클라우드 데이터 암호화 방법을 초급 개발자를 위해 쉽게 설명합니다. CMK 생성부터 S3, EBS 암호화, 봉투 암호화까지 실무에 필요한 모든 내용을 담았습니다.
AWS Secrets Manager 완벽 가이드
AWS에서 데이터베이스 비밀번호, API 키 등 민감한 정보를 안전하게 관리하는 Secrets Manager의 핵심 개념과 실무 활용법을 배워봅니다. 초급 개발자도 쉽게 따라할 수 있도록 실전 예제와 함께 설명합니다.