대학원 일기

전처리 기법: 결측치(Missing Data) 본문

AI/인공지능 기초

전처리 기법: 결측치(Missing Data)

대학원생(노예) 2023. 11. 9. 10:25

[관세청 수출입 무역 통계]를 가공한 데이터로 실습해보겠다.

https://tradedata.go.kr/cts/index.do

 

관세청 수출입무역통계

수출입 현황, 물류통계 등 관세청 무역통계정보를 종합적으로 제공

tradedata.go.kr

 

데이터 테이블의 헤드를 확인하면 다음과 같다.

trade.head()

 

결측치

결측치는 데이터에서 Null, None, Na, NaN 등으로 표기되며, 데이터 수집 과정에서의 오류, 기록의 누락, 미 응답 등이다.데이터 분석할 때, 결측치가 존재하면 문제가 발생하므로 데이터를 가공하여 결측치를 수정 및 제거하여 처리해야한다.

 

결측치를 처리하는 방법은 크게 두 가지 방법이 있다.

- 결측치가 있는 데이터를 제거한다.

- 결측치를 어떠한 값으로 대체한다.

 

데이터에서 결측치의 개수를 확인하는 방법은 '전체 데이터 건수 - 각 컬럼별 값이 있는 데이터 수' 이다.

즉 코드로 작성하면 다음과 같다.

print('전체 데이터 건수:', len(trade))
print(trade.count())
len(trade) - trade.count()

 

'기타사항' 칼럼은 모두 결측치이기 때문에 '기타사항' 칼럼은 drop을 통해 삭제한다.

trade = trade.drop('기타사항', axis=1) # axis= 0:row, 1:column
trade.head()

 

'기타사항' 칼럼이 삭제되었다.

 

Dataframe.isnull() 함수는 데이터마다 결측치 여부를 True, False로 반환한다. DataFrame.any(axis=1)는 행마다 하나라도 True가 있으면 True, 그렇지 않으면 False를 반환한다.

trade[trade.isnull().any(axis=1)]

191, 196, 197, 198 인덱스에 결측치가 있는 것을 확인했다. 그 중에서 196, 197, 198은 국가 빼고 모두 결측치이므로 인덱스 row 통으로 삭제한다. 결측치를 삭제해주는 메서드인 dropna() 와  subset 옵션으로 특정 칼럼을 선택해보겠다. 그리고 how 옵션으로 선택한 칼럼 전부가 결측치인 행을 삭제하겠다는 의미로 all을 선택한다. (any는 하나라도 있을 때)

그리고 inplace 옵션으로 Datafame 내부에 바로 적용했다.

trade.dropna(how='all', subset=['수출건수', '수출금액', '수입건수', '수입금액', '무역수지'], inplace=True)
trade[trade.isnull().any(axis=1)]

 

 

결측치가 있는 인덱스는 191번만 남게 되었다. 191번 인덱스는 무역수지와 수출금액만 결측치이기 때문에 해당 결측치만 처리해보겠다. 

 

191번 인덱스와 같은 수치형 데이터를 보완할 방법은 많다.

  1.  특정 값을 지정한다. 결측치가 많아 대체하는 값이 많을 경우, 데이터의 분산이 작아질 수 있음.
  2. 평균, 중앙값 등으로 대체한다. 결측치가 많아 대체하는 값이 많을 경우, 데이터의 분산이 작아질 수 있음.
  3. 다른 데이터를 이용하여 예측값으로 대체할 수 있다. 
  4. 시계열 특성을 가진 데이터의 경우 앞뒤 데이터를 통해 결측치를 대체할 수 있다. 

191번 인덱스의 결측치 처리는 4번(시계열 특성)을 이용해보겠다. 191번 인덱스의 국가는 미국이고 기간은 2020년 4월이므로 이에 대한 전후 데이터를 불러와보겠다. 

trade[(trade['국가명']=='미국')&((trade['기간']=='2020년 03월')|(trade['기간']=='2020년 05월'))]

188, 194번 인덱스가 191번 인덱스의 시계열 특성 전후에 해당되는 것을 확인했다.

 

191번 인덱스의 수출금액 결측치는 188번 인덱스와 194번 인덱스의 수출금액 평균으로 대체하겠다.

trade.loc[191, '수출금액'] = (trade.loc[188, '수출금액'] + trade.loc[194, '수출금액'] )/2
trade.loc[[191]]

 

191번 인덱스의 무역수지는 수출금액에서 수입금액을 뺀 값으로 대체하겠다. 

trade.loc[191, '무역수지'] = trade.loc[191, '수출금액'] - trade.loc[191, '수입금액']
trade.loc[[191]]

 

이로써 결측치를 모두 처리했다.

'AI > 인공지능 기초' 카테고리의 다른 글

전처리 기법: 이상치(Outlier)  (1) 2023.11.12
전처리 기법: 중복 데이터  (0) 2023.11.11
Machine Learning 기초  (0) 2022.05.11
머신러닝(ML)과 딥러닝(DL)의 차이  (0) 2022.03.14
딥러닝: 최적화(Optimization)  (0) 2022.03.07
Comments