데이터 분석 - 정규 분포 활용
참고
비대칭(skewed) 데이터를 처리하는 3가지 방법 / Skewed Data
[ML] 데이터 스케일링 (Data Scaling) 이란?
[sklearn] 데이터 전처리 - 피처 스케일링 & 정규화
Pandas에서 데이터 정규화 하기
Why Data Normalization is necessary for Machine Learning models
### 예시
데이터셋에서 연령,소득범위 피처가 있을 때,
연령 범위는 0–100이고 소득 범위는 0–20,000 이상이다.
소득은 나이보다 약 1,000배 많고 범위는 20,000-500,000가 된다.
따라서 이 두 기능은 매우 다른 범위에 있고 소득이 몇배나 큰 수치이다.
**그런데 이것이 변수로서 소득이 더 중요하다는 것을 의미하지는 않는다.**
하지만, 소득의 값이 크기 때문에
소득이 인해 결과에 본질적으로 더 많은 영향을 미치게된다.
-> 이런경우 정규화가 필요하다.

데이터셋 House Data
# pandas 로 정규화 해보기
df = train[["SalePrice", "LotArea"]]
pnormal_df = (df - df.mean())/df.std()
print(pnormal_df)
pnormal_df.hist(bins=50, figsize=(20,8))

# sklearn 으로 정규화
from sklearn.preprocessing import StandardScaler
ss = StandardScaler()
ss.fit_transform(df)
snormal_df = pd.DataFrame(ss.fit_transform(df_o), columns=["SalePrice_s", "LotArea_s"])
print(snormal_df)

# 가작 작은 값은 0, 가장 큰 값은 1 로 변환
from sklearn.preprocessing import MinMaxScaler
minmax_scaler = MinMaxScaler()
# 각 특성의 절대값이 0 과 1 사이로 만들어줌
from sklearn.preprocessing import MaxAbsScaler
maxabs_scaler = MaxAbsScaler()
# 평균과 분산 대신에 중간 값과 사분위 값을 사용
from sklearn.preprocessing import RobustScaler
robust_scaler = RobustScaler()
# Normalizer 의 경우 각 샘플(행)마다 적용
from sklearn.preprocessing import Normalizer
normal_scaler = Normalizer()
from sklearn.preprocessing import StandardScaler
# 변형 객체 생성
std_scaler = StandardScaler()
std_scaler.fit_transform(tf)
ss = pd.DataFrame(std_scaler.fit_transform(tf), columns=["std_scaler"])
ss
from sklearn.preprocessing import MinMaxScaler
# 변형 객체 생성
minmax_scaler = MinMaxScaler()
minmax_scaler.fit_transform(tf)
mm = pd.DataFrame(minmax_scaler.fit_transform(tf), columns=["minmax_scaler"])
mm
from sklearn.preprocessing import MaxAbsScaler
# 변형 객체 생성
maxabs_scaler = MaxAbsScaler()
maxabs_scaler.fit_transform(tf)
ma = pd.DataFrame(maxabs_scaler.fit_transform(tf), columns=["maxabs_scaler"])
ma
from sklearn.preprocessing import RobustScaler
# 변형 객체 생성
robust_scaler = RobustScaler()
robust_scaler.fit_transform(tf)
rb = pd.DataFrame(robust_scaler.fit_transform(tf), columns=["robust_scaler"])
rb
from sklearn.preprocessing import Normalizer
# 변형 객체 생성
normal_scaler = Normalizer()
normal_scaler.fit_transform(train[["SalePrice", "LotArea"]])
nm = pd.DataFrame(normal_scaler.fit_transform(train[["SalePrice", "LotArea"]]), columns=["SalePrice_n", "LotArea_n"])
nm
# 데이터 합치기
result = pd.concat([ss,mm,ma,rb,nm], axis=1)
result
# 시각화 해보기
_ = result.hist(bins=50, figsize=(16,12))

실제 SalePrice

SalePrice 정규화 결과
# 원본 데이터
train["SalePrice"]
# 로그 트랜스포메이션
np.log1p(train["SalePrice"])
# 루트 트랜스 포메이션
np.sqrt(train["SalePrice"])
# boxcox 트랜스포메이션
from scipy.stats import norm
from scipy import stats
bc = pd.Series(stats.boxcox(train['SalePrice'])[0])
bc

StandardScaler 적용해보기s_log = pd.DataFrame(np.log1p(train["SalePrice"]))
s_log = pd.DataFrame(StandardScaler().fit_transform(s_log))
print(s_log.std())
_ = sns.displot(s_log)

pd.DataFrame(bc)
bc_ = pd.DataFrame(StandardScaler().fit_transform(pd.DataFrame(bc)))
print(bc_.std())
_ = sns.displot(bc_)
