데이터 전처리

juyeon·2022년 10월 27일
0

데이터 다루기

목록 보기
33/35
post-custom-banner

import

import numpy as np
import pandas as pd

데이터프레임 행/열 제거

df.drop(columns=['열1', '열2'])

inplace: 원본 대체. default False
axis: 0: row, 1: column
columns: str, 혹은 list 안에 str들을 넣기. 이러면 axis=1 로 한것과 같음. ex. ['열1', '열2']

데이터 type 변경하기

  • 먼저 info나 dtype으로 확인하고, head나 unique, value_counts로 내용물 확인하여 일치하는지 확인하기
  • 만약, type 이 섞여있다면 치환하기
df['열1'] = df['열1'].replace("_", np.NaN)
  • 결측치(NaN)는 int로 변경이 되지 않음. 이 경우, float type으로 변경해야함
df = df.astype({'열1': float})
df['열1'] = df['열1'].astype(float)

결측치

결측치 확인

df.isna().sum()
df.isnull().sum()

결측치 제거

df = df.dropna() 

axis: 0: row, 1: column. default 0
how: all: 모든 항목이 NA인 row만 제거
thresh: 임계치. 그보다 많은 개수의 NA가 존재하는 row를 삭제
subset: 특정 column에 있는 NA만 참고하여 제거. list안에 str로 column명 넣음.

결측치 채우기

앞/뒤의 값으로 채우기

df = df.fillna(method='backfill')

method: ffill: 앞의 값으로 채움, backfill: 뒤의 값으로 채움. 첫 또는 마지막 record가 결측치인 경우 주의해야함

특정 값으로 채우기

df = df.fillna(10)
df['열1'] = df['열1'].replace(np.nan, df['열1'].median())
df["열1"] = df["열1"].fillna(df["열1"].median())

## 모든 수치형 컬럼 결측치를 각 컬럼의 중앙값으로 채우기
df = df.fillna(df.median(numeric_only=True)) # numeric_only=True: 숫자, 소수, 부울값만 있는 열에대해서만 연산을 수행

이상치 처리

수치형 데이터 이상치 처리하기

  • IQR(InterQuartile Range)을 이용하기
# Q1, Q3 구하기
q1 = df['열1'].quantile(0.25)
q3 = df['열1'].quantile(0.75)

# IQR = 1.5 * (Q3 - Q1)
iqr = 1.5 * (q3 - q1) 

age_min = q1 - iqr
age_max = q3 + iqr

이상치 제거하기

# 이상치 제거하기
df_data=df[(df['age_itg_cd'] < age_max) & (df['age_itg_cd'] > age_min)] # 이상치가 아닌 애들만 변수에 저장

이상치 변경하기

# 이상치를 변경
df[(df['열1'] > age_max)]= age_max
df[(df['열1'] < age_min)]= age_min

범주형 데이터 이상치 처리하기

  • 먼저 이상치 확인: value_counts로 너무 적은 개수를 확인하는등

이상치 제거하기

df = df[df['열1']!='AAA', ]

이상치 변경하기

  • 최빈치로 변경한다면
  • 범주형 데이터의 최빈치 값 확인하고
df_col_mode1 = df['열1'].value_counts().index[0]
df_col_mode1 = df['열1'].mode().values[0]

df['열1']=df['열1'].replace('AAA', df_col_mode1) # 최빈치로 변경한다면

Feature Engineering

Binning

  • 나이대("by_age") Feature 만들기
df['by_age']=df['age']//10*10 # 100나눈 몫. 즉 연령대(10씩 기준)만 뽑겠다
df=df.astype({'age': int, 'by_age':int})

Encoding: 범주형 변수를 변환

Label encoding

from sklearn.preprocessing import LabelEncoder
le = LabelEncoder()
df['열1'] = le.fit_transform(df['열1'])

One-hot encoding

df = pd.get_dummies(df, columns=['열1', '열2', '열3'], drop_first=True)

이제 진짜 모델링 전 준비!

feature / target 분리

target = '열 y'
x = df.drop(columns=[target])
y = df[target]

trian / test 분리

from sklearn.model_selection import train_test_split
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.3, stratify=y, random_state=42)

Scaling

  • 원래.. test 데이터에 train 데이터보다 큰 값은 없다는게 전제가 되어야함

정규화(Normalzation)

from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler()
x_train_s = scaler.fit_transform(x_train)
x_test_s = scaler.transform(x_test)

표준화(Standardization)

from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
x_train_s = scaler.fit_transform(x_train)
x_test_s = scaler.transform(x_test)
profile
내 인생의 주연
post-custom-banner

0개의 댓글