이상치 다루기

오상윤·2023년 2월 24일
0

EDA

목록 보기
11/16

이상치 다루기

라이브러리 불러오기

import pandas as pd
from matplotlib import pyplot as plt
import seaborn as sns
import missingno as msno

BMI 이상치

데이터 로드

df = pd.read_csv('heart_2020_cleaned.csv')

이상치 확인

msno.matrix(df)

수치데이터 확인

df['BMI'].describe()

boxplot 그려보기

plt.boxplot(df['BMI'])

이상치 매꾸기

# 사분위수 조절
Q1 = df["BMI"].quantile(0.25)
Q3 = df["BMI"].quantile(0.75)
IQR = Q3 - Q1
# 사분위수 기준으로 이상치 제거
outlier = df[(df['BMI'] > Q3 + 3*IQR) | (df['BMI'] < Q1 - 3*IQR)]
df2 = df[(df['BMI'] <= Q3 + 3*IQR) & (df['BMI'] >= Q1 - 3*IQR)]
# matplotlib
plt.boxplot(df2['BMI'])

boxplot

데이터 로드

# boxplot
df = pd.read_csv('src_14_boxplot_data.csv')
df.groupby('type').head()
df.groupby('type').count()

데이터 전처리

  • 전체 데이터를 각 type별로 구분지어서 다루려고
  • episode 갯수를 boxplot
labels = []
episode_data = []
for label, data in df.groupby('type') :
    labels.append(label) # 현재 레이블 저장
    episode_data.append(data['episodes']) 

이상치 확인하기

plt.boxplot(episode_data, labels=labels)
plt.ylim(0,100)

이상치 제거하기

for index, data in enumerate(episode_data):
    # 4분위값 구하기 Q1, Q3, IQR
    Q1 = data.quantile(0.25)
    Q3 = data.quantile(0.75)
    IQR = Q3 - Q1
    # 이상치 제거하기
    episode_data[index] = data[(data >= Q1-3*IQR) & (data <= Q3 + 3*IQR)]
    # min(q1-1.5*IQR), max(Q3+1.5*IQR)
plt.boxplot(episode_data, labels=labels)    

그래프 꾸미기

fig = plt.figure(figsize=(12,6))
graph = fig.add_subplot(1,1,1)
# 박스 면 옵션 변경을 위해서 patch_artist='Patch'
options = graph.boxplot(episode_data, labels=labels, patch_artist='Patch')
dark_colors =  ['#A221F3','#2196F3','#43A047','#FBC02D','#FB8C00','#F33E21']
bright_colors = ['#E8BBFB','#BBDEFB','#C8E6C9','#FFF9C4','#FFE0B2','#FBCABB']
for index, box in enumerate(options['boxes']):
    box.set_color(dark_colors[index%6])
    box.set_linewidth(2)
    box.set_facecolor(bright_colors[index%6])
for index, flier in enumerate(options['fliers']):
    flier.set(marker='o', color=bright_colors[index%6])
    flier.set_markeredgecolor("white")
    flier.set_markerfacecolor(dark_colors[index%6])
for index, median in enumerate(options['medians']):
    median.set_color(dark_colors[index%6])
    median.set_linewidth(2)
for index, whisker in enumerate(options['whiskers']):
    whisker.set_color(bright_colors[index%6])

for whisker, cap, box, median, flier, mean, dark, bright in zip(options['whiskers'], options['caps'], options['boxes'], options['medians'],
    options['fliers'], options['means'], dark_colors, bright_colors):
    box.set_color(dark_colors)
    box.set_linewidth(2)
    box.set_facecolor(bright_colors)
    flier.set(marker='o', color=bright_colors)
    flier.set_markeredgecolor("white")
    flier.set_markerfacecolor(dark_colors)    
    median.set_color(dark_colors)
    median.set_linewidth(2)    
    whisker.set_color(bright_colors)    

profile
가보자가보자~

0개의 댓글