Исходный размер 736x948

Анализ выживаемости пассажиров Титаника с помощью Pandas и визуализаций

PROTECT STATUS: not protected

датасет

Название: Titanic passengers Источник: публичный датасет библиотеки seaborn (репозиторий на GitHub) Прямая ссылка: https://raw.githubusercontent.com/mwaskom/seaborn-data/master/titanic.csv

почему эти данные интересны

1.Исторически известная катастрофа, связанная с человеческим фактором. 2.Есть много категориальных и числовых признаков (пол, класс, возраст, стоимость билета и т.д.). 3.Удобно демонстрировать базовые статистические методы и интерпретируемые визуализации.

типы графиков (минимум 4 разных вида)

  1. Столбчатая диаграмма (barplot) — общая выживаемость.
  2. Составленная (stacked) столбчатая диаграмма — выживаемость по классам.
  3. Гистограмма + KDE — распределение возраста по группам выживаемости.
  4. Boxplot (ящик с усами) — возраст по полу и классу.
  5. Тепловая карта (heatmap) — матрица корреляций числовых признаков.

используемые статистические методы

  • Описательная статистика: среднее, медиана, стандартное отклонение (df.describe()).
  • Частоты и доли (value_counts, normalize=True) для категориальных признаков.
  • Группировка и агрегация (groupby + agg, mean как оценка вероятности выживания).
  • Сводные таблицы (pivot_table).
  • Корреляция Пирсона для числовых признаков (df.corr()).

import pandas as pd import numpy as np import matplotlib.pyplot as plt import seaborn as sns

Чтобы графики отображались крупнее и читабельнее

plt.rcParams['figure.figsize'] = (10, 6) plt.rcParams['axes.titlesize'] = 16 plt.rcParams['axes.labelsize'] = 12 plt.rcParams['xtick.labelsize'] = 10 plt.rcParams['ytick.labelsize'] = 10

def set_custom_style():

Настройка единого стиля инфографики. Здесь создаём минималистичный "журнальный" стиль: - светлый фон - приглушённая палитра - единый шрифт без засечек

sns.set_theme(style="whitegrid") custom_palette = ["

0d6efd", "

20c997", "

fd7e14", "

e83e8c", "#6f42c1"] sns.set_palette(custom_palette) plt.rcParams['font.family'] = 'DejaVu Sans' plt.rcParams['axes.facecolor'] = "#f8f9fa" plt.rcParams['figure.facecolor'] = "#f8f9fa" plt.rcParams['axes.edgecolor'] = "#dee2e6" plt.rcParams['grid.color'] = "#dee2e6"

def load_data():

Загрузка датасета Titanic из GitHub (seaborn-data). Возвращает DataFrame.

url = "https://raw.githubusercontent.com/mwaskom/seaborn-data/master/titanic.csv"
df = pd.read_csv(url)
return df

def preprocess_data(df):

предобработка данных

  • Переименование столбцов для удобства (русские названия в отдельных столбцах)
    • Создание новых признаков (family_size, is_child, age_group)
    • Обработка пропусков (возраст, класс и т.д. оставляем как есть, но можем фильтровать по необходимости) """ df = df.copy()

переименуем некоторые переменные для ясности при визуализации (создадим дубли-столбцы на русском)

df["Пол"] = df["sex"].map({"male": "Мужчина", "female": "Женщина"}) df["Класс"] = df["class"].map({"First": "1 класс", "Second": "2 класс", "Third": "3 класс"}) df["Выжил"] = df["survived"].map({0: "Нет", 1: "Да"})

новый признак: размер семьи (чем больше семья, тем потенциально сложнее эвакуация)

df["family_size"] = df["sibsp"] + df["parch"] + 1

новый признак: ребёнок/взрослый (возраст < 16 лет)

df["is_child"] = np.where(df["age"] < 16, 1, 0)

группы возраста для более «объясняющего» анализа

bins = [0, 12, 18, 30, 50, 80] labels = ["0-12 (дети)", "13-18 (подростки)", "19-30 (молодые)", "31-50 (взрослые)", "51+ (старшие)"] df["age_group"] = pd.cut(df["age"], bins=bins, labels=labels, right=True)

return df

def descriptive_statistics(df):

показ описательной статистики и базовых частот

Это демонстрация использования статистических методов: - describe() для числовых колонок - value_counts() и доли (normalize=True) для категорий """ print("=== Описательная статистика числовых признаков ===") print(df[["survived", "pclass", "age", "sibsp", "parch", "fare", "family_size"]].describe(), "\n")

print("=== Распределение по полу ===")
print(df["Пол"].value_counts(), "\n")

print("=== Распределение по полу (доли) ===")
print(df["Пол"].value_counts(normalize=True), "\n")

print("=== Общий уровень выживаемости (доля выживших) ===")
survival_rate = df["survived"].mean()
print(f"Доля выживших: {survival_rate:.2%}\n")

print("=== Уровень выживаемости по полу ===")
print(df.groupby("Пол")["survived"].mean().apply(lambda x: f"{x:.2%}"), "\n")

print("=== Уровень выживаемости по классам ===")
print(df.groupby("Класс")["survived"].mean().apply(lambda x: f"{x:.2%}"), "\n")

print("=== Уровень выживаемости по возрастным группам ===")
print(
    df.groupby("age_group")["survived"]
    .mean()
    .dropna()
    .apply(lambda x: f"{x:.2%}")
)

def plot_overall_survival(df):

график 1 (столбчатая диаграмма)

Общий уровень выживаемости на Титанике (количество и доля). Показывает изучающий и объясняющий формат: - понятные подписи - подписи процентов на столбиках

Исходный размер 984x579

set_custom_style()

surv_counts = df["Выжил"].value_counts().reindex(["Да", "Нет"])
surv_rate = df["survived"].mean()

fig, ax = plt.subplots()
sns.barplot(x=surv_counts.index, y=surv_counts.values, ax=ax)

ax.set_title("Выживаемость на Титанике (общее распределение)")
ax.set_xlabel("Выжил")
ax.set_ylabel("Количество пассажиров")

# Подпишем значения на столбиках
for i, v in enumerate(surv_counts.values):
    ax.text(i, v + 5, str(v), ha="center", va="bottom", fontweight="bold")

# Добавим текстовое пояснение с общим процентом выживаемости
ax.text(
    0.5, -0.2,
    f"Общая доля выживших: {surv_rate:.1%}",
    transform=ax.transAxes,
    ha="center",
    va="center",
    fontsize=12
)

plt.tight_layout()
plt.savefig("plot1_overall_survival.png", dpi=300)
plt.show()

def plot_survival_by_class_stacked(df):

график 2 (составленная столбчатая диаграмма)

Анализ выживаемости пассажиров Титаника с помощью Pandas и визуализаций
Проект создан 17.01.2026
Мы используем файлы cookies для улучшения работы сайта НИУ ВШЭ и большего удобства его использования. Более подробную...
Показать больше