|
Сквозной проект: анализ реального датасета
ОП.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. Улучшения: можно добавить признак "одиночка/семья", использовать машинное обучение для предсказания.
Автор: УМК СПО
Лицензия: Бесплатное использование с указанием источника
|
|
|