Следующая тема: ИАД. Проектная работа
Вернуться в раздел: Исследовательский анализ данных
Вернуться в оглавление: Я.Практикум
Введение
Вы сделали всё, чтобы получить список тех сетей АЗС, с которыми Яндекс.Навигатору выгоднее начать сотрудничество.
Чему вы научитесь
- строить столбчатые графики и круговые диаграммы;
- выборочно изменять значения в списке методом where();
- писать цикл, который строит сразу много гистограмм.
Вам предстоит:
- объединить мелкие сети в группу «Другие»;
- построить гистограммы продолжительности заправки в каждой сети;
- получить финальный список крупных сетей АЗС.
Сколько времени это займёт
2 урока по 30 минут.
Постановка задачи
Перепроверьте реалистичность данных, чтобы подготовить финальный отчёт для руководства.
Укрупняем группы
Перед тем как делать выводы, надо перепроверить реалистичность данных. Отчёт выглядит так. Напомним, что достоверная типичная продолжительность заправки указана в median_time:
print(final_stat)
time_spent good_time_spent median_time stations
name
Агератум 337.802721 309.0 308.50 3.0
Амарант 132.760012 187.5 169.00 5.0
Аммобиум 256.708042 180.5 178.75 4.0
Арктотис 73.879984 185.0 190.50 3.0
Астильба 376.143149 423.0 435.50 4.0
Бальзамин 134.508411 158.0 158.00 1.0
Бархатцы 145.300328 181.5 181.50 1.0
Бегония 163.200647 195.0 190.00 3.0
Фасоль 133.631957 NaN NaN NaN
Функия 302.494737 171.5 171.50 1.0
Хризантема 195.738710 188.0 188.25 2.0
Данные бывают разной природы, и для всяких наблюдений есть подходящие графики. Например, если нужно продемонстрировать доли от 100%, строят круговую диаграмму. В методе plot() задают тип: kind='pie' (от англ. pie chart — «диаграмма-пирог», похожа на круглый пирог, поделённый на дольки). Столбец с данными для диаграммы указывают в параметре y метода plot().
На графике же нужно отразить факт, что каждая сеть АЗС — это отдельный объект, никак не связанный с ближайшими соседями в рейтинге. Для анализа таких наблюдений лучше подходит столбчатый график, он подчёркивает изолированность данных.
Столбчатый график строят методом plot(), параметром передают тип графика: kind='bar' (от англ. bar chart — «столбчатая диаграмма»). Однако график может быть не наглядным, ведь сетей много и лишь несколько из них — крупные. Лучше объединить все мелкие сети и отрисовать как один столбец.
Данные по малым сетям можно просто отбросить, но полезнее сгруппировать их в «сеть» под названием «Другие», то есть сделать выборочное переименование. Так вы и данные не потеряете, и покажете отличие малых сетей от старших братьев.
Выборочно изменяют значения методом where() (пер. «где»). Ему передают два параметра: условие для булева массива и новые значения. Если условие равно True, соответствующее ему значение не изменится, а если False — поменяется на второй параметр метода. Возьмём, к примеру, список покупок:
shopping = pd.Series(['молоко', 'хамон', 'хлеб', 'картошка', 'огурцы'])
print(shopping) # список того, что нужно купить
print()
print(
shopping.where(shopping != 'хамон', 'обойдусь')
) # тот же список после проверки баланса карты
0 молоко
1 хамон
2 хлеб
3 картошка
4 огурцы
dtype: object
0 молоко
1 обойдусь
2 хлеб
3 картошка
4 огурцы
dtype: object
Мы написали для булева массива условие, проверяющее, не оказался ли элемент списка хамоном: shopping != 'хамон'. Получили массив вида: [True, False, True, True, True]. Строки со значением True не изменились, а хамон поменялся на значение 'обойдусь'.
При объединении данных случается отбрасывать пустые значения. Вы знакомы с методом dropna() из вводного курса. Напомним, что он удаляет пропущенные значения из датафрейма. Когда нужно удалить строки с пропусками в конкретном столбце, его название передают параметру subset метода dropna():
dataframe.dropna(subset=['column_name'])
Задача 1/7
Итак, вы выявили аномалии, отфильтровали данные, создали показатели для типичного времени заезда и изучили влияние большого числа аномальных заездов на эти показатели. Проверьте всё ещё разок, прежде чем делиться результатами. Для начала визуализируйте распределение лучших показателей заездов с типичной продолжительностью по сетям АЗС.
Выполните следующие шаги, используя чистый код. Не вводите вспомогательные переменные — помните о бритве Оккама:
- Упорядочьте таблицу
final_statпо возрастанию лучших показателей из столбцаmedian_time.median_time— это медиана для распределения медианной продолжительности заправки по АЗС в каждой сети. - Постройте столбчатый график по значениям median_time. Задайте размер графика 10х5 дюймов.
import pandas as pd
data = pd.read_csv('/datasets/visits.csv', sep='\t')
# фильтруем слишком быстрые и медленные заезды и АЗС
data['too_fast'] = data['time_spent'] < 60
data['too_slow'] = data['time_spent'] > 1000
too_fast_stat = data.pivot_table(index='id', values='too_fast')
good_ids = too_fast_stat.query('too_fast < 0.5')
good_data = data.query('id in @good_ids.index')
good_data = good_data.query('60 <= time_spent <= 1000')
# считаем данные по отдельным АЗС и по сетям
station_stat = data.pivot_table(index='id', values='time_spent', aggfunc='median')
good_stations_stat = good_data.pivot_table(index='id', values='time_spent', aggfunc='median')
stat = data.pivot_table(index='name', values='time_spent')
good_stat = good_data.pivot_table(index='name', values='time_spent', aggfunc='median')
stat['good_time_spent'] = good_stat['time_spent']
id_name = good_data.pivot_table(index='id', values='name', aggfunc=['first', 'count'])
id_name.columns = ['name', 'count']
station_stat_full = id_name.join(good_stations_stat)
# считаем показатели сетей из показателей АЗС,
# а не усреднённые заезды на все АЗС сети
good_stat2 = (
station_stat_full
.query('count > 30')
.pivot_table(index='name', values='time_spent', aggfunc=['median', 'count'])
)
good_stat2.columns = ['median_time', 'stations']
final_stat = stat.join(good_stat2)
#print(final_stat)
(
final_stat
.sort_values(by='median_time')
.plot(y='median_time', kind='bar', figsize=(10, 5))
)
Результат