본문 바로가기
🖊️Data Analysis/📌 ML)타이타닉 생존자 데이터 분석

[Python] 타이타닉 생존자 데이터 분석

by 빛나고요 2021. 7. 12.
BIG

Study. 타이타닉 생존자 데이터 분석

[스스로 정리한 데이터 분석 흐름]

본 게시물은 이미 짜여진 코드를 필사하면서 코드의 흐름을 익히기 위해 학습한 내용이 담겨있음을 미리 알려드린다. 

 

1. 필요한 라이브러리 import
import numpy as np   #행렬이나 대규모 다차원 배열을 쉽게 처리할 수 있도록 지원하는 라이브러리
import pandas as pd 
import matplotlib.pyplot as plt  #pyplot 모듈의 함수를 이용하여 그래프를 그릴 수 있도록 지원하는 라이브러리
import seaborn as sns

plt.style.use('seaborn')
sns.set(font_scale=2.5) # 이 두줄은 본 필자가 항상 쓰는 방법입니다. matplotlib의 기본 sheme 말고 seaborn shceme을 세팅하고, 일일이 graph의 font size를 지정할 필요없이 seaborn의 font_scale을 사용하면 편합니다.
import missingno as msno  #결측치(NaN) 데이터들을 파악하는데 직관적인 도움을 주는 패키지

#ignore warnings
import warnings
warnings.filterwarnings('ignore')

%matplotlib inline

 

2. 데이터셋 확인

[1] 분석할 데이터 입력

df_train = pd.read_csv('train.csv') #train.csv 파일을 불러와서 df_train에 넣는다. 훈련용
df_test = pd.read_csv('test.csv') # test.csv 파일을 불러와서 df_test에 넣는다. 테스트용
df_train.head()

  • 파일을 다 불러와서 제대로 들어가 있는지 확인한다. 

 

[2] 컬럼값 보면서 예측할 target 잡기

df_train.describe()

df_test.describe()

  • 위 두 코드를 실행해보면서 컬럼값을 보고 예측할 target을 잡는다.

[3] 그래프로 시각화하여 조금 더 자세하게 살펴보기

1) NaN 값이 있는지 확인한다.

for col in df_train.columns:
    msg = 'column: {:>10}\t Percent of NaN value: {:.2f}%'.format(col, 100 * (df_train[col].isnull().sum() / df_train[col].shape[0]))
    print(msg)

  • 훈련용 데이터에는 Age, Cabin, Embarked에 NaN값이 있는 것을 확인할 수 있다.
for col in df_test.columns:
    msg = 'column: {:>10}\t Percent of NaN value: {:.2f}%'.format(col, 100 * (df_test[col].isnull().sum() / df_test[col].shape[0]))
    print(msg)

  • 테스트용 데이터에는 Age, Fare, Cabin에 NaN값이 있는 것을 확인할 수 있다. 
MANO 라이브러리를 사용하여 NaN 값을 조금 더 보기 쉽게 시각화 해보았다.
msno.matrix(df=df_train.iloc[:, :], figsize=(8, 8), color=(0.8, 0.5, 0.2))  

#iloc : 행번호로 선택, matrix : 행렬

 

3. 탐색적 데이터 분석

 

- matplotlib, seaborn, plotly 등을 이용해서 데이터에 따라 적절하게 시각화하기

[1] 좌석 등급에 따른 분석

  • Pclass() : 서수형 데이터
  • crosstab() : 교차 분석 ⇒ 생존한 사람은 몇 명인지 시각화를 하는데 한눈에 알아보기 쉽도록 crosstab을 이용하여 색상을 칠해줌으로써 수월하게 볼 수 있음
  • 선내 등급(1~3등급)에 따라 생존자가 몇명인지에 대해 그래프로 시각화
  • seaborn - countplot : 범주형 변수의 빈도수를 시각화 ⇒ 조금 더 보기 쉽도록 countplot을 이용하여 특정 label에 따른 개수를 확인.  
  • plt.subplots(행, 열) : 한번에 여러 개의 그래프 그리기
  • countplot : 범주형 변수의 빈도수를 시각화
  • 성별로 생존률 따지기(분류 지도 학습 이용) : pandas groupy & seaborn countplot
  • sort_valus(by=’Survived’) : Survived 한 사람을 기준으로 정렬(참고 https://twinstarinfo.blogspot.com/2018/10/python-pandasdataframesortvalues.html)
  • 결론: 선내 등급에 따라 탑승자 수는 몇 명인데 그중 사망자는 몇 명이고 생존자는 몇 명인지 시각화하여 클래스가 높을수록, 생존 확률이 높으며 선내 등급이 생존 확률에 영향을 미침

[2] 성별에 따른 생존율 분석

  • pandas groupby와 seaborn countplot 사용
  • subplots() : 한번에 여러 개의 그래프 그리기 위한 함수
  • groupby([‘sex’], as_index=True) : 성별을 기준으로 그룹 지어서 분석 
  • sort_value(by=’Survived’, ascending=True) : 생존자를 오름차순으로 분류하여 출력
  • crosstab(~~~.background_gradient(cmap=’summer_r) : DataFrame에 숫자에 따라 색을 다르게  입힘
  • 결론 : 성별도 타이타닉 데이터 분석과 예측에 쓰이는 중요한 feature다. 여성이 남성보다 생존율이 높다. 특히 3등급 남자가 생존율이 제일 낮다.

[3] 좌석 등급과 성별 관계에 따른 분석

  • 좌석 등급과 성별 이 두가지에 관해 생존율이 어떻게 달라지는 확인
  • seaborn의 factorplot을 이용하여 3개의 차원으로 이루어진 그래프 생성
  • sns.factorplot : y 평균값 그래프, hue로 지정된 필드의 종류만큼 라인이 그려진다.  ex) hue=’Sex’ 이면 성별의 종류만큼 라인 생성
  • 확인해봤을 때 등급이 높은 여자가 제일 생존률이 높다. 또한 남녀 상관없이는 등급이 높을수록 생존율이 높다.
  • 위에서 사용한 hue 대신 column 를 사용하면 등급에 따라 남녀의 생존율을 볼 수 있다.  ex) sns.factorplot(~~, col=’Pclass’, ~~)
  • 결론 : 좌석 등급이 높은(1등급) 여자가 제일 생존율이 높으며 남녀 상관없이 좌석 등급이 높을수록 생존율이 높다.

[4] 나이에 따른 분석

  • 먼저 전체 탑승객 중에서 제일 나이가 많은 탑승객과 제일 나이가 어린 탑승객의 나이와 탑승객들의 평균 나이를 구한다. 
  • 나이에 따른 생존률을 histogram으로 그려봄으로써 나이가 어릴수록 생존자가 많다는 것을 알 수 있다.  
  • subplots() :한번에 여러 개의 그래프 그리기
  • sns.kdeplot() : 분포가 보이지 않는 막대그래프의 한계 때문에 seaborn을 이용한 커널 밀도 추정(KDE) 플롯을 사용, 부드럽게 곡선 화함
  • 다음은 좌석 등급에 따른 나이 분포를 시각화했는데 등급이 높을수록 나이가 많은 사람의 비중이 커졌다. 
  • 나이 때의 변화에 따른 생존율은 어떤지 시각화하기 위해 나이 범위를 넓혀가며 생존율의 변화를 알아보았다.
  • 나이가 어릴수록 생존율이 확실하게 높았다. 나이가 중요한 feature로 사용될 수 있음을 확인하였다.
  • 결론 : 나이가 어릴수록 생존율이 높았으며 좌석 등급이 높을수록 나이가 많은 사람의 비중이 컸다.

[5] 좌석 등급, 성별, 나이 이 3가지에 따른 분석

  • 이 3가지를 쉽게 시각화할 수 있는 도구가 seaborn의 violinplot이다. 
  • sns.violinplot : 카테고리컬한 데이터의 분포를 시각적으로 잘 비교할 수 있도록 하는 차트로 그려진 형상이 바이올린을 닮았다.
  • 첫 번째는 좌석 등급을 기준으로 나이에 따른 생존율을 나타내었고 두 번째는 성별을 기준으로 나이에 따른 생존률을 나타내었다.
  • 첫번째 그래프에서는 모든 좌석 등급 부분에서 나이가 어릴수록 생존율이 높은 것을 알 수 있다. 두번째 그래프는 나이가 어린 여자가 생존율이 높은것을 알 수 있다. 
  • 결론 : 여성과 아이를 가장 먼저 챙겼다는 사실을 알 수 있다.

[6] 탑승한 항구에 따른 생존률

  • 여러 항구들 중 비슷하게 탑승한 항구 3곳을 분석하여 시각화하였다. 
  • 탑승한 항구 C, Q, S 중 생존율이 가장 높은 항구는 C이다. 
  • plt.subplots : figure 객체 생성 및 figure.subplots()을 호출하여 리턴
  • subplots_adjust : 현재 배치되어 있는 subplot들의 위치(너비, 높이)를 직접 조정한다.
  • figure을 4가지로 분류하였다.
    • (1) 항구별 탑승객 수 : 항구 3개 중, S에서 가장 많이 탑승하였다.
    • (2) 항구별 성별 비율 : 전반적으로 남자의 비중이 높았으며, 특히 S 항구의 탑승객이 제일 많았고 남자 비율은 여자 비율의 두배 정도였다. 
    • (3) 항구별 생존율 : S 항구의 생존율이 낮다. 
    • (4) 항구별 탑승객의 좌석 등급 :  C 항구에 1등급 탑승객이 많아서 생존율이 높았고 S 항구에 3등급 탑승객이 많아서 생존율이 낮았다. 

[7] 가족 단위별 생존율(형제자매/ 부모 자녀)

  • 형제자매와 부모 자녀의 변수를 SibSp와 Parch로 정하고, 최대 가족수와 최소 가족수를 구한다.
  • 가족 수가 적을수록 생존율이 높고, 많을수록 생존율이 낮아진다.

[8] 탑승요금

  • lambda 함수 : 함수에 이름이 없는 익명 함수, 저장을 안 하기 때문에 재사용이 불가능하다.

[9] Cabin

  • 얻을 수 있는 정보가 없기 때문에 모델에서 제외

[10] Ticket

  • 아이디어가 없기 때문에 패스

 

📎공부 링크 : https://kaggle-kr.tistory.com/17?category=868316#2.4-Age

댓글