뮤트 개발일지

AIFFEL 아이펠 다양한 데이터 전처리 기법 본문

AIFFEL

AIFFEL 아이펠 다양한 데이터 전처리 기법

박뮤트 2022. 1. 5. 10:58

결측치 Missing Data

결측치를 처리하는 방법

1. 결측치가 있는 데이터를 제거한다. 2. 결측치를 어떤 값으로 대체한다.

 

결측치 여부 알아보기

열) 전체 데이터 건수 - 각 컬럼별 값이 있는 데이터 수

print('컬럼별 결측치 개수')
len(trade) - trade.count()

행)

- DataFrame.isnull(): 데이터마다 결측치 여부를 True, False로 반환

- DataFrame.any(axis=1): 행마다 하나라도 True가 있으면 True, 그렇지 않으면 False 반환

위의 두 가지를 순서대로 적용하면 '각 행이 결측치가 하나라도 있는지'여부를 알 수 있음

- dropna: 결측치를 삭제해주는 메서드

- subset옵션: 특정 컬럼들 선택

- how옵션: 선택한 컬럼 전부가 결측치인 행을 삭제하겠다는 의미로 all(any: 하나라도 결측치인 경우 사용)

- inplace옵션: 해당 DataFrame 내부에 바로 적용

trade.dropna(how='all', subset=['수출건수', '수출금액', '수입건수', '수입금액', '무역수지'], inplace=True)
print("👽 It's okay, no biggie.")

수치형 데이터를 보완하는 방법

- 특정 값을 지정한다. 그러나 결측치가 많은 경우, 모두 같은 값으로 대체한다면 데이터의 분산이 실제보다 작아지는 문제가 생길 수 있다.

- 평균, 중앙값 등으로 대체한다. 1번과 마찬가지로 결측치가 많은 경우 데이터의 분산이 실제보다 작아지는 문제가 생길 수 있다.

- 다른 데이터를 이용해 예측값으로 대체한다.

- 시계열 특성을 가진 데이터의 경우 앞뒤 데이터를 통해 결측치를 대체한다.

 

- DataFrame(행 라벨, 열 라벨): 해당 라벨을 가진 데이터 출력

 

범주형 데이터를 보완하는 방법

- 특정 값을 지정한다. (예) '기타', '결측' 과 같이 새로운 범주를 만들어 결측치를 채울 수 있다.

- 최빈값 등으로 대체한다. 결측치가 많은 경우 최빈값이 지나치게 많아질 수 있으므로 결측치가 많을 때는 다른 방법을 사용한다.

- 다른 데이터를 이용해 예측값으로 대체할 수 있다.

- 시계열 특성을 가진 데이터의 경우 앞뒤 데이터를 통해 결측치를 대체할 수 있다. 


중복된 데이터

같은 값을 가진 데이터 없이 행(row) 별로 값이 유일해야 할 때 중복된 데이터를 제거한다.

 

- DataFrame.duplicated(): 중복된 데이터 여부를 불리언 값으로 반환

- DataFrame.drop_duplicates: 중복된 데이터 삭제. subset, keep 옵션을 사용한다.

df.drop_duplicates(subset=['id'], keep='last')

===> id value의 마지막 행 삭제


이상치Outlier

이상치: 대부분의 값의 범위에서 벗어나 극단적으로 크거나 작은 값을 의미한다. 몇 개의 이상치 때문에 대부분의 값의 차이는 의미가 없어지게 된다. 극단적인 값이 생기는 경우를 제외하고 데이터를 고려하고 싶을 때 이상치를 제거하고 분석한다.

 

이상치를 찾는 방법 z score 방법: 평균을 빼주고 표준편차로 나눠 z score({\frac {X-\mu }{\sigma }})(σX−μ​)를 계산. 이 z score가 특정 기준을 넘어서는 데이터에 대해 이상치라고 판단한다. (기준을 작게하면 이상치라고 판단하는 데이터가 많아지고, 기준을 크게하면 이상치라고 판단하는 데이터가 적어진다.)

 

이상치를 처리하는 방법

- 이상치 삭제

- 이상치를 다른 값으로 대체. 예) 최댓값, 최솟값을 설정해 데이터의 범위 제한

- 다른 데이터를 활용해 예측 모델을 만들어 예측값을 활용하는 방법

- binning을 통해 수치형 데이터를 범주형으로 바꾼다.

 

z-score method

def outlier(df, col, z):
    return df[abs(df[col] - np.mean(df[col]))/np.std(df[col])>z].index

데이터프레임df, 컬럼col, 기준z를 인풋으로 받는다. 

- abs(df[col] - np.mean(df[col])): 데이터에서 평균을 빼준 것에 절대값을 취한다.

- abs(df[col] - np.mean(df[col]))/np.std(df[col]): 위의 작업에 표준편차로 나눈다.

- df[abs(df[col]) - np.mean(df[col]))/np.std(df[col])>z].index: 값이 z보다 큰 데이터의 인덱스 추출

 

z score의 한계

- Robust하지 못하다. 평균과 표준편차 자체가 이상치의 존재에 큰 영향을 받기 때문

- 작은 데이터셋의 경우 z-score의 방법으로 이상치를 알아내기 어렵다. 특히 item이 12개 이하인 데이터셋에서는 불가능하다.

 

IQR method

: 제 3사분위수에서 제 1사분위 값을 뺀 값으로 데이터의 중간 50%의 범위라고 생각하자.

Q_1 - 1.5*IQR보다 왼쪽에 있거나, Q_3 + 1.5*IQR 보다 오른쪽에 있는 경우 우리는 이상치라고 판단한다.

 

IQR로 이상치를 구하기 위해, 

1. 제 1사분위수와 제 3사분위수를 구한다.

2. IQR, 제 1사분위수, 제 3사분위수를 이용해 이상치를 구한다.

Q3, Q1 = np.percentile(data, [75 ,25])
IQR = Q3 - Q1
IQR
data[(Q1-1.5*IQR > data)|(Q3+1.5*IQR < data)]


정규화Nomalization

각 컬럼별로 단위가 달라 스케일이 크게 차이가 나면 전처리 과정에서 데이터를 정규화한다.

정규화하는 방법으로는 표준화Standardization와 Min-Max Scaling이 있다.

 

표준화Standardization

데이터의 평균은 0, 분산은 1로 변환

# 데이터 x를 Standardization 기법으로 정규화합니다. 
x_standardization = (x - x.mean())/x.std() #평균을 빼고 표준편차로 나눔
x_standardization

Min-Max Scaling

# 데이터 x를 min-max scaling 기법으로 정규화합니다. 
x_min_max = (x-x.min())/(x.max()-x.min()) # 최소값을 빼주고, '최대값-최소값'으로 나눈다.
x_min_max

scikit-learn의 StandardScaler, MinMaxScaler를 사용하는 방법

from sklearn.preprocessing import MinMaxScaler
train = [[10, -10], [30, 10], [50, 0]]
test = [[0, 1]]
scaler = MinMaxScaler()
scaler.fit_transform(train)
scaler.transform(test)

(이해 못함. 이런 것도 있구나하고 일단은 넘어가자)


원-핫 인코딩 One-Hot Encoding

카테고리별 이진 특성을 만들어 해당하는 특성만 1, 나머지는 0으로 만드는 방법

 

get_dummies 함수

https://devuna.tistory.com/67

 

[pandas] pd.get_dummies() : 데이터전처리/가변수 만들기

[pandas] pd.get_dummies() : 가변수 만들기 머신러닝을 할 때 기계가 이해할 수 있도록 모든 데이터를 수치로 변환해주는 전처리 작업이 필수적이다. 예를들어, 숫자가 아닌 object형의 데이터들이

devuna.tistory.com

(보고 정리하기)


구간화Binning

데이터를 구간별로 나누고자 하는 것

pandas의 cut과 qcut 사용

(아래 예시 코드에서는 salary라는 데이터 셋 존재)

1. cut을 사용하기 위해 구간 정하기

bins = [0, 2000, 4000, 6000, 8000, 10000]

2-1. cut 함수에 데이터와 구간을 입력 ===> 데이터를 구간별로 나눠준다.

ctg = pd.cut(salary, bins=bins)
ctg

2-2. 또는 구간의 개수를 지정해도 된다. bins옵션에 정수를 입력하면 최소값에서 최대값을 균등하게 bins 개수만큼 나눠준다.

ctg = pd.cut(salary, bins=6)
ctg

 

qcut은 구간을 일정하게 나누는 것이 아니라 데이터의 분포를 비슷한 크기의 그룹으로 나눈다.

ctg = pd.qcut(salary, q=5)
ctg

'AIFFEL' 카테고리의 다른 글

AIFFEL 아이펠 9일차  (0) 2022.01.06
AIFFEL 아이펠 8일차  (0) 2022.01.05
AIFFEL 아이펠 7일차  (0) 2022.01.05
AIFFEL 아이펠 6일차  (0) 2022.01.03
AIFFEL 아이펠 파이썬으로 코딩 시작하기  (0) 2022.01.03