датасет
Название: Titanic passengers Источник: публичный датасет библиотеки seaborn (репозиторий на GitHub) Прямая ссылка: https://raw.githubusercontent.com/mwaskom/seaborn-data/master/titanic.csv
почему эти данные интересны
1.Исторически известная катастрофа, связанная с человеческим фактором. 2.Есть много категориальных и числовых признаков (пол, класс, возраст, стоимость билета и т. д.). 3.Удобно демонстрировать базовые статистические методы и интерпретируемые визуализации.
типы графиков (минимум 4 разных вида)
- Столбчатая диаграмма (barplot) — общая выживаемость.
- Составленная (stacked) столбчатая диаграмма — выживаемость по классам.
- Гистограмма + KDE — распределение возраста по группам выживаемости.
- Boxplot (ящик с усами) — возраст по полу и классу.
- Тепловая карта (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 (столбчатая диаграмма)
Общий уровень выживаемости на Титанике (количество и доля). Показывает изучающий и объясняющий формат: — понятные подписи — подписи процентов на столбиках
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 (составленная столбчатая диаграмма)




