지난번 포스팅에서는 Python pandas 의 dropna() method를 사용해서

 

 - 결측값이 들어있는 행 전체 제거하기

 - 결측값이 들어있는 열 전체 제거하기

 

방법을 알아보았습니다.

 

 

이번 포스팅에서는 Python pandas의 interpolate() method를 사용해서 결측값을 보간하는 방법(interpolation of missing values)에 대해서 소개하겠습니다.

 

 - (1) 시계열데이터의 값에 선형으로 비례하는 방식으로 결측값 보간

       (interpolate TimeSeries missing values linearly)

 - (2) 시계열 날짜 index를 기준으로 결측값 보간

       (interploate TimeSeries missing values along with Time-index)

 - (3) DataFrame 값에 선형으로 비례하는 방식으로 결측값 보간

       (interpolate DataFrame missing values linearly)

 - (4) 결측값 보간 개수 제한하기

       (limit the number of consecutive interpolation)

 

 

시계열 데이터 분석이라든지 (X, Y, Z) 좌표 공간 상에서 측정된 데이터(근접한 공간 상 데이터 간 상관성/연속성이 있는 경우) 등에서 사용하면 매우 유용하고 편리한 method 입니다.

 

 

이전 포스팅의 결측값 대체는 '특정의 동일 값'으로 채우는 방식(filling, imputation)이었던 반면에, 이번 포스팅의 결측값 보간(interploation)은 실측값과 실측값 사이의 결측값을 마치 '그라데이션(gradation)' 기법으로 색깔을 조금씩 변화시켜가면서 부드럽게 채워나가는 방법이라고 이해하시면 되겠습니다.

 

 

 

자, 그럼 필요한 모듈을 import 하고, 결측값이 들어있는 TimeSeries 데이터를 만든 후에, 결측값을 보간해보겠습니다.

 

  (1) 시계열데이터의 값에 선형으로 비례하는 방식으로 결측값 보간
       (interpolate TimeSeries missing values linearly) : ts.interpolate()

 



# importing modules 
In [1]: import pandas as pd


In [2]: import numpy as np


In [3]: from pandas import DataFrame, Series


In [4]: from datetime import datetime


# making TimeSeries with missing values
In [5]: datestrs = ['12/1/2016', '12/03/2016', '12/04/2016', '12/10/2016']


In [6]: dates = pd.to_datetime(datestrs)


In [7]: dates
Out[7]: DatetimeIndex(['2016-12-01', '2016-12-03', '2016-12-04', '2016-12-10'], dtype='datetime64[ns]', freq=None)


In [8]: ts = Series([1, np.nan, np.nan, 10], index=dates)


In [9]: ts
Out[9]:
2016-12-01     1.0
2016-12-03     NaN
2016-12-04     NaN

2016-12-10    10.0
dtype: float64




 

 

ts.interpolote() 는 default 가 interpolate(method='values')로서 선형으로 비례하여 결측값을 보간해줍니다.

 



# interpolate missing values linearly 
In [10]: ts_intp_linear = ts.interpolate()


In [11]: ts_intp_linear
Out[11]:
2016-12-01     1.0
2016-12-03     4.0
2016-12-04     7.0
2016-12-10    10.0




 

 

 

  (2) 시계열 날짜 index를 기준으로 결측값 보간
       (interploate TimeSeries missing values along with Time-index)
       : ts.interploate(method='time')

 

위의 ts.interpolate() 결과와 아래의 ts.interpolate(method='time') 보간 결과를 유심히 비교해보시기 바랍니다.

 



In [12]: ts
Out[12]:
2016-12-01     1.0
2016-12-03     NaN
2016-12-04     NaN
2016-12-10    10.0



dtype: float64


In [13]: ts_intp_time = ts.interpolate(method='time')


In [14]: ts_intp_time
Out[14]:
2016-12-01     1.0
2016-12-03     3.0
2016-12-04     4.0
2016-12-10    10.0
dtype: float64




 

 

 

  (3) DataFrame 값에 선형으로 비례하는 방식으로 결측값 보간
      (interpolate DataFrame missing values linearly)

 



In [15]: df = DataFrame({'C1': [1, 2, np.nan, np.nan, 5],
    ...: 'C2': [6, 8, 10, np.nan, 20]})
    ...:


In [16]: df
Out[16]:
    C1    C2
0  1.0   6.0
1  2.0   8.0
NaN  10.0
NaN   NaN
4  5.0  20.0



In [17]: df_intp_values = df.interpolate(method='values')

In [18]: df_intp_values
Out[18]:
    C1    C2
0  1.0   6.0
1  2.0   8.0
3.0  10.0
4.0  15.0
4  5.0  20.0





# the same with : df.interpolate(method='values') = df.interpolate()
In [19]: df.interpolate() # by default : method='values'
Out[19]:
    C1    C2
0  1.0   6.0
1  2.0   8.0
3.0  10.0
4.0  15.0
4  5.0  20.0


 

 

 

 (4) 결측값 보간 개수 제한하기 (limit the number of consecutive interpolation) : limit

 

연속적으로 결측값을 보간하는 개수를 'limit=1'을 사용해서 제한해보겠습니다.  아래 예시처럼 df.ix[3, 'C1']의 NaN이 보간되지 않고 NaN 그대로 남아있습니다.

 



In [20]: df.interpolate(method='values', limit=1)
Out[20]:
    C1    C2
0  1.0   6.0
1  2.0   8.0
3.0  10.0
NaN  15.0
4  5.0  20.0




 

 

 

limit_direction='backward' 로 설정해주면 보간해주는 방향이 밑에서 위로 올라가면서 해주게 됩니다.

(아무런 설정을 안해주면 default 로 limit_direction='forward' 설정됨.  limit_direction='both' 도 있음)

 



In [29]: df.interpolate(method='values', limit=1, limit_direction='backward')
Out[29]:
    C1    C2
0  1.0   6.0
1  2.0   8.0
NaN  10.0
4.0  15.0
4  5.0  20.0



 

 

 

이상으로 Python pandas 의 interpolate() method를 활용한 결측값 보간법을 마치도록 하겠습니다.

 

많은 도움 되었기를 바랍니다.

 

반응형
Posted by Rfriend

댓글을 달아 주세요

  1. kjh 2020.01.29 16:35  댓글주소  수정/삭제  댓글쓰기

    파이썬 판다스로 결측치가 있는 데이터를 정규화시키고 싶습니다!
    각 열은 NaN값이 있는 열도 있고 NaN값이 없는 열도 있는데요!

    각 변수별로 NaN값이 아닌 실측 값이 있는 행에 대해서만 정규화가 되도록 하고 싶은데,
    그러한 행들만 불러오는 코드를 파이썬 판다스로 어떻게 짜야 하는지 궁금합니다.!

    데이터 프레임은 df라는 이름으로 받아 놓은 상태 입니다.

    • Rfriend 2020.01.29 16:55 신고  댓글주소  수정/삭제

      안녕하세요 kjh님,

      (1) 쉽게 하는 방법으로는

      (a) 각 변수의 결측값을 각 변수의 '평균'으로 대체한 후에
      df.fillna(df.mean())
      (참고: https://rfriend.tistory.com/268)

      --> (b) 각 변수를 평균과 표준편차를 사용해서 표준화(standardization)
      하는 방법입니다.
      from sklearn.preprocessing import StandardScaler
      scaler = StandardScaler.fit(df)
      df_scaled = scaler.transform(df)
      (참고: https://rfriend.tistory.com/268)

      이렇게 되면 하면 평균으로 대체된 결측값의 경우 표준화된 값은 '0'으로 처리됩니다.


      (2) 좀 복잡한 방법으로는
      (a) 각 변수별로 결측값이 아닌 값만 subset 을 한 후에,
      --> (b) 각 변수별로 이들 값들에 대해서만 표준화를 하고,
      --> (c) 각 변수별로 다시 표준화한 값과 기존의 결측값을 합치고,
      --> (d) 위의 (a), (b), (c) 절차를 각 변수별로 적용해줍니다.

      이렇게 하면 결국은 나중에 통계분석을 하려고 할때 결국에는 결측값 처리를 해야 하는 문제에 다시 봉착할 겁니다.
      그래도 혹시 (2)번 방법 코드가 필요하시면 추가로 댓글 남겨주세요.

  2. codebugs 2020.07.13 09:04  댓글주소  수정/삭제  댓글쓰기

    안녕하세요, 늘 글 잘 보고 있는 독자입니다.
    위 설명에 이미지분석에서 interpolation이 자주 활용된다고 기재해 주셨는데요.
    혹시 구체적으로 어떤 이유 때문인지 부연 가능하실까요?

    • Rfriend 2020.07.13 10:37 신고  댓글주소  수정/삭제

      안녕하세요 codebugs님, 반갑습니다.

      이미지 분석에 보간법이 사용된다고 했던 것은 'X, Y 좌표 개념이 있는 공간 이미지 데이터가 샘플링이 되어 측정이 된 경우 이를 보간법으로 결측치를 채울 수 있다'는 뜻으로 사용하였습니다. (포스팅 본문 수정하였습니다)

      가령, 기상청에서는 각 지역 기상측정소별(위도, 경도 좌표)로 온도, 습도, 강수량 등을 측정하였다고 할 경우, 기상측정소와 기상측정소 간의 나머지 위/경도 좌표 지점은 측정값이 없게 되는데요, 이럴 경우 보간법으로 나머지 좌표를 채울 수 있을 것입니다.

      또는, 반도체 회사에서 웨이퍼에 Photo 공정 후에 웨이퍼의 9군데(상좌, 상중, 상우, 중좌, 정중앙, 중우, 하좌, 하중, 하우) 위치만 샘플링해서 Photo 공정의 품질을 측정합니다. 그러면 이들 9군데 spot 외에 있는 웨이퍼 내 칩들은 품질 측정값이 없게 되는데요, 이럴때도 X, Y 공간좌표 개념을 이용해서 보간을 할 수 있습니다.

      꼭 이미지일 필요는 없구요, X/Y 좌표 상에서 측정된 데이터이고 근접한 데이터와 관련/연속성이 있는 데이터라면 interpolation을 통한 결측값 채우기가 가능하다고 보시면 되겠습니다.

  3. 익명 2021.09.04 13:26  댓글주소  수정/삭제  댓글쓰기

    비밀댓글입니다

    • Rfriend 2021.09.04 13:32 신고  댓글주소  수정/삭제

      <파이썬 라이브러리를 활용한 데이터 분석>, <Hands-on Machine Learning with Scikit-Learn and TensorFlow> 책 좋아요. 추천합니다. 저는 둘다 원서로 읽었는데요, 번역서 있어요.