Error Handling

152. [Streamlit] [Data Science] : 결측치가 많은 컬럼을 처리하는 방법

천재단미 2025. 2. 15. 00:49
728x90
반응형

 

 

 

 

 

데이터 분석과 머신러닝 모델링에서 결측치(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% 이하 평균/중앙값 대체 또는 최빈값 대체

 

📌 변수의 중요도도 고려해야 합니다.

 

  • ✅ 중요한 변수(예: 혈압, 혈당)는 삭제 대신 모델 기반 대체
  • ✅ 생활 습관 변수(흡연, 음주 여부)는 최빈값 대체

 

 

결측치 처리는 분석의 핵심입니다! 적절한 방법을 선택하여 데이터를 정제하세요! 🚀

 

 

728x90
반응형
home top bottom
}