一.材料准備
https://www.kaggle.com/c/titanic-gettingStarted/
二.提出問題
生存率和哪些因素有關(性別,年齡,是否有伴侶,票價,艙位等級,包間,出發地點)
1.乘客的年齡和票價的分布
2.樣本生存的幾率是多少
3.乘客的性別比例
4.乘客的艙位分布
5.性別和生還有沒有關系
6.艙位等級和生還有沒有關系
7.年齡和生還有沒有關系
8.出發地點和生存率有沒有關系
9.票價和生還有沒有關系
10.有陪伴的乘客的生還幾率是否更高
三.編寫代碼和做出圖形來驗證所提出的的問題
1.加載數據

1 %pylab inline 2 %matplotlib inline 3 import seaborn as sns 4 import numpy as np 5 import pandas as pd 6 import matplotlib.pyplot as plt 7 titanic_data = pd.read_csv('titanic-data.csv') 8 titanic_data.info()
結論:Age,Embarked這兩列需要進行數據清洗,因為Cabin列缺失的數據太多所以不能作為分析的依據
2.自定義函數分析數據

1 #統計變量和生存率的關系,如果需要使用堆棧圖更清晰的展示數據,stacked的值設置為True,為False默認展示該變量下的生存率 2 def visualize_survival(feature,stacked=False): 3 if stacked: 4 survived_rate = titanic_data.groupby([feature,'Survived'])['Survived'].count().unstack().plot(kind='bar',stacked='True') 5 else: 6 survived_rate = (titanic_data.groupby([feature]).sum()/titanic_data.groupby([feature]).count())['Survived'] 7 survived_rate.plot(kind='bar') 8 plt.title(feature + ' V.S. Survival')

1 #比較單個變量之間的關系,feature表示要分析的列,args表示x軸的名稱 2 def visualize_column(feature,*args): 3 fig,ax=plt.subplots(figsize=(7,5)) 4 titanic_data[feature].value_counts().plot(kind='bar') 5 for i in range(len(args)): 6 ax.set_xticklabels((args[i]),rotation='horizontal') 7 ax.set_title('bar of ' + feature)
3.分析乘客年齡和票價分布

1 fig,axes=plt.subplots(2,1,figsize=(15,5)) 2 titanic_data['Age'].hist(ax=axes[0]) #年齡分布 3 axes[0].set_title('plot of age') 4 titanic_data['Fare'].hist(ax=axes[1]) #票價分布 5 axes[1].set_title('plot of fare')
結論:
1.大部分乘客的年齡在20到40歲之間
2.票價在主要分布在(0,100)美元之間
4.樣本的生存幾率

1 survived_rate = float(titanic_data['Survived'].sum())/titanic_data['Survived'].count() 2 print survived_rate 3 by_survived = titanic_data.groupby(['Survived'])['Survived'].count() 4 plt.pie(by_survived,labels=['Non-Survived','Survived'],autopct='%1.0f%%') 5 plt.title('Pie Chart Of Surviveness for Surviveness of Passengers')
結論:整體的存活率約等於0.384,不超過40%的存活率
5.乘客的性別比例

1 visualize_column('Sex',('Male','Female'))
結論:大部分的乘客是男性,男性比女性多50%
6.乘客的艙位分布

1 visualize_column('Pclass',('Class 3','Class 2','Class 1'))
結論:三等艙的工人和奴隸占絕大多數,大約是一二等艙的總和
7.性別和生還的關系

1 visualize_survival('Sex',True)
結論:女性的生還人數遠遠超過男性
8.艙位等級和生還的關系

1 visualize_survival('Pclass',True)
結論:1等艙生還的幾率超過50%,2等艙的生還幾率接近50%,而三等艙獲救的可能性最低,證實了事故發生時三等艙被第一時間鎖死
9.年齡和生還的關系
首先年齡這一列存在多個空值,要進行數據的清洗,利用非空的年齡字段計算出平均年齡來填充到空值字段,其次分段是在(0,80]之間,所以以10年作為分段點可以更直觀的看出年齡和生存率的關聯

1 titanic_data.Age.fillna(titanic_data.Age.mean(),inplace=True) #使用均值來填充Age中的空值 2 ages = np.arange(0,90,10) #年齡分段 3 titanic_data['age_cut'] = pd.cut(titanic_data.Age,ages) 4 visualize_survival('age_cut',True)
結論:嬰兒的生存比例較高,其次(20,40)歲之間的成年人生存所占比例較高,50歲以上老人和10歲左右的兒童少年生存率偏低
10.出發地點和生存率的關系
發現有個上船地點是空值,要進行數據的清洗,因為空值的票價接近於瑟堡的中位數,所以以C填充空值

1 titanic_data.Embarked[titanic_data.Embarked.isnull()] 2 print titanic_data[titanic_data['Embarked'].isin(['S','C','Q'])==False] 3 titanic1 = titanic_data[titanic_data['Pclass']==1] 4 ax=sns.boxplot(titanic1.Embarked,titanic1.Fare) 5 plt.plot((-100,100),(80,80),'r-')
做出結論圖形

1 titanic_data.Embarked=titanic_data.Embarked.fillna('C') 2 visualize_survival('Embarked')
結論:從瑟堡,皇后鎮,南安普頓的上船的生存率依次下降
11.票價和生存率的關系
根據問題1的分析可得出票價的分段在(0,500]美金之間,但是根據數據分組來看票價有異常值,如果票價大於100美金則為異常值,需要舍棄否則會影響統計結果的表達,

1 fares = np.arange(0,600,50) #划分票價區間 2 fares_cut = pd.cut(titanic_data.Fare,fares) 3 fares_cut_group = titanic_data.groupby(fares_cut) 4 fares_cut_group.count().PassengerId #獲取異常數據 5 titanic_data.Fare.sort_values(ascending=False).head() #查看異常數據 6 #進行IQR運算找出異常數據 7 q75,q25 = np.percentile(titanic_data.Fare,[75,25]) 8 iqr = q75-q25 9 print q75+iqr*3 #確定異常數據的值
結論:超過100.27美金的票價都是異常值,在接下來的分析中要舍棄
重新進行票價的統計分區,做出圖形

1 fares_count = titanic_data.Fare[titanic_data.Fare<100.27] #舍棄異常數據 2 fares_count_range = np.arange(0,110,10) #重新計算票價區間 3 titanic_data['new_fare'] = pd.cut(titanic_data.Fare,fares_count_range) 4 visualize_survival('new_fare')
結論:總體來說票價越高生還的幾率越大
12.有陪伴的乘客的生還幾率是否更高

1 #通過SibSp+Parch總體計算出陪伴的生還率 2 titanic_data['family_member'] = titanic_data.SibSp+titanic_data.Parch 3 visualize_survival('family_member')
結論:當有1,2個家庭成員結伴出行的時候,生存率較高,但不是主要提高生存的途徑
四.總結:
由上述一系列圖表可知
1.樣本整體的存活率大約為39%
2.性別是影響生存率的最主要的因素
3.票價和艙位是影響生存率的第二要因
4.年齡和生存率沒有太大的關系
5.上船地點和是否家人結伴略微地影響了生存率
五.分析限制討論:
1.此樣本並非是泰坦尼克號全部乘客的數據,據了解,泰坦尼克號一共有2224名乘客,本數據一共是891名乘客,如果是891名乘客根據是從2224名乘客中隨機選出,根據中心極限定理,該樣本足夠大,分析結論具有代表性,如果不是隨機抽取,那么分析的結果就不可靠
2.可能還有其他影響生存的情況,比如國籍是否影響生存率,是否會游泳會不會影響生存率,不同的職業會不會影響生存率