[파이썬 분석] 이상치 찾기
개요
우리가 사용하는 빅데이터에는 잘못되거나 올바른 데이터라고 볼 수 없는 데이터들이 있습니다.
이를 이상치라고 하죠. 이상치는 데이터 집합에서 다른 값들과 현격하게 차이나는 값이나 패턴을 가진 데이터를 나타냅니다.
이상치를 찾는 방법은 다양합니다. 연구자 마음인데, 각 학회지나 사용처마다 선호하는 것이 다를 수 있습니다.
- 단순확인:
- 특정 값(평균,중앙치, 최빈치)를 기준으로 특정한 값을 다시 계산하여 이상치를 분별, 1표준편차나 2표준편차를 선정하는 등
- 데이터 특성에 맞지 않는 값 찾기, 성별을 1과 2로 코딩했는데, 다른 값이나 소수점 값을 갖는 값
- 히스토그램 확인:
- 데이터를 히스토그램으로 시각화하면 전체 데이터의 분포를 파악할 수 있습니다. 이상치는 전체 분포에서 동떨어진 부분으로 나타날 수 있습니다.
- 상자 수염 그림(Boxplot) 사용:
- 상자 수염 그림은 데이터의 중앙값, 사분위수, 이상치 등을 시각적으로 보여주는 유용한 도구입니다. 상자 수염 그림을 통해 이상치를 식별할 수 있습니다.
- Z-스코어 기반 이상치 탐지:
- Z-스코어는 데이터가 평균에서 얼마나 떨어져 있는지를 측정하는 표준화된 값입니다. 일반적으로 Z-스코어가 특정 임계값을 초과하면 해당 데이터는 이상치로 간주될 수 있습니다.
- IQR (사분위 범위)를 이용한 이상치 탐지:
- 사분위 범위는 데이터의 상위 25%와 하위 25%를 나누는데 사용됩니다. 이상치는 주로 1.5배 이상의 IQR을 벗어나는 값으로 정의될 수 있습니다.
- 시각적 데이터 탐색:
- 데이터를 산점도 등으로 시각화하면 이상치를 눈으로 쉽게 식별할 수 있습니다. 특히, 다른 데이터들과 비교하면서 차이가 큰 데이터를 찾을 수 있습니다.
단순확인 – 데이터 특성(성별)
파이썬을 활용하면, 쉽게 성별 데이터 중 이상치를 찾을 수 있습니다.
Big Data Certification KR에 있는 문제를 활용하도록 하겠습니다.
출처 : https://www.kaggle.com/datasets/agileteam/bigdatacertificationkr
문제는 “주어진 데이터에서 이상치(소수점 나이)를 찾고 올림, 내림, 버림(절사)했을때 3가지 모두 이상치 ‘age’ 평균을 구한 다음 모두 더하여 출력하시오” 입니다.
알아야하는 것
- 패키지 불러오기
- 데이터 불러오기
- 데이터 추출
- Numpy 절삭 메소드 종류
- 합계
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의 메소드들이며 다음과 같습니다.
- ceil : 올림
- floor : 버림
- trunc : 절사
- 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)