Python

데이터 전처리: 결측치 탐지와 처리 방법

수현조 2024. 12. 3. 10:54

1. 결측치란 무엇인가요?

결측치의 정의

  • 결측치(Missing Value): 데이터셋에서 값이 누락된 경우를 말합니다.
  • 결측치를 제대로 처리하지 않으면 분석 결과의 신뢰성이 크게 떨어질 수 있습니다.

2. 결측치 탐지

결측치 탐지 방법

Pandas를 활용하면 데이터프레임에서 결측치를 쉽게 탐지할 수 있습니다.

1) isna() / isnull() 함수

 

데이터프레임의 각 요소가 결측치인지 여부를 반환합니다.

isna()

  • 사용 방법: 데이터프레임에서 .isna()를 붙이면 끝!
  • 결과: 결측치(True)와 아닌 값(False)을 확인할 수 있습니다.

 

import pandas as pd

# 데이터 준비
data = {
    '이름': ['철수', '영희', '민수', '지수'],
    '나이': [25, 30, None, 35],
    '직업': ['학생', '회사원', '학생', None]
}
df = pd.DataFrame(data)

# 결측치 탐지
print(df.isna())

출력:

    이름     나이     직업
0  False  False  False
1  False  False  False
2  False   True  False
3  False  False   True

2) sum()함수와 조합

열별 결측치 개수를 확인.

 isna().sum()

  • 사용 방법: .isna() 뒤에 .sum()을 붙이면 됩니다.
  • 결과: 각 열의 결측치 개수를 알려줍니다.
print(df.isna().sum())

출력:

이름    0
나이    1
직업    1
dtype: int64

3. 결측치 처리 방법

방법 1: 제거 (Dropping)

1) 결측치가 포함된 행 삭제

dropna(): 결측치가 포함된 행을 삭제합니다.

df_dropped_rows = df.dropna()
print(df_dropped_rows)

결과:

    이름    나이    직업
0  철수  25.0    학생
1  영희  30.0  회사원

2) 결측치가 포함된 열 삭제

dropna(axis=1): 결측치가 포함된 열을 삭제합니다.

df_dropped_columns = df.dropna(axis=1)
print(df_dropped_columns)

결과:

    이름
0  철수
1  영희
2  민수
3  지수

방법 2: 대체 (Filling)

1) 고정 값으로 대체

fillna(값): 결측치를 지정된 값으로 채웁니다.

df_filled = df.fillna('미정')
print(df_filled)

결과:

    이름     나이    직업
0  철수   25.0    학생
1  영희   30.0  회사원
2  민수  미정    학생
3  지수   35.0    미정

1) 통계적 값으로 대체

결측치를 평균, 중앙값, 최빈값 등으로 대체

 

평균: .fillna(df['열'].mean())
중앙값: .fillna(df['열'].median())
최빈값: .fillna(df['열'].mode()[0])

 

# 평균값으로 대체
df['나이'].fillna(df['나이'].mean(), inplace=True)

# 중앙값으로 대체
df['나이'].fillna(df['나이'].median(), inplace=True)

# 최빈값으로 대체
df['직업'].fillna(df['직업'].mode()[0], inplace=True)

 


방법 3: 보간법 (Interpolation)

결측치 주변 값을 참고해 자동으로 계산합니다.

  • 선형 보간법: interpolate(method='linear')

선형 보간법 적용

df['나이'] = df['나이'].interpolate(method='linear')
print(df)

결과:

    이름     나이    직업
0  철수   25.0    학생
1  영희   30.0  회사원
2  민수   32.5    학생
3  지수   35.0    NaN

방법 4: 사용자 정의 함수 적용

def fill_with_default(value):
    return value if pd.notna(value) else '기본값'

df['직업'] = df['직업'].apply(fill_with_default)
print(df)

결과:

    이름     나이      직업
0  철수   25.0      학생
1  영희   30.0    회사원
2  민수   32.5      학생
3  지수   35.0    기본값

4. 결측치 처리 전략

결측치를 처리하기 전 고려할 점

 

  1. 결측치 비율 확인
    • 결측치 비율이 높으면 제거를 고려.
  2. 데이터 특성 고려
    • 연속형 데이터: 평균, 중앙값 대체.
    • 범주형 데이터: 최빈값 또는 고정값 대체.
  3. 데이터 검증
    • 결측치를 처리한 후 데이터의 일관성을 반드시 검증.
  4. 분석 목표
    • 결측치가 중요한 데이터에 포함되어 있다면 보관법이나 머신러닝 기법을 우선 고려
  1.  

 

주요 메서드 요약

메서드 설명 사용 예시
isna() 결측치를 True/False로 탐지 df.isna()
isna().sum() 각 열의 결측치 개수를 계산 df.isna().sum()
dropna() 결측치 포함 행 삭제 df.dropna()
dropna(axis=1) 결측치 포함 열 삭제 df.dropna(axis=1)
fillna(값) 결측치를 특정 값으로 대체 df.fillna('미정')
fillna(mean()) 평균값으로 대체 df['나이'].fillna(df['나이'].mean())
interpolate() 보간법으로 결측치 채우기 df['나이'].interpolate(method='linear')