ОП.09 Обработка и анализ данных
Практическая работа №3
Тема: Фильтрация, сортировка и группировка данных в Pandas
Цель работы: Научиться выполнять фильтрацию строк по условиям, сортировать данные, применять группировки и агрегацию для анализа датасетов.
Время выполнения: 2 академических часа
Инструменты: Python + Jupyter Notebook, библиотеки pandas, matplotlib
ЗАДАНИЕ ДЛЯ СТУДЕНТА
Этап 1. Подготовка данных (10 минут)
Загрузите и подготовьте датасет titanic.csv:
import pandas as pd
import matplotlib.pyplot as plt
df = pd.read_csv('titanic.csv')
# Базовая очистка
df.drop(['PassengerId', 'Name', 'Ticket', 'Cabin'], axis=1, inplace=True)
df['Age'].fillna(df['Age'].mean(), inplace=True)
df['Embarked'].fillna(df['Embarked'].mode()[0], inplace=True)
# Просмотр первых строк
df.head()
Этап 2. Фильтрация данных (15 минут)
Выполните следующие фильтрации:
# 1. Только выжившие пассажиры
survived = df[df['Survived'] == 1]
print(f"Выживших: {len(survived)}")
survived.head()
# 2. Только женщины
women = df[df['Sex'] == 'female']
print(f"Женщин: {len(women)}")
women.head()
# 3. Только мужчины старше 50 лет
old_men = df[(df['Sex'] == 'male') & (df['Age'] > 50)]
print(f"Мужчин старше 50: {len(old_men)}")
old_men.head()
# 4. Пассажиры 1 класса с ценой билета > 100
rich_first = df[(df['Pclass'] == 1) & (df['Fare'] > 100)]
print(f"Пассажиров 1 класса с билетом > 100: {len(rich_first)}")
rich_first.head()
Вопросы:
• Сколько женщин выжило? А сколько мужчин?
• Какая доля мужчин старше 50 выжила?
Этап 3. Сортировка данных (10 минут)
Отсортируйте данные по разным критериям:
# 1. Самые дорогие билеты (первые 10)
df_sorted_by_fare = df.sort_values('Fare', ascending=False)
print("Топ-10 самых дорогих билетов:")
df_sorted_by_fare[['Pclass', 'Sex', 'Age', 'Fare', 'Survived']].head(10)
# 2. Самые молодые пассажиры
df_sorted_by_age = df.sort_values('Age')
print("Топ-10 самых молодых пассажиров:")
df_sorted_by_age[['Pclass', 'Sex', 'Age', 'Fare', 'Survived']].head(10)
# 3. Сортировка по нескольким колонкам (сначала класс, потом возраст по убыванию)
df_sorted_multi = df.sort_values(['Pclass', 'Age'], ascending=[True, False])
df_sorted_multi[['Pclass', 'Age', 'Sex', 'Survived']].head(10)
Вопрос: Кто чаще покупал дорогие билеты — мужчины или женщины? Есть ли связь с выживанием?
Этап 4. Группировка и агрегация (20 минут)
Используйте groupby() для анализа:
# 1. Средний возраст по классам
avg_age_by_class = df.groupby('Pclass')['Age'].mean()
print("Средний возраст по классам:")
print(avg_age_by_class)
# 2. Выживаемость по полу
survival_by_sex = df.groupby('Sex')['Survived'].mean()
print("Выживаемость по полу:")
print(survival_by_sex)
# 3. Выживаемость по классу и полу (сводная)
pivot = df.groupby(['Pclass', 'Sex'])['Survived'].mean()
print("Выживаемость по классу и полу:")
print(pivot)
# 4. Несколько агрегаций одновременно
stats = df.groupby('Pclass').agg({
'Age': ['mean', 'min', 'max'],
'Fare': ['mean', 'median'],
'Survived': 'mean'
})
print("Полная статистика по классам:")
print(stats)
Вопросы:
• В каком классе самый высокий средний возраст?
• Как отличается выживаемость мужчин и женщин внутри одного класса?
Этап 5. Визуализация группировок (15 минут)
Постройте графики на основе группировок:
# 1. Столбчатая диаграмма: средний возраст по классам
avg_age_by_class.plot(kind='bar', color='skyblue')
plt.title('Средний возраст пассажиров по классам')
plt.xlabel('Класс')
plt.ylabel('Средний возраст')
plt.xticks(rotation=0)
plt.show()
# 2. Выживаемость по полу (круговая)
survival_by_sex.plot(kind='pie', autopct='%1.1f%%')
plt.title('Выживаемость по полу')
plt.ylabel('')
plt.show()
# 3. Сравнение выживаемости (мужчины vs женщины) по классам
pivot_table = df.pivot_table(index='Pclass', columns='Sex', values='Survived', aggfunc='mean')
pivot_table.plot(kind='bar', color=['pink', 'lightblue'])
plt.title('Выживаемость по классу и полу')
plt.xlabel('Класс')
plt.ylabel('Доля выживших')
plt.xticks(rotation=0)
plt.legend(title='Пол')
plt.show()
Вопрос: Какой график лучше всего демонстрирует разницу между мужчинами и женщинами в разных классах?
Этап 6. Дополнительное задание (15 минут)
На основе датасета titanic.csv ответьте на вопросы с помощью фильтрации и группировки:
# 1. Какая доля детей (до 18 лет) выжила?
children = df[df['Age'] < 18]
children_survival = children['Survived'].mean()
print(f"Доля выживших детей: {children_survival:.2%}")
# 2. Сколько женщин с детьми выжило?
women_with_children = df[(df['Sex'] == 'female') & (df['Parch'] > 0)]
women_with_children_survival = women_with_children['Survived'].mean()
print(f"Доля выживших женщин с детьми: {women_with_children_survival:.2%}")
# 3. Самый дорогой билет среди выживших
max_fare_survived = df[df['Survived'] == 1]['Fare'].max()
print(f"Самый дорогой билет среди выживших: {max_fare_survived}")
Этап 7. Выводы (10 минут)
Напишите развёрнутый вывод по работе:
1. Какие операции (фильтрация, сортировка, группировка) оказались самыми полезными?
2. Какие закономерности вы обнаружили благодаря группировке?
3. Какой тип агрегации (mean, sum, count) использовался чаще всего и почему?
КРИТЕРИИ ОЦЕНКИ
| Критерий |
Макс. балл |
| Все этапы выполнены (1-6) |
3 |
| Фильтрация и сортировка корректны |
2 |
| Группировка и агрегация выполнены верно |
2 |
| Графики построены и подписаны |
1 |
| Выводы осмысленные, по делу |
2 |
| Итого |
10 |
ОТВЕТ ДЛЯ ПРЕПОДАВАТЕЛЯ (эталонный результат)
Нажмите, чтобы увидеть ответы
Этап 2. Фильтрация:
• Женщин выжило: 233. Мужчин выжило: 109.
• Мужчин старше 50: 22, из них выжило: 5 (≈23%).
Этап 3. Сортировка:
• Самые дорогие билеты (топ-5) — у женщин, все выжили (1 класс).
• Связь с выживанием: дорогие билеты → высокая выживаемость.
Этап 4. Группировка:
• Самый высокий средний возраст — в 1 классе (≈38 лет).
• Внутри одного класса женщины выживали в 2-3 раза чаще мужчин.
Этап 5. Визуализация:
• Лучший график — сгруппированная столбчатая диаграмма (pivot_table.plot).
Этап 6. Дополнительное задание:
• Доля выживших детей: ≈54%
• Доля выживших женщин с детьми: ≈68%
• Самый дорогой билет среди выживших: 512.33
Автор: УМК СПО
Лицензия: Бесплатное использование с указанием источника
|