let us not love with words or tongue but actions and truth.

IT/파이썬

선형보간법(interpolation)으로 결측치 채우기

sarah0518 2021. 4. 21. 22:10

 

파이썬에서 결측치를 채울 때 흔히 쓰는, fillna이라는 함수가 있지요.

 

단순히 fillna를 특정값으로 대체하기 위해서 쓰입니다.

 

빈칸에는 동일한 특정값으로 모두 대체되지요.

 

 

하지만!!

 

조금 더, 통계적인 방법으로 자연스럽게 결측치를 채워주는 방법도 있습니다.

 

바로 선형보간법을 활용하는 방법인데요.

 

 

 

 

우선 아래와 같은 데이터가 있다고 해볼게요.

 

각 ID그룹( AA/BB/CC/DD) 별로 3번째의 칸이 결측치입니다.

(특정 중간값인 3이라는 ID를 새로 만들었다고 해 볼 수도 있지요)

 

 

선형 보간 법은,

이 값이 빈칸일때 그냥 fillna로 동일 값을 채우는 것 보다는

 

11.32와 12.01까지 직선으로 연결한 다음, 그 중간값을 채우는 것이

 

조금 더 맞다고 보는 방법이에요.

 

 

 

 

우린 이 데이터를 선형보간법을 해주는 함수인 INTERPOLATE( )를 사용하여 채워보기로 할게요.

 

저는 함수로 각 id별 묶어서 interpolation을 했습니다.

 

1
2
3
4
5
6
def interpolated(df):
    temp=[]
    for i in df['ID'].unique():
        temp.append(df[df['ID']==i].interpolate())
    new_df=pd.concat(temp,axis=0)
    return new_df
cs

 

 

위에 처럼 함수로 만들어 놓으면 다른 dataset에도 동일하게 적용가능하니 참고하세요!

 

1
new_df=interpolated(old_df)
cs

 

이렇게 한줄만 나중에 입력해주시면

 

new_df라는 데이터에는 아래와 같이 빈칸 없이 꽉 찬 데이터가 들어가있습니다.

 

 

근데 만약 중간에 데이터가 있으면

 

선형보간법으로 linear한 기울기로 판단해서 값을 채워넣겠지만

 

끝 값인 AA5나 DD5에 결측치가 있다면 어떤 값으로 채워질까요?

 

 

위에 표에서는 DD5를 추정할 수 있는 DD6이라는 값이 없는 상태입니다.

 

 

이럴 때,

 

선형보간법에서는 위에 있는 값(DD4)을 그대로 가져와서 채워넣어

 

DD5의 A_col에는 14.2623이 들어가게됩니다.