결측치가 포함된 데이터를 다루다 보면, 다음과 같은 질문이 생길 때가 있다.
"이 NaN 값을 채워야 하는데, 평균(mean)으로 할까, 중앙값(median)으로 할까?"
데이터를 정확하게 분석하고 모델링하려면 단순히 결측치를 채우는 것이 아니라, 무엇으로 채울지에 대한 판단이 중요하다.
이 글에서는 mean()과 median()의 개념과 차이, 언제 어떤 상황에서 더 적절한지를 구체적인 예제와 함께 알아보았다.
많은 사람들이 평균과 중앙값을 같은 의미로 혼동하거나, 무조건 평균만 사용하는 경향이 있다.
하지만 두 값은 계산 방식 자체가 다르고,
특히 이상치가 있는 상황에서는 완전히 다른 결과를 낼 수 있습니다.
그 차이를 이해하기 위해, 아래에 개념을 비교해 보았다.
| 항목 | 평균 (mean) | 중앙값 (median) |
|---|---|---|
| 정의 | 모든 값을 더해서 개수로 나눈 값 | 데이터를 정렬했을 때 가운데 위치한 값 |
| 장점 | 계산이 빠르고 직관적 | 이상치(outlier)에 강함 |
| 단점 | 이상치에 매우 민감함 | 정렬이 필요해 계산 비용이 있음 |
요약하자면
이 둘은 보완적인 관계이며,
서로 다른 데이터 상황에서 각자 더 적합한 역할을 하게 된다.
예제를 통해 두 개념의 차이를 더 이해해 보자.
import pandas as pd
df = pd.DataFrame({'Age': [22, 23, 24, 100]})
print("평균:", df['Age'].mean()) # 42.25
print("중앙값:", df['Age'].median()) # 23.5
위 데이터에서 100은 다른 값에 비해 명백한 이상치이다.
mean()은 이상치의 영향을 받아 평균이 비정상적으로 커지지만
median()은 단순히 순서를 기준으로 가운데 값을 취하기 때문에 더 안정적인 값을 제공한다.
평균을 써도 괜찮은 경우
중앙값이 더 나은 경우
df['Age'].fillna(df['Age'].mean()) # 평균으로 채우기
df['Age'].fillna(df['Age'].median()) # 중앙값으로 채우기
둘 다 매우 쉬운 한 줄 코드지만,
데이터 특성을 고려하지 않고 무작정 사용하면 오히려 왜곡을 초래할 수 있다.
mode()
→ 최빈값으로 채우기 (범주형 데이터에 유용)
interpolate()
→ 앞뒤 값을 기준으로 선형 보간
→ 머신러닝 기반 예측(Imputation)도 가능
e.g., KNNImputer, IterativeImputer
💡 아래처럼 판단해 보는 것도 가능하다.
분석 대상이 수치형 변수이고 이상치가 없다 →
mean사용이상치가 있거나 분포가 비대칭 →
median이 더 안전범주형 변수 → 최빈값(
mode()) 사용시간 흐름에 따라 변화하는 데이터 →
interpolate()사용
또한, 데이터의 분포가 애매할 경우에는
.hist(), .describe(), .boxplot() 등을 먼저 사용해
데이터의 형태를 직접 확인한 후에 결정하는 습관을 들이면 훨씬 정확한 분석이 가능하다.
결측치 처리는 단순히 .fillna()로 끝나는 작업이 아니다.
해당 열의 분포, 이상치 유무, 데이터 타입까지 고려해야 하는 데이터 이해의 과정이다.
mean()과median()은 둘 다 유용한 도구지만, 언제 어떤 것을 선택할지는 데이터가 말해준다 :)