이상값
- 데이터의 범위에서 크게 벗어난 (정상범위 밖에 있는) 값
- 사분위범위 / 정규분포를 이용해서 식별, 식별된 이상치는 제거 여부 판단
이상치 처리 실습
- 실습용 데이터 준비
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
#평균 50, 표준편차 10의 정규분포를 따르는 200개의 랜덤 숫자 데이터 생성
data = 10 * np.random.randn(200) + 50
df = pd.DataFrame({"값" : data})
- 임의의 이상치 (매우 작거나 큰 데이터) 삽입
df.loc[200] = 2
df.loc[201] = 100
df.loc[202] = 10
df.loc[203] = 110
- 히스토그램을 이용한 분포 시각화
plt.hist(df["값"], bins = 20, rwidth = 0.8)
plt.show()
bins 는 막대 갯수
rwidth 는 막대 너비
- 박스플롯을 이용한 분포 시각화
plt.boxplot(df["값"])
plt.show()
IQR
- IQR은 1사분위수에서 3사분위수까지의 크기
- IQR = Q3 - Q1
1. quantile()을 통해 사분위범위 IQR 구하기
Q1 = df["값"].quantile(0.25)
Q2 = df["값"].quantile(0.5)
Q3 = df["값"].quantile(0.75)
IQR = Q3 - Q1
print('Q1 = %f' %Q1)
print('Q2 = %f' %Q2)
print('Q3 = %f' %Q3)
print(IQR)
2. describe()을 통해 사분위범위 IQR 구하기
Q1 = df["값"].describe()["25%"]
Q2 = df["값"].describe()["50%"]
Q3 = df["값"].describe()["75%"]
IQR = Q3 - Q1
print('Q1 = %f' %Q1)
print('Q2 = %f' %Q2)
print('Q3 = %f' %Q3)
print(IQR)
이상치 Outlier
- 이상치는 (3사분위수 + 1.5IQR) 보다 큰 값이거나,
- (1사분위수 - 1.5IQR) 보다 작은 값
IQR을 이용하여 이상치 구하기
condition = df['값'] > (Q3 + 1.5 * IQR)
upperOutlier = df[condition]
condition = df['값'] < (Q1 - 1.5 * IQR)
lowerOutlier = df[condition]
print(upperOutlier)
print(lowerOutlier)
임의로 집어넣은 이상치 값들 외에도 추가로 발견!
'빅데이터분석기사_실기 > 제1유형: 데이터 전처리' 카테고리의 다른 글
평활화 Smoothing (0) | 2024.06.13 |
---|---|
결측치 처리 (1) | 2024.06.13 |
데이터 변환: 차원축소 PCA, 주성분 분석 (2) | 2024.06.13 |
데이터 변환: 범주화(Categorization), 이산형화(Discretization) (0) | 2024.06.13 |
데이터 변환: 정규분포 변환 (1) | 2024.06.12 |