Pull to refresh

Анализ авиапроисшествий, расследованных МАК за 2014–2024 гг

Reading time7 min
Views2.5K

Несмотря на высокий уровень развития авиационной отрасли, инциденты, связанные с воздушными судами, продолжают происходить, что делает актуальным изучение причин и факторов, влияющих на их возникновение.

Данный отчет представляет собой аналитическое исследование авиапроисшествий (далее - АП), произошедших в период с 2014 по 2024 годы. В основу анализа легли данные о происшествиях, включающие сведения о типах воздушных судов, числе погибших, географическом расположении инцидентов, а также причинах катастроф, разделенных по видам - ошибки пилотирования, технические неисправности, неблагоприятные погодные условия, человеческий фактор, коллизии.
В статье приводятся заслуживающие внимания фрагменты кода и аналитические выводы.

Источник данных и их сбор

Данные были взяты на официальном сайте Межгосударственного авиационного комитета (МАК). МАК является авиационной организацией СНГ и уполномочен расследовать авиапроисшествия, которые происходят в странах-участницах Соглашения о гражданской авиации. Также МАК расследует происшествия с воздушными судами, зарегистрированными в этих государствах, и с судами, эксплуатируемыми авиакомпаниями этих стран, и может участвовать в международных расследованиях по запросу. Под юрисдикцию МАК не попадают военные авиационные происшествия (расследуются военными структурами).

Исходные данные для анализа были получены с использованием метода веб-скрейпинга. Далее они были систематизированы, очищены и структурированы в удобный для анализа формат. Процесс сбора и обработки данных реализован на Python с использованием библиотек. Код представлен ниже.

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import Select
import pandas as pd
import time

# Список годов для фильтрации
years = list(range(2014, 2025))

# Инициализация браузера
driver = webdriver.Chrome()  # Убедитесь, что у вас установлен ChromeDriver

# Пустой DataFrame для сбора всех данных
all_data = pd.DataFrame()

# Открытие страницы
driver.get("https://mak-iac.org/rassledovaniya/")

# Цикл по каждому году
for year in years:
    print(f"Собираем данные за {year} год...")

    # Ожидание загрузки страницы
    time.sleep(3)

    # Выбор года из выпадающего списка
    select = Select(driver.find_element(By.NAME, "YEAR"))
    select.select_by_visible_text(str(year))

    # Ожидание обновления таблицы
    time.sleep(5)

    # Поиск таблицы на странице
    tables = pd.read_html(driver.page_source)

    if tables:
        # Предполагается, что таблица одна
        year_data = tables[0]
        year_data["Год"] = year
        all_data = pd.concat([all_data, year_data], ignore_index=True)

# Закрытие браузера
driver.quit()

# Переименование столбцов
if not all_data.empty:
    all_data.columns = ["Дата", "Место происшествия", "Тип ВС", "Эксплуатант", "Ущерб", "Лишний столбец"]

    # Извлечение года из даты
    all_data["Год"] = pd.to_datetime(all_data["Дата"], errors="coerce").dt.year

    # Очистка регистрационных номеров
    all_data["Тип ВС"] = all_data["Тип ВС"].apply(lambda x: re.sub(r"\s*RA-\d+", "", str(x)))

    # Извлечение количества погибших
    def extract_deaths(text):
        match = re.search(r"Погибших:\s*(\d+)", str(text))
        return int(match.group(1)) if match else 0

    all_data["Кол-во погибших"] = all_data["Ущерб"].apply(extract_deaths)

    # Сохранение в Excel
    final_data = all_data[
        ["Год", "Дата", "Место происшествия", "Тип ВС", "Эксплуатант", "Кол-во погибших", "Ущерб"]
    ]
    final_data.to_excel("transformed_data_all_years.xlsx", index=False)
    print("Данные успешно собраны и сохранены в 'transformed_data_all_years.xlsx'.")
else:
    print("Данных для обработки не найдено.")

Далее в полученную таблицу были вручную внесены координаты каждого АП и его причины, для чего был открыт и прочитан отчет по каждому АП за 2014-2024 гг.

Результаты исследования и выводы

Всего с 2014 г. по 2024 г. произошло 415 авиапросшествий, общее количество погибших составило 1111 человек.

Из всего количества АП расследование не завершено в 38 случаях. В основном, это расследования 2024 года или те, которые невозможно было расследовать в принципе из-за того, что воздушное судно (ВС), потерпевшее крушение, не было найдено. 

Количество авиапроисшествий по годам представлено на рисунке 1. Больше всего АП произошло в 2016 г – 57, меньше всего в 2023 г. – 21. Среднее количество в год – 38.

Рисунок 1
Рисунок 1

Дополнительно - количество АП с 2004 г. по 2024 г.:

Рисунок 1.1
Рисунок 1.1

Данные были дополнены статистикой по количеству АП с 2004 г. (первый год из имеющихся на сайте МАК). И стала видна интересная тенденция - данные показывают рост АП с 2009 года, причём с 2016-го их количество достигает пика. С чем это могло быть связано?

В конце 2000-х – начале 2010-х гг. начался массовый рост импорта небольших ВС (Robinson и пр.), который произошел по следующим причинам:

- снятия ограничений на частную авиацию. До 2010-х частная авиация в России была сильно ограничена. В 2011-2015 гг. началось постепенное упрощение регулирования - в 2011 г. вступили в силу новые ФАП-128 (федеральные авиационные правила), упростившие сертификацию частных ВС, а в 2015-2016 годах начался бум регистрации частных вертолётов;

- относительной доступности (цена R44 в 2010-х – около $300-500 тыс., дешевле многих других вертолётов);

- развития малой авиации и вертолётных школ.

На рисунке 2 представлена диаграмма Топ-10 типов ВС, чаще всего попадающих в аварии. Лидер всех ВС – Ан-2, за ним следуют Robinson R66, МИ-8Т, МИ-2, Robinson R44, МИ-8, Robinson R44 II, МИ-8 АМТ.

Рисунок 2
Рисунок 2

Повреждения ВС в отчетах были разделены на три категории: ВС разрушено, ВС уничтожено (например, сгорело), ВС повреждено. Количество повреждений и их доля в общем количестве по категориям: разрушено – 150 (37 %), уничтожено – 72 (17 %), повреждено – 191 (46 %).

В наименовании эксплуатанта/владельца имеется категория «Частное лицо». Так вот процент происшествий с «Частное лицо» составил 40,96 %, а процент всех погибших среди этой категории – 16,56 %.

Наибольшее же количество погибших приходится на единичные случаи АП с большими ВС – Аэробус А321, Ту-154, Боинг 737-800, Ан-148-100В и на более частые случаи – МИ-8Т.

Доля различных причин АП представлена на рисунке 3. Больше всего АП произошло по причине ошибки пилотирования – 48,3 %. Технические неисправности – 17,1 %, человеческий фактор – 17.6 %, погодные условия – 10,2 %, коллизии – 6 %, причина неизвестна – 0,8 %.

Рисунок 3
Рисунок 3

Подробнее о причинах АП. Выявились некоторые тенденции:

- Лидером по количеству АП является самолет АН-2 и наиболее частая причина происшествия с ним – техническая неисправность. Тут, как говорится, без комментариев.

- Для мелких вертолетов типа Robinson-ов, в основном эксплуатируемых частными лицами, всегда характерны две причины – ошибка пилотирования и человеческий фактор. Первая случалась из-за недостаточной летной подготовки пилота, а человеческий фактор – состояние алкогольного опьянения пилота.

- Погодные условия – это в основном плохая видимость из-за дождя и снега или когда лопастями создается снежный вихрь (характерно для АП с вертолетами МИ-8), или даже плохая видимость из-за пожара.

- Коллизии – столкновение в воздухе с птицами, попадание в двигатель постороннего предмета, столкновение со снегоуборочником на ВПП.

- Среди причины человеческого фактора случались и совсем абсурдные вещи – пассажир рядом с пилотом запутался в телефонном проводе и сдвинул рычаг, который трогать было нельзя. Или другой пьяный пассажир раззадорился во время полета и начал хаотично брыкать ногами и придавил какую-то педаль.

Интерактивная карта АП

Для понимания того, в каких географических районах происходили АП, была сделана интерактивная карта со всеми происшествиями, на которой в соответствии с географическими координатами указан год АП, тип ВС и количество погибших.

Код для генерирования карты представлен ниже. Код немного сложный из-за того, что пришлось встраивать CSS для отображения заголовков и авторства.

import pandas as pd
import folium
from folium.plugins import FloatImage
from folium.elements import MacroElement
from branca.element import Template, MacroElement
import base64

# Загрузка данных
file_path = '/updated_transformed_data_all_years_1.xlsx'
df = pd.read_excel(file_path)

# Проверяем, есть ли необходимые столбцы
if 'Широта' not in df.columns or 'Долгота' not in df.columns:
    raise ValueError("В таблице отсутствуют столбцы 'Широта' и 'Долгота'. Проверьте данные.")

# Фильтруем строки с отсутствующими координатами
df_geo = df.dropna(subset=["Широта", "Долгота"])

# Создание карты
m = folium.Map(
    location=[df_geo["Широта"].mean(), df_geo["Долгота"].mean()], 
    zoom_start=3, 
    tiles="CartoDB Positron"
)

# Добавление точек происшествий на карту
for _, row in df_geo.iterrows():
    folium.Marker(
        location=[row["Широта"], row["Долгота"]],
        popup=f"Год: {row['Год']}\nТип ВС: {row['Тип ВС']}\nПогибшие: {row['Кол-во погибших']}",
        icon=folium.Icon(color="red" if row["Кол-во погибших"] > 0 else "blue")
    ).add_to(m)

# Кодирование авторской подписи в Base64
author_text = "Создано: Автор"
author_encoded = base64.b64encode(author_text.encode()).decode()

def decode_author():
    return base64.b64decode(author_encoded).decode()

# Добавление зафиксированного авторства в нижнем правом углу
html_author = f"""
    <div style="
        position: fixed;
        bottom: 10px;
        right: 10px;
        background-color: rgba(255, 255, 255, 0.7);
        padding: 5px;
        font-size: 10pt;
        border-radius: 5px;
        z-index: 1000;
    ">
        {decode_author()}
    </div>
"""

# Добавление заголовка сверху
html_title = """
    <div style="
        position: fixed;
        top: 10px;
        left: 50%;
        transform: translateX(-50%);
        background-color: rgba(255, 255, 255, 0.7);
        padding: 10px;
        font-size: 14pt;
        font-weight: bold;
        border-radius: 5px;
        z-index: 1000;
    ">
        Авиапроисшествия за 2014-2024 гг.
    </div>
"""

# CSS для скрытия логотипа и ссылки OSM
html_css = """
    <style>
        .leaflet-control-attribution {
            display: none !important;
        }
    </style>
"""

macro_title = MacroElement()
macro_title._template = Template("""{% macro html(this, kwargs) %} """ + html_title + """ {% endmacro %}""")
m.get_root().add_child(macro_title)

macro = MacroElement()
macro._template = Template("""{% macro html(this, kwargs) %} """ + html_author + """ {% endmacro %}""")
m.get_root().add_child(macro)

macro_css = MacroElement()
macro_css._template = Template("""{% macro html(this, kwargs) %} """ + html_css + """ {% endmacro %}""")
m.get_root().add_child(macro_css)

# Сохранение карты
map_path = "aviation_incidents_map.html"
m.save(map_path)

print(f"Карта сохранена в {map_path}. Откройте этот файл в браузере, чтобы увидеть карту.")

Карту можно посмотреть по ссылке.

Изображение карты АП
Изображение карты АП

Заключение

В результате анализа авиапроисшествий, расследованных МАК за последние 11 лет, выявлены ключевые тенденции и факторы, влияющие на безопасность полётов. Ошибки пилотирования остаются главной причиной инцидентов, а технические неисправности и погодные условия также вносят значительный вклад. Особое внимание заслуживают происшествия с частными воздушными судами и вертолётами, где человеческий фактор играет решающую роль.

Представленная интерактивная карта позволяет визуализировать географическое распределение инцидентов и предоставляет удобный инструмент для дальнейшего изучения.

Tags:
Hubs:
Total votes 8: ↑7 and ↓1+8
Comments17

Articles