(ML)타이타닉 생존자 예측

지며리·2023년 2월 3일
0


1. EDA

데이터 구성

import pandas as pd 

titanic_url = 'https://raw.githubusercontent.com/PinkWink/\
						ML_tutorial/master/dataset/titanic.xls'

titanic = pd.read_excel(titanic_url)
titanic.head()


생존율

import matplotlib.pyplot as plt
import seaborn as sns

fig, ax = plt.subplots(1, 2, figsize = (9,4))

titanic['survived'].value_counts().plot.pie(ax = ax[0], autopct = '%1.1f%%',\
										shadow = True, explode = [0, 0.05])
ax[0].set_title('Pie plot - survived')
ax[0].set_ylabel('')

sns.countplot(x='survived', data=titanic, ax = ax[1])
ax[1].set_title('Count plot - survived')

  • 38.2%가 생존(1)하였다.

  • 1300명 가량이 탑승하였으며 500명 가량이 생존하였다.


성별 생존율

fig, ax = plt.subplots(1, 2, figsize = (9,4))

sns.countplot(x='sex', data=titanic, ax = ax[0])
ax[0].set_title('Count of passengers of sex')
ax[0].set_ylabel('')

sns.countplot(x='sex', data=titanic, hue = 'survived', ax = ax[1])
ax[1].set_title('Sex : survived')

plt.show()

  • 탑승객 비율은 남성이 더 높으나, 생존인원은 여성이 더 높다.

등급별, 연령별 생존율

pd.crosstab(titanic['pclass'], titanic['survived'], margins = True)

#!pip install plotly_express

import plotly.express as px

grid = sns.FacetGrid(titanic, row = 'pclass', col = 'survived',\
											height = 4, aspect = 2)
grid.map(plt.hist, 'age', alpha = 0.8, bins = 20)
grid.add_legend()

  • 1등급이 3등급 대비 생존율이 높다는 것을 알 수 있다.

2. 데이터 전처리

연령별로 범주화

titanic['age_cat'] = pd.cut(titanic['age'], bins = [0,7,15,30,60,100],
                            include_lowest = True,
                            labels = ['baby','teen','young','adult','old'])

신분별 범주화

import re

title = []
for idx, dataset in titanic.iterrows():
    tmp = dataset['name']
    title.append(re.search('\,\s\w+(\s\w+)?\.', tmp).group()[2:-1])
    
titanic['title'] = title

titanic['title'] = titanic['title'].replace('Mlle', 'Miss')
titanic['title'] = titanic['title'].replace('Ms', 'Miss')
titanic['title'] = titanic['title'].replace('Mme', 'Mrs')

# 귀족 분류
Rare_f = ['Dona','Lady','the Countess']
Rare_m = ['Capt', 'Don', 'Col', 'Dr', 'Major', 'Rev', 'Sir',\
								'Jonkheer', 'Rev','Master']
for each in Rare_f:
    titanic['title'] = titanic['title'].replace(each, 'Rare_f')

for each in Rare_m:
    titanic['title'] = titanic['title'].replace(each, 'Rare_m')

titanic['title'].unique()

titanic = titanic[titanic['age'].notnull()]
titanic = titanic[titanic['fare'].notnull()]

Label Encoder

  • 머신러닝은 숫자형만 읽을 수 있으므로 범주화한 문자형 카테고리를 숫자로 변환해주는 Label Encoder를 활용해야 한다.
from sklearn.preprocessing import LabelEncoder

le = LabelEncoder()
le.fit(titanic['sex'])
titanic['gender'] = le.transform(titanic['sex'])

# fit_transform으로 한번에 수행할 수도 있다.
titanic['age_cat_le']=le.fit_transform(titanic['age_cat'])
titanic['title_le'] = le.fit_transform(titanic['title'])

3. 머신러닝 학습, 예측

from sklearn.model_selection import train_test_split

# 필요한 컬럼만 추출
X = titanic[['pclass', 'age_cat_le','title_le', 'sibsp','parch','fare','gender']]
y = titanic['survived']

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.2,\
														random_state = 13)

from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import accuracy_score

dt = DecisionTreeClassifier(max_depth= 4, random_state=13)
dt.fit(X_train, y_train)

pred = dt.predict(X_test)
print(accuracy_score(y_test, pred))

profile
쉽고 유익하게 널리널리

0개의 댓글