一、導(dǎo)入數(shù)據(jù)集
import pandas as pd
import numpy as np?
import matplotlib.pyplot as plt?
from pandas import Data Frame
from pandas import Series
%matplotlib inline
df = pd.read_csv('titanic_data.csv', index_col=0)
df.head(5)

以下為Data Dictionary
PassengerId:乘客的ID
Survived:乘客是否獲救,Key:0=沒獲救,1=已獲救
Pclass:乘客船艙等級(1/2/3三個等級艙位)
Name:乘客姓名
Sex:性別
Age:年齡
SibSp:乘客在船上的兄弟姐妹/配偶數(shù)量
Parch:乘客在船上的父母/孩子數(shù)量
Ticket:船票號
Fare:船票價
Cabin:客艙號碼
Embarked:登船的港口
變量類型說明
數(shù)值變量:Age、SibSp、Parch、Fare
分類變量:Pcalss, Sex, Cabin, 和Embarked
二、提出問題和猜想
影響乘客生還率的因素可能有哪些
猜測因素包括:
年齡
性別
客艙等級
票價
家人數(shù) (因從電影了解到,婦女兒童獲救概率高,且一等艙因為靠近最高層獲救可能性更高。)
三、數(shù)據(jù)預(yù)處理
數(shù)據(jù)預(yù)處理包括:
1、查看缺失值,并對缺失值刪除或填充
2、刪除不需要的數(shù)據(jù)
3、對數(shù)據(jù)進行分組或合并
查看CSV中各列的缺失值
df

從以上所列數(shù)據(jù)可知:總共891個乘客,其中有缺失值部分的是:Age中只有714個,Cabin中只有204,而Embarked是889
填充Age中的缺失值
df['Age'].fillna(df['Age'].median(), inplace=True)
乘客名字、船票、客艙號碼和登船的港口,與生存率關(guān)系不大,可直接刪除。
df.drop(['Cabin', 'Embarked', 'Name', 'Ticket'], axis=1, inplace=True)
df.head(5)

根據(jù)分析目的,猜測家人數(shù)與被獲救可能有關(guān),因此將SibSP與Parch兩組合并成一組親屬
df['rel'] = df['SibSp'] + df['Parch']
df.head(6)

df.describe()

從以上數(shù)據(jù)結(jié)果可看出,平均的生還率是0.38,乘客平均年齡是29.69歲,最小的乘客4個月,最大的乘客年齡80歲。年齡的中位數(shù)是28歲。
四、數(shù)據(jù)分析
通過描述性分析和數(shù)據(jù)可視化分析結(jié)果,探索乘客生還的因素
單變量探索,查看船上乘客和票價的整體分布情況
%matplotlib inline?
import matplotlib.pyplot as plt
fig,ax = plt.subplots(nrows=1,ncols=2,figsize=(15,5))
df["Age"].hist(ax=ax[0])
ax[0].set_title("Hist plot of Age")
df["Fare"].hist(ax=ax[1])
ax[1].set_title("Hist plot of Fare")

乘客的年齡集中在20-40歲之間,大部分乘客的票價很低,基本在0-100之間。
單變量探索,查看船上性別的整體分布情況
Sex_count = df.Sex.value_counts()
print Sex_count

Sex_count.plot(kind='pie',autopct = '%3.1f%%');

船上絕大多數(shù)為女性,不到兩倍。
探索性別、船艙等級和生還率的關(guān)系

variable_visulization('Pclass')

乘客中,三等艙的乘客最多,一等艙和二登艙乘客相差不多。大部分乘客未獲救,同時,船艙等級越高,生還率越大。一等艙的獲救比例是最高的,三等艙人數(shù)最多,但生還率最低。
variable_visulization('Sex')

以上圖結(jié)果可知,大部分人是沒有被獲救的,且獲救的乘客中,女性遠遠大于男性,大概有三倍之多。
接下來探索,不同船艙等級、性別與生還率的關(guān)系

從圖中可以看出,不管是在什么等級的船艙,女性的生還率都是高于男性的。但無論男女,船艙等級越高,生還率越高。
探索生還的乘客年齡
創(chuàng)建新的一列,儲存乘客的年齡范圍
bins = np.arange(0, 80, 10)
df['Age_group'] = pd.cut(df['Age'], bins)
將"Age_group"分組,并計算各年齡段的生還率
survival_count_by_age_bracket = df.groupby(['Age_group'])['Survived'].count()
survival_rate_by_age_bracket = df.groupby(['Age_group'])['Survived'].mean()
print survival_rate_by_age_bracket
print survival_count_by_age_bracket

figure = plt.figure(figsize=(13,8))
plt.hist([df[df['Survived']==0]['Age']], stacked=True, color = ['g'],? ? ? ? bins =30,label = ['Survived'])
plt.xlabel('Age')
plt.ylabel('Number of passengers')
plt.legend()
plt.title("Age of plot")

從數(shù)據(jù)中可知,0-10歲的生還率是最高的,而圖中可知,大部分的被獲救的乘客介于0-30歲之間。
從圖中可知,票價低的乘客罹難可能性更高。
探索攜帶了親屬的乘客,與生還率的關(guān)系
rel_count = df.rel.value_counts()
print rel_count

survival_rate_by_sibsp_parch = df.groupby('rel')['Survived'].mean()
print survival_rate_by_sibsp_parch

survival_rate_by_sibsp_parch.plot(kind='bar')
plt.title('Survival by rel', fontsize=16)?
plt.xlabel('rel')
plt.ylabel('Survial Rate')
plt.ylim(0, 1)

雖然從圖中可知,親屬越多,生還的可能性越大。
探索年齡、票價和生還率的關(guān)系
plt.figure(figsize=(13,8))
ax = plt.subplot()
ax.scatter(df[df['Survived']==1]['Age'],df[df['Survived']==1]['Fare'],c='green',s=40)
ax.scatter(df[df['Survived']==0]['Age'],df[df['Survived']==0]['Fare'],c='red',s=40)
ax.set_xlabel('Age')
ax.set_ylabel('Fare')
ax.legend(('survived','dead'),scatterpoints=1,loc='upper right',fontsize=15,)

罹難乘客的年齡集中在15-50歲之間的低票價乘客
總結(jié)
通過數(shù)據(jù)可視化結(jié)果,對初期提出的猜測做出以下結(jié)論:
1、女性生還率遠遠高于男性,大約是3倍左右。
2、0-10歲的幼兒生還率遠遠大于成年人,15-50歲的低票價乘客罹難最多。
3、票價越高,生還率越高??团摰燃壴礁?,生還率越高。
4、親屬越多,生還的可能性越大。
說明:通過使用python對泰坦尼克號的生還數(shù)據(jù)進行分析,初步得出了一些結(jié)論,但這些結(jié)論僅通過可視化和描述性統(tǒng)計得出,缺乏進一步深入的分析,結(jié)論的可靠性有待驗證。 另外,由于數(shù)據(jù)中有缺失值,對分析造成了負面影響。