Следующая тема: ИАД. Изучение срезов данных
Вернуться в раздел: Исследовательский анализ данных
Вернуться в оглавление: Я.Практикум
1. Введение
3. Сводные таблицы для расчета среднего
7. Гистограмма
8. Гистограмма для двух кубиков
11. Диаграмма размаха в Python
12. Описание данных
13. Заключение
14. Проверочные задания. Первые графики и выводы
Знакомство с задачей
Как исследовать поведение водителей на заправках, если вы — Яндекс? Обратиться к статистике Яндекс.Навигатора: узнать, на какую именно заправку заезжал водитель и сколько времени там провёл.
Ваши коллеги из Навигатора собрали необходимые данные и прислали их в таком виде:
- Зашифрованное наименование сети АЗС (столбец
name): вместо брендов — названия растений. - Уникальный идентификатор конкретной АЗС (столбец
id) — в сети их много. - Время заезда на АЗС (столбец
date_time) в формате ISO: 20190405T165358 означает, что водитель прибыл на заправку 5 апреля 2019 года в 16 часов 53 минуты 58 секунд по UTC. - Проведённое на АЗС время (столбец
time_spent) в секундах.
Нужно ответить на вопрос, сколько в среднем времени тратят водители на заправку в каждой из сетей АЗС.
Выведем первые строки таблицы методом head():
import pandas as pd
data = pd.read_csv('/datasets/visits.csv')
print(data.head())
date_time\tid\ttime_spent\tname
0 20190405T165358\t76144fb2\t98.0\tВасилёк
1 20190403T173913\t76144fb2\t15.0\tВасилёк
2 20190402T172824\t76144fb2\t220.0\tВасилёк
3 20190406T070441\t76144fb2\t19.0\tВасилёк
4 20190403T132049\t76144fb2\t14.0\tВасилёк
Вот и первая проблема. Данные склеились в одну строку вместо того, чтобы разбиться по колонкам. Это произошло из-за разделителей в формате csv. Напомним, что csv — это Comma-Separated Values, или значения, разделённые запятыми. Действительно, в прошлых уроках вы работали с таблицами, где строку на колонки делили запятые. Однако вместо них могут быть точки с запятой, знаки табуляции или другие символы. Могут вносить путаницу и десятичные дроби, записанные с запятой. Какими символами разделять колонки и дроби, указывают в аргументах функции read_csv(). За разделитель колонок отвечает параметр sep (от англ. separate — «отделять, разделять»), а дробей — параметр decimal (пер. «десятичная дробь»):
file = pd.read_csv('file.csv', sep=';', decimal=',')
6 ноября 1974 года пуэрториканская обсерватория Аресибо отправила в космос радиосигнал, вошедший в историю под названием «Послание Аресибо».
Это адресованная инопланетянам информация, записанная двоичным кодом: числа от 1 до 10; химические элементы; строение и форма ДНК; количество людей на Земле, их средний рост и эскиз устройства человека; описание Солнечной системы; сведения об обсерватории Аресибо. Фрагмент послания выглядит так:
Само послание — последовательность нулей и единиц. Для расшифровки нужно разбить её на 73 строки по 23 символа. Вызовем функцию read_csv() — обратите внимание, что ей можно «скормить» файл в формате txt — и прочитаем послание Аресибо:
arecibo = pd.read_csv('arecibo.txt')
print(arecibo.head())
1\2\3\4\5\6\7\8\9\10\11\12\13\14\15\16\17\18\19\20\21\22\23
0 0\0\0\0\0\0\1\0\1\0\1\0\1\0\0\0\0\0\0\0\0\0\0
1 0\0\1\0\1\0\0\0\0\0\1\0\1\0\0\0\0\0\0\0\1\0\0
2 1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\1\0\1\1\0\0\1\0
3 1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\0\1\0\0\1\0\0
4 0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0
Послание выглядит совсем не так, как хотелось. Разделитель — обратный слэш \. В Python один обратный слэш \ используют для команд: например, \n — перевод строки. Чтобы не перепутать, пишут двойной: \. Прочитаем послание ещё раз с учётом разделителя столбцов:
arecibo = pd.read_csv('arecibo.txt', sep='\\')
print(arecibo.head())
1 2 3 4 5 ... 19 20 21 22 23
0 0 0 0 0 ... 0 0 0 0 0
1 0 0 1 0 ... 0 0 1 0 0
2 1 0 0 0 ... 1 0 0 1 0
3 1 0 1 0 ... 0 0 1 0 0
4 0 0 0 0 ... 0 0 0 0 0
Теперь единицы и нули строка за строкой можно превратить в квадратики, которые прочтут инопланетяне. А мы возвращаемся из дальнего космоса на бензоколонку.
Задача
Прочитайте файл visits.csv из папки /datasets/, указав в качестве разделителя знак табуляции \t, и сохраните результат в датафрейме data. Выведите его первые пять строк.
Путь к файлу: /datasets/visits.csv
import pandas as pd
data = pd.read_csv('/datasets/visits.csv', sep='\t')
print (data.head(5))
date_time id time_spent name
0 20180406T165358 76144fb2 98.0 Василёк
1 20180404T173913 76144fb2 15.0 Василёк
2 20180403T172824 76144fb2 220.0 Василёк
3 20180407T070441 76144fb2 19.0 Василёк
4 20180404T132049 76144fb2 14.0 Василёк
Когда что-то не клеится — это обычно нехорошо. Когда данные не склеиваются в одну строку — это, наоборот, здорово.
Сводные таблицы для расчёта среднего¶
Нужно узнать, сколько времени в среднем водители тратят на заправку в каждой сети АЗС. В каждой строке датафрейма есть название сети и время, проведённое на АЗС. Занимаясь предобработкой данных, вы применяли pivot_table() — метод для построения сводных таблиц.
Напомним его параметры:
index— столбец, значения которого становятся названиями строк (индексом);columns— столбец, значения которого становятся названиями столбцов;values— значения, по которым вы хотите увидеть сводную таблицу;aggfunc— функция, применяемая к значениям.
Прежде значением aggfunc вы указывали sum, то есть складывали элементы столбца. Если параметр aggfunc не указывать, то по умолчанию метод pivot_table() рассчитает среднее арифметическое значений, указанных в параметре values.
Чтобы начать работать с данными о заправках, надо сначала научиться строить сводные таблицы. Для этого у вас будет новый набор данных — с информацией о матчах Национальной хоккейной лиги.
Нужно проанализировать среднюю посещаемость домашних матчей команд Национальной хоккейной лиги, начиная с сезона 2000–2001 гг. и заканчивая сезоном 2017–2018 гг. Посмотрим на первые пять строк таблицы, где для каждой команды указано количество домашних матчей и их суммарная посещаемость home_att:
nhl_att = pd.read_excel('nhl_attendance.xlsx')
print(nhl_att.head())
season team home_games home_att
0 2017-2018 Chicago 41 887794
1 2017-2018 Montreal 41 873283
2 2017-2018 Philadelphia 41 800214
3 2017-2018 Detroit 41 800115
4 2017-2018 Toronto 41 786677
Найдём среднюю посещаемость домашних матчей для команды:
nhl_att['avg_home_att'] = nhl_att['home_att'] / nhl_att['home_games']
print(nhl_att.head())
nhl_pivot = nhl_att.pivot_table(index='season', values='avg_home_att')
# группируем таблицу по сезонам, для каждого находим среднюю посещаемость
print(nhl_pivot)
2000-01 16559.268467
2001-02 16758.941463
2002-03 16590.563415
2003-04 16549.755285
2005-06 16954.608943
2006-07 16960.798374
2007-08 17307.805691
2008-09 17476.049593
2009-10 17072.668333
2010-11 17122.738211
2011-12 17455.410569
2012-13 17720.623611
2013-14 17587.389431
2014-15 17502.595122
2015-16 17576.266667
2016-17 17500.631707
2017-18 17446.312352
Какие выводы можно сделать, прочитав эту таблицу?
Наибольшая средняя посещаемость матчей была в сезоне 2012-2013 гг.
Можно наблюдать тренд к снижению средней посещаемости с сезона 2012-2013 гг.
Начиная с сезона 2007-2008 гг. средняя посещаемость не была ниже 17 000 зрителей.
Правильный ответ Всё вышеперечисленное верно.
Применяем сводные таблицы
Наибольшая средняя посещаемость матчей была в 2012–2013 гг. Примечательно, что в тот сезон состоялось только 48 игр вместо традиционных 82. Недостачу вызвали трудовые споры между руководством лиги и профсоюзом хоккеистов.
Начиная с сезона 2007–2008 гг. средняя посещаемость никогда не была ниже 17 000 зрителей. Значит, маркетинг лиги работает.
Наконец, в последние сезоны наблюдался тренд к снижению средней посещаемости. Это может быть связано с тем, что некоторые команды стали играть на малых стадионах.
Суровый бой ведёт ледовая дружина, а мы застряли на АЗС.
Задача
Сводные таблицы используют на разных этапах работы с данными. Можно начать с оценки данных и посчитать среднее время заправки в секундах. Нужные значения хранит столбец time_spent.
- С помощью
pivot_table()вычислите среднее время, проведённое на заправках в каждой из сетей, и сохраните результат в переменнуюstat. - Выведите на экран значение переменной
statи проанализируйте полученные данные. Не забудьте, чтоtime_spentхранит значения в секундах.
import pandas as pd
data = pd.read_csv ('/datasets/visits.csv', sep='\t')
stat = data.pivot_table(index='name', values='time_spent')
print (stat)
time_spent
name
Агератум 337.802721
Амарант 132.760012
Аммобиум 256.708042
Арктотис 73.879984
Астильба 376.143149
Бальзамин 134.508411
Бархатцы 145.300328
Бегония 163.200647
Белоцветник 100.818966
Есть ли проблемы в данных?
Таблицу, которую получили в прошлом уроке, нельзя показывать менеджерам: они всё равно не поверят!
У сетей АЗС «Нарцисс», «Арктотис» и «Малопа» среднее время заправки около 70 секунд. Неправдоподобно мало.
Как вы думаете, всё ли в порядке с данными?
Всё правильно посчитано, в результатах не может быть ошибки.
Правильный ответ Всё может быть. Нужно проверить и данные, и расчёты.
Надо искать ошибку в расчётах.
Наверное, нам прислали неправильные данные.
Доверяй, но проверяй. В следующем уроке начнём проверять данные.
Базовая проверка данных
В работе с данными почти всегда вас ждут сюрпризы:
- Почему-то выгрузили не те данные или не всё, что есть.
- Ошибки в алгоритмах, считающих заезды: скажем, время заправки учли неверно.
- Не тот формат: например, вместо секунд записали минуты.
- Упущен какой-нибудь существенный факт. Так, водители могли заехать на нерабочую АЗС (а счётчик их учёл) и развернуться, не заправившись (счётчик зафиксировал очень короткое время).
Словом, в данных может быть всё что угодно. Именно вы как аналитик ручаетесь за их реалистичность. Попробуйте оценить, насколько они достоверны. Начните с базовых проверок. Например, можно ответить на вопросы: - Сколько всего заездов зафиксировано за время исследования?
- Сколько АЗС?
- Сколько заездов на одну АЗС в день?
- Какие сети АЗС самые популярные? ...И самостоятельно либо с помощью коллег оценить, похожи ли результаты ваших расчётов на правду.
Базовая проверка может обнаружить проблему в данных. Или наоборот — свидетельствовать, что с ними всё в порядке. По крайней мере, пока.
Задача 1/5
Сперва найдите количество заездов на АЗС. Одна строка в датафрейме соответствует одному посещению, значит, нужно посчитать строки.
Сохраните количество строк датафрейма в переменную total_visits. Результат выведите на экран так:
Количество заездов: ...
import pandas as pd
data = pd.read_csv ('/datasets/visits.csv', sep='\t')
#количество заездов на АЗС
total_visits = data['id'].count()
print('Количество заездов:', total_visits)
Количество заездов: 317104
Хорошо бы понимать, насколько это число реалистично. С чем его можно соотнести? Можно посчитать среднее количество заездов на одну АЗС в день. Чтобы получить среднее, нужно найти количество АЗС и число дней, по которым есть данные.
Задача 2/5
Теперь нужно понять, сколько АЗС в данных. У каждой станции есть свой номер — id. Чтобы найти количество АЗС, посчитайте уникальные id.
Сохраните количество АЗС в переменной total_stations, результат выведите на экран так:
Количество АЗС: ...
import pandas as pd
data = pd.read_csv ('/datasets/visits.csv', sep='\t')
#количество заездов на АЗС
total_visits = data['id'].count()
#print('Количество заездов:', total_visits)
total_stations = len(data['id'].unique())
print('Количество АЗС:', total_stations)
Количество заездов: 317104 Количество АЗС: 471
Эксперты говорят, что это число близко к числу всех АЗС в регионе. Хороший сигнал! Все АЗС охватили и не насчитали лишнего.
Задача 3/5
Аналитику могут сообщить, за какой срок собрали данные. Эту информацию лучше перепроверить. Понадобится столбец date_time, который хранит время прибытия водителей на АЗС.
Выведите минимальное и максимальное значения столбца date_time через пробел, вызвав функцию print() только один раз. Добавлять к выводу дополнительный текст или сохранять значения в переменные не нужно.
import pandas as pd
data = pd.read_csv ('/datasets/visits.csv', sep='\t')
#количество заездов на АЗС
total_visits = data['id'].count()
print('Количество заездов:', total_visits)
total_stations = len(data['id'].unique())
print('Количество АЗС:', total_stations)
print(data['date_time'].min(), data['date_time'].max())
Количество заездов: 317104
Количество АЗС: 471
20180402T000008 20180408T235957
Наблюдения происходили с 00:00:08 2 апреля 2018 года (20180402T000008) по 23:59:57 8 апреля 2018 года (20180408T235957). Сколько это дней?
Задача 4/5
Записи в столбце date_time хранятся в формате ISO:
YYYYMMDDTHHMMSS. T — разделитель между датой и временем. В предыдущей задаче вы обнаружили, что первая дата прибытия на АЗС — 2 апреля 2018 года в 00:00, а последняя — 8 апреля 2018 года в 23:59. Значит, данные покрывают семь дней. Теперь можно найти среднее количество посещений АЗС за день.
- Сохраните в переменную
total_daysколичество дней. - В переменную
station_visits_per_dayзапишите среднее количество визитов на АЗС за день. Чтобы посчитать среднее, используйте значения переменныхtotal_visits,total_stationsиtotal_days. Выведите на экран значение переменной в таком виде:
Количество заездов на АЗС в сутки: ...
import pandas as pd
data = pd.read_csv ('/datasets/visits.csv', sep='\t')
#количество заездов на АЗС
total_visits = data['id'].count()
print('Количество заездов:', total_visits)
total_stations = len(data['id'].unique())
print('Количество АЗС:', total_stations)
print(data['date_time'].min(), data['date_time'].max())
total_days = round(((pd.to_datetime(data['date_time'].max(), format='%Y%m%dT%H%M%S') - pd.to_datetime(data['date_time'].min(), format='%Y%m%dT%H%M%S'))/pd.Timedelta("1s")/60/60/24))
station_visits_per_day = total_visits/total_stations/total_days
print ('Количество заездов на АЗС в сутки:', station_visits_per_day)
Количество заездов: 317104
Количество АЗС: 471
20180402T000008 20180408T235957
Количество заездов на АЗС в сутки: 96.17955717318775
Почти 100 заездов на АЗС с включённым Яндекс.Навигатором в день. Похоже ли это на правду? Можно допустить, что на АЗС заправляется от одной до пяти машин в минуту. Ночью — меньше. Если взять среднюю оценку: одна машина в минуту — это 1440 заездов в сутки. Выходит, с включённым Яндекс.Навигатором на заправку заезжает меньше 10% водителей. Тогда число в 100 заездов кажется близким к истине. Вроде бы с объёмом данных всё в порядке.
Задача 5/5
Вы только что нашли среднее количество заездов за день. Но будьте осторожны со средними значениями. На них влияет даже небольшое количество экстремально малых или больших значений в данных. Поэтому важно смотреть на общее распределение.
Проверьте распределение числа заездов по сетям АЗС. Можно ожидать, что больше заездов будет на популярных станциях.
Выведите на экран 10 сетей АЗС с наибольшим количеством заездов, вызвав метод value_counts() для нужного столбца. Метод автоматически отсортирует данные по убыванию количества посещений, поэтому дополнительная сортировка не понадобится.
- Посчитайте количество уникальных значений в столбце name.
- Убедитесь, что данные отсортированы в порядке убывания, и выведите первые 10 строк.
import pandas as pd
data = pd.read_csv ('/datasets/visits.csv', sep='\t')
#количество заездов на АЗС
total_visits = data['id'].count()
print('Количество заездов:', total_visits)
total_stations = len(data['id'].unique())
print('Количество АЗС:', total_stations)
print(data['date_time'].min(), data['date_time'].max())
total_days = round(((pd.to_datetime(data['date_time'].max(), format='%Y%m%dT%H%M%S') - pd.to_datetime(data['date_time'].min(), format='%Y%m%dT%H%M%S'))/pd.Timedelta("1s")/60/60/24))
station_visits_per_day = total_visits/total_stations/total_days
print ('Количество заездов на АЗС в сутки:', station_visits_per_day)
print(data['name'].value_counts().head(10))
Количество заездов: 317104
Количество АЗС: 471
20180402T000008 20180408T235957
Количество заездов на АЗС в сутки: 96.17955717318775
Календула 85648
Василёк 79006
Георгина 34356
Немезия 20138
Колокольчик 18835
Мальва 17386
Гейхера 14125
Доротеантус 6312
Нарцисс 3640
Амарант 3221
Name: name, dtype: int64
Эксперты рынка АЗС подтвердили, что сети «Календула» и «Василёк» — крупнейшие игроки. Другие сети, по словам специалистов, также распределились правдоподобно.
Поздравляем! С объёмом данных всё в порядке. Нужно разбираться дальше.
Гистограмма
На первый взгляд данные выглядят корректно.
Однако есть гипотеза, что продолжительность заправки посчитана неверно: в некоторых сетях это время выглядит неправдоподобно маленьким. Напомним, вы считали среднее арифметическое. Оно не означает, что столько времени заправляются все водители: кто-то больше, кто-то меньше. Как представить себе значения, из которых рассчитано среднее, если в таблице тысячи строк? Не просматривать же каждую. Для ответа на этот вопрос строят гистограмму.
Гистограмма — это график, который показывает, как часто в наборе данных встречается то или иное значение. Гистограмма объединяет числовые значения по диапазонам, то есть считает частоту значений в пределах каждого интервала. Её построение подобно работе знакомого вам метода value_counts(), подсчитывающего количество уникальных значений в списке. value_counts() группирует строго одинаковые величины и хорош для подсчёта частоты в списках с категориальными переменными.
Сравните гистограмму с результатом работы метода value_counts() на примере данных о «Симпсонах» — знаменитом американском мультсериале. В 2021 году выходит уже 33-й сезон и 716-й эпизод. «Симпсоны» дважды вошли в Книгу рекордов Гиннесса: как самый длинный ситком в истории и как телевизионный сериал с наибольшим количеством приглашённых звёзд.
В датасете информация об эпизодах «Симпсонов»: название, дата выхода на экран, сезон, номер в сезоне и рейтинг. Стоит ли авторам и продюсерам сериала готовить новый сезон?
Помогите команде принять решение. Найдите рейтинг эпизодов сериала в прошлом.
simpsons = pd.read_csv('simpsons.csv')
print(simpsons.head())
id title season \
0 10 Homer's Night Out 1
1 12 Krusty Gets Busted 1
2 14 Bart Gets an "F" 2
3 17 Two Cars in Every Garage and Three Eyes on Eve... 2
4 19 Dead Putting Society 2
number_in_season imdb_rating
0 10 7.4
1 12 8.3
2 1 8.2
3 4 8.1
4 6 8.0
Методом value_counts() можно вывести количество серий, получивших тот или иной рейтинг:
print(simpsons['imdb_rating'].value_counts())
7.3 48
7.0 42
7.1 42
6.9 40
7.2 39
6.7 29
8.2 29
7.7 27
8.0 25
6.6 23
6.8 21
6.5 18
8.3 18
7.5 18
8.1 18
...
Ай, карамба! Такое представление данных никак не убедит продюсеров продолжать работу над «Симпсонами». Чтобы увидеть, какие оценки сериал получал чаще всего, можно построить гистограмму:

Чаще всего эпизоды получали оценки в районе 7 баллов и выше. Это очень хороший показатель для сериала. The show must go on!
В pandas гистограмму строит специальный метод hist() (от англ. histogram — «гистограмма»). Применять его можно к списку или к столбцу датафрейма: во втором случае название столбца передаётся в параметре. Метод hist() находит в наборе чисел минимальное и максимальное значения, а полученный диапазон делит на области, или корзины. Затем hist() считает, сколько значений попало в каждую корзину, и отображает это на графике.
Параметр bins (пер. «корзины, вёдра») определяет, на сколько областей делить диапазон данных. По умолчанию таких «корзин» 10.
Построим гистограмму, отображающую количество шаров в боулинге. Допустим, у нас по одному шару каждого номера от 6 до 16:
import pandas as pd
# строим гистограмму
pd.Series([6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]).hist()

Хотя на каждый номер приходится один шар, гистограмма не похожа на прямоугольник. Это потому, что по умолчанию параметр bins=10, а шаров 11. Передадим соответствующее число корзин и взглянем на полученный график:
pd.Series([6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]).hist(bins=11)
Теперь гистограмма соответствует действительности. Что, если количество шаров с разными номерами изменится? Скажем, будет два шара под номером 8 и ни одной «семёрки»?
pd.Series([6, 8, 8, 9, 10, 11, 12, 13, 14, 15, 16]).hist(bins=11)

Провал там, где должно быть значение 7. Частота появления восьмёрки увеличилась вдвое. График выглядит правдоподобно.
Что произойдёт, если в данных шестнадцатый шар вдруг станет шаром под номером 100, а пятнадцатый пропадёт вовсе?
pd.Series([6, 8, 8, 9, 10, 11, 12, 13, 14, 100]).hist()
# убрали параметр bins, так как шаров стало 10

Девять шаров со значениями в диапазоне от 5 до 15 и один шар с номером от 90 до 100. При таком изображении не видно тонких особенностей распределения значений в диапазоне от 5 до 15 — того, что в нём нет семёрки, а восьмёрок пара. Вернём детальность, увеличив число корзин до 100.
pd.Series([6, 8, 8, 9, 10, 11, 12, 13, 14, 100]).hist(bins=100)

На этом графике видно, что восьмёрка удвоена, а семёрка не встречается вовсе. Увеличив число корзин, мы вернули детализацию, однако гистограмма всё ещё не наглядна. 100 слишком похоже на выброс — значение, сильно отличающееся от других элементов в наборе данных.
Изменим масштаб вручную, указав диапазон значений, по которым следует строить график. Границы интересующего интервала указывают в параметре range (пер. «диапазон»): range=(min_value, max_value). Нужна область от 6 до 14:
pd.Series([6, 8, 8, 9, 10, 11, 12, 13, 14, 100]).hist(range = (6, 14))

Гистограмма даёт представление о структуре данных. В частности, по ней можно понять, откуда взялось такое среднее арифметическое. Вот 2 ряда по 10 чисел: их гистограммы очень разные, а среднее у обеих 5.
pd.Series([0, 0, 0, 0, 0, 10, 10, 10, 10, 10]).hist(range=(0, 10))

pd.Series([4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6]).hist(range=(0, 10))

Если смотреть только на среднее значение этих наборов данных, можно сказать, что они очень похожи. Однако описывающие их гистограммы дают понять, что это два очень разных явления. В интерактивной иллюстрации ниже вы можете самостоятельно построить гистограммы для разного количества случайных значений и корзин:
Пора применить гистограмму к реальной задаче. Напомним, что средняя продолжительность заправки выглядит неправдоподобно малой.
Задача 1/3
Медианные и средние значения недостаточно характеризуют данные. Настало время посмотреть на распределение значений. Постройте гистограмму по значениям времени, проведённого на АЗС. Эти значения хранятся в столбце time_spent.
import pandas as pd
data = pd.read_csv ('/datasets/visits.csv', sep='\t')
data['time_spent'].hist()
Почти все значения собрались в одном столбце. По такой гистограмме особо ничего и не скажешь.
Задача 2/3
Предыдущая гистограмма выглядит странно, потому что максимальное значение столбца time_spent сильно превышает большинство других значений. Измените код, чтобы гистограмма стала более информативной.
Постройте новую гистограмму и увеличьте число корзин до 100.
Задача 3/3
Итак, гистограмма стала более информативной. Можно исключить слишком большие значения времени заправки и посмотреть на остальные. Используйте параметр range, чтобы изучить распределение значений time_spent, находящихся в диапазоне от 0 до 1500. Количество корзин оставьте прежним — 100.
import pandas as pd
data = pd.read_csv ('/datasets/visits.csv', sep='\t')
#data['time_spent'].hist()
#data['time_spent'].hist(bins=100)
data['time_spent'].hist(bins=100, range = (0,1500))
льтат