2018-03-03

探索數(shù)據(jù)集-泰坦尼克號(hào)數(shù)據(jù)

一、讀取數(shù)據(jù)

import pandas as pd import numpy as np df = pd.read_csv('titanic-data.csv') df

#查看具體信息字段 df.info()

#數(shù)據(jù)概況 df.describe()

數(shù)據(jù)整體概況: 1.總共有189個(gè)數(shù)據(jù) 2.總的存活率是38.4%,乘客的平均年齡是30歲, 3.Age,Cabin,Embarked列存在缺失值

二、提出問(wèn)題

Survived為因變量,Pclass、Sex、Age、SibSp、Parch、Fare、Cabin、Embarked為自變量。希望通過(guò)分析數(shù)據(jù),得出自變量對(duì)因變量的影響程度,幾個(gè)猜想:

? ? 1、性別影響生還率,女性的生還率顯著高于男性

? ? 2、社會(huì)地位影響生還率,社會(huì)地位高的乘客生還率顯著高于社會(huì)地位低的乘客

? ? 3、年齡影響生還率,老人和孩子的生還率顯著高于中年

三、數(shù)據(jù)整理階段

處理缺失值-Embarked(2個(gè)空值)

#空值定位 df.Embarked[df.Embarked.isnull()]

61 ? ? ?NaN

829? ? NaN

Name: Embarked, dtype: object

#估計(jì)Embarked的取值情況 df.groupby('Embarked').Survived.count()?

Embarked

C? ? 168

Q? ? 77

S? ? 644

Name: Survived, dtype: int64

Embarked取值只有3個(gè)值,每個(gè)值對(duì)應(yīng)的人數(shù)有統(tǒng)計(jì)量,發(fā)現(xiàn)基本上大部分取值是'S',只有兩個(gè)空值,可全部補(bǔ)充為's'

#眾數(shù)賦值 df["Embarked"] = df["Embarked"].fillna("S")

處理缺失值-Age(177個(gè)空值)

## 使用 RandomForestClassifier 填補(bǔ)缺失的年齡屬性 from sklearn.ensemble import RandomForestRegressor def set_missing_ages(df): age_df = df[['Age','Fare', 'Parch', 'SibSp', 'Pclass']]#把已有的數(shù)值型數(shù)據(jù)取出來(lái)丟進(jìn)Random Forest Regressor中 ? known_age = age_df[age_df.Age.notnull()].as_matrix()#乘客分成已知年齡和未知年齡兩部分 ? unknown_age = age_df[age_df.Age.isnull()].as_matrix() y = known_age[:, 0]# y即目標(biāo)年齡 X = known_age[:, 1:] # X即特征屬性值 rfr = RandomForestRegressor(random_state=0, n_estimators=2000, n_jobs=-1) rfr.fit(X, y) # fit到RandomForestRegressor之中 predictedAges = rfr.predict(unknown_age[:, 1::]) # 用得到的模型進(jìn)行未知年齡結(jié)果預(yù)測(cè) df.loc[ (df.Age.isnull()), 'Age' ] = predictedAges # 用得到的預(yù)測(cè)結(jié)果填補(bǔ)原缺失數(shù)據(jù) return df, rfr set_missing_ages(df) df

數(shù)據(jù)類型轉(zhuǎn)換-Age/Cabin/Embarked轉(zhuǎn)換成整型數(shù)據(jù)

#數(shù)據(jù)類型 df.dtypes

PassengerId int64

Survived? ? ? ? int64

Pclass? ? ? ? ? int64

Name? ? ? ? ? ? object

Sex? ? ? ? ? ? object

Age? ? ? ? ? ? float64

SibSp? ? ? ? ? ? int64

Parch? ? ? ? ? ? int64

Ticket? ? ? ? ? object

Fare? ? ? ? ? float64

Cabin? ? ? ? ? object

Embarked? ? ? ? object

dtype: object

#性別轉(zhuǎn)化為整數(shù)型 df['Sex'] = df['Sex'].map({'female':0, 'male':1}).astype(int) df['Sex'].value_counts()#計(jì)數(shù)

1 ? ?577

0? ? 314

Name: Sex, dtype: int64

男性乘客有577名,女性乘客有314名

#有船艙的賦值1,缺失值賦值0,默認(rèn)為沒(méi)有固定船艙 df.loc[ (df.Cabin.notnull()), 'Cabin' ] = 1 df.loc[ (df.Cabin.isnull()), 'Cabin'] = 0 df['Cabin'].value_counts()#計(jì)數(shù) #登船碼頭賦值 df['Embarked'] = df['Embarked'].map({'S':0, 'C':1, 'Q':2}).astype(int) df['Embarked'].value_counts()#計(jì)數(shù)

有船艙的乘客有204人,沒(méi)有船艙的乘客有687人,從S碼頭上船的乘客有646人,從C碼頭上船的乘客有168人,從Q碼頭上船的乘客有77人。

數(shù)據(jù)重構(gòu)-利用SibSp、Parch特征構(gòu)建兩個(gè)新特征(家庭人口總數(shù) familysize、是否單身 isalone)

df.loc[:,'SibSp']#兄妹個(gè)數(shù) df.loc[:,'Parch']#父母子女個(gè)數(shù) df['familysize'] = df.loc[:,'SibSp'] + df.loc[:,'Parch'] + 1 #增加一列column,表示家庭成員個(gè)數(shù) df['isalone'] = 0 #增加一列column,表示是否是獨(dú)身,設(shè)初始值為0,代表不是獨(dú)身 df.loc[df['familysize'] == 1,'isalone'] = 1 #定位familysize是1的元素,isalone相應(yīng)元素賦值為1,代表是獨(dú)身

四、探索階段

A.單變量數(shù)據(jù)分析

1.Pclass單變量分析

#不同社會(huì)等級(jí)的乘客數(shù)量 df.groupby('Pclass')['PassengerId'].count()

Pclass

1? ? 216

2? ? 184

3? ? 491

import matplotlib.pyplot as plt import seaborn as sns df.groupby('Pclass')['PassengerId'].count().plot(kind = "pie",autopct = "%.0f%%") plt.title('Pclass VS Count') plt.show()


一等艙乘客有214位,占24%;二等艙乘客有184位,占21%;三等艙乘客有491位,占55%;樣本數(shù)量都大約30,具有統(tǒng)計(jì)意義。

2.Sex單變量分析 ?

df.groupby('Sex')['PassengerId'].count() #男女的乘客數(shù)量 df.groupby('Sex')['PassengerId'].count().plot(kind = "pie",autopct = "%.0f%%") plt.title('Sex VS Count') plt.show()

Sex

0? ? 314

1? ? 577


#我們也可以將乘客分為男,女,小孩,為原有數(shù)據(jù)庫(kù)新增一個(gè)字段,此字段因此包含兩個(gè)屬性年齡和性別 def male_famle_child(passenger):? ? age,sex = passenger if age < 16: return int(2) #小孩用2表示 else: return sex #增加字段df["Person"].value_counts() #男、女、小孩的數(shù)量 df["Person"] = df[["Age","Sex"]].apply(male_famle_child,axis=1) df["Person"].value_counts() #男、女、小孩的數(shù)量 df.groupby('Person')['PassengerId'].count().plot(kind = "pie",autopct = "%.0f%%") plt.title('Person VS Count') plt.show()

1.0 ? ?532

0.0? ? 264

2.0? ? 95


成年男性乘客有537位,占大約60%,成年女性有271位,占大約30%,小孩有83位,占大約9%。樣本數(shù)量都大于30,具有統(tǒng)計(jì)學(xué)意義。

3.isalone單變量分析

df.groupby('isalone')['PassengerId'].count() df.groupby('isalone')['PassengerId'].count().plot(kind = "pie",autopct = "%.0f%%") plt.title('isalone VS Count') plt.show()

單身乘客有537位,占60%;有家庭乘客有354位,占40%;樣本數(shù)量都大于30,具有統(tǒng)計(jì)意義。

4.Age單變量分析

bins = [0, 12, 18, 65, 100] #將年齡劃分為4個(gè)年齡段,兒童、青少年,青中年,老人 df['Age_group'] = pd.cut(df['Age'], bins) #增加'Age_group']列 df.groupby('Age_group')['PassengerId'].count() #每個(gè)年齡段的乘客人數(shù) df.groupby('Age_group')['PassengerId'].count().plot(kind = "pie",autopct = "%.0f%%") plt.title('Age_group VS count') plt.show()

0-12歲的乘客有69位,12-18歲的乘客有70位,18-65歲的乘客有567位,這三個(gè)年齡段的樣本數(shù)量都大約30,具有統(tǒng)計(jì)意義;65-100歲的乘客只有8位,樣本量太小,統(tǒng)計(jì)過(guò)程中會(huì)存在很大的誤差,不具有統(tǒng)計(jì)意義。

5.Fare單變量分析

bins = [0, 10, 50, 100, 300,520] #將票價(jià)劃分為6個(gè)價(jià)格段 df['Fare_group'] = pd.cut(df['Fare'], bins) #增加'Fare_group']列df.groupby('Fare_group') df['PassengerId'].count() df.groupby('Fare_group')['PassengerId'].count().plot(kind = "pie",autopct = "%.0f%%") plt.title('Fare_group VS count') plt.show()

票價(jià)在0-10美元的乘客有321位,票價(jià)在10-50美元的乘客有395位,票價(jià)在50-100美元的乘客有107位,票價(jià)在100- 300美元的乘客有50位,這四個(gè)票價(jià)范圍的樣本數(shù)超過(guò)30,具有統(tǒng)計(jì)意義,票價(jià)在300-520美元的乘客有3位,樣本量太小,沒(méi)有統(tǒng)計(jì)意義。

6.Cabin單變量分析

df.groupby('Cabin')['PassengerId'].count() #有無(wú)客艙的乘客的數(shù)量 df.groupby('Cabin')['PassengerId'].count().plot(kind = "pie",autopct = "%.0f%%") plt.title('Cabin VS count') plt.show()


沒(méi)有具體客艙的乘客有687位乘客,有具體客艙的有204位乘客,都具有統(tǒng)計(jì)意義

7.Embarked單變量分析

df.groupby('Embarked')['PassengerId'].count()#從S,C,Q碼頭登船的乘客的數(shù)量 df.groupby('Embarked')['PassengerId'].count().plot(kind = "pie",autopct = "%.0f%%") plt.title('Embarked VS count') plt.show()

從s碼頭上船的乘客有646位,從c碼頭上船的乘客有168位,從q碼頭上船的乘客有77位,都具有統(tǒng)計(jì)意義。

B.描述性分析

1.性別是否影響生還率

x = df[['Sex', 'Survived']].groupby(['Sex']).mean() #男性女性存活率 plt.bar( [0,1], [x.loc[0,'Survived'],x.loc[1,'Survived']], 0.5, color='g', alpha=0.7 ) plt.xticks([0,1],['female','male']) plt.xlabel('Sex') plt.ylabel('survived_rate') plt.title('Sex VS Survived') plt.show()


如圖,女性的存活率更高,并且高出了50%左右。

x1=df[['Person','Survived']].groupby(['Person']).mean()#男性女性存活率 plt.bar([0,1,2], [x1.loc[0,'Survived'],x1.loc[1,'Survived'],x1.loc[2,'Survived']], 0.5, color='g', alpha=0.7) plt.xticks([0,1,2],['female','male','kids']) plt.xlabel('Person') plt.ylabel('survived_rate') plt.title('Person VS Survived') plt.show()

女性和孩子的存活率高于成年男性

2.有無(wú)家庭是否影響生還率

d=df[['isalone','Survived']].groupby(['isalone']).mean()#有無(wú)家庭的乘客存活率 plt.bar([0,1],[d.loc[0,'Survived'],d.loc[1,'Survived']],0.5,color='r',alpha=0.5,) plt.xticks([0,1],['notalone','alone']) plt.xlabel('isalone') plt.ylabel('survived_rate') plt.title('isalone VS Survived') plt.show()

如圖,有家庭乘客的存活率更高

%pylabinline sns.factorplot("isalone",data=df,hue="Person",kind="count")#有無(wú)家庭中男女小孩的分布 plt.xlabel('isalone_Pclass') plt.ylabel('count') plt.title('isalone_Person VS count')

單身乘客中成年男性較多,成年男性的存活率低從而拉低單身乘客的存活率,可能存活率跟是否有家人沒(méi)有關(guān)系。

3.社會(huì)地位是否影響生還率

p = df[['Pclass', 'Survived']].groupby(['Pclass']).mean() #不同社會(huì)等級(jí)的乘客存活率 plt.bar( ? [0,1,2], [p.loc[1,'Survived'],p.loc[2,'Survived'],p.loc[3,'Survived']], 0.5, color='b', alpha=0.7) plt.xticks([0,1,2],[1,2,3]) plt.xlabel('Pclass') plt.ylabel('survived_rate') plt.title('Pclass VS Survived') plt.show()


sns.factorplot("Pclass",data=df,hue="Person",kind="count")#各等級(jí)中男女小孩的分布 plt.xlabel('Pclass_Person') plt.ylabel('count') plt.title('Pclass_Person VS count'

雖然等級(jí)越高存活率也越高,但3等艙乘客中成年男性占大多數(shù),所以等級(jí)高的存活率高除等級(jí)影響外,也收性別影響性別的影響。

4.年齡是否影響生還率

by_age = df.groupby('Age_group')['Survived'].mean() by_age.plot(kind = "bar") plt.xlabel('Age_group') plt.ylabel('survived_rate') plt.title('Age_group VS Survived')

如圖,兒童和青少年的存活率高。

sns.factorplot("Age_group",data=df,hue="Pclass",kind="count")#各年齡段等級(jí)分布 plt.xlabel('Age_group_pclass') plt.ylabel('count') plt.title('Age_group_Pclass VS count')


青中年乘客中一等艙比例高于兒童和青少年,但青中年乘客的存活率確低于兒童和青少年,說(shuō)明等級(jí)對(duì)存活率的影響沒(méi)有年齡對(duì)生存率的影響大。

sns.factorplot("Age_group",data=df,hue="Sex",kind="count")#各年齡段男女分布 plt.xlabel('Age_group_sex') plt.ylabel('count') plt.title('Age_group_Sex VS count')


青中年乘客中男性比女性多超過(guò)50%,其他年齡段,男女比例差不多,所以,青中年乘客的存活率比兒童和青少年的存活率低,除了年齡的影響也可能是受性別的影響。

5.乘客票價(jià)是否影響生還率

plt.figure(figsize=(10,5)) df['Fare'].hist(bins = 70) #把票價(jià)分為70個(gè)小組 plt.xlabel('Fare') plt.ylabel('count') plt.title('Fare VS count') df.boxplot(column='Fare', by='Pclass', showfliers=False) plt.xlabel('Fare_pclass') plt.ylabel('count') plt.show()


fare_not_survived = df["Fare"][df["Survived"] == 0] fare_survived = df["Fare"][df["Survived"] == 1] avgerage_fare = pd.DataFrame([fare_not_survived.mean(), fare_survived.mean()]) std_fare = pd.DataFrame([fare_not_survived.std(), fare_survived.std()]) avgerage_fare.plot(yerr=std_fare,kind='bar',legend=False) plt.xlabel('survived_rate') plt.ylabel('Fare') plt.title('Fare VS Survived') plt.show()

可見(jiàn),票價(jià)與生還有一定相關(guān)性,生還者的平均票價(jià)要比未生還的高。

6.有無(wú)艙位是否影響生還率

c =df[['Cabin', 'Survived']].groupby(['Cabin']).mean() plt.bar( ? [0,1], ? [c.loc[0,'Survived'],c.loc[1,'Survived']], 0.5, color='c', alpha=0.9, ) plt.xticks([0,1],['isnull','notnull']) plt.xlabel('Cabin') plt.ylabel('survived_rate') plt.title('Cabin VS Survived') plt.show()

如圖,有艙號(hào)的存活率更高,缺失值的乘客可能是沒(méi)有艙位

sns.factorplot("Cabin",data=df,hue="Person",kind="count")#有無(wú)船艙成年男性、女性、小孩的分布 plt.xlabel('Cabin_pclass') plt.ylabel('count') plt.title('Cabin_Person VS count')

沒(méi)有船艙的乘客中男性占75%,有船艙的乘客中男性大約只占50%,而存活率無(wú)船艙的比有船艙的低37%,有無(wú)船艙的存活率差異受年齡性別影響。

7.登船碼頭不同是否影響生還率

e=df[['Embarked', 'Survived']].groupby(['Embarked']).mean() plt.bar( [0,1,2], ? ? [e.loc[0,'Survived'],e.loc[1,'Survived'],e.loc[2,'Survived']], 0.5, color='g', alpha=0.4 ) plt.xticks([0,1,2],['S','C','Q']) plt.xlabel('Embarked') plt.ylabel('survived_rate') plt.title('Embarked VS Survived') plt.show()

如圖,從S碼頭上船的乘客存活率最低,從C碼頭上船的存活率最高

sns.factorplot("Embarked",data=df,hue="Person",kind="count")#不同碼頭上船的乘客中成年男性、女性、小孩的分布 plt.xlabel('Embarked_person') plt.ylabel('count') plt.title('Embarked_Person VS count')

從S碼頭上船的乘客中男性比例很高,可能影響S碼頭生存率的是性別和年齡

結(jié)論階段

1.報(bào)告中使用的數(shù)據(jù)不是全部乘客數(shù)據(jù),報(bào)告使用的數(shù)據(jù)有891個(gè)樣本,不是全部的乘客數(shù)據(jù)并且這891個(gè)樣本同是含有一定數(shù)量的缺失值,所以樣本可能會(huì)有偏差。 樣本雖然不能夠代表整體人口,但樣本來(lái)自整體,樣本量也比較多,分析是有說(shuō)服力的。

2.對(duì)數(shù)據(jù)的處理有一定的偏差和不確定性。 ①對(duì)Age數(shù)據(jù)的處理,Age有177個(gè)缺失值,用 RandomForestClassifier填補(bǔ)缺失值,隨機(jī)填補(bǔ)的缺失值和缺失年齡乘客的真實(shí)年齡肯定存在偏差②對(duì)Cabin數(shù)據(jù)的處理,Cabin有87個(gè)缺失值,我的處理方式是把Cabin分為2類數(shù)據(jù),一類是有cabin值的,一類是沒(méi)有cabin的,這樣分類的前提是假設(shè)cabin值缺失的乘客是沒(méi)有具體客艙的,但這個(gè)假設(shè)不是肯定成立的,缺失值里也可能包含大量有具體客艙但丟失客艙信息的乘客,可能會(huì)有一點(diǎn)的偏差③對(duì)Embarked數(shù)據(jù)的處理,有2個(gè)缺失值,我的處理方式是填充了眾數(shù),但Embarked的數(shù)據(jù)極有可能跟Pclass和Fare有關(guān),因?yàn)橐话闱闆r下,等級(jí)越高距離越遠(yuǎn)的票價(jià)會(huì)更貴,但此列只有兩個(gè)缺失值,相對(duì)于891個(gè)樣本,不會(huì)帶入太多偏差

3.乘客是否會(huì)游泳、乘客的身體素質(zhì)也可能會(huì)影響存活率,但此數(shù)據(jù)表中沒(méi)有相關(guān)數(shù)據(jù)。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 對(duì)kaggle不做過(guò)多介紹 都知道這是一個(gè)數(shù)據(jù)挖掘的圣地,泰坦尼克號(hào)事件也不多做介紹,馬上進(jìn)入正題 ...
    披風(fēng)海膽放閱讀 1,298評(píng)論 1 4
  • Introduction This notebook describes and implements a bas...
    Brakeman閱讀 385評(píng)論 0 0
  • 一 經(jīng)典又兼具備趣味性的Kaggle案例[泰坦尼克號(hào)問(wèn)題 畫多圖 數(shù)據(jù)探索 進(jìn)行特征選擇時(shí),判斷每一個(gè)特征(連續(xù),...
    maocy閱讀 1,091評(píng)論 0 0
  • 1、加載文件,查看:(兩個(gè)數(shù)據(jù)集,train作為學(xué)習(xí)集進(jìn)行數(shù)據(jù)建模,通過(guò)test測(cè)試集查看建模的情況。) trai...
    12_21閱讀 1,130評(píng)論 0 0
  • 我們?cè)?jīng)都期許過(guò),未來(lái)的他一定是踏著七彩祥云來(lái)接自己的人。 想找一個(gè)我愛(ài)的并且愛(ài)我的人有多難,簡(jiǎn)直大海撈針?你知道...
    芭蕉姑娘閱讀 286評(píng)論 1 1

友情鏈接更多精彩內(nèi)容