타이타닉 데이터셋 분류
포스트
취소

타이타닉 데이터셋 분류

Titanic 데이터 셋 처리하기

데이터셋 링크 https://www.kaggle.com/c/titanic/

구조

VariableDefinitionkey
survivalsurvival0 = No, 1 = Yes
pclassTicket class1 = 1st, 2 = 2nd, 3 = 3rd
sexSex 
AgeAge in years 
sibsp# of siblings / spouses aboard the Titanic 
parch# of parents / children aboard the Titanic 
ticketTicket number 
farePassenger fare 
cabinCabin number 
embarkedPort of EmbarkationC = Cherbourg, Q = Queenstown, S = Southampton

데이터셋 살펴보기

1
2
3
4
5
6
7
import numpy as np
import pandas as pd
train_df = pd.read_csv('datasets/train.csv')
test_df = pd.read_csv('datasets/test.csv')
# 그냥 두개 합친다. 나중에 전처리 후 나누기
train_df = pd.concat([train_df, test_df])
train_df.head()

head

데이터 개수와 타입

1
2
print(train_df.shape)
print(train_df.dtypes)

shape and type

데이터 전처리

결측값 확인

1
print(train_df.isnull().sum(axis=0))

Nan

비어있는 Survived와 Age는 중앙값으로 대체하고, 나머지 결측값 행 드랍

1
2
3
train_df['Survived'] = train_df['Survived'].fillna(train_df['Survived'].median())
train_df['Age'] = train_df['Age'].fillna(train_df['Age'].median())
train_df.dropna(axis=0, inplace=True)

문자 -> 숫자

성별은 문자로 되어있으므로 숫자로 바꾼다.

1
2
train_df['Sex'].replace('male', 0, inplace=True)
train_df['Sex'].replace('female', 1, inplace=True)

Embarked는 원핫벡터로 나눈다.

1
2
3
train_df_embarked = pd.get_dummies(train_df['Embarked'])
train_df = pd.concat([train_df, train_df_embarked], axis=1)
train_df_embarked.head()

one hot vector

Ticket은 문자와 숫자로 구성되어있는데, 혹시 모르니 숫자만 분리해보자

1
2
3
4
import re
ticket_filter = r'(\d+$)'
train_df['Ticket'] = train_df['Ticket'].str.extract(ticket_filter)
train_df['Ticket'] = pd.to_numeric(train_df['Ticket'])

분류에 필요 없어 보이는 문자행을 없앤다.

1
train_df.drop(['Name', 'Cabin', 'Embarked'], axis=1, inplace=True)

상관계수 확인

1
train_df.corr()

corr Pclass, 성별, 요금 정도가 생존과 관련 있어 보인다.

분류

데이터 분리

1
2
3
4
from sklearn.model_selection import train_test_split
X_data = train_df
y_data = train_df.pop('Survived')
X_train, X_test, y_train, y_test = train_test_split(X_data, y_data, random_state=0)

정규화

1
2
3
4
5
6
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_train_scaled = pd.DataFrame(X_train_scaled, columns=X_data.columns)
X_test_scaled = scaler.transform(X_test)
X_test_scaled = pd.DataFrame(X_test_scaled, columns=X_data.columns)

결정트리

1
2
3
4
5
6
from sklearn.tree import DecisionTreeClassifier
clf = DecisionTreeClassifier().fit(X_train_scaled, y_train)
print('Accuracy of Decision Tree classifier on training set: {:.3f}'
		.format(clf.score(X_train_scaled, y_train)))
print('Accuracy of Decision Tree classifier on test set: {:.3f}'
		.format(clf.score(X_test_scaled, y_test)))

Accuracy of Decision Tree classifier on training set: 1.000

Accuracy of Decision Tree classifier on training set: 0.838

끝으로

  • MinMaxScaler랑 별 차이는 없는듯.
  • Ticket은 숫자만 추출해봤지만, 큰 의미는 없었다.
  • 중요한 데이터가 몇 개 없는 것을 보면 다른 알고리즘을 써도 비슷한 결과가 나올 것 같다.
  • 내가 놓친 데이터가 있을 것 같은데..
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.