➡️ 이상치 (Outlier) 처리
- ESD( Extreme Studentized Deviation) : 표준편차의 3배
- 데이터가 정규분포를 따른다고 가정할 때, 평균에서 표준편차의 3배 이상 떨어진 값
- 비대칭 이거나 왜곡된 분포에는 부적합

- IQR(Inter Quantile Range) : iqr 의 1.5배
- IQR은 중앙값(median)을 기준으로 계산되므로 비대칭적인 분포에도 잘 적용

- 기준 선택
- 극단적인 이상치가 적고, 정규분포에 가까운 경우: ESD
- 다수의 이상치가 존재하거나 비대칭적인 분포일 때: IQR
- 이상치 처리 주의사항
- 이상치 처리는 데이터 분석가의 몫임 →
상황에 맞춰 삭제 or 변환 할수있음
- 예컨데, 매출의 상한 이상치가 46이고, 이상치가 46.5 ~47 정도 사이라면 데이터를 날리는 대신 이상치를 상한값으로 처리 할수도 있음
- 이상치 처리는 데이터 분석가의 몫임 →
- 코드 구현
#esd 이상치 확인
import numpy as np
mean = np.mean(data)
std = np.std(data)
upper_limit = mean + 3*std
lower_limit = mean - 3*std
#iqr 이상치 확인
Q1 = df['column'].quantile(0.25)
Q3 = df['column'].qunatile(0.75)
IQR = Q3 - Q1
uppper_limit = Q3 + 1.5*IQR
lower_limit = Q1 - 1.5*IQR
➡️ 결측치(Missing Value) 처리
- 수치형 :
- 평균값 or 중앙값 대치
- 범주형 :
- 최빈값 대치
- 삭제 :
- df.dropna(axis = 0): 행 삭제
- df.dropna(axis = 1): 열 삭제
- df.fillna(value): 특정 값으로 대치(평균, 중앙, 최빈값)
- 함수로 대치
- sklearn.impute.SimpleImputer:평균, 중앙, 최빈값으로 대치
- SimpleImputer.statistics_ : 대치한 값 확인 가능
- 코드 구현
- sklearn.impute.SimpleImputer:평균, 중앙, 최빈값으로 대치
더보기
- 학습결과 어떤 값을 사용할지 파라미터 옵션으로 지정 가능
- ex. strategy='median' 등..
#simpleimputer 를 이용한 대치
from sklearn.impute import SimpleImputer
#모델 생성
si = SimpleImputer()
#학습
si.fit(data[['Age']]) #2차원 배열로 받음
#대체값 확인 : 디폴트는 평균 값
si.statistics_
#학습결과로 파악한 적절한 값을(평균 or 중앙값 등..) 행단위로 채워줌 : transform
data['Age_si_mean'] = si.transform(data[['Age']])
data.info()
- sklearn.impute.IterativeImputer: 다변량대치(회귀 대치)
- sklearn.impute.KNNImputer: KNN 알고리즘을 이용한 대치
- knn 알고리즘 : 주변값을 통해 예측하는 것
➡️ 범주형 데이터 처리 (encoding)
- 레이블 인코딩 : 범주의 문자열 값을 고유한 숫자로 할당
- 장점: 모델이 처리하기 쉬운 수치형으로 데이터 변환
- 단점: 명목형 임에도, 순서형 처럼 인지하여 모델이 잘못 해석 할 수 있음
- 패키지 :
sklearn.preprocessing.LabelEncoder
더보기
- 메소드
- fit: 데이터 학습
- transform: 정수형 데이터로 변환
- fit_transform: fit과 transform을 연결하여 한번에 실행
- inverse_transform : 인코딩된 데이터를 원래 문자열로 변환
- 속성
- classes_: 인코더가 학습한 클래스(범주)
#범주형 - 레이블인코딩
from sklearn.preprocessing import LabelEncoder,OneHotEncoder
#모델 생성
le = LabelEncoder()
#학습 & 정수형으로 저장 (fit & tranform 따로 해줘도 됨)
data['Sex_en'] = le.fit_transform(data[['Sex']])
data.head(3)
- 원-핫 인코딩 : 각 범주를 이진 형식으로 변환하는 기법
- 예시)
- 빨강 → [1,0,0]
- 파랑 → [0,1,0]
- 장점: 각 범주가 독립적으로 표현되어, 순서가 중요도를 잘못 학습하는 것을 방지, 명목형 데이터에 권장
- 단점: 범주 개수가 많을 경우 차원이 크게 증가(차원의 저주) , 모델의 복잡도를 증가, 과적합 유발
- 패키지 & 함수 :
sklearn.preprocessing.OneHotEncoder
&pd.get_dummies(df)
- 예시)
더보기
- 메소드(LabelEncoder와 동일)
- categories_: 인코더가 학습한 클래스(범주)
- get_feature_names_out(): 학습한 클래스 이름(리스트)
#범주형 - 원핫인코딩
from sklearn.preprocessing import LabelEncoder,OneHotEncoder
#모델 생성
oe = OneHotEncoder()
#학습
oe.fit(data[['Embarked']])
#카테고리 확인 -> 4개 ->컬럼이 4개 생성 됨.
oe.categories_
#정수형으로 저장 -> 대부분의 값이 0이라 아래 코드 추가하여 추가가공 필요
oe.transform(data[['Embarked']])
- 정수형으로 저장시 , 대부분의 값이 0 언더 → 추가 가공 진행
#추가 가공 필요
#변수로 할당
embarked_csr =oe.transform(data[['Embarked']])
# CSR 데이터 데이터프레임으로 만들기
csr_df = pd.DataFrame(embarked_csr.toarray(), columns = oe.get_feature_names_out())
#데이터 확인
csr_df.head(3)
#기존 데이터에 컬럼으로 추가하기 (axis = 1) 열 단위
pd.concat([data,csr_df],axis=1)
➡️ 수치형 데이터 처리 ( Scaling)
- 목표 : 단위 값이 서로 다른 데이터들을 보정
- 표준화(standardization)
z-score
- 각 데이터에 평균을 빼고 표준편차를 나누어 → 평균을 0 표준편차를 1로 조정하는 방법
- 수식 : z-score로 표준화

- 정규화(Normalization)
MinMaxScaler
- 각 데이터를 0과 1사이 값으로 조정(최소값 0, 최대값 1)
- 수식 : 최소값/최대값-최소값

- 로버스트 스케일링(Robust Scaling)
RobustScaler
- 중앙값과 IQR을 사용하여 스케일링.
- 수식 : 표준화에서 mean 대신 중앙값, 표준편차 대신 iqr 사용

[스케일링법 비교]
📌표준화 특징
장 : 이상치가 있거나 분포가 치우쳐져 있을 때 유용. / 많은 알고리즘에서 좋은 성능을 보임
단: 데이터의 최소-최대 값이 정해지지 않음.
📌 정규화 특징
장: 모든 특성의 스케일을 동일하게 맞춤 / 최대-최소 범위가 명확
단: 이상치에 영향을 많이 받을 수 있음(반대로 말하면 이상치가 없을 때 유용)
→ 왜? 최대 최소값안에 이상치가 포함되니까 데이터 분포가 매우 불균형/비대칭 할수 있음
📌로버스트 스케일링 특징
장: 이상치의 영향에 덜 민감
단: 표준화와 정규화에 비해 덜 사용됨
- 표준화, 정규화 스케일링 코드 구현
더보기


클래스: sklearn.preprocessing
함수: StandardScaler
/ MinMaxScaler
# Fare 변수: standardScaler (표준화) 스케일링 진행
from sklearn.preprocessing import StandardScaler
#모델 생성
sd_sc = StandardScaler()
#학습 및 적용
sd_sc.fit_transform((data[['Fare']]))
#스케일링한 값 컬럼으로 저장(변수 할당 )
data['Fare_sd_sc'] = sd_sc.fit_transform((data[['Fare']]))
sns.histplot(data=data,x='Fare_sd_sc')

# Age_mean 변수: minmaxscaler (정규화)) 스케일링 진행
from sklearn.preprocessing import MinMaxScaler
#모델 생성
mn_sc = MinMaxScaler()
#학습 및 적용
mn_sc.fit_transform((data[['Age_mean']]))
#스케일링한 값 컬럼으로 저장(변수 할당 )
data['Age_mean_mn_sc'] = mn_sc.fit_transform((data[['Age_mean']]))
data.head(5)
sns.histplot(data=data,x='Age_mean_mn_sc')

'통계,검정,머신러닝' 카테고리의 다른 글
통계 실습 | 변동계수 / 신뢰구간 / 이표본 t 검정 (양측검정,단측검정,정규성검정,등분산검정) (0) | 2025.01.17 |
---|---|
머신러닝 실습 | 캐글의 Titanic 데이터로 로지스틱 회귀 분석 실습 하기 (+K fold 교차검증) (0) | 2025.01.15 |
가설 검정 | 카이 제곱 검정 (+ scipy.stats 모듈 ) (0) | 2025.01.14 |
통계 기초 | 오류의 종류와 오류 보정법(+본페르니 보정 코드 ) (0) | 2025.01.14 |
머신러닝 | 로지스틱 회귀 분석/분류 분석 (+sklearn 파이썬 실습) (1) | 2025.01.14 |