1912년 RMS 타이타닉의 침몰은 역사상 가장 치명적인 해양 재해 중 하나로 남아 있습니다. 배가 빙산에 부딪혀 북대서양에서 침몰하면서 1,500명 이상의 사람들이 목숨을 잃었습니다. 그 후 몇 년 동안 높은 사망자 수에 기여한 요인을 이해하기 위해 광범위한 연구가 수행되었습니다.
승객 중 38%만이 이 파괴적인 사건에서 살아남았고, 그 운명적인 밤에 타이타닉에 탑승했던 사람들에 대해 궁금해졌습니다.
계급 구별이 탑승한 사람들의 운명을 결정하고 특권과 위험 사이의 구분을 만드는 역할을 했습니까? 잔혹한 바다에서 살아남은 사람과 굴복한 사람은 나이와 성별에 어떤 영향을 받았나요? 혼란스러운 상황 속에서도 가족들의 존재는 승객들에게 함께 폭풍을 이겨내도록 격려하고 위로와 지지를 제공했을까요? 그리고 승선항이 서로 다른 위치에서 승선한 사람들의 운명에 영향을 미쳤습니까?
다행히도 Kaggle에서 제공되는 Titanic 데이터 세트를 사용하여 이러한 질문에 답할 수 있습니다. 침몰한 지 100년 이상이 지난 지금, 우리는 데이터를 사용하여 티켓 가격이 생존에 어떤 영향을 미쳤는지, 비극적인 사건 중에 특정 객실 위치가 피난처를 제공했는지 여부를 이해할 수 있습니다. 이 탐색적 데이터 분석(EDA)은 승객의 경험에 대한 통찰력을 밝혀 그 운명적인 밤에 겪은 용기와 상실의 이야기를 조명합니다.
분석 중에 탐색할 몇 가지 통찰력은 다음과 같습니다.
타이타닉 데이터세트는 1912년에 침몰한 RMS 타이타닉호의 승객과 승무원에 대한 데이터 모음입니다. 이 데이터세트에는 각 승객의 이름, 나이, 성별, 티켓 등급 및 침몰에서 살아남았는지 여부에 대한 정보가 포함되어 있습니다. Titanic 데이터 세트는 기계 학습 및 데이터 과학 프로젝트에 널리 사용되는 데이터 세트입니다. 이는 승객의 특성을 기반으로 침몰에서 승객이 생존했는지 여부를 예측하기 위해 모델을 훈련하는 데 자주 사용됩니다. 타이타닉 데이터 세트는 소셜 네트워크와 인간 행동을 연구하는데도 사용됩니다.
Titanic 데이터 세트는 데이터 과학 커뮤니티인 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(Kernel Density Estimation) 플롯을 사용한 히스토그램을 활용했습니다. 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()
막대 그래프는 타이타닉 데이터세트의 승객 클래스에 따른 생존율을 보여줍니다. 승객 등급이 높을수록 생존율이 높다는 것은 플롯에서 분명합니다. 이러한 관찰은 더 높은 등급(1등석)의 승객이 구명정 및 안전 조치에 더 잘 접근할 수 있어 생존 가능성이 더 높다는 역사적 이해와 일치합니다. 반면, 하위등급(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()
막대 그래프는 타이타닉 데이터세트에서 승객의 승선항을 기준으로 한 생존율을 보여줍니다. 플롯을 분석하면 Cherbourg에서 탑승한 승객의 생존율이 가장 높고, Southampton에서 탑승한 승객의 생존율이 가장 낮음을 명확하게 확인할 수 있습니다.
이 시각화는 승선항에 따른 생존율의 변화에 대한 귀중한 통찰력을 제공하여 승객의 생존 가능성에 영향을 미칠 수 있는 잠재적 요인을 제시합니다.
승선항에 따른 생존율을 분석하기 위해 막대 그래프를 작성하였다. 각 막대는 승선 범주별 항구(Cherbourg, Queenstown, Southampton)의 생존자 비율을 나타냅니다. 플롯을 시각적으로 조사함으로써 다양한 승선 지점 간의 생존율에 상당한 차이가 있음을 확인할 수 있었습니다.
# 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()
그래프는 승선항과 승객 등급에 따른 생존율과 관련된 몇 가지 중요한 패턴을 보여줍니다. 셰르부르에서 탑승한 승객은 퀸스타운이나 사우샘프턴에서 탑승한 승객에 비해 생존율이 더 높았습니다.
이는 아마도 셰르부르가 첫 번째 기항지이고 더 많은 일등석 승객이 그곳에 승선할 가능성이 있기 때문일 것입니다. 또한, 프랑스 항구로서 프랑스 승객을 구하려는 편견이 있었을 수도 있습니다.
또한 그래프를 보면 일등석 승객이 이등석이나 삼등석 승객에 비해 생존율이 더 높은 것으로 나타났습니다. 이는 일등석 승객이 구조의 우선 순위로 간주되고 더 높은 사회적 지위와 인명 구조 조치를 취할 수 있는 잠재적 능력으로 인해 구명정에 대한 더 나은 접근성을 갖기 때문일 수 있습니다.
마지막으로, 모든 항만에서 주목할만한 추세는 승객 클래스가 감소함에 따라 생존율이 감소한다는 것입니다. 이는 승객 등급이 타이타닉호 생존의 중요한 결정 요인이었으며, 일등석 승객의 생존 가능성이 가장 높았음을 시사합니다. 승선항, 승객 등급 및 생존율 간의 관계를 분석하기 위해 히트맵을 작성했습니다. 히트맵은 승선항과 승객 등급의 다양한 조합에 대한 생존율 백분율을 나타냅니다. 히트맵을 검토함으로써 우리는 이 두 가지 요소를 기반으로 생존율의 패턴과 추세를 확인할 수 있었습니다.