PROGRESS
4 / 17
단원
데이터 구조화: AI 전처리 17
데이터의 규칙: 예측 로직 14
옷의 시너스: 판단 로직 1
예와 아니오: 판단 로직 6
닮은꼴 찾기: 관계 로직 7
최적의 경로: 강화 로직 7
층층이 지능: 신경망 로직 7
전체 목록
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)
💡 핵심: 결측값은 데이터 수집 과정의 누락이며, 머신러닝 전에 반드시 처리해야 합니다.