결측치
개요
결측치(Missing Values)는 데이터 수집 또는 처리 과정에서 특정 값이 누락된 상태를 의미합니다. 이는 데이터 분석 및 머신러닝 모델의 정확도와 신뢰성에 중대한 영향을 미칠 수 있으며, 적절한 대응 전략이 필수적입니다. 결측치는 다양한 원인으로 발생할 수 있으며, 이를 이해하고 처리하는 것은 데이터 과학에서 중요한 단계입니다.
결측치의 유형
1. MCAR (Missing Completely at Random)
- 정의: 결측이 데이터의 다른 변수와 무관하게 랜덤하게 발생한 경우.
- 예시: 설문조사 중 응답자가 우연히 질문을 건너뛴 경우.
- 특징: 결측이 데이터의 구조에 영향을 주지 않음.
2. MAR (Missing at Random)
- 정의: 결측이 다른 변수와 관련되어 있지만, 해당 변수가 모델에 포함되지 않은 경우.
- 예시: 고소득층은 소득 질문을 회피할 가능성이 높지만, 이는 연령과 관련된 경우.
- 특징: 외부 변수의 영향을 받음.
3. MNAR (Missing Not at Random)
- 정의: 결측이 데이터 자체의 값에 의존하여 발생한 경우.
- 예시: 소득이 낮은 사람일수록 소득 질문을 회피하는 경우.
- 특징: 분석 결과를 왜곡할 수 있음.
결측치의 영향
1. 통계적 분석
- 평균, 표준편차 등 기초 통계량 계산 시 오류 발생 가능
- 상관관계 분석에서 편향된 결과 도출
2. 머신러닝 모델
- 학습 데이터의 불완전성으로 인한 성능 저하
- 예측 정확도 감소 및 과적합(overfitting) 위험 증가
3. 데이터 품질
- 분석 결과의 신뢰성을 약화시킴
- 데이터 수집 프로세스 개선 필요성 강조
결측치 처리 방법
1. 제거법 (Deletion)
- 전체 행 제거: 결측이 많은 경우 사용 (단점: 정보 손실)
- 열 제거: 특정 변수가 중요하지 않은 경우
- 예시:
# pandas에서 결측치 포함 행 제거
df.dropna(inplace=True)
2. 대체법 (Imputation)
- 단순 대체:
- 평균/중위수/최빈값으로 대체 (간단하지만 정보 손실 가능성)
- 예시:
df.fillna(df.mean(), inplace=True)
- 복잡한 모델 기반 대체:
- 회귀, KNN, 랜덤 포레스트 등 사용
- 예시:
from sklearn.impute import SimpleImputer
3. 고급 방법
- 다중 대체(Multiple Imputation): 결측치를 여러 번 추정하여 분산 분석
- MICE (Multivariate Imputation by Chained Equations): 변수 간 상관관계 고려
- 예시:
# MICE 사용 예시
from sklearn.experimental import enable_iterative_imputer
from sklearn.impute import IterativeImputer
imputer = IterativeImputer()
df_imputed = pd.DataFrame(imputer.fit_transform(df), columns=df.columns)
결측치 처리 전략
| 방법 |
장점 |
단점 |
| 제거법 |
간단하고 빠름 |
정보 손실 가능성 |
| 단순 대체 |
구현 용이 |
데이터 분포 왜곡 위험 |
| 복잡한 모델 |
정확도 향상 |
계산 비용 증가, 과적합 가능성 |
실무 사례
1. 의료 데이터 분석
- 결측치: 환자의 특정 검사 결과 누락
- 처리 방법: KNN 대체를 통해 예측값 삽입
- 효과: 모델 정확도 15% 향상
2. 금융 데이터 예측
- 결측치: 고객 소득 정보 부족
- 처리 방법: 회귀 모델을 활용한 추정
- 효과: 예측 신뢰성 증가
결측치 탐지 방법
데이터 분석의 첫 단계는 결측치의 존재 여부와 규모를 정확히 파악하는 것입니다. 효율적인 탐지를 위해 다음과 같은 기술적 방법이 사용됩니다.
1. Pandas 함수를 이용한 탐지
Python의 Pandas 라이브러리는 결측치를 빠르게 식별할 수 있는 다양한 메서드를 제공합니다.
isnull() / isna(): 각 요소가 결측치인지 여부를 Boolean 값으로 반환합니다.
sum(): isnull()과 결합하여 컬럼별 결측치 개수를 합산합니다.
info(): 데이터프레임의 전체 정보와 함께 Non-Null 값의 개수를 확인합니다.
코드 예시:
import pandas as pd
# 컬럼별 결측치 개수 확인
missing_count = df.isnull().sum()
# 결측치 비율 확인
missing_rate = df.isnull().mean() * 100
print(missing_rate)
2. 시각화 도구를 이용한 탐지
수치적 확인 외에 시각화 도구를 사용하면 결측치의 분포 패턴(특정 구간 집중 여부 등)을 직관적으로 파악할 수 있습니다.
- missingno 라이브러리: 결측치 시각화 전용 라이브러리로, 다음과 같은 기능을 제공합니다.
msno.matrix(): 데이터셋 전체의 결측치 위치를 흰색 선으로 표시하여 패턴 분석 가능
msno.bar(): 변수별 결측치 비율을 막대그래프로 표시
msno.heatmap(): 변수 간 결측치 발생의 상관관계를 분석
- Seaborn Heatmap:
sns.heatmap(df.isnull(), cbar=False)를 통해 간단하게 결측치 분포를 시각화할 수 있습니다.
결측치 탐지 시 주의사항: 숨겨진 결측치
데이터셋에는 NaN(Not a Number)이나 None과 같이 시스템이 인식하는 표준 결측치 외에, 특정 값으로 위장된 '숨겨진 결측치(Hidden Missing Values)'가 존재할 수 있습니다.
1. 숨겨진 결측치의 형태
- 특수 숫자:
-1, 999, 0 (예: 나이 컬럼에 0이나 999가 입력된 경우)
- 특수 문자열:
'Unknown', 'N/A', '?', 'None', ' '(공백)
- 비정상적 값: 데이터의 도메인 범위를 완전히 벗어난 값
2. 탐지 및 처리 프로세스
숨겨진 결측치를 찾기 위해서는 단순 함수 호출이 아닌 데이터 탐색(EDA) 과정이 필수적입니다.
1. 기술 통계 확인: df.describe()를 통해 최솟값, 최댓값이 비정상적으로 설정되어 있는지 확인합니다.
2. 고유값 확인: df['column'].value_counts()를 통해 빈도가 비정상적으로 높은 특정 값(예: 'Unknown')이 있는지 확인합니다.
3. 표준화: 발견된 숨겨진 결측치를 np.nan으로 치환하여 표준 결측치 처리 프로세스에 통합합니다.
# 'Unknown'이라는 문자열을 NaN으로 변경
import numpy as np
df.replace('Unknown', np.nan, inplace=True)
결측 비율에 따른 처리 기준
결측치를 어떻게 처리할지는 해당 변수의 결측 비율(Missing Rate)에 따라 결정하는 것이 일반적입니다. 아래 표는 실무에서 통용되는 일반적인 판단 기준입니다.
| 결측 비율 |
판단 기준 |
권장 처리 전략 |
비고 |
| 0% ~ 5% |
매우 낮음 |
단순 제거 (Listwise Deletion) |
데이터 손실이 적어 분석 결과에 영향이 미미함 |
| 5% ~ 20% |
낮음~보통 |
단순 대체 (Mean/Median/Mode) |
분포 왜곡을 최소화하며 데이터 양을 유지 |
| 20% ~ 50% |
높음 |
모델 기반 대체 (KNN, MICE) |
변수 간 상관관계를 고려한 정교한 추정 필요 |
| 50% 이상 |
매우 높음 |
변수 제거 (Column Drop) |
대체 시 왜곡 위험이 크며, 정보 가치가 낮다고 판단 |
※ 주의: 위 기준은 일반적인 가이드라인이며, 해당 변수가 분석 목적상 핵심 변수(Target과 강한 상관관계)인 경우에는 결측 비율이 높더라도 제거 대신 정교한 대체법을 적용하거나 결측 여부 자체를 새로운 특성(Binary Indicator)으로 생성하여 활용해야 합니다.
참고 자료
이 문서는 결측치의 이해와 처리 전략을 체계적으로 안내하며, 데이터 과학 실무에서 필수적인 지식을 제공합니다.
# 결측치
## 개요
결측치(Missing Values)는 데이터 수집 또는 처리 과정에서 특정 값이 누락된 상태를 의미합니다. 이는 데이터 분석 및 머신러닝 모델의 정확도와 신뢰성에 중대한 영향을 미칠 수 있으며, 적절한 대응 전략이 필수적입니다. 결측치는 다양한 원인으로 발생할 수 있으며, 이를 이해하고 처리하는 것은 데이터 과학에서 중요한 단계입니다.
---
## 결측치의 유형
### 1. **MCAR (Missing Completely at Random)**
- **정의**: 결측이 데이터의 다른 변수와 무관하게 랜덤하게 발생한 경우.
- **예시**: 설문조사 중 응답자가 우연히 질문을 건너뛴 경우.
- **특징**: 결측이 데이터의 구조에 영향을 주지 않음.
### 2. **MAR (Missing at Random)**
- **정의**: 결측이 다른 변수와 관련되어 있지만, 해당 변수가 모델에 포함되지 않은 경우.
- **예시**: 고소득층은 소득 질문을 회피할 가능성이 높지만, 이는 연령과 관련된 경우.
- **특징**: 외부 변수의 영향을 받음.
### 3. **MNAR (Missing Not at Random)**
- **정의**: 결측이 데이터 자체의 값에 의존하여 발생한 경우.
- **예시**: 소득이 낮은 사람일수록 소득 질문을 회피하는 경우.
- **특징**: 분석 결과를 왜곡할 수 있음.
---
## 결측치의 영향
### 1. **통계적 분석**
- 평균, 표준편차 등 기초 통계량 계산 시 오류 발생 가능
- 상관관계 분석에서 편향된 결과 도출
### 2. **머신러닝 모델**
- 학습 데이터의 불완전성으로 인한 성능 저하
- 예측 정확도 감소 및 과적합(overfitting) 위험 증가
### 3. **데이터 품질**
- 분석 결과의 신뢰성을 약화시킴
- 데이터 수집 프로세스 개선 필요성 강조
---
## 결측치 처리 방법
### 1. **제거법 (Deletion)**
- **전체 행 제거**: 결측이 많은 경우 사용 (단점: 정보 손실)
- **열 제거**: 특정 변수가 중요하지 않은 경우
- **예시**:
```python
# pandas에서 결측치 포함 행 제거
df.dropna(inplace=True)
```
### 2. **대체법 (Imputation)**
- **단순 대체**:
- 평균/중위수/최빈값으로 대체 (간단하지만 정보 손실 가능성)
- 예시: `df.fillna(df.mean(), inplace=True)`
- **복잡한 모델 기반 대체**:
- 회귀, KNN, 랜덤 포레스트 등 사용
- 예시: `from sklearn.impute import SimpleImputer`
### 3. **고급 방법**
- **다중 대체(Multiple Imputation)**: 결측치를 여러 번 추정하여 분산 분석
- **MICE (Multivariate Imputation by Chained Equations)**: 변수 간 상관관계 고려
- **예시**:
```python
# MICE 사용 예시
from sklearn.experimental import enable_iterative_imputer
from sklearn.impute import IterativeImputer
imputer = IterativeImputer()
df_imputed = pd.DataFrame(imputer.fit_transform(df), columns=df.columns)
```
---
## 결측치 처리 전략
| 방법 | 장점 | 단점 |
|--------------|---------------------------|-------------------------------|
| 제거법 | 간단하고 빠름 | 정보 손실 가능성 |
| 단순 대체 | 구현 용이 | 데이터 분포 왜곡 위험 |
| 복잡한 모델 | 정확도 향상 | 계산 비용 증가, 과적합 가능성 |
---
## 실무 사례
### 1. **의료 데이터 분석**
- 결측치: 환자의 특정 검사 결과 누락
- 처리 방법: KNN 대체를 통해 예측값 삽입
- 효과: 모델 정확도 15% 향상
### 2. **금융 데이터 예측**
- 결측치: 고객 소득 정보 부족
- 처리 방법: 회귀 모델을 활용한 추정
- 효과: 예측 신뢰성 증가
---
## 결측치 탐지 방법
데이터 분석의 첫 단계는 결측치의 존재 여부와 규모를 정확히 파악하는 것입니다. 효율적인 탐지를 위해 다음과 같은 기술적 방법이 사용됩니다.
### 1. Pandas 함수를 이용한 탐지
Python의 Pandas 라이브러리는 결측치를 빠르게 식별할 수 있는 다양한 메서드를 제공합니다.
* `isnull()` / `isna()`: 각 요소가 결측치인지 여부를 Boolean 값으로 반환합니다.
* `sum()`: `isnull()`과 결합하여 컬럼별 결측치 개수를 합산합니다.
* `info()`: 데이터프레임의 전체 정보와 함께 Non-Null 값의 개수를 확인합니다.
**코드 예시:**
```python
import pandas as pd
# 컬럼별 결측치 개수 확인
missing_count = df.isnull().sum()
# 결측치 비율 확인
missing_rate = df.isnull().mean() * 100
print(missing_rate)
```
### 2. 시각화 도구를 이용한 탐지
수치적 확인 외에 시각화 도구를 사용하면 결측치의 분포 패턴(특정 구간 집중 여부 등)을 직관적으로 파악할 수 있습니다.
* **missingno 라이브러리**: 결측치 시각화 전용 라이브러리로, 다음과 같은 기능을 제공합니다.
* `msno.matrix()`: 데이터셋 전체의 결측치 위치를 흰색 선으로 표시하여 패턴 분석 가능
* `msno.bar()`: 변수별 결측치 비율을 막대그래프로 표시
* `msno.heatmap()`: 변수 간 결측치 발생의 상관관계를 분석
* **Seaborn Heatmap**: `sns.heatmap(df.isnull(), cbar=False)`를 통해 간단하게 결측치 분포를 시각화할 수 있습니다.
---
## 결측치 탐지 시 주의사항: 숨겨진 결측치
데이터셋에는 `NaN`(Not a Number)이나 `None`과 같이 시스템이 인식하는 표준 결측치 외에, 특정 값으로 위장된 **'숨겨진 결측치(Hidden Missing Values)'**가 존재할 수 있습니다.
### 1. 숨겨진 결측치의 형태
* **특수 숫자**: `-1`, `999`, `0` (예: 나이 컬럼에 0이나 999가 입력된 경우)
* **특수 문자열**: `'Unknown'`, `'N/A'`, `'?'`, `'None'`, `' '`(공백)
* **비정상적 값**: 데이터의 도메인 범위를 완전히 벗어난 값
### 2. 탐지 및 처리 프로세스
숨겨진 결측치를 찾기 위해서는 단순 함수 호출이 아닌 **데이터 탐색(EDA)** 과정이 필수적입니다.
1. **기술 통계 확인**: `df.describe()`를 통해 최솟값, 최댓값이 비정상적으로 설정되어 있는지 확인합니다.
2. **고유값 확인**: `df['column'].value_counts()`를 통해 빈도가 비정상적으로 높은 특정 값(예: 'Unknown')이 있는지 확인합니다.
3. **표준화**: 발견된 숨겨진 결측치를 `np.nan`으로 치환하여 표준 결측치 처리 프로세스에 통합합니다.
```python
# 'Unknown'이라는 문자열을 NaN으로 변경
import numpy as np
df.replace('Unknown', np.nan, inplace=True)
```
---
## 결측 비율에 따른 처리 기준
결측치를 어떻게 처리할지는 해당 변수의 **결측 비율(Missing Rate)**에 따라 결정하는 것이 일반적입니다. 아래 표는 실무에서 통용되는 일반적인 판단 기준입니다.
| 결측 비율 | 판단 기준 | 권장 처리 전략 | 비고 |
| :--- | :--- | :--- | :--- |
| **0% ~ 5%** | 매우 낮음 | **단순 제거 (Listwise Deletion)** | 데이터 손실이 적어 분석 결과에 영향이 미미함 |
| **5% ~ 20%** | 낮음~보통 | **단순 대체 (Mean/Median/Mode)** | 분포 왜곡을 최소화하며 데이터 양을 유지 |
| **20% ~ 50%** | 높음 | **모델 기반 대체 (KNN, MICE)** | 변수 간 상관관계를 고려한 정교한 추정 필요 |
| **50% 이상** | 매우 높음 | **변수 제거 (Column Drop)** | 대체 시 왜곡 위험이 크며, 정보 가치가 낮다고 판단 |
*※ 주의: 위 기준은 일반적인 가이드라인이며, 해당 변수가 분석 목적상 핵심 변수(Target과 강한 상관관계)인 경우에는 결측 비율이 높더라도 제거 대신 정교한 대체법을 적용하거나 결측 여부 자체를 새로운 특성(Binary Indicator)으로 생성하여 활용해야 합니다.*
## 참고 자료
- [Pandas Documentation - Missing Data](https://pandas.pydata.org/pandas-docs/stable/user_guide/missing_data.html)
- "Statistical Analysis with Missing Data" by Little & Rubin (책)
- [MICE 알고리즘 설명](https://www.stat.ubc.ca/~jenny/STAT545A/HTML/07-MissingData.html)
이 문서는 결측치의 이해와 처리 전략을 체계적으로 안내하며, 데이터 과학 실무에서 필수적인 지식을 제공합니다.