1912 年の RMS タイタニック号の沈没は、依然として史上最悪の海難事故の 1 つです。船が氷山に衝突し、北大西洋に沈没し、1,500人以上が命を落とした。その後数年間、死者数の多さに寄与した要因を理解するために広範な研究が行われた。
この壊滅的な出来事で生き残った乗客はわずか 38% でした。私は、運命の夜にタイタニック号に乗っていた人々について疑問を抱きました。
階級の違いが船内の人々の運命を決定する役割を果たし、特権と危険の間の溝を生み出したのでしょうか?年齢と性別は、容赦ない海で誰が生き残り、誰が亡くなったのかにどのような影響を与えたのでしょうか?混乱のさなか、家族の存在は慰めと支えとなり、乗客たちに一緒に嵐に立ち向かうよう促したのだろうか?そして、乗船港は、さまざまな場所から乗船した人々の運命に影響を与えたのでしょうか?
ありがたいことに、Kaggle で利用できる Titanic データセットを使用して、これらの質問に答えることができます。沈没から 100 年以上が経過した現在、このデータを利用して、航空券の価格が生存にどのような影響を与えたのか、また、特定の船室の場所が悲劇的な出来事の際に避難場所となったかどうかを理解することができます。この探索的データ分析 (EDA) により、乗客の体験に関する洞察が明らかになり、運命の夜の勇気と喪失の物語に光が当てられます。
分析中に調査する洞察の一部を次に示します。
タイタニック号のデータセットは、1912 年に沈没した RMS タイタニック号の乗客と乗組員に関するデータのコレクションです。このデータセットには、各乗客の名前、年齢、性別、チケットのクラス、および沈没時に生き残ったかどうかに関する情報が含まれています。タイタニック データセットは、機械学習およびデータ サイエンス プロジェクトで人気のあるデータセットです。これは、特徴に基づいて乗客が沈没時に生き残ったかどうかを予測するモデルをトレーニングするためによく使用されます。タイタニック号のデータセットは、ソーシャル ネットワークと人間の行動を研究するためにも使用されます。
タイタニックのデータセットは、データ サイエンス コミュニティである Kaggle によって作成されました。このデータセットは、Kaggle Web サイトから無料でダウンロードできます。
データセットはここから入手できます
必要なモジュールとタイタニック データセットをロードして分析を開始しましょう
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 軸はさまざまな年齢層 (ビン) を表し、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()
棒グラフは、タイタニック号のデータセット内の乗客の乗客クラスに基づく生存率を示しています。プロットから、乗客クラスが高くなるほど生存率が高くなることがわかります。この観察は、より高いクラス(一等クラス)の乗客は救命ボートや安全対策へのアクセスが良く、それが生存の可能性を高めることに貢献した可能性が高いという歴史的理解と一致しています。対照的に、下位クラス (3 等クラス) の乗客は避難の過程でより多くの困難に直面し、そのグループの生存率が低下する可能性がありました。
乗客クラスに基づいて生存率を分析するために、棒グラフを作成しました。各バーは、クラス カテゴリ (1 等、2 等、または 3 等) ごとに生存した乗客の割合を表します。プロットを視覚的に検査することで、異なる乗客クラス間の生存率の差異を特定することができました。バーの高さは生存率を示し、バーが高いほど特定の乗客クラスの生存率が高いことを示します。
# 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 名以上) の乗客の生存率が最も高く、次に 2 番目に高い運賃グループ (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 人までの乗客の生存率は、家族の人数が増えるにつれて増加しました。
この洞察は、タイタニック号での生存を予測する最も強力な要因の 1 つとして家族の規模を強調しているため、重要です。家族の人数が多い乗客は一緒に旅行していた可能性が高く、救助活動の優先事項となっていた。
さらに、より多くの家族がいることで、食料や水などの資源を共有するなどの相互支援が容易になった可能性があり、これが生存の可能性を高めることに貢献した可能性があります。
家族の人数と生存率の関係を分析するために、家族の規模のカテゴリごとに生存率を表示する棒グラフを作成しました。グラフを視覚的に調べることで、家族の人数が乗客の生存結果にどのような影響を与えたかを特定できました。
# 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()
このグラフは、乗船港と乗客クラスに基づいた生存率に関するいくつかの重要なパターンを明らかにしています。シェルブールから乗船した乗客は、クイーンズタウンやサウサンプトンから乗船した乗客と比べて生存率が高かった。
これはおそらく、シェルブールが最初の寄港地であり、より多くのファーストクラスの乗客がそこに乗船する可能性があるためであると考えられます。さらに、フランスの港として、フランス人の乗客を救うことに偏見があった可能性があります。
さらに、グラフは、1 等の乗客の生存率が 2 等または 3 等の乗客に比べて高いことを示しています。これは、ファーストクラスの乗客が社会的地位が高く、救命措置を講じる潜在的な能力があるため、救助の優先順位が高く、救命ボートへのアクセスが容易であることに起因すると考えられます。
最後に、すべての港で顕著な傾向は、乗客クラスが減少するにつれて生存率が低下していることです。これは、乗客クラスがタイタニック号での生存の重要な決定要因であり、ファーストクラスの乗客が生存の可能性が最も高いことを示唆しています。乗船港、乗客クラス、生存率の関係を分析するために、ヒートマップを作成しました。ヒートマップは、乗船港と乗客クラスのさまざまな組み合わせにおける生存率のパーセンテージを表します。ヒートマップを調べることで、これら 2 つの要素に基づいて生存率のパターンと傾向を特定することができました。