타이타닉 생존자 데이터 분석 – 성별 분석, 연령대 분석

타이타닉 생존자 데이터 분석 – 타이타닉 데이터 셑 을 가지고 데이터 분석을 합니다. 데이터를 가져와서 데이터프레임에 저장합니다. 생존자에 대한 성별 비율과 연령대별 비율로 계산해서 생존자에 대한 분석을 합니다.

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

진행해 볼까요

타이타닉호
타이타닉호

1. 타이타닉 생존자 데이터 분석 – 데이터 가져오기

1.1 라이브러리 import

  • 타이타닉호의 탑승자 생존 여부 데이터는 seaborn 라이브러리에 있는 데이터를 활용합니다.
  • 타이타닉호에는 승무원 포함 총 2224명이 타고 있었습니다. 그 중 710명이 구조되고, 1514명이 사망했습니다. 여기에 있는 데이터는 승객의 데이터 중에서 데이터 분석의 train용으로 제공되는 891개 입니다.
# 라이브러리 Import

import seaborn as sns

1.2 데이터 셋 읽어서 데이터프레임에 넣기

# 2. 데이터셑 읽어서 데이터프레임에 넣기

titanic = sns.load_dataset('titanic')
titanic.head()

[output]

Nosurvivedpclasssexagesibspparchfareembarkedclasswhoadult_maledeckembark_townalivealone
003male22.0107.2500SThirdmanTrueNaNSouthamptonnoFalse
111female38.01071.2833CFirstwomanFalseCCherbourgyesFalse
213female26.0007.9250SThirdwomanFalseNaNSouthamptonyesTrue
311female35.01053.1000SFirstwomanFalseCSouthamptonyesFalse
403male35.0008.0500SThirdmanTrueNaNSouthamptonnoTrue

[칼럼 설명]

- pclass	       객실 등급(1:1등석, 2:2등석, 3:3등석) 
- survived	       생존 유무(0:사망, 1:생존)
- sex	             성별 (male:남성, female: 여성)
- age	             나이
- sibsp	             형제 혹은 부부의 수
- parch	             부모 혹은 자녀의 수
- fare	             지불한 요금
- boat	             탈출을 했다면 탑승한 보트의 번호

1.3 타이타닉 데이터 셋- 칼럼 파악하기

  • 칼럼 항목을 확인하고, 칼럼 개수를 확인합니다.
# 3. 칼럼 파악 

print(titanic.columns)
print('칼럼 개수: ', len(titanic.columns))
[Output]

Index(['survived', 'pclass', 'sex', 'age', 'sibsp', 'parch', 'fare',
       'embarked', 'class', 'who', 'adult_male', 'deck', 'embark_town',
       'alive', 'alone', 'one', '연령대'],
      dtype='object')
칼럼 개수:  17

  • 칼럼의 타입, Null 여부 등을 확인합니다.
# 데이터 셑 컬럼 정보 확인 

titanic.info()
데이터 셑 컬럼 정보 확인

  • 데이터셑의 개수, 평균, 최소, 최대값 등 기초 통계를 확인합니다.
# 데이터셑 기초 통계를 확인 

titanic.describe()
데이터셑 기초 통계

  • 데이터 셑의 결측 정도를 파악합니다.
# 결측치 확인

titanic.isnull().sum()
결측치 확인

– age, embarked, deck, embark_town 4개 칼럼에 결측치가 있음


2. 타이타닉 생존자 데이터 분석 – 생존자 분석

2.1 성별 분석 – 남자, 여자 중 생존은 어떤 성별이 많은가?

# sex 칼럼의 값 별 레크드 수 확인하기 

titanic['sex'].value_counts()
[Output]

sex
male      577
female    314
Name: count, dtype: int64

==> 성비는 남자가 여자보다 1.84배 많다. (1.84 = 577명 / 314명)

# 사망자, 생존자 인원수 확인 (0: 사망, 0:생존) 

titanic.groupby(['survived']).count()['sex']
[Output]

survived
0    549
1    342
Name: sex, dtype: int64

==> 사망자가 생존자보다 1.6배 많다. (1.60 = 549명 / 342명)

# 생존과 성별 인원수 피봇팅(0: 사망, 0:생존) 

titanic.pivot_table(index='survived', columns='sex', values='class', aggfunc='count')
생존과 성별 인원수 피봇팅
  • 성별과 생존과의 분석
[분석]
- 여자는 생존자가 사망자보다 2.88배 많다 (2.88 = 233명 / 81명)
- 남자는 사망자가 생존자보다 4.29배 많다 (4.29 = 468명 / 109명)
- 사망자 중에 남자는 여자보다 11.4배 많다. (11.4 = 468명 / 81명)
- 생존자는 여자가 남자 보다 2.14배 많다. (2.14 = 233명 / 109명)

[성별과 생존과의 관련성 종합 분석]

  • 여자는 생존자가 많으며, 전체 생존자 중 여자가 남자보다 2.14배 많다. 즉, 타이타닉 호 승객 중 여자가 생존에 유리했다.
  • 전체 승객 891명 중 342명으로 38.4%가 생존했다.
  • 남자는 전체 승객 중 109명으로 12.2%이지만, 여자는 233명으로 26.2%가 생존했다.


2.2 타이타닉 생존자 데이터 분석 – 연령대 분석

  • 연령대를 아래와 같이 구분 하였습니다.
    • 청소년: 20세이하
    • 청년: 21 ~ 40세이하
    • 장년: 41 ~ 60세이하
    • 노년: 61세 이상
    • 제외: 연령(age)에 값이 없는 경우
# 데이터의 age를 활용하여 연령대를 생성 - 연령대 추가 

age_band = []              # 각 로우별로 연령대를 저장할 리스트 생성
for age in titanic['age']:
    
    band = ''
    if   age < 20:  band = '청소년'
    elif age < 40:  band = '청년'
    elif age < 60:  band = '장년'
    elif age < 150: band = '노년'
    else:           band = '제외'
    
    age_band.append(band)
    
print( 'age_band 리스트 개수: ', len(age_band))

# titanic 데이터프레임에 연령대 정보를 추가

titanic['연령대'] = age_band
print( 'titanic 개수: ', len(titanic))
[Output]

age_band 리스트 개수:  891
titanic 개수:  891

‘연령대’ 정보가 titanic 데이터프레임에 적용되었습니다.

# 데이터프레임 확인하기 - 연령대 확 

titanic.head()
데이터프레임 확인

–> 연령대 칼럼이 추가되었네요

# 연령대별 생존자 수 피봇 만들기

titanic.pivot_table(index='연령대', columns='survived', values='class', aggfunc='count')
연령대별 생존자 수 피봇

–> 각 연령대별 사망자와 생존자 수는 확인이 되었습니다. 하지만 어떤 연령층의 생존율이 가장 높은지를 알려면 각 연령층 옆에 생존율을 같이 있어야 합니다.

생존율을 계산해 보겠습니다.

# 연령대별 생존자 수 정보를 'age_band_pivot' 데이터프레임에 저장합니다.

age_band_pivot = titanic.pivot_table(index='연령대', columns='survived', values='class', aggfunc='count')


# 기초통계량을 확인합니다.(0: 사망, 1:생존)

age_band_pivot.describe()
데이터프레임에 저장

# 'age_band_pivot'에서 생존울을 계산합니다.

age_band_pivot['life_rate'] = \
round(age_band_pivot[1] / (age_band_pivot[0] + age_band_pivot[1]) * 100, 1) 

age_band_pivot
생존울을 계산

[분석]

  • 청소년의 생존율이 48.2%로 가장 높고 노년층이 26.9%로 가장 낮다.
  • 생존율은 “청소년 -> 청년 -> 장년 -> 노년” 순서이다.
  • 나이드신 분 부터 그들의 삶을 더 나이 어린 분에게 양보해 준 것을 알 수 있다.

3. 타이타닉 생존자 데이터 분석 – 해석하기

  • 총 데이터는 891건이었다.(탑승객이 891명 이죠)
  • 생존자는 342명, 사망자는 549명으로 사망자가 많았다.
  • 생존자 중에는 여자가 많았고, 사망자 중에는 남자가 많았다.
  • 연령대를 보면 노년층 보다는 청년, 청소년층의 생존율이 높았다.
  • 생존의 가능성은 여자이고 나이가 젊을 수록 높은 것을 알 수 있었다.

4. 마무리

타이타닉 데이터셑을 가지고 데이터 분석 학습을 많이 합니다. 생존자와 사망자의 정보가 있고 각 승객마다 속성이 담겨있기 때문입니다.

여기서는 성별과 연령층을 가지고 생존의 가능성을 분석했습니다. 하지만 더 많은 속성을 활용하여 보다 정교한 분석을 할 수 있겠죠,

선실등급, 운임료, 탑승지, 가족동행여부, 단독승객인지 여부 등 다양한 속성으로 생존여부를 분석해 보는 작업은 데이터 분석에 도움을 줍니다.

단일 속성을 기준으로 하는 분석 외 복합 속성(성별+연령대+가족동행여부)으로도 도전해 볼만하다. 코드는 길어지겠지만 결과를 얻는 재미가 있습니다.

강의하던 시절
강의하던 시절 (이미지: 픽사베이)

에피소드 하나를 담아보겠습니다. 오프라인 강의를 하던 때입니다.

학생들에게 타이타닉 데이터로 팀 별 분석 과제를 주었습니다. 팀은 8개 였습니다. 4시간 동안 과제를 하는 팀시간을 주었고 이어서 팀당 5분 발표를 시켰습니다. 하지만 발표 시간은 5분을 넘어 20분까지 넘어가곤 했죠. 팀별 분석한 내용은 생각지 못한 모습까지 보여주었습니다. 다른팀은 발표하는 팀에게 질문도 많이 했습니다. 본인 팀이 한 것과 결과가 차이가 나서 확인하려는 것이었죠. 승객의 동행자 유무 여부를 넘어, 동행자의 나이까지 별도 분석을 했던 팀도 있었습니다. 그 팀은 다른 팀이 보지 못하던 부분까지 보았던 것이었죠.

데이터 분석은 분석을 진행하는 일반적인 방법은 있지만, 방법을 넘어 분석 내용은 상상력에 좌우됩니다. 데이터에서 현상을 파악하는 다양한 시점이 존재하기 때문입니다. 가끔 자신도 놀라는 통찰력이 발휘되기도 하죠.

아래 링크는 데이터 분석 관련 문제 및 경쟁을 다루는 사이트 캐글(Kaggle) 입니다. 들어가 보시면 다양한 문제가 경쟁이 이루어지는 것을 보실 수 있습니다.

탐정 소설을 보다 보면 그런 것을 많이 느낍니다. 탐정”셜록 홈즈(코난 도일의 소설)”나 “에르퀼 포와르(아가사 크리스티의 소설)” 등 탐정의 사건 해결 방식도 이런 데이터분석의 면모를 가지고 있는 것을 느끼곤 합니다.

주어진 내용에서 숨어 있는 진실을 찾아가는 상상력. 그 상상력이 데이터를 바라보는 시각의 확대를 가져다 줍니다. 틈틈이 이런 데이터를 가지고 나름 데이터 분석 작업을 권합니다. 세상에는 많은 데이터가 있으니 구글링으로 찾아보면 좋을 것입니다. 화이팅.

댓글 남기기