데이터 수집과 EDA 전략 시리즈 – 3화. 결측치와 이상치 탐지 전략: 데이터의 허점을 읽어내는 기술
데이터 분석에서 ‘보이지 않는 것들’이 가장 위험하다.
우리가 보지 못하거나, 애써 무시한 누락된 정보와 극단적인 값은
모델을 망치고, 분석 결과를 왜곡하며, 나쁜 의사결정으로 이어질 수 있다.
이번 글에서는 데이터 탐색 과정 중 반드시 짚고 넘어가야 할
**결측치(Missing Values)**와 **이상치(Outliers)**에 대해
실무 분석가의 시선으로 심층적으로 정리한다.
1. 결측치와 이상치는 왜 중요한가?
데이터는 언제나 완전하지 않다.
현장에서 수집되는 로그, 설문 응답, 기기 센서 데이터 등은
환경적·기술적·인적 요인에 따라 손상되거나 누락되기 쉽다.
📌 결측치(Missing Values)
결측치는 말 그대로 어떤 값이 ‘비어 있는 상태’를 의미한다.
주로 다음과 같은 원인으로 발생한다:
- 사용자 입력 누락 (예: 나이 미기입)
- 수집 실패 (예: 서버 장애로 로그 미기록)
- 의도적 생략 (예: 민감정보 제외)
- 데이터 전처리 중 삭제 또는 병합 과정에서의 손실
📌 이상치(Outliers)
이상치는 데이터의 분포에서 일반적인 범위를 벗어난 극단적인 값이다.
예를 들어, 대부분의 제품 가격이 1~10만원인데
어떤 하나가 500만원이라면 이는 이상치일 가능성이 높다.
이상치는 다음과 같은 상황에서 발생한다:
- 입력 오류 (0을 하나 더 적음, 단위 혼동 등)
- 실제 극단 상황 (VIP 고객, 사고 발생 등)
- 비즈니스적 예외 (신제품 출시, 마케팅 이벤트 등)
중요한 점: 모든 이상치가 제거 대상은 아니다.
분석 목적에 따라, 때로는 ‘이상치야말로 중요한 인사이트’가 될 수 있다.
2. 결측치 탐지 실전 전략
결측치는 우선 전체 데이터셋의 어디에, 얼마나 존재하는지 파악하는 것이 중요하다.
🔹 기본 확인
import pandas as pd
df = pd.read_csv('data.csv')
df.isnull().sum().sort_values(ascending=False)
→ 결측치가 많은 열부터 정렬
🔹 전체 비율 확인
(df.isnull().sum() / len(df)).sort_values(ascending=False)
→ 30% 이상 결측치가 있는 열은 제거 대상 고려
📊 시각화로 한눈에 보기
import seaborn as sns
import matplotlib.pyplot as plt
sns.heatmap(df.isnull(), cbar=False, cmap='viridis')
plt.title('결측치 분포 Heatmap')
plt.show()
열 단위뿐 아니라 행 단위 패턴까지 시각적으로 파악 가능
3. 결측치 처리 전략
전략설명적용 예시
삭제 | 결측이 많은 열/행 제거 | 전체 열의 70% 이상 결측 |
대체(평균/중앙값) | 수치형 평균 또는 중앙값으로 채움 | 나이, 소득 등 |
범주 대체 | 범주형은 최빈값 또는 ‘Missing’으로 처리 | 지역, 성별 |
모델 기반 예측 | 다른 변수로 결측값을 예측해 채움 | KNN, 회귀 기반 보간 |
다중 대체(MICE) | 통계적으로 여러 번 예측 → 평균화 | 고급 통계기법, 비용 ↑ |
✅ 실무 팁: 테스트 데이터에는 절대 평균으로 결측치를 대체하지 않는다.
학습 데이터에서 계산한 값을 기준으로 일관성 있게 처리해야 함.
4. 이상치 탐지 실전 전략
이상치는 분석 목적에 따라 제거 또는 강조해야 할 대상이다.
탐지 방식은 수치형 데이터 기준으로 다음과 같다.
(1) 사분위수(IQR) 기반 탐지
Q1 = df['feature'].quantile(0.25)
Q3 = df['feature'].quantile(0.75)
IQR = Q3 - Q1
outliers = df[(df['feature'] < Q1 - 1.5 * IQR) | (df['feature'] > Q3 + 1.5 * IQR)]
→ 박스플롯(boxplot) 기반 이상치 정의
(2) Z-score 기반 탐지
from scipy import stats
z = stats.zscore(df['feature'])
df[abs(z) > 3]
→ 정규분포를 전제한 경우, z > 3은 극단값으로 간주
(3) 시각화 기반 탐지
sns.boxplot(x=df['feature'])
plt.title('Boxplot으로 보는 이상치')
plt.show()
또는 2D 이상치 탐색:
sns.scatterplot(x='price', y='volume', data=df)
plt.title('이상치 시각 탐색')
5. 이상치 처리 전략
전략설명주의사항
제거 | 극단치 행 제거 | 이유가 확실할 때만 |
로그 변환 | 왜도(Skew)를 줄이기 위한 처리 | 양수만 가능 |
클리핑 | 상한/하한값 설정 | 극단 영향 완화 |
비즈니스 룰 기반 라벨링 | 예: VIP 고객, 이상거래 플래그 | 마케팅·보안 분야 활용 |
⚠ 이상치는 때로 ‘문제’가 아니라 ‘인사이트’이다.
예: 금융 사기 탐지에서 이상치는 곧 타겟(Target)이다.
6. 실전 예제: EDA + 결측치 + 이상치 통합 적용
# 결측치 대체
df['Age'].fillna(df['Age'].median(), inplace=True)
# 이상치 제거 (Fare 기준)
Q1 = df['Fare'].quantile(0.25)
Q3 = df['Fare'].quantile(0.75)
IQR = Q3 - Q1
df = df[(df['Fare'] >= Q1 - 1.5 * IQR) & (df['Fare'] <= Q3 + 1.5 * IQR)]
이렇게 EDA → 결측 탐색 → 이상치 제거를 거친 후
모델링 단계로 진입하면 데이터 신뢰도는 훨씬 높아진다.
7. 결론: 데이터의 허점을 읽어내는 것이 진짜 실력이다
많은 분석가가 복잡한 모델을 만들려고 하지만,
실제로 모델의 성능을 결정짓는 건 데이터의 품질이다.
이 품질은 결측과 이상치 처리에서 갈린다.
결측과 이상치는 단순한 오류가 아니라, 분석의 잠재적 리스크다.
이 허점을 먼저 찾아내고 조치할 수 있어야
분석가로서의 신뢰를 얻을 수 있다.
“결측과 이상치를 읽어내는 눈이 없다면,
당신은 절대로 좋은 예측을 하지 못할 것이다.”
다음 편 예고
데이터 수집과 EDA 전략 시리즈 – 4화. 변수의 유형과 분석 전략: 수치형과 범주형, 처리 방식이 다르다
변수는 모두 같지 않다. 숫자처럼 보이지만 범주인 경우도, 범주처럼 보여도 순위가 존재하는 경우도 있다.
EDA에서 변수의 타입을 올바르게 분류하고 처리하는 전략을 정리한다.