본문 바로가기
coding/kaggle

titanic - 데이터 분석

by 눈부신음표 2022. 2. 27.
728x90

첫 캐글 입문 전 kaggle 강의 듣는중 - titanic
titanic 설명이 잘 돼있는 notebook을 추천해주셨다.

https://www.kaggle.com/kalelpark/kaggle-titanic-for-korean

 

Kaggle_Titanic_for_Korean(상세 작성)

Explore and run machine learning code with Kaggle Notebooks | Using data from Titanic - Machine Learning from Disaster

www.kaggle.com

강의를 듣고 다시 복습하기 위해 추천받은 위 Notebook을 따라가며 내 나름대로 정리해봤다.


1. colab kaggle 연결

데이터를 따로 다운로드해서 옮기지 않고 colab에서 사용하기 위해 kaggle과 연결을 해야 했다.

 

kaggle과 colab 연동
1. kaggle account에서 api token 받기 -> kaggle.json파일 다운로드
2. install kaggle & upload file -> pip install kaggle, files.upload() 사용
3. kaggle.json 파일을 .kaggle 폴더로 이동시키기 -> mkdir, cp 사용

 

!pip install kaggle
from google.colab import files
files.upload()

 

이것을 실행하면 파일을 업로드하는 버튼이 나온다. 거기에 다운받은 kaggle.json파일을 업로드한다.

 

!mkdir -p ~/.kaggle
!cp kaggle.json ~/.kaggle

 

이렇게만 하면 나중에 Warning: Your Kaggle API key is readable by other users on this system! To fix this, you can run 'chmod 600 /root/.kaggle/kaggle.json'
이런 warning이 뜬다. 따라서 아래 코드를 추가로 실행시켜준다.

 

!chmod 600 ~/.kaggle/kaggle.json

 

이제 titanic 데이터를 가져온다.

 

!kaggle competitions download -c titanic

import

# 데이터 분석 및 다루기
import pandas as pd
import numpy as np

# 데이터 시각화
import seaborn as sns
import matplotlib.pyplot as plt
# 쥬피터나 코랩에서 기본적으로 plotting을 matplotlib을 사용하겠다는 의미
# %는 colab 전체에서 적용, !는 cell 레벨에서 적용
%matplotlib inline

2. Data 분석

train_df = pd.read_csv('/content/train.csv')
test_df = pd.read_csv('/content/test.csv')

 

어떤 column들이 있는지 확인

 

train_df.columns.values

 

PassengerId  
survived : survival, 0=No, 1=Yes  
Pclass    : Ticket class, 1=1st, 2=2nd, 3=3rd  
Name  
Sex  
Age  
SibSp  : titanic에 같이 탄 # of siblings/ spouses  
Parch  : titanic에 같이 탄 # of parents/childeren  
Ticket  : ticket number  
Fare    : passenger fare  
Cabin  : cabin number  
Embarked : 탑승지

 

train_df.head()

 

범주형 데이터 : 명목형(nominal)-순서가 없으며 분류를 목적으로 하는 데이터, 순서형(ordinal)-순서에 의미가 있음  
- Nominal: Survived, Sex, Embarked  
- Ordinal: Pclass  

수치형 데이터 : 이산형(discrete)-이산적인 값을 갖는 데이터, 연속형(continuous)-연속적인 값을 갖는 데이터  
- Continous: Age, Fare  
- Discrete: SibSp, Parch

 

PassengerId는 큰 의미를 갖지 않고, Name과 Ticket의 경우도 여기에선 큰 의미가 없다.

 

Null값 및 누락된 데이터는 수정되어야 하는데 이를 확인하기 위해서 .info()를 실행시켜본다.

 

train_df.info()
print('_'*40)
test_df.info()

 

train 데이터에는 Cabin, Embarked, Age 순으로 Null값이 존재하고  
test 데이터에는 Cabin, Age, Fare 순으로 Null 값이 존재한다.

 

train 데이터의 수치형 데이터의 분포를 파악하기 위해서 .describe()를 실행한다.

 

train_df.describe()

 

우선 기본적으로 총 891개의 데이터에서 생존 데이터의 범주는 0과 1로 이루어져 있고, mean을 보았을 때, 생존율은 38% 임을 알 수 있다.

 

범주형 데이터의 분포를 파악하기 위해서 .describe(include=['0(대문자 o임)'])을 실행한다.

 

train_df.describe(include = ['O'])

 

Name 데이터는 unique하고  
성별은 female과 male 두 가지로 577명이 male임을 알 수 있다.  
또한 ticket과 cabin은 공유하는 승객들이 있었으며,  
Embarked 데이터는 3가지가 존재하고 644명이 S 데이터를 갖는다.

 

Analyze by pivoting features

Pclass와의 상관관계  
Pclass를 기준으로, Pclass를 index화 하지 않고 group  
Survived의 평균을 descending으로 정렬하여 표시

 

train_df[['Pclass', 'Survived']].groupby(['Pclass'], as_index = False).mean().sort_values(by = 'Survived', ascending = False)

 

Sex와의 상관관계  
Sex를 기준으로, Sex를 index화 하지 않고 group  
Survived의 평균을 descending으로 정렬하여 표시

 

train_df[['Sex', 'Survived']].groupby(['Sex'], as_index = False).mean().sort_values(by = 'Survived', ascending = False)

 

SibSp와의 상관관계  
SibSp를 기준으로, SibSp를 index화하지 않고 group  
Survived의 평균을 descending으로 정렬하여 표시

 

train_df[['SibSp', 'Survived']].groupby(['SibSp'], as_index = False).mean().sort_values(by = 'Survived', ascending = False)

 

Parch와의 상관관계  
Parch를 기준으로, Parch를 index화하지 않고 group  
Survived의 평균을 descending으로 정렬하여 표시

 

train_df[['Parch', 'Survived']].groupby(['Parch'], as_index = False).mean().sort_values(by = 'Survived', ascending = False)

 

Age와의 상관관계  (노트북에 나이 구간별 생존율에 관한 얘기가 있어서 개인적으로 해봤다)

구간을 나눠서 새로운 column인 Age_class를 생성  
Age_class를 기준으로, Age_class를 index화하지 않고 group  
Survived의 평균을 구하여 정렬하지 않고 표시

 

train_df['Age_class'] = pd.cut(train_df['Age'], bins=[0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70, 75, 80])
train_df[['Age_class', 'Survived']].groupby(['Age_class'], as_index = False).mean()


3. 데이터 시각화를 통한 분석

수치형 데이터와 타겟 데이터와의 상관관계

연령대별 생존자 수  
위에서 구한 Age와의 상관관계 표에서 5세 이하는 높은 생존율을 나타내는 것을 알 수 있다.  
또한 15세에서 25세 사이는 35퍼의 생존율을 가진다.

 

모델에서 나이를 고려하자  
Null을 처리해야 하며  
연령대별로 묶어야 한다.

 

g = sns.FacetGrid(train_df, col = 'Survived')
g.map(plt.hist, 'Age', bins = 20)

 

수치형 데이터와 순서형 데이터 간의 상관관계

개인적으로 Pclass별 승객 수를 알고 싶어서 .values_count()를 해봤다.

 

train_df['Pclass'].value_counts()

 

개인적으로 각 나이 구간별 Pclass와 생존율을 알고 싶어서 해봤다.

 

train_df[['Pclass', 'Survived', 'Age_class']].groupby(['Age_class'], as_index = False).mean().sort_values(by = 'Survived', ascending = False)

 

Pclass = 1인 승객들은 대부분 생존하였다.  
대부분 Pclass = 3  
Pclass = 2 또는 Pclass = 3인 5세 이하의 아이들은 대부분 생존했다.  

 

모델에서 Pclass를 고려할 수 있다

 

grid = sns.FacetGrid(train_df, col = 'Pclass', hue = 'Survived')
grid.map(plt.hist, 'Age', alpha = .5, bins = 20)
# alpha 는 투명도(transparency)를 의미합니다.
grid.add_legend()

grid = sns.FacetGrid(train_df, col = 'Survived', row = 'Pclass', size = 2.2, aspect = 1.6)
grid.map(plt.hist, 'Age', alpha = .5, bins = 20)

 

범주형 데이터 상관관계

개인적으로 궁금해서 추가로 해본 두 가지 표

 

train_df[['Survived', 'Embarked', 'Sex']].groupby(['Embarked', 'Sex'], as_index = False).mean().sort_values(by = 'Survived', ascending = False)

train_df[['Survived', 'Pclass', 'Sex']].groupby(['Pclass', 'Sex'], as_index = False).mean().sort_values(by = 'Survived', ascending = False)

 

여성 승객이 남성보다 높은 생존율을 가진다.  
Pclass = 1과 2의 여성은 대부분이 생존하였다

 

모델에서 성별과 Pclass를 고려할 수 있다.

 

이 부분은 잘 이해가 안 돼서 다시 쓸 예정

더보기
grid = sns.FacetGrid(train_df, col = 'Embarked')
grid.map(sns.pointplot, 'Pclass', 'Survived', 'Sex', palette = 'deep')
grid.add_legend()

 

범주형 데이터와 수치형 데이터 상관관계

개인적으로 궁금해서 추가로 해본 세 가지 표

 

train_df[['Survived', 'Fare']].groupby(['Survived'], as_index = False).mean().sort_values(by = 'Fare', ascending = False)

train_df[['Survived', 'Fare', 'Pclass']].groupby(['Survived', 'Pclass'], as_index = False).mean().sort_values(by = 'Fare', ascending = False)

train_df[['Survived', 'Embarked', 'Fare']].groupby(['Survived', 'Embarked'], as_index = False).mean().sort_values(by = 'Fare', ascending = False)

 

높은 요금을 지불한 사람들의 생존률이 더 높다.  
높은 요금을 지불한 사람들은 결국 Pclass = 1인 사람들이다.  
승선항과 생존률간에 관계가 있다

 

요금을 범위별로 묶자

 

grid = sns.FacetGrid(train_df, row = 'Embarked', col = 'Survived', size = 2.2, aspect=1.6)
grid.map(sns.barplot, 'Sex', 'Fare', alpha = .5, ci = None)
# alpha 는 투명도(transparency)를 의미합니다.
grid.add_legend()

grid = sns.FacetGrid(train_df, col = 'Embarked', hue = 'Survived')
grid.map(sns.barplot, 'Sex', 'Fare', alpha = .5, ci = None)
grid.add_legend()


https://bit.ly/3D9XCOz

 

LIVE로 배우는 실무 PT ㅣ 코멘토

8명 소수정예 라이브로 배우는, 진짜 실무 퍼스널 트레이닝!

comento.kr

 

728x90

댓글