1. IQR을 사용한 이상치 탐지
IQR은 1사분위 수 (Q1)과 3사분위 수 (Q3)의 차이로, 이 범위를 벗어나는 데이터를 이상치로 간주할 수 있음
Q1 = df["age"].quantile(0.25)
Q3 = df["age"].quantile(0.75)
IQR = Q3 - Q1
lower_bound = Q1 - 1.5 * IQR
upper_bound = Q3 + 1.5 * IQR
outliers = df[(df["age"] < lower_bound) | (df["age"] > upper_bound)]
print(outliers)
2. 이상치 처리
1. 이상치 감지
2-1. 결측치 처리
2-2. 이상치 처리
3. 데이터 전처리
- 데이터 정규화
정규화는 데이터의 범위를 0과 1 사이로 변환하는 과정이다.
이는 서로 다른 범위를 가진 데이터를 동일한 스케일로 맞추어 비교하기 쉽게 만듦
전처리를 위한 라이브러리 : scikit-learn
from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler()
normalized_df = pd.DataFrame(scaler.fit_transform(df), columns=df.columns)
print(normalized_df)
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
standardized_df = pd.DataFrame(scaler.fit_transform(df), columns = df.columns)
print(standardized_df)
로그 변환
로그 변환은 양의 데이터에서 주로 사용되며, 데이터의 분포를 좁히는 데 유용함
특히 지수 분포를 가진 데이터를 다룰 때 효과적임
제곱근 변환
제곱근 변환은 데이터의 분포를 평탄하게 만들기 위한 또 다른 방법임. 특히, 포아송 분포를 가진 데이터에서 사용됨
(특정 시간 동안 콜센터에 걸려오는 전화의 수, 도로를 통과하는 차량의 수, 페이지에 나타나는 오타의 수 등이 포아송 분포의 예가 될 수 있습니다. - ChatGPT)
(모델이 정규 분포를 따를 때 사용하면 모델의 성능을 더 높여줄 수 있겠음)
import numpy as np
df["특성1_log"] = np.log(df["특성1"])
print(df)
df["특성1_sqrt"] = np.sqrt(df["특성1_sqrt"])
print(df)
from scipy.stats import boxcox
df["특성1_boxcox"], _ = boxcox(df["특성1"])
print(df)
# RobustScaler 사용하기
# 중앙값과 IQR 방법을 이용해서 scaling 하는 것임
from sklearn.preprocessing import RobustScaler
scaler = RobustScaler()
scaled_df = scaler.fit_transform(df)
scaled_df = pd.DataFrame(scaled_df, columns=df.columns)
scaled_df
3. 데이터 전처리
- 인코딩
from sklearn.preprocessing import LabelEncoder
data = {"과일" : ["사과", "바나나", "오렌지", "바나나"]}
df = pd.DataFrame(data)
label_encoder = LabelEncoder()
df["과일_인코딩"] = label_encoder.fit_transform(df["과일"])
# 그러면 과일_인코딩 칼럼에 과일 이름이 인코딩한 결과값이 들어가게 됨
원-핫 인코딩
원-핫 인코딩은 각 범주를 이진 벡터로 변환함
각 범주는 고유한 열을 가지며, 해당하는 열에는 1을, 나머지 열에는 0이 할당됨
장점 : 범주형 데이터에 순서가 없을 때 사용하기 좋음, 모델이 범주 간의 순서나 관계를 인식하지 않고 각 범주를 독립적으로 처리할 수 있음
df_one_hot = pd.get_dummies(df["과일"], prefix="과일")
df_one_hot
df["과일_빈도"] = df["과일"].map(df["과일"].value_counts())
print(df)
data = {"등급" : ["낮음", "중간", "높음", "중간", "높음"]}
df = pd.DataFrame(data)
# 순서형 인코딩
order = {"낮음": 1, "중간": 2, "높음": 3}
df["등급_인코딩"] = df["등급"].map(order)
print(df)
- 임베딩
고차원 데이터를 저차원 데이터로 바꿔주는 것임
유사할수록 유사도가 높게 나오는 것이 특징임