본문 바로가기

빅데이터분석기사_실기/제1유형: 데이터 전처리

이상치 Outlier 처리

이상값

  • 데이터의 범위에서 크게 벗어난 (정상범위 밖에 있는) 값
  • 사분위범위 / 정규분포를 이용해서 식별, 식별된 이상치는 제거 여부 판단

이상치 처리 실습

  • 실습용 데이터 준비
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

  • 임의의 이상치 (매우 작거나 큰 데이터) 삽입
df.loc[200] = 2
df.loc[201] = 100
df.loc[202] = 10
df.loc[203] = 110

df

  • 히스토그램을 이용한 분포 시각화
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)

결과

임의로 집어넣은 이상치 값들 외에도 추가로 발견!