일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- 제로베이스 데이터사이언스
- 파이썬코딩도장
- 스크랩
- AIFFEL
- 제어문
- 자연어처리
- 데이터분석
- 함수
- AI
- Set
- 데이터사이언스 스쿨
- NLP
- 아이펠
- 추천시스템
- 클래스
- 속성
- 데이터사이언티스트
- 딕셔너리
- 후기
- numpy
- 머신러닝
- 딥러닝
- 카카오
- TensorFlow
- 사이킷런
- 재귀함수
- 기사
- 파이썬
- Python
- 코딩도장
- Today
- Total
뮤트 개발일지
AIFFEL 아이펠 다양한 데이터 전처리 기법 본문
결측치 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 함수
[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 |