Физтех.Статистика
Скачать ipynb
Введение в анализ данных¶
Домашнее задание 2. Простой анализ данных.¶
Правила, прочитайте внимательно:
- Выполненную работу нужно отправить телеграм-боту
@miptstats_ds23_bot
. Для начала работы с ботом каждый раз отправляйте/start
. Дождитесь подтверждения от бота, что он принял файл. Если подтверждения нет, то что-то не так. Работы, присланные иным способом, не принимаются. - Дедлайн см. в боте. После дедлайна работы не принимаются кроме случаев наличия уважительной причины.
- Прислать нужно ноутбук в формате
ipynb
и html-версии графиков (подробности в условии). - Телеграм не разрешает боту получать файлы более 20 Мб. Если ваше решение весит больше, заранее разделите ноутбук на несколько.
- Выполнять задание необходимо полностью самостоятельно. При обнаружении списывания все участники списывания будут сдавать устный зачет.
- Решения, размещенные на каких-либо интернет-ресурсах, не принимаются. Кроме того, публикация решения в открытом доступе может быть приравнена к предоставлении возможности списать.
- Для выполнения задания используйте этот ноутбук в качестве основы, ничего не удаляя из него. Можно добавлять необходимое количество ячеек.
- Комментарии к решению пишите в markdown-ячейках.
- Выполнение задания (ход решения, выводы и пр.) должно быть осуществлено на русском языке.
- Если код будет не понятен проверяющему, оценка может быть снижена.
- Никакой код из данного задания при проверке запускаться не будет. Если код студента не выполнен, недописан и т.д., то он не оценивается.
- Код из рассказанных на занятиях ноутбуков можно использовать без ограничений.
Перед выполнением задания посмотрите презентацию по выполнению и оформлению домашних заданий с занятия 1.
Баллы за задание:
Сложная часть (необходимо на "отл"):
- Задача 2 — 80 баллов
# Bot check
# HW_ID: fpmi_ad2
# Бот проверит этот ID и предупредит, если случайно сдать что-то не то
# Status: not final
# Перед отправкой в финальном решении удали "not" в строчке выше
# Так бот проверит, что ты отправляешь финальную версию, а не промежуточную
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
sns.set(style='whitegrid', font_scale=1.3, palette='Set2')
Сложная часть¶
Задача 2¶
Yelp — веб-сайт для поиска на местном рынке услуг, например ресторанов или парикмахерских, с возможностью добавлять и просматривать рейтинги и обзоры этих услуг. Для популярных бизнесов имеются сотни обзоров. Для обозревателей на сайте предусмотрены элементы социальной сети.
Вам предоставляется следующая информация о компаниях на Yelp:
Файл yelp_business.csv
:
business_id
— уникальный идентификатор компании;name
— имя компании;address
,city
,state
— месторасположении компании;latitude
,longitude
— географические координаты;categories
— категории услуг компании.
Файл yelp_review.csv
, содержащий оценки пользователей:
business_id
— идентификатор компании, соответствующий файлуyelp_business.csv
;stars
— поставленная пользователем оценка от 1 до 5.
В целях сокращения объема файла, текстовые отзывы пользователей не были включены.
Оригинальную версию датасета в формате json
можно посмотреть по ссылке, но использовать нужно выданные данные.
Что нужно сделать:
- Найти город с наибольшим количеством компаний;
- Для этого города определить районы с наиболее качественными услугами. Пример с несколько другой задачей.
- А также найти рестораны с наилучшими отзывами.
Далее в условии встречаются различные подсказки, как можно выполнить определенные части задачи. Вы можете их игнорировать и делать иным способом для получения того же самого промежуточного результата. Однако, если ваше решение окажется значительно менее эффективным (по скорости, количеству и красоте кода) по сравнению с предполагаемым, баллы могут быть снижены.
1. Город с наибольшим количеством компаний¶
Загрузите данные из файла yelp_business.csv
с помощью функции pd.read_csv
. Посмотрите на первые несколько строк с помощью метода head
.
...
Найдите пять городов, по которым присутствует информация о наибольшем количестве компаний. В таблице должен быть указан город (название) и количество компаний в этом городе.
Подсказка. Для выполнения стоит воспользоваться методами groupby
, count
, sort_values
, head
.
...
Пусть N
— город с наибольшим количеством компаний. Оставьте в таблице только записи, соответствующие городу N
. Нанесите все эти компании на график, в котором по оси $x$ отметьте долготу, а по оси $y$ — широту.
...
Сам город находится в сгустке точек. Есть какие-то компании, которые приписаны к этому городу, но находятся далеко от него. Избавьтесь от них, подобрав некоторые границы значений широты и долготы. Изобразите все компании на новом графике. На этом графике должны выделяться некоторые улицы.
...
Разберитесь с тем, как подгрузить интерактивную карту города в качестве фона графика. Можно пойти двумя следующими способами.
- Изучить материалы по библиотеке Plotly. Возможно, потребуется также заглянуть в документацию.
- Поразбираться с библиотекой Folium. Посмотрите множество примеров, может также помочь статья на русском.
Внимание! Интерактивная карта может не сохраниться в ноутбуке, а если сохранится, то вес ноутбука может превзойти 20 Мб, и его не получится отправить боту. В любом случае необходимо сохранить карту в html и отправить ее отдельным файлом в бот. При этом каждый файл html должен не превышать 20 Мб, присылать файлы в архиве нельзя. Аналогично со всеми следующими интерактивными графиками в этом задании.
...
Если все получилось, вы молодцы! Далее в этой задаче тоже стройте интерактивные карты. Если нет желания разбираться с интерактивными графиками, можно построить статичные, но баллы будут снижены.
2. Оценки компаний¶
Для выполнения задания нужно посчитать среднюю оценку каждой компании, а также количество выставленных оценок.
Загрузите таблицу оценок yelp_review.csv
.
...
В подгруженной таблице оценок оставьте только компании города N
. Для этого установите значения business_id
в качестве индекса у таблицы оценок и воспользуйтесь методом loc
.
Подсказка. Чтобы индекс снова сделать полем таблицы, можно воспользоваться методом reset_index
.
...
Теперь посчитайте среднюю оценку каждой компании, а также количество выставленных компании оценок.
Подсказка. Помочь в этом могут функции groupby
и aggregate([np.mean, np.size])
.
...
Назовите колонки таблицы красивыми именами, изменив <имя таблицы>.columns
, после чего напечатайте несколько строк полученной таблицы. Красивые имена — то, что будет понятно простому человеку при чтении ваших результатов. Как именно их назвать — задача аналитика, то есть в данном случае ваша :)
...
Соедините две полученные ранее таблицы по компаниям города N
в одну.
Для этого сначала установите поле business_id
в качестве индекса в обеих таблицах с помощью set_index
. В одной из них это уже должно было быть сделано.
В полученной таблице должны получится поля latitude
, longitude
, categories
, name
, а также две колонки со средней оценкой компаний и количеством оценок, которые вы посчитали выше.
Подсказка. Соединение таблиц можно выполнить с помощью join
.
Индексы у этих таблиц одинаковые, так что тип джойна не имеет значения.
...
Изобразите все компании на графике, раскрасив точку в цвет, оттенок которого соответствует средней оценке компании. Прозрачность точки выставляйте не более $0.3$. Если у одной компании несколько филиалов с разными адресами, наносите на график все адреса.
...
Чтобы получить районы города, то есть разделить город на "клетки", округлите значения широты и долготы, подобрав оптимальный размер района.
Подсказка. Например, можно сделать так
np.round(долгота*4, decimals=1)*0.25
.
...
Для получения средней оценки компаний по району постройте сводную таблицу при помощи pd.pivot_table
, взяв в качестве индексов и колонок округленные широту и долготу, а в качестве значений — оценки. Аггрегирующей функцией является среднее.
Изобразите полученную таблицу при помощи sns.heatmap
.
Замечание. В качестве среднего можно было бы посчитать как общее среднее по всем оценкам всех компаний, так и среднее по компаниям их средних оценок. В чем разница этих подходов? Какой из них необходимо использовать в данном случае?
...
Полученный график имеет ряд недостатков. Во-первых, не очень правильно судить о районе, если в нем мало компаний. Во-вторых, на графике цветовая гамма автоматически подстроилась под минимальное и максимальное значения оценки.
Почему эти недостатки могут быть существенными?
Ответ: <...>
Оставьте районы, в которых имеется информация о не менее $30$ компаний. Постройте новый график районов, использовав параметры vmin
и vmax
у функции sns.heatmap
.
...
Сравните полученный график с предыдущим и сделайте вывод.
Вывод: <...>
3. Рестораны¶
Будем считать компанию рестораном, если в поле categories
содержится слово restaurant
. Обратите внимание, что в анализе данных часто нет четкого формата данных. Например, данное слово может быть написано как с большой буквы, так и с маленькой; может как разделяться ;
, так и не разделяться. При возникновении недопонимания стоит посмотреть данные.
Составьте таблицу, в которой будет информация о всех ресторанах города N
, для которых имеется не менее $5$ отзывов. Далее постройте heatmap-график районов, в котором каждому району сопоставьте среднюю оценку по ресторанам этого района. Рассматривайте только те районы, в которых есть не менее $10$ ресторанов, для каждого из которых есть не менее $5$ отзывов.
...
Чем полезны ограничения снизу на количество отзывов для ресторана и количество ресторанов в районе?
Ответ: <...>
Кот Василий из города N
очень придирчив к выбору ресторана. Он доверяет только ресторанам с высоким рейтингом, который основывается на большом количестве отзывов. Напечатайте в виде таблицы информацию $10$ ресторанах с самым большим рейтингом в порядке убывания рейтинга. Для каждого из этих ресторанов должно быть не менее $50$ отзывов. По каждому ресторану необходимо вывести следующую информации: название ресторана, средняя оценка, количество отзывов, географические координаты, категории.
...
Нанесите на карту все рестораны со средней оценкой не менее $4.7$, которая посчитана по не менее $50$ отзывам. Отдельным цветом отметьте 10 ресторанов, которые вы получили ранее.
...
Охарактеризуйте кота Василия, а также сделайте общий вывод по задаче.
Вывод: <...>