標籤:

泰坦尼克號數據分析報告

1、探索問題

本文主要探尋泰坦尼克號乘客的生還率和各因素(船艙等級、年齡、性別、票價、上船港口等)的關係。

#!usr/bin/env python #-*- coding:utf-8 -*- import numpy as np import pandas as pd from pandas import Series,DataFrame import matplotlib.pyplot as plt import matplotlib as mpl import math %matplotlib inline

2、調查數據

#利用Pandas自帶的read_csv()函數載入數據 titanic_data = pd.read_csv(titanic_data.csv) titanic_data.head()#查看各列數據情況titanic_data.info()

<class pandas.core.frame.DataFrame>

RangeIndex: 891 entries, 0 to 890

Data columns (total 12 columns):

PassengerId 891 non-null int64

Survived 891 non-null int64

Pclass 891 non-null int64

Name 891 non-null object

Sex 891 non-null object

Age 714 non-null float64

SibSp 891 non-null int64

Parch 891 non-null int64

Ticket 891 non-null object

Fare 891 non-null float64

Cabin 204 non-null object

Embarked 889 non-null object

dtypes: float64(2), int64(5), object(5)

memory usage: 83.6+ KB

可以看出,數據共有891行,12列,其中3列有缺失數據,Age列缺失177行,Cabin列缺失687行,缺失嚴重,Embarked列缺失2行。Name、Ticket、Cabin對探索問題無幫助。

#刪除無用數據 titanic_data=titanic_data.drop([Name,Ticket,Cabin],axis=1)titanic_data.info()

<class pandas.core.frame.DataFrame>

RangeIndex: 891 entries, 0 to 890

Data columns (total 9 columns):

PassengerId 891 non-null int64

Survived 891 non-null int64

Pclass 891 non-null int64

Sex 891 non-null object

Age 714 non-null float64

SibSp 891 non-null int64

Parch 891 non-null int64

Fare 891 non-null float64

Embarked 889 non-null object

dtypes: float64(2), int64(5), object(2)

memory usage: 62.7+ KB

# 檢查是否有重複數據 if ~titanic_data.duplicated().any(): print(titanic_data表格無重複數據) else: print(titanic_data有重複數據)

titanic_data表格無重複數據

處理缺失數據

處理Age列缺失數據,用「均值」進行填充, 並將年齡數據修正為整型

titanic_data[Age].fillna(titanic_data.Age.mean(),inplace=True) def may_int(i): return int(i) titanic_data[Age]=titanic_data[Age].apply(may_int)

處理Embarked列的數據,用Embarked列的眾數填充兩個缺失空格

print(titanic_data[Embarked].value_counts())

S 646

C 168

Q 77

Name: Embarked, dtype: int64

#Emvarked列用眾數填充缺失項 titanic_data[Embarked].fillna(S,inplace=True)titanic_data.info()

<class pandas.core.frame.DataFrame>

RangeIndex: 891 entries, 0 to 890

Data columns (total 9 columns):

PassengerId 891 non-null int64

Survived 891 non-null int64

Pclass 891 non-null int64

Sex 891 non-null object

Age 891 non-null int64

SibSp 891 non-null int64

Parch 891 non-null int64

Fare 891 non-null float64

Embarked 891 non-null object

dtypes: float64(1), int64(6), object(2)

memory usage: 62.7+ KB

3、展示數據

泰坦尼克號乘客生還情況

In [54]:

Survived_count=titanic_data[Survived].value_counts() print(Survived_count) #創建一個作條形圖、餅狀圖的函數 def Bar_pie(Survived_count): #生還遇難人數條形圖 #創建一個figure fig_S=plt.figure(figsize=(10,5)) #創建一個subplot ax_s=fig_S.add_subplot(121) #用plot()函數作條形圖 Survived_count.plot(kind=bar) #標籤 label=Survived_count.index ax_s.set_xticklabels(label,rotation="horizontal") #添加標題 name=Survived_count.name ax_s.set_title(Bar plot of %s%name) #添加x、y軸標籤 ax_s.set_ylabel(number of people) ax_s.set_xlabel(%s%name) #作生還、遇難比例餅狀圖 plt.subplot(122) plt.pie(x=Survived_count,labels=label,autopct=%3.1f %%, shadow=False,labeldistance=1.1,startangle=90,pctdistance=0.6) #添加標題 plt.title(Pie plot of %s%name)Bar_pie(Survived_count)

0 549

1 342

Name: Survived, dtype: int64

891名乘客中遇難乘客有549人,佔61.6%,生還乘客342人,佔38.4%.

各等級船艙乘客人數

Pclass_count=titanic_data[Pclass].value_counts().sort_index() #用Bar_pie()函數作條形圖和餅狀圖 Bar_pie(Pclass_count)

三等船艙乘客最多,佔55.1%;一等船艙次之佔24.2%;二級船艙乘客最少,佔20.7%.

男女乘客分布情況

Sex_count=titanic_data[Sex].value_counts() print(Sex_count) Bar_pie(Sex_count)

male 577

female 314

Name: Sex, dtype: int64

男乘客有577人,佔64.8%;女乘客有314人,佔35.2%.

乘客年齡分布情況

In [84]:

#乘客年齡分布直方圖 #創建figure、subplot,並用hist作條形圖 fig_Age=plt.figure(figsize=(10,5)) ax_Age=fig_Age.add_subplot(1,2,1) titanic_data[Age].hist(bins=10,color=g,alpha=0.3,grid=False) #設置x軸刻度標籤 ax_Age.set_xticks([0,10,20,30,40,50,60,70,80,90,100]) #添加標題,x軸標籤,y軸標籤 ax_Age.set_title(Hist plot of Age) ax_Age.set_xlabel(Age) ax_Age.set_ylabel(number of people) #乘客年齡分布箱線圖 #作箱線圖 plt.subplot(122) titanic_data.boxplot(column=Age,showfliers=False) #添加y軸標籤 plt.ylabel(Age) plt.title(boxplot of Fare)

titanic_data[Age].describe()

count 891.000000

mean 29.544332

std 13.013778

min 0.000000

25% 22.000000

50% 29.000000

75% 35.000000

max 80.000000

Name: Age, dtype: float64

乘客年齡大概成正態分布,平均年齡29歲多,最大的80歲,最小的不到1歲(利用int()取整,不到1歲的為0).

兄弟姐妹、配偶在船上的乘客分布情況條形圖

#創建figure、subplot,用plot()作柱狀圖fig_SibSp=plt.figure(figsize=(10,5)) ax_SibSp=fig_SibSp.add_subplot(1,2,1) SibSp_count=titanic_data[SibSp].value_counts() SibSp_count.plot(kind=bar) #添加標題,x軸標籤,y軸標籤 ax_SibSp.set_title(Bar plot of SibSp) ax_SibSp.set_xlabel(number of SibSp) ax_SibSp.set_ylabel(number of people) #擁有各數量的兄弟姐妹、配偶的乘客比例條形圖 plt.subplot(122) SibSp_count.div(SibSp_count.sum()).plot(kind=bar) #添加標題,x、y軸標籤 plt.title(Ratio of people in SibSp) plt.xlabel(SibSp) plt.ylabel(ratio)

在船上沒有兄弟姐妹配偶的乘客較多,佔68.2%.

父母、孩子在船上的乘客分布條形圖

Parch_count=titanic_data[Parch].value_counts() #創建figure、subplot,用plot()作柱狀圖 fig_Parch=plt.figure(figsize=(10,5)) ax_Parch=fig_Parch.add_subplot(1,2,1) Parch_count.plot(kind=bar) #添加標題,x、y軸標籤 ax_Parch.set_title(Bar plot of Parch) ax_Parch.set_ylabel(number of people) ax_Parch.set_xlabel(number of Parch) #船上有不同數量父母孩子的乘客人數比例條形圖 plt.subplot(122) Parch_count.div(Parch_count.sum()).plot(kind=bar) #添加標題,x、y軸標籤 plt.title(Ratio of people in Parch) plt.xlabel(Parch) plt.ylabel(ratio)

沒帶父母、孩子的乘客叫多,佔76.1%;帶1個的次之,佔13.2%;帶2個的再次之,佔9%;

船票價格分布情況

#創建figure、subplot,用hist做直方圖 fig_Fare=plt.figure(figsize=(10,5)) ax_Fare=fig_Fare.add_subplot(1,2,1) titanic_data[Fare].hist(bins=10,color=g,grid=False) #添加標題,x、y軸標籤 ax_Fare.set_title(Hist plot of Fare) ax_Fare.set_ylabel(number of people) ax_Fare.set_xlabel(Fare) #票價箱線圖 #作箱線圖 plt.subplot(122) titanic_data.boxplot(column=Fare,showfliers=False) #添加標題、y軸標籤 plt.title(boxplot of Fare) plt.ylabel(Fare)

titanic_data[Fare].describe()

count 891.000000

mean 32.204208

std 49.693429

min 0.000000

25% 7.910400

50% 14.454200

75% 31.000000

max 512.329200

Name: Fare, dtype: float64

最高票價512.3292,最低票價0,平均票價32.2。

各港口上船乘客人數分布條形圖

Embarked_count=titanic_data[Embarked].value_counts()#用Bar_pie函數作條形圖、餅狀圖Bar_pie(Embarked_count)

乘客上船的港口共有三個S、C、Q,其中在S港口上船的乘客較多,佔72.5%;C港口次之,佔18.9%;Q港口再次之,佔8.6%。

3、各因素對乘客生還情況的影響

各等級船艙中乘客的生還情況

#作各級船艙乘客生還情況條形圖 Pclass_data_count=titanic_data.groupby([Pclass,Survived])[Survived].count().unstack() print(Pclass_data_count) Pclass_data_count.plot(kind=bar,stacked=True) #添加標題,y軸標籤 plt.title(Survived & Pclass) plt.ylabel(Number of people)

Survived 0 1

Pclass

1 80 136

2 97 87

3 372 119

titanic_data.groupby(Pclass)[Survived].mean()

Pclass

1 0.629630

2 0.472826

3 0.242363

Name: Survived, dtype: float64

一等船艙216人,136人生還,生還率63%;

二等船艙184人,87人生還,生還率47.3%;

三等船艙491人,119人生還,生還率24.2%

性別對生還率的影響情況

#利用groupby()整理數據 Sex_Survived_data=titanic_data.groupby([Sex,Survived])[Survived].count().unstack() print(Sex_Survived_data) #作條形圖 Sex_Survived_data.plot(kind=bar,stacked=True) #添加標題、y軸標籤 plt.title(Sex & Survived) plt.ylabel(Number of people)

Survived 0 1

Sex

female 81 233

male 468 109

titanic_data.groupby(Sex)[Survived].mean()

Sex

female 0.742038

male 0.188908

Name: Survived, dtype: float64

船上有女乘客314人,233人生還,生還率74.2%;

船上有男乘客577人,109人生還,生還率18.9%.

兄弟姐妹配偶數量對乘客生還情況的影響

#將數據分為有、無兄弟姐妹配偶 SibSp_Survived_data=titanic_data.groupby([SibSp,Survived])[Survived].count().unstack() SibSp_Survived_data_count=SibSp_Survived_data.loc[:1,] SibSp_Survived_data_count.loc[1]=SibSp_Survived_data.loc[1:].sum() print(SibSp_Survived_data_count) #函數作一個堆疊條形圖,兩個餅狀圖 def Bar_2pie(SibSp_Survived_data_count): #標籤 label=SibSp_Survived_data_count.columns name1=SibSp_Survived_data_count.index.name #作條形圖 SibSp_Survived_data_count.plot(kind=bar,stacked=True) #添加標題,y軸標籤 plt.title(%s & Survived%name1) plt.ylabel(Number of people) #無兄弟姐妹配偶的乘客的生存比例餅狀圖 plt.figure(figsize=(10,5)) plt.subplot(121) plt.pie(x=SibSp_Survived_data_count.loc[0],labels=label,autopct=%3.1f %%, shadow=False,labeldistance=1.1,startangle=90,pctdistance=.7) plt.title(%s=0%name1) #有兄弟姐妹配偶的乘客的生存比例餅狀圖 plt.subplot(122) plt.pie(x=SibSp_Survived_data_count.loc[1],labels=label,autopct=%3.1f %%, shadow=False,labeldistance=1.1,startangle=90,pctdistance=.7) plt.title(%s>0%name1)#用Bar_2pie()函數作一個堆疊條形圖,兩個餅狀圖Bar_2pie(SibSp_Survived_data_count)

Survived 0 1

SibSp

0 398.0 210.0

1 151.0 132.0

無兄弟姐妹配偶的乘客共有608人,210人生還,生還率34.5%;

有兄弟姐妹配偶的乘客共有283人,132人生還,生還率46.6%.

有、無父母孩子的乘客的生存情況

#用groupby()函數整理數據 Parch_Survived_data=titanic_data.groupby([Parch,Survived])[Survived].count().unstack() Parch_Survived_data_count=Parch_Survived_data.loc[:1,] Parch_Survived_data_count.loc[1]=Parch_Survived_data.loc[1:].sum() #用Bar_2pie()函數作一個堆疊條形圖,兩個餅狀圖 Bar_2pie(Parch_Survived_data_count)

Survived 0 1

Parch

0 445.0 233.0

1 104.0 109.0

無父母孩子的乘客共有678人,233人生還,生還率34.4%; 有父母孩子的乘客共有213人,109人生還,生還率51.2%。

各港口乘客生存情況條形圖

#用groupby()函數整理數據 Embarked_Survived_data=titanic_data.groupby([Embarked, Survived])[Survived].count().unstack() print(Embarked_Survived_data) #作堆疊條形圖 Embarked_Survived_data.plot(kind=bar,stacked=True) #添加標題,y軸標籤 plt.title(Embarked & Survived) plt.ylabel(Number of people)

Survived 0 1

Embarked

C 75 93

Q 47 30

S 427 219

titanic_data.groupby(Embarked)[Survived].mean()

Out[49]:

Embarked

C 0.553571

Q 0.389610

S 0.339009

Name: Survived, dtype: float64

C港口上船的乘客有168人,93人生還,生還率55.4%;

Q港口上船的乘客有77人,30人生還,生還率39%;

S港口上船的乘客有646人,219人生還,生還率33.9%.

票價與生存情況

In [60]:

#作箱線圖 titanic_data.boxplot(column=Fare,by=Survived,showfliers=False) #添加y軸標籤 plt.ylabel(Number of people)

生還者的票價平均值較高比遇難者的高,票價與乘客生還率相關。

生存、遇難乘客年齡箱圖

titanic_data.boxplot(column=Age,by=Survived,showfliers=False) #添加y軸標籤 plt.ylabel(Number of people)

生存者、遇難者的平均年齡基本相同,但生存者年齡分布範圍較廣。

4、分析總結

本次主要分析泰坦尼克號上乘客的生還率與各因素(船艙等級、年齡、票價、上船港口)的關係。 樣本數量為891,本次事故生還342人,生還率38.4%.

  1. 泰坦尼克號上有三種船艙類型:一等、二等、三等。一等船艙216人,136人生還,生還率63%;二等船艙184人,87人生還,生還率47.3%;三等船艙491人,119人生還,生還率24.2%.可見船艙等級越高,生還率越大。
  2. 船上有乘客891人,其中女乘客314人,233人生還,生還率74.2%;男乘客577人,109人生還,生還率18.9%.可見女性乘客更易生還。
  3. 船上無兄弟姐妹配偶的乘客共有608人,210人生還,生還率34.5%;有兄弟姐妹配偶的乘客共有283人,132人生還,生還46.6%.可見有兄弟姐妹配偶的乘客更易生還。
  4. 船上無父母孩子的乘客共有678人,233人生還,生還率34.4%;有父母孩子的乘客共有213人,109人生還,生還率51.2%.可見有父母孩子的乘客更易生還。
  5. 由891個樣本數據可知乘客上船港口有三個:C、Q、S。其中C港口上船的乘客有168人,93人生還,生還率55.4%;Q港口上船的乘客有77人,30人生還,生還率39%;S港口上船的乘客有646人,219人生還,生還率33.9%.可見生還率還與上船港口有關。
  6. 票價與生還有一定相關性,生還者的平均票價要比遇難者的高。
  7. 年齡與生還也有一定相關性,生還者的年齡範圍比遇難者年齡範圍更大一些。

分析限制

  1. 此次數據並非泰坦尼克號全部乘客數據,據悉泰坦尼克號上有2224名乘客,此為樣本數據,可能並未真實的反應總體的情況。
  2. 可能還有其他因素影響乘客生存。比如救援遲緩,乘客的身體情況,船上救生設備的多寡等。
  3. 數據是否真實無從判斷。

推薦閱讀:

基於Numpy、Pandas分析包對某藥店銷售數據分析
數據分析實踐計劃——新的征程
從自律中找到快樂,用數據分析實現自由
Python進行電影數據分析及可視化
阿里數據招人啦

TAG:數據分析 |