본문 바로가기
Code Example

Decision Tree Code Example(Titanic 생존자 예측)

by Oceanlighth AI 2023. 2. 8.
Decision Tree를 이용한 Titanic 생존자 예측하기

오늘은 Desicion Tree를 이용하여 타이타닉호의 생존자를 예측하는 코드를 작성해 보도록 하겠습니다.

 

지난번과 마찬가지로 데이터는 Kaggle에서 가져왔습니다.

 

test.csv
0.03MB
train.csv
0.06MB

학습환경은 Jupyter Notebook에서 작성하였습니다.

 

Library Import 하기
import os
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import re
import numpy as np
from sklearn import tree
from sklearn.model_selection import train_test_split

# Figures inline and set visualization style
%matplotlib inline
sns.set()
데이터 불러오기

 

#파일 경로의 경우 사용자의 환경에 맞게 설정해주어야 합니다.
df_train = pd.read_csv("C:/Users/User/Downloads/train.csv")
df_test = pd.read_csv("C:/Users/User/Downloads/test.csv")


print(df_train.shape)
df_train.head()

그림 1. train 데이터의 shape와 데이터중 위에서 5개의 데이터를 불러오기

print(df_test.shape)
df_test.head()

그림 2. test 데이터의 shape와 위에서 5개의 데이터를 불러오기

그림 1, 2와 같이 데이터를 불러보았습니다. 데이터의 각 Column에 대한 설명은 이전 글에서 확인할 수 있습니다.

 

 

불러온 데이터를 시각화 하여 어떤 특성이 있는지 살펴보겠습니다.
sns.countplot(x='Survived', data=df_train)

그림 3. 생존자의 숫자를 시각화하기

그림 3.과 같이 train데이터에서 사망자(0)와 생존자(1)의 데이터를 눈으로 확인할 수 있습니다.

sns.countplot(x='Sex', data=df_train);

그림 3-1. 각 성별에 대한 수치를 시각화

그림 3-1은 각 성별의 합계를 시각적으로 나타낸 것입니다.

 

sns.catplot(x='Survived', col='Sex', kind='count', data=df_train);

그림 3-2. 성별에 따른 생존자 수 시각화

그림 3-2.는 성별에 따른 생존자 수를 시각화 하여 나타낸 것입니다.

 

각 성별에 따라 생존자의 수를 수치화 하면 다음과 같습니다.

df_train.groupby(['Sex']).Survived.sum()

그림 4. 성별에 따른 생존자 수 수치화

각 성별에 따른 생존확률을 다음과 같은 방법으로 구해봅시다.

print(df_train[df_train.Sex == 'female'].Survived.sum()/df_train[df_train.Sex == 'female'].Survived.count())
print(df_train[df_train.Sex == 'male'].Survived.sum()/df_train[df_train.Sex == 'male'].Survived.count())

그림 4-2. 성별에 따른 생존 확률

다음은 Pclass(승선자의 사회-경제적 지위)에 따른 생존자의 수를 시각화 해보겠습니다.

sns.catplot(x='Survived', col='Pclass', kind='count', data=df_train);

그림 5. Pclass에 따른 생존자 수치화

그림 5.와 같이 Pclass에 따른 생존자의 수를 수치화 하여 볼 수 있습니다.

 

데이터 전처리(Pre-Processing)하기

다음은 데이터를 전처리하여 학습에 알맞게 조정해 보겠습니다.

먼저 train/test데이터 중 결측치에 대한 처리를 위해 데이터를 합쳐보도록 하겠습니다.

# train데이터의 Survived Column을 따로 저장합니다.
survived_train = df_train.Survived

#train 데이터의 Survived Column을 제거하고 test data와 합칩니다.
data = pd.concat([df_train.drop(['Survived'], axis=1), df_test])
data.head()

그림 6. train 데이터의 Survived Column을 따로 저장한 뒤 train 데이터와 test데이터를 합침

그림 6.과 같이 train데이터에서 Survived Column이 없어지고 test데이터와 합쳐진 하나의 data가 생성되었습니다.

결측치 확인

지난 글과 마찬가지로 데이터에서 결측치가 있는지 확인하고 처리해 보도록 하겠습니다.

data.info()

그림 7. 결측치 확

그림 7.과 같이 나이, 승선요금, 객실번호, 승선지의 데이터에 결측치가 존재하는 것을 알 수 있습니다. 이제 이 데이터들을 처리해보도록 하겠습니다.

 

# 나이와 승선요금의 결측치를 해당 Column데이터의 중위값으로 채우기
data['Age'] = data.Age.fillna(data.Age.median())
data['Fare'] = data.Fare.fillna(data.Fare.median())

data.info()

그림 8. 나이와 승선요금 결측치 처리

그림 8.과 같이 나이와 승선요금에 대한 결측치가 채워진 것을 알 수 있습니다.

 

string으로 된 데이터 수치화 하기

우리가 가지고 있는 데이터 중 성별 데이터는 male,female 즉 string으로 된 데이터 입니다.

해당 데이터를 0과 1로 수치화 하여 학습에 알맞은 데이터로 만들겠습니다.

data = pd.get_dummies(data, columns=['Sex'], drop_first=True)
data.head()

그림 9. 성별에 대한 데이터를 수치화하기

그림 9.와 같이 성별에 대한 데이터가 0과 1로 수치화 되었습니다.

 

결과에 영향을 미치는 변수들만 가져오기

우리는 우리가 가지고 있는 모든 데이터의 Column을 사용하지 않고 결과에 영향을 미치는 데이터들만 가져와서 학습을 해보도록 하겠습니다.

data = data[['Sex_male', 'Fare', 'Age','Pclass', 'SibSp']]
data.head()

그림 10. 학습에 필요한 데이터만 가져오기

그림 10.과 같이 성별, 승선요금, 나이, 사회-경제적지위, 승선자와 함께 탄 형제, 자매 혹은 배우자의 수 에 대한 Column만 가져와서 학습을  진행하도록 하겠습니다.

학습을 위한 데이터 분할

다음으로 우리가 해야 하는 작업은 train과 test 데이터를 합쳐놓은 data를 다시 train/test 데이터로 나누어보도록 하겠습니다.

 

data_train = data.iloc[:891]
data_test = data.iloc[891:]

데이터를 0~891 까지train 데이터로, 892~마지막 데이터 까지  test데이터로 나누었습니다.

X = data_train.values
test = data_test.values
y = survived_train.values

다음은 각각 데이터가 가지고 있는 값들을 X, y, test로 넣었습니다.

 

Decision Tree를 이용한 데이터 학습

이제 Decision Tree를 활용하여 우리가 가지고 있는 데이터를 학습해보도록 하겠습니다.

 

clf = tree.DecisionTreeClassifier()
clf.fit(X, y)

데이터를 Decision Tree 모델에 맞게 설정하고 학습을 진행하였습니다.

Decision Tree를 이용하여 학습한 결과를 이미지로 나타내 보겠습니다.

 

import graphviz 
from PIL import Image

dot_data = tree.export_graphviz(clf, out_file=None, 
                         feature_names=data_train.columns.values,  
                         class_names=['Survived','Not Survived'],  
                         filled=True, rounded=True,  
                         special_characters=True)  
graph = graphviz.Source(dot_data)  
graph

Decision Tree의 가지가 많아서 이미지가 한눈에 들어오지 않아 Pdf 파일로 저장하여 Tree를 보았습니다.

src = graphviz.Source(dot_data)
src.view()

그림 11. Decision Tree 시각화

상당히 많은 가지를 치면서 의사결정을 하는 것을 볼 수 있습니다.

 

그림 12. Decision Tree 일부분

그림 12.는 Decision Tree의 시작지점을 이미지로 잘라서 가져온 것입니다. 

 

학습 결과 확인하기

학습된 결과를 통해 test데이터의 생존자에 대한 예측을 해보도록 하겠습니다.

 

Y_pred = clf.predict(test)
df_test['Survived'] = Y_pred
clf.score(X, y)

그림 13. 학습 결과 수치

그림 11.과 같이 Decision Tree를 통해 학습한 결과를 통한 예측값과 실제 데이터를 비교한 점수를 알 수 있습니다.

 

 

 

마치며

이번 글에서는 Decision Tree를 이용해 타이타닉 호의 생존자를 예측해 보았습니다.

다음 글에서는 다른 분류 알고리즘을 통한 예측을 해보도록 하겠습니다.

decisiontree.ipynb
0.71MB

 

댓글