BLOG
인공지능

데이터 전처리: 누락된 데이터 처리


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



Search