kaggle上經典泰坦尼克項目數據分析探索

? ? ? ? 之前了解在kaggle上這個項目很火,最近想要加強一下python數據分析,所以在kaggle上找到這個項目進行學習探索,下面是將一些學習資料以及過程整理出來。

一、首先我們了解一下項目背景以及如何找到這個項目。

kaggle項目地址:

https://www.kaggle.com/code/alexisbcook/titanic-tutorial?scriptVersionId=99170538&cellId=5

進入頁面后會有背景介紹以及項目

我們先大概了解一下項目背景以及流程,找到項目所需要的數據源。

二、準備就緒,下面進入項目一起學習探索

import pandas as pdtrain_data = pd.read_csv(r'E:/train.csv')
test_data = pd.read_csv(r'E:/test.csv')
train_data.head(10)# 數據集概述
# 泰坦尼克號數據集是機器學習入門中一個非常著名的數據集,包含了乘客的個人信息以及他們的生死狀態。數據集主要包含以下字段:# PassengerI:乘客編號
# Survive:生存狀態(0代表未存活,1代表存活)
# Pclas:艙位等級
# Nam:乘客姓名
# Se:性別
# Ag:年齡
# SibS:同艙兄弟姐妹或配偶的數量
# Parc:同行父母或子女的數量
# Ticke:票號
# Far:票價
# Cabi:艙位
# Embarke:登船港口

查看導入train數據結果:

查看導入的test數據結果:

test_data.head(10)

查看數據基本信息

# 查看數據基本信息
train_data.info()

test_data.info()

查看數據空值情況

# 檢查各個字段的空值情況
train_data.isnull().sum()

說明:從結果看到Age、Cabin和Embarked明顯有空值

test_data.isnull().sum()

查看一下數據描述

train_data.describe()

test_data.describe()

?

# 計算女性獲救的概率
women = train_data.loc[train_data.Sex == 'female']["Survived"]
rate_women = sum(women)/len(women)print("% of women who survived:", rate_women)

?

# 計算男性獲救的概率
men = train_data.loc[train_data.Sex == 'male']["Survived"]
rate_men = sum(men)/len(men)print("% of men who survived:", rate_men)

?

# 學習第一個機器學習模型隨機森林來預測乘客的獲救可能
from sklearn.ensemble import RandomForestClassifiery = train_data["Survived"]# 指定相關的特性列
features = ["Pclass", "Sex", "SibSp", "Parch"]
# 將features轉換為啞變量
X = pd.get_dummies(train_data[features])
X_test = pd.get_dummies(test_data[features])model = RandomForestClassifier(n_estimators=100, max_depth=5, random_state=1)
model.fit(X, y)
predictions = model.predict(X_test)output = pd.DataFrame({'PassengerId': test_data.PassengerId, 'Survived': predictions})
output.to_csv('submission.csv', index=False)
print(output.head(10))
print("Your submission was successfully saved!")

?

# 上面部分是根據實例kaggle上面的例子,下面我們再對數據做一些探索
# 需求:引入seaborn來研究已知存活的數據中存活比例
# 結論:在891名乘客中,其中存活的比例為36.38%,溺水的比例為61.62%
import seaborn as sns
import matplotlib.pyplot as plt
sns.set()
sns.set_style('ticks')
train_data['Survived'].value_counts().plot.pie(labels = ['downed','survived'],
explode=(0,0.05),shadow = True,autopct = '%.2f%%',fontsize=15)
plt.show()

?

#年齡分布情況
# 需求:
# 1、年齡的分布情況
# 2、男性和女性的存活情況
# 3、大人和小孩的存活情況# 結論
# 年齡分布呈現右偏,大部分數據集中在20歲到40歲之間,最小年齡是0.42,最大年齡是80fig,ax = plt.subplots(1,2,figsize=(15,7))
age = train_data[train_data['Age'].notnull()]
age['Age'].hist(bins=50,histtype='bar',edgecolor='k',ax=ax[0])age['Age'].plot.box(showfliers=False, color = {'boxes':'DarkGreen', 'whiskers':'DarkOrange', 'medians':'DarkBlue', 'caps':'Gray'},grid=True,ax=ax[1])
pd.DataFrame(age['Age'].describe()).transpose()

?

# 需求:按照存活狀態分布的年齡情況
# 結論:幸存者的年齡整體比溺水的年齡小,幸存者數據有一個明顯的異常值,80歲的幸存者,需要檢查一下。import numpy as npplt.figure(figsize=(15, 3))
#顯示漢字
plt.rcParams['font.sans-serif'] = ['SimHei']sns.boxplot(y = 'Survived', x = 'Age', data = train_data,palette=["#3f3e6fd1", "#85c6a9"], fliersize = 0, orient = 'h')
#orient:"v"|"h" 用于控制圖像使水平還是豎直顯示
#fliersize:異常值大小sns.stripplot(y = 'Survived', x = 'Age', data = train_data,linewidth = 0.6, palette=["#3f3e6fd1", "#85c6a9"], orient = 'h')plt.yticks( np.arange(2), ['drowned', 'survived'],fontsize= 15)
plt.title('乘客的年齡分布情況',fontsize= 15)
plt.ylabel('存活狀態')
plt.tight_layout()pd.DataFrame(train_data.groupby('Survived').Age.describe())

?

# 需求:由于有一個異常數據,這里簡單修正數據
# 結論:異常值的影響不大,結論仍然是年齡偏小的獲救概率較大
train_data.loc[train_data['Age']==80,'Age'] = 48
train_data[train_data['Name']=='Barkworth, Mr. Algernon Henry Wilson']pd.DataFrame(train_data.groupby('Survived').Age.describe())

?

?

#男性和女性存活情況
s_sex = train_data[train_data['Survived']==1][['Sex','Survived']].groupby('Sex').count()s_sex.plot.bar(rot=0)print(
'女性存活率為%0.2f%%,男性存活率為%0.2f%%'
%(s_sex.loc['female']/s_sex.sum()*100,s_sex.loc['male']/s_sex.sum()*100))

?

# 按照不同船艙等級劃分: 船艙等級越高,存活者年齡越大,船艙等級1存活年齡集中在20-40歲,船艙等級2/3中有較多低齡乘客存活
# 按照性別劃分 : 男性女性存活者年齡主要分布在20-40歲,且均有較多低齡乘客,其中女性存活更多
# 按照不同船艙等級看存活的男女比例: 1、3等艙存活的男性大部分為20到50,2等艙幸存男性年齡偏低
# 年齡與存活的關系
age = train_data[train_data['Age'].notnull()]
s_age = age[age['Survived']==1]fig,ax = plt.subplots(1,3,figsize=(15,5))sns.violinplot(x='Pclass',y='Age',hue='Survived',data = age,split=True,ax=ax[0],grid=True)
ax[0].set_yticks(range(0,110,10))sns.violinplot('Sex','Age',hue='Survived',data=age,split=True,ax=ax[1])
ax[1].set_yticks(range(0,110,10))sns.violinplot('Pclass','Age',hue='Sex',data=s_age,split=True,ax=ax[2])
ax[2].set_yticks(range(0,110,10))plt.tight_layout()

?

age = train_data[train_data['Age'].notnull()]
age['age_int']=age['Age'].astype(int)
a = age[['Survived','age_int']].groupby('age_int',as_index=False).mean()
#計算均值相當于計算存活率plt.figure(figsize=(15,4))
sns.barplot(x ='age_int',y='Survived',data=a, palette = 'BrBG')

?

# 結合 SibSp、Parch字段,研究親人多少與存活的關系
# 要求:
# 1、有無兄弟姐妹/父母子女和存活與否的關系
# 2、親戚多少與存活與否的關系#計算家庭大小
train_data['family_size']=train_data['SibSp']+train_data['Parch']+1
train_data['family_size'].value_counts()

?

# 家庭大小與存活的關系
# 有兩個大小分別為8和11的大家族,其訓練數據集中的所有成員均被淹死。
# 大多數乘客獨自旅行,生存率不是很高。
# 在船上有4位家庭成員的人群中,幸存的乘客比例最大。fig = plt.figure(figsize=(12,5))ax1 = fig.add_subplot(121)ax = sns.countplot(train_data['family_size'])
labels = (train_data['family_size'].value_counts())
for i, v in enumerate(labels):ax.text(i, v+6, str(v), horizontalalignment = 'center', size = 10, color = 'black')
plt.ylabel('乘客數')  
plt.title('按照家庭數量分布的乘客情況')ax2 = fig.add_subplot(122)a = train_data.groupby('family_size')['Survived'].value_counts(normalize=True).unstack()
a.plot(kind='bar',stacked='True',color=["#3f3e6fd1", "#85c6a9"],rot=0,ax =ax2)
plt.legend(( 'Drowned', 'Survived'), loc=(1.04,0))
plt.title('按照家庭數量分布的存活情況')
plt.tight_layout()

?

# 結合票的費用情況,研究票價和存活與否的關系
# 要求:
# 1、 票價分布和存活與否的關系
# 2、比較研究生還者和未生還者的票價情況# 票價分布和存活與否的關系
# 結論:生還者的平均票價要大于未生還者的平均票價fig, ax=plt.subplots(1,2,figsize=(15,4))
train_data['Fare'].hist(bins=70, ax = ax[0])
train_data.boxplot(column='Fare', by='Pclass', showfliers=False,ax = ax[1])
# 查看票價分布情況fare_not_survived = train_data['Fare'][train_data['Survived'] == 0]
fare_survived = train_data['Fare'][train_data['Survived'] == 1]
# 基于票價,篩選出生存與否的數據
average_fare = pd.DataFrame([fare_not_survived.mean(),fare_survived.mean()])
std_fare = pd.DataFrame([fare_not_survived.std(),fare_survived.std()])
average_fare.plot(yerr=std_fare,kind='bar',legend=False,figsize = (15,4),grid = True)
# 查看票價與是否生還的關系
plt.tight_layout()

?

# 結合出發地的情況,研究出發地點與存活的關系
#大多數乘客登上南安普敦。 南安普敦的溺水乘客比例最大。
#從瑟堡出發的乘客,其中50%以上存活(在訓練數據集中)。
#皇后鎮出發的乘客中,絕大多數是三等艙乘客。fig = plt.figure(figsize = (15,4))ax1 = fig.add_subplot(131)
palette = sns.cubehelix_palette(5, start = 2)
ax = sns.countplot(train_data['Embarked'], palette = palette, order = ['C', 'Q', 'S'], ax = ax1)
plt.title('不同港口出發的乘客分布情況')
plt.ylabel('乘客數')labels = (train_data['Embarked'].value_counts())
labels = labels.sort_index()for i, v in enumerate(labels):ax.text(i, v+10, str(v), horizontalalignment = 'center', size = 10, color = 'black')ax2 = fig.add_subplot(132)
surv_by_emb = train_data.groupby('Embarked')['Survived'].value_counts(normalize = True)
surv_by_emb = surv_by_emb.unstack().sort_index()
surv_by_emb.plot(kind='bar', stacked='True', color=["#3f3e6fd1", "#85c6a9"], ax = ax2)
plt.title('不同港口出發的乘客存活情況')
plt.legend(( 'Drowned', 'Survived'), loc=(1.04,0))
_ = plt.xticks(rotation=False)ax3 = fig.add_subplot(133)
class_by_emb = train_data.groupby('Embarked')['Pclass'].value_counts(normalize = True)
class_by_emb = class_by_emb.unstack().sort_index()
class_by_emb.plot(kind='bar', stacked='True', color = ['#eed4d0', '#cda0aa', '#a2708e'], ax = ax3)
plt.legend(('1st class', '2nd class', '3rd class'), loc=(1.04,0))
plt.title('不同港口出發的乘客的船艙等級分布')
_ = plt.xticks(rotation=False)plt.tight_layout()

?

總結:

我們知道泰坦尼克號上沒有足夠的船只可供所有乘客撤離。 在研究了有關乘客的信息之后,我們可以對誰在沉船事故中有更好的生存機會以及對乘客的
一般觀察做出一些假設。

1、數據集中有891名乘客,其中有549名(61.6%)被淹,只有342名(38.4%)幸存。 但是我們知道,救生艇(16艘木質救生艇和4輛可折疊救生艇)
可以載運總乘客的53%。


2、所有乘客的年齡從0.17年到80歲不等,平均為29.88歲。 幸存乘客的平均年齡為28.23,比溺水乘客的平均年齡(僅我們知道幸存者的年齡)小2.39。
看起來年輕人有更大的生存機會。


3、船上的家庭人數似乎也對生存機會有影響:有兩個大家庭,分別為8和11,他們來自訓練數據集的所有成員都被淹死了。 我們可以觀察到,擁有2人,
3人,4人家庭的幸存者所占百分比大于單身人士,然后,隨著家庭規模的增加,幸存者所占的百分比會降低。


4、泰坦尼克號的大部分乘客都是三等艙。 就乘客人數而言,第二類是最小的。 盡管有先前確定的先決條件(平均而言,老年人死亡的可能性更高,
并且頭等艙的平均年齡比其他艙位更高。而且,由100%頭等艙組成的A層乘客的 溺水乘客的比例很高),頭等艙的幸存者人數最多,而艙內幸存者的
比例最大。


5、三等艙機票的溺水乘客人數最多。但是,大多數頭等艙的男性乘客被淹死,而女性幾乎全部幸存下來。 三等艙,一半的女性得以幸存。


6、船上的男性總體上比女性多,這對每個艙位來說都是公平的,但是在三等艙中,男性的數量是女性的兩倍多。


7、幾乎有600名男性旅客沒有家庭成員,只有200名女性,但是在普通家庭和大家庭中,女性旅客略多。


8、大多數乘客(914)登上南安普敦。 此外,南安普敦的溺水乘客比例最大。 270名乘客登上瑟堡,其中50%以上幸存下來(在培訓數據集中)。?
皇后鎮(Queenstown)出發的旅客有123人,其中絕大多數是三等艙旅客。


9、泰坦尼克號幸存者分析是機器學習的入門案例,我做了一點資料的查詢發現有一些是數據無法體現的,不得不說單從數據的角度還原當時情況
實在有很多不妥的地方,原因有以下幾點:


(1)三等艙乘客中相當一部分是不懂英語的,看不懂路標指示,聽不懂船員的指令。這一因素與社會地位無關。

(2)愛德華·約翰·史密斯船長在最后時刻下令“婦孺優先”,但是大副、二副對該命令的執行是不一致的,右舷大副默多克認為如果甲板上沒有
女士兒童了,只要還有空位,男性乘客也可以登艇。所以從右舷放下的九艘救生艇上都有男性乘客,救生艇的乘坐率也比較高,其中有三艘滿員。
而在左舷的二副萊托勒則把“女士和兒童優先”理解為“全船的女士和兒童都應當先于男性乘客登艇”。所以,左舷的救生艇其實是
“僅限女士和兒童”。從左舷放下的九艘救生艇中,只有三艘乘坐率略超過六成。

(3)考察頭等艙幸存男性,他們主要集中右舷最早放下的三艘救生艇中,第一艘救生艇,一半座位是空的,一半乘客是男性,主要原因是一開始多數人
都沒有認識到被認為“永不沉沒”的鐵達尼所面臨的的危險。第二艘、第三艘救生艇男性乘客也占了近三分之一。還有一個原因是,右舷的救生艇位置
距離頭等艙近。

(4)有少部分人主動放棄等艇機會,這樣行為無疑閃爍著人性光輝。

所以單從數據的角度得出的結論顯然不足以說明當時的情況。電影《薩利機長》中,計算機的模擬還原的情況是飛機完全可以不必迫降在河面,
也是數字還原結果與現實的不符。所以只知道分析數據的分析師不是好的分析師,結合對業務的理解才是關鍵,數據是輔助。

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/898725.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/898725.shtml
英文地址,請注明出處:http://en.pswp.cn/news/898725.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

《深度剖析:鴻蒙系統不同終端設備的UI自適應布局策略》

在萬物互聯的時代,鴻蒙系統以其獨特的分布式理念和強大的技術架構,迅速在智能終端領域嶄露頭角。隨著鴻蒙生態的不斷壯大,越來越多的開發者投身其中,致力于為用戶打造豐富多樣的應用體驗。然而,如何讓應用在不同終端設…

計算機網絡的軟件、硬件和組成

1.計算機網絡的組成 計算機網絡是一個十分復雜的系統,在邏輯上可以分為完成數據通信的通信子網和進行數據處理的資源子網兩個部分。 通信子網 通信子網提供網絡通信的功能,可以完成網絡主機之間的數據傳輸、交換、通信控制和信號變換等通信…

告別低效人工統計!自動計算計劃進度

實時監控任務進度一直是項目管理中的一項巨大挑戰。 人工統計方式不僅耗時耗力,而且往往由于信息傳遞的延遲和人為誤差,導致無法實時獲得準確的項目進展信息。 這種不準確性可能掩蓋潛在的風險點,從而影響項目的整體進度和成果。 Ganttable …

樓宇自控系統的結構密碼:總線與分布式結構方式的差異與應用

在現代建筑中,為了實現高效、智能的管理,樓宇自控系統變得越來越重要。它就像建筑的 智能管家,可自動控制照明、空調、通風等各種機電設備,讓建筑運行更順暢,還能節省能源成本。而在樓宇自控系統里,有兩種關…

OpenWrt開發第4篇:設置開發板的IP-基于Raspberry Pi 4B開發板

文/指尖動聽知識庫-谷谷 文章為付費內容,商業行為,禁止私自轉載及抄襲,違者必究!!! 文章專欄:Openwrt開發-基于Raspberry Pi 4B開發板 有時候開發過程中經常會使用其他路由器,很多時候固件燒上去之后板子IP基本都是192.168.1.1,這時就需要修改板子的IP,下面介紹一下板…

Node.js系列(4)--微服務架構實踐

Node.js微服務架構實踐 🔄 引言 微服務架構已成為構建大規模Node.js應用的主流選擇。本文將深入探討Node.js微服務架構的設計與實現,包括服務拆分、服務治理、通信機制等方面,幫助開發者構建可擴展的微服務系統。 微服務架構概述 Node.js…

Docker逃逸

判斷是否再docker中 1.ls -a / (查看c根目錄查看是否有docker配置文件) 2.查看進程 如果在要逃逸到真實環境中: 特權模式進行docker逃逸:管理員執行eddocker run--privileg,如何判斷是否是特權模式() 特權模式以…

Vite管理的Vue3項目中monaco editer的使用以及組件封裝

文章目錄 背景環境說明安裝流程以及組件封裝引入依賴封裝組件 外部使用實現效果 v-model實現原理 背景 做oj系統的時候,需要使用代碼編輯器,決定使用Monaco Editor,但是因為自身能力問題,讀不懂官網文檔,最終結合ai和網友的帖子成功引入&…

pdf文件分頁按需查看

pdf預覽本來打算粗暴點,一次性查看全部,但是一個pdf四五百頁導致手機端查看超出內存直接崩掉,崩掉會導致頁面瘋狂刷新,所以不得不進行優化 解決思路大致如下: canvas轉為blob格式以圖片的形式加載在頁面(B…

算力100問?第92問:為什么各地熱衷建設算力中心?

目錄 1、宏觀分析 2、政府角度分析 3、投資者角度分析 在數字化浪潮中,各地對算力中心建設的熱情高漲,這一現象背后潛藏著諸多深層次的原因,涵蓋了經濟、科技、社會等多個維度,且彼此交織,共同驅動著這一發展趨勢。 1、宏觀分析 從經濟結構轉型的底層邏輯來看,全球經…

Redis 內存管理

Redis 內存管理 1. Redis 給緩存數據設置過期時間的作用 給緩存數據設置過期時間(TTL, Time-To-Live)有以下幾個重要作用: (1) 自動釋放內存 避免緩存數據無限增長,導致 Redis 內存溢出。例如,在 會話管理、短連接…

PyCharm中使用pip安裝PyTorch(從0開始僅需兩步)

無需 anaconda,只使用 pip 也可以在 PyCharm 集成環境中配置深度學習 PyTorch。 本文全部信息及示范來自 PyTorch 官網。 以防你是super小白: PyCharm 中的命令是在 Python Console 中運行,界面左下角豎排圖標第一個。 1. 安裝前置包 numpy …

掌握新編程語言的秘訣:利用 AI 快速上手 Python、Go、Java 和 Rust

網羅開發 (小紅書、快手、視頻號同名) 大家好,我是 展菲,目前在上市企業從事人工智能項目研發管理工作,平時熱衷于分享各種編程領域的軟硬技能知識以及前沿技術,包括iOS、前端、Harmony OS、Java、Python等…

如何理解java中Stream流?

在Java中,Stream 是 Java 8 引入的一個強大API,用于處理集合(如 List、Set、Map 等)數據的流式操作。它提供了一種聲明式、函數式的編程風格,可以高效地進行過濾、映射、排序、聚合等操作。 Stream 的核心概念 流&…

【Vitis AIE】FPGA快速部署ConvNet 示例MNIST數據集

AIE-ML 上的 MNIST ConvNet 版本:Vitis 2024.2 簡介 本教程在 AMD VersalTM 自適應 SoC AIE-ML 上實現了一個卷積神經網絡分類器,用于識別來自 MNIST 數據庫 的手寫數字。目標是說明如何將一個簡單的機器學習示例分區和向量化到 Versal AI 引擎。MNIS…

ubuntu桌面圖標異常——主目錄下的所有文件(如文檔、下載等)全部顯示在桌面

ubuntu桌面圖標異常 問題現象問題根源系統級解決方案方法一:全局修改(推薦多用戶環境)方法二:單用戶修改(推薦個人環境)操作驗證與調試避坑指南擴展知識參考文檔問題現象 主目錄文件異常顯示 用戶主目錄(如/home/user/)下的所有文件(如文檔、下載等)全部顯示在桌面,…

OceanBase 4.3.3 AP 解析:應用 RoaringBitmaps 類型處理海量數據的判重和基數統計

對于大數據開發人員而言,處理海量數據的判重操作和基數統計是常見需求,而 RoaringBitmap類型及其相關函數是當前非常高效的一種解決方案,許多大數據庫產品已支持RoaringBitmap類型。OceanBase 4.3.3版本,作為專為OLAP場景設計的正…

W25Qxx

概述 FLASH FLASH是一種是非易失性存儲器,即掉電后不會丟失數據,這和RAM(隨機存儲器)不同。 FLASH比起同作用的EEPROM有價格低的優點 FLASH的擦除操作是以扇區為單位的(比起EEPROM來說操作較為不方便) 芯片…

(滑動窗口)算法訓練篇11--力扣3.無重復字符的最長字串(難度中等)

目錄 1.題目鏈接:3.無重復字符的最長字符 2.題目描述: 3.解法(滑動窗口): 1.題目鏈接:3.無重復字符的最長字符 2.題目描述: 給定一個字符串 s ,請你找出其中不含有重復字符的 最長 子串 的長度。 示例…

深度學習1—Python基礎

深度學習1—python基礎 你的第一個程序 print(hello world and hello deep learning!)基本數據結構 空值 (None):在 Python 中,None 是一個特殊的對象,用于表示空值或缺失的值。它不同于數字 0,因為 0 是一個有意義的數字&#…