Titanic数据分析
一.材料準(zhǔn)備
https://www.kaggle.com/c/titanic-gettingStarted/
二.提出問題
生存率和哪些因素有關(guān)(性別,年齡,是否有伴侶,票價(jià),艙位等級,包間,出發(fā)地點(diǎn))
1.乘客的年齡和票價(jià)的分布
2.樣本生存的幾率是多少
3.乘客的性別比例
4.乘客的艙位分布
5.性別和生還有沒有關(guān)系
6.艙位等級和生還有沒有關(guān)系
7.年齡和生還有沒有關(guān)系
8.出發(fā)地點(diǎn)和生存率有沒有關(guān)系
9.票價(jià)和生還有沒有關(guān)系
10.有陪伴的乘客的生還幾率是否更高
三.編寫代碼和做出圖形來驗(yàn)證所提出的的問題
? 1.加載數(shù)據(jù)
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() View Code?
???? 結(jié)論:Age,Embarked這兩列需要進(jìn)行數(shù)據(jù)清洗,因?yàn)镃abin列缺失的數(shù)據(jù)太多所以不能作為分析的依據(jù)
??? 2.自定義函數(shù)分析數(shù)據(jù)
1 #統(tǒng)計(jì)變量和生存率的關(guān)系,如果需要使用堆棧圖更清晰的展示數(shù)據(jù),stacked的值設(shè)置為True,為False默認(rèn)展示該變量下的生存率 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') View Code 1 #比較單個(gè)變量之間的關(guān)系,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) View Code?? 3.分析乘客年齡和票價(jià)分布
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]) #票價(jià)分布 5 axes[1].set_title('plot of fare') View Code結(jié)論:
1.大部分乘客的年齡在20到40歲之間
2.票價(jià)在主要分布在(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') View Code結(jié)論:整體的存活率約等于0.384,不超過40%的存活率
5.乘客的性別比例
1 visualize_column('Sex',('Male','Female')) View Code結(jié)論:大部分的乘客是男性,男性比女性多50%
6.乘客的艙位分布
1 visualize_column('Pclass',('Class 3','Class 2','Class 1')) View Code結(jié)論:三等艙的工人和奴隸占絕大多數(shù),大約是一二等艙的總和
?7.性別和生還的關(guān)系
1 visualize_survival('Sex',True) View Code結(jié)論:女性的生還人數(shù)遠(yuǎn)遠(yuǎn)超過男性
8.艙位等級和生還的關(guān)系
1 visualize_survival('Pclass',True) View Code結(jié)論:1等艙生還的幾率超過50%,2等艙的生還幾率接近50%,而三等艙獲救的可能性最低,證實(shí)了事故發(fā)生時(shí)三等艙被第一時(shí)間鎖死
9.年齡和生還的關(guān)系
首先年齡這一列存在多個(gè)空值,要進(jìn)行數(shù)據(jù)的清洗,利用非空的年齡字段計(jì)算出平均年齡來填充到空值字段,其次分段是在(0,80]之間,所以以10年作為分段點(diǎn)可以更直觀的看出年齡和生存率的關(guān)聯(lián)
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) View Code結(jié)論:嬰兒的生存比例較高,其次(20,40)歲之間的成年人生存所占比例較高,50歲以上老人和10歲左右的兒童少年生存率偏低
10.出發(fā)地點(diǎn)和生存率的關(guān)系
???? 發(fā)現(xiàn)有個(gè)上船地點(diǎn)是空值,要進(jìn)行數(shù)據(jù)的清洗,因?yàn)榭罩档钠眱r(jià)接近于瑟堡的中位數(shù),所以以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-') View Code???? 做出結(jié)論圖形
1 titanic_data.Embarked=titanic_data.Embarked.fillna('C') 2 visualize_survival('Embarked') View Code結(jié)論:從瑟堡,皇后鎮(zhèn),南安普頓的上船的生存率依次下降
11.票價(jià)和生存率的關(guān)系
??? 根據(jù)問題1的分析可得出票價(jià)的分段在(0,500]美金之間,但是根據(jù)數(shù)據(jù)分組來看票價(jià)有異常值,如果票價(jià)大于100美金則為異常值,需要舍棄否則會(huì)影響統(tǒng)計(jì)結(jié)果的表達(dá),
1 fares = np.arange(0,600,50) #劃分票價(jià)區(qū)間 2 fares_cut = pd.cut(titanic_data.Fare,fares) 3 fares_cut_group = titanic_data.groupby(fares_cut) 4 fares_cut_group.count().PassengerId #獲取異常數(shù)據(jù) 5 titanic_data.Fare.sort_values(ascending=False).head() #查看異常數(shù)據(jù) 6 #進(jìn)行IQR運(yùn)算找出異常數(shù)據(jù) 7 q75,q25 = np.percentile(titanic_data.Fare,[75,25]) 8 iqr = q75-q25 9 print q75+iqr*3 #確定異常數(shù)據(jù)的值 View Code結(jié)論:超過100.27美金的票價(jià)都是異常值,在接下來的分析中要舍棄
??? 重新進(jìn)行票價(jià)的統(tǒng)計(jì)分區(qū),做出圖形
1 fares_count = titanic_data.Fare[titanic_data.Fare<100.27] #舍棄異常數(shù)據(jù) 2 fares_count_range = np.arange(0,110,10) #重新計(jì)算票價(jià)區(qū)間 3 titanic_data['new_fare'] = pd.cut(titanic_data.Fare,fares_count_range) 4 visualize_survival('new_fare') View Code??
結(jié)論:總體來說票價(jià)越高生還的幾率越大
12.有陪伴的乘客的生還幾率是否更高
1 #通過SibSp+Parch總體計(jì)算出陪伴的生還率 2 titanic_data['family_member'] = titanic_data.SibSp+titanic_data.Parch 3 visualize_survival('family_member') View Code結(jié)論:當(dāng)有1,2個(gè)家庭成員結(jié)伴出行的時(shí)候,生存率較高,但不是主要提高生存的途徑
四.總結(jié):
由上述一系列圖表可知
1.樣本整體的存活率大約為39%
2.性別是影響生存率的最主要的因素
3.票價(jià)和艙位是影響生存率的第二要因
4.年齡和生存率沒有太大的關(guān)系
5.上船地點(diǎn)和是否家人結(jié)伴略微地影響了生存率
五.分析限制討論:
1.此樣本并非是泰坦尼克號全部乘客的數(shù)據(jù),據(jù)了解,泰坦尼克號一共有2224名乘客,本數(shù)據(jù)一共是891名乘客,如果是891名乘客根據(jù)是從2224名乘客中隨機(jī)選出,根據(jù)中心極限定理,該樣本足夠大,分析結(jié)論具有代表性,如果不是隨機(jī)抽取,那么分析的結(jié)果就不可靠
2.可能還有其他影響生存的情況,比如國籍是否影響生存率,是否會(huì)游泳會(huì)不會(huì)影響生存率,不同的職業(yè)會(huì)不會(huì)影響生存率
?
?
轉(zhuǎn)載于:https://www.cnblogs.com/luhuajun/p/7682641.html
總結(jié)
以上是生活随笔為你收集整理的Titanic数据分析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 关联关系和依赖关系的区别
- 下一篇: ssh登陆aix后,退格键无法删除