데이터 퍼짐 측도 선택법: 분산·표준편차·IQR·변동계수
분산, 표준편차, 평균절대편차, 사분위범위, 변동계수의 차이와 이상치·스트리밍 환경별 선택 기준을 정리한다.
2026-08-14 · 최초 발행 2024-04-29
평균만으로는 보이지 않는 데이터의 폭
퍼짐 측도는 관측값이 중심값 주변에서 얼마나 흩어지는지 수치로 나타낸다. 통계 분석뿐 아니라 품질 관리, 모델링 전처리, 모니터링 지표 설계에서도 이 값이 기준선과 경보 조건을 만든다.
분산은 관측치와 평균의 차이를 제곱해 평균낸 값이다. 단위 역시 원 데이터 단위의 제곱이 되므로 값의 크기를 직관적으로 읽기는 어렵고, 이상치의 영향을 크게 받는다. 표본 분산에는 보통 베셀 보정인 ddof=1을 적용한다.
표준편차는 분산의 제곱근이다. 원 데이터와 같은 단위를 쓰므로 해석이 한결 직접적이지만, 분산과 마찬가지로 이상치에 민감하다. 정규분포를 가정할 수 있다면 68-95-99.7 규칙도 적용할 수 있다.
평균절대편차는 각 관측값과 기준점의 절대 차이를 평균낸다. 기준점은 평균 또는 중앙값이 될 수 있으므로 무엇을 썼는지 밝혀야 한다. 제곱 대신 절대값을 사용해 이상치 영향을 완화하며, 중앙값 기준은 더 견고하다.
사분위범위(IQR)는 Q3 − Q1, 즉 상위 25%와 하위 25% 사이의 범위다. 중심부의 확산을 파악하는 데 유리하고 이상치에 매우 견고하다. 단위는 원 데이터와 같지만 양쪽 꼬리의 정보는 반영하지 않는다.
변동계수(CV)는 표준편차를 평균으로 나눈 무단위 비율이다. 척도가 다른 대상의 상대적 변동성을 비교할 때 적합하다. 평균이 0이거나 음수 또는 0에 가까우면 해석에 적합하지 않다.
단위와 이상치가 선택을 가른다
분산은 제곱 단위를 사용하므로 규모가 커질수록 값도 빠르게 커진다. 반면 표준편차, IQR, 평균절대편차는 원 단위로 표현되어 현업의 측정값과 바로 비교하기 쉽다. 변동계수는 무단위이고 스케일에 영향을 받지 않는다.
정규성에 가까우며 이상치가 적은 데이터라면 분산과 표준편차가 유용하다. 비정규 분포나 Heavy-tail 데이터에서는 IQR 또는 중앙값 기준 평균절대편차가 더 견고한 선택이 된다.
표본 분산과 표준편차를 추정할 때는 ddof=1 베셀 보정을 적용하는 관례가 있다. IQR과 평균절대편차에서는 편향 보정보다 추정 절차의 일관성이 더 중요하다. 신뢰구간이나 가설검정과 연결할 때도 사용한 정의가 서로 맞아야 한다.
운영 환경에서는 계산 방식도 함께 결정해야 한다. 스트리밍 데이터의 분산과 표준편차에는 Welford 알고리즘을 적용할 수 있고, 대규모 데이터에서 IQR을 구할 때는 t-digest·GK 알고리즘 같은 근사 백분위 방식을 활용한다. NaN 처리, 비정상값 필터링, 윈도우링 정책은 계산 전에 정해 두어야 한다.
측도별 성격 비교
| 지표 | 단위 | 이상치 민감도 | 척도 불변성 | 분포 가정 의존성 | 온라인 계산 용이성 | 주 사용처 |
|---|---|---|---|---|---|---|
| 분산 | 제곱 단위 | 높음 | 낮음 | 중간 | 높음(Welford) | 분산 분석, 모델 가정 검토 |
| 표준편차 | 원 단위 | 높음 | 낮음 | 중간 | 높음(Welford) | 품질 관리, 규격 한계 설정 |
| 평균절대편차 | 원 단위 | 중간(중앙값 기준 시 낮음) | 낮음 | 낮음 | 중간 | 견고 요약, 간단한 변동성 추적 |
| 사분위범위(IQR) | 원 단위 | 낮음 | 낮음 | 낮음 | 중간(근사 필요) | 이상치 많은 데이터, 모니터링 |
| 변동계수(CV) | 무단위 | 표준편차에 준함 | 높음 | 중간 | 높음 | 단위 다른 그룹 간 상대 비교 |
데이터 조건에서 측도를 고르는 흐름
정규성 가정이 유효하면 평균±k·표준편차 범위로 관리 한계를 설정할 수 있다. 절대적인 변동을 추적할 때는 표준편차나 IQR을, 척도가 다른 대상을 비교할 때는 CV를 사용한다. 어떤 측도를 선택하든 평균 또는 중앙값 같은 중앙 경향 척도와 함께 시각화하고 알림 임계치를 설계해야 한다.
계산 전에 정할 운영 조건
입력으로는 원시 수치 데이터 시퀀스와 함께 샘플 또는 모집단 여부, 윈도우 크기, 이상치 정의 같은 메타데이터가 필요하다.
처리 단계에서는 NaN 제거, 단위 정규화, 윈도우링을 수행한 뒤 이상치를 규칙으로 제거하거나 견고한 지표를 채택한다. 분산과 표준편차는 ddof를 정하고, 평균절대편차는 기준점을 명시한다. IQR은 분위수 알고리즘을 결정하며, CV는 평균 안정성을 검사한 뒤 계산한다.
출력에는 지표 값 외에 필요한 경우 신뢰 구간, 알림 임계치, 시각화 요약을 포함한다. 표본 수가 부족한 n<2 상황에서는 분산과 표준편차를 미정의로 처리한다. 평균≈0이면 CV 계산을 피하거나 NaN으로 지정한다. 라이브러리마다 분위수 방법이 달라 IQR 값이 달라질 수 있다는 점도 알려야 한다.
품질 관리부터 모니터링까지
제조 공정에서 정규성 가정이 유효하다면 표준편차 기반 관리도와 규격 상·하한 설정을 사용할 수 있다. 공정 초기처럼 이상치가 자주 나타나는 구간에서는 IQR 기반 관리 밴드가 경고 민감도를 안정화한다.
금융 리스크와 상품 비교에서는 일별 수익률의 표준편차로 변동성을 추정하고 연율화 변환을 수행한다. 규모가 다른 자산의 변동성은 CV로 상대 비교한다.
서비스 모니터링에서는 지연시간 분포의 긴 꼬리에 대응하기 위해 IQR 또는 중앙값 기준 평균절대편차를 쓸 수 있다. 배포 전후 윈도우를 비교해 분산이 급격히 늘어나는지도 탐지 대상이 된다.
A/B 테스트에서는 샘플 크기 산정에 분산을 입력한다. 비정규 지표에는 변환 또는 견고 지표를 병행하고, 메트릭 이상치로 테스트 파워가 낮아지는 일을 막기 위해 IQR 기반 사전 필터링을 적용한다.
데이터 품질과 비용 관리에서는 수집량과 비용의 CV로 월별 예산 변동성을 관리할 수 있다. 파이프라인 이상 탐지에는 표준편차와 IQR을 섞은 규칙을 적용한다.
이상치가 많은 환경에서 표준편차에서 IQR로 전환하면 오탐 경보가 20~40% 감소한 사례가 있다. CV를 도입하면 이종 단위 메트릭의 비교 효율을 높이고 임계치 튜닝 비용을 30% 절감할 수 있다. 스트리밍 계산을 채택하면 지표 지연을 줄여 운영 민첩성을 높일 수 있다.
Python으로 계산하기
전제조건: Python 3.9+, numpy 1.24+ 설치 가정
import numpy as np
def dispersion_measures(x, ddof=1, iqr_method="linear", center="mean", cv_mean_floor=1e-12):
"""
x: 1D array-like
ddof: 1=샘플(Bessel), 0=모집단
iqr_method: numpy.quantile method 선택
center: 'mean' 또는 'median' (평균절대편차 기준점)
cv_mean_floor: |mean|이 이 값 이하이면 CV=nan
"""
x = np.asarray(x, dtype=float)
x = x[~np.isnan(x)]
if x.size == 0:
raise ValueError("유효 데이터가 없음")
n = x.size
mean = x.mean()
var = x.var(ddof=ddof)
std = x.std(ddof=ddof)
if center == "mean":
mad = np.mean(np.abs(x - mean))
elif center == "median":
med = np.median(x)
mad = np.mean(np.abs(x - med))
else:
raise ValueError("center는 'mean' 또는 'median'만 허용")
q1 = np.quantile(x, 0.25, method=iqr_method)
q3 = np.quantile(x, 0.75, method=iqr_method)
iqr = q3 - q1
cv = np.nan if abs(mean) <= cv_mean_floor else std / abs(mean)
return {
"n": n,
"mean": mean,
"variance": var,
"std": std,
"mean_abs_dev": mad,
"iqr": iqr,
"cv": cv,
}
# 스트리밍 분산/표준편차: Welford 알고리즘
class Welford:
def __init__(self):
self.n = 0
self.mean = 0.0
self.M2 = 0.0
def update(self, x):
self.n += 1
delta = x - self.mean
self.mean += delta / self.n
delta2 = x - self.mean
self.M2 += delta * delta2
def variance(self, ddof=1):
if self.n <= ddof:
return np.nan
return self.M2 / (self.n - ddof)
def std(self, ddof=1):
v = self.variance(ddof)
return np.sqrt(v) if np.isfinite(v) and v >= 0 else np.nan
# 예시 실행
if __name__ == "__main__":
x = [10, 12, 13, 12, 500] # 이상치 포함
print(dispersion_measures(x, ddof=1, center="median"))
w = Welford()
for xi in x:
w.update(xi)
print({"streaming_mean": w.mean, "streaming_std": w.std(ddof=1)})
분위수 계산 방식(method)에 따라 IQR 값은 약간 달라질 수 있으며, 라이브러리마다 구현 차이가 존재한다. CV는 양의 비율 척도에서만 비교적 해석 가능하므로 평균≈0인 경우에는 사용을 지양한다.