1. 이론
1) 코드 내 이론
프로젝트의 흐름
문제제기 → 데이터구하기 → 타깃 변수 설정 → 데이터 처리 → 탐색적 자료 분석 및 시각화 → 머신러닝 모델 수립 → 머신러닝 모델 실행 →최적모델서넉 및 활용
뇌졸중 예측 분석 ⇒ 데이터 처리까지
1. 문제 제기
뇌졸중이 어떻게 발병하는 지 알아보기 위해 영양을 미치는 요인에 대해 분석하기
2. 데이터 구하기
케글사이트 Stroke Prediction Dataset
3. 타깃 변수(= 종속변수) 설정
- 타깃변수명 : stroke
- 타깃변숫값 : 과거에 한 번이라도 뇌졸중이 발병했으면 1, 아니면 0
4. 데이터처리
a. 데이터 불러오기
import pandas as pd
import numpy as np
class StrokeService:
def __init__(self):
self.stroke = pd.read_csv('./data/healthcare-dataset-stroke-data.csv')
self.my_stroke = None
self.adult_stock = None
'''
1.스펙보기
'''
def spec(self):
print(" --- 1.Shape ---")
print(self.stroke.shape)
print(" --- 2.Features ---")
print(self.stroke.columns)
print(" --- 3.Info ---")
print(self.stroke.info())
print(" --- 4.Case Top1 ---")
print(self.stroke.head(1))
print(" --- 5.Case Bottom1 ---")
print(self.stroke.tail(3))
print(" --- 6.Describe ---")
print(self.stroke.describe())
print(" --- 7.Describe All ---")
print(self.stroke.describe(include='all'))
# pd.set_option('display.max_columns', None) => 결과물 행 개수 최대화
# pd.set_option('display.max_row', None) => 결과물 열 개수 최대화
b. ID 변수 설정
def target(self):
self.rename_meta()
df = self.my_stroke
print(f"id변수 데이터타입: {df['아이디'].dtypes}")
# 1.데이터타입 확인 -> int
print(f"id변수 결측값 개수: {df['아이디'].isnull().sum()}")
# 2.결측값 확인 -> 0
print(f"id변수 유니크값 개수: {len(pd.unique(df['아이디']))}\\n")
# 3.중복값 여부확인 -> 5110 => 행 개수와 일치 = id 겹치는 거 없음
c. 타깃 변수 설정
def target(self):
self.rename_meta()
df = self.my_stroke
print(f"타깃변수 데이터타입: {df['뇌졸중'].dtypes}")
# 1.데이터타타입 확인 -> int => 0 아니면 1 이여서
print(f"타깃변수 결측값 개수: {df['뇌졸중'].isnull().sum()}")
# 2.결측값 확인 -> 0
print(f"타깃변수 데이터값 분포:\\n{df['뇌졸중'].value_counts(dropna=False)}")
# 3. 데이터값 분포 확인 -> 0: 4861, 1: 249
print(f"타깃변수 데이터값 백분율:\\n{df['뇌졸중'].value_counts(dropna=False, normalize=True)}\\n")
# 4. 데이터값 백분율 확인 -> 0: 0.961272, 1: 0.048728
d. 기타 변수 데이터 처리
- interval data(continuous data)와 categorical data 구분
def datatypes(self):
self.rename_meta()
df = self.my_stroke
print(df.columns) # 변수 뭐있는지 출력
print(df[['아이디', '성별', '나이', '고혈압', '심장병', '기혼여부',
'직종', '거주형태', '평균혈당', '비만도', '흡연여부', '뇌졸중']].dtypes)
# dtype: : float ⇒ interval, : int, object ⇒ categorical
- interval data 처리
def interval_variables(self):
self.rename_meta()
df = self.my_stroke
cols = ['나이', '평균혈당', '비만도']
print(f"---구간변수타입---\\n {df[cols].dtypes}")
print(f"---결측값 있는 변수---\\n {df[cols].isna().any()[lambda x: x]}")
print(f"비만도 결측비율: {df['비만도'].isnull().mean():.2f}")
pd.options.display.float_format = '{:.2f}'.format
print(f"---구간변수 기초 통계량---\\n{df[cols].describe()}")
c = df['나이'] > 18
self.adult_stock = df[c]
print(f"---성인객체스펙---\\n{df[c].shape}")
c1 = self.adult_stock['평균혈당'] <= 232.64
c2 = self.adult_stock['비만도'] <= 60.3
self.adult_stock = self.adult_stock[c1 & c2]
- categorical data 처리
def categorical_variables(self):
self.create_adult_stock()
df = self.adult_stock
category = ['성별', '심장병', '기혼여부', '직종', '거주형태', '흡연여부', '고혈압']
print(f'범주형변수 데이터타입\\n {df[category].dtypes}')
print(f'범주형변수 결측값\\n {df[category].isnull().sum()}')
print(f'결측값 있는 변수\\n {df[category].isna().any()[lambda x: x]}')
# => 결측값이 없음.
self.stroke = df
self.spec()
print(" ### 프리프로세스 종료 ### ")
2)놓친 거
지도학습(레이블)
출력값(=타깃)
- int = 불연속 = 카테고리컬
- float = 연속 = 시퀀셜 = regression
모델
= 공학적으로 시스템(체계)적인 특성(변수)을 수학적으로 표현하는 과정(수식화) ⇒ 문자를 수학적으로..?
샘플정리..?
2. 코드
<ml패키지>
init
from ml.stroke import STROKE_MENUS, stroke_menu
from ml.stroke import StrokeService
def my_menu(ls):
for i, j in enumerate(ls):
print(f"{i}. {j}")
return input('메뉴선택: ')
if __name__ == '__main__':
t = StrokeService()
while True:
menu = my_menu(STROKE_MENUS)
if menu == '0':
print("종료")
break
elif menu == '1':
t.spec()
elif menu == '2':
t.rename_meta()
elif menu == '3':
t.target()
elif menu == '4':
t.interval_variables()
elif menu == '5':
t.categorical_variables()
else:
try:
stroke_menu[menu](t)
except KeyError:
print(" ### Error ### ")
sample
from sklearn.ensemble import RandomForestClassifier
def execute():
clf = RandomForestClassifier(random_state=0)
x = [[1,2,3],[11,12,13]] #샘플 2개, 피쳐 3개
y = [0,1] # 기대값, 예측값 E: 각 샘플의 클래스(타깃변수의 클래스값)
clf.fit(x, y) # clf 객체를 통해 학습시킨다
print(clf.predict([[4,5,6], [14,15,16]])) # 새로운 데이터셋의 클래스를 예측)
if __name__ == '__main__':
execute()
stroke
import pandas as pd
import numpy as np
'''
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 5110 entries, 0 to 5109
Data columns (total 12 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 id 5110 non-null int64
1 gender 5110 non-null object
2 age 5110 non-null float64
3 hypertension 5110 non-null int64
4 heart_disease 5110 non-null int64
5 ever_married 5110 non-null object
6 work_type 5110 non-null object
7 Residence_type 5110 non-null object
8 avg_glucose_level 5110 non-null float64
9 bmi 4909 non-null float64
10 smoking_status 5110 non-null object
11 stroke 5110 non-null int64
dtypes: float64(3), int64(4), object(5)
memory usage: 479.2+ KB
'''
STROKE_MENUS = ["종료", #0
"데이터구하기",#1
"타깃변수설정",#2
"데이터처리",#3
"시각화",#4
"모델링",#5
"학습",#6
"예측"]#7
stroke_meta = {
'id' : '아이디',
'gender' : '성별',
'age' : '나이',
'hypertension' : '고혈압',
'heart_disease' : '심장병',
'ever_married' : '기혼여부',
'work_type' : '직종',
'Residence_type' : '거주형태',
'avg_glucose_level' : '평균혈당',
'bmi' : '비만도',
'smoking_status' : '흡연여부',
'stroke' : '뇌졸중'
}
stroke_menu = {
"1" : lambda t: t.spec(),
"2" : lambda t: t.rename_meta(),
"3" : lambda t: t.visualize(),
"4" : lambda t: t.compare_displ(),
"5" : lambda t: t.find_high_cty(),
"6" : lambda t: t.find_highest_hwy(),
"7" : lambda t: t.which_cty_in_suv_compact(),
"8" : lambda t: t.find_top5_hwy_in_audi(),
"9" : lambda t: t.find_top3_avg(),
}
class StrokeService:
def __init__(self):
self.stroke = pd.read_csv('./data/healthcare-dataset-stroke-data.csv')
self.my_stroke = None
self.adult_stock = None
'''
1.스펙보기
'''
def spec(self):
print(" --- 1.Shape ---")
print(self.stroke.shape)
print(" --- 2.Features ---")
print(self.stroke.columns)
print(" --- 3.Info ---")
print(self.stroke.info())
print(" --- 4.Case Top1 ---")
print(self.stroke.head(1))
print(" --- 5.Case Bottom1 ---")
print(self.stroke.tail(3))
print(" --- 6.Describe ---")
print(self.stroke.describe())
print(" --- 7.Describe All ---")
print(self.stroke.describe(include='all'))
'''
2.한글 메타데이터
'''
def rename_meta(self):
self.my_stroke = self.stroke.rename(columns=stroke_meta)
# print(" --- 2.Features ---")
# print(self.my_stroke.columns)
'''
3. 타겟변수(=종속변수 dependant, y값) 설정
입력변수(=설명변수, 확률변수, x값)
타깃변수명: stroke (=뇌졸중)
타깃 변수값: 과거에 한 번이라도 뇌졸중이 발병했으면 1, 아니면 0
'''
def target(self):
self.rename_meta()
df = self.my_stroke
print(f"id변수 데이터타입: {df['아이디'].dtypes}")
print(f"id변수 결측값 개수: {df['아이디'].isnull().sum()}")
print(f"id변수 유니크값 개수: {len(pd.unique(df['아이디']))}\\n")
print(f"타깃변수 데이터타입: {df['뇌졸중'].dtypes}")
print(f"타깃변수 결측값 개수: {df['뇌졸중'].isnull().sum()}")
print(f"타깃변수 데이터값 분포:\\n{df['뇌졸중'].value_counts(dropna=False)}")
print(f"타깃변수 데이터값 백분율:\\n{df['뇌졸중'].value_counts(dropna=False, normalize=True)}\\n")
def interval_variables(self):
self.rename_meta()
df = self.my_stroke
cols = ['나이', '평균혈당', '비만도']
print(f"---구간변수타입---\\n {df[cols].dtypes}")
print(f"---결측값 있는 변수---\\n {df[cols].isna().any()[lambda x: x]}")
print(f"체질량 결측비율: {df['비만도'].isnull().mean():.2f}")
pd.options.display.float_format = '{:.2f}'.format
print(f"---구간변수 기초 통계량---\\n{df[cols].describe()}")
c = df['나이'] > 18
self.adult_stock = df[c]
print(f"---성인객체스펙---\\n{df[c].shape}")
c1 = self.adult_stock['평균혈당'] <= 232.64
c2 = self.adult_stock['비만도'] <= 60.3
self.adult_stock = self.adult_stock[c1 & c2]
def create_adult_stock(self):
self.rename_meta()
df = self.my_stroke
c = df['나이'] > 18
self.adult_stock = df[c]
c1 = self.adult_stock['평균혈당'] <= 232.64
c2 = self.adult_stock['비만도'] <= 60.3
self.adult_stock = self.adult_stock[c1 & c2]
def categorical_variables(self):
self.create_adult_stock()
df = self.adult_stock
category = ['성별', '심장병', '기혼여부', '직종', '거주형태', '흡연여부', '고혈압']
# print(f'범주형변수 데이터타입\\n {df[category].dtypes}')
# print(f'범주형변수 결측값\\n {df[category].isnull().sum()}')
# print(f'결측값 있는 변수\\n {df[category].isna().any()[lambda x: x]}')
# => 결측값이 없음.
self.stroke = df
self.spec()
print(" ### 프리프로세스 종료 ### ")
3. 하루마무리
날짜를 착각해서 국민취업제도 수당신청을 못했고 결국 이번 달 치는 못받게됐다.
그래서 알바를 구해야겠다 싶어 면접을 보러 갔는데 이력서를 놓고와서 문 앞에서 광탈당했다.
집에와서 씻고 공부 정리나 할까 했는데 학원에 책을 놓고왔다.
.
.
.
무슨 정신으로 사는 건지..
'비트캠프(AI아카데미) > TIL&WIL' 카테고리의 다른 글
| [비트캠프 - 클라우드 기반 AlaaS 개발자 과정] 22.11.16.(DAY-23) TIL (0) | 2022.11.17 |
|---|---|
| [비트캠프 - 클라우드 기반 AlaaS 개발자 과정] 22.11.15.(DAY-22) TIL (0) | 2022.11.16 |
| [비트캠프 - 클라우드 기반 AlaaS 개발자 과정] 22.11.11.(DAY-20) TIL (1) | 2022.11.12 |
| [비트캠프 - 클라우드 기반 AlaaS 개발자 과정] 9 10(DAY-18 19) TIL (0) | 2022.11.11 |
| [비트캠프 - 클라우드 기반 AlaaS 개발자 과정] 22.11.08.(DAY-17) TIL (0) | 2022.11.08 |
댓글