飞机失事的教训:Python 回顾济州航空坠机事件

2024 年 12 月 29 日,济州航空坠机的噩耗令我们震惊。 在此艰难时刻,我们向遇难者及其家属表示最深切的慰问。

谨以此文献给那些在悲惨事故中丧生的人们,并通过数据驱动的洞察力来分析和学习飞机事故。我希望我们能一起反思、学习,并建设一个更安全的未来。

飞机事故数据概览

在本帖中,我们使用了 Kaggle 飞机事故数据集包含大量与航空事故有关的信息,是数据分析和安全改进研究的重要资源。数据集的主要特点包括

数据集名称为 航空事故数据库概要 到、 美国国家运输安全委员会(NTSB)的航空事故数据库。详细数据集可参见 Kaggle 上的航空事故数据库概要 了解更多信息。

Kaggle 数据集概览摘要

项目说明
数据集名称航空事故数据库概要
资料来源美国国家运输安全委员会(NTSB)
许可证CC0 1.0 通用
主要栏目活动日期事件发生日期
地点, 国家事件地点
宽广的飞行阶段:飞行阶段
天气情况: 天气状况
致命伤总数死亡人数
可能原因负责部门: 事件起因
使用目的- 分析事件趋势、改进技术和制定政策

数据集特征

  • 事件发生的时间和地点按事件发生年份和地点对数据进行可视化,以分析模式。
  • 按飞行阶段分列的事故识别特定阶段(如着陆、起飞)的事故趋势。
  • 损坏程度评估:通过死亡、受伤和幸存者人数来评估事件的严重性。

该数据集对飞机事故进行了分析,为防止客机坠毁等灾难性事件的发生提供了实用的见解。

用 Python 可视化技术分析飞机事故数据

Python是一种多用途编程语言,可帮助研究人员和分析人员在复杂的数据集中发现真知灼见。利用 Python 可视化技术分析飞机事故,可以找出事故模式和异常值,以便做出决策和改进技术。

下面是用 Python 对飞机事故数据进行可视化的代码片段。 这种分析可以帮助您更深入地了解可能导致最近济州航空空难等悲剧的趋势。代码较长,但我们已在结尾部分将其分解为易于理解的代码演练。

设置 # Kaggle API 并下载数据
!pip install kaggle -q # 安装 Kaggle 库
导入 os
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
import plotly.express as px

设置 # Kaggle API 密钥
os.environ['KAGGLE_CONFIG_DIR'] = '/content' # 设置为当前目录
!chmod 600 /content/kaggle.json # 设置权限

# 下载 Kaggle 数据集
!kaggle datasets download -d khsamaha/aviation-accident-database-synopses -p /content/aviation_data --unzip

加载 # 数据
file_path = "/content/aviation_data/AviationData.csv" 文件路径
df = pd.read_csv(file_path, encoding='ISO-8859-1', low_memory=False)

检查并更正 # 列名
df.rename(columns={"Event Date":"Event_Date", "Broad.phase.of.flight":"Phase_of_Flight"}, inplace=True)

# 转换日期并创建年份
df.rename(columns={'Event.Date': 'Event_Date'}, inplace=True)
df['Event_Date'] = pd.to_datetime(df['Event_Date'], errors='coerce')
df['Year'] = df['Event_Date'].dt.year

删除有 # 缺失值的行
df = df.dropna(subset=['Phase_of_Flight'])

统计每个 # 飞行阶段的事件数量
phase_counts = (
    df.groupby(['Phase_of_Flight', 'Year'])
    .size()
    .reset_index(name='count')
)

# matplotlib 默认字体设置(避免警告)
plt.rcParams['font.family'] = 'DejaVu Sans' # Colab 默认支持的字体

# 1.按飞行阶段分列的事故总数(柱形图)
plt.figure(figsize=(12, 6))
total_by_phase = phase_counts.groupby('Phase_of_Flight')['count'].sum().sort_values()
sns.barplot(x=total_by_phase.values, y=total_by_phase.index, palette='viridis')
plt.title('Total Accidents by Phase of Flight')
plt.xlabel('事故数量)
plt.ylabel("飞行阶段)
plt.tight_layout()
plt.show()

# 2.按飞行阶段分列的年度事故趋势(折线图)
plt.figure(figsize=(15, 8))
for phase_counts['Phase_of_Flight'].unique():
    phase_data = phase_counts[phase_counts['Phase_of_Flight'] == phase].
    plt.plot(phase_data['Year'], phase_data['count'], marker='o', label=phase)

plt.title('Annual Accident Trends by Phase of Flight')
plt.xlabel('Year')
plt.ylabel('事故数量)
plt.legend(bbox_too_anchor=(1.05, 1), loc='upper left')
plt.grid(True, alpha=0.3)
plt.tight_layout()
plt.show()

# 3.按年份和飞行阶段分列的事故热图
pivot_data = phase_counts.pivot(index='Phase_of_Flight', columns='Year', values='count')
plt.figure(figsize=(15, 8))
sns.heatmap(pivot_data, cmap='viridis', cbar_kws={'label': '事故数量'})
plt.title('Accidents by Year and Phase of Flight (Heatmap)')
plt.xlabel('Year')
plt.ylabel("飞行阶段)
plt.tight_layout()
plt.show()

# 4. 按飞行阶段划分的事故比例(过去 10 年 - 交互式饼图)
max_year = df['Year'].max()
recent_data = df[df['Year'] >= max_year - 10].
recent_counts = (
    recent_data.groupby('Phase_of_Flight')
    .size()
    .reset_index(name='count')
)
recent_counts['percentage'] = recent_counts['count'] / recent_counts['count'].sum() * 100

fig = px.pie(
    recent_counts、
    values='percentage'、
    names='Phase_of_Flight'、
    title='按飞行阶段划分的事故比例(过去 10 年)'、
    color_discrete_sequence=px.colours.sequential.Viridis
)
fig.show()

# 5. 月度事故模式(折线图)
df['Month'] = df['Event_Date'].dt.month
monthly_accidents = (
    df.groupby(['Phase_of_Flight', 'Month'])
    .size()
    .reset_index(name='count')
)

plt.figure(figsize=(15, 8))
sns.lineplot(data=monthly_accidents, x='Month', y='count'、
             hue='Phase_of_Flight', marker='o')
plt.title('Monthly Accident Patterns by Phase of Flight')
plt.xlabel('Month')
plt.ylabel('事故数量)
plt.grid(True, alpha=0.3)
plt.tight_layout()
plt.show()

# 基本统计数据输出
summary_stats = (
    phase_counts.groupby('Phase_of_Flight')
    .agg({'count': ['mean', 'std', 'min', 'max']})
    .round(2)
)
print("\n=== 按飞行阶段划分的事故统计摘要 ===")
print(summary_stats)

分析与洞察

按飞行阶段分列的事故总数(柱状图)

항공기 사고 막대그래프 이미지
  • 解释:大多数事件是 着陆(着陆)和 起飞(起飞)阶段,表明这是航空公司运营的最关键阶段。相对而言 其他, 未知站立式 分阶段发生事件的频率很低。
  • 洞察力:
    • 着陆和起飞阶段在很大程度上依赖于飞行员和空中交通管制员之间的协作、飞机的性能、天气条件等,因此安全措施至关重要。
    • 巡航 虽然该舞台的高度保持稳定,但事故发生率高居第三,在这方面也需要改进。

按飞行阶段划分的年度事故趋势(折线图)

항공기 사고 라인그래프 이미지
  • 释义:随着时间的推移,总体事件呈下降趋势,特别是在以下方面 巡航着陆事故减少最明显的是
  • 洞察力:
    • 飞机技术的进步、更严格的规定和培训计划的改进很可能是罪魁祸首。
    • 某一年事故激增可能与当年发生的事件有关,也可能与特定的技术/环境因素有关。

按年份和飞行阶段划分的事故热图

항공기 사고 히트맵 이미지
  • 口译:着陆 (着陆)和起飞(起飞在某一特定年份中,"...... 方法巡航 台阶上的事故也很明显。
  • 洞察力:
    • 着陆和起飞阶段一直被列为高风险阶段。
    • 集中出现在某一年的模式可能与季节、地区或运行因素有关。

按飞行阶段划分的事故比例(过去 10 年 - 饼图)

항공기 사고 파이차트 이미지
  • 解释:过去 10 年中发生事件的百分比是 着陆最高、 起飞巡航其次是其余阶段的百分比相对较低。
  • 洞察力:
    • 着陆和起飞阶段表明有必要进一步加强事故预防措施。
    • 巡航 仍应注意阶段性事故,并分析原因,如技术问题(如发动机故障)。

按飞行阶段划分的月度事故模式(折线图)

항공기 사고 라인차트 이미지2
  • 口译: 着陆起飞 相比较而言,夏季(6 月至 8 月)的事故数量有增加的趋势。这可能与夏季飞机运行量增加有关。
  • 洞察力:
    • 夏季航空交通量的增加增加了事故发生的可能性。
    • 应加强额外的维护和培训计划,以减少季节性影响。

按飞行阶段分列的事故统计摘要

항공기 사고 요약 통계 이미지
  • 口译: 着陆 阶段的平均事件数(593.38)最多,标准差(129.93)较大,变异性较高,最大值为 472。
  • 洞察力:
    • 着陆阶段的事故数量各不相同,这表明着陆阶段受各种条件(天气、飞行员技能等)的影响很大。
    • 起飞 (起飞)和在着陆阶段遵守标准化程序是减少事故的关键。

全面洞察

更加关注着陆和起飞阶段

  • 数据清楚地表明,事故主要集中在着陆和起飞阶段。为解决这一问题,需要加强飞行员培训,并对飞机进行更彻底的健康检查。
  1. 需要分析季节性预防措施:考虑到夏季事故增多,应加强季节性预防措施。
  2. 需要不断改进技术: 巡航 研究和投资对于解决长航段(如阶段)的技术问题至关重要。
  3. 深入研究特定年份/阶段的数据事故分析:有必要对某一年集中发生的事故进行分析,研究飞机型号、操作程序和外部因素。

Python 代码详解

安装和导入图书馆

!pip install kaggle -q # 安装 Kaggle 库
导入 os
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
import plotly.express as px

在本节中,您将安装并导入所需的库。安装 kaggle 库以使用 Kaggle API,并导入 pandas、seaborn、matplotlib 和 plotly 库以进行数据分析和可视化。

设置 Kaggle API

os.environ['KAGGLE_CONFIG_DIR'] = '/content' # 设置为当前目录
!chmod 600 /content/kaggle.json # 设置权限

设置使用 Kaggle API 的环境变量,并设置 API 密钥文件 (kaggle.json) 的权限。

下载和加载数据

!kaggle datasets download -d khsamaha/aviation-accident-database-synopses -p /content/aviation_data --unzip

file_path = "/content/aviation_data/AviationData.csv" 文件路径
df = pd.read_csv(file_path, encoding='ISO-8859-1', low_memory=False)

使用 Kaggle API 下载并解压数据集,然后使用 pandas 将 CSV 文件加载到数据框中。

数据预处理

df.rename(columns={"Event Date":"Event_Date", "Broad.phase.of.flight":"Phase_of_Flight"}, inplace=True)
df['Event_Date'] = pd.to_datetime(df['Event_Date'], errors='coerce')
df['Year'] = df['Event_Date'].dt.year
df = df.dropna(subset=['Phase_of_Flight'])

重新命名列,将日期数据转换为日期时间格式,添加 "年份 "列,删除缺失值的行。

数据汇总

phase_counts = (
    df.groupby(['Phase_of_Flight', 'Year'])
    .size()
    .reset_index(name='count')
)

按运行阶段和年份汇总事件数量。

Python 可视化

  1. 每个飞行阶段的事故总数 (条形图)
  2. 按运行阶段分列的年度事故趋势 (折线图)
  3. 按年份和运行阶段分列的事件热图
  4. 过去 10 年按运行阶段分列的事故率(交互式饼图)(英文
  5. 按月分列的事件模式(折线图)

对于每种可视化效果,请选择适当的图表类型,并使用 matplotlib、seaborn 和 plotly 加以实现。

基本统计输出

summary_stats = (
    phase_counts.groupby('Phase_of_Flight')
    .agg({'count': ['mean', 'std', 'min', 'max']})
    .round(2)
)
print("\n=== 按飞行阶段划分的事故统计摘要 ===")
print(summary_stats)

计算并输出每个飞行阶段事故数量的基本统计数据(平均值、标准偏差、最小值、最大值)。

回顾--济州航空空难后的哀悼与警惕

济州航空空难是一场令人痛心的航空悲剧。我们理应举国哀悼,同时也应深入分析原因,采取措施防止其被用于政治目的。

像 Python 这样的工具可以帮助我们深入了解如何识别风险并实施能够挽救生命的解决方案。在我们哀悼这场悲剧的同时,我们需要国家的关注,让我们的天空更加安全。我们希望这次对飞机事故数据的分析是我们在这一道路上迈出的一小步。

类似文章