PassengerId : 승객번호 Survived : 생존여부( 0 : 사망, 1 : 생존 ) Pclass : 승객이 탑승한 선실 등급 (1 : 1등급, 2 : 2등급, 3 : 3등급 ) Name : 승객 이름 <-- 파생 컬럼을 생각해낼 수 있는 힌트 Sex Age : 결측치가 다수 존재하므로 이 결측치를 잘 처리해줘야합니다. SibSp : 동반한 형제 또는 배우자 수 Parch : 동반한 부모 또는 자녀의 수 Ticket : 승객의 티켓번호 <--- Cabin 의 결측치를 예상하는데 도움을 받을 수 있음. Fare : 티켓 요금 Cabin : 객실 번호 Embarked : 승객이 탑승한 항구( C = Cherbourg, Q=Queentown, S=Southampton )
#1. 데이터 불러오기
import pandas as pd
train_data = pd.read_csv("c:\\data_tat\\train.csv")
test_data = pd.read_csv("c:\\data_tat\\test.csv")
gender_submission = pd.read_csv("c:\\data_tat\\gender_submission.csv")
# 실습
#1. 데이터 불러오기
import pandas as pd
train_data = pd.read_csv("c:\\data_tat\\titanic\\train.csv")
test_data = pd.read_csv("c:\\data_tat\\titanic\\test.csv")
gender_submission = pd.read_csv("c:\\data_tat\\titanic\\gender_submission.csv")
#2. 데이터 살펴보기
train_data.shape # (891, 12)
test_data.shape # (418, 11)
#train_data.info()
#test_data.info()
#3. 결측치 채우기
train_data.isnull().sum()
train_data['Age'].fillna( train_data['Age'].median(), inplace=True) # 중앙값으로 채움
train_data['Embarked'].fillna(train_data['Embarked'].mode()[0], inplace=True) # 최빈값으로 채움
# cabin 의 경우는 결측치가 너무 많아서 삭제할 겁니다.
# 케글 상위권자들의 경우는 이 cabin 을 다른 컬럼의 데이터로 유추해서 채워넣었습니다.
# 여자 또는 아이 파생 컬럼 추가
train_data['iswomen'] = train_data['Sex'].apply(lambda x:1 if x=='female' else 0 )
train_data['ischild'] = train_data['Age'].apply(lambda x:1 if x<=16 else 0 )
train_data['iswomenchild'] = train_data['iswomen'] | train_data['ischild']
# 가족 규모(Family size) 파생 컬럼을 추가
train_data['FamilySize'] = train_data['SibSp'] + train_data['Parch'] + 1
# 요금을 4개의 등급으로 나눠주는 파생 컬럼 추가
train_data['fare_bin'] = pd.cut(train_data['Fare'], 4, labels=[0, 1, 2, 3 ] )
# # 호칭 컬럼 추가
# train_data['Title'] = train_data.Name.str.extract('([A-Za-z]+)\\.')
# train_data['Title'] = train_data['Title'].replace([ 'Master', 'Don', 'Rev', 'Dr' ,'Major', 'Lady', 'Sir', 'Col', 'Capt', 'Countess', 'Jonkheer'], 'Rare' )
# train_data['Title'] = train_data['Title'].replace('Mlle', 'Miss')
# train_data['Title'] = train_data['Title'].replace('Ms', 'Miss')
# train_data['Title'] = train_data['Title'].replace('Mme', 'Mrs')
# 요금에 로그 변환 적용
import numpy as np
train_data['LogFare'] = np.log1p(train_data['Fare'])
# 나이에 로그 변환 적용
train_data['LogAge'] = np.log1p(train_data['Age'])
#4. 불필요한 컬럼 삭제하기
train_data.drop(['Cabin', 'Ticket', 'Name', 'PassengerId','iswomen','ischild'], axis=1, inplace=True )
train_data.isnull().sum()
print(train_data)
#5. 문자형 데이터 ---> 숫자형으로 변환하기
#train_data.info()
train_data = pd.get_dummies( train_data, columns=['Sex', 'Embarked'], drop_first=True)
#6. 독립변수와 종속변수 지정하기
x = train_data.drop('Survived', axis=1 ) # axis=1 : 세로, axis=0: 가로
y = train_data['Survived']
x
#7. 훈련 데이터와 테스트 데이터 분리하기
# (훈련 데이터를 가지고 또 훈련과 테스트를 나눈것이라서 x_var, y_var 로 이름 붙임)
from sklearn.model_selection import train_test_split
x_train, x_var, y_train, y_var = train_test_split( x, y, test_size=0.2, random_state=1)
print( x_train.shape )
print( x_var.shape )
print( y_train.shape)
print( y_var.shape )
#8. 모델 생성
from sklearn.ensemble import RandomForestClassifier
model = RandomForestClassifier(n_estimators=100, random_state=1)
model.fit(x_train, y_train)
#9. 모델 예측
y_pred = model.predict(x_var)
y_pred
#10. 모델 평가
from sklearn.metrics import accuracy_score
accuracy = accuracy_score( y_pred, y_var )
accuracy