결측값(NaN)이란?

30 P
QUESTION 04 #400
데이터에서 "결측값(NaN)"이 발생하는 가장 일반적인 이유는?
다음 중 옳은 것을 고르세요

결측값(NaN)이란?

NaN은 "Not a Number"의 약자로, "값이 없음"을 나타내는 특수한 표시입니다.

결측값이 생기는 이유

설문조사 예시:
         이름   나이   직업   연봉
응답1: [ 김철수, 30,  회사원, 5000 ]
응답2: [ 이영희, 25,  학생,   NaN  ]  ← 학생이라 연봉 없음
응답3: [ 박민수, NaN, 의사,   8000 ]  ← 나이 답변 거부
응답4: [ 최영진, 28,  NaN,    NaN  ]  ← 직업/연봉 미응답

결측값의 흔한 원인

원인 예시
응답 거부 설문에서 민감한 질문에 답 안 함
데이터 누락 시스템 오류로 일부 기록 안 됨
해당 없음 학생에게 연봉을 물어볼 때
측정 실패 센서 오류로 온도 기록 안 됨

왜 결측값을 처리해야 하나?

# ❌ NaN이 있으면 계산이 망가짐
100 + NaN = NaN          # 덧셈도 NaN
NaN > 0   = False         # 비교도 안 됨
[1, 2, NaN].mean() = NaN  # 평균도 NaN

머신러닝 모델은 NaN을 입력으로 받지 못합니다. 반드시 처리해야 합니다.

결측값 처리 3가지 방법

1. 삭제하기 (dropna)

# NaN이 있는 행 자체를 제거
df.dropna()
  • 장점: 간단함
  • 단점: 데이터 손실

2. 채우기 (fillna)

# 평균값으로 채우기
df["나이"].fillna(df["나이"].mean())

# 0으로 채우기
df.fillna(0)

# 최빈값으로 채우기 (가장 자주 나오는 값)
df["직업"].fillna("회사원")

3. 예측해서 채우기 (고급)

# 다른 컬럼으로 NaN을 예측해서 채움
# 예: 나이가 비어있으면, 직업과 연봉으로 예측

어떤 방법을 선택할까?

결측 비율 추천 방법
5% 미만 삭제 (영향 적음)
5~30% 채우기 (평균/중간값)
30% 이상 컬럼 자체 제거 고려

실전 코드

import pandas as pd
import numpy as np

df = pd.DataFrame({
    "이름": ["김철수", "이영희", "박민수"],
    "나이": [30, np.nan, 28],
    "점수": [85, 90, np.nan]
})

# 결측값 확인
print(df.isnull().sum())

# 평균으로 채우기
df["나이"].fillna(df["나이"].mean(), inplace=True)
df["점수"].fillna(df["점수"].mean(), inplace=True)

💡 핵심: 결측값은 데이터 수집 과정의 누락이며, 머신러닝 전에 반드시 처리해야 합니다.