BASHA TECH

Predict survival on the Titanic 타이타닉 생존자 예측 예제 1 본문

Computer/Pandas

Predict survival on the Titanic 타이타닉 생존자 예측 예제 1

Basha 2022. 10. 4. 17:36
728x90

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
# 학습 데이터, 테스트 데이터를 로딩 => DataFrame으로 만들거임
train = pd.read_csv('../data/titanic/train.csv')
test = pd.read_csv('../data/titanic/test.csv')
#### 2. Exploratory data analysis (EDA: 탐색적 데이터 분석)
- 탐색적 데이터 분석 : 데이터 탐색해서 데이터 구조와 의미 파악
train.head(5)

데이터 정리

- PassengerId : 고객 번호  
- Survived : 생존 여부, 0 = No, 1 = Yes
- Pclass : Ticket Class 1, 1 = 1st, 2 = 2nd, 3 = 3rd
- Name : 이름 => 결혼 여부, 가족 여부 확인
- Sex : 남, 여
- Age : 나이
- SibSp : 형제, 배우자 인원 수
- Parch : 부모, 자식 인원 수
- Ticket : Ticket Number
- Fare : 금액
- Cabin : 방 번호
- Embarked : 선착장 => port가 3군데 : C = Cherbourg, Q = Queenstown, S = Southampton
# 데이터 구조
train.shape, test.shape

train.columns, test.columns # shape 찍기

train.info()

train[train['Survived']==1] # DataFrame이 나옴

train[train['Survived']==1]['Sex']

train[train['Survived']==1]['Sex'].value_counts()
train[train['Survived']==0]['Sex'].value_counts()

살고 죽는 것에 성별이 중요한 포인트라는 것을 알 수 있다.

train[train['Survived']==1]['Pclass'].value_counts()
-------------------------------------------
train[train['Survived']==0]['Pclass'].value_counts()

등급칸에 따라서도 영향을 받는다는 사실을 알 수 있음

def bar_chart(feature):
    survived = train[train['Survived']==1][feature].value_counts()
    dead = train[train['Survived']==0][feature].value_counts()
    df = pd.DataFrame([survived, dead])
    df.index = ['Survived', 'Dead']
    df.plot(
          kind = 'bar'
        , stacked = False
        , figsize=(6,5)
    )
bar_chart('Sex')
------------
bar_chart('Pclass')
------------

def bar_chart(feature):
    survived = train[train['Survived']==1][feature].value_counts()
    dead = train[train['Survived']==0][feature].value_counts()
    df = pd.DataFrame([survived, dead])
    df.index = ['Survived', 'Dead']
    df.plot(
          kind = 'bar'
        , stacked = True # 데이터가 쌓임
        , figsize=(6,5)
    )

쌓인 데이터로 한번에 보기!

bar_chart('Sex')
-------------
bar_chart('Pclass')
-------------
bar_chart('SibSp') # 형제나 배우자가 없는 사람이 더 많이 죽었다는 사실을 알 수 있다.
-------------
bar_chart('Parch') # 부모, 자식이 없는 경우 죽는 확률이 2배 된다는 것을 알 수 있다. 
-------------
bar_chart('Embarked') # 선착장도 죽음에 영향이 있다는 사실을 알 수 있다.

# Name 처리
# 추출
train_test_data = [train, test]
for dataset in train_test_data:
    dataset['Title'] = dataset['Name'].str.extract(' ([A-Za-z]+)\.', expand=False)
train['Title'].head()
train['Title'].value_counts()

 

train['Title'].value_counts().index
# Mapping => Mr:0, Miss:1, Mrs:2, Other: 3
title_mapping = {
      'Mr':0, 'Miss':1, 'Mrs':2, 'Master':3
    , 'Dr':3, 'Rev':3, 'Mlle':3, 'Major':3, 'Col':3
    , 'Countess':3, 'Capt':3, 'Ms':3, 'Sir':3, 'Lady':3, 'Mme':3, 'Don':3
    , 'Jonkheer':3
}
for dataset in train_test_data:
    dataset['Title'] = dataset['Title'].map(title_mapping)
train['Title'].head()
# drop
train.drop('Name', axis=1, inplace=True)
test.drop('Name', axis=1, inplace=True)
# Sex = > 0,1
train['Sex'].value_counts()
sex_mapping = {
      'male' : 0
    , 'female' : 1
}
for dataset in train_test_data:
    dataset['Sex'] = dataset['Sex'].map(sex_mapping)
# 나이 처리
# NaN 처리
# 비연속 데이터 변경
train['Age'].isnull().sum()
# Title 기준으로 나이를 중앙값으로 대체
train['Age'].fillna(
      train.groupby('Title')['Age'].transform('median')
    , inplace=True
)
test['Age'].fillna(
      test.groupby('Title')['Age'].transform('median')
    , inplace=True
)
facet = sns.FacetGrid(data=train, hue='Survived', aspect=4)
facet.map(sns.kdeplot, 'Age', shade=True)
facet.set(xlim=(0, train['Age'].max()))
facet.add_legend()
plt.show()

# 나이 비연속 데이터 변환
for dataset in train_test_data:
    dataset.loc[dataset['Age'] <= 16, 'Age'] = 0
    dataset.loc[(dataset['Age'] > 16)&(dataset['Age']<=26),'Age']= 1
    dataset.loc[(dataset['Age'] > 26)&(dataset['Age']<=36),'Age']= 2
    dataset.loc[(dataset['Age'] > 36)&(dataset['Age']<=62),'Age']= 3
    dataset.loc[dataset['Age'] > 62, 'Age'] = 4
train['Age'].value_counts()
train.Embarked.isnull().sum()
# 결측치 개수 : 2, 0.22%
train.Embarked.isnull().sum() / len(train.index) * 100
train.Embarked.value_counts()
# 선착장별 개수, %
train.Embarked.value_counts() / len(train.index) * 100 # %가 보인다
# 선착장 처리
for dataset in train_test_data:
    dataset['Embarked'] = dataset['Embarked'].fillna('S')
# 숫자 변경
embarked_mapping = {
      'S' : 0
    , 'C' : 1
    , 'Q' : 2 #mapping할 dictionary 만들기
}
for dataset in train_test_data:
    dataset['Embarked'] = dataset['Embarked'].map(embarked_mapping)
# 티켓 가격
# NaN 확인
train.Fare.isnull().sum()
# import pandas as pd
# ages = [0, 10, 15, 13, 21, 23, 37, 31, 43, 80, 61, 20, 41, 32, 100]
# bins = [0, 15, 25, 35, 60, 100]
# labels = ['어린이', '청년', '장년', '중년', '노년']
# cuts = pd.cut(ages, bins, right=False, labels=labels)
# cuts

------------------------------------------------

# import pandas as pd
# ages = [0, 10, 15, 13, 21, 23, 37, 31, 43, 80, 61, 20, 41, 32, 100]
# bins = [0, 16, 26, 36, 62, 80]
# labels = [0, 1, 2, 3, 4]
# cuts = pd.cut(ages, bins, right=False, labels=labels)
# cuts

------------------------------------------------

#pd.cut()으로 자르는 방법

# import pandas as pd

# bins = [0, 17, 30, 100, 500]
# labels = [0, 1, 2, 3, 4]
# cuts = pd.cut(train['Fare'], bins, right=False, labels=labels)
# cuts
# import pandas as pd

# bins = [0, 17, 30, 100, 500]
# labels = [0, 1, 2, 3, 4]
# train['Fare'] = pd.cuts(train['Fare'], bins, right=False, labels=labels)
for dataset in train_test_data:
    dataset.loc[dataset['Fare'] <= 17, 'Fare'] = 0
    dataset.loc[(dataset['Fare'] > 17)&(dataset['Fare']<=30),'Fare']= 1
    dataset.loc[(dataset['Fare'] > 30)&(dataset['Fare']<=100),'Fare']= 2
    dataset.loc[dataset['Fare'] > 100, 'Fare'] = 3
train.head()
train.Cabin.value_counts()
# 알파벳 추출
for dataset in train_test_data:
    dataset['Cabin'] = dataset['Cabin'].str[:1] # 앞의 첫자만 가져와라
train.Cabin.value_counts() 
-------------------------
train.groupby('Pclass')['Cabin'].count()
-------------------------
train.groupby('Pclass')['Cabin'].value_counts()
-------------------------
train.Pclass.value_counts()
# Cabin => number 변환
cabin_mapping = {'A':0,'B':0.4,'C':0.8,'D':1.2,'E':1.6,'F':2.0,'G':2.4,'T':2.8}
for dataset in train_test_data:
    dataset['Cabin'] = dataset['Cabin'].map(cabin_mapping)
# fillna
train['Cabin'].fillna(
      train.groupby('Pclass')['Cabin'].transform('median') 
    # categorical 하게 처리해야하므로 평균값이 아닌 중앙값이 들어가야함
    , inplace=True
)
test['Cabin'].fillna(
      test.groupby('Pclass')['Cabin'].transform('median') 
    , inplace=True
)
train.Cabin.isnull().sum()
# 가족
train['FamilySize'] = train['SibSp'] + train['Parch'] + 1
test['FamilySize'] = test['SibSp'] + test['Parch'] + 1
train.FamilySize.value_counts()
family_mapping = {1:0, 2:0.4, 3:0.8, 4:1.2, 5:1.6
                , 6:2, 7:2.4, 8:2.8, 9:3.2, 10:3.6, 11:4.0}
for dataset in train_test_data:
    dataset['FamilySize'] = dataset['FamilySize'].map(family_mapping)
test.FamilySize.value_counts()
features_drop = ['Ticket', 'SibSp', 'Parch']
train = train.drop(features_drop, axis =1)
test = test.drop(features_drop, axis =1)

# 고객 번호 삭제
train = train.drop(['PassengerId'], axis=1)
train.head()
train_X = train.drop('Survived', axis=1) # X : 행렬, x : 벡터 or 스칼라 or... etc
train_y = train['Survived'] # y : 1차원 데이터

train_X.shape, train_y.shape
test.shape
test.columns
728x90
반응형
Comments