泰坦尼克號數據分析報告
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 890Data columns (total 12 columns):PassengerId 891 non-null int64Survived 891 non-null int64
Pclass 891 non-null int64Name 891 non-null objectSex 891 non-null objectAge 714 non-null float64SibSp 891 non-null int64Parch 891 non-null int64Ticket 891 non-null objectFare 891 non-null float64Cabin 204 non-null objectEmbarked 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 890Data columns (total 9 columns):PassengerId 891 non-null int64Survived 891 non-null int64Pclass 891 non-null int64Sex 891 non-null object
Age 714 non-null float64SibSp 891 non-null int64Parch 891 non-null int64Fare 891 non-null float64Embarked 889 non-null objectdtypes: 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 168Q 77Name: Embarked, dtype: int64#Emvarked列用眾數填充缺失項 titanic_data[Embarked].fillna(S,inplace=True)titanic_data.info()
<class pandas.core.frame.DataFrame>
RangeIndex: 891 entries, 0 to 890Data columns (total 9 columns):PassengerId 891 non-null int64Survived 891 non-null int64
Pclass 891 non-null int64Sex 891 non-null objectAge 891 non-null int64SibSp 891 non-null int64Parch 891 non-null int64Fare 891 non-null float64Embarked 891 non-null objectdtypes: float64(1), int64(6), object(2)memory usage: 62.7+ KB3、展示數據
泰坦尼克號乘客生還情況
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 342Name: Survived, dtype: int64891名乘客中遇難乘客有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 314Name: 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.013778min 0.00000025% 22.00000050% 29.00000075% 35.000000max 80.000000Name: 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.204208std 49.693429min 0.00000025% 7.91040050% 14.45420075% 31.000000max 512.329200Name: 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 1362 97 873 372 119titanic_data.groupby(Pclass)[Survived].mean()
Pclass
1 0.6296302 0.4728263 0.242363Name: 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 233male 468 109titanic_data.groupby(Sex)[Survived].mean()
Sex
female 0.742038male 0.188908Name: 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.01 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.01 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 93Q 47 30S 427 219titanic_data.groupby(Embarked)[Survived].mean()
Out[49]:
Embarked
C 0.553571Q 0.389610S 0.339009Name: Survived, dtype: float64C港口上船的乘客有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%.
- 泰坦尼克號上有三種船艙類型:一等、二等、三等。一等船艙216人,136人生還,生還率63%;二等船艙184人,87人生還,生還率47.3%;三等船艙491人,119人生還,生還率24.2%.可見船艙等級越高,生還率越大。
- 船上有乘客891人,其中女乘客314人,233人生還,生還率74.2%;男乘客577人,109人生還,生還率18.9%.可見女性乘客更易生還。
- 船上無兄弟姐妹配偶的乘客共有608人,210人生還,生還率34.5%;有兄弟姐妹配偶的乘客共有283人,132人生還,生還46.6%.可見有兄弟姐妹配偶的乘客更易生還。
- 船上無父母孩子的乘客共有678人,233人生還,生還率34.4%;有父母孩子的乘客共有213人,109人生還,生還率51.2%.可見有父母孩子的乘客更易生還。
- 由891個樣本數據可知乘客上船港口有三個:C、Q、S。其中C港口上船的乘客有168人,93人生還,生還率55.4%;Q港口上船的乘客有77人,30人生還,生還率39%;S港口上船的乘客有646人,219人生還,生還率33.9%.可見生還率還與上船港口有關。
- 票價與生還有一定相關性,生還者的平均票價要比遇難者的高。
- 年齡與生還也有一定相關性,生還者的年齡範圍比遇難者年齡範圍更大一些。
分析限制
- 此次數據並非泰坦尼克號全部乘客數據,據悉泰坦尼克號上有2224名乘客,此為樣本數據,可能並未真實的反應總體的情況。
- 可能還有其他因素影響乘客生存。比如救援遲緩,乘客的身體情況,船上救生設備的多寡等。
- 數據是否真實無從判斷。
推薦閱讀:
※基於Numpy、Pandas分析包對某藥店銷售數據分析
※數據分析實踐計劃——新的征程
※從自律中找到快樂,用數據分析實現自由
※Python進行電影數據分析及可視化
※阿里數據招人啦
TAG:數據分析 |