Pandas에서 제공하는 interpolate 함수로 결측치 보간 하기


탐색적 데이터 분석(Exploratory Data Analysis)를 진행하다보면, 결측치를 흔히 볼 수 있습니다.
이때, 결측치를 버릴 것인지, 채울 것인지에 따라 분석 결과가 달라집니다.

결측치가 매우 적은 경우는 버려도(drop) 결과에 큰 영향을 주지 않을 수 있습니다. 하지만, 결측치 양이 많다면 함부로 버릴 수 없습니다.

이런 상황에선 결측치를 특정 값으로 채워주어야 하는데요, 결측치를 채우는 방법엔 Pandas 에서 제공하는 fillna 메서드와 interpolate 메서드를 활용할 수 있습니다.


결측치를 채우는 방법

  • fillna : 결측치를 특정의 동일 값으로 채우는 방식
  • interpolate : 실측값과 실측값 사이의 결측값을 ‘그라데이션’ 기법으로 조금씩 변화시켜가면서 부드럽게 채워나가는 방법

Fillna 로 결측치 채우기

  • 특정의 동일 값으로 채우는 방식
  • 원하는 값으로 변경하는 매서드

Interpolate 로 스마트하게 결측치 채우기

  • 앞, 뒤 값을 통하여 유추하여 좀 더 스마트하게 결측치를 채울 수 있음 (시계열 데이터에 적합)
  • 실측값과 실측값 사이의 결측값을 마치 ‘그라데이션 (gradation)’ 기법으로 조금씩 변화시켜가며 채워나가는 방법


결측치 보간하는 방법

👉 기본 구조 : df.interpolate()

주요 파라미터

  • method : 보간 기술 지정 (default: linear)
    • linear : 인덱스 값을 무시하고 값을 동일한 간격으로 처리 (MultiIndexes 지원하는 유일한 방법)
    • time : 주어진 간격 길이를 보간하기 위해 일일 및 고해상도 데이터에서 작동
    • index, values : 인덱스의 실제 숫자 값을 사용
    • pad : 기존 값 사용
    • nearest, zero, slinear, quadratic, cubic, spline, barycentric, polynomial
      • cipy.interpolate.interp1d로 전달됨
      • 이 방법은 색인의 숫자 값을 사용
      • polynomialspline 모두 차수 (int)도 지정해야 함
        • (예 : df.interpolate (method=’polynomial’, order=5).
  • axis : 함께 보간할 축
    • 시리즈의 경우 사용되지 않으며, 기본값은 0
  • limit : 채울 연속 NaN 의 최대 수 (0보다 커야 함)
  • inplace : bool, default False
    • 가능한 경우 제자리에서 데이터 업데이트 권장
  • limit_direction : NaN 채울 방향 설정
    • ‘forward’, ‘backward’, ‘both’
  • limit_area : 제한하여 NaN 채울 수 있음
    • None, ‘inside’, ‘outside’ (default None)
    • inside : 유효한 값으로 둘러싸인 NaN 만 채움 (보간)
    • outside : 유효 값을 초과하는 NaN 만 채움 (외삽)
  • downcast : ‘infer’ or None
    • 가능한 경우 다운캐스트 권장


실습으로 배우기

데이터 정보

  Survived Pclass Name Sex Age SibSp Parch Ticket Fare Cabin Embarked  
PassengerId                        
1 0 3 Braund, Mr. Owen Harris male 22.0 1 0 A/5 21171 7.2500 NaN S  
2 1 1 Cumings, Mrs. John Bradley (Florence Briggs Th… female 38.0 1 0 PC 17599 71.2833 C85 C  
3 1 3 Heikkinen, Miss. Laina female 26.0 0 0 STON/O2. 3101282 7.9250 NaN S
4 1 1 Futrelle, Mrs. Jacques Heath (Lily May Peel) female 35.0 1 0 113803 53.1000 C123 S  
5 0 3 Allen, Mr. William Henry male 35.0 0 0 373450 8.0500 NaN S  

나이(Age) 결측치 보간하기

train["Age"].isnull().sum() # 177 개의 결측치 확인

# 새로운 컬럼 "Age_fill_linear" 에 "Age" 결측치 보간하기
train["Age_fill_linear"] = train["Age"].interpolate(method="linear")
train["Age_fill_values"] = train["Age"].interpolate(method="values")
train["Age_fill_pad"] = train["Age"].interpolate(method="pad")

train[["Age", "Age_fill_linear", "Age_fill_values", "Age_fill_pad"]].head(10)
  Age Age_fill_linear Age_fill_values Age_fill_pad
PassengerId        
1 22.0 22.0 22.0 22.0
2 38.0 38.0 38.0 38.0
3 26.0 26.0 26.0 26.0
4 35.0 35.0 35.0 35.0
5 35.0 35.0 35.0 35.0
6 NaN 44.5 44.5 35.0
7 54.0 54.0 54.0 54.0
8 2.0 2.0 2.0 2.0
9 27.0 27.0 27.0 27.0
10 14.0 14.0 14.0 14.0
# 0 출력 => linear, values 동일한 값으로 결측치 채워 짐
((train["Age_fill_linear"] == train["Age_fill_values"]) == False).sum()

정리

method 가 linear, values 로 결측치를 보간하면 값이 동일하다.
pad 로 결측치를 보간하면, NaN 값 이전에 있던 ‘기존 값’으로 채워진다.


Reference


개인 공부 기록용 블로그입니다
오류나 틀린 부분이 있을 경우 댓글 혹은 메일로 따끔하게 지적해주시면 감사하겠습니다 :)

댓글남기기