이번에는 data visualization 문제!
대학원 강의 중 visualization 관련 수업을 들은 적이 있어서 그런지 가장 편하게 접근할 수 있었던 문제였다.
1,2번 문제를 푼면서 데이터를 볼 때 불편했던 점들을 추려보니..
1. 값이 전체적으로 어떤 범위 내에 위치하는지 모른다.
2. 이상치가 한 눈에 보이지 않는다.
3. 피쳐마다의 데이터가 어떻게 분포하고 있는지 보고싶다.
4. 내가 결측치 대체 방안으로 사용했던 median과 mean의 차이가 어느정도 나는지 알고 싶다.
이 정도로 말할 수 있을 것 같다.
그래서 나는 각 feature마다 boxplot을 사용해서 데이터를 시각화하였다.
boxplot은 다음과 같이 생겼다.
상자수염그림라고도 하는데 왜 수염상자냐면 저 박스 위아래로 길게 수염이 나있어서 상자수염그림이라고 한다.
box plot은 data의 min(최소), max(최대), quantile(분위수) 를 통해서 그릴 수 있다.
box plot에서 필요한 분위수는
- 1분위 : 4분위 중 1분위, 0.25
- 2분위 : 4분위 중 2분위, 0.5 - median 값이기도 함.
- 3분위 : 4분위 중 3분위 0.75
이상치 확인, 데이터 집합의 범위나 중앙값을 쉽게 확인할 수 있다.
matplotlib의 boxplot을 사용하면 쉽게 boxplot 그래프를 그릴 수 있다.
다섯가지 통계값을 사용하여 boxplot을 그려보자.
사실 matplotlib.plot
에 있는 boxplot()
을 사용하면 손쉽게 boxplot을 그릴 수 있다.
먼저 데이터를 불러오자.
import pandas as pd
import matplotlib.pyplot as plt
data = pd.read_csv("/content/drive/My Drive/다핏문제/906/dataset_37_diabetes.csv")
결측치를 처리하기 전의 데이터를 먼저 시각화해보자.
#data 결측치 처리 전 boxplot
plt.figure(figsize=(20,20))
plt.subplot(441)
plt.title('preg')
plt.boxplot(data['preg'],meanline=True,showmeans=True)
plt.subplot(442)
plt.title('plas')
plt.boxplot(data['plas'],meanline=True,showmeans=True)
plt.subplot(443)
plt.title('pres')
plt.boxplot(data['pres'],meanline=True,showmeans=True)
plt.subplot(444)
plt.title('skin')
plt.boxplot(data['skin'],meanline=True,showmeans=True)
plt.subplot(445)
plt.title('insu')
plt.boxplot(data['insu'],meanline=True,showmeans=True)
plt.subplot(446)
plt.title('mass')
plt.boxplot(data['mass'],meanline=True,showmeans=True)
plt.subplot(447)
plt.title('pedi')
plt.boxplot(data['pedi'],meanline=True,showmeans=True)
plt.subplot(448)
plt.title('age')
plt.boxplot(data['age'],meanline=True,showmeans=True)
plt.show()
이상치부터 보자.
2번 문제를 풀 때 결측치로 여겼던 pres의 0, mass의 0말고 plas에도 0이 있었다.
plas는 임당검사 2시간 경과 후의 혈당 값이었는데 혈액 내 당이 아예 없을 수 없다고 생각해서 이번에는 plas에 대해서도 전처리를 한번 거쳤다.
전과 마찬가지로 0을 제외한 데이터들에 대한 median으로 결측치를 채웠다.
#결측치 처리
#plas, pres, mass의 0값 median으로 대체
preszero_data = data.replace({'pres':0},{'pres':None})
preszero1_data = preszero_data.dropna()
preszero_data = data.replace({'pres':0},{'pres':None})
preszero_data = preszero_data.fillna(preszero1_data.pres.median())
masszero_data = preszero_data.replace({'mass':0.0},{'mass':None})
masszero1_data = masszero_data.dropna()
masszero_data = masszero_data.fillna(masszero1_data.mass.median())
plaszero_data = masszero_data.replace({'plas':0},{'plas':None})
plaszero1_data = plaszero_data.dropna()
plaszero_data = plaszero_data.fillna(plaszero1_data.plas.median())
plt.figure(figsize=(20,20))
plt.subplot(441)
plt.title('preg')
plt.boxplot(plaszero_data['preg'],meanline=True,showmeans=True)
plt.subplot(442)
plt.title('plas')
plt.boxplot(plaszero_data['plas'],meanline=True,showmeans=True)
plt.subplot(443)
plt.title('pres')
plt.boxplot(plaszero_data['pres'],meanline=True,showmeans=True)
plt.subplot(444)
plt.title('skin')
plt.boxplot(plaszero_data['skin'],meanline=True,showmeans=True)
plt.subplot(445)
plt.title('insu')
plt.boxplot(plaszero_data['insu'],meanline=True,showmeans=True)
plt.subplot(446)
plt.title('mass')
plt.boxplot(plaszero_data['mass'],meanline=True,showmeans=True)
plt.subplot(447)
plt.title('pedi')
plt.boxplot(plaszero_data['pedi'],meanline=True,showmeans=True)
plt.subplot(448)
plt.title('age')
plt.boxplot(plaszero_data['age'],meanline=True,showmeans=True)
plt.show()
다음과 같이 boxplot을 그릴 수 있다.
'DAFIT > 906 - 머신러닝으로 당뇨병 예측' 카테고리의 다른 글
<DAFIT> 06 머신러닝을 통한 당뇨병 예측 - 06 Random Forest를 이용한 당뇨병 예측 (0) | 2019.11.26 |
---|---|
<DAFIT> 06 머신러닝을 통한 당뇨병 예측 - 05 Decision Tree를 이용한 당뇨병 예측 (0) | 2019.11.26 |
<DAFIT> 06 머신러닝을 통한 당뇨병 예측 - 04 데이터 분할 (0) | 2019.11.24 |
<DAFIT> 06 머신러닝을 통한 당뇨병 예측 - 02 NaN값,NULL 값 처리하기 (+ 삽질연속, 실망스러운 결과..) (0) | 2019.11.23 |
<DAFIT> 06 머신러닝을 통한 당뇨병 예측 - 01 데이터셋 다운로드 및 읽기 (0) | 2019.11.18 |