1912 年泰坦尼克号沉没仍然是历史上最致命的海上灾难之一。当这艘船撞上冰山并沉没于北大西洋时,超过 1,500 人丧生。在接下来的几年里,人们进行了广泛的研究,以了解导致高死亡人数的因素。
只有 38% 的乘客在这场毁灭性的事件中幸存下来,这促使我想知道那个灾难性的夜晚泰坦尼克号上的乘客。
阶级差异是否在决定船上人员的命运方面发挥了作用,从而在特权和危险之间造成了鸿沟?年龄和性别如何影响谁在无情的大海中幸存和死亡?混乱之中,家人的在场是否给予了安慰和支持,敦促乘客共同面对风暴?登船港口是否影响了从不同地点登船的人的命运?
值得庆幸的是,我们可以使用 Kaggle 上提供的泰坦尼克号数据集来回答这些问题。沉没一百多年后,我们可以利用这些数据来了解机票价格如何影响生存,以及某些船舱位置是否在悲剧事件期间提供避难所。这种探索性数据分析 (EDA) 将深入了解乘客的经历,揭示他们在那个命运之夜的勇气和失落的故事。
以下是我们在分析过程中将探索的一些见解:
泰坦尼克号数据集是关于 1912 年沉没的 RMS 泰坦尼克号乘客和船员的数据集合。该数据集包含有关每位乘客的姓名、年龄、性别、机票舱位以及他们是否在沉没中幸存的信息。泰坦尼克号数据集是机器学习和数据科学项目的流行数据集。它通常用于训练模型,以根据乘客的特征来预测乘客是否在沉没中幸存。泰坦尼克号数据集还用于研究社交网络和人类行为。
泰坦尼克号数据集由数据科学社区 Kaggle 创建。该数据集可在 Kaggle 网站上免费下载。
您可以在此处获取数据集
让我们通过加载必要的模块和泰坦尼克号数据集开始分析
import pandas as pd import matplotlib.pyplot as plt import seaborn as sns # Load the Titanic dataset df = pd.read_csv('/kaggle/input/titanic/train.csv') df.head()
您可以看到该数据集包含我在本文介绍部分讨论过的每位乘客的所有信息。
现在,让我们开始使用 pandas 进行分析,并使用 matplotlib 和 seaborn 可视化见解。
# Calculate the overall survival rate survival_rate = df['Survived'].mean() * 100 # Create a bar plot to visualize the survival rate sns.set(style='darkgrid') plt.figure(figsize=(6, 4)) sns.countplot(x='Survived', data=df) plt.xlabel('Survived') plt.ylabel('Passenger Count') plt.title('Survival Rate: {:.2f}%'.format(survival_rate)) plt.xticks([0, 1], ['No', 'Yes']) plt.show()
条形图清晰、简洁地直观地表示了泰坦尼克号上乘客的总体生存率。报告显示,只有38%的乘客在这场灾难中幸存。
条形的高度代表每个类别中的乘客数量(0 表示非幸存者,1 表示幸存者)。情节标题中所示的生存率突出了在悲剧事件中幸存下来的乘客的百分比。
# Calculate the survival rate by gender survival_by_gender = df.groupby('Sex')['Survived'].mean() * 100 # Create a bar plot to visualize the survival rate by gender sns.set(style='darkgrid') plt.figure(figsize=(6, 4)) sns.barplot(x=survival_by_gender.index, y=survival_by_gender.values) plt.xlabel('Gender') plt.ylabel('Survival Rate') plt.title('Survival Rate by Gender') plt.show()
可以看到,所有幸存乘客中,70%以上是女性。与男性相比,女性的存活率明显更高,这是一个惊人的观察结果。
这种差异表明,性别在泰坦尼克号悲剧中决定生存机会方面发挥了至关重要的作用。
# Plot the distribution of passenger ages sns.set(style='darkgrid') plt.figure(figsize=(8, 6)) sns.histplot(data=df, x='Age', bins=20, kde=True) plt.xlabel('Age') plt.ylabel('Count') plt.title('Distribution of Passenger Ages') plt.show()
带有 KDE 图的直方图说明了泰坦尼克号上乘客年龄的分布。数据显示左偏分布,表明乘客中年轻人(尤其是 18 岁至 35 岁之间)的数量多于老年人或儿童。
为了分析乘客年龄的分布,我们使用带有 KDE(核密度估计)图的直方图。 x 轴代表不同的年龄区间(bin),而 y 轴显示属于每个年龄组的乘客数量。通过以这种方式可视化数据,我们能够辨别泰坦尼克号上年龄分布的倾斜性质,突出显示乘客中年轻人的比例。
# Calculate the survival rates by passenger class survival_by_class = df.groupby('Pclass')['Survived'].mean() * 100 # Create a bar plot to visualize the survival rates by passenger class sns.set(style='darkgrid') plt.figure(figsize=(6, 4)) sns.barplot(x=survival_by_class.index, y=survival_by_class.values) plt.xlabel('Passenger Class') plt.ylabel('Survival Rate') plt.title('Survival Rate by Passenger Class') plt.show()
条形图显示了泰坦尼克号数据集中乘客基于乘客类别的生存率。从图中可以看出,乘客等级越高,生存率越高。这一观察结果与历史认识一致,即较高舱位(一等舱)的乘客可以更好地使用救生艇和采取安全措施,这可能有助于提高他们的生存机会。相比之下,较低舱位(三等舱)的乘客在疏散过程中面临更多挑战,可能导致该群体的生存率较低。
为了分析基于乘客类别的生存率,我们创建了一个条形图。每个条形代表每个舱位类别(一等舱、二等舱或三等舱)幸存乘客的百分比。通过目视检查该图,我们能够识别不同乘客类别之间生存率的差异。条形的高度表示生存率,条形越高表示特定乘客类别的幸存者百分比越高。
# Create age groups age_bins = [0, 12, 18, 30, 50, 100] # Define the age group boundaries age_labels = ['Child', 'Teenager', 'Young Adult', 'Adult', 'Elderly'] # Define the age group labels df['AgeGroup'] = pd.cut(df['Age'], bins=age_bins, labels=age_labels, right=False) # Calculate the survival rates by age group survival_by_age_group = df.groupby('AgeGroup')['Survived'].mean() * 100 # Create a bar plot to visualize the survival rates by age group sns.set(style='darkgrid') plt.figure(figsize=(8, 6)) sns.barplot(x=survival_by_age_group.index, y=survival_by_age_group.values) plt.xlabel('Age Group') plt.ylabel('Survival Rate') plt.title('Survival Rate by Age Group') plt.show()
条形图显示了泰坦尼克号数据集中不同年龄段乘客的生存率。研究表明,某些年龄段的人,如儿童、成人和老年人,在灾难中的生存机会更高。这一观察结果表明,在疏散过程中,这些弱势年龄组得到了优先考虑,从而使他们的生存率更高。
为了分析基于年龄组的存活率,我们创建了一个条形图。每个条形代表特定年龄组的幸存者百分比。通过检查该图,我们能够观察不同年龄组之间生存率的差异。这使我们能够推断出,某些年龄段的人,如儿童、成人和老年人,在悲剧事件中得到了优先考虑,并且有更好的生存机会。这里采用的方法为年龄对生存结果的影响提供了宝贵的见解,反映了在灾难期间保护最脆弱乘客的人道主义努力。
# Calculate the survival rates by port of embarkation survival_by_embarkation = df.groupby('Embarked')['Survived'].mean() * 100 # Create a bar plot to visualize the survival rates by port of embarkation sns.set(style='darkgrid') plt.figure(figsize=(6, 4)) sns.barplot(x=survival_by_embarkation.index, y=survival_by_embarkation.values) plt.xlabel('Port of Embarkation') plt.ylabel('Survival Rate') plt.title('Survival Rate by Port of Embarkation') plt.show()
条形图显示了泰坦尼克号数据集中乘客的基于登船港口的生存率。通过分析该图,我们可以清楚地观察到,从瑟堡出发的乘客的生存率最高,而从南安普顿出发的乘客的生存率最低。
这种可视化提供了关于不同登船港口的生存率变化的宝贵见解,提出了可能影响乘客生存机会的潜在因素。
为了分析基于登船港口的生存率,我们创建了一个条形图。每个条形代表每个登船港口类别(瑟堡、皇后镇、南安普敦)的幸存者百分比。通过目视检查该图,我们能够识别不同登船点之间生存率的显着差异。
# Create fare groups fare_bins = [0, 50, 100, 150, 200, 300, 1000] # Define the fare group boundaries fare_labels = ['0-50', '50-100', '100-150', '150-200', '200-300', '300+'] # Define the fare group labels df['FareGroup'] = pd.cut(df['Fare'], bins=fare_bins, labels=fare_labels, right=False) # Calculate the survival rates by fare group survival_by_fare_group = df.groupby('FareGroup')['Survived'].mean() * 100 # Create a bar plot to visualize the survival rates by fare group sns.set(style='darkgrid') plt.figure(figsize=(8, 6)) sns.barplot(x=survival_by_fare_group.index, y=survival_by_fare_group.values) plt.xlabel('Fare Group') plt.ylabel('Survival Rate') plt.title('Survival Rate by Fare Group') plt.show()
该图显示,票价最高组(300+)的乘客存活率最高,其次是票价第二高组(200-300)。相反,随着票价组的减少,存活率下降,最低票价组(0-50)的乘客存活率最低。
这项分析表明,支付的票价在决定泰坦尼克号的生存机会方面发挥了重要作用。支付较高票价的乘客更有可能乘坐头等舱,总体存活率较高。
此外,这些支付较高费用的乘客可能在救援工作中得到优先考虑,从而提高了他们的生存率。为了分析票价组与生存率之间的关系,我们创建了一个条形图,显示每个票价组的生存百分比。该图表使我们能够根据票价组观察生存率的趋势,表明较高的票价与较高的生存率相关。
# Extract the cabin deck from the Cabin column df['CabinDeck'] = df['Cabin'].str.extract(r'([A-Za-z])') # Plot the distribution of passenger cabin locations sns.set(style='darkgrid') plt.figure(figsize=(10, 6)) sns.countplot(data=df, x='CabinDeck', order=sorted(df['CabinDeck'].dropna().unique())) plt.xlabel('Cabin Deck') plt.ylabel('Count') plt.title('Distribution of Passenger Cabin Locations') plt.show() # Calculate the survival rates by cabin deck survival_by_cabin_deck = df.groupby('CabinDeck')['Survived'].mean() * 100 # Create a bar plot to visualize the survival rates by cabin deck sns.set(style='darkgrid') plt.figure(figsize=(8, 6)) sns.barplot(x=survival_by_cabin_deck.index, y=survival_by_cabin_deck.values) plt.xlabel('Cabin Deck') plt.ylabel('Survival Rate') plt.title('Survival Rate by Cabin Deck') plt.show()
该图清楚地表明,随着客舱甲板水平面的降低,生存率呈下降趋势,其中 A 甲板上的乘客生存率最低。
这项分析表明,乘客舱的位置确实是影响他们在泰坦尼克号上生存机会的重要因素。较高甲板上的乘客可能更容易使用救生艇并且更容易获救。
此外,他们可能在救援行动中得到优先考虑,从而提高了他们的生存率。为了分析客舱甲板水平和生存率之间的关系,我们创建了一个条形图,显示每个甲板的生存百分比。通过检查图表,我们可以根据客舱甲板水平确定生存率的趋势。
# Create age groups age_bins = [0, 12, 18, 30, 50, 100] # Define the age group boundaries age_labels = ['Child', 'Teenager', 'Young Adult', 'Adult', 'Elderly'] # Define the age group labels df['AgeGroup'] = pd.cut(df['Age'], bins=age_bins, labels=age_labels, right=False) # Calculate the survival rates by age group and gender survival_by_age_gender = df.groupby(['AgeGroup', 'Sex'])['Survived'].mean() * 100 # Convert the survival rates into a pivot table for easier visualization survival_pivot = survival_by_age_gender.unstack() # Create a heatmap to visualize the survival rates by age group and gender sns.set(style='darkgrid') plt.figure(figsize=(8, 6)) sns.heatmap(data=survival_pivot, annot=True, cmap='coolwarm', fmt=".2f", cbar=True) plt.xlabel('Gender') plt.ylabel('Age Group') plt.title('Survival Rate by Age Group and Gender') plt.show()
热图直观地展示了泰坦尼克号数据集中不同年龄组和性别的乘客的生存率。通过分析热图,我们可以观察基于年龄和性别的生存率的模式和趋势,从而使我们能够确定哪些年龄和性别群体在灾难期间的生存机会更高或更低。热图中的颜色强度是一个清晰的指标,较深的颜色表示较高的存活率,较浅的颜色表示较低的存活率。
从热图中,我们可以得出一些见解。老年女性乘客的生存机会最高,而老年男性乘客的生存机会最低。此外,热图显示,一般来说,女性在所有年龄段的存活率都更高。这些观察结果揭示了年龄和性别对决定这场历史悲剧中乘客的生存结果的重大影响。
为了可视化基于年龄组和性别的存活率,我们使用了热图。热图中的每个单元格代表特定年龄组和性别组合的存活率(百分比)。通过检查热图中的颜色强度,我们能够辨别不同年龄和性别组之间生存率的差异。
# Calculate the total number of family members for each passenger df['FamilySize'] = df['SibSp'] + df['Parch'] + 1 # Calculate the survival rates by family size survival_by_family_size = df.groupby('FamilySize')['Survived'].mean() * 100 # Create a bar plot to visualize the survival rates by family size sns.set(style='darkgrid') plt.figure(figsize=(10, 6)) sns.barplot(x=survival_by_family_size.index, y=survival_by_family_size.values) plt.xlabel('Family Size') plt.ylabel('Survival Rate') plt.title('Survival Rate by Family Size') plt.show()
该图表明,家庭规模较大的乘客更有可能在泰坦尼克号沉没时幸存下来。家庭规模在1至4人之间的乘客的生存率随着家庭成员人数的增加而增加。
这一见解意义重大,因为它强调家庭规模是泰坦尼克号上生存的最强预测因素之一。家庭规模较大的乘客很可能一起旅行,这使他们成为救援工作的优先事项。
此外,拥有更多的家庭成员可能有助于相互支持,例如分享食物和水等资源,这可能有助于提高他们的生存机会。
为了分析家庭规模和生存率之间的关系,我们创建了一个条形图,显示每个家庭规模类别的生存百分比。通过直观地检查图表,我们可以确定家庭规模如何影响乘客的生存结果。
# Calculate the survival rates by port of embarkation and passenger class survival_by_embark_class = df.groupby(['Embarked', 'Pclass'])['Survived'].mean() * 100 # Convert the survival rates into a pivot table for easier visualization survival_pivot = survival_by_embark_class.unstack() # Create a heatmap to visualize the survival rates sns.set(style='darkgrid') plt.figure(figsize=(8, 6)) sns.heatmap(data=survival_pivot, annot=True, cmap='coolwarm', fmt=".2f", cbar=True) plt.xlabel('Passenger Class') plt.ylabel('Port of Embarkation') plt.title('Survival Rate by Port of Embarkation and Passenger Class') plt.show()
该图揭示了关于基于登船港口和乘客等级的生存率的几个重要模式。与从皇后镇或南安普敦出发的乘客相比,从瑟堡出发的乘客的生存率更高。
这可能是因为瑟堡是第一个停靠港,并且可能会有更多的头等舱乘客在那里登船。此外,作为法国港口,可能存在拯救法国乘客的偏见。
此外,该图还表明,头等舱乘客的生存率高于二等舱或三等舱乘客。这可以归因于头等舱乘客被视为救援的优先对象,并且由于他们较高的社会地位和承担救生措施的潜在能力而更容易使用救生艇。
最后,所有港口的一个显着趋势是随着乘客等级的下降,生存率也在下降。这表明乘客等级是泰坦尼克号上生存的重要决定因素,头等舱乘客的生存机会最高。为了分析登船港口、乘客等级和生存率之间的关系,我们创建了一个热图。热图表示登船港口和乘客等级不同组合的生存率百分比。通过检查热图,我们能够根据这两个因素确定生存率的模式和趋势。