Python에서 이상값을 제거하는 방법


이상값 은 데이터 세트의 다른 값과 비정상적으로 멀리 떨어져 있는 관측값입니다. 이상값은 분석 결과에 영향을 미칠 수 있으므로 문제가 될 수 있습니다.

이 튜토리얼에서는 Python에서 이상값을 식별하고 제거하는 방법을 설명합니다.

Python에서 이상값을 식별하는 방법

이상값을 제거하려면 먼저 이상값으로 간주할 항목을 결정해야 합니다. 이를 수행하는 두 가지 일반적인 방법이 있습니다.

1. 사분위간 범위를 사용합니다.

IQR(사분위수 범위)은 데이터 세트에서 75번째 백분위수(Q3)와 25번째 백분위수(Q1) 간의 차이입니다. 평균 50% 값의 분포를 측정합니다.

관측치가 세 번째 사분위수(Q3) 위 사분위수 범위의 1.5배이거나 첫 번째 사분위수(Q1) 아래 사분위수 범위의 1.5배인 경우 관측치를 이상값으로 정의할 수 있습니다.

특이치 = 관측치 > Q3 + 1.5*IQR 또는 Q1 – 1.5*IQR

2. Z-점수를 사용하세요.

z-점수는 주어진 값이 평균에서 얼마나 많은 표준 편차를 가지고 있는지 알려줍니다. 다음 공식을 사용하여 z-점수를 계산합니다.

z = (X – μ) / σ

금:

  • X는 단일 원시 데이터 값입니다.
  • μ는 모집단 평균입니다.
  • σ는 모집단 표준편차입니다.

z-점수가 -3보다 작거나 3보다 큰 경우 관측치를 이상값으로 정의할 수 있습니다.

특이치 = z-점수가 3보다 크거나 -3보다 작은 관측치

Python에서 이상값을 제거하는 방법

이상값으로 간주되는 항목을 결정한 후에는 데이터세트에서 이를 식별하고 제거할 수 있습니다. 이를 수행하는 방법을 설명하기 위해 다음 pandas DataFrame을 사용합니다.

 import numpy as np
import pandas as pd 
import scipy.stats as stats

#create dataframe with three columns 'A', 'B', 'C'
np.random.seed(10)
data = pd.DataFrame(np.random.randint(0, 10, size=(100, 3)), columns=['A', 'B', 'C'])

#view first 10 rows
data[:10]

           ABC
0 13.315865 7.152790 -15.454003
1 -0.083838 6.213360 -7.200856
2 2.655116 1.085485 0.042914
3 -1.746002 4.330262 12.030374
4 -9.650657 10.282741 2.286301
5 4.451376 -11.366022 1.351369
6 14.845370 -10.798049 -19.777283
7 -17.433723 2.660702 23.849673
8 11.236913 16.726222 0.991492
9 13.979964 -2.712480 6.132042

그런 다음 z-점수 방법 또는 사분위간 범위 방법을 사용하여 이상값을 정의하고 제거할 수 있습니다.

Z-점수 방법:

 #find absolute value of z-score for each observation
z = np.abs(stats.zscore(data))

#only keep rows in dataframe with all z-scores less than absolute value of 3 
data_clean = data[(z<3).all(axis=1)]

#find how many rows are left in the dataframe 
data_clean.shape

(99.3)

사분위간 범위 방법:

 #find Q1, Q3, and interquartile range for each column
Q1 = data.quantile(q=.25)
Q3 = data.quantile(q=.75)
IQR = data.apply(stats.iqr)

#only keep rows in dataframe that have values within 1.5*IQR of Q1 and Q3
data_clean = data[~((data < (Q1-1.5*IQR)) | (data > (Q3+1.5*IQR))).any(axis=1)]

#find how many rows are left in the dataframe 
data_clean.shape

(89.3)

za 점수 방법은 하나의 관측치를 이상값으로 식별하고 제거한 반면, 사분위간 범위 방법은 총 11개의 관측값을 이상값으로 식별하고 제거한 것을 볼 수 있습니다.

이상값을 제거해야 하는 경우

데이터에 하나 이상의 이상치가 있는 경우 먼저 그것이 데이터 입력 오류의 결과가 아닌지 확인해야 합니다. 때로는 개인이 데이터를 저장하는 동안 단순히 잘못된 데이터 값을 입력하는 경우도 있습니다.

이상값이 데이터 입력 오류의 결과인 것으로 판명되면 데이터 세트의 평균 또는 중앙값 과 같은 새 값을 할당하기로 결정할 수 있습니다.

값이 실제로 이상값인 경우 전체 분석에 상당한 영향을 미칠 경우 해당 값을 제거하도록 선택할 수 있습니다. 최종 보고서나 분석에서 이상치를 제거했다는 사실을 꼭 언급하세요.

추가 리소스

한 번에 여러 변수를 사용하는 경우 Mahalanobis 거리를 사용하여 이상값을 감지할 수 있습니다.

의견을 추가하다

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다