Aiffel_learning/Data_analysis
2-6. pandas : outlier
이유29
2024. 6. 6. 21:55
outlier(아웃라이어) 이란?
데이터 분석에서 다른 데이터 포인트들과 크게 다르거나 이질적인 값.
아웃라이어는 통계 분석, 데이터 분석, 머신 러닝 모델링 등에 있어서
데이터의 패턴을 왜곡시키거나 잘못된 결론을 내리게 할 수 있기 때문에 중요한 역할을 함
왜 생기는걸까?
- 데이터 입력 오류: 데이터 입력 중의 실수나 잘못된 기록으로 인해 발생
- 실험적 오류: 실험 과정에서의 오류나 장비의 결함으로 인해 발생
- 자연적인 변동성: 데이터 자체의 본질적인 변동성 때문에 발생
- 분포 특성: 특정 분포의 특성으로 인해 극단적인 값이 존재
그럼 어떻게 알아?
- 시각적 방법:
- 박스 플롯(Box Plot): 박스 플롯에서 상자 밖에 위치하는 점들은 아웃라이어로 간주
- 산점도(Scatter Plot): 2차원 산점도에서 다른 점들과 멀리 떨어져 있는 점들을 아웃라이어로 식별
- 통계적 방법:
- Z-점수(Z-score): 각 데이터 포인트의 평균으로부터의 표준편차 거리를 계산하여 일정 기준 이상 떨어져 있는 값들을 아웃라이어로 간주
- 사분위수 범위(IQR): 1사분위수(Q1)와 3사분위수(Q3)의 차이인 IQR을 이용하여, Q1 - 1.5IQR 보다 작거나 Q3 + 1.5IQR 보다 큰 값들을 아웃라이어로 간주
- 머신 러닝 방법:
- Isolation Forest: 데이터의 하위 집합을 무작위로 선택하고 이들을 반복적으로 분할하여 아웃라이어를 탐지
- LOF(Local Outlier Factor): 데이터 포인트가 주변 데이터 포인트들과 비교하여 얼마나 밀집된 곳에 위치하는지를 측정하여 아웃라이어를 탐지
- 이상, 챗지피티의 설명이었다.
그럼 pandas에서는 어떻게 아웃라이어를 찾아내고 처리할까?
outlier가 존재하는가?
보통 min ~ max 값 까지의 분포를 보면서 파악
데이터 분석적 사고로 상식적으로 말이 안되는 부분 확인
[Age] 나이가 145... 말이 안됨
[SibSp] 50%R까지 0명이다가 max가 8
문제가 있을것 같은 부분 찾았으니 확인해보도록 하자.
일단, 오름차순으로 정렬하면
# 오름차순
data.sort_values()
# 내림차순
data.sort_values(ascending = False)
Age | SibSp |
![]() |
![]() |
8 값이 생각보다 많네? 그럼 뒷 부분만 좀 뜯어볼까? |
|
![]() |
|
145 값이 outlier인것 확인! -> 이건 값 지우자 97, 80은 고민을 좀 해봐야할듯 |
오,,,,분포를 잘 모르겠군 -> 그래프로 확인해보자! |
분포 확인하는 그래프 출력해서 확인하기
import matplotlib.pyplot as plt
import seaborn as sns
distribution 확인
- displot : 데이터 분포를 시각화하는 Seaborn의 플롯 (현재는 histplot이나 kdeplot 사용 권장).
- scatterplot : 두 변수 간의 관계를 시각화하는 산점도 * 좀 더 직관적이고, 튀는값 여부 확인가능*
- boxplot : 데이터의 분포와 사분위수, 이상치를 나타내는 상자 그림.
tool | Age | SigSp |
sns.displot() | ![]() |
![]() |
몇개 없는 값들은 눈에 잘 띄지 않아서 쓰기 불편해 |
오, 8도 숫자가 꽤 있는걸 보니 그렇게 특이한 케이스는 아니고 있을 수는 있는 값인가 보다?! 확인가능 |
|
sns.scatterplot() | ![]() |
![]() |
140 값은 진짜 말도 안되는 outlier인것 보임 100은 조금 애매 |
8 값이 outlier은 아닌것 확정 | |
sns.boxplot() | ![]() |
![]() |
파란 박스부분 = 25~75% 분포부분 까만 선(파란박스 길이의 1.5배만큼 양쪽으로 뻗은 값)을 그어서 이 바깥은 outlier이다 나름대로 판단해줌 (그치만 참고만 하기.. 좀 너무 극단적이라..!) |
outlier 제거하기
# 1. 일정 값 이하만 출력하기
data = data[data['Age'] <= 100
# 2. 일정 값 이상을 고정하기
# 계속 사용할 것 같으면 함수생성
def age_func(x):
if x > 80:
return 80
else:
return x
# age_func(data['Age']) 하면 에러남!
data['Age'] = data['Age'].apply(age_func)
# lambda 써도 되는데 이건 일회용일떄!
data['Age'].apply(lambda x: 80 if x > 80 else x)
참고하면 좋을것 같은 블로그**
https://sjquant.tistory.com/17
[요약] 데이터 아웃라이어 처리하기
How to Deal with Outliers in Your Data 내용을 한글로 정리해 보았습니다. 아웃라이어란? 아웃라이어란 데이터 상의 다른 값들의 분포와 비교했을때 비정상적으로 떨어져있는 관측치이다. 하지만, 어느
sjquant.tistory.com