DataSet : Titanic(kaggle)
# ๋ถ์์ ํ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ถ๋ฌ์ค๊ธฐ
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
โ
# train.csv ํ์ผ ๋ถ๋ฌ์ค๊ธฐ
titanic = pd.read_csv('./data/titanic/train.csv')
โ
๋จธ์ ๋ฌ๋์ ์ํ EDAํ ๋ ๋ฌด์กฐ๊ฑด ํ์ธ ํด์ผ ํ๋ 3๊ฐ์ง ๐๐๐
1) ๊ฒฐ์ธก์น๊ฐ ์กด์ฌ์ฌ๋ถ ํ์ธtitanic[titanic.isnull().any(axis=1)]
โ
2) dtype์ด object์ธ column์ด ์๋์ง ์ฌ๋ถ ํ์ธ
- ์๋ค๋ฉด, ๋ฒ๋ฆฌ๊ฑฐ๋ ๋ณํํด์ผ ํ๊ธฐ ๋๋ฌธ
# ๋ฐฉ๋ฒ 1 titanic.info() โ # ๋ฐฉ๋ฒ 2 titanic.columns[titanic.dtypes == 'object'] # ๋ง์ด ์ด๋ค ๐๐๐
โ
3) target value(์์ธก ๊ฐ)์ distribution ํ์ธtitanic['Survived'].value_counts() sns.countplot(data=titanic, x='Survived', palette='Set3')
์ 3๊ฐ ์ธ์๋ ์์ฃผ ํ์ธํ๋ ๊ฒ์ ์๋์ ๊ฐ๋ค.
4) correlation matrix heatmap
sns.heatmap(data=titanic.corr(), annot=True, fmt='.3f', cmap='Blues_r')
โ
# Cabin columns์ ๋ํ ๋ถ์
cond1 = titanic['Cabin'].isnull()
print(len(titanic[cond1])) # 687
print(len(titanic[~cond1])) # 204
Cabin์ ๊ฒฝ์ฐ, ๋ง์ ๋ฐ์ดํฐ๊ฐ ๋น์ด ์์ด ์ปฌ๋ผ ์์ฒด๋ฅผ ์ญ์ ํ๊ธฐ๋ก ๊ฒฐ์ ํ๋ค.
๊ทธ๋ฌ๋ ๋ค๋ฅธ ํน์ฑ์ ๋ฝ์ ๋ผ ์ ์์์ง ๋ณด๊ธฐ ์ํด ์ถ๊ฐ ๋ถ์์ ์งํํ๋ค.
# Cabin column์ด nan์ด ์๋ ๋ฐ์ดํฐ๋ค
cabin = titanic[~cond1]
โ
# Cabin column์ด nan์ธ ๋ฐ์ดํฐ๋ค
cabin_nan = titanic[cond1]
โ
display(cabin.describe()) # display on jupyter notebook
display(cabin_nan.describe())
โ
Cabin ๊ฐ์ด ์กด์ฌํ๋ฉด ์์กด๋ฅ ์ด ๋์ ๊ฒฝํฅ์ ๋ณด์ธ๋ค.
์๋ก์ด feature์ธ is_cabin(๊ฒฐ์ธก์น์ธ์ง ์๋์ง ์ฌ๋ถ)์ ๋ง๋ค๊ธฐ๋ก ๊ฒฐ์ ํ๋ค.
โ
1) ๊ฒฐ์ธก์น์ ๋ํ ์ ์ฒ๋ฆฌ
2) ์์ธก์ ๋ถํ์ํ columns ์ญ์
3) dtype์ด object์ธ columns์ ๋ํ ์ ์ฒ๋ฆฌ : Ordinal Encoding(์ซ์๋ก ๋ณํ)
'is_cabin' column ์ถ๊ฐ
titanic['is_cabin'] = ~titanic['Cabin'].isnull() * 1
# titanic['is_cabin'] = titanic['Cabin'].mask(cond1, 0).mask(~cond1, 1) # ์์ ๋์ผ
# 'Age'์ ๊ฒฐ์ธก๊ฐ์ Age์ ํ๊ท ๊ฐ์ผ๋ก ๋์ฒด
titanic['Age'] = titanic['Age'].fillna(titanic['Age'].mean())
์์ธก์ ๋ถํ์ํ columns ์ญ์
titanic = titanic.drop(columns=['PassengerId', 'Name', 'Ticket', 'Cabin'])
# 'Embarked' ๊ฒฐ์ธก์น ์๋ ํ ์ญ์
titanic = titanic.dropna()
titanic
# Ordinal Encoding
titanic['Sex'] = pd.factorize(titanic['Sex'])[0]
titanic['Embarked'] = pd.factorize(titanic['Embarked'])[0]
โ
from sklearn.linear_model import LogisticRegression
X = titanic.drop(columns=['Survived']) # define feature vector
y = titanic['Survived'] # define target value
clf = LogisticRegression() # define model
clf.fit(X, y) # fitting(=training)
clf.score(X, y) # Get Accuracy(=์ ํ๋;๋ง์ ๊ฐ์์ ๋น์จ) # 0.80427
โ
# ํ์ดํ๋ ์์กด ๋ถ์ ๊ฒฐ๊ณผ
fig, ax = plt.subplots(nrows=2, ncols=2, figsize=(10, 5), constrained_layout=True)
# ์์กด์/์ฌ๋ง์ ์ ๊ทธ๋ํ
sns.countplot(data=df_ex3, y='Sex', hue='Survived', palette='Set1', ax=ax[0][0])
ax[0][0].legend(title='', labels=['dead', 'survivors'])
ax[0][0].set(xlabel='', ylabel='', title='Number of dead & survivors')
# ์ฑ๋ณ์ ๋ฐ๋ฅธ ์์กด์จ ๊ทธ๋ํ
sns.barplot(data=df_ex3, x='Pclass', y='Survived', hue='Sex', palette='Set2', ax=ax[0][1], ci=False)
ax[0][1].legend(title='')
ax[0][1].set(ylabel='', title='Survival rate by gender')
# 15์ธ ์ดํ์ ๋น์จ ๊ทธ๋ํ
sns.barplot(data=df_ex3, x='Pclass', y='Age', palette='RdPu_r', ax=ax[1][0], ci=False, estimator=lambda x: (x <= 15).mean())
ax[1][0].set(ylim=(0, 0.3), ylabel='', title='Ratio under 15 years')
# ์์ด์ ์ด๋ฅธ์ ์์กด์จ ๋น๊ต ๊ทธ๋ํ
sns.barplot(data=df_ex3, x='Pclass', y='Survived', palette='Set3', hue='A or C', ax=ax[1][1], ci=False)
ax[1][1].set(ylim=(0, 1), ylabel='', title='Survival rate by Age')
ax[1][1].legend(title='', loc='upper right')