자신에게 친절할 것 :)

Data Science/Pandas

[데이터 전처리] 이상치outlier 찾기, 처리하기

Tashapark 2024. 6. 17. 19:49
728x90
반응형

# 코드잇 데이터 사이언티스트 강의 듣는 중


 

<이상치 outlier 찾기>

 

 

--> 데이터에서 동떨어진 값을 의미하는 데 주로 박스플롯 기준. 

Q1- 1.5 IQR ~ Q3 + 1.5 IQR 범위를 벗어나는 경우를 이상치라고 함. 

 

 

 

 

 

 

 

1) .quantile() --> 사분위수 구하기

 

- 사분위수를 구해서 그것을 변수로 설정 

q1 = airbnb_df['price'].quantile(0.25)
q3 = airbnb_df['price'].quantile(0.75)

iqr= q3 - q1

lower_limit = q1 - 1.5 * iqr
upper_limit = q3 + 1.5 * iqr

 

2) 조건식으로 사용함. 

#각각
airbnb_df[airbnb_df['price'] < lower_limit]
airbnb_df[airbnb_df['price'] > upper_limit]

#걍 합쳐서 한 번에 보이기
airbnb_df[(airbnb_df['price'] < lower_limit) | (airbnb_df['price'] > upper_limit)]

 

 

 

 

 

 

 


<이상치 처리하기>

 

1) 아무것도 하지 않기

- 실제 값이 아주 작거나 아주 클 수도 있기 때문 

- 오히려 이 값들을 제외하는 것이 데이터를 편향되게 만드는 것일 수도 있음.

 

 

2) 이상치를 다른 값으로 채우기

 

- Q3 + 1.5 IQR보다 크면 이 값으로,

- Q1 - 1.5 IQR보다 작으면 이 값으로 바꿔줌. 

 

--> 이상치가 데이터에 미치는 영향력을 줄여줄 수 있음. 

 

 

 

 

 

3) 이상치 삭제하기

 

- 가장 직관적이고 간단함. 

- 오류 때문이거나, 그 데이터를 삭제해도 큰 영향이 없을 때 이 방법을 사용함. 

- 데이터 양이 줄어들지만, 이상치를 제외한 데이터의 경향을 더 쉽게 분석할 수 있음.

 

1) .drop()

- 해당 값을 지울 수도 있지만

 

2) 인덱싱으로 포함되는 값만 남길 수도 있음. 

con1 = airbnb_df['price'] >= lower_limit
con2 = airbnb_df['price'] <= upper_limit

airbnb_df[con1 & con2]

 

 

--> 앞서 값을 구할 때 lower와 upper limit을 구했기 때문에 그 값을 활용하면 쉽게 인덱싱을 할 수 있음. 

 

 

 

+...계속 커널 깨끗히 하고, 또 중복치 값을 원래의 값에 넣어줬다는 것을 확인 못해서

이상치 제거 벡터의 수가 안 맞아서, 코드 한 줄 씩 치면서 디버깅했음... ㅎㅎ..

 


<예시>

 

ver1 -> 조건식을 걍 쓰고 ~으로 인덱싱 해주기.

q1 = cellphone_df['price'].quantile(0.25)
q3 = cellphone_df['price'].quantile(0.75)

iqr = q3 - q1

lower_limit = q1 - 1.5 * iqr
upper_limit = q3 + 1.5 * iqr
 
con1 = cellphone_df['price'] < lower_limit
con2 = cellphone_df['price'] > upper_limit

cellphone_df = cellphone_df[~(con1 | con2)]

cellphone_df

 

ver2 -> drop 써보기

- drop으로 해보려고 했는데 자꾸 안 되서.. 결국 지피티가 알려줬음.

- 변수에 .index를 넣고, 그 값을 drop 해야 함. 

- .index를 넣지 않으면 에러 뜸. 

# IQR 계산
iqr = q3 - q1

# 이상치 기준 계산
lower_limit = q1 - 1.5 * iqr
upper_limit = q3 + 1.5 * iqr

# 이상치 조건 정의
con1 = cellphone_df['price'] < lower_limit
con2 = cellphone_df['price'] > upper_limit

# 이상치 조건을 만족하는 인덱스 찾기
outlier_indices = cellphone_df[con1 | con2].index

# 이상치 인덱스를 사용하여 행 삭제
cellphone_df = cellphone_df.drop(outlier_indices)
728x90
반응형