УМК СПО

Учебно-методические комплексы

для преподавателей СПО








Сквозной проект: анализ реального датасета

ОП.09 Обработка и анализ данных
Практическая работа №9
Тема: Сквозной проект — анализ реального датасета

Цель работы: Применить все полученные навыки Pandas для полного анализа реального датасета: загрузка, очистка, анализ, визуализация, выводы.
Время выполнения: 2 академических часа
Инструменты: Python + Jupyter Notebook, библиотеки pandas, numpy, matplotlib, seaborn

ЗАДАНИЕ ДЛЯ СТУДЕНТА

Этап 1. Загрузка и первичный осмотр (15 минут)

Загрузите датасет titanic.csv и выполните первичный анализ:



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

# Загрузка данных
df = pd.read_csv('titanic.csv')
print("Размер датасета:", df.shape)
print("Первые 5 строк:")
print(df.head())
print("Типы данных:")
print(df.dtypes)
print("Статистика по числовым колонкам:")
print(df.describe())



Вопрос: Сколько строк и столбцов? Какие столбцы имеют пропуски?

Этап 2. Очистка данных (20 минут)

Выполните полную очистку датасета:



# 1. Удаление ненужных столбцов
df_clean = df.drop(['PassengerId', 'Name', 'Ticket', 'Cabin'], axis=1)
print("После удаления столбцов:", df_clean.shape)

# 2. Обработка пропусков
print("Пропуски до обработки:")
print(df_clean.isnull().sum())

# Заполняем Age средним
df_clean['Age'] = df_clean['Age'].fillna(df_clean['Age'].mean())

# Заполняем Embarked модой
df_clean['Embarked'] = df_clean['Embarked'].fillna(df_clean['Embarked'].mode()[0])

print("Пропуски после обработки:")
print(df_clean.isnull().sum())

# 3. Преобразование типов
df_clean['Survived'] = df_clean['Survived'].astype('category')
df_clean['Pclass'] = df_clean['Pclass'].astype('category')
df_clean['Sex'] = df_clean['Sex'].astype('category')



Этап 3. Исследовательский анализ (20 минут)

Ответьте на ключевые вопросы с помощью группировок и визуализаций:



# Вопрос 1: Какова общая выживаемость?
total_survival = df_clean['Survived'].mean()
print(f"Общая выживаемость: {total_survival:.2%}")

# Вопрос 2: Выживаемость по полу
survival_sex = df_clean.groupby('Sex')['Survived'].mean()
print("Выживаемость по полу:")
print(survival_sex)

# Вопрос 3: Выживаемость по классу
survival_class = df_clean.groupby('Pclass')['Survived'].mean()
print("Выживаемость по классу:")
print(survival_class)

# Вопрос 4: Выживаемость по полу и классу
survival_sex_class = df_clean.groupby(['Pclass', 'Sex'])['Survived'].mean()
print("Выживаемость по классу и полу:")
print(survival_sex_class)

# Вопрос 5: Средний возраст выживших и погибших
age_survival = df_clean.groupby('Survived')['Age'].mean()
print("Средний возраст по выживаемости:")
print(age_survival)



Вопросы для анализа:
• Кто выживал чаще: мужчины или женщины?
• Как класс билета влияет на выживаемость?
• Есть ли связь между возрастом и выживаемостью?

Этап 4. Визуализация (20 минут)

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



plt.style.use('seaborn-v0_8-darkgrid')
fig, axes = plt.subplots(2, 2, figsize=(14, 10))

# График 1: Выживаемость по полу
survival_sex.plot(kind='bar', ax=axes[0,0], color=['pink', 'lightblue'])
axes[0,0].set_title('Выживаемость по полу')
axes[0,0].set_xlabel('Пол')
axes[0,0].set_ylabel('Доля выживших')
axes[0,0].set_ylim(0, 1)

# График 2: Выживаемость по классу
survival_class.plot(kind='bar', ax=axes[0,1], color=['gold', 'silver', '#cd7f32'])
axes[0,1].set_title('Выживаемость по классу билета')
axes[0,1].set_xlabel('Класс')
axes[0,1].set_ylabel('Доля выживших')
axes[0,1].set_ylim(0, 1)

# График 3: Тепловая карта (пол и класс)
pivot = df_clean.pivot_table(index='Pclass', columns='Sex', values='Survived', aggfunc='mean')
sns.heatmap(pivot, annot=True, cmap='RdYlGn', vmin=0, vmax=1, ax=axes[1,0])
axes[1,0].set_title('Выживаемость: класс vs пол')

# График 4: Распределение возраста выживших и погибших
df_clean[df_clean['Survived'] == 0]['Age'].hist(bins=20, alpha=0.5, label='Погибшие', ax=axes[1,1])
df_clean[df_clean['Survived'] == 1]['Age'].hist(bins=20, alpha=0.5, label='Выжившие', ax=axes[1,1])
axes[1,1].set_title('Распределение возраста')
axes[1,1].set_xlabel('Возраст')
axes[1,1].set_ylabel('Количество')
axes[1,1].legend()

plt.tight_layout()
plt.show()



Этап 5. Корреляционный анализ (15 минут)

Исследуйте связи между числовыми признаками:



# Выбираем числовые колонки
numeric_cols = ['Survived', 'Age', 'SibSp', 'Parch', 'Fare']
# Преобразуем Survived обратно для корреляции
df_corr = df_clean.copy()
df_corr['Survived'] = df_corr['Survived'].astype(int)
df_corr['Pclass'] = df_corr['Pclass'].astype(int)

# Корреляционная матрица
corr_matrix = df_corr[numeric_cols + ['Pclass']].corr()
print("Корреляционная матрица:")
print(corr_matrix)

# Тепловая карта корреляции
plt.figure(figsize=(8, 6))
sns.heatmap(corr_matrix, annot=True, cmap='coolwarm', fmt='.2f', linewidths=0.5)
plt.title('Корреляция между признаками')
plt.show()

# Анализ корреляции с выживаемостью
print("Корреляция с выживаемостью:")
for col in ['Pclass', 'Age', 'Fare', 'SibSp', 'Parch']:
corr = corr_matrix.loc[col, 'Survived']
print(f"{col}: {corr:.3f}")



Вопрос: Какой признак сильнее всего коррелирует с выживаемостью? Положительная или отрицательная корреляция?

Этап 6. Дополнительный анализ (15 минут)

Проведите собственное исследование:



# Задание: ответьте на один из вопросов
# 1. Влияет ли размер семьи (SibSp + Parch) на выживаемость?
df_clean['family_size'] = df_clean['SibSp'] + df_clean['Parch']
family_survival = df_clean.groupby('family_size')['Survived'].mean()
print("Выживаемость по размеру семьи:")
print(family_survival)

# 2. Как порт посадки влияет на выживаемость?
port_survival = df_clean.groupby('Embarked')['Survived'].mean()
print("Выживаемость по порту посадки:")
print(port_survival)

# 3. Есть ли разница в цене билета между выжившими и погибшими?
fare_survival = df_clean.groupby('Survived')['Fare'].mean()
print("Средняя цена билета:")
print(fare_survival)



Вопрос для исследования: Какой дополнительный фактор влияет на выживаемость?

Этап 7. Выводы по проекту (10 минут)

Напишите итоговый отчёт по проекту, включив:
1. Краткое описание датасета
2. Какие проблемы были обнаружены и как они решены
3. Ключевые выводы о факторах выживаемости
4. Какие визуализации оказались самыми информативными
5. Что можно улучшить в анализе

КРИТЕРИИ ОЦЕНКИ

КритерийМакс. балл
Все этапы выполнены (1-6)3
Очистка данных выполнена корректно2
Анализ и визуализация полные3
Выводы осмысленные и обоснованные2
Итого10


ОТВЕТ ДЛЯ ПРЕПОДАВАТЕЛЯ (эталонный результат)


Нажмите, чтобы увидеть ответы
Этап 1. Первичный осмотр:
• 891 строка, 12 столбцов.
• Пропуски: Age (177), Cabin (687), Embarked (2).

Этап 3. Анализ:
• Женщины выживали чаще (≈74%), чем мужчины (≈19%).
• 1 класс (≈63%), 2 класс (≈48%), 3 класс (≈24%).
• Средний возраст выживших ≈ 28 лет, погибших ≈ 30 лет.

Этап 5. Корреляции:
• Pclass: -0.34 (отрицательная — чем выше класс, тем выше выживаемость)
• Fare: +0.26 (положительная)
• Age: -0.06 (слабая отрицательная)

Этап 6. Дополнительный анализ:
• Оптимальный размер семьи: 1-3 (выживаемость ≈ 50-60%).
• Порт C (Шербур): самая высокая выживаемость (≈55%).
• Выжившие платили в среднем больше (≈48 vs 22).

Этап 7. Выводы (пример):
1. Датасет Titanic содержит данные о пассажирах корабля.
2. Основные проблемы: пропуски в Age, Cabin, Embarked. Решено: Age — mean, Embarked — mode, Cabin удалён.
3. Ключевые факторы выживаемости: пол, класс билета, цена билета.
4. Самые информативные графики: тепловая карта (пол vs класс) и boxplot возраста.
5. Улучшения: можно добавить признак "одиночка/семья", использовать машинное обучение для предсказания.


Автор: УМК СПО
Лицензия: Бесплатное использование с указанием источника





Логин: Пароль: Забыли пароль?Регистрация

Самозанятый: Стешенко Светлана Николаевна ИНН: 231408226339

Актуальная версия — 2026
Сайт сделан на SiNG cms © 2010-2020