본문 바로가기
학습노트/Python

[강의노트] Python - 머신러닝 - 로지스틱 회귀 - 실습(1)

by kime2 2024. 1. 31.

 

사용데이터: Kaggle의 titanic train 데이터셋

 

목표 1. 탑승한 승객의 정보를 바탕으로 생존 유무를 예측하는 분류 문제

가설 1. 성별과 생존의 관계, 여성일 수록 생존확률이 높을 것이다           -> 여성은 모두 생존했고 남성은 모두 사망했다가설 2. 요금과 생존의 관계, 요금이 높은 고객일 수록 생존했을 것이다

 

          -> 높은 요금운 모두 생존했고, 낮은 요금은 모두 사망했다가설 3. 요금/성별/좌석등급과 생존의 관계, 어릴수록 생존했을 것이다

 

방법: 로지스틱회귀

  • Y(종속변수): 사망(0), 생존(1)
  • X(독립변수): 티켓등급, 성별, 요금 등
💡순서
라이브러리 &데이터불러오기 > 데이터 살펴보기(산점도 그려보기, 기초통계량 보기,엔코딩하기) > 선형회귀 훈련하기(가중치/편향 계산) > 평가하기(정확도, f1-score)

 

1. 라이브러리 & 데이터 불러오기

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.linear_model import LogisticRegression

titaninc_df  = pd.read_csv('/Users/t2023-m0017/Desktop/[파이썬]/ML/titanic/train.csv', encoding= 'utf-8')
titaninc_df.head(3)

 

2. 데이터 살펴보기

  • 숫자형 데이터: age, sibsp, parch, fare
  • 범주형 데이터: pclass, sex, cabin, embarked
  • 이산형 데이터: survived
# info(): 데이터에 대한 결측치, 데이터전체 갯수 등을
titaninc_df.info()

 

null 값이 있는 데이터: cabin > age > embarked


3. 분석하기 

 

가설 1. 성별과 생존의 관계, 여성일 수록 생존확률이 높을 것이다

방법: pivot table > 그래프

 

피벗테이블로 확인하기

pt = pd.pivot_table(titaninc_df,          # 피벅할 데이터프레임
                    index= 'Sex',         # 행 위치에 들어갈 열 -> female, male
                    columns = 'Survived', # 열 위치에 들어갈 열 -> 0,1
                    aggfunc = 'size')     # 데이터 집계함수 -> 수량

 

4. 평가하기

정확도 = 예측하여 맞춘갯수 / 전체데이터

* 여성은 전부 살았고 남성은 전부 적었다 라고 가정할 때 실제로 생존한 여성: 233, 실제로 사망한 남성: 468

total_p = len(titaninc_df) # 전체데이터

(233+468)/total_p*100  # 정확도 계산

>> 78.67564534231201

약 79% 정확함

 

💡정확도 계산하기

(TP +TN)/(TP+FP+TN+FN) = 실제생존한 여성의 수 + 실제 사망한 남성의 수 / 전체 인원수

 

그래프 그리기

sns.countplot(titaninc_df, x = 'Sex', hue ='Survived')

 

 

 


단순로지스틱 회귀

 

가설 2. 요금과 생존의 관계, 요금이 높은 고객일 수록 생존했을 것이다

          -> 높은 요금운 모두 생존했고, 낮은 요금은 모두 사망했다

방법: 로지스틱 회귀

  • Y(종속변수): 사망(0), 생존(1)
  • X(독립변수): 요금 

2. 데이터확인하기

2-1) 변수지정하기

# X변수: Fare, Y변수: Survived
X_1 = titaninc_df[['Fare']]
y_true = titaninc_df[['Survived']]

 

2-2) 그래프/표로 분포 확인하기

sns.scatterplot(titaninc_df, x = 'Fare',y = 'Survived')

 

산점도로는 분표의 밀도를 알기 어렵고..요금별 차이가 보이지 않음...

sns.histplot(titaninc_df, x = 'Fare')

히스토그램에서는 10~20에 분포가 제일 많음 -> 데이터가 한쪽으로 치우침

# 수치형데이터를 확인하는 쉬운방법 describe()
titaninc_df.describe()

 

평균이 32로 50%다 14에 치우쳐짐

 

3. 선형회귀 훈련하기(가중치/편향 계산)

model_lor = LogisticRegression()
model_lor.fit(X_1, y_true)

 

def get_att(x):
    #x모델을 넣기
    print('클래스 종류', x.classes_)   # 생존을 0,1로 구분
    print('독립변수 갯수', x.n_features_in_) # 요금
    print('들어간 독립변수(x)의 이름',x.feature_names_in_)
    print('가중치',x.coef_)
    print('바이어스(편향)', x.intercept_)
    
    
    get_att(model_lor)

 

 

 

4. 평가하기(정확도, f1-score)

 

from sklearn.metrics import accuracy_score, f1_score
def get_metrics(true, pred):
    print('정확도', accuracy_score(true, pred))
    print('f1-score', f1_score(true, pred))
    
    
y_pred_1 = model_lor.predict(X_1)   # x변수 요금에 대한 y값 확률


get_metrics(y_true, y_pred_1)

 

 


다중로지스틱 회귀

 

가설 3. 요금/성별/좌석등급과 생존의 관계, 어릴수록 생존했을 것이다

방법: 다중로지스틱 회귀

  • Y(종속변수): 사망(0), 생존(1)
  • X(독립변수): 요금(수치형)/성별(범주형)/좌석등급(범주형-숫자)

2. 데이터확인하기

2-1) 볌주형 데이터 encoding하기

def get_sex(x):
    if x == 'female':
        return 0
    else:
        return 1   #sex컬럼에서 female일 경우 1, 아닐 경우0
        
titaninc_df['Sex_en'] = titaninc_df['Sex'].apply(get_sex)
# titaninc_df 데이터프레임에서 Sex_en라는 컬럼에(만들어서) Sex컬럼에 get_sex함수를 적용시켜서 저장

titaninc_df.head(3)

 

2-2) 변수지정하기

X_2 = titaninc_df[['Pclass','Sex_en','Fare']] #x_2변수에 'Pclass','Sex_en','Fare' 저장
y_true = titaninc_df[['Survived']]			#y_true 변수에 'Survived'지정

 

3. 선형회귀 훈련하기

model_lor_2 = LogisticRegression()			# 모델 학습
model_lor_2.fit(X_2,y_true)			# 훈련하기

 

get_att(model_lor_2)

 

 

4. 평가하기(정확도, f1-score)

from sklearn.metrics import accuracy_score, f1_score
def get_metrics(true, pred):
    print('정확도', accuracy_score(true, pred))
    print('f1-score', f1_score(true, pred))
    
    
y_pred_2 = model_lor_2.predict(X_2)  # x변수 요금,성별,좌석등급에 대한 y값 확률


get_metrics(y_true, y_pred_1) # X변수가 Fare
get_metrics(y_true, y_pred_2) # X변수가 Fare, Pclass, Sex

 

정확도와 f-score가 올라감!