파이썬으로 데이터에서 이상치 찾는 방법

💡 지피디아 핵심 브리핑

파이썬을 활용하여 대규모 데이터셋에서 이상치를 효과적으로 식별하고 처리하는 방법과 실무 예제를 다룹니다. 통계적 기법과 시각화 도구를 아우르는 전반적인 접근 방식을 살펴볼 수 있습니다.

개요

우리가 사용하는 빅데이터에는 잘못되거나 올바른 데이터라고 볼 수 없는 데이터들이 있습니다. 이를 이상치라고 하죠. 이상치는 데이터 집합에서 다른 값들과 현격하게 차이나는 값이나 패턴을 가진 데이터를 나타냅니다.

이상치를 찾는 방법은 다양합니다. 연구자 마음인데, 각 학회지나 사용처마다 선호하는 것이 다를 수 있습니다. 데이터의 정합성을 확보하고 분석 결과의 신뢰도를 높이기 위해 철저한 이상치 탐색 과정이 선행되어야 합니다.

  1. 단순확인:
    • 특정 값(평균, 중앙치, 최빈치)를 기준으로 특정한 값을 다시 계산하여 이상치를 분별, 1표준편차나 2표준편차를 선정하는 등
    • 데이터 특성에 맞지 않는 값 찾기, 성별을 1과 2로 코딩했는데, 다른 값이나 소수점 값을 갖는 값
  2. 히스토그램 확인:
    • 데이터를 히스토그램으로 시각화하면 전체 데이터의 분포를 파악할 수 있습니다. 이상치는 전체 분포에서 동떨어진 부분으로 나타날 수 있습니다.
  3. 상자 수염 그림(Boxplot) 사용:
    • 상자 수염 그림은 데이터의 중앙값, 사분위수, 이상치 등을 시각적으로 보여주는 유용한 도구입니다. 상자 수염 그림을 통해 이상치를 식별할 수 있습니다.
  4. Z-스코어 기반 이상치 탐지:
    • Z-스코어는 데이터가 평균에서 얼마나 떨어져 있는지를 측정하는 표준화된 값입니다. 일반적으로 Z-스코어가 특정 임계값을 초과하면 해당 데이터는 이상치로 간주될 수 있습니다.
  5. IQR (사분위 범위)를 이용한 이상치 탐지:
    • 사분위 범위는 데이터의 상위 25%와 하위 25%를 나누는데 사용됩니다. 이상치는 주로 1.5배 이상의 IQR을 벗어나는 값으로 정의될 수 있습니다.
  6. 시각적 데이터 탐색:
    • 데이터를 산점도 등으로 시각화하면 이상치를 눈으로 쉽게 식별할 수 있습니다. 특히, 다른 데이터들과 비교하면서 차이가 큰 데이터를 찾을 수 있습니다.

단순확인 – 데이터 특성(성별)

파이썬을 활용하면, 쉽게 성별 데이터 중 이상치를 찾을 수 있습니다. Big Data Certification KR에 있는 문제를 활용하도록 하겠습니다.

출처 : https://www.kaggle.com/datasets/agileteam/bigdatacertificationkr

문제는 “주어진 데이터에서 이상치(소수점 나이)를 찾고 올림, 내림, 버림(절사)했을때 3가지 모두 이상치 ‘age’ 평균을 구한 다음 모두 더하여 출력하시오” 입니다.

알아야하는 것

  1. 패키지 불러오기
  2. 데이터 불러오기
  3. 데이터 추출
  4. Numpy 절삭 메소드 종류
  5. 합계

1. 패키지 불러오기 + 2. 데이터 불러오기

모든 분석의 기본은 패키지를 불러오는 것입니다. csv파일을 불러오기 위해서라도 pandas를 써야하죠

import pandas as pd
import numpy as np
df = pd.read_csv('../input/bigdatacertificationkr/basic1.csv') # 이부분이 데이터를 불러오는 부분

3. 데이터 추출

먼저, 소수점을 가진 데이터들을 찾아야합니다.

소수점 데이터는 찾을 수 있는 방법이 많습니다. 일단 1로 나눴을 때 나머지가 0이 아닌 것. 위 케클에서 KIM TAE HEON님이 설명주신 것은 원데이터(소수점이 있는 데이터)에서 버림한 데이터(소수점이 없는 데이터)를 빼서 소수점이 있는 데이터 or 0인 데이터 호 변환 후 0인 것을 찾는 것 입니다.

지금은 % 연산자를 활용하여 나머지가 0이 아닌 것으로 데이터를 뽑아보도록 하겠습니다.

변수명은 영어로 이상치를 뜻하는 oullier로 했을 때, oullier = df[df[‘age’] % 1 != 0]와 같이 나타납니다.

여기서 주목해야할 점은 df[‘age’]가 df[]에 또 묶이는 것입니다. 파이썬에서 특정 열을 불러 올 때 많이 혼동될 수 있어 짚고 넘어가고자합니다. 내용을 해석하자면, df(전체데이터) 중 age열의 데이터가 1로 나눴을 때 나머지가 0이 아닌 것을 df(전체데이터)에서 추출하자는 것입니다.

oullier = df[df['age'] % 1 != 0] 
print(oullier.count())

4. Numpy 절삭 메소드 종류

올림은 RU, 내림은 RD, 절사는 TR로 변수명을 정했습니다.

이때, 활용되는 메소드는 numpy의 메소드들이며 다음과 같습니다.

  1. ceil : 올림
  2. floor : 버림
  3. trunc : 절사
  4. mean : 평균 계산
ru = np.ceil(oullier['age']).mean()
rd = np.floor(oullier['age']).mean()
tr = np.trunc(oullier['age']).mean()

ru, rd, tr

5. 합계

합계는 간단합니다. 단순하게 하면 위 변수들을 모두 더해서 print문에 넣으면 됩니다.

print(ru+rd+tr)

이상치 처리 방법 비교 및 실무 가이드

데이터 분석 실무에서 이상치를 마주했을 때 단순히 제거하는 것만이 정답은 아닙니다. 데이터의 특성과 분석 목적에 따라 적절한 조치 방법을 선택해야 하며, 아래의 비교표를 참고하여 상황에 맞는 전략을 수립하는 것이 좋습니다.

구분 Z-스코어 방식 IQR (사분위 범위) 방식
기본 가정 데이터가 정규 분포를 따른다고 가정 비정규 분포나 치우친 데이터에도 적용 가능
임계값 기준 보통 절대값이 3을 초과하는 경우 Q1 – 1.5 * IQR 미만 또는 Q3 + 1.5 * IQR 초과
장점 구현이 직관적이며 표준화된 수치 제공 극단적인 최솟값/최댓값의 영향에 비교적 강건함
단점 샘플 크기가 작거나 비정규 분포일 때 오류 발생 가능 데이터 특성에 따라 임계값 조정이 필요할 수 있음

FAQ 및 실무 체크포인트

Q. 이상치를 무조건 제거하는 것이 좋은가요?

아닙니다. 데이터 입력 오류나 시스템 결함으로 인한 이상치는 제거하거나 대체하는 것이 맞지만, 드문 확률로 발생하는 실제 유효한 극단값(예: 초고액 자산가의 소비 데이터)일 경우 비즈니스 인사이트를 도출하는 중요한 단서가 될 수 있습니다. 따라서 도메인 지식을 바탕으로 신중하게 판단해야 합니다.

Q. 파이썬 분석 시 결측치와 이상치의 차이는 무엇인가요?

결측치는 데이터가 아예 비어 있는 상태(NaN, Null 등)를 의미하며, 이상치는 값은 존재하지만 정상적인 범위를 크게 벗어난 비정상적인 값을 의미합니다. 두 가지 모두 전처리 단계에서 각각 적절한 결측치 대치법과 이상치 필터링 기법을 적용해 주어야 합니다.

위로 스크롤