관세청 수출입 무역 통계 데이터를 사용하여 데이터 전처리를 해보았다.
먼저 데이터를 준비한다.
데이터를 가지고 무언가를 하기 전에 데이터의 대한 기본 정보부터 알아야 한다.
해당 데이터에서 금액은 단위가 천 불(USD 1,000)이며 무역수지는 '수출금액 - 수입금액'이다.
> 결측치 (Missing Data) <
많은 데이터들은 결측치를 포함하고 있다. 결측치가 존재하는 데이터는 따로 처리를 해 주어야 한다.
결측치를 처리하는 방법은 두가지가 있다.
1. 결측치가 있는 데이터를 제거.
2.결측치를 다른 값으로 대체.
두 방법 중 데이터의 특성을 반영하여 적절한 방법을 선택하면 된다.
먼저 데이터에 결측치가 있는지 확인을 해야 한다.
'전체 데이터 건수 - 각 컬럼 별 값이 있는 데이터 수'를 하면 컬럼 별 결측치 개수를 알 수 있다.
기타사항을 보면 전부 결측치이기 때문에 정보가 없는 칼럼이라 판단 후 삭제한다.
trade = trade.drop('기타사항', axis=1)
trade.head()
결측치가 있는 행을 확인하기 위해 DataFrame.isnull()을 사용한다. 이는 결측치 여부를 True, False로 반환한다.
index 196,197,198은 기간, 국가명 제외 모두 결측값이기에 삭제해도 좋다.
index 191은 수출금액과 무역수지만 결측값이기에 이는 다른 값으로 대체가능하다.
이러한 수치형 데이터를 보완하는 방법은 4가지가 있다.
1. 특정 값을 지정하기.
2. 평균, 중앙값으로 대체하기.
3. 다른 데이터를 활용 해 예측 값으로 대체하기.
4. 앞뒤 데이터를 통해 결측치 대체하기.
해당 index 191은 앞뒤 데이터를 통해 값을 대체할 것이다.
수출금액은 이전 달과 다음 달의 평균으로, 무역수지는 수출금액과 수입금액의 차이를 이용하여 결측치를 대체한다.
위의 과정을 거치면 결측치였던 수출금액과 무역수지에 값을 채워넣게 된다.
> 중복된 데이터 <
같은 값을 가진 데이터 없이 row 별로 유일한 값을 가지는 데이터가 되어야 한다면 중복된 데이터로 제거 해 주어야 한다. 위의 결측치처럼 먼저 중복된 데이터를 확인한다.
index 186, 187에서 데이터가 중복된 것을 알 수 있다.
DataFrame.drop_duplicates를 사용하여 중복된 데이터를 삭제할 수 있다.
DataFrame.drop_duplicates의 subse, keep을 통해 중복을 제거 할 수 있다.
> 이상치 (Outlier) <
대부분 값의 범위에서 벗어난, 극단적으로 크거나 작은 값을 이상치라고 한다.
극단적인 값이 생기는 경우를 제외하여 데이터를 고려할 때 이상치를 제거하고 분석해야 한다.
- z score 방법
자주 사용되는 방법으로는 평균과 표준편차를 이용하는 'z score'방법이 있다.
Z score = (x -mean) / std.deviation
평균을 빼고 표준편차로 나누어 계산을 했을 때 z score가 특정 기준을 넘어서는 데이터를 이상치라고 판단한다.
이상치를 판단한 후에는 이상치를 삭제, 다른 값으로 대체, 다른 데이터를 활용 해 예측값 사용, bining을 통해 수치형 데이터를 범주형으로 바꾸는 방법 등,
결측치와 마찬가지로 데이터의 특성에 맞는 방법으로 해결하면 된다.
outlier :
이상치인 데이터의 인덱스를 반환하는 함수. input 으로는 데이터프레임(df), 칼럼(col), 기준(z)를 받는다.
데이터에서 평균을 빼 절댓값을 취한 것을 표준편차로 나누어 준다. 값이 z보다 큰 데이터의 인덱스를 반환한다.
무역수지의 이상치를 확인하는 기준이 되는 값이 커질수록 이상치가 적어지는 것을 볼 수 있다.
z score 방법은 평균과 표준편차 자체가 이상치의 존재에 크게 영향을 받는다. 또 작은 데이터셋의 경우 이 방법으로 이상치를 알아내기 어렵다.
이러한 한계점을 가진 z score 방법의 대안으로 IQR(Interquartile range)로 이상치를 알아낼 수도 있다.
- IQR method
사분위범위수 IQR(Interquartile range)를 사용하여 이상치를 찾을 수 있다.
IQR = Q3 − Q1
IQR은 제 3사분위수에서 제 1사분위수를 뺀 값이다. 즉 데이터의 중간 50%의 범위이다.
보다 왼쪽에 있거나, Q_3 + 1.5*IQR 보다 오른쪽에 있는 경우 우리는 이상치라고 판단한다.
제 1사분위수와 제 3사분위수를 구하여 이상치를 확인할 수 있다.
> 정규화(Normalization) <
다시 관세청 수출입 무역 통계 데이터로 돌아와서, 수입 건수, 금액, 무역수지는 각각 단위가 다 다르다.
칼럼마다 스케일의 차이가 꽤 날 대는 머신러닝 모델 학습에서 문제가 생길 수도 있다.
때문에 칼럼 간 범위가 다를 때 전처리 과정에서 데이터를 정규화한다.
정규화 방법 중 가장 잘 알려진 표준화(Standardization)와 Min-Max-Scaling을 통해 전처리를 하였다.
- 표준화(Standardization)
정규화를 시킬 수치형 칼럼들을 변수에 담은 후 데이터에서 평균을 빼고 표준 편차로 나누어 준다.
standardization 방법으로 정규화시킨 데이터를 보면 각 칼럼들의 평균은 거의 0에 가까우며, 표준편차는 1에 가까운 것을 볼 수 있다.
- Min-Max-Scaling
데이터에서 최소값을 빼고 '최대값 - 최소값'으로 나누어 준다.
Min-Max Scaling 방법으로 정규화시킨 후,
각 컬럼의 최소값(min)은 0, 최대값(max)은 1인 것을 볼 수 있다.
데이터가 train 데이터와 test 데이터가 나누어져 있을 때는 train 데이터를 정규화시킨 기준 그대로 test 데이터도 정규화 시켜주어야 한다.
scikit-learn에서 제공하는 StandardScaler, MinMaxScaler를 사용하는 방법도 있다.
로그 변환 등의 기법도 정규화화 함게 사용하면 도움이 되기도 한다.
> 원-핫 인코딩 (One-Hot Encoding) <
원-핫 인코딩은 카테고리별 이진 특성을 만들어 해당 특성을 1, 나머진 모두 0으로 만드는 것이다.
머신러닝과 딥러닝의 프레임워크에서 범주형을 지원하지 않으면 원-핫 인코딩을 해야한다.
get_dummies 함수를 사용하면 쉽게 원-핫 인코딩을 할 수 있다.
pd.concat 함수로 trade와 country를 합친 후 필요 없는 국가명 칼럼을 삭제하면 원하는 데이터 프레임이 된다.
> 구간화 (Binning) <
데이터를 구간 별로 나눌 때 사용하는 기법을 구간화라고 한다.
연속적인 데이터(ex. 히스토그램)를 구간을 나누어서 분석할 때 주로 사용한다.
pandas의 cut과 qcut을 사용하여 수치형 데이터를 범주형 데이터로 변형 시킨다.
cut을 사용하기 전 구간을 먼저 정해야 하며,
cut 함수에 데이터와 나눈 구간을 입력하면 데이터를 정한 구간별로 나눈다.
qcut은 데이터의 분포를 비슷한 크기의 그룹으로 나눈다.
위의 과정들을 모든 데이터에 대해 적용하는 것은 아니다.
데이터 전처리는 데이터의 특성에 맞게 해주어야 한다.