1 들어가며: 평균이란 무엇인가
“평균”이라고 하면 대부분 학교에서 배운 “더해서 개수로 나누는” 그것을 떠올린다. 하지만 평균에는 종류가 있다. 산술평균, 기하평균, 조화평균 — 이 세 가지는 단순히 공식이 다른 게 아니라, 각각 다른 구조의 데이터에서 의미 있는 대표값을 추출하는 방식이 다르다.
잘못된 평균을 쓰면 아무리 계산이 정확해도 틀린 결론이 나온다.
이 글은 공식보다 직관에 집중한다. 각 평균이 왜 존재하는지, 언제 써야 하는지, 그리고 통계·ML의 핵심 개념들(Sensitivity, Power, Type I/II Error, F1 Score)이 어떻게 연결되는지 설명한다.
2 1. 산술평균 (Arithmetic Mean, AM)
2.1 정의
\[n \times AM = x_1 + x_2 + \cdots + x_n\]
\[ \therefore AM = \frac{x_1 + x_2 + \cdots + x_n}{n} = \frac{1}{n}\sum_{i=1}^{n} x_i \]
2.2 직관: “더하기의 세계”
산술평균은 모든 데이터가 동일한 가중치로 기여한다고 가정할 때의 대표값이다. “\(n\)개의 값을 하나로 압축했을 때, 총합이 같으려면 각각이 얼마여야 하는가”에 대한 답이다. 즉, 원래 \(n\)개 값의 합과, 대표값을 \(n\)번 더한 합이 같아야 한다는 의미다.
2.3 예시
5일간 기온: 20, 22, 19, 23, 21 °C
\[AM = \frac{20+22+19+23+21}{5} = 21 \text{ °C}\]
이 주의 대표 기온은 21 °C다. 기온은 각 날이 독립적이고 더해지는 구조이므로 산술평균이 적합하다.
2.4 가중 산술평균 (Weighted AM)
각 데이터의 중요도(가중치)가 다를 때는 가중 산술평균을 사용한다:
\[WAM = \frac{w_1 x_1 + w_2 x_2 + \cdots + w_n x_n}{w_1 + w_2 + \cdots + w_n} = \frac{\sum w_i x_i}{\sum w_i}\]
예: 중간고사(40%)와 기말고사(60%)의 성적이 각각 70점, 80점이라면:
\[WAM = \frac{0.4 \times 70 + 0.6 \times 80}{0.4 + 0.6} = \frac{28 + 48}{1} = 76 \text{ 점}\]
단순 산술평균(75점)보다 기말 가중치가 높아서 76점이 된다.
2.5 산술평균의 한계
데이터에 극단적인 이상치(outlier)가 있으면 왜곡된다.
한 팀의 연봉이 3천만, 3천만, 3천만, 3천만, 10억이라면:
\[AM = \frac{3000 \times 4 + 100000}{5} = 22400 \text{ 만원} \approx 2.24 \text{ 억}\]
대부분의 팀원이 3천만을 받는데, 산술평균은 2억을 넘는다. 이 경우 중앙값(median)이 더 좋은 대표값이다.
언제 산술평균을 쓰는가
- 데이터가 독립적이고 단순히 더해지는 구조일 때
- 이상치가 없거나 이상치도 대표값에 반영해야 할 때
- 시험 점수, 기온, 신체 측정치 등 “절대적 크기”를 다룰 때
3 2. 기하평균 (Geometric Mean, GM)
3.1 정의
\[GM = \sqrt[n]{x_1 \cdot x_2 \cdots x_n} = \left(\prod_{i=1}^{n} x_i\right)^{1/n}\]
로그를 이용한 동치 표현:
\[\ln(GM) = \frac{1}{n}\sum_{i=1}^{n} \ln(x_i)\]
즉, 기하평균은 로그 변환 후 산술평균을 구하고 다시 지수 변환한 값이다.
3.2 직관: “곱하기의 세계”
산술평균이 더하기의 세계라면, 기하평균은 곱하기의 세계다. 데이터가 이전 값에 배율(ratio)로 작용하는 구조일 때 올바른 대표값을 준다.
“\(n\)번 같은 비율로 성장했을 때, 최종 결과가 같으려면 매번 몇 배여야 하는가”에 대한 답이다.
\[GM^n = x_1 \cdot x_2 \cdots x_n\]
3.3 예시 1: 투자 수익률
주식이 3년간 각각 +50%, −30%, +20% 수익률을 기록했다.
배율로 표현하면: \(1.5,\ 0.7,\ 1.2\)
\[\text{3년 후 원금 배수} = 1.5 \times 0.7 \times 1.2 = 1.26 \quad (\text{총 26% 수익})\]
산술평균 배율: \(\dfrac{1.5+0.7+1.2}{3} \approx 1.133\) → “연 13.3% 수익”이라고 착각
기하평균 배율: \(\sqrt[3]{1.26} \approx 1.080\) → 연 8.0% 수익 (실제)
산술평균이 틀린 이유: −30% 손실이 있는 해는 다음 해에 원금이 줄어든 상태에서 출발한다. 곱하기 구조에서는 각 항이 독립적이지 않고 순차적으로 누적된다.
3.4 예시 2: 인구 성장률
어느 도시의 인구가 10년 동안 아래와 같이 변했다:
| 연도 | 성장률 |
|---|---|
| 1~4년차 | 연 5% |
| 5~7년차 | 연 10% |
| 8~10년차 | 연 2% |
단순 산술평균: \(\dfrac{4\times5 + 3\times10 + 3\times2}{10} = 5.6\%\)
기하평균: \(\sqrt[10]{1.05^4 \times 1.10^3 \times 1.02^3} \approx 5.4\%\)
10년 후 실제 인구 배수를 역산해보면 기하평균(5.4%)이 정확하다.
3.5 언제 쓰는가
- 투자 수익률, 경제 성장률, 인구 증가율
- 로그 스케일 데이터 (소리 dB, 지진 규모, pH)
- 배수·비율이 반복 적용되는 모든 상황
기하평균과 로그 정규 분포
금융 수익률, 생물학적 측정치, 인터넷 트래픽 등 많은 데이터가 로그 정규 분포를 따른다. 이런 데이터에서 기하평균은 분포의 중심을 가장 잘 대표한다. 산술평균은 오른쪽 꼬리(극단적 큰 값)에 끌려 대표성을 잃는다.
4 3. 조화평균 (Harmonic Mean, HM)
4.1 정의
\[HM = \frac{n}{\dfrac{1}{x_1} + \dfrac{1}{x_2} + \cdots + \dfrac{1}{x_n}} = \frac{n}{\sum_{i=1}^{n} \dfrac{1}{x_i}}\]
4.2 직관: “분자가 고정된 비율들의 평균”
조화평균은 rate(비율, 속도, 단가 등 분수 형태의 값)를 다루되, 분자가 동일한 조건에서 여러 비율을 평균낼 때 올바른 값을 준다.
핵심 질문: “같은 분자량을 소비할 때, 평균적으로 분모는 얼마인가?”
| 평균 | 고정되는 것 | 핵심 질문 |
|---|---|---|
| 산술평균 | 없음 (동등 가중치) | 값들을 더했을 때의 대표값은? |
| 기하평균 | 곱의 구조 | 배율이 반복될 때의 대표 배율은? |
| 조화평균 | 분자(numerator) | 같은 분자량 기준으로 비율을 평균내면? |
4.3 예시 1: 왕복 평균 속도
서울→부산(400 km)을 갈 때 100 km/h, 올 때 50 km/h로 달렸다.
“평균 속도 = (100 + 50) / 2 = 75 km/h”라고 생각하기 쉽다. 틀렸다.
\[\text{총 거리} = 800 \text{ km}\]
\[\text{총 시간} = \frac{400}{100} + \frac{400}{50} = 4 + 8 = 12 \text{ 시간}\]
\[\text{실제 평균 속도} = \frac{800}{12} \approx 66.7 \text{ km/h}\]
이것이 정확히 조화평균이다:
\[HM = \frac{2}{\dfrac{1}{100}+\dfrac{1}{50}} = \frac{2}{0.01+0.02} = \frac{2}{0.03} \approx 66.7 \text{ km/h}\]
산술평균이 틀린 이유: 50 km/h로 달릴 때 4 km/h로 달릴 때보다 2배 더 많은 시간을 쓴다. 느린 속도가 전체 시간에 더 큰 영향을 미치지만, 산술평균은 이를 무시한다. 조화평균은 “같은 거리(분자)를 소비”하는 구조에서 이 비대칭성을 자동으로 보정한다.
4.4 예시 2: 단가(단위당 가격) 평균
A 마트에서 사과를 10만원어치 샀더니 개당 1,000원, B 마트에서 10만원어치 샀더니 개당 500원이었다.
두 마트를 합쳐서 사과를 개당 평균 얼마에 산 것인가?
\[\text{A에서 구입량} = \frac{100000}{1000} = 100 \text{ 개}\] \[\text{B에서 구입량} = \frac{100000}{500} = 200 \text{ 개}\] \[\text{평균 단가} = \frac{200000}{300} \approx 666.7 \text{ 원/개}\]
\[HM = \frac{2}{\dfrac{1}{1000}+\dfrac{1}{500}} = \frac{2}{0.001+0.002} \approx 666.7 \text{ 원/개}\]
산술평균(750원)은 틀렸다. 더 싼 B 마트에서 더 많이 샀기 때문이다.
4.5 예시 3: 머신러닝의 F1 Score
Precision과 Recall의 조화평균이 F1 Score다.
\[\text{Precision} = \frac{TP}{TP+FP}, \qquad \text{Recall} = \frac{TP}{TP+FN}\]
두 지표의 분자가 모두 TP로 동일하다. 분모만 다르다: - Precision의 분모: 모델이 Positive로 예측한 수 (\(TP + FP\)) - Recall의 분모: 실제 Positive의 수 (\(TP + FN\))
\[F1 = \frac{2}{\dfrac{1}{\text{Precision}}+\dfrac{1}{\text{Recall}}} = 2 \cdot \frac{\text{Precision} \times \text{Recall}}{\text{Precision} + \text{Recall}}\]
조화평균이 여기에 적합한 이유:
- 분자(TP)가 고정된 두 비율의 평균이므로 조화평균이 수학적으로 정확하다.
- 작은 값에 민감하다. Precision이나 Recall 중 하나라도 0에 가까우면 F1도 0에 수렴한다. “둘 다 잘해야 한다”는 조건을 수식으로 강제한다.
수치 예시:
| 모델 | Precision | Recall | 산술평균 | F1 (조화평균) |
|---|---|---|---|---|
| 모델 A | 0.9 | 0.1 | 0.50 | 0.18 |
| 모델 B | 0.5 | 0.5 | 0.50 | 0.50 |
| 모델 C | 0.8 | 0.8 | 0.80 | 0.80 |
모델 A는 산술평균으로는 모델 B와 동일하지만, F1은 훨씬 낮다. Recall이 0.1이라는 것은 실제 Positive의 90%를 놓친다는 의미이기 때문이다.
5 4. Recall · Sensitivity · Power · Type 오류의 연결
F1 Score에서 등장하는 Recall은 분야마다 다른 이름으로 불리지만 동일한 수식이다.
5.1 용어 통합
| 분야 | 용어 | 수식 | 의미 |
|---|---|---|---|
| 머신러닝 | Recall | \(\dfrac{TP}{TP+FN}\) | 실제 Positive 중 올바르게 잡은 비율 |
| 의학·진단 | Sensitivity (민감도) | \(\dfrac{TP}{TP+FN}\) | 실제 환자 중 양성 판정 비율 |
| 통계 가설검정 | 검정력 (Power) | \(1 - \beta\) | 실제 효과가 있을 때 탐지할 확률 |
셋 모두 같다: 실제 Positive를 얼마나 빠뜨리지 않고 잡는가.
5.2 두 가지 오류 유형
| 실제 음성 (\(H_0\) 참) | 실제 양성 (\(H_0\) 거짓) | |
|---|---|---|
| 양성 판정 (기각) | 제1종 오류 \(\alpha\) | 올바른 탐지 (Power, \(1-\beta\)) |
| 음성 판정 (채택) | 올바른 판정 (\(1-\alpha\)) | 제2종 오류 \(\beta\) |
| 오류 유형 | 통계 | 진단 | ML | 수식 |
|---|---|---|---|---|
| 제1종 오류 | Type I Error (\(\alpha\)) | 1 − Specificity | False Positive Rate | \(\dfrac{FP}{FP+TN}\) |
| 제2종 오류 | Type II Error (\(\beta\)) | 1 − Sensitivity | False Negative Rate | \(\dfrac{FN}{TP+FN}\) |
| 검정력 | Power (\(1-\beta\)) | Sensitivity | Recall | \(\dfrac{TP}{TP+FN}\) |
5.3 Precision과 Type I 오류의 관계
Precision은 “양성이라고 예측한 것 중 실제 양성의 비율”이다.
\[1 - \text{Precision} = \frac{FP}{TP+FP} = \text{FDR (False Discovery Rate)}\]
- Precision이 낮다 = FDR이 높다 = 양성 판정 중 가짜가 많다 = Type I 오류가 많다
- Precision이 높다 = 확실한 것만 양성이라 한다 = Type I 오류를 줄이는 보수적 판정
5.4 트레이드오프 구조
Threshold를 낮추면 (더 쉽게 양성 판정):
Recall(Sensitivity, Power) ↑ ← Type II 오류 감소
Precision ↓ ← Type I 오류 증가
Threshold를 높이면 (더 엄격하게 양성 판정):
Precision ↑ ← Type I 오류 감소
Recall(Sensitivity, Power) ↓ ← Type II 오류 증가
F1 Score의 조화평균은 이 트레이드오프에서 두 목표의 균형점을 하나의 숫자로 요약한다.
도메인별 오류 비용이 다르다
- 암 진단: Type II 오류(환자를 놓침)가 치명적 → Recall(Sensitivity) 극대화
- 스팸 필터: Type I 오류(정상 메일을 스팸으로 분류)가 더 나쁠 수 있음 → Precision 중시
- 신약 임상시험: Type I 오류(효과 없는 약을 효과 있다고 함)를 엄격히 통제 → \(\alpha = 0.05\)
- A/B 테스트: 두 오류의 비즈니스 비용을 비교해 \(\alpha\)와 Power를 설정
6 5. 세 평균의 관계: AM-GM-HM 부등식
양수 데이터에 대해 항상 다음 부등식이 성립한다:
\[HM \leq GM \leq AM\]
등호는 모든 값이 동일할 때만 성립한다 (\(x_1 = x_2 = \cdots = x_n\)).
6.1 직관적 설명
세 평균이 같은 순서를 가지는 이유는 작은 값에 대한 민감도 차이다:
- 산술평균: 큰 값과 작은 값을 동등하게 취급한다. 큰 값이 평균을 위로 끌어올린다.
- 기하평균: 로그를 취하므로 극단값의 영향이 완화된다. 중간 수준.
- 조화평균: 역수를 취하므로 작은 값에 가장 민감하다. 작은 값 하나가 전체를 끌어내린다.
6.2 수치 예시
두 값 \(x_1 = 1\), \(x_2 = 9\)에 대해:
\[AM = \frac{1+9}{2} = 5\]
\[GM = \sqrt{1 \times 9} = 3\]
\[HM = \frac{2}{\dfrac{1}{1}+\dfrac{1}{9}} = \frac{2}{\dfrac{10}{9}} = \frac{18}{10} = 1.8\]
\[HM = 1.8 \leq GM = 3 \leq AM = 5 \quad \checkmark\]
값의 차이가 클수록 세 평균의 차이도 커진다. 모든 값이 같으면 \(HM = GM = AM\)이다.
6.3 AM-GM 부등식의 간단한 증명 (n=2)
\(x_1, x_2 > 0\)에 대해:
\[AM - GM = \frac{x_1 + x_2}{2} - \sqrt{x_1 x_2}\]
\[= \frac{x_1 + x_2 - 2\sqrt{x_1 x_2}}{2} = \frac{(\sqrt{x_1} - \sqrt{x_2})^2}{2} \geq 0\]
제곱항은 항상 0 이상이므로 \(AM \geq GM\)이 성립한다. \(\blacksquare\)
7 6. 언제 어떤 평균을 쓰는가: 정리
| 데이터 구조 | 평균 | 핵심 판단 기준 | 예시 |
|---|---|---|---|
| 독립적인 절댓값, 더해지는 구조 | 산술평균 | “총합이 의미 있는가?” | 시험 점수, 기온, 키 |
| 배율·비율이 반복 적용 | 기하평균 | “곱해지는 구조인가?” | 수익률, 성장률, 배율 |
| rate, 분자 고정 조건 | 조화평균 | “같은 분자량을 소비하는가?” | 속도, 단가, F1 Score |
7.1 빠른 판별법
- 데이터를 더하면 의미 있는가? → 산술평균
- 데이터를 곱하면 의미 있는가? → 기하평균
- 데이터가 분수(rate) 형태이고 분자가 같은가? → 조화평균
8 7. 코드
import numpy as np
from scipy import stats
data = [4, 9, 16, 25, 36]
am = np.mean(data)
gm = stats.gmean(data)
hm = stats.hmean(data)
print(f"산술평균 (AM): {am:.4f}")
print(f"기하평균 (GM): {gm:.4f}")
print(f"조화평균 (HM): {hm:.4f}")
print(f"AM-GM-HM 부등식 확인: {hm:.4f} ≤ {gm:.4f} ≤ {am:.4f}")# F1 Score 계산: 조화평균
def f1_score(precision, recall):
if precision + recall == 0:
return 0.0
return 2 * precision * recall / (precision + recall)
# 조화평균 vs 산술평균 비교
cases = [
("모델 A (불균형)", 0.9, 0.1),
("모델 B (균형)", 0.5, 0.5),
("모델 C (우수)", 0.8, 0.8),
]
print(f"{'모델':<20} {'Precision':>10} {'Recall':>10} {'산술평균':>10} {'F1 (조화)':>10}")
for name, p, r in cases:
am = (p + r) / 2
f1 = f1_score(p, r)
print(f"{name:<20} {p:>10.2f} {r:>10.2f} {am:>10.2f} {f1:>10.2f}")# R에서의 세 평균 계산
library(psych) # geometric.mean, harmonic.mean
data <- c(4, 9, 16, 25, 36)
am <- mean(data)
gm <- exp(mean(log(data))) # 기하평균
hm <- length(data) / sum(1/data) # 조화평균
cat(sprintf("AM = %.4f\n", am))
cat(sprintf("GM = %.4f\n", gm))
cat(sprintf("HM = %.4f\n", hm))
cat(sprintf("HM ≤ GM ≤ AM: %s\n", hm <= gm && gm <= am))9 마치며
평균은 “여러 데이터를 하나의 숫자로 요약”하는 행위다. 어떤 평균을 쓰느냐는 데이터가 어떤 구조로 만들어졌는가에 달려 있다.
- 데이터가 더해지는 세계인가 → 산술평균
- 데이터가 곱해지는 세계인가 → 기하평균
- 데이터가 나뉘어지는 세계(rate)인가 → 조화평균
그리고 이 세 평균은 통계학·머신러닝의 핵심 개념들과 깊게 연결되어 있다. F1 Score가 조화평균인 이유, Recall이 Sensitivity이자 Power인 이유, Type I/II 오류와 Precision/Recall의 트레이드오프 — 이 모두가 “어떤 오류를 더 나쁘게 볼 것인가”라는 하나의 질문으로 수렴한다.