Python을 이용한 결측치 대체하기(2)
2022.08.01 - [데이터 가공] - Python을 이용한 결측치 대체하기(1)
이전 글에 이어서 작성해보도록 하겠습니다.
5) 결측치를 회귀모형 추정값으로 대체하기
방법을 먼저 말씀드리자면!
결측값을 제외한 데이터를 이용하여 선형회귀모형 훈련을 시키고,
추정값을 계산하여 결측치를 추정값으로 대체하는 방법입니다.
데이터프레임은 지난시간에 사용했던 데이터를 그대로 이용해보겠습니다.
데이터가 너무 단순해서 선형회귀모형 훈련을 시키기 민망하지만,
한눈에 쉽게 알아보기위해서 그대로 사용하겠습니다.
코드는 동일하게 적용하시면 됩니다.
먼저, 선형회귀 모델을 불러와주고 이를 l_reg이라는 변수에 넣어주도록 하겠습니다.
이전 게시글에서 불러왔던 pandas와 Series, DataFrame도 다시한번 불러와주도록 하겠습니다.
import pandas as pd
from pandas import Series, DataFrame
from sklearn import linear_model
l_reg = linear_model.LinearRegression()
그리고 저희는 결측치를 다른과목의 점수를 토대로 값을 추정해야하기 때문에
결측치가 있는 행을 제외하고, ['국어', '영어', '수학', '역사']의 컬럼을 학습시키기 위해 dropna 함수를 사용해 데이터프레임을 만들어 변수 X에 담도록 하겠습니다.
그리고, '과학' 컬럼의 추정값이 필요하기 때문에 학습시킬 '과학'컬럼만 따로 변수 y에 담아주도록 하겠습니다.
X = data.dropna(axis=0)[['국어', '영어', '수학', '역사']]
y = data.dropna(axis=0)['과학']
이렇게 하면 아래와 같이 데이터가 구성됩니다.
자, 그럼 이제 학습을 시켜보겠습니다.
학습시키는 모델을 저는 l_reg_model이라는 변수에 넣어주도록 하겠습니다.
l_reg_model = lin_reg.fit(X, y)
이제 준비가 됐습니다. 바로 예측을 해볼까요?
저희는 ['국어', '영어', '수학', '역사'] 이 컬럼들을 토대로 '과학' 점수를 예측해야합니다.
y_pred = l_reg_model.predict(data.loc[:, ['국어', '영어', '수학', '역사']]) # loc : 행 / iloc : 열
예측한 값이 y_pred에 담겼습니다. 과연 어떻게 예측이 됐을까요?
y_pred를 살펴보면 다음과 같습니다.
이제 이 추정값을 결측치에 넣어주기만 하면 됩니다!
앞 게시글에서 살펴봤던 결측치를 채워주는 fillna 함수를 이용할 것입니다.
data['과학'].fillna(pd.Series(y_pred), inplace=True)
cf. Series란?
각 컬럼의 단위를 Series라고 하고, Series가 모여 하나의 데이터프레임을 이루게 됩니다.
저는 inplace = True를 이용해서 data에 덮어쓰기처럼 해버렸습니다!
그럼, data가 어떻게 바뀌었는지 한번 볼까요?
결측치들이 잘 대체된 것 같네요!
## 번외로 저는 저 소수점이 싫어서 모두 정수로 바꾸어 넣어주도록 하겠습니다.
정수로 바꾸는 것이 아니라 소수점 몇째자리까지 반올림하고싶다! 하시는 분들은 round 함수 사용하시면 됩니다.
(올림 : ceil 함수 / 내림 : floor 함수 / 버림 : trunc 함수)
data['과학'] = data['과학'].astype(int)
type을 int로 바꿔주는 코드입니다.
이렇게 하면 데이터가...!
짜잔! 훨씬...나아보입니다!!ㅎㅎㅎ
이렇게 결측치 처리편을 마쳐보고자 합니다.
추후에 또 배우게 되는 내용이 있으면 업데이트 하도록 하겠습니다~