УМК СПО

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

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








Фильтрация, сортировка и группировка данных в Pandas

ОП.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


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





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

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

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