OPEN HYPER STEP
← 목록으로 (math)
MATH · 43 / 45
math
CHAPTER 43 / 45
읽기 약 2
FUNCTION

통계 기초: 평균·중앙값·표준편차


핵심 개념

평균·중앙값·최빈값·분산·표준편차 — 사용자 분석·이상치 탐지·표준화의 수학.

본문

중심 경향 — 평균·중앙값·최빈값

PYTHON📋 코드 (22줄)
import numpy as np
from collections import Counter

data = [1, 2, 2, 3, 4, 5, 5, 5, 100]  # 100은 이상치

# 평균
mean = np.mean(data)
print(f"평균: {mean:.2f}")  # 14.11 (이상치 영향 큼)

# 중앙값
median = np.median(data)
print(f"중앙값: {median:.1f}")  # 4.0 (이상치 영향 적음)

# 최빈값
mode = Counter(data).most_common(1)[0][0]
print(f"최빈값: {mode}")  # 5 (가장 자주 등장)


# 언제 어느 것?
# - 평균: 정규분포 + 이상치 없음
# - 중앙값: 비대칭 분포 또는 이상치 있음 (소득, 응답시간 등)
# - 최빈값: 카테고리형 (가장 인기 있는 옵션)

분산과 표준편차

PYTHON📋 코드 (23줄)
# 분산 = 평균과의 차이의 제곱의 평균
# 표준편차 = √분산

data = [1, 2, 3, 4, 5]
mean = np.mean(data)
variance = np.mean([(x - mean)**2 for x in data])
std = np.sqrt(variance)

print(f"분산: {variance:.2f}")  # 2.0
print(f"표준편차: {std:.2f}")    # 1.41

# numpy 직접
print(np.var(data))   # 2.0
print(np.std(data))   # 1.41


# 의미
# 평균만으로는 데이터 모양 모름
data1 = [4, 5, 5, 5, 6]   # 표준편차 작음 (밀집)
data2 = [1, 3, 5, 7, 9]   # 표준편차 큼 (분산)
print(f"data1 std: {np.std(data1):.2f}")  # 0.63
print(f"data2 std: {np.std(data2):.2f}")  # 2.83
# 평균은 둘 다 5

정규화 vs 표준화

PYTHON📋 코드 (25줄)
# 정규화 (Min-Max): [0, 1] 범위로 압축
# 표준화 (Z-score): 평균 0, 표준편차 1로 변환

import numpy as np

data = np.array([100, 200, 300, 400, 500, 1000])

# 정규화
def min_max_normalize(arr):
    return (arr - arr.min()) / (arr.max() - arr.min())


# 표준화
def z_score_standardize(arr):
    return (arr - arr.mean()) / arr.std()


print("원본:", data)
print("정규화:", min_max_normalize(data))
print("표준화:", z_score_standardize(data))


# 사용처:
# - 정규화: 신경망 입력 (0~1 권장)
# - 표준화: 거리 기반 알고리즘 (KNN, SVM)

이상치 탐지 — Z-score

PYTHON📋 코드 (28줄)
import numpy as np

# Z-score = (값 - 평균) / 표준편차
# |Z| > 3 → 이상치 (정규분포에서 0.27%)

data = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 100, 200])

mean = data.mean()
std = data.std()

z_scores = (data - mean) / std
print("Z-scores:", z_scores)

outliers = data[np.abs(z_scores) > 2]
print(f"이상치 (|Z|>2): {outliers}")
# [100 200]


# IQR 방식 — 비정규분포에 강건
def detect_outliers_iqr(data):
    q1, q3 = np.percentile(data, [25, 75])
    iqr = q3 - q1
    lower = q1 - 1.5 * iqr
    upper = q3 + 1.5 * iqr
    return data[(data < lower) | (data > upper)]


print(f"IQR 이상치: {detect_outliers_iqr(data)}")

실전 — 사용자 체류 시간 분석

PYTHON📋 코드 (38줄)
import numpy as np
import matplotlib.pyplot as plt

# 1000명의 페이지 체류 시간 (초)
np.random.seed(42)
durations = np.concatenate([
    np.random.lognormal(mean=2.0, sigma=0.5, size=950),  # 일반 사용자
    np.random.lognormal(mean=4.0, sigma=0.3, size=50),   # 5% 헤비 사용자
])


# 통계
print(f"평균: {durations.mean():.1f}초 (이상치 영향 큼)")
print(f"중앙값: {np.median(durations):.1f}초")
print(f"표준편차: {durations.std():.1f}초")
print(f"P95: {np.percentile(durations, 95):.1f}초")
print(f"P99: {np.percentile(durations, 99):.1f}초")


# 시각화
fig, axes = plt.subplots(1, 2, figsize=(12, 4))

axes[0].hist(durations, bins=50)
axes[0].axvline(durations.mean(), color='red', label='Mean')
axes[0].axvline(np.median(durations), color='green', label='Median')
axes[0].set_xlabel('체류 시간 (초)')
axes[0].set_ylabel('빈도')
axes[0].legend()
axes[0].set_title('원본 분포')

# 로그 변환 후 분포
log_durations = np.log(durations)
axes[1].hist(log_durations, bins=50)
axes[1].set_xlabel('log(체류 시간)')
axes[1].set_title('로그 변환 — 정규분포에 가까워짐')

plt.tight_layout()
plt.show()

실전 — 성능 모니터링

PYTHON📋 코드 (25줄)
# 응답 시간 데이터
import numpy as np

response_times = np.random.lognormal(mean=2.0, sigma=0.5, size=10000)

# 표준 모니터링 지표
metrics = {
    'avg':     np.mean(response_times),
    'median':  np.median(response_times),
    'p50':     np.percentile(response_times, 50),
    'p95':     np.percentile(response_times, 95),
    'p99':     np.percentile(response_times, 99),
    'p99.9':   np.percentile(response_times, 99.9),
    'max':     np.max(response_times),
    'std':     np.std(response_times),
}

for name, value in metrics.items():
    print(f"{name:>10}: {value:>8.2f}ms")


# SLO 위반 비율
slo_threshold = 100  # 100ms 이내 요구
violations = np.mean(response_times > slo_threshold) * 100
print(f"\nSLO 위반: {violations:.2f}%")

다음 챕터

CH.44 "A/B 테스트의 수학" — p-value와 통계적 유의성.


AI 프롬프트
🤖 AI에게 잘 물어보는 법 — 모델·전략별 프롬프트
Claude

무료: Sonnet 4.6 / Pro $20/mo: Opus 4.6

내 모니터링 데이터의 평균/중앙값/P95/P99를
비교 분석해서 SLO 임계값 + 이상치
탐지 룰을 추천해줘.
ChatGPT

무료: GPT-5.5 / Plus $20/mo: GPT-5.5 Pro

한국 인기 모니터링 도구의
통계 지표 사용 패턴 5가지를 비교해줘.
Gemini

무료: 2.5 Flash / Pro $19.99/mo: 3.1 Pro

내 사용자 행동 데이터에서 평균과
중앙값 차이로 발견 가능한 인사이트
Top 10을 시각화해줘.
Grok

무료: Grok 4.1 / SuperGrok $30/mo

2026년 SRE 실무에서 평균 vs 백분위수
중심 모니터링 트렌드를 솔직히 알려줘.

⭐ 이것만 기억하세요
통계 기초: 평균·중앙값·표준편차 이 3가지만 확실히 잡으세요
1.평균은 이상치에 민감, 중앙값은 강건 — 비대칭 데이터(소득, 응답시간)에는 중앙값 + 백분위수
2.표준편차는 데이터의 흩어짐 — 평균만으로는 분포 모양 모름
3.다음 챕터 CH.44에서 A/B 테스트 — p-value와 통계적 유의성 검정


공유하기
진행도 43 / 45