데이터 분석과 머신러닝 모델링에서 결측치(Missing Value) 처리는 중요한 과정입니다.
결측치를 어떻게 처리하느냐에 따라 모델의 성능과 분석 결과가 크게 달라질 수 있습니다.
이번 블로그에서는 결측치 처리 방법을 다양한 예제와 함께 설명하고,
Python 코드 예제를 활용하여 직접 해결해보겠습니다. 🚀
🔍 1️⃣ 결측치(Missing Value)란?
결측치란 데이터셋에서 특정 값이 비어있는 상태를 의미합니다.
데이터가 유실된 이유는 다양하며, 다음과 같은 경우에 발생할 수 있습니다.
- 설문조사에서 응답자가 일부 문항을 생략
- 센서 오류로 인해 값이 기록되지 않음
- 데이터 입력 과정에서 실수로 누락됨
- 데이터 수집 방식의 차이로 인해 일부 값이 존재하지 않음
💡 예를 들어, 건강 설문조사에서 나이, 성별, 키는 입력했지만 체중을 입력하지 않은 경우가 결측치입니다.
📌 2️⃣ 결측치 유형 (Missing Data Types)
결측치는 발생하는 방식에 따라 세 가지 유형으로 구분됩니다.
유형 설명 예시
MCAR (Missing Completely At Random) | 완전히 랜덤하게 발생하는 결측치 | 설문조사 응답자가 실수로 빈칸을 남김 |
MAR (Missing At Random) | 특정 변수와 관련된 결측치 | 키가 큰 사람이 체중을 입력하지 않는 경향 |
MNAR (Missing Not At Random) | 데이터 자체의 특성이 결측을 유발 | 우울증이 심한 사람이 정신건강 설문을 거부 |
✅ MNAR 유형의 결측치는 특히 주의해야 합니다!
데이터의 특성 자체가 결측을 유발하기 때문에, 단순히 평균이나 중앙값으로 대체하면 잘못된 분석 결과를 초래할 수 있습니다.
📌 3️⃣ 결측치 처리 방법
결측치가 많은 컬럼을 처리하는 5가지 주요 방법을 살펴보겠습니다.
각 방법은 데이터의 특성과 분석 목적에 따라 다르게 적용될 수 있습니다.
🏷️ ① 컬럼 삭제 (Column Deletion)
📌 언제 사용해야 할까?
- 해당 컬럼의 결측치 비율이 50% 이상일 때
- 컬럼이 분석에 필수적인 변수가 아닐 때
- 데이터 손실이 크지 않을 때
✅ 장점
✔️ 빠르고 간단한 해결책
✔️ 불필요한 데이터 제거로 모델 성능 향상
❌ 단점
⚠️ 중요한 정보를 잃을 가능성이 있음
📌 Python 코드 예제
import pandas as pd
# 예제 데이터 생성
df = pd.DataFrame({
'A': [1, 2, None, 4, None],
'B': [None, 2, 3, None, 5],
'C': [10, 20, 30, 40, 50]
})
# 결측치 비율이 50% 이상인 컬럼 삭제
df = df.dropna(axis=1, thresh=len(df) * 0.5)
print(df)
✅ thresh=len(df) * 0.5: 전체 행의 50% 이상이 결측치인 컬럼만 삭제
🏷️ ② 행 삭제 (Row Deletion)
📌 언제 사용해야 할까?
- 결측치가 특정 행에만 존재하며, 해당 행을 제거해도 데이터 손실이 크지 않을 때
- 데이터셋 크기가 충분히 클 때
✅ 장점
✔️ 빠르고 간편하게 적용 가능
✔️ 모델의 데이터 왜곡 방지
❌ 단점
⚠️ 데이터가 적으면 중요한 샘플을 잃을 위험이 있음
📌 Python 코드 예제
# 결측치가 포함된 행 삭제
df = df.dropna()
print(df)
✅ 모든 결측치가 있는 행을 제거하여 깨끗한 데이터셋 확보
🏷️ ③ 평균/중앙값 대체 (Mean/Median Imputation)
📌 언제 사용해야 할까?
- 연속형(숫자형) 변수에서 결측치가 적을 때
- 데이터의 분포가 왜곡되지 않을 때
- 중앙값(Median)은 이상치(Outlier)에 덜 민감하여 활용 가능
✅ 장점
✔️ 데이터 손실 없이 빠르게 결측치 처리 가능
✔️ 모델의 성능 유지
❌ 단점
⚠️ 데이터 변동성이 반영되지 않음 (모든 결측치를 같은 값으로 채움)
📌 Python 코드 예제
# 결측치를 평균으로 대체
df['A'] = df['A'].fillna(df['A'].mean())
# 결측치를 중앙값으로 대체
df['B'] = df['B'].fillna(df['B'].median())
print(df)
✅ fillna()를 이용하여 평균(mean) 또는 중앙값(median)으로 결측치 대체
🏷️ ④ 모델 기반 대체 (KNN Imputer)
📌 언제 사용해야 할까?
- 결측치가 많고, 다른 변수들과 상관관계가 높은 경우
- 보다 정교한 결측치 처리를 원할 때
✅ 장점
✔️ 단순 대체보다 정밀한 결과 제공
✔️ 데이터의 패턴을 반영하여 결측치를 보완
❌ 단점
⚠️ 계산량이 많고, 데이터가 많을수록 연산 비용 증가
📌 Python 코드 예제
from sklearn.impute import KNNImputer
# KNN 기반 결측치 대체
imputer = KNNImputer(n_neighbors=3)
df[['A', 'B']] = imputer.fit_transform(df[['A', 'B']])
print(df)
✅ K-최근접 이웃(KNN)을 활용하여 결측치를 예측한 값으로 대체
🏷️ ⑤ 다중 대체법 (Multiple Imputation)
📌 언제 사용해야 할까?
- 결측치가 많고, 단순 대체법으로 데이터 왜곡 가능성이 클 때
- 머신러닝 모델을 적용할 때 신뢰성을 높이고 싶을 때
✅ 장점
✔️ 불확실성을 반영하여 보다 신뢰성 있는 결과 제공
✔️ 데이터 왜곡을 최소화
❌ 단점
⚠️ 계산량이 많고 구현이 복잡함
📌 Python 코드 예제
from sklearn.experimental import enable_iterative_imputer
from sklearn.impute import IterativeImputer
# Iterative Imputer를 활용한 다중 대체법
imputer = IterativeImputer(random_state=42)
df[['A', 'B']] = imputer.fit_transform(df[['A', 'B']])
print(df)
✅ 여러 변수와의 관계를 활용하여 결측치를 반복적으로 예측하고 보완
🎯 6️⃣ 결측치 처리 전략 추천
50% 이상 | 컬럼 삭제 고려 |
10~50% | 모델 기반 대체(KNN Imputer, Iterative Imputer) |
10% 이하 | 평균/중앙값 대체 또는 최빈값 대체 |
📌 변수의 중요도도 고려해야 합니다.
- ✅ 중요한 변수(예: 혈압, 혈당)는 삭제 대신 모델 기반 대체
- ✅ 생활 습관 변수(흡연, 음주 여부)는 최빈값 대체
✅ 결측치 처리는 분석의 핵심입니다! 적절한 방법을 선택하여 데이터를 정제하세요! 🚀
'Error Handling' 카테고리의 다른 글
160. [Error Handling] [ Backend ] NullPointerException 완벽 해결 가이드 (1) | 2025.02.28 |
---|---|
146. [Error Handling] [Streamlit] : requirements.txt(프로젝트 필수 패키지) (0) | 2025.02.04 |
140. [Error Handling] [Streamlit] : Streamlit 사용 시 에러 발생 (0) | 2025.02.03 |
105. [Error Handling] [Python] 내장 함수 이름 재정의로 발생하는 오류 (0) | 2025.01.21 |
99. [Error Handling] [Python] 튜플(Tuple)과 소괄호 오류 (0) | 2025.01.20 |