데이터 전처리: 누락된 데이터 처리
March 16, 2022, 11:38 p.m.
인공지능 모델을 훈련시키기 위해서는 잘 짜여진 모델도 중요하지만 그에 못지 않게 훈련 데이터도 중요합니다. 사실 성능이 좋은 모델들은 이미 많이 개발이 되어있고 사용하기도 쉽기 때문에 그에 맞는 데이터를 가공하는것이 점점 더 중요해지고 있습니다.
이번 포스트에서는 데이터 전처리 중에 누락된 데이터들을 어떻게 처리할 지에 대해서 알아보겠습니다.
1. 결측치 파악
누락된 데이터, 즉 결측치를 처리하기 전에 결측치가 얼마나 있는지 먼저 파악하는것이 중요하겠죠? 데이터프레임을 사용한다고 가정했을 때, info() 함수로 쉽게 결측치를 파악할 수 있습니다.
train = pd.read_csv('/content/drive/MyDrive/Kaggle/영화관객수/movies_train.csv')
train.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 600 entries, 0 to 599
Data columns (total 12 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 title 600 non-null object
1 distributor 600 non-null object
2 genre 600 non-null object
3 release_time 600 non-null object
4 time 600 non-null int64
5 screening_rat 600 non-null object
6 director 600 non-null object
7 dir_prev_bfnum 270 non-null float64
8 dir_prev_num 600 non-null int64
9 num_staff 600 non-null int64
10 num_actor 600 non-null int64
11 box_off_num 600 non-null int64
dtypes: float64(1), int64(5), object(6)
memory usage: 56.4+ KB
데이터를 가져오고 info함수를 실행했습니다. 위와 같이 각 열의 데이터 타입과 비어있지 않은 행의 개수를 알려줍니다. 총 600개의 행을 가지고 있는데 7번째 열만 270개만 유효하네요. 나머지 370은 결측치라는 것을 의미합니다.
2. 결측치 포함 행 제거
결측치를 잘 채워 넣는다면 좋겠지만 애매하다면 아예 결측치가 포함된 행이나 열을 없애버리는 것이 좋겠죠? dropna()를 이용해 쉽게 가능합니다.
train.dropna(axis=0) // 결측치가 포함된 행을 제거합니다.
train.dropna(axis=1) // 결측치가 포함된 열을 제거합니다.
예시로 든 데이터의 경우 결측치가 포함된 행을 제거하게 되면 훈련 데이터가 270개 밖에 남아있지 않게 되어 훈련에 어려움이 생깁니다. 그렇기 때문에 만약 결측치를 제거하고 싶다면 결측치가 있는 7번째 열을 제거하는 방안이 더 나아보이네요.
2. 결측치 대체
결측치를 대체할때는 주로 fillna()를 사용합니다. 특정 값으로 대체해 보겠습니다.
train = train.fillna(0)
결측치를 모두 0으로 대체했습니다.
해당 열의 평균값으로도 대체할 수 있겠네요.
train['dir_prev_bfnum'] = train['dir_prev_bfnum'].fillna(train['dir_prev_bfnum'].mean())
interpolate()를 이용해서 보간을 실시할 수도 있습니다.
train['dir_prev_bfnum'] = train['dir_prev_bfnum'].interpolate(method='values')
보간을 한다는 것은 행 간의 데이터가 연속적으로 이어져 있다는 것을 의미합니다. 시계열 데이터에 유용하게 쓰이겠네요!
또한 limit_direction설정으로 보간의 방향을 지정해 줄 수 있답니다. ('foward','backward','both)
train['dir_prev_bfnum'] = train['dir_prev_bfnum'].interpolate(method='values, limit_direction('both'))
위의 방법들을 이용해서 데이터를 잘 파악한 뒤 결측치를 잘 채워넣어 모델의 성능을 향상시켜보시길 바랍니다!
결측치 보간 interpolate Nan null