본문 바로가기
비트캠프(AI아카데미)/TIL&WIL

[비트캠프 - 클라우드 기반 AlaaS 개발자 과정] 22.11.14.(DAY-21) TIL

by 그냥_살자 2022. 11. 15.

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. 하루마무리

날짜를 착각해서 국민취업제도 수당신청을 못했고 결국 이번 달 치는 못받게됐다.

 

그래서 알바를 구해야겠다 싶어 면접을 보러 갔는데 이력서를 놓고와서 문 앞에서 광탈당했다.

 

집에와서 씻고 공부 정리나 할까 했는데 학원에 책을 놓고왔다.

.

.

.

무슨 정신으로 사는 건지..

 

 

댓글