기술과 산업/AI

데이터 수집과 EDA 전략 시리즈 – 3화. 결측치와 이상치 탐지 전략: 데이터의 허점을 읽어내는 기술

B컷개발자 2025. 5. 7. 15:57
728x90

데이터 분석에서 ‘보이지 않는 것들’이 가장 위험하다.

우리가 보지 못하거나, 애써 무시한 누락된 정보와 극단적인 값은

모델을 망치고, 분석 결과를 왜곡하며, 나쁜 의사결정으로 이어질 수 있다.

 

이번 글에서는 데이터 탐색 과정 중 반드시 짚고 넘어가야 할

**결측치(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에서 변수의 타입을 올바르게 분류하고 처리하는 전략을 정리한다.

728x90