Несмотря на высокий уровень развития авиационной отрасли, инциденты, связанные с воздушными судами, продолжают происходить, что делает актуальным изучение причин и факторов, влияющих на их возникновение.
Данный отчет представляет собой аналитическое исследование авиапроисшествий (далее - АП), произошедших в период с 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.

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

Данные были дополнены статистикой по количеству АП с 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 АМТ.

Повреждения ВС в отчетах были разделены на три категории: ВС разрушено, ВС уничтожено (например, сгорело), ВС повреждено. Количество повреждений и их доля в общем количестве по категориям: разрушено – 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 %.

Подробнее о причинах АП. Выявились некоторые тенденции:
- Лидером по количеству АП является самолет АН-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 лет, выявлены ключевые тенденции и факторы, влияющие на безопасность полётов. Ошибки пилотирования остаются главной причиной инцидентов, а технические неисправности и погодные условия также вносят значительный вклад. Особое внимание заслуживают происшествия с частными воздушными судами и вертолётами, где человеческий фактор играет решающую роль.
Представленная интерактивная карта позволяет визуализировать географическое распределение инцидентов и предоставляет удобный инструмент для дальнейшего изучения.