1. 程式人生 > >如何用程式設計得出泰坦尼克號生還者的年齡段?

如何用程式設計得出泰坦尼克號生還者的年齡段?

640?wx_fmt=gif

【CSDN編者按】大家熟知的電影《泰坦尼克號》,是一部經典的奧斯卡電影,也是一部以真實故事改編而拍的電影。

真實故事中,1912年4月14日,這艘當時世界上體積最龐大、內部設施最豪華的客運輪船泰坦尼克號,與一座冰山相撞,2224名船員及乘客中,逾1500人喪生,其中僅333具罹難者遺體被尋回。

時隔一個世紀之久,如果用程式設計的角度,來審視這場災難,會有什麼發現呢?今天的文章,正是用程式設計來研究泰坦尼克號的生還者情況。

640?wx_fmt=png

作者 | 光城

責編 | 胡巍巍


640?wx_fmt=png

資料預處理


資料初識

這裡主要是對資料進行介紹,下載的資料集分為train與test以及gender_submission,分別是訓練集,測試集以及生成提交檔案的參考檔案。

train與test各列分別為:


  

PassengerId  乘客ID
Pclass  客艙等級(1/2/3等艙位)
Name  乘客姓名
Sex  性別
Age  年齡
SibSp 兄弟姐妹數或配偶數
Parch 父母數或子女數
Ticket 船票編號
Fare 船票價格
Cabin  客艙號
Embarked  登船港口

導包


  

import seaborn as sns
from

 matplotlib import pyplot as plt
import pandas as pd
%matplotlib inline
import warnings
from sklearn.model_selection import train_test_split
warnings.filterwarnings('ignore')

資料匯入

這裡將訓練集與測試集匯入,並通過concat將資料整合一塊,做個缺失值分析處理。


  

tannike_train

=pd.read_csv('./train.csv')
tannike_test=pd.read_csv('./test.csv')
join_data=pd.concat([tannike_train,tannike_test],ignore_index=True)

資料預處理及特徵工程

統計缺失值的程式碼如下:


  

join_data.isna().sum()

結果:


  

Age             263
Cabin          1014
Embarked          2
Fare              1
Name              0
Parch             0
PassengerId       0
Pclass            0
Sex               0
SibSp             0
Survived        418
Ticket            0
dtype: int64

從這個結果中我們發現:

Age與Cabin以缺失值較多,而Fare與Embarked缺失值較少,可以考慮用中位數,均值或者眾數等方式解決。

失值處理


  

fare_mean = tannike_train['Fare'].mean()
tannike_test.loc[pd.isnull(tannike_test.Fare),'Fare'] = fare_mean 
embarked_mode = tannike_train['Embarked'].mode()
tannike_train.loc[pd.isna(tannike_train.Embarked),['Embarked']] = embarked_mode[0]
tannike_train.loc[pd.isna(tannike_train.Age),['Age']] = tannike_train['Age'].mean()
tannike_test.loc[pd.isna(tannike_test.Age),['Age']] = tannike_test['Age'].mean()

檢視缺失值,以Embarked為例:


  

tannike_train.Embarked.isna().sum()

輸出為0,則表示缺失值被處理完畢!

資料劃分

這裡直接劃分成訓練集與測試集的原因是對比與label資料的誤差度。


  

label = tannike_train['Survived']
tannike_train.drop('Survived',axis=1,inplace=True) 

X_train,X_test,Y_train,Y_test = train_test_split(tannike_train,label,test_size = 0.3,random_state = 1)

X_train['Survived'] = Y_train
X_test['Survived'] = Y_test 

切分資料為訓練集,測試集!

性別與生存

我們先來看一下性別與生存關係:


  

sex_Sur = pd.crosstab(tannike_train.Sex,tannike_train.Survived)
sex_Sur.rename(columns={0.0:'dead',1.0:'survived'},inplace=True)
sex_Sur

輸出:


  

Survived    dead    survived
Sex        
female    81  233
male    468 109

資料視覺化:


  

# stacked屬性設定多個柱狀圖是否疊加
sex_Sur.plot.bar(stacked=True,color=['#f441f1','#b6f442'])
plt.xticks(rotation=0,size='x-large')
plt.xlabel('')

640?wx_fmt=png

條狀圖轉為餅圖


  

sex_Sur.plot.pie(subplots=True,figsize=(10,5),colors=('#b6f442','#41d0f4'))

640?wx_fmt=png

綜合上述兩圖,我們發現女性的存活率要比男性高!Age可以作為一個重要特徵!

特徵工程處理:將資料轉為0,1資料。


  

tannike_train['Sex'] = tannike_train['Sex'].apply(lambda x: 1 if x == 'male' else 0)
tannike_test['Sex'] = tannike_test['Sex'].apply(lambda x: 1 if x == 'male' else 0)
# one-hot編碼
tannike_train = pd.get_dummies(data= tannike_train,columns=['Sex'])
tannike_test = pd.get_dummies(data= tannike_test,columns=['Sex'])

年齡與存活

研究年齡與存活關聯:


  

survived_age=tannike_train[tannike_train.Survived==1]['Age']
dead_age=tannike_train[tannike_train.Survived==0]['Age']
age_frame=pd.concat([survived_age,dead_age],axis=1)
age_frame.columns=['Survived','Dead']
age_frame.head()

輸出資料(前5行資料):


  

  Survived    Dead
0    NaN     22.0
1    38.0    NaN
2    26.0    NaN
3    35.0    NaN
4    NaN     35.0

視覺化:


  

# 為避免顏色覆蓋,使用alpha通道屬性
age_frame.plot(kind='hist',bins=30,alpha=0.3,figsize=(10,6))

640?wx_fmt=png

上圖發現:

年齡低於5歲的,存活率相對較高!而在75歲以後存活率也高,在中間的15到35之間存活率相對較高,其他的就比較低了,我們可以在做特徵工程時候,對其做年齡劃分處理,比如:低中高等。

特徵工程處理:


  

tannike_train['Small_Age'] = np.int32(tannike_train['Age'] <= 5)  
tannike_train['Old_Age'] = np.int32(tannike_train['Age'] >= 65)  
tannike_train['Middle_Age'] = np.int32((tannike_train['Age'] >= 15) & (tannike_train['Age'] <= 25))  

tannike_test['Small_Age'] = np.int32(tannike_test['Age'] <= 5)  
tannike_test['Old_Age'] = np.int32(tannike_test['Age'] >= 65)  
tannike_test['Middle_Age'] = np.int32((tannike_test['Age'] >= 15) & (tannike_test['Age'] <= 25))  

名字與存活

首先來統計一下各個名字開頭的數量,比如Ms開頭的數量:


  

# 比如名字為Attalah, Miss. Malake,我們提取出目的是Miss,運用兩次lambda
X_train['Name_Title'] = X_train['Name'].apply(lambda x: x.split(',')[1]).apply(lambda x: x.split()[0])
X_test['Name_Title'] = X_test['Name'].apply(lambda x: x.split(',')[1]).apply(lambda x: x.split()[0])
X_train.groupby('Name_Title')['Survived'].count()

輸出:


  

Name_Title
Capt.        1
Col.         2
Don.         1
Dr.          4
Lady.        1
Major.       1
Master.     27
Miss.      126
Mlle.        1
Mme.         1
Mr.        365
Mrs.        87
Rev.         5
the          1
Name: Survived, dtype: int64

交叉資料:訓練與測試集視覺化對比差異:


  

# 條形圖上的誤差棒則表示各類的數值相對於條形圖所顯示的值的誤差
# seaborn的barplot()利用矩陣條的高度反映數值變數的集中趨勢,以及使用errorbar功能(差棒圖)來估計變數之間的差值統計
fig, (axis1,axis2) = plt.subplots(1,2,figsize=(15,5))
sns.barplot('Name_Title''Survived', data=X_train.sort_values('Name_Title'), ax=axis1) 
sns.barplot('Name_Title''Survived', data=X_test.sort_values('Name_Title'), ax=axis2) 

下面這個圖顯示的資料變數的集中趨勢!

640?wx_fmt=png

對比這個資料,得出如下結論:對於不同的名字開頭,他的生存率不同,這裡根據存活率平均程度高低依次下分。

特徵工程處理:通過定義一個函式來對名字的存活性高低,進行詳細排序:


  

def Name_Title_Code(x):
    if x == 'Mr.':
        return 1
    if (x=='Ms.'or (x=='Lady.'or (x == 'Mlle.'or (x =='Mme.'or (x == 'the.'or (x =='Sir.'or (x=='Major'):
        return 2
    if (x == 'Mrs.'):
        return 3
    if x == 'Miss.':
        return 4
    if x == 'Master.':
        return 5
    if x == 'Dr.':
        return 6
    return 7

對真正的訓練集與測試集進行one-hot編碼:


  

tannike_train['Name_Title'] = tannike_train['Name'].apply(lambda x: x.split(',')[1]).apply(lambda x: x.split()[0])
tannike_test['Name_Title'] = tannike_test['Name'].apply(lambda x: x.split(',')[1]).apply(lambda x: x.split()[0])

tannike_train['Name_Title'] = tannike_train['Name_Title'].apply(Name_Title_Code)
tannike_test['Name_Title'] = tannike_test['Name_Title'].apply(Name_Title_Code)
tannike_train = pd.get_dummies(columns = ['Name_Title'], data = tannike_train)
tannike_test = pd.get_dummies(columns = ['Name_Title'], data = tannike_test)

船票編號與存活

獲取船票第一個字母:


  

def Ticket_First_Let(x):
    return x[0]

交叉資料集:訓練與測試集處理:


  

X_train['Ticket_First_Letter'] = X_train['Ticket'].apply(Ticket_First_Let)
X_test['Ticket_First_Letter'] = X_test['Ticket'].apply(Ticket_First_Let)

視覺化船票編號與存活關係:


  

fig, (axis1,axis2) = plt.subplots(1,2,figsize=(15,5))
sns.barplot('Ticket_First_Letter''Survived'data=X_train.sort_values('Ticket_First_Letter'), ax=axis1) 
sns.barplot('Ticket_First_Letter''Survived'data=X_test.sort_values('Ticket_First_Letter'), ax=axis2) 

640?wx_fmt=png

同理,我們發現票的前面數字的編號對生存也是有影響!這裡對不同的票編號封裝成函式,進行處理!


  

def Ticket_First_Letter_Code(x):
    if (x == 'F'):
        return 1
    if x == '1' or x=='P' or x=='9':
        return 2
    if x == '2':
        return 3
    if x == 'C':
        return 4
    if x == 'S':
        return 5
    if x == '6':
        

相關推薦

如何用程式設計得出生還者年齡段

【CSDN編者按】大家熟知的電影《泰坦尼克號》,是一部經典的奧斯卡電影,也是一部以真實故事改編而拍的電影。 真實故事中,1912年4月14日,這艘當時世界上體積最龐大、內部設施最豪華的客運輪船泰坦尼克號,與一座冰山相撞,2224名船員及乘客中,逾1500人喪生,其中僅33

(決策樹)生還者簡單預測

import pandas as pd titanic=pd.read_csv('http://biostat.mc.vanderbilt.edu/wiki/pub/Main/DataSets/titanic.txt') X=titanic[['pclass','age','sex']] y=

Kaggle入門——生還者預測

前言   這個是Kaggle比賽中泰坦尼克號生存率的分析。強烈建議在做這個比賽的時候,再看一遍電源《泰坦尼克號》,可能會給你一些啟發,比如婦女兒童先上船等。所以是否獲救其實並非隨機,而是基於一些背景有先後順序的。 1,背景介紹   1912年4月15日,載著1316號乘客和891名船員的豪華巨輪泰坦尼克號在首

小丸子踏入python之路:python_day05(Pandas處理船員獲救數據titanic_train.csv)

為什麽 pre known mba 否則 app () 功能 urn 泰坦尼克船員獲救數據:     titanic_train.csv 用excel打開數據集。顯示如下: 寫在前邊:   為了方便以後運用numpy和pandas的庫,分別造它們的別名np和pd. im

機器學習之路: python 決策樹分類 預測乘客是否幸存

現象 info n) 指標 ssi 直觀 learn 保持 afr 使用python3 學習了決策樹分類器的api 涉及到 特征的提取,數據類型保留,分類類型抽取出來新的類型 需要網上下載數據集,我把他們下載到了本地, 可以到我的git下載代碼和數據集: https

【金米米】現實版“”上演!這一刻竟是永別!

與他 進行 現實 潛水 可能 重復 保持 個人 也不能 北京時間7月5日傍晚6點45分左右,在泰國南部普吉府,兩艘共載有127名中國遊客的遊船在返航普吉島途中,突遇特大暴風雨,分別在珊瑚島和梅通島發生傾覆。截止至9日上午10時已有42人遇難,41名中國遊客,其中有13名中國

之災分析

hist analysis 希望 rand 建模 mach 特征工程 queen only 大神經驗: 1、應用機器學習,千萬不要一上來就試圖做到完美,先擼一個baseline的model出來,再進行後續的分析步驟,一步步提高,所謂後續步驟可能包括『分析model現在的狀態

生存預測(python)

scores k近鄰 ace gbdt dom png 記錄 inline sse 1 數據探索 對數據進行一個整體的理解 1.1 查看數據都有一些什麽特征 import pandas as pd import seaborn as sns %matplotlib inl

生存概率分析

本專案在Kaggle中是資料分析入門專案,如果你想了解資料分析,我們就從這裡開始吧! 資料集可以到Kaggle入門專案中直接找到,下載即可! 1.提出問題 什麼樣的人在泰坦尼克號中更容易存活? 2.採集資料、理解資料 匯入資料分析工具庫Numpy、Pandas 用pan

ML之SVM:基於Js程式碼利用SVM演算法的實現根據Kaggle資料集預測生存人員

ML之SVM:基於Js程式碼利用SVM演算法的實現根據Kaggle資料集預測泰坦尼克號生存人員 實驗資料 設計思路   實現程式碼(部分程式碼) /** js程式碼實現SVM演算法 */ //ML之SVM:基於Js程式碼利用SVM演算法的實現根據Kagg

機器學習 (十七)kaggle競賽之專案實戰-2

導航        想寫這篇部落格的由衷是做完幾個專案,有時對於圖的畫法和模型融合演算法原理理解還很膚淺,特此加深一下印象。 內容概覽 圖 pandas、matplotlib、seaborn 餅圖 直方圖

機器學習 (八)kaggle競賽之專案實戰-1

引言        機器學習演算法都是為專案為資料服務的,某一個演算法都有它自己的適用範圍,以及優勢與劣勢,研究演算法由於平日的日常操練,那麼用它去做專案就如同上戰場殺敵一樣,去發揮它的價值,kaggle就是這樣一個刷怪升級

通過使用各種演算法(線性迴歸,邏輯迴歸,隨機森林,繼承演算法)預測上的某個人是否獲救

Python原始碼: #!/usr/bin/env python # encoding: utf-8 """ @Company:華中科技大學電氣學院聚變與等離子研究所 @version: V1.0 @author: Victor @contact: [email protected]

機器學習之遇難預測

思路: 一、資料預處理 1、資料讀取 2、可以用data.head()來顯示資料的前幾行,date.info()來顯示資料的資訊 3、缺失值的處理 4、挑選特徵 5、分離特徵和標籤 二、train 1、選取模型(可以先簡單後複雜,如果兩個模型效果差不多,簡單的節約時間

人工智障也刷題!Kaggle 入門之實戰

背景 關於 Kaggle www.kaggle.com/ 這是一個為你提供完美資料,為你提供實際應用場景,可以與小夥伴在資料探勘領域 high 的不要不要的的地方啊!!! Kaggle 是一個用來學習、分享和競賽的線上資料實驗平臺,有點類似 KDD—CUP(國際知識發現和資料探勘競賽),企

資料分析之案例

泰坦尼克號資料處理 【1】 實驗目錄 1 解釋步驟 2 處理資料 3 資料視覺化 4 修改資料 5 訓練模型 【2】 實驗步驟 1 解釋步驟 * 識別和定義問題 * 獲取訓練和測試資料 * 質疑,準備,清理資料 * 分析,識別模式並探索

Python|倖存者畫像

01 倖存者 泰坦尼克號的沉沒,是人為的悲劇,1800人罹難者近70%,讓我們一起來看看泰坦尼克號的倖存者都有哪些特徵吧。 先給出分析框架 一切的分析都建立在資料清洗之後 倖存率的分析非常重要,下面將按性別、年齡、倉位、登船碼頭4個維度分別觀察與倖存率的關

機器學習--決策樹及生存預測

決策樹是一個類似於流程圖的樹結構,分支節點表示對一個特徵進行測試,根據測試結果進行分類,樹葉節點代表一個類別。 要判斷從哪個特徵進行分裂,就要對資訊進行量化,量化的方式有: ID3: 資訊增益 條件熵: 其中pi=P(X=xi),X,Y代表了兩個事件,而它們之間有

tensorflow實現生存率預測(邏輯迴歸)

目錄 1 邏輯迴歸介紹          其實我們可以把邏輯迴歸當成只有一層的神經網路。關於邏輯迴歸的具體知識可以參考我的上一邊部落格,地址:https://mp.csdn.net/postedit/82929291。使用交叉熵損失函式

二分類問題(獲救預測)

# -*- coding: utf-8 -*- # @Time : 2018/12/13 10:46 # @Author : WenZhao # @Email : [email protected] # @File : tt.py # @Software: PyCha