앎을 경계하기

DAFIT/906 - 머신러닝으로 당뇨병 예측

<DAFIT> 06 머신러닝을 통한 당뇨병 예측 - 03 데이터 시각화

양갱맨 2019. 11. 24. 21:58

이번에는 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

이상치 확인, 데이터 집합의 범위나 중앙값을 쉽게 확인할 수 있다.

boxplot

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을 그릴 수 있다.

 

 

http://www.dafit.me/question/?q=YToxOntzOjEyOiJrZXl3b3JkX3R5cGUiO3M6MzoiYWxsIjt9&bmode=view&idx=2682894&t=board

 

[DF906] 머신러닝을 통한 당뇨병 예측 : 다핏, 데이터사이언스 연습문제

🔥 문제 설명당뇨병에 영향을 주는 8가지 특징을 바탕으로, 머신러닝 기법을 통해 당뇨병을 예측해보는 문제입니다. 🔥 추천 대상머신러닝에 많이 활용되는 SciKit-Learn을 활용하여 머신러닝 입문을 해보고 싶은 자.캐글의 타이타닉 생존자 예측 문제 수준을, 새로운 문제로 스스로 해결해보고 싶은 자.이진 분류데이터(True / False)를 활용하여 기초적인 데이터 분석과 머신러닝 기법을 체험해보고 싶은 사람.🔥 학습 목표머신러닝의 세부적인 모델링 또는

www.dafit.me