import pandas as pd
import numpy as np

air = pd.read_csv('../../data/airquality.csv')
air.info()

air.isna().sum()
air['Ozone'].isna()

tb = air['Ozone'].isna().value_counts()
# 결측치 대치
# 해당 열의 평균 값으로 대치
air['Ozone'] = air['Ozone'].fillna(air['Ozone'].mean())

# 사이킷런을 활용한 결측치 대치 - KNN
from sklearn.impute import KNNImputer
imputer = KNNImputer(n_neighbors = 2)
air_filled = imputer.fit_fransform(air)
pre_air = pd.DataFrame(air_filled, columns = air.columns)
# 이상치 인식
# Ozone 변수에서 이상치를 박스 플롯으로 확인
import seaborn as sns
sns.boxplot(x = 'Ozone', data = air)

# IQR을 이용한 이상치 탐색 함수
def detect_outliers(df=None, column=None, weight = 1.5):
	Q1 = df[column].quantile(0.25)
    Q3 = df[column].quantile(0.75)
    
    IQR = Q3 - Q1
    IQR_weight = IQR * weight
    
    outlier_idx = df[(df[column] < Q1 - IQR_weight)|(df[column] > Q3 + IQR_weight).index
    
    return outlier_idx
out_index = detect_outliers(df=air, column='Ozone')

air.loc[out_index, 'outlier'] = True
air[air['outlier']==True]

# outlier 대체 (중위 값 혹은 평균 값으로)
air.loc[out_index, 'Ozone'] = air['Ozone'].median()

# 기존의 평균, 중앙값 바뀌면서 outlier 다시 발생
# 이때는 outlier 제거

'ADP > 실기' 카테고리의 다른 글

변수 축소  (1) 2024.01.24
범주형 데이터 전처리  (0) 2024.01.23
데이터 표준화, 정규화  (0) 2024.01.23
데이터 샘플링  (0) 2024.01.21
날짜 데이터 핸들링  (0) 2024.01.21

+ Recent posts