파이썬을 활용한 데이터 분석 입문

[Python]데이터 전처리 - 데이터 정제(3) 이상치 처리

엔피디 2024. 8. 11. 22:32

 

이전 포스팅에서 이상치의 정의와 이상치를 확인하는 방법에 대해 알아보았습니다. 이번 포스팅에서는 이상치 처리 방법과 이상치 처리 결과를 실습을 통해 알아보겠습니다.

 

실습 준비

gpa 파일 다운로드

gpa.csv
0.00MB

 

google drive -> 내 드라이브 -> Data -> 업로드

colab 실행

# 구글 드라이브 마운트
from google.colab import drive
drive.mount('/content/drive')

# 판다스 라이브러리
import pandas as pd

# seaborn 라이브러리
import seaborn as sns

# numpy 라이브러리
import numpy as np
# gpa(grade point average) 평점 데이터 불러오기 
gpa = pd.read_csv('/content/drive/MyDrive/Data/gpa.csv')

# student_id로 인덱스 만들기
gpa = gpa.set_index('student_id')

# 5줄만 출력하기
gpa.head()

# 데이터 정보 및 결측치 유무 확인
gpa.info() 
<class 'pandas.core.frame.DataFrame'>
Index: 50 entries, 1 to 50
Data columns (total 2 columns):
 #   Column  Non-Null Count  Dtype  
---  ------  --------------  -----  
 0   credit  50 non-null     int64  
 1   GPA     50 non-null     float64
dtypes: float64(1), int64(1)
memory usage: 1.2 KB
# 데이터프레임 크기 확인하기
gpa.shape 

(50, 2)

# 데이터 요약통계량 확인하기
gpa.describe() 


 

이상치 처리

이상치 처리는 데이터 분석 과정에서 중요한 단계로, 이상치를 어떻게 다루느냐에 따라 분석 결과에 큰 영향을 미칠 수 있습니다. 이상치를 처리하는 방법에는 크게 3가지가 있는데, 데이터의 특성과 분석 목표에 따라 적절한 방법을 선택해야 합니다.

 

이상치 처리 방법

이상치 무시하기

처음부터 이게 무슨 소리냐?하고 의아하실 수 있는데, 특정 분석에서 이상치가 크게 영향을 미치지 않을 경우 이상치를 그대로 두고 분석을 진행할 수도 있습니다. 또는 이상치라고 생각되는 데이터가 사실은 정상적으로 수집된 데이터일 가능성도 존재합니다. 이 방법은 데이터가 부족한 경우나 이상치가 자연스러운 현상일 때 사용할 수 있습니다.

 

이상치를 다른값으로 대체하기

이상치를 평균, 중앙값, 상한치, 하한치 또는 다른 논리적인 값으로 대체하는 방법입니다. 이는 이상치가 분석 결과에 중요한 영향을 미칠 때 유용합니다.

 

이상치 배제하기

이상치를 완전히 제거하는 방법입니다. 이는 데이터가 크고, 이상치가 적은 경우에 유용합니다. 하지만 중요한 정보를 잃을 수도 있으므로 주의해야 합니다. 크게 두 가지 방법이 있는데, 첫 번째 방법을 소개하기 전에 NumPy 라이브러리에 대해 간략하게 알아보겠습니다.

 

NumPy(넘파이)

NumPy는 Python에서 수치 계산을 위한 핵심 라이브러리로, 과학적 계산과 데이터 분석에 널리 사용됩니다. 이 라이브러리는 다차원 배열 객체와 함께 다양한 수학 함수 및 연산을 제공합니다. NumPy는 특히 대규모 데이터 처리에 효율적이며, 파이썬의 다른 데이터 과학 라이브러리(ex: Pandas, Matplotlib, Scikit-learn)와 잘 통합됩니다.

 

1. 이상치를 결측치로 만들어 제거하기

 

박스 플룻 그리기

# 박스플롯을 통해 credit 이상치 확인하기
sns.boxplot(gpa['credit']) 

이상치가 2개 있는 것을 확인할 수 있습니다.

 

이상치 기준 만들기(공통 작업)

# 1사분위수 구하기
Q1 = gpa['credit'].quantile(0.25)

# 3사분위수 구하기
Q3 = gpa['credit'].quantile(0.75)
 
# IQR 구하기
IQR = Q3 - Q1

# 하한선 구하기
lower_line = Q1 - 1.5 * IQR

# 상한선 구하기
upper_line = Q3 + 1.5 * IQR

# 이상치 구하기
outlier = gpa[(gpa['credit'] < lower_line) | (gpa['credit'] > upper_line)]
outlier

이상치 기준을 정하여 이상치 데이터만 따로 출력하였습니다. (실제로 9학점과 10학점을 들었을 가능성이 있지만, 현재 데이터는 학습을 위한 임의의 데이터로 지금은 통계적 의미에서 이상치로 간주합니다.) 

 

이상치 결측 처리하기

# 이상치를 NaN으로 바꾸기
gpa['credit'] = np.where((gpa['credit'] < lower_line) | (gpa['credit'] > upper_line), np.nan, gpa['credit'])

# 결측치 빈도 확인
gpa['credit'].isna().sum()

2

 

결측치 제거하기

# 결측치 제거하기
gpa = gpa.dropna(subset='credit')

# 결측치가 제거 확인하기 
gpa['credit'].isna().sum()

0

 

2. 불린인덱싱으로 필요한 부분만 출력하기

앞에서 만든 이상치 기준을 활용하여 정상 범위 데이터를 인덱싱할 수 있습니다. 부등호 방향을 반대로만 바꾸면 됩니다!

# 불린 인덱싱을 통해 이상치를 제외한 부분만 출력하기
gpa[(gpa['credit'] >= lower_line) & (gpa['credit'] <= upper_line)] 

 

출력생략

 


 

 

GPA 이상치도 같은 방식으로 처리하면 됩니다. 먼저 코드를 작성해보시고 답안을 보시면 좋을 것 같습니다.

# 박스플롯을 통해 GPA 이상치 확인하기
sns.boxplot(gpa['GPA']) 

# 1사분위수 구하기
Q1 = gpa['GPA'].quantile(0.25)

# 3사분위수 구하기
Q3 = gpa['GPA'].quantile(0.75)

# IQR 구하기
IQR = Q3 - Q1

# 하한선 구하기
lower_line = Q1 - 1.5 * IQR

# 상한선 구하기
upper_line = Q3 + 1.5 * IQR

# 이상치 구하기
outlier = gpa[(gpa['GPA'] < lower_line) | (gpa['GPA'] > upper_line)]
outlier

# 이상치를 NaN으로 바꾸기
gpa['GPA'] = np.where((gpa['GPA'] < lower_line) | (gpa['GPA'] > upper_line), np.nan, gpa['GPA'])

# 결측치 빈도 확인
gpa['GPA'].isna().sum() 

3

# 결측치 제거하기
gpa = gpa.dropna(subset='GPA')

# 결측치가 제거 확인하기
gpa['GPA'].isna().sum()

0

 


 

이번 포스팅에서 이상치를 처리하는 3가지 방법에 대해서 알아보았는데요, 데이터 분석에는 정답이 없다고 해도 과언이 아닙니다. 데이터의 특성 상황에 따라 적합한 방법을 찾아 사용하는 것을 추천합니다.