본문 바로가기

[Pandas] 판다스를 활용한 결측치 처리 방법

Hub's 2024. 5. 2.

판다스 로고
판다스 로고

1. 결측치란 무엇인가?

결측치는 데이터 세트에서 값이 누락된 항목을 말합니다. 데이터 입력 과정에서 발생할 수도 있고, 데이터 수집 중 오류로 인해 발생할 수도 있습니다. 예를 들어, 설문 조사에서 응답자가 특정 질문에 답을 하지 않았거나, 기계적 오류로 인해 센서 데이터가 누락된 경우 등이 있습니다.

2. 결측치를 처리해야 하는 이유

결측치를 처리하지 않고 방치할 경우, 데이터 분석이나 머신러닝 모델의 성능에 부정적인 영향을 미칠 수 있습니다. 많은 알고리즘은 결측치가 있는 데이터를 제대로 처리하지 못하며, 분석 결과의 신뢰성이 떨어질 수 있습니다. 따라서 결측치를 적절히 처리하는 것은 데이터 분석 과정에서 중요한 단계입니다.

3. 판다스를 이용한 결측치 처리 예시 (출력 결과 포함)

3-1. 결측치 확인하기 

import pandas as pd
import numpy as np

# 데이터 프레임 생성
data = {'이름': ['김철수', '이영희', '박지성', np.nan],
        '나이': [24, np.nan, 29, 22],
        '성별': ['남', '여', np.nan, '남']}
df = pd.DataFrame(data)

# 결측치 확인
print(df.isnull())

출력값 

      이름     나이     성별
0  False  False  False
1  False   True  False
2  False  False   True
3   True  False  False

3-2. 결측치 제거하기

# 결측치가 있는 행 제거
df_dropped_rows = df.dropna()

# 결측치가 있는 열 제거
df_dropped_columns = df.dropna(axis=1)

print("행 제거 후:\n", df_dropped_rows)
print("열 제거 후:\n", df_dropped_columns)

출력값 

행 제거 후:
    이름    나이 성별
0 김철수  24.0  남

열 제거 후:
    이름
0 김철수
1 이영희
2 박지성
3  NaN

3-3. 결측치 대체하기

# 결측치를 평균값으로 대체
df_filled_mean = df.fillna(df.mean())

# 결측치를 특정 값으로 대체
df_filled_specific = df.fillna({'이름': '정보 없음', '나이': 30, '성별': '미정'})

print("평균값으로 대체:\n", df_filled_mean)
print("특정 값으로 대체:\n", df_filled_specific)

출력값 

평균값으로 대체:
     이름    나이 성별
0 김철수  24.0  남
1 이영희  25.0  여
2 박지성  29.0  미정
3  NaN  22.0  남

특정 값으로 대체:
        이름    나이 성별
0 김철수  24.0  남
1 이영희  30.0  여
2 박지성  29.0  미정
3 정보 없음  22.0  남

3-4 결측치 보간하기

선형 보간(linear interpolation)은 두 점 사이의 결측치를 추정하는 방법 중 하나로, 두 점을 연결하는 직선의 경향성을 이용해 중간에 놓인 결측값을 추정합니다. 즉, 결측치의 값이 그 주변 값들과 선형적인 관계를 가지고 있다고 가정하고 그 관계를 바탕으로 결측치를 채우는 기법입니다.

선형 보간은 특히 시간 순서에 따라 연속적으로 증가하거나 감소하는 데이터에서 자주 사용됩니다. 예를 들어, 시간에 따른 온도 변화 데이터에서 특정 시간의 온도 데이터가 누락되었다면, 이전 시간과 다음 시간의 온도 데이터를 바탕으로 결측된 시간의 온도를 선형적으로 추정할 수 있습니다.

판다스에서는 interpolate() 메서드를 사용하여 다양한 방법 중 하나인 선형 보간을 적용할 수 있습니다. 다음은 간단한 예시입니다

import pandas as pd

# 데이터 프레임 생성
data = {'시간': [1, 2, 3, 4, 5],
        '온도': [22, None, 24, None, 26]}
df = pd.DataFrame(data)

# 선형 보간을 이용한 결측치 처리
df['온도'].interpolate(method='linear', inplace=True)

df

선형 보간을 적용한 결과, 온도 열의 결측치가 이전 값과 다음 값 사이의 선형적 증가율을 반영하여 채워졌습니다. 구체적으로는 다음과 같습니다.

  • 2번 시간의 온도가 22에서 24로 증가하는 경향을 따라, 결측치는 23으로 추정되었습니다.
  • 4번 시간의 온도는 24에서 26으로 증가하는 경향을 따라, 결측치는 25로 추정되었습니다.

출력값 

   시간    온도
0   1  22.0
1   2  23.0
2   3  24.0
3   4  25.0
4   5  26.0

3-5. 결측치를 다루기 위한 조건부 대체

# 성별을 기준으로 나이의 평균값으로 결측치 대체
df['나이'] = df.groupby('성별')['나이'].transform(lambda x: x.fillna(x.mean()))

print("조건부 평균값으로 대체:\n", df)

출력값 

조건부 평균값으로 대체:
     이름    나이 성별
0 김철수  24.0  남
1 이영희  30.0  여
2 박지성  29.0  NaN
3  NaN  22.0  남

 

이렇게 판다스를 활용한 결측치 처리 방법을 구체적인 예시와 함께 출력 결과로 확인할 수 있습니다. 판다스의 공식 홈페이지에서 더 많은 정보를 얻을 수 있습니다. 

댓글