├── README.md
├── analysis_of_bank_data
├── README.md
└── yandex_bank_karpova_new.ipynb
├── big_cities_music
├── README.md
└── yandex_music_karpova_new.ipynb
├── catering_market
├── README.md
└── yandex_restdata_karpova_new.ipynb
├── cell_phone_plan
├── README.md
└── yandex_megaline_karpova_new.ipynb
├── diplom.PNG
├── games
├── README.md
└── yandex_games_karpova_new.ipynb
├── graduation_project
├── README.md
├── yandex_ex1_bank_karpova_new.ipynb
├── yandex_ex1_bank_prez_ovkarpova.pdf
├── yandex_ex2_ab_karpova_new.ipynb
└── yandex_ex3_SQL_karpova_new.ipynb
├── gym_churn
├── README.md
└── yandex_gym_karpova_new.ipynb
├── hypothesis_ab
├── README.md
└── yandex_hypothesis_ab_karpova_new.ipynb
├── loss_analysis
├── README.md
└── yandex_procrastinate_karpova_new.ipynb
├── real_estate_market
├── README.md
└── yandex_realty_karpova_new.ipynb
├── sql
├── 1_sql_tasks.sql
└── README.md
├── sql_advanced
├── 2_sql_tasks.sql
└── README.md
├── sql_border2880_1628581406.png
├── sql_border2880_1628581407.png
└── user_behavior
├── README.md
└── yandex_logs_exp_karpova_new.ipynb
/README.md:
--------------------------------------------------------------------------------
1 | # Data analyst
2 |
3 | ## Описание:
4 | В репозитории представлены проекты курса [Аналитик данных](https://praktikum.yandex.ru/data-analyst/) (Яндекс.Практикум).
5 |
6 | ## Основные инструменты и навыки, полученные при обучении:
7 | - Языки: Python, SQL
8 | - Анализ данных: библиотеки Pandas, NumPy, SciPy, Statsmodels
9 | - Визуализация: Matplotlib, Plotly, Seaborn
10 | - Построение дашбордов: Tableau
11 | - Метрики юнит-экономики, когортный анализ
12 | - А/В-тестирование
13 | - Работа с гипотезами
14 | - Машинное обучение: библиотеки Scikit-learn, XGBoost
15 |
16 | ## Программа обучения:
17 | 
18 |
19 | ## Проекты:
20 | | №| Название и ссылка | О чем проект | Навыки и инструменты |
21 | |-----------|-------------------|------------------------------------------------------------------|-----------------------------------|
22 | |1 |[Вводный проект. Музыка больших городов](big_cities_music/)|Сравниваем данные пользователей Яндекс.Музыки по городам и дням недели|`Python` `Pandas`|
23 | |2 |[Исследование надежности заемщиков](analysis_of_bank_data/)|Разбираемся, влияет ли семейное положение и количество детей клиента на факт погашения кредита в срок. Анализируем данные о клиентах банка и определяем долю кредитоспособных|`предобработка данных` `Python` `Pandas`|
24 | |3 |[Исследование объявлений о продаже квартир](real_estate_market/)|Исследуем архив объявлений о продаже объектов недвижимости в Санкт-Петербурге и Ленинградской области (основные свойства данных, поиск закономерностей, распределений и аномалий)|`Python` `Pandas` `Matplotlib` `предобработка данных` `исследовательский анализ данных` `визуализация данных`|
25 | |4 |[Определение перспективного тарифа для телеком-компании](cell_phone_plan/)|Делаем предварительный анализ тарифов на небольшой выборке клиентов. Анализируем поведение клиентов и делаем вывод, какой тариф лучше| `Python` `Pandas` `Matplotlib` `NumPy` `SciPy` `проверка статистических гипотез` `описательная статистика`|
26 | |5 |Сборный проект 1. [Анализ рынка продаж компьютерных игр](games/)|Ищем закономерности в данных о продаже игры и выявляем те, которые определяют их успешность. Это позволият сделать ставку на потенциально популярный продукт и спланировать рекламные кампании|`Python` `Pandas` `NumPy` `Matplotlib` `предобработка данных` `исследовательский анализ данных` `описательная статистика` `проверка статистических гипотез`|
27 | |6 |[Базовый SQL](sql/)|Пишем ряд запросов разной сложности к базе данных, в которой хранятся данные по венчурным инвесторам, стартапам и инвестициям в них|`SQL` `PostgreSQL`|
28 | |7 |[Анализ бизнес-показателей развлекательного приложения](loss_analysis/)|На основе данных изучаем поведение пользователей, а также анализируем доходность клиентов и окупаемость рекламы, чтобы предложить рекомендации для отдела маркетинга|`Python` `Pandas` `Matplotlib` `когортный анализ` `юнит-экономика` `продуктовые метрики` `Seaborn`|
29 | |8 |[Продвинутый SQL](sql_advanced/)|С помощью Python и SQL подключаемся к базе данных, считаем и визуализируем ключевые метрики сервис-системы вопросов и ответов о программировании|`SQL` `PostgreSQL`|
30 | |9 |[Принятие решений в бизнесе](hypothesis_ab/)|Анализируем результаты A/B-тестирования в крупном интернет-магазине, приоритизируем гипотезы|`Python` `Pandas` `Matplotlib` `SciPy` `A/B-тестирование` `проверка статистических гипотез`|
31 | |10 |Сборный проект 2. [Анализ поведения пользователей мобильного приложения](user_behavior/)|Исследуем воронку продаж и анализируем результаты A/A/B-тестирования в мобильном приложении|`Python` `Pandas` `Matplotlib` `SciPy` `A/B-тестирование` `проверка статистических гипотез` `Seaborn` `событийная аналитика` `продуктовые метрики` `Plotly` `визуализация данных`|
32 | |11 |[Исследование рынка общественного питания](catering_market)|Исследование рынка на основе открытых данных о заведениях общественного питания Москвы|`Python` `Pandas` `Matplotlib` `Seaborn` `Plotly` `визуализация данных`|
33 | |12 |[Дашборд для Яндекс.Дзена](https://public.tableau.com/app/profile/oxana3540/viz/dashboard_YZen_ovk/Dashboard_YaZen) и [Презентация](https://disk.yandex.ru/i/pr1-iJXmgZGNaA)|Разрабатываем и презентуем дашборд для анализа пользовательского взаимодействия в сервисе Яндекс.Дзен (Tableau Public)|`Python` `PostgreSQL` `Tableau` `продуктовые метрики` `построение дашбордов`|
34 | |13 |[Прогнозирование оттока клиентов сети фитнес-центров](gym_churn/)|Разрабатываем модель машинного обучения для прогнозирования оттока клиентов в фитнес-центре. Наша задача — провести анализ, составить портреты клиентов и подготовить план действий по их удержанию|`Python` `Pandas` `Scikit-learn` `Matplotlib` `Seaborn` `машинное обучение` `классификация` `кластеризация`|
35 | |14 |[Выпускной проект](graduation_project/). [Банки — cегментация пользователей по потреблению продуктов](https://github.com/ovalentinka/Data_analyst/blob/c2e103c7f7d92711fbd40179cdc8134f6d8eccca/graduation_project/yandex_ex1_bank_karpova_new.ipynb), [Презентация](https://github.com/ovalentinka/Data_analyst/blob/3bf2397fe88cd31b36c5b31d4de416e04f80fd63/graduation_project/yandex_ex1_bank_prez_ovkarpova.pdf) и [Дашборд](https://public.tableau.com/app/profile/oxana3540/viz/product_activity/Dashboard1); [А/B тестирование](https://github.com/ovalentinka/Data_analyst/blob/c2e103c7f7d92711fbd40179cdc8134f6d8eccca/graduation_project/yandex_ex2_ab_karpova_new.ipynb), [SQL](https://github.com/ovalentinka/Data_analyst/blob/3e4272acf1b22cbf9e49706375ad128ead6b89b8/graduation_project/yandex_ex3_SQL_karpova_new.ipynb)|Анализируем заемщиков банка (результат оформляем в виде Презентации), проверяем результаты А/B тестирования и подтверждаем гипотезы, разрабатываем дашборд в Tableau Public. изучаем мобильное приложение посредством SQL-запросов. |`SQL` `PostgreSQL` `Python` `Pandas` `Scikit-learn` `Matplotlib` `Seaborn` `машинное обучение` `классификация` `кластеризация` `Tableau` `продуктовые метрики` `построение дашбордов` `A/B-тестирование` `проверка статистических гипотез`|
36 |
--------------------------------------------------------------------------------
/analysis_of_bank_data/README.md:
--------------------------------------------------------------------------------
1 | # Исследование надежности заёмщиков
2 |
3 | ## Задача
4 |
5 | Нужно разобраться, как разные характеристика клиента влияют на факт погашения кредита в срок, а так же ответить на вопросы:
6 |
7 | - есть ли зависимость между количеством детей и возвратом кредита в срок?
8 | - есть ли зависимость между семейным положением и возвратом кредита в срок?
9 | - есть ли зависимость между уровнем дохода и возвратом кредита в срок?
10 | - как разные цели кредита влияют на его возврат в срок?
11 |
12 | ## Данные
13 |
14 | Статистика о платёжеспособности клиентов:
15 | - количество детей в семье;
16 | - общий трудовой стаж в днях;
17 | - возраст клиента в годах;
18 | - уровень образования клиента;
19 | - идентификатор уровня образования;
20 | - семейное положение;
21 | - идентификатор семейного положения;
22 | - пол клиента;
23 | - тип занятости;
24 | - имел ли задолженность по возврату кредитов;
25 | - ежемесячный доход;
26 | - цель получения кредита;
27 |
28 | ## Используемые библиотеки
29 |
30 | *pandas, seaborn*
31 |
--------------------------------------------------------------------------------
/big_cities_music/README.md:
--------------------------------------------------------------------------------
1 | # Музыка больших городов
2 | Ввводный проект.
3 |
4 | ## Данные
5 |
6 | В наличии были следующие данные о прослушиваниях треков в сервисе Яндекс.Музыка:
7 | - название трека;
8 | - исполнитель;
9 | - жанр;
10 | - город;
11 | - день прослушивания;
12 | - время прослушивания;
13 |
14 | ## Задача
15 |
16 | Провести сравнение музыкальных предпочтений у пользователей Яндекс.Музыки, проживающих в Москве и Санкт-Петербурге. Сравнить прослушивания в понедельник, среду и пятницу по городам, а также сравнить жанры, которые слушают пользователи утром в понедельник и вечером в пятницу в Москве и Санкт-Петербурге.
17 |
18 | ## Используемые библиотеки
19 |
20 | *pandas*
21 |
--------------------------------------------------------------------------------
/big_cities_music/yandex_music_karpova_new.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "cell_type": "markdown",
5 | "metadata": {
6 | "id": "E0vqbgi9ay0H"
7 | },
8 | "source": [
9 | "# Музыка больших городов"
10 | ]
11 | },
12 | {
13 | "cell_type": "markdown",
14 | "metadata": {
15 | "id": "VUC88oWjTJw2"
16 | },
17 | "source": [
18 | "Сравнение Москвы и Петербурга окружено мифами. Например:\n",
19 | " * Москва — мегаполис, подчинённый жёсткому ритму рабочей недели;\n",
20 | " * Петербург — культурная столица, со своими вкусами.\n",
21 | "\n",
22 | "На данных Яндекс.Музыки мы сравним поведение пользователей двух столиц.\n",
23 | "\n",
24 | "**Цель исследования** — проверьте три гипотезы:\n",
25 | "1. Активность пользователей зависит от дня недели. Причём в Москве и Петербурге это проявляется по-разному.\n",
26 | "2. В понедельник утром в Москве преобладают одни жанры, а в Петербурге — другие. Так же и вечером пятницы преобладают разные жанры — в зависимости от города. \n",
27 | "3. Москва и Петербург предпочитают разные жанры музыки. В Москве чаще слушают поп-музыку, в Петербурге — русский рэп.\n",
28 | "\n",
29 | "**Ход исследования**\n",
30 | "\n",
31 | "Данные о поведении пользователей мы получили из файла `yandex_music_project.csv`. О качестве данных ничего не известно. Поэтому перед проверкой гипотез понадобится обзор данных. \n",
32 | "\n",
33 | "Мы проверим данные на ошибки и оценим их влияние на исследование. Затем, на этапе предобработки поищем возможность исправить самые критичные ошибки данных.\n",
34 | " \n",
35 | "Таким образом, исследование пройдёт в три этапа:\n",
36 | " 1. Обзор данных.\n",
37 | " 2. Предобработка данных.\n",
38 | " 3. Проверка гипотез.\n",
39 | "\n"
40 | ]
41 | },
42 | {
43 | "cell_type": "markdown",
44 | "metadata": {
45 | "id": "Ml1hmfXC_Zcs"
46 | },
47 | "source": [
48 | "## Обзор данных\n",
49 | "\n",
50 | "Составим первое представление о данных Яндекс.Музыки.\n",
51 | "\n",
52 | "\n"
53 | ]
54 | },
55 | {
56 | "cell_type": "code",
57 | "execution_count": 1,
58 | "metadata": {
59 | "id": "AXN7PHPN_Zcs"
60 | },
61 | "outputs": [],
62 | "source": [
63 | "import pandas as pd # импорт библиотеки pandas"
64 | ]
65 | },
66 | {
67 | "cell_type": "markdown",
68 | "metadata": {
69 | "id": "SG23P8tt_Zcs"
70 | },
71 | "source": [
72 | "Прочитаем файл `yandex_music_project.csv` и сохраним его в переменной `df`:"
73 | ]
74 | },
75 | {
76 | "cell_type": "code",
77 | "execution_count": 2,
78 | "metadata": {
79 | "id": "fFVu7vqh_Zct"
80 | },
81 | "outputs": [],
82 | "source": [
83 | "df = pd.read_csv(r'C:\\Dev\\Jupyter\\dist\\projects\\yandex_music_project.csv') # чтение файла с данными и сохранение в df"
84 | ]
85 | },
86 | {
87 | "cell_type": "markdown",
88 | "metadata": {
89 | "id": "rDoOMd3uTqnZ"
90 | },
91 | "source": [
92 | "Выведем на экран первые десять строк таблицы:"
93 | ]
94 | },
95 | {
96 | "cell_type": "code",
97 | "execution_count": 3,
98 | "metadata": {
99 | "id": "oWTVX3gW_Zct"
100 | },
101 | "outputs": [
102 | {
103 | "data": {
104 | "text/html": [
105 | "
\n",
106 | "\n",
119 | "
\n",
120 | " \n",
121 | " \n",
122 | " | \n",
123 | " userID | \n",
124 | " Track | \n",
125 | " artist | \n",
126 | " genre | \n",
127 | " City | \n",
128 | " time | \n",
129 | " Day | \n",
130 | "
\n",
131 | " \n",
132 | " \n",
133 | " \n",
134 | " 0 | \n",
135 | " FFB692EC | \n",
136 | " Kamigata To Boots | \n",
137 | " The Mass Missile | \n",
138 | " rock | \n",
139 | " Saint-Petersburg | \n",
140 | " 20:28:33 | \n",
141 | " Wednesday | \n",
142 | "
\n",
143 | " \n",
144 | " 1 | \n",
145 | " 55204538 | \n",
146 | " Delayed Because of Accident | \n",
147 | " Andreas Rönnberg | \n",
148 | " rock | \n",
149 | " Moscow | \n",
150 | " 14:07:09 | \n",
151 | " Friday | \n",
152 | "
\n",
153 | " \n",
154 | " 2 | \n",
155 | " 20EC38 | \n",
156 | " Funiculì funiculà | \n",
157 | " Mario Lanza | \n",
158 | " pop | \n",
159 | " Saint-Petersburg | \n",
160 | " 20:58:07 | \n",
161 | " Wednesday | \n",
162 | "
\n",
163 | " \n",
164 | " 3 | \n",
165 | " A3DD03C9 | \n",
166 | " Dragons in the Sunset | \n",
167 | " Fire + Ice | \n",
168 | " folk | \n",
169 | " Saint-Petersburg | \n",
170 | " 08:37:09 | \n",
171 | " Monday | \n",
172 | "
\n",
173 | " \n",
174 | " 4 | \n",
175 | " E2DC1FAE | \n",
176 | " Soul People | \n",
177 | " Space Echo | \n",
178 | " dance | \n",
179 | " Moscow | \n",
180 | " 08:34:34 | \n",
181 | " Monday | \n",
182 | "
\n",
183 | " \n",
184 | " 5 | \n",
185 | " 842029A1 | \n",
186 | " Преданная | \n",
187 | " IMPERVTOR | \n",
188 | " rusrap | \n",
189 | " Saint-Petersburg | \n",
190 | " 13:09:41 | \n",
191 | " Friday | \n",
192 | "
\n",
193 | " \n",
194 | " 6 | \n",
195 | " 4CB90AA5 | \n",
196 | " True | \n",
197 | " Roman Messer | \n",
198 | " dance | \n",
199 | " Moscow | \n",
200 | " 13:00:07 | \n",
201 | " Wednesday | \n",
202 | "
\n",
203 | " \n",
204 | " 7 | \n",
205 | " F03E1C1F | \n",
206 | " Feeling This Way | \n",
207 | " Polina Griffith | \n",
208 | " dance | \n",
209 | " Moscow | \n",
210 | " 20:47:49 | \n",
211 | " Wednesday | \n",
212 | "
\n",
213 | " \n",
214 | " 8 | \n",
215 | " 8FA1D3BE | \n",
216 | " И вновь продолжается бой | \n",
217 | " NaN | \n",
218 | " ruspop | \n",
219 | " Moscow | \n",
220 | " 09:17:40 | \n",
221 | " Friday | \n",
222 | "
\n",
223 | " \n",
224 | " 9 | \n",
225 | " E772D5C0 | \n",
226 | " Pessimist | \n",
227 | " NaN | \n",
228 | " dance | \n",
229 | " Saint-Petersburg | \n",
230 | " 21:20:49 | \n",
231 | " Wednesday | \n",
232 | "
\n",
233 | " \n",
234 | "
\n",
235 | "
"
236 | ],
237 | "text/plain": [
238 | " userID Track artist genre \\\n",
239 | "0 FFB692EC Kamigata To Boots The Mass Missile rock \n",
240 | "1 55204538 Delayed Because of Accident Andreas Rönnberg rock \n",
241 | "2 20EC38 Funiculì funiculà Mario Lanza pop \n",
242 | "3 A3DD03C9 Dragons in the Sunset Fire + Ice folk \n",
243 | "4 E2DC1FAE Soul People Space Echo dance \n",
244 | "5 842029A1 Преданная IMPERVTOR rusrap \n",
245 | "6 4CB90AA5 True Roman Messer dance \n",
246 | "7 F03E1C1F Feeling This Way Polina Griffith dance \n",
247 | "8 8FA1D3BE И вновь продолжается бой NaN ruspop \n",
248 | "9 E772D5C0 Pessimist NaN dance \n",
249 | "\n",
250 | " City time Day \n",
251 | "0 Saint-Petersburg 20:28:33 Wednesday \n",
252 | "1 Moscow 14:07:09 Friday \n",
253 | "2 Saint-Petersburg 20:58:07 Wednesday \n",
254 | "3 Saint-Petersburg 08:37:09 Monday \n",
255 | "4 Moscow 08:34:34 Monday \n",
256 | "5 Saint-Petersburg 13:09:41 Friday \n",
257 | "6 Moscow 13:00:07 Wednesday \n",
258 | "7 Moscow 20:47:49 Wednesday \n",
259 | "8 Moscow 09:17:40 Friday \n",
260 | "9 Saint-Petersburg 21:20:49 Wednesday "
261 | ]
262 | },
263 | "execution_count": 3,
264 | "metadata": {},
265 | "output_type": "execute_result"
266 | }
267 | ],
268 | "source": [
269 | "df.head(10) # получение первых 10 строк таблицы df"
270 | ]
271 | },
272 | {
273 | "cell_type": "markdown",
274 | "metadata": {
275 | "id": "EO73Kwic_Zct"
276 | },
277 | "source": [
278 | "Одной командой получаем общую информацию о таблице:"
279 | ]
280 | },
281 | {
282 | "cell_type": "code",
283 | "execution_count": 4,
284 | "metadata": {
285 | "id": "DSf2kIb-_Zct"
286 | },
287 | "outputs": [
288 | {
289 | "name": "stdout",
290 | "output_type": "stream",
291 | "text": [
292 | "\n",
293 | "RangeIndex: 65079 entries, 0 to 65078\n",
294 | "Data columns (total 7 columns):\n",
295 | " # Column Non-Null Count Dtype \n",
296 | "--- ------ -------------- ----- \n",
297 | " 0 userID 65079 non-null object\n",
298 | " 1 Track 63848 non-null object\n",
299 | " 2 artist 57876 non-null object\n",
300 | " 3 genre 63881 non-null object\n",
301 | " 4 City 65079 non-null object\n",
302 | " 5 time 65079 non-null object\n",
303 | " 6 Day 65079 non-null object\n",
304 | "dtypes: object(7)\n",
305 | "memory usage: 3.5+ MB\n"
306 | ]
307 | }
308 | ],
309 | "source": [
310 | "df.info()# получение общей информации о данных в таблице df"
311 | ]
312 | },
313 | {
314 | "cell_type": "markdown",
315 | "metadata": {
316 | "id": "TaQ2Iwbr_Zct"
317 | },
318 | "source": [
319 | "Итак, в таблице семь столбцов. Тип данных во всех столбцах — `object`.\n",
320 | "\n",
321 | "Согласно документации к данным:\n",
322 | "* `userID` — идентификатор пользователя;\n",
323 | "* `Track` — название трека; \n",
324 | "* `artist` — имя исполнителя;\n",
325 | "* `genre` — название жанра;\n",
326 | "* `City` — город пользователя;\n",
327 | "* `time` — время начала прослушивания;\n",
328 | "* `Day` — день недели.\n",
329 | "\n",
330 | "В названиях колонок видны три нарушения стиля:\n",
331 | "1. Строчные буквы сочетаются с прописными.\n",
332 | "2. Встречаются пробелы.\n",
333 | "3. Используется CamelCase.\n",
334 | "\n",
335 | "\n",
336 | "\n",
337 | "Количество значений в столбцах различается. Значит, в данных есть пропущенные значения.\n"
338 | ]
339 | },
340 | {
341 | "cell_type": "markdown",
342 | "metadata": {
343 | "id": "MCB6-dXG_Zct"
344 | },
345 | "source": [
346 | "**Выводы**\n",
347 | "\n",
348 | "В каждой строке таблицы — данные о прослушанном треке. Часть колонок описывает саму композицию: название, исполнителя и жанр. Остальные данные рассказывают о пользователе: из какого он города, когда он слушал музыку. \n",
349 | "\n",
350 | "Предварительно можно утверждать, что, данных достаточно для проверки гипотез. Но встречаются пропуски в данных, а в названиях колонок — расхождения с хорошим стилем.\n",
351 | "\n",
352 | "Чтобы двигаться дальше, нужно устранить проблемы в данных."
353 | ]
354 | },
355 | {
356 | "cell_type": "markdown",
357 | "metadata": {
358 | "id": "SjYF6Ub9_Zct"
359 | },
360 | "source": [
361 | "## Предобработка данных\n",
362 | "Исправим стиль в заголовках столбцов, исключим пропуски. Затем проверим данные на дубликаты."
363 | ]
364 | },
365 | {
366 | "cell_type": "markdown",
367 | "metadata": {
368 | "id": "dIaKXr29_Zct"
369 | },
370 | "source": [
371 | "### Стиль заголовков\n",
372 | "Выведем на экран названия столбцов:"
373 | ]
374 | },
375 | {
376 | "cell_type": "code",
377 | "execution_count": 5,
378 | "metadata": {
379 | "id": "oKOTdF_Q_Zct"
380 | },
381 | "outputs": [
382 | {
383 | "data": {
384 | "text/plain": [
385 | "Index([' userID', 'Track', 'artist', 'genre', ' City ', 'time', 'Day'], dtype='object')"
386 | ]
387 | },
388 | "execution_count": 5,
389 | "metadata": {},
390 | "output_type": "execute_result"
391 | }
392 | ],
393 | "source": [
394 | "df.columns # перечень названий столбцов таблицы df"
395 | ]
396 | },
397 | {
398 | "cell_type": "markdown",
399 | "metadata": {
400 | "id": "zj5534cv_Zct"
401 | },
402 | "source": [
403 | "Приведем названия в соответствие с хорошим стилем:\n",
404 | "* несколько слов в названии запишем в «змеином_регистре»,\n",
405 | "* все символы сделаем строчными,\n",
406 | "* устраним пробелы.\n",
407 | "\n",
408 | "Для этого переименум колонки так:\n",
409 | "* `' userID'` → `'user_id'`;\n",
410 | "* `'Track'` → `'track'`;\n",
411 | "* `' City '` → `'city'`;\n",
412 | "* `'Day'` → `'day'`."
413 | ]
414 | },
415 | {
416 | "cell_type": "code",
417 | "execution_count": 6,
418 | "metadata": {
419 | "id": "ISlFqs5y_Zct"
420 | },
421 | "outputs": [],
422 | "source": [
423 | "df = df.rename(columns={' userID':'user_id', 'Track':'track', ' City ':'city', 'Day':'day'})# переименование столбцов"
424 | ]
425 | },
426 | {
427 | "cell_type": "markdown",
428 | "metadata": {
429 | "id": "1dqbh00J_Zct"
430 | },
431 | "source": [
432 | "Проверка результата:"
433 | ]
434 | },
435 | {
436 | "cell_type": "code",
437 | "execution_count": 7,
438 | "metadata": {
439 | "id": "d4NOAmTW_Zct"
440 | },
441 | "outputs": [
442 | {
443 | "data": {
444 | "text/plain": [
445 | "Index(['user_id', 'track', 'artist', 'genre', 'city', 'time', 'day'], dtype='object')"
446 | ]
447 | },
448 | "execution_count": 7,
449 | "metadata": {},
450 | "output_type": "execute_result"
451 | }
452 | ],
453 | "source": [
454 | "df.columns # проверка результатов - перечень названий столбцов"
455 | ]
456 | },
457 | {
458 | "cell_type": "markdown",
459 | "metadata": {
460 | "id": "5ISfbcfY_Zct"
461 | },
462 | "source": [
463 | "### Пропуски значений\n",
464 | "Подсчитаем, сколько в таблице пропущенных значений. Для этого достаточно двух методов `pandas`:"
465 | ]
466 | },
467 | {
468 | "cell_type": "code",
469 | "execution_count": 8,
470 | "metadata": {
471 | "id": "RskX29qr_Zct"
472 | },
473 | "outputs": [
474 | {
475 | "data": {
476 | "text/plain": [
477 | "user_id 0\n",
478 | "track 1231\n",
479 | "artist 7203\n",
480 | "genre 1198\n",
481 | "city 0\n",
482 | "time 0\n",
483 | "day 0\n",
484 | "dtype: int64"
485 | ]
486 | },
487 | "execution_count": 8,
488 | "metadata": {},
489 | "output_type": "execute_result"
490 | }
491 | ],
492 | "source": [
493 | "df.isna().sum() # подсчёт пропусков"
494 | ]
495 | },
496 | {
497 | "cell_type": "markdown",
498 | "metadata": {
499 | "id": "qubhgnlO_Zct"
500 | },
501 | "source": [
502 | "Не все пропущенные значения влияют на исследование. Так в `track` и `artist` пропуски не важны для нашей работы. Достаточно заменить их явными обозначениями.\n",
503 | "\n",
504 | "Но пропуски в `genre` могут помешать сравнению музыкальных вкусов в Москве и Санкт-Петербурге. На практике было бы правильно установить причину пропусков и восстановить данные. Такой возможности нет в учебном проекте. Придётся:\n",
505 | "* заполнить и эти пропуски явными обозначениями,\n",
506 | "* оценить, насколько они повредят расчётам. "
507 | ]
508 | },
509 | {
510 | "cell_type": "markdown",
511 | "metadata": {
512 | "id": "fSv2laPA_Zct"
513 | },
514 | "source": [
515 | "Заменим пропущенные значения в столбцах `track`, `artist` и `genre` на строку `'unknown'`. Для этого создадим список `columns_to_replace`, переберем его элементы циклом `for` и для каждого столбца выполним замену пропущенных значений:"
516 | ]
517 | },
518 | {
519 | "cell_type": "code",
520 | "execution_count": 9,
521 | "metadata": {
522 | "id": "KplB5qWs_Zct"
523 | },
524 | "outputs": [],
525 | "source": [
526 | "columns_to_replace = ['track', 'artist', 'genre'] # создаем список столбцов, пропущенные значения которых будут обновлены\n",
527 | "\n",
528 | "for colunm in columns_to_replace:\n",
529 | " df[colunm] = df[colunm].fillna('unknown')# перебор названий столбцов в цикле и замена пропущенных значений на 'unknown'"
530 | ]
531 | },
532 | {
533 | "cell_type": "markdown",
534 | "metadata": {
535 | "id": "Ilsm-MZo_Zct"
536 | },
537 | "source": [
538 | "Убеждаемся, что в таблице не осталось пропусков. Для этого ещё раз посчитаем пропущенные значения."
539 | ]
540 | },
541 | {
542 | "cell_type": "code",
543 | "execution_count": 10,
544 | "metadata": {
545 | "id": "Tq4nYRX4_Zct"
546 | },
547 | "outputs": [
548 | {
549 | "data": {
550 | "text/plain": [
551 | "user_id 0\n",
552 | "track 0\n",
553 | "artist 0\n",
554 | "genre 0\n",
555 | "city 0\n",
556 | "time 0\n",
557 | "day 0\n",
558 | "dtype: int64"
559 | ]
560 | },
561 | "execution_count": 10,
562 | "metadata": {},
563 | "output_type": "execute_result"
564 | }
565 | ],
566 | "source": [
567 | "df.isna().sum() # подсчёт пропусков"
568 | ]
569 | },
570 | {
571 | "cell_type": "markdown",
572 | "metadata": {
573 | "id": "BWKRtBJ3_Zct"
574 | },
575 | "source": [
576 | "### Дубликаты\n",
577 | "Считаем явные дубликаты в таблице одной командой:"
578 | ]
579 | },
580 | {
581 | "cell_type": "code",
582 | "execution_count": 11,
583 | "metadata": {
584 | "id": "36eES_S0_Zct"
585 | },
586 | "outputs": [
587 | {
588 | "data": {
589 | "text/plain": [
590 | "3826"
591 | ]
592 | },
593 | "execution_count": 11,
594 | "metadata": {},
595 | "output_type": "execute_result"
596 | }
597 | ],
598 | "source": [
599 | "df.duplicated().sum() # подсчёт явных дубликатов"
600 | ]
601 | },
602 | {
603 | "cell_type": "markdown",
604 | "metadata": {
605 | "id": "Ot25h6XR_Zct"
606 | },
607 | "source": [
608 | "Вызываем специальный метод `pandas`, чтобы удалить явные дубликаты:"
609 | ]
610 | },
611 | {
612 | "cell_type": "code",
613 | "execution_count": 12,
614 | "metadata": {
615 | "id": "exFHq6tt_Zct"
616 | },
617 | "outputs": [],
618 | "source": [
619 | "df = df.drop_duplicates().reset_index(drop=True) # удаление явных дубликатов (с удалением старых индексов и формированием новых)"
620 | ]
621 | },
622 | {
623 | "cell_type": "markdown",
624 | "metadata": {
625 | "id": "Im2YwBEG_Zct"
626 | },
627 | "source": [
628 | "Ещё раз считаем явные дубликаты в таблице и убеждаемся, что полностью от них избавились:"
629 | ]
630 | },
631 | {
632 | "cell_type": "code",
633 | "execution_count": 13,
634 | "metadata": {
635 | "id": "-8PuNWQ0_Zct"
636 | },
637 | "outputs": [
638 | {
639 | "data": {
640 | "text/plain": [
641 | "0"
642 | ]
643 | },
644 | "execution_count": 13,
645 | "metadata": {},
646 | "output_type": "execute_result"
647 | }
648 | ],
649 | "source": [
650 | "df.duplicated().sum() # проверка на отсутствие дубликатов"
651 | ]
652 | },
653 | {
654 | "cell_type": "markdown",
655 | "metadata": {
656 | "id": "QlFBsxAr_Zct"
657 | },
658 | "source": [
659 | "Теперь избавляемся от неявных дубликатов в колонке `genre`. Например, название одного и того же жанра может быть записано немного по-разному. Такие ошибки тоже повлияют на результат исследования."
660 | ]
661 | },
662 | {
663 | "cell_type": "markdown",
664 | "metadata": {
665 | "id": "eSjWwsOh_Zct"
666 | },
667 | "source": [
668 | "Выведим на экран список уникальных названий жанров, отсортированный в алфавитном порядке. Для этого:\n",
669 | "* извлекаем нужный столбец датафрейма, \n",
670 | "* применим к нему метод сортировки,\n",
671 | "* для отсортированного столбца вызовем метод, который вернёт уникальные значения из столбца."
672 | ]
673 | },
674 | {
675 | "cell_type": "code",
676 | "execution_count": 14,
677 | "metadata": {
678 | "id": "JIUcqzZN_Zct",
679 | "scrolled": true
680 | },
681 | "outputs": [
682 | {
683 | "data": {
684 | "text/plain": [
685 | "['acid',\n",
686 | " 'acoustic',\n",
687 | " 'action',\n",
688 | " 'adult',\n",
689 | " 'africa',\n",
690 | " 'afrikaans',\n",
691 | " 'alternative',\n",
692 | " 'alternativepunk',\n",
693 | " 'ambient',\n",
694 | " 'americana',\n",
695 | " 'animated',\n",
696 | " 'anime',\n",
697 | " 'arabesk',\n",
698 | " 'arabic',\n",
699 | " 'arena',\n",
700 | " 'argentinetango',\n",
701 | " 'art',\n",
702 | " 'audiobook',\n",
703 | " 'author',\n",
704 | " 'avantgarde',\n",
705 | " 'axé',\n",
706 | " 'baile',\n",
707 | " 'balkan',\n",
708 | " 'beats',\n",
709 | " 'bigroom',\n",
710 | " 'black',\n",
711 | " 'bluegrass',\n",
712 | " 'blues',\n",
713 | " 'bollywood',\n",
714 | " 'bossa',\n",
715 | " 'brazilian',\n",
716 | " 'breakbeat',\n",
717 | " 'breaks',\n",
718 | " 'broadway',\n",
719 | " 'cantautori',\n",
720 | " 'cantopop',\n",
721 | " 'canzone',\n",
722 | " 'caribbean',\n",
723 | " 'caucasian',\n",
724 | " 'celtic',\n",
725 | " 'chamber',\n",
726 | " 'chanson',\n",
727 | " 'children',\n",
728 | " 'chill',\n",
729 | " 'chinese',\n",
730 | " 'choral',\n",
731 | " 'christian',\n",
732 | " 'christmas',\n",
733 | " 'classical',\n",
734 | " 'classicmetal',\n",
735 | " 'club',\n",
736 | " 'colombian',\n",
737 | " 'comedy',\n",
738 | " 'conjazz',\n",
739 | " 'contemporary',\n",
740 | " 'country',\n",
741 | " 'cuban',\n",
742 | " 'dance',\n",
743 | " 'dancehall',\n",
744 | " 'dancepop',\n",
745 | " 'dark',\n",
746 | " 'death',\n",
747 | " 'deep',\n",
748 | " 'deutschrock',\n",
749 | " 'deutschspr',\n",
750 | " 'dirty',\n",
751 | " 'disco',\n",
752 | " 'dnb',\n",
753 | " 'documentary',\n",
754 | " 'downbeat',\n",
755 | " 'downtempo',\n",
756 | " 'drum',\n",
757 | " 'dub',\n",
758 | " 'dubstep',\n",
759 | " 'eastern',\n",
760 | " 'easy',\n",
761 | " 'electronic',\n",
762 | " 'electropop',\n",
763 | " 'emo',\n",
764 | " 'entehno',\n",
765 | " 'epicmetal',\n",
766 | " 'estrada',\n",
767 | " 'ethnic',\n",
768 | " 'eurofolk',\n",
769 | " 'european',\n",
770 | " 'experimental',\n",
771 | " 'extrememetal',\n",
772 | " 'fado',\n",
773 | " 'fairytail',\n",
774 | " 'film',\n",
775 | " 'fitness',\n",
776 | " 'flamenco',\n",
777 | " 'folk',\n",
778 | " 'folklore',\n",
779 | " 'folkmetal',\n",
780 | " 'folkrock',\n",
781 | " 'folktronica',\n",
782 | " 'forró',\n",
783 | " 'frankreich',\n",
784 | " 'französisch',\n",
785 | " 'french',\n",
786 | " 'funk',\n",
787 | " 'future',\n",
788 | " 'gangsta',\n",
789 | " 'garage',\n",
790 | " 'german',\n",
791 | " 'ghazal',\n",
792 | " 'gitarre',\n",
793 | " 'glitch',\n",
794 | " 'gospel',\n",
795 | " 'gothic',\n",
796 | " 'grime',\n",
797 | " 'grunge',\n",
798 | " 'gypsy',\n",
799 | " 'handsup',\n",
800 | " \"hard'n'heavy\",\n",
801 | " 'hardcore',\n",
802 | " 'hardstyle',\n",
803 | " 'hardtechno',\n",
804 | " 'hip',\n",
805 | " 'hip-hop',\n",
806 | " 'hiphop',\n",
807 | " 'historisch',\n",
808 | " 'holiday',\n",
809 | " 'hop',\n",
810 | " 'horror',\n",
811 | " 'house',\n",
812 | " 'hymn',\n",
813 | " 'idm',\n",
814 | " 'independent',\n",
815 | " 'indian',\n",
816 | " 'indie',\n",
817 | " 'indipop',\n",
818 | " 'industrial',\n",
819 | " 'inspirational',\n",
820 | " 'instrumental',\n",
821 | " 'international',\n",
822 | " 'irish',\n",
823 | " 'jam',\n",
824 | " 'japanese',\n",
825 | " 'jazz',\n",
826 | " 'jewish',\n",
827 | " 'jpop',\n",
828 | " 'jungle',\n",
829 | " 'k-pop',\n",
830 | " 'karadeniz',\n",
831 | " 'karaoke',\n",
832 | " 'kayokyoku',\n",
833 | " 'korean',\n",
834 | " 'laiko',\n",
835 | " 'latin',\n",
836 | " 'latino',\n",
837 | " 'leftfield',\n",
838 | " 'local',\n",
839 | " 'lounge',\n",
840 | " 'loungeelectronic',\n",
841 | " 'lovers',\n",
842 | " 'malaysian',\n",
843 | " 'mandopop',\n",
844 | " 'marschmusik',\n",
845 | " 'meditative',\n",
846 | " 'mediterranean',\n",
847 | " 'melodic',\n",
848 | " 'metal',\n",
849 | " 'metalcore',\n",
850 | " 'mexican',\n",
851 | " 'middle',\n",
852 | " 'minimal',\n",
853 | " 'miscellaneous',\n",
854 | " 'modern',\n",
855 | " 'mood',\n",
856 | " 'mpb',\n",
857 | " 'muslim',\n",
858 | " 'native',\n",
859 | " 'neoklassik',\n",
860 | " 'neue',\n",
861 | " 'new',\n",
862 | " 'newage',\n",
863 | " 'newwave',\n",
864 | " 'nu',\n",
865 | " 'nujazz',\n",
866 | " 'numetal',\n",
867 | " 'oceania',\n",
868 | " 'old',\n",
869 | " 'opera',\n",
870 | " 'orchestral',\n",
871 | " 'other',\n",
872 | " 'piano',\n",
873 | " 'podcasts',\n",
874 | " 'pop',\n",
875 | " 'popdance',\n",
876 | " 'popelectronic',\n",
877 | " 'popeurodance',\n",
878 | " 'poprussian',\n",
879 | " 'post',\n",
880 | " 'posthardcore',\n",
881 | " 'postrock',\n",
882 | " 'power',\n",
883 | " 'progmetal',\n",
884 | " 'progressive',\n",
885 | " 'psychedelic',\n",
886 | " 'punjabi',\n",
887 | " 'punk',\n",
888 | " 'quebecois',\n",
889 | " 'ragga',\n",
890 | " 'ram',\n",
891 | " 'rancheras',\n",
892 | " 'rap',\n",
893 | " 'rave',\n",
894 | " 'reggae',\n",
895 | " 'reggaeton',\n",
896 | " 'regional',\n",
897 | " 'relax',\n",
898 | " 'religious',\n",
899 | " 'retro',\n",
900 | " 'rhythm',\n",
901 | " 'rnb',\n",
902 | " 'rnr',\n",
903 | " 'rock',\n",
904 | " 'rockabilly',\n",
905 | " 'rockalternative',\n",
906 | " 'rockindie',\n",
907 | " 'rockother',\n",
908 | " 'romance',\n",
909 | " 'roots',\n",
910 | " 'ruspop',\n",
911 | " 'rusrap',\n",
912 | " 'rusrock',\n",
913 | " 'russian',\n",
914 | " 'salsa',\n",
915 | " 'samba',\n",
916 | " 'scenic',\n",
917 | " 'schlager',\n",
918 | " 'self',\n",
919 | " 'sertanejo',\n",
920 | " 'shanson',\n",
921 | " 'shoegazing',\n",
922 | " 'showtunes',\n",
923 | " 'singer',\n",
924 | " 'ska',\n",
925 | " 'skarock',\n",
926 | " 'slow',\n",
927 | " 'smooth',\n",
928 | " 'soft',\n",
929 | " 'soul',\n",
930 | " 'soulful',\n",
931 | " 'sound',\n",
932 | " 'soundtrack',\n",
933 | " 'southern',\n",
934 | " 'specialty',\n",
935 | " 'speech',\n",
936 | " 'spiritual',\n",
937 | " 'sport',\n",
938 | " 'stonerrock',\n",
939 | " 'surf',\n",
940 | " 'swing',\n",
941 | " 'synthpop',\n",
942 | " 'synthrock',\n",
943 | " 'sängerportrait',\n",
944 | " 'tango',\n",
945 | " 'tanzorchester',\n",
946 | " 'taraftar',\n",
947 | " 'tatar',\n",
948 | " 'tech',\n",
949 | " 'techno',\n",
950 | " 'teen',\n",
951 | " 'thrash',\n",
952 | " 'top',\n",
953 | " 'traditional',\n",
954 | " 'tradjazz',\n",
955 | " 'trance',\n",
956 | " 'tribal',\n",
957 | " 'trip',\n",
958 | " 'triphop',\n",
959 | " 'tropical',\n",
960 | " 'türk',\n",
961 | " 'türkçe',\n",
962 | " 'ukrrock',\n",
963 | " 'unknown',\n",
964 | " 'urban',\n",
965 | " 'uzbek',\n",
966 | " 'variété',\n",
967 | " 'vi',\n",
968 | " 'videogame',\n",
969 | " 'vocal',\n",
970 | " 'western',\n",
971 | " 'world',\n",
972 | " 'worldbeat',\n",
973 | " 'ïîï',\n",
974 | " 'электроника']"
975 | ]
976 | },
977 | "execution_count": 14,
978 | "metadata": {},
979 | "output_type": "execute_result"
980 | }
981 | ],
982 | "source": [
983 | "sorted(df['genre'].unique()) # Просмотр уникальных названий жанров"
984 | ]
985 | },
986 | {
987 | "cell_type": "markdown",
988 | "metadata": {
989 | "id": "qej-Qmuo_Zct"
990 | },
991 | "source": [
992 | "Видим неявные дубликаты названия `hiphop`. Это могут быть названия с ошибками или альтернативные названия того же жанра:\n",
993 | "* *hip*,\n",
994 | "* *hop*,\n",
995 | "* *hip-hop*.\n"
996 | ]
997 | },
998 | {
999 | "cell_type": "code",
1000 | "execution_count": 15,
1001 | "metadata": {
1002 | "id": "YN5i2hpmSo09"
1003 | },
1004 | "outputs": [],
1005 | "source": [
1006 | "# Устранение неявных дубликатов\n",
1007 | "\n",
1008 | "df['genre'] = df['genre'].replace(['hip', 'hop', 'hip-hop'], 'hiphop')\n"
1009 | ]
1010 | },
1011 | {
1012 | "cell_type": "markdown",
1013 | "metadata": {
1014 | "id": "zQKF16_RG15m"
1015 | },
1016 | "source": [
1017 | "Проверим, что заменили неправильные названия:\n",
1018 | "\n",
1019 | "* hip\n",
1020 | "* hop\n",
1021 | "* hip-hop\n",
1022 | "\n",
1023 | "Выведем отсортированный список уникальных значений столбца `genre`:"
1024 | ]
1025 | },
1026 | {
1027 | "cell_type": "code",
1028 | "execution_count": 16,
1029 | "metadata": {
1030 | "id": "wvixALnFG15m"
1031 | },
1032 | "outputs": [
1033 | {
1034 | "data": {
1035 | "text/plain": [
1036 | "['acid',\n",
1037 | " 'acoustic',\n",
1038 | " 'action',\n",
1039 | " 'adult',\n",
1040 | " 'africa',\n",
1041 | " 'afrikaans',\n",
1042 | " 'alternative',\n",
1043 | " 'alternativepunk',\n",
1044 | " 'ambient',\n",
1045 | " 'americana',\n",
1046 | " 'animated',\n",
1047 | " 'anime',\n",
1048 | " 'arabesk',\n",
1049 | " 'arabic',\n",
1050 | " 'arena',\n",
1051 | " 'argentinetango',\n",
1052 | " 'art',\n",
1053 | " 'audiobook',\n",
1054 | " 'author',\n",
1055 | " 'avantgarde',\n",
1056 | " 'axé',\n",
1057 | " 'baile',\n",
1058 | " 'balkan',\n",
1059 | " 'beats',\n",
1060 | " 'bigroom',\n",
1061 | " 'black',\n",
1062 | " 'bluegrass',\n",
1063 | " 'blues',\n",
1064 | " 'bollywood',\n",
1065 | " 'bossa',\n",
1066 | " 'brazilian',\n",
1067 | " 'breakbeat',\n",
1068 | " 'breaks',\n",
1069 | " 'broadway',\n",
1070 | " 'cantautori',\n",
1071 | " 'cantopop',\n",
1072 | " 'canzone',\n",
1073 | " 'caribbean',\n",
1074 | " 'caucasian',\n",
1075 | " 'celtic',\n",
1076 | " 'chamber',\n",
1077 | " 'chanson',\n",
1078 | " 'children',\n",
1079 | " 'chill',\n",
1080 | " 'chinese',\n",
1081 | " 'choral',\n",
1082 | " 'christian',\n",
1083 | " 'christmas',\n",
1084 | " 'classical',\n",
1085 | " 'classicmetal',\n",
1086 | " 'club',\n",
1087 | " 'colombian',\n",
1088 | " 'comedy',\n",
1089 | " 'conjazz',\n",
1090 | " 'contemporary',\n",
1091 | " 'country',\n",
1092 | " 'cuban',\n",
1093 | " 'dance',\n",
1094 | " 'dancehall',\n",
1095 | " 'dancepop',\n",
1096 | " 'dark',\n",
1097 | " 'death',\n",
1098 | " 'deep',\n",
1099 | " 'deutschrock',\n",
1100 | " 'deutschspr',\n",
1101 | " 'dirty',\n",
1102 | " 'disco',\n",
1103 | " 'dnb',\n",
1104 | " 'documentary',\n",
1105 | " 'downbeat',\n",
1106 | " 'downtempo',\n",
1107 | " 'drum',\n",
1108 | " 'dub',\n",
1109 | " 'dubstep',\n",
1110 | " 'eastern',\n",
1111 | " 'easy',\n",
1112 | " 'electronic',\n",
1113 | " 'electropop',\n",
1114 | " 'emo',\n",
1115 | " 'entehno',\n",
1116 | " 'epicmetal',\n",
1117 | " 'estrada',\n",
1118 | " 'ethnic',\n",
1119 | " 'eurofolk',\n",
1120 | " 'european',\n",
1121 | " 'experimental',\n",
1122 | " 'extrememetal',\n",
1123 | " 'fado',\n",
1124 | " 'fairytail',\n",
1125 | " 'film',\n",
1126 | " 'fitness',\n",
1127 | " 'flamenco',\n",
1128 | " 'folk',\n",
1129 | " 'folklore',\n",
1130 | " 'folkmetal',\n",
1131 | " 'folkrock',\n",
1132 | " 'folktronica',\n",
1133 | " 'forró',\n",
1134 | " 'frankreich',\n",
1135 | " 'französisch',\n",
1136 | " 'french',\n",
1137 | " 'funk',\n",
1138 | " 'future',\n",
1139 | " 'gangsta',\n",
1140 | " 'garage',\n",
1141 | " 'german',\n",
1142 | " 'ghazal',\n",
1143 | " 'gitarre',\n",
1144 | " 'glitch',\n",
1145 | " 'gospel',\n",
1146 | " 'gothic',\n",
1147 | " 'grime',\n",
1148 | " 'grunge',\n",
1149 | " 'gypsy',\n",
1150 | " 'handsup',\n",
1151 | " \"hard'n'heavy\",\n",
1152 | " 'hardcore',\n",
1153 | " 'hardstyle',\n",
1154 | " 'hardtechno',\n",
1155 | " 'hiphop',\n",
1156 | " 'historisch',\n",
1157 | " 'holiday',\n",
1158 | " 'horror',\n",
1159 | " 'house',\n",
1160 | " 'hymn',\n",
1161 | " 'idm',\n",
1162 | " 'independent',\n",
1163 | " 'indian',\n",
1164 | " 'indie',\n",
1165 | " 'indipop',\n",
1166 | " 'industrial',\n",
1167 | " 'inspirational',\n",
1168 | " 'instrumental',\n",
1169 | " 'international',\n",
1170 | " 'irish',\n",
1171 | " 'jam',\n",
1172 | " 'japanese',\n",
1173 | " 'jazz',\n",
1174 | " 'jewish',\n",
1175 | " 'jpop',\n",
1176 | " 'jungle',\n",
1177 | " 'k-pop',\n",
1178 | " 'karadeniz',\n",
1179 | " 'karaoke',\n",
1180 | " 'kayokyoku',\n",
1181 | " 'korean',\n",
1182 | " 'laiko',\n",
1183 | " 'latin',\n",
1184 | " 'latino',\n",
1185 | " 'leftfield',\n",
1186 | " 'local',\n",
1187 | " 'lounge',\n",
1188 | " 'loungeelectronic',\n",
1189 | " 'lovers',\n",
1190 | " 'malaysian',\n",
1191 | " 'mandopop',\n",
1192 | " 'marschmusik',\n",
1193 | " 'meditative',\n",
1194 | " 'mediterranean',\n",
1195 | " 'melodic',\n",
1196 | " 'metal',\n",
1197 | " 'metalcore',\n",
1198 | " 'mexican',\n",
1199 | " 'middle',\n",
1200 | " 'minimal',\n",
1201 | " 'miscellaneous',\n",
1202 | " 'modern',\n",
1203 | " 'mood',\n",
1204 | " 'mpb',\n",
1205 | " 'muslim',\n",
1206 | " 'native',\n",
1207 | " 'neoklassik',\n",
1208 | " 'neue',\n",
1209 | " 'new',\n",
1210 | " 'newage',\n",
1211 | " 'newwave',\n",
1212 | " 'nu',\n",
1213 | " 'nujazz',\n",
1214 | " 'numetal',\n",
1215 | " 'oceania',\n",
1216 | " 'old',\n",
1217 | " 'opera',\n",
1218 | " 'orchestral',\n",
1219 | " 'other',\n",
1220 | " 'piano',\n",
1221 | " 'podcasts',\n",
1222 | " 'pop',\n",
1223 | " 'popdance',\n",
1224 | " 'popelectronic',\n",
1225 | " 'popeurodance',\n",
1226 | " 'poprussian',\n",
1227 | " 'post',\n",
1228 | " 'posthardcore',\n",
1229 | " 'postrock',\n",
1230 | " 'power',\n",
1231 | " 'progmetal',\n",
1232 | " 'progressive',\n",
1233 | " 'psychedelic',\n",
1234 | " 'punjabi',\n",
1235 | " 'punk',\n",
1236 | " 'quebecois',\n",
1237 | " 'ragga',\n",
1238 | " 'ram',\n",
1239 | " 'rancheras',\n",
1240 | " 'rap',\n",
1241 | " 'rave',\n",
1242 | " 'reggae',\n",
1243 | " 'reggaeton',\n",
1244 | " 'regional',\n",
1245 | " 'relax',\n",
1246 | " 'religious',\n",
1247 | " 'retro',\n",
1248 | " 'rhythm',\n",
1249 | " 'rnb',\n",
1250 | " 'rnr',\n",
1251 | " 'rock',\n",
1252 | " 'rockabilly',\n",
1253 | " 'rockalternative',\n",
1254 | " 'rockindie',\n",
1255 | " 'rockother',\n",
1256 | " 'romance',\n",
1257 | " 'roots',\n",
1258 | " 'ruspop',\n",
1259 | " 'rusrap',\n",
1260 | " 'rusrock',\n",
1261 | " 'russian',\n",
1262 | " 'salsa',\n",
1263 | " 'samba',\n",
1264 | " 'scenic',\n",
1265 | " 'schlager',\n",
1266 | " 'self',\n",
1267 | " 'sertanejo',\n",
1268 | " 'shanson',\n",
1269 | " 'shoegazing',\n",
1270 | " 'showtunes',\n",
1271 | " 'singer',\n",
1272 | " 'ska',\n",
1273 | " 'skarock',\n",
1274 | " 'slow',\n",
1275 | " 'smooth',\n",
1276 | " 'soft',\n",
1277 | " 'soul',\n",
1278 | " 'soulful',\n",
1279 | " 'sound',\n",
1280 | " 'soundtrack',\n",
1281 | " 'southern',\n",
1282 | " 'specialty',\n",
1283 | " 'speech',\n",
1284 | " 'spiritual',\n",
1285 | " 'sport',\n",
1286 | " 'stonerrock',\n",
1287 | " 'surf',\n",
1288 | " 'swing',\n",
1289 | " 'synthpop',\n",
1290 | " 'synthrock',\n",
1291 | " 'sängerportrait',\n",
1292 | " 'tango',\n",
1293 | " 'tanzorchester',\n",
1294 | " 'taraftar',\n",
1295 | " 'tatar',\n",
1296 | " 'tech',\n",
1297 | " 'techno',\n",
1298 | " 'teen',\n",
1299 | " 'thrash',\n",
1300 | " 'top',\n",
1301 | " 'traditional',\n",
1302 | " 'tradjazz',\n",
1303 | " 'trance',\n",
1304 | " 'tribal',\n",
1305 | " 'trip',\n",
1306 | " 'triphop',\n",
1307 | " 'tropical',\n",
1308 | " 'türk',\n",
1309 | " 'türkçe',\n",
1310 | " 'ukrrock',\n",
1311 | " 'unknown',\n",
1312 | " 'urban',\n",
1313 | " 'uzbek',\n",
1314 | " 'variété',\n",
1315 | " 'vi',\n",
1316 | " 'videogame',\n",
1317 | " 'vocal',\n",
1318 | " 'western',\n",
1319 | " 'world',\n",
1320 | " 'worldbeat',\n",
1321 | " 'ïîï',\n",
1322 | " 'электроника']"
1323 | ]
1324 | },
1325 | "execution_count": 16,
1326 | "metadata": {},
1327 | "output_type": "execute_result"
1328 | }
1329 | ],
1330 | "source": [
1331 | "sorted(df['genre'].unique()) # Проверка на неявные дубликаты"
1332 | ]
1333 | },
1334 | {
1335 | "cell_type": "markdown",
1336 | "metadata": {
1337 | "id": "jz6a9-7HQUDd"
1338 | },
1339 | "source": [
1340 | "**Выводы**\n",
1341 | "\n",
1342 | "Предобработка обнаружила три проблемы в данных:\n",
1343 | "\n",
1344 | "- нарушения в стиле заголовков,\n",
1345 | "- пропущенные значения,\n",
1346 | "- дубликаты — явные и неявные.\n",
1347 | "\n",
1348 | "Мы исправили заголовки, чтобы упростить работу с таблицей. Без дубликатов исследование станет более точным.\n",
1349 | "\n",
1350 | "Пропущенные значения мы заменили на `'unknown'`. Ещё предстоит увидеть, не повредят ли исследованию пропуски в колонке `genre`.\n",
1351 | "\n",
1352 | "Теперь можно перейти к проверке гипотез. "
1353 | ]
1354 | },
1355 | {
1356 | "cell_type": "markdown",
1357 | "metadata": {
1358 | "id": "WttZHXH0SqKk"
1359 | },
1360 | "source": [
1361 | "## Проверка гипотез"
1362 | ]
1363 | },
1364 | {
1365 | "cell_type": "markdown",
1366 | "metadata": {
1367 | "id": "Im936VVi_Zcu"
1368 | },
1369 | "source": [
1370 | "### Сравнение поведения пользователей двух столиц"
1371 | ]
1372 | },
1373 | {
1374 | "cell_type": "markdown",
1375 | "metadata": {
1376 | "id": "nwt_MuaL_Zcu"
1377 | },
1378 | "source": [
1379 | "Первая гипотеза утверждает, что пользователи по-разному слушают музыку в Москве и Санкт-Петербурге. Проверим это предположение по данным о трёх днях недели — понедельнике, среде и пятнице. Для этого:\n",
1380 | "\n",
1381 | "* Разделим пользователей Москвы и Санкт-Петербурга\n",
1382 | "* Сравним, сколько треков послушала каждая группа пользователей в понедельник, среду и пятницу.\n"
1383 | ]
1384 | },
1385 | {
1386 | "cell_type": "markdown",
1387 | "metadata": {
1388 | "id": "8Dw_YMmT_Zcu"
1389 | },
1390 | "source": [
1391 | "Выполним каждый из расчётов по отдельности. \n",
1392 | "\n",
1393 | "Оценим активность пользователей в каждом городе. Сгруппируем данные по городу и посчитаем прослушивания в каждой группе.\n",
1394 | "\n"
1395 | ]
1396 | },
1397 | {
1398 | "cell_type": "code",
1399 | "execution_count": 17,
1400 | "metadata": {
1401 | "id": "0_Qs96oh_Zcu"
1402 | },
1403 | "outputs": [
1404 | {
1405 | "data": {
1406 | "text/html": [
1407 | "\n",
1408 | "\n",
1421 | "
\n",
1422 | " \n",
1423 | " \n",
1424 | " | \n",
1425 | " user_id | \n",
1426 | "
\n",
1427 | " \n",
1428 | " city | \n",
1429 | " | \n",
1430 | "
\n",
1431 | " \n",
1432 | " \n",
1433 | " \n",
1434 | " Moscow | \n",
1435 | " 42741 | \n",
1436 | "
\n",
1437 | " \n",
1438 | " Saint-Petersburg | \n",
1439 | " 18512 | \n",
1440 | "
\n",
1441 | " \n",
1442 | "
\n",
1443 | "
"
1444 | ],
1445 | "text/plain": [
1446 | " user_id\n",
1447 | "city \n",
1448 | "Moscow 42741\n",
1449 | "Saint-Petersburg 18512"
1450 | ]
1451 | },
1452 | "execution_count": 17,
1453 | "metadata": {},
1454 | "output_type": "execute_result"
1455 | }
1456 | ],
1457 | "source": [
1458 | "# Подсчёт прослушиваний в каждом городе\n",
1459 | "\n",
1460 | "city_grouping = df.groupby('city')[['user_id']].count()\n",
1461 | "city_grouping\n"
1462 | ]
1463 | },
1464 | {
1465 | "cell_type": "markdown",
1466 | "metadata": {
1467 | "id": "dzli3w8o_Zcu"
1468 | },
1469 | "source": [
1470 | "В Москве прослушиваний больше, чем в Петербурге. Из этого не следует, что московские пользователи чаще слушают музыку. Просто самих пользователей в Москве больше.\n",
1471 | "\n",
1472 | "Теперь сгруппируем данные по дню недели и подсчитаем прослушивания в понедельник, среду и пятницу. "
1473 | ]
1474 | },
1475 | {
1476 | "cell_type": "code",
1477 | "execution_count": 18,
1478 | "metadata": {
1479 | "id": "uZMKjiJz_Zcu"
1480 | },
1481 | "outputs": [
1482 | {
1483 | "data": {
1484 | "text/html": [
1485 | "\n",
1486 | "\n",
1499 | "
\n",
1500 | " \n",
1501 | " \n",
1502 | " | \n",
1503 | " user_id | \n",
1504 | "
\n",
1505 | " \n",
1506 | " day | \n",
1507 | " | \n",
1508 | "
\n",
1509 | " \n",
1510 | " \n",
1511 | " \n",
1512 | " Friday | \n",
1513 | " 21840 | \n",
1514 | "
\n",
1515 | " \n",
1516 | " Monday | \n",
1517 | " 21354 | \n",
1518 | "
\n",
1519 | " \n",
1520 | " Wednesday | \n",
1521 | " 18059 | \n",
1522 | "
\n",
1523 | " \n",
1524 | "
\n",
1525 | "
"
1526 | ],
1527 | "text/plain": [
1528 | " user_id\n",
1529 | "day \n",
1530 | "Friday 21840\n",
1531 | "Monday 21354\n",
1532 | "Wednesday 18059"
1533 | ]
1534 | },
1535 | "execution_count": 18,
1536 | "metadata": {},
1537 | "output_type": "execute_result"
1538 | }
1539 | ],
1540 | "source": [
1541 | "# Подсчёт прослушиваний в каждый из трёх дней\n",
1542 | "\n",
1543 | "city_grouping = df.groupby('day')[['user_id']].count()\n",
1544 | "city_grouping"
1545 | ]
1546 | },
1547 | {
1548 | "cell_type": "markdown",
1549 | "metadata": {
1550 | "id": "cC2tNrlL_Zcu"
1551 | },
1552 | "source": [
1553 | "В среднем пользователи из двух городов менее активны по средам. Но картина может измениться, если рассмотреть каждый город в отдельности."
1554 | ]
1555 | },
1556 | {
1557 | "cell_type": "markdown",
1558 | "metadata": {
1559 | "id": "POzs8bGa_Zcu"
1560 | },
1561 | "source": [
1562 | "Напишем функцию, которая объединит два эти расчёта.\n",
1563 | "\n",
1564 | "Создаем функцию `number_tracks()`, которая посчитает прослушивания для заданного дня и города. Ей понадобятся два параметра:\n",
1565 | "* день недели,\n",
1566 | "* название города.\n",
1567 | "\n",
1568 | "В функции сохраним в переменную строки исходной таблицы, у которых значение:\n",
1569 | " * в колонке `day` равно параметру `day`,\n",
1570 | " * в колонке `city` равно параметру `city`.\n",
1571 | "\n",
1572 | "Для этого применим последовательную фильтрацию с логической индексацией.\n",
1573 | "\n",
1574 | "Затем посчитаем значения в столбце `user_id` получившейся таблицы. Результат сохраним в новую переменную. В"
1575 | ]
1576 | },
1577 | {
1578 | "cell_type": "code",
1579 | "execution_count": 19,
1580 | "metadata": {
1581 | "id": "Nz3GdQB1_Zcu"
1582 | },
1583 | "outputs": [],
1584 | "source": [
1585 | "# <создание функции number_tracks()>\n",
1586 | "# Объявляется функция с двумя параметрами: day, city.\n",
1587 | "# В переменной track_list сохраняются те строки таблицы df, для которых \n",
1588 | "# значение в столбце 'day' равно параметру day и одновременно значение \n",
1589 | "# в столбце 'city' равно параметру city (используйте последовательную фильтрацию\n",
1590 | "# с помощью логической индексации).\n",
1591 | "# В переменной track_list_count сохраняется число значений столбца 'user_id',\n",
1592 | "# рассчитанное методом count() для таблицы track_list.\n",
1593 | "# Функция возвращает число - значение track_list_count.\n",
1594 | "\n",
1595 | "def number_tracks(day, city):\n",
1596 | " track_list = df[df['day'] == day] \n",
1597 | " track_list = track_list[track_list['city'] == city] \n",
1598 | " track_list_count = track_list['user_id'].count()\n",
1599 | " return track_list_count\n",
1600 | "\n",
1601 | "# Функция для подсчёта прослушиваний для конкретного города и дня.\n",
1602 | "# С помощью последовательной фильтрации с логической индексацией она \n",
1603 | "# сначала получит из исходной таблицы строки с нужным днём,\n",
1604 | "# затем из результата отфильтрует строки с нужным городом,\n",
1605 | "# методом count() посчитает количество значений в колонке user_id. \n",
1606 | "# Это количество функция вернёт в качестве результата"
1607 | ]
1608 | },
1609 | {
1610 | "cell_type": "markdown",
1611 | "metadata": {
1612 | "id": "ytf7xFrFJQ2r"
1613 | },
1614 | "source": [
1615 | "Вызовем `number_tracks()` шесть раз, меняя значение параметров — так, чтобы получить данные для каждого города в каждый из трёх дней."
1616 | ]
1617 | },
1618 | {
1619 | "cell_type": "code",
1620 | "execution_count": 20,
1621 | "metadata": {
1622 | "id": "rJcRATNQ_Zcu"
1623 | },
1624 | "outputs": [
1625 | {
1626 | "data": {
1627 | "text/plain": [
1628 | "15740"
1629 | ]
1630 | },
1631 | "execution_count": 20,
1632 | "metadata": {},
1633 | "output_type": "execute_result"
1634 | }
1635 | ],
1636 | "source": [
1637 | "number_tracks('Monday', 'Moscow')# количество прослушиваний в Москве по понедельникам"
1638 | ]
1639 | },
1640 | {
1641 | "cell_type": "code",
1642 | "execution_count": 21,
1643 | "metadata": {
1644 | "id": "hq_ncZ5T_Zcu"
1645 | },
1646 | "outputs": [
1647 | {
1648 | "data": {
1649 | "text/plain": [
1650 | "5614"
1651 | ]
1652 | },
1653 | "execution_count": 21,
1654 | "metadata": {},
1655 | "output_type": "execute_result"
1656 | }
1657 | ],
1658 | "source": [
1659 | "number_tracks('Monday', 'Saint-Petersburg')# количество прослушиваний в Санкт-Петербурге по понедельникам"
1660 | ]
1661 | },
1662 | {
1663 | "cell_type": "code",
1664 | "execution_count": 22,
1665 | "metadata": {
1666 | "id": "_NTy2VPU_Zcu"
1667 | },
1668 | "outputs": [
1669 | {
1670 | "data": {
1671 | "text/plain": [
1672 | "11056"
1673 | ]
1674 | },
1675 | "execution_count": 22,
1676 | "metadata": {},
1677 | "output_type": "execute_result"
1678 | }
1679 | ],
1680 | "source": [
1681 | "number_tracks('Wednesday', 'Moscow')# количество прослушиваний в Москве по средам"
1682 | ]
1683 | },
1684 | {
1685 | "cell_type": "code",
1686 | "execution_count": 23,
1687 | "metadata": {
1688 | "id": "j2y3TAwo_Zcu"
1689 | },
1690 | "outputs": [
1691 | {
1692 | "data": {
1693 | "text/plain": [
1694 | "7003"
1695 | ]
1696 | },
1697 | "execution_count": 23,
1698 | "metadata": {},
1699 | "output_type": "execute_result"
1700 | }
1701 | ],
1702 | "source": [
1703 | "number_tracks('Wednesday', 'Saint-Petersburg')# количество прослушиваний в Санкт-Петербурге по средам"
1704 | ]
1705 | },
1706 | {
1707 | "cell_type": "code",
1708 | "execution_count": 24,
1709 | "metadata": {
1710 | "id": "vYDw5u_K_Zcu"
1711 | },
1712 | "outputs": [
1713 | {
1714 | "data": {
1715 | "text/plain": [
1716 | "15945"
1717 | ]
1718 | },
1719 | "execution_count": 24,
1720 | "metadata": {},
1721 | "output_type": "execute_result"
1722 | }
1723 | ],
1724 | "source": [
1725 | "number_tracks('Friday', 'Moscow')# количество прослушиваний в Москве по пятницам"
1726 | ]
1727 | },
1728 | {
1729 | "cell_type": "code",
1730 | "execution_count": 25,
1731 | "metadata": {
1732 | "id": "8_yzFtW3_Zcu"
1733 | },
1734 | "outputs": [
1735 | {
1736 | "data": {
1737 | "text/plain": [
1738 | "5895"
1739 | ]
1740 | },
1741 | "execution_count": 25,
1742 | "metadata": {},
1743 | "output_type": "execute_result"
1744 | }
1745 | ],
1746 | "source": [
1747 | "number_tracks('Friday', 'Saint-Petersburg')# количество прослушиваний в Санкт-Петербурге по пятницам"
1748 | ]
1749 | },
1750 | {
1751 | "cell_type": "markdown",
1752 | "metadata": {
1753 | "id": "7QXffbO-_Zcu"
1754 | },
1755 | "source": [
1756 | "Создайем c помощью конструктора `pd.DataFrame` таблицу, где\n",
1757 | "* названия колонок — `['city', 'monday', 'wednesday', 'friday']`;\n",
1758 | "* данные — результаты, которые вы получили с помощью `number_tracks`."
1759 | ]
1760 | },
1761 | {
1762 | "cell_type": "code",
1763 | "execution_count": 26,
1764 | "metadata": {
1765 | "id": "APAcLpOr_Zcu"
1766 | },
1767 | "outputs": [
1768 | {
1769 | "data": {
1770 | "text/html": [
1771 | "\n",
1772 | "\n",
1785 | "
\n",
1786 | " \n",
1787 | " \n",
1788 | " | \n",
1789 | " city | \n",
1790 | " monday | \n",
1791 | " wednesday | \n",
1792 | " friday | \n",
1793 | "
\n",
1794 | " \n",
1795 | " \n",
1796 | " \n",
1797 | " 0 | \n",
1798 | " Moscow | \n",
1799 | " 15740 | \n",
1800 | " 11056 | \n",
1801 | " 15945 | \n",
1802 | "
\n",
1803 | " \n",
1804 | " 1 | \n",
1805 | " Saint-Petersburg | \n",
1806 | " 5614 | \n",
1807 | " 7003 | \n",
1808 | " 5895 | \n",
1809 | "
\n",
1810 | " \n",
1811 | "
\n",
1812 | "
"
1813 | ],
1814 | "text/plain": [
1815 | " city monday wednesday friday\n",
1816 | "0 Moscow 15740 11056 15945\n",
1817 | "1 Saint-Petersburg 5614 7003 5895"
1818 | ]
1819 | },
1820 | "metadata": {},
1821 | "output_type": "display_data"
1822 | }
1823 | ],
1824 | "source": [
1825 | "# Таблица с результатами\n",
1826 | "number_track_result = [['Moscow',15740,11056, 15945], # Измерения хранятся в списке списков \n",
1827 | " ['Saint-Petersburg',5614, 7003, 5895]]\n",
1828 | "\n",
1829 | "header = ['city', 'monday', 'wednesday', 'friday'] # Заголовки\n",
1830 | "\n",
1831 | "output = pd.DataFrame(data=number_track_result, columns=header) \n",
1832 | "display(output)\n",
1833 | "\n"
1834 | ]
1835 | },
1836 | {
1837 | "cell_type": "markdown",
1838 | "metadata": {
1839 | "id": "-EgPIHYu_Zcu"
1840 | },
1841 | "source": [
1842 | "**Выводы**\n",
1843 | "\n",
1844 | "Данные показывают разницу поведения пользователей:\n",
1845 | "\n",
1846 | "- В Москве пик прослушиваний приходится на понедельник и пятницу, а в среду заметен спад.\n",
1847 | "- В Петербурге, наоборот, больше слушают музыку по средам. Активность в понедельник и пятницу здесь почти в равной мере уступает среде.\n",
1848 | "\n",
1849 | "Значит, данные говорят в пользу первой гипотезы."
1850 | ]
1851 | },
1852 | {
1853 | "cell_type": "markdown",
1854 | "metadata": {
1855 | "id": "atZAxtq4_Zcu"
1856 | },
1857 | "source": [
1858 | "### Музыка в начале и в конце недели"
1859 | ]
1860 | },
1861 | {
1862 | "cell_type": "markdown",
1863 | "metadata": {
1864 | "id": "eXrQqXFH_Zcu"
1865 | },
1866 | "source": [
1867 | "Согласно второй гипотезе, утром в понедельник в Москве преобладают одни жанры, а в Петербурге — другие. Так же и вечером пятницы преобладают разные жанры — в зависимости от города."
1868 | ]
1869 | },
1870 | {
1871 | "cell_type": "markdown",
1872 | "metadata": {
1873 | "id": "S8UcW6Hw_Zcu"
1874 | },
1875 | "source": [
1876 | "Сохраним таблицы с данными в две переменные:\n",
1877 | "* по Москве — в `moscow_general`;\n",
1878 | "* по Санкт-Петербургу — в `spb_general`."
1879 | ]
1880 | },
1881 | {
1882 | "cell_type": "code",
1883 | "execution_count": 27,
1884 | "metadata": {
1885 | "id": "qeaFfM_P_Zcu"
1886 | },
1887 | "outputs": [],
1888 | "source": [
1889 | "# получение таблицы moscow_general из тех строк таблицы df, \n",
1890 | "# для которых значение в столбце 'city' равно 'Moscow'\n",
1891 | "\n",
1892 | "moscow_general = df[df['city'] == 'Moscow']"
1893 | ]
1894 | },
1895 | {
1896 | "cell_type": "code",
1897 | "execution_count": 28,
1898 | "metadata": {
1899 | "id": "ORaVRKto_Zcu"
1900 | },
1901 | "outputs": [],
1902 | "source": [
1903 | "# получение таблицы spb_general из тех строк таблицы df,\n",
1904 | "# для которых значение в столбце 'city' равно 'Saint-Petersburg'\n",
1905 | "\n",
1906 | "spb_general = df[df['city'] == 'Saint-Petersburg']"
1907 | ]
1908 | },
1909 | {
1910 | "cell_type": "markdown",
1911 | "metadata": {
1912 | "id": "MEJV-CX2_Zcu"
1913 | },
1914 | "source": [
1915 | "Создадим функцию `genre_weekday()` с четырьмя параметрами:\n",
1916 | "* таблица (датафрейм) с данными,\n",
1917 | "* день недели,\n",
1918 | "* начальная временная метка в формате 'hh:mm', \n",
1919 | "* последняя временная метка в формате 'hh:mm'.\n",
1920 | "\n",
1921 | "Функция должна вернуть информацию о топ-10 жанров тех треков, которые прослушивали в указанный день, в промежутке между двумя отметками времени."
1922 | ]
1923 | },
1924 | {
1925 | "cell_type": "code",
1926 | "execution_count": 29,
1927 | "metadata": {
1928 | "id": "laJT9BYl_Zcu"
1929 | },
1930 | "outputs": [],
1931 | "source": [
1932 | "# Объявление функции genre_weekday() с параметрами table, day, time1, time2,\n",
1933 | "# которая возвращает информацию о самых популярных жанрах в указанный день в\n",
1934 | "# заданное время:\n",
1935 | "# 1) в переменную genre_df сохраняются те строки переданного датафрейма table, для\n",
1936 | "# которых одновременно:\n",
1937 | "# - значение в столбце day равно значению аргумента day\n",
1938 | "# - значение в столбце time больше значения аргумента time1\n",
1939 | "# - значение в столбце time меньше значения аргумента time2\n",
1940 | "# Используйте последовательную фильтрацию с помощью логической индексации.\n",
1941 | "# 2) сгруппировать датафрейм genre_df по столбцу genre, взять один из его\n",
1942 | "# столбцов и посчитать методом count() количество записей для каждого из\n",
1943 | "# присутствующих жанров, получившийся Series записать в переменную\n",
1944 | "# genre_df_count\n",
1945 | "# 3) отсортировать genre_df_count по убыванию встречаемости и сохранить\n",
1946 | "# в переменную genre_df_sorted\n",
1947 | "# 4) вернуть Series из 10 первых значений genre_df_sorted, это будут топ-10\n",
1948 | "# популярных жанров (в указанный день, в заданное время)\n",
1949 | "\n",
1950 | "def genre_weekday(table, day, time1, time2): #1\n",
1951 | " \n",
1952 | " genre_df = table[table['day'] == day]\n",
1953 | " genre_df = genre_df[genre_df['time'] > time1]\n",
1954 | " genre_df = genre_df[genre_df['time'] < time2]\n",
1955 | " \n",
1956 | " genre_df_count = genre_df.groupby('genre')['artist'].count() #2\n",
1957 | " \n",
1958 | " genre_df_sorted = genre_df_count.sort_values(ascending=False) #3\n",
1959 | " \n",
1960 | " return genre_df_sorted.head(10) #4\n"
1961 | ]
1962 | },
1963 | {
1964 | "cell_type": "markdown",
1965 | "metadata": {
1966 | "id": "la2s2_PF_Zcu"
1967 | },
1968 | "source": [
1969 | "Cравним результаты функции `genre_weekday()` для Москвы и Санкт-Петербурга в понедельник утром (с 7:00 до 11:00) и в пятницу вечером (с 17:00 до 23:00):"
1970 | ]
1971 | },
1972 | {
1973 | "cell_type": "code",
1974 | "execution_count": 30,
1975 | "metadata": {
1976 | "id": "yz7itPUQ_Zcu"
1977 | },
1978 | "outputs": [
1979 | {
1980 | "data": {
1981 | "text/plain": [
1982 | "genre\n",
1983 | "pop 781\n",
1984 | "dance 549\n",
1985 | "electronic 480\n",
1986 | "rock 474\n",
1987 | "hiphop 286\n",
1988 | "ruspop 186\n",
1989 | "world 181\n",
1990 | "rusrap 175\n",
1991 | "alternative 164\n",
1992 | "unknown 161\n",
1993 | "Name: artist, dtype: int64"
1994 | ]
1995 | },
1996 | "execution_count": 30,
1997 | "metadata": {},
1998 | "output_type": "execute_result"
1999 | }
2000 | ],
2001 | "source": [
2002 | "# вызов функции для утра понедельника в Москве (вместо df — таблица moscow_general)\n",
2003 | "# объекты, хранящие время, являются строками и сравниваются как строки\n",
2004 | "# пример вызова: genre_weekday(moscow_general, 'Monday', '07:00', '11:00')\n",
2005 | "\n",
2006 | "genre_weekday(moscow_general, 'Monday', '07:00', '11:00')"
2007 | ]
2008 | },
2009 | {
2010 | "cell_type": "code",
2011 | "execution_count": 31,
2012 | "metadata": {
2013 | "id": "kwUcHPdy_Zcu"
2014 | },
2015 | "outputs": [
2016 | {
2017 | "data": {
2018 | "text/plain": [
2019 | "genre\n",
2020 | "pop 218\n",
2021 | "dance 182\n",
2022 | "rock 162\n",
2023 | "electronic 147\n",
2024 | "hiphop 80\n",
2025 | "ruspop 64\n",
2026 | "alternative 58\n",
2027 | "rusrap 55\n",
2028 | "jazz 44\n",
2029 | "classical 40\n",
2030 | "Name: artist, dtype: int64"
2031 | ]
2032 | },
2033 | "execution_count": 31,
2034 | "metadata": {},
2035 | "output_type": "execute_result"
2036 | }
2037 | ],
2038 | "source": [
2039 | "# вызов функции для утра понедельника в Петербурге (вместо df — таблица spb_general)\n",
2040 | "\n",
2041 | "genre_weekday(spb_general, 'Monday', '07:00', '11:00')"
2042 | ]
2043 | },
2044 | {
2045 | "cell_type": "code",
2046 | "execution_count": 32,
2047 | "metadata": {
2048 | "id": "EzXVRE1o_Zcu"
2049 | },
2050 | "outputs": [
2051 | {
2052 | "data": {
2053 | "text/plain": [
2054 | "genre\n",
2055 | "pop 713\n",
2056 | "rock 517\n",
2057 | "dance 495\n",
2058 | "electronic 482\n",
2059 | "hiphop 273\n",
2060 | "world 208\n",
2061 | "ruspop 170\n",
2062 | "alternative 163\n",
2063 | "classical 163\n",
2064 | "rusrap 142\n",
2065 | "Name: artist, dtype: int64"
2066 | ]
2067 | },
2068 | "execution_count": 32,
2069 | "metadata": {},
2070 | "output_type": "execute_result"
2071 | }
2072 | ],
2073 | "source": [
2074 | "# вызов функции для вечера пятницы в Москве\n",
2075 | "\n",
2076 | "genre_weekday(moscow_general, 'Friday', '17:00', '23:00')"
2077 | ]
2078 | },
2079 | {
2080 | "cell_type": "code",
2081 | "execution_count": 33,
2082 | "metadata": {
2083 | "id": "JZaEKu5v_Zcu"
2084 | },
2085 | "outputs": [
2086 | {
2087 | "data": {
2088 | "text/plain": [
2089 | "genre\n",
2090 | "pop 256\n",
2091 | "electronic 216\n",
2092 | "rock 216\n",
2093 | "dance 210\n",
2094 | "hiphop 97\n",
2095 | "alternative 63\n",
2096 | "jazz 61\n",
2097 | "classical 60\n",
2098 | "rusrap 59\n",
2099 | "world 54\n",
2100 | "Name: artist, dtype: int64"
2101 | ]
2102 | },
2103 | "execution_count": 33,
2104 | "metadata": {},
2105 | "output_type": "execute_result"
2106 | }
2107 | ],
2108 | "source": [
2109 | "# вызов функции для вечера пятницы в Петербурге\n",
2110 | "\n",
2111 | "genre_weekday(spb_general, 'Friday', '17:00', '23:00')"
2112 | ]
2113 | },
2114 | {
2115 | "cell_type": "markdown",
2116 | "metadata": {
2117 | "id": "wrCe4MNX_Zcu"
2118 | },
2119 | "source": [
2120 | "**Выводы**\n",
2121 | "\n",
2122 | "Если сравнить топ-10 жанров в понедельник утром, можно сделать такие выводы:\n",
2123 | "\n",
2124 | "1. В Москве и Петербурге слушают похожую музыку. Единственное отличие — в московский рейтинг вошёл жанр “world”, а в петербургский — джаз и классика.\n",
2125 | "\n",
2126 | "2. В Москве пропущенных значений оказалось так много, что значение `'unknown'` заняло десятое место среди самых популярных жанров. Значит, пропущенные значения занимают существенную долю в данных и угрожают достоверности исследования.\n",
2127 | "\n",
2128 | "Вечер пятницы не меняет эту картину. Некоторые жанры поднимаются немного выше, другие спускаются, но в целом топ-10 остаётся тем же самым.\n",
2129 | "\n",
2130 | "Таким образом, вторая гипотеза подтвердилась лишь частично:\n",
2131 | "* Пользователи слушают похожую музыку в начале недели и в конце.\n",
2132 | "* Разница между Москвой и Петербургом не слишком выражена. В Москве чаще слушают русскую популярную музыку, в Петербурге — джаз.\n",
2133 | "\n",
2134 | "Однако пропуски в данных ставят под сомнение этот результат. В Москве их так много, что рейтинг топ-10 мог бы выглядеть иначе, если бы не утерянные данные о жанрах."
2135 | ]
2136 | },
2137 | {
2138 | "cell_type": "markdown",
2139 | "metadata": {
2140 | "id": "JolODAqr_Zcu"
2141 | },
2142 | "source": [
2143 | "### Жанровые предпочтения в Москве и Петербурге\n",
2144 | "\n",
2145 | "Гипотеза: Петербург — столица рэпа, музыку этого жанра там слушают чаще, чем в Москве. А Москва — город контрастов, в котором, тем не менее, преобладает поп-музыка."
2146 | ]
2147 | },
2148 | {
2149 | "cell_type": "markdown",
2150 | "metadata": {
2151 | "id": "DlegSvaT_Zcu"
2152 | },
2153 | "source": [
2154 | "Сгруппируем таблицу `moscow_general` по жанру и посчитаем прослушивания треков каждого жанра методом `count()`. Затем отсортируем результат в порядке убывания и сохраним его в таблице `moscow_genres`."
2155 | ]
2156 | },
2157 | {
2158 | "cell_type": "code",
2159 | "execution_count": 34,
2160 | "metadata": {
2161 | "id": "r19lIPke_Zcu"
2162 | },
2163 | "outputs": [],
2164 | "source": [
2165 | "# одной строкой: группировка таблицы moscow_general по столбцу 'genre', \n",
2166 | "# подсчёт числа значений 'genre' в этой группировке методом count(), \n",
2167 | "# сортировка получившегося Series в порядке убывания и сохранение в moscow_genres\n",
2168 | "\n",
2169 | "moscow_general = moscow_general.groupby('genre')['genre'].count().sort_values(ascending=False)"
2170 | ]
2171 | },
2172 | {
2173 | "cell_type": "markdown",
2174 | "metadata": {
2175 | "id": "6kMuomxTiIr8"
2176 | },
2177 | "source": [
2178 | "Выведем на экран первые десять строк `moscow_genres`:"
2179 | ]
2180 | },
2181 | {
2182 | "cell_type": "code",
2183 | "execution_count": 35,
2184 | "metadata": {
2185 | "id": "WhCSooF8_Zcv"
2186 | },
2187 | "outputs": [
2188 | {
2189 | "data": {
2190 | "text/html": [
2191 | "\n",
2192 | "\n",
2205 | "
\n",
2206 | " \n",
2207 | " \n",
2208 | " | \n",
2209 | " genre | \n",
2210 | "
\n",
2211 | " \n",
2212 | " genre | \n",
2213 | " | \n",
2214 | "
\n",
2215 | " \n",
2216 | " \n",
2217 | " \n",
2218 | " pop | \n",
2219 | " 5892 | \n",
2220 | "
\n",
2221 | " \n",
2222 | " dance | \n",
2223 | " 4435 | \n",
2224 | "
\n",
2225 | " \n",
2226 | " rock | \n",
2227 | " 3965 | \n",
2228 | "
\n",
2229 | " \n",
2230 | " electronic | \n",
2231 | " 3786 | \n",
2232 | "
\n",
2233 | " \n",
2234 | " hiphop | \n",
2235 | " 2096 | \n",
2236 | "
\n",
2237 | " \n",
2238 | " classical | \n",
2239 | " 1616 | \n",
2240 | "
\n",
2241 | " \n",
2242 | " world | \n",
2243 | " 1432 | \n",
2244 | "
\n",
2245 | " \n",
2246 | " alternative | \n",
2247 | " 1379 | \n",
2248 | "
\n",
2249 | " \n",
2250 | " ruspop | \n",
2251 | " 1372 | \n",
2252 | "
\n",
2253 | " \n",
2254 | " rusrap | \n",
2255 | " 1161 | \n",
2256 | "
\n",
2257 | " \n",
2258 | "
\n",
2259 | "
"
2260 | ],
2261 | "text/plain": [
2262 | " genre\n",
2263 | "genre \n",
2264 | "pop 5892\n",
2265 | "dance 4435\n",
2266 | "rock 3965\n",
2267 | "electronic 3786\n",
2268 | "hiphop 2096\n",
2269 | "classical 1616\n",
2270 | "world 1432\n",
2271 | "alternative 1379\n",
2272 | "ruspop 1372\n",
2273 | "rusrap 1161"
2274 | ]
2275 | },
2276 | "execution_count": 35,
2277 | "metadata": {},
2278 | "output_type": "execute_result"
2279 | }
2280 | ],
2281 | "source": [
2282 | "moscow_general.to_frame().head(10) # просмотр первых 10 строк moscow_genres"
2283 | ]
2284 | },
2285 | {
2286 | "cell_type": "markdown",
2287 | "metadata": {
2288 | "id": "cnPG2vnN_Zcv"
2289 | },
2290 | "source": [
2291 | "Теперь повторим то же и для Петербурга.\n",
2292 | "\n",
2293 | "Сгруппируем таблицу `spb_general` по жанру. Посчитаем прослушивания треков каждого жанра. Результат отсортируем в порядке убывания и сохраним в таблице `spb_genres`:\n"
2294 | ]
2295 | },
2296 | {
2297 | "cell_type": "code",
2298 | "execution_count": 36,
2299 | "metadata": {
2300 | "id": "gluLIpE7_Zcv"
2301 | },
2302 | "outputs": [],
2303 | "source": [
2304 | "# одной строкой: группировка таблицы spb_general по столбцу 'genre', \n",
2305 | "# подсчёт числа значений 'genre' в этой группировке методом count(), \n",
2306 | "# сортировка получившегося Series в порядке убывания и сохранение в spb_genres\n",
2307 | "\n",
2308 | "spb_general = spb_general.groupby('genre')['genre'].count().sort_values(ascending=False)"
2309 | ]
2310 | },
2311 | {
2312 | "cell_type": "markdown",
2313 | "metadata": {
2314 | "id": "5Doha_ODgyQ8"
2315 | },
2316 | "source": [
2317 | "Выведем на экран первые десять строк `spb_genres`:"
2318 | ]
2319 | },
2320 | {
2321 | "cell_type": "code",
2322 | "execution_count": 37,
2323 | "metadata": {
2324 | "id": "uaGJHjVU_Zcv"
2325 | },
2326 | "outputs": [
2327 | {
2328 | "data": {
2329 | "text/html": [
2330 | "\n",
2331 | "\n",
2344 | "
\n",
2345 | " \n",
2346 | " \n",
2347 | " | \n",
2348 | " genre | \n",
2349 | "
\n",
2350 | " \n",
2351 | " genre | \n",
2352 | " | \n",
2353 | "
\n",
2354 | " \n",
2355 | " \n",
2356 | " \n",
2357 | " pop | \n",
2358 | " 5892 | \n",
2359 | "
\n",
2360 | " \n",
2361 | " dance | \n",
2362 | " 4435 | \n",
2363 | "
\n",
2364 | " \n",
2365 | " rock | \n",
2366 | " 3965 | \n",
2367 | "
\n",
2368 | " \n",
2369 | " electronic | \n",
2370 | " 3786 | \n",
2371 | "
\n",
2372 | " \n",
2373 | " hiphop | \n",
2374 | " 2096 | \n",
2375 | "
\n",
2376 | " \n",
2377 | " classical | \n",
2378 | " 1616 | \n",
2379 | "
\n",
2380 | " \n",
2381 | " world | \n",
2382 | " 1432 | \n",
2383 | "
\n",
2384 | " \n",
2385 | " alternative | \n",
2386 | " 1379 | \n",
2387 | "
\n",
2388 | " \n",
2389 | " ruspop | \n",
2390 | " 1372 | \n",
2391 | "
\n",
2392 | " \n",
2393 | " rusrap | \n",
2394 | " 1161 | \n",
2395 | "
\n",
2396 | " \n",
2397 | "
\n",
2398 | "
"
2399 | ],
2400 | "text/plain": [
2401 | " genre\n",
2402 | "genre \n",
2403 | "pop 5892\n",
2404 | "dance 4435\n",
2405 | "rock 3965\n",
2406 | "electronic 3786\n",
2407 | "hiphop 2096\n",
2408 | "classical 1616\n",
2409 | "world 1432\n",
2410 | "alternative 1379\n",
2411 | "ruspop 1372\n",
2412 | "rusrap 1161"
2413 | ]
2414 | },
2415 | "execution_count": 37,
2416 | "metadata": {},
2417 | "output_type": "execute_result"
2418 | }
2419 | ],
2420 | "source": [
2421 | "moscow_general.to_frame().head(10) # просмотр первых 10 строк spb_genres"
2422 | ]
2423 | },
2424 | {
2425 | "cell_type": "markdown",
2426 | "metadata": {
2427 | "id": "RY51YJYu_Zcv"
2428 | },
2429 | "source": [
2430 | "**Выводы**"
2431 | ]
2432 | },
2433 | {
2434 | "cell_type": "markdown",
2435 | "metadata": {
2436 | "id": "nVhnJEm__Zcv"
2437 | },
2438 | "source": [
2439 | "Гипотеза частично подтвердилась:\n",
2440 | "* Поп-музыка — самый популярный жанр в Москве, как и предполагала гипотеза. Более того, в топ-10 жанров встречается близкий жанр — русская популярная музыка.\n",
2441 | "* Вопреки ожиданиям, рэп одинаково популярен в Москве и Петербурге. \n"
2442 | ]
2443 | },
2444 | {
2445 | "cell_type": "markdown",
2446 | "metadata": {
2447 | "id": "ykKQ0N65_Zcv"
2448 | },
2449 | "source": [
2450 | "## Итоги исследования"
2451 | ]
2452 | },
2453 | {
2454 | "cell_type": "markdown",
2455 | "metadata": {
2456 | "id": "tjUwbHb3_Zcv"
2457 | },
2458 | "source": [
2459 | "Мы проверили три гипотезы и установили:\n",
2460 | "\n",
2461 | "1. День недели по-разному влияет на активность пользователей в Москве и Петербурге. \n",
2462 | "\n",
2463 | "Первая гипотеза полностью подтвердилась.\n",
2464 | "\n",
2465 | "2. Музыкальные предпочтения не сильно меняются в течение недели — будь то Москва или Петербург. Небольшие различия заметны в начале недели, по понедельникам:\n",
2466 | "* в Москве слушают музыку жанра “world”,\n",
2467 | "* в Петербурге — джаз и классику.\n",
2468 | "\n",
2469 | "Таким образом, вторая гипотеза подтвердилась лишь отчасти. Этот результат мог оказаться иным, если бы не пропуски в данных.\n",
2470 | "\n",
2471 | "3. Во вкусах пользователей Москвы и Петербурга больше общего чем различий. Вопреки ожиданиям, предпочтения жанров в Петербурге напоминают московские.\n",
2472 | "\n",
2473 | "Третья гипотеза не подтвердилась. Если различия в предпочтениях и существуют, на основной массе пользователей они незаметны.\n",
2474 | "\n"
2475 | ]
2476 | }
2477 | ],
2478 | "metadata": {
2479 | "ExecuteTimeLog": [
2480 | {
2481 | "duration": 354,
2482 | "start_time": "2022-01-30T16:36:05.029Z"
2483 | },
2484 | {
2485 | "duration": 308,
2486 | "start_time": "2022-01-30T16:36:19.337Z"
2487 | },
2488 | {
2489 | "duration": 524,
2490 | "start_time": "2022-01-30T16:37:45.850Z"
2491 | },
2492 | {
2493 | "duration": 343,
2494 | "start_time": "2022-01-30T16:38:19.745Z"
2495 | },
2496 | {
2497 | "duration": 601,
2498 | "start_time": "2022-01-30T16:39:16.539Z"
2499 | },
2500 | {
2501 | "duration": 532,
2502 | "start_time": "2022-01-30T16:39:48.258Z"
2503 | },
2504 | {
2505 | "duration": 461,
2506 | "start_time": "2022-01-30T16:40:00.498Z"
2507 | },
2508 | {
2509 | "duration": 345,
2510 | "start_time": "2022-01-30T16:44:08.982Z"
2511 | },
2512 | {
2513 | "duration": 557,
2514 | "start_time": "2022-01-30T16:44:29.753Z"
2515 | },
2516 | {
2517 | "duration": 289,
2518 | "start_time": "2022-01-30T16:45:16.782Z"
2519 | },
2520 | {
2521 | "duration": 298,
2522 | "start_time": "2022-01-30T16:45:46.533Z"
2523 | },
2524 | {
2525 | "duration": 391,
2526 | "start_time": "2022-01-30T16:48:22.163Z"
2527 | },
2528 | {
2529 | "duration": 820,
2530 | "start_time": "2022-01-30T16:48:30.101Z"
2531 | },
2532 | {
2533 | "duration": 176,
2534 | "start_time": "2022-01-30T16:48:30.923Z"
2535 | },
2536 | {
2537 | "duration": 39,
2538 | "start_time": "2022-01-30T16:48:31.102Z"
2539 | },
2540 | {
2541 | "duration": 4,
2542 | "start_time": "2022-01-30T16:48:31.144Z"
2543 | },
2544 | {
2545 | "duration": 13,
2546 | "start_time": "2022-01-30T16:48:31.150Z"
2547 | },
2548 | {
2549 | "duration": 8,
2550 | "start_time": "2022-01-30T16:48:31.166Z"
2551 | },
2552 | {
2553 | "duration": 12,
2554 | "start_time": "2022-01-30T16:48:31.176Z"
2555 | },
2556 | {
2557 | "duration": 8,
2558 | "start_time": "2022-01-30T16:48:31.192Z"
2559 | },
2560 | {
2561 | "duration": 6,
2562 | "start_time": "2022-01-30T16:48:31.203Z"
2563 | },
2564 | {
2565 | "duration": 20,
2566 | "start_time": "2022-01-30T16:48:31.212Z"
2567 | },
2568 | {
2569 | "duration": 7,
2570 | "start_time": "2022-01-30T16:48:31.235Z"
2571 | },
2572 | {
2573 | "duration": 6,
2574 | "start_time": "2022-01-30T16:48:31.244Z"
2575 | },
2576 | {
2577 | "duration": 12,
2578 | "start_time": "2022-01-30T16:48:31.252Z"
2579 | },
2580 | {
2581 | "duration": 9,
2582 | "start_time": "2022-01-30T16:48:31.266Z"
2583 | },
2584 | {
2585 | "duration": 7,
2586 | "start_time": "2022-01-30T16:48:31.277Z"
2587 | },
2588 | {
2589 | "duration": 9,
2590 | "start_time": "2022-01-30T16:48:31.286Z"
2591 | },
2592 | {
2593 | "duration": 6,
2594 | "start_time": "2022-01-30T16:48:31.297Z"
2595 | },
2596 | {
2597 | "duration": 10,
2598 | "start_time": "2022-01-30T16:48:31.305Z"
2599 | },
2600 | {
2601 | "duration": 14,
2602 | "start_time": "2022-01-30T16:48:31.333Z"
2603 | },
2604 | {
2605 | "duration": 12,
2606 | "start_time": "2022-01-30T16:48:31.349Z"
2607 | },
2608 | {
2609 | "duration": 10,
2610 | "start_time": "2022-01-30T16:48:31.363Z"
2611 | },
2612 | {
2613 | "duration": 20,
2614 | "start_time": "2022-01-30T16:48:31.376Z"
2615 | },
2616 | {
2617 | "duration": 10,
2618 | "start_time": "2022-01-30T16:48:31.401Z"
2619 | },
2620 | {
2621 | "duration": 12,
2622 | "start_time": "2022-01-30T16:48:31.414Z"
2623 | },
2624 | {
2625 | "duration": 12,
2626 | "start_time": "2022-01-30T16:48:31.429Z"
2627 | },
2628 | {
2629 | "duration": 8,
2630 | "start_time": "2022-01-30T16:48:31.443Z"
2631 | },
2632 | {
2633 | "duration": 7,
2634 | "start_time": "2022-01-30T16:48:31.454Z"
2635 | },
2636 | {
2637 | "duration": 18,
2638 | "start_time": "2022-01-30T16:48:31.464Z"
2639 | },
2640 | {
2641 | "duration": 8,
2642 | "start_time": "2022-01-30T16:48:31.485Z"
2643 | },
2644 | {
2645 | "duration": 7,
2646 | "start_time": "2022-01-30T16:48:31.495Z"
2647 | },
2648 | {
2649 | "duration": 10,
2650 | "start_time": "2022-01-30T16:48:31.505Z"
2651 | },
2652 | {
2653 | "duration": 11,
2654 | "start_time": "2022-01-30T16:48:31.517Z"
2655 | },
2656 | {
2657 | "duration": 18,
2658 | "start_time": "2022-01-30T16:48:31.533Z"
2659 | },
2660 | {
2661 | "duration": 15,
2662 | "start_time": "2022-01-30T16:48:31.554Z"
2663 | },
2664 | {
2665 | "duration": 25,
2666 | "start_time": "2022-01-30T16:48:31.571Z"
2667 | },
2668 | {
2669 | "duration": 15,
2670 | "start_time": "2022-01-30T16:48:31.599Z"
2671 | },
2672 | {
2673 | "duration": 14,
2674 | "start_time": "2022-01-30T16:48:31.617Z"
2675 | },
2676 | {
2677 | "duration": 18,
2678 | "start_time": "2022-01-30T16:48:31.633Z"
2679 | },
2680 | {
2681 | "duration": 318,
2682 | "start_time": "2022-01-30T16:49:16.561Z"
2683 | },
2684 | {
2685 | "duration": 31,
2686 | "start_time": "2022-01-30T16:49:38.865Z"
2687 | },
2688 | {
2689 | "duration": 5,
2690 | "start_time": "2022-01-30T16:52:34.855Z"
2691 | },
2692 | {
2693 | "duration": 102,
2694 | "start_time": "2022-01-30T16:57:21.751Z"
2695 | },
2696 | {
2697 | "duration": 28,
2698 | "start_time": "2022-01-30T16:57:38.713Z"
2699 | },
2700 | {
2701 | "duration": 4,
2702 | "start_time": "2022-01-30T16:57:59.263Z"
2703 | },
2704 | {
2705 | "duration": 28,
2706 | "start_time": "2022-01-30T17:08:08.208Z"
2707 | },
2708 | {
2709 | "duration": 22,
2710 | "start_time": "2022-01-30T17:08:23.679Z"
2711 | },
2712 | {
2713 | "duration": 5,
2714 | "start_time": "2022-01-30T17:08:33.949Z"
2715 | },
2716 | {
2717 | "duration": 29,
2718 | "start_time": "2022-01-30T17:18:36.571Z"
2719 | },
2720 | {
2721 | "duration": 326,
2722 | "start_time": "2022-01-30T17:23:56.824Z"
2723 | },
2724 | {
2725 | "duration": 321,
2726 | "start_time": "2022-01-30T17:24:26.996Z"
2727 | },
2728 | {
2729 | "duration": 23,
2730 | "start_time": "2022-01-30T17:25:00.627Z"
2731 | },
2732 | {
2733 | "duration": 29,
2734 | "start_time": "2022-01-30T17:25:30.883Z"
2735 | },
2736 | {
2737 | "duration": 297,
2738 | "start_time": "2022-01-31T08:31:53.232Z"
2739 | },
2740 | {
2741 | "duration": 248,
2742 | "start_time": "2022-01-31T08:32:28.850Z"
2743 | },
2744 | {
2745 | "duration": 3,
2746 | "start_time": "2022-01-31T08:32:47.061Z"
2747 | },
2748 | {
2749 | "duration": 260,
2750 | "start_time": "2022-01-31T08:32:51.271Z"
2751 | },
2752 | {
2753 | "duration": 252,
2754 | "start_time": "2022-01-31T08:32:57.179Z"
2755 | },
2756 | {
2757 | "duration": 558,
2758 | "start_time": "2022-01-31T08:33:07.085Z"
2759 | },
2760 | {
2761 | "duration": 123,
2762 | "start_time": "2022-01-31T08:33:07.644Z"
2763 | },
2764 | {
2765 | "duration": 16,
2766 | "start_time": "2022-01-31T08:33:07.769Z"
2767 | },
2768 | {
2769 | "duration": 24,
2770 | "start_time": "2022-01-31T08:33:07.787Z"
2771 | },
2772 | {
2773 | "duration": 4,
2774 | "start_time": "2022-01-31T08:33:07.812Z"
2775 | },
2776 | {
2777 | "duration": 21,
2778 | "start_time": "2022-01-31T08:33:07.817Z"
2779 | },
2780 | {
2781 | "duration": 3,
2782 | "start_time": "2022-01-31T08:33:07.840Z"
2783 | },
2784 | {
2785 | "duration": 40,
2786 | "start_time": "2022-01-31T08:33:07.844Z"
2787 | },
2788 | {
2789 | "duration": 15,
2790 | "start_time": "2022-01-31T08:33:07.887Z"
2791 | },
2792 | {
2793 | "duration": 21,
2794 | "start_time": "2022-01-31T08:33:07.904Z"
2795 | },
2796 | {
2797 | "duration": 77,
2798 | "start_time": "2022-01-31T08:33:07.926Z"
2799 | },
2800 | {
2801 | "duration": 1,
2802 | "start_time": "2022-01-31T08:33:08.005Z"
2803 | },
2804 | {
2805 | "duration": 6,
2806 | "start_time": "2022-01-31T08:33:08.008Z"
2807 | },
2808 | {
2809 | "duration": 5,
2810 | "start_time": "2022-01-31T08:33:08.015Z"
2811 | },
2812 | {
2813 | "duration": 4,
2814 | "start_time": "2022-01-31T08:33:08.022Z"
2815 | },
2816 | {
2817 | "duration": 6,
2818 | "start_time": "2022-01-31T08:33:08.027Z"
2819 | },
2820 | {
2821 | "duration": 8,
2822 | "start_time": "2022-01-31T08:33:08.034Z"
2823 | },
2824 | {
2825 | "duration": 7,
2826 | "start_time": "2022-01-31T08:33:08.044Z"
2827 | },
2828 | {
2829 | "duration": 9,
2830 | "start_time": "2022-01-31T08:33:08.052Z"
2831 | },
2832 | {
2833 | "duration": 8,
2834 | "start_time": "2022-01-31T08:33:08.062Z"
2835 | },
2836 | {
2837 | "duration": 10,
2838 | "start_time": "2022-01-31T08:33:08.072Z"
2839 | },
2840 | {
2841 | "duration": 8,
2842 | "start_time": "2022-01-31T08:33:08.084Z"
2843 | },
2844 | {
2845 | "duration": 8,
2846 | "start_time": "2022-01-31T08:33:08.093Z"
2847 | },
2848 | {
2849 | "duration": 8,
2850 | "start_time": "2022-01-31T08:33:08.102Z"
2851 | },
2852 | {
2853 | "duration": 7,
2854 | "start_time": "2022-01-31T08:33:08.112Z"
2855 | },
2856 | {
2857 | "duration": 11,
2858 | "start_time": "2022-01-31T08:33:08.121Z"
2859 | },
2860 | {
2861 | "duration": 6,
2862 | "start_time": "2022-01-31T08:33:08.135Z"
2863 | },
2864 | {
2865 | "duration": 7,
2866 | "start_time": "2022-01-31T08:33:08.142Z"
2867 | },
2868 | {
2869 | "duration": 8,
2870 | "start_time": "2022-01-31T08:33:08.151Z"
2871 | },
2872 | {
2873 | "duration": 8,
2874 | "start_time": "2022-01-31T08:33:08.160Z"
2875 | },
2876 | {
2877 | "duration": 11,
2878 | "start_time": "2022-01-31T08:33:08.169Z"
2879 | },
2880 | {
2881 | "duration": 10,
2882 | "start_time": "2022-01-31T08:33:08.181Z"
2883 | },
2884 | {
2885 | "duration": 11,
2886 | "start_time": "2022-01-31T08:33:08.192Z"
2887 | },
2888 | {
2889 | "duration": 9,
2890 | "start_time": "2022-01-31T08:33:08.204Z"
2891 | },
2892 | {
2893 | "duration": 8,
2894 | "start_time": "2022-01-31T08:33:08.214Z"
2895 | },
2896 | {
2897 | "duration": 8,
2898 | "start_time": "2022-01-31T08:33:08.224Z"
2899 | },
2900 | {
2901 | "duration": 6,
2902 | "start_time": "2022-01-31T08:33:08.234Z"
2903 | },
2904 | {
2905 | "duration": 8,
2906 | "start_time": "2022-01-31T08:33:08.242Z"
2907 | },
2908 | {
2909 | "duration": 68,
2910 | "start_time": "2022-01-31T08:34:11.549Z"
2911 | },
2912 | {
2913 | "duration": 46,
2914 | "start_time": "2022-01-31T08:34:29.108Z"
2915 | },
2916 | {
2917 | "duration": 18,
2918 | "start_time": "2022-01-31T08:36:10.862Z"
2919 | },
2920 | {
2921 | "duration": 11769,
2922 | "start_time": "2022-01-31T08:36:28.721Z"
2923 | },
2924 | {
2925 | "duration": 8,
2926 | "start_time": "2022-01-31T08:37:04.491Z"
2927 | },
2928 | {
2929 | "duration": 6,
2930 | "start_time": "2022-01-31T08:37:17.994Z"
2931 | },
2932 | {
2933 | "duration": 9,
2934 | "start_time": "2022-01-31T08:37:37.238Z"
2935 | },
2936 | {
2937 | "duration": 8,
2938 | "start_time": "2022-01-31T09:02:37.923Z"
2939 | },
2940 | {
2941 | "duration": 3,
2942 | "start_time": "2022-01-31T09:03:03.279Z"
2943 | },
2944 | {
2945 | "duration": 271,
2946 | "start_time": "2022-01-31T09:03:09.727Z"
2947 | },
2948 | {
2949 | "duration": 516,
2950 | "start_time": "2022-01-31T09:03:29.260Z"
2951 | },
2952 | {
2953 | "duration": 4,
2954 | "start_time": "2022-01-31T09:05:04.926Z"
2955 | },
2956 | {
2957 | "duration": 510,
2958 | "start_time": "2022-01-31T09:05:09.252Z"
2959 | },
2960 | {
2961 | "duration": 581,
2962 | "start_time": "2022-01-31T09:07:06.510Z"
2963 | },
2964 | {
2965 | "duration": 3,
2966 | "start_time": "2022-01-31T09:08:20.260Z"
2967 | },
2968 | {
2969 | "duration": 9,
2970 | "start_time": "2022-01-31T09:08:25.905Z"
2971 | },
2972 | {
2973 | "duration": 9,
2974 | "start_time": "2022-01-31T09:08:34.020Z"
2975 | },
2976 | {
2977 | "duration": 254,
2978 | "start_time": "2022-01-31T09:18:12.201Z"
2979 | },
2980 | {
2981 | "duration": 9,
2982 | "start_time": "2022-01-31T09:19:35.972Z"
2983 | },
2984 | {
2985 | "duration": 3,
2986 | "start_time": "2022-01-31T09:19:40.718Z"
2987 | },
2988 | {
2989 | "duration": 13,
2990 | "start_time": "2022-01-31T09:20:31.445Z"
2991 | },
2992 | {
2993 | "duration": 4,
2994 | "start_time": "2022-01-31T09:20:35.445Z"
2995 | },
2996 | {
2997 | "duration": 10,
2998 | "start_time": "2022-01-31T09:21:15.058Z"
2999 | },
3000 | {
3001 | "duration": 2,
3002 | "start_time": "2022-01-31T09:21:20.619Z"
3003 | },
3004 | {
3005 | "duration": 20,
3006 | "start_time": "2022-01-31T09:21:38.685Z"
3007 | },
3008 | {
3009 | "duration": 15,
3010 | "start_time": "2022-01-31T09:21:45.100Z"
3011 | },
3012 | {
3013 | "duration": 19,
3014 | "start_time": "2022-01-31T09:21:51.331Z"
3015 | },
3016 | {
3017 | "duration": 48,
3018 | "start_time": "2022-01-31T09:21:55.296Z"
3019 | },
3020 | {
3021 | "duration": 52,
3022 | "start_time": "2022-01-31T09:22:02.378Z"
3023 | },
3024 | {
3025 | "duration": 58,
3026 | "start_time": "2022-01-31T09:22:07.201Z"
3027 | },
3028 | {
3029 | "duration": 51,
3030 | "start_time": "2022-01-31T09:22:11.608Z"
3031 | },
3032 | {
3033 | "duration": 10,
3034 | "start_time": "2022-01-31T09:22:22.910Z"
3035 | },
3036 | {
3037 | "duration": 3,
3038 | "start_time": "2022-01-31T09:22:28.937Z"
3039 | },
3040 | {
3041 | "duration": 156,
3042 | "start_time": "2022-01-31T09:22:28.941Z"
3043 | },
3044 | {
3045 | "duration": 9,
3046 | "start_time": "2022-01-31T09:22:29.099Z"
3047 | },
3048 | {
3049 | "duration": 29,
3050 | "start_time": "2022-01-31T09:22:29.109Z"
3051 | },
3052 | {
3053 | "duration": 17,
3054 | "start_time": "2022-01-31T09:22:29.140Z"
3055 | },
3056 | {
3057 | "duration": 15,
3058 | "start_time": "2022-01-31T09:22:29.158Z"
3059 | },
3060 | {
3061 | "duration": 3,
3062 | "start_time": "2022-01-31T09:22:29.175Z"
3063 | },
3064 | {
3065 | "duration": 21,
3066 | "start_time": "2022-01-31T09:22:29.180Z"
3067 | },
3068 | {
3069 | "duration": 15,
3070 | "start_time": "2022-01-31T09:22:29.202Z"
3071 | },
3072 | {
3073 | "duration": 19,
3074 | "start_time": "2022-01-31T09:22:29.218Z"
3075 | },
3076 | {
3077 | "duration": 70,
3078 | "start_time": "2022-01-31T09:22:29.238Z"
3079 | },
3080 | {
3081 | "duration": 51,
3082 | "start_time": "2022-01-31T09:22:29.310Z"
3083 | },
3084 | {
3085 | "duration": 48,
3086 | "start_time": "2022-01-31T09:22:29.363Z"
3087 | },
3088 | {
3089 | "duration": 8,
3090 | "start_time": "2022-01-31T09:22:29.412Z"
3091 | },
3092 | {
3093 | "duration": 2,
3094 | "start_time": "2022-01-31T09:22:29.422Z"
3095 | },
3096 | {
3097 | "duration": 9,
3098 | "start_time": "2022-01-31T09:22:29.426Z"
3099 | },
3100 | {
3101 | "duration": 8,
3102 | "start_time": "2022-01-31T09:22:29.437Z"
3103 | },
3104 | {
3105 | "duration": 27,
3106 | "start_time": "2022-01-31T09:22:29.446Z"
3107 | },
3108 | {
3109 | "duration": 4,
3110 | "start_time": "2022-01-31T09:22:29.476Z"
3111 | },
3112 | {
3113 | "duration": 4,
3114 | "start_time": "2022-01-31T09:22:29.481Z"
3115 | },
3116 | {
3117 | "duration": 8,
3118 | "start_time": "2022-01-31T09:22:29.486Z"
3119 | },
3120 | {
3121 | "duration": 8,
3122 | "start_time": "2022-01-31T09:22:29.495Z"
3123 | },
3124 | {
3125 | "duration": 9,
3126 | "start_time": "2022-01-31T09:22:29.504Z"
3127 | },
3128 | {
3129 | "duration": 9,
3130 | "start_time": "2022-01-31T09:22:29.514Z"
3131 | },
3132 | {
3133 | "duration": 8,
3134 | "start_time": "2022-01-31T09:22:29.524Z"
3135 | },
3136 | {
3137 | "duration": 11,
3138 | "start_time": "2022-01-31T09:22:29.534Z"
3139 | },
3140 | {
3141 | "duration": 8,
3142 | "start_time": "2022-01-31T09:22:29.546Z"
3143 | },
3144 | {
3145 | "duration": 9,
3146 | "start_time": "2022-01-31T09:22:29.555Z"
3147 | },
3148 | {
3149 | "duration": 8,
3150 | "start_time": "2022-01-31T09:22:29.565Z"
3151 | },
3152 | {
3153 | "duration": 9,
3154 | "start_time": "2022-01-31T09:22:29.575Z"
3155 | },
3156 | {
3157 | "duration": 11,
3158 | "start_time": "2022-01-31T09:22:29.585Z"
3159 | },
3160 | {
3161 | "duration": 8,
3162 | "start_time": "2022-01-31T09:22:29.597Z"
3163 | },
3164 | {
3165 | "duration": 11,
3166 | "start_time": "2022-01-31T09:22:29.607Z"
3167 | },
3168 | {
3169 | "duration": 8,
3170 | "start_time": "2022-01-31T09:22:29.619Z"
3171 | },
3172 | {
3173 | "duration": 9,
3174 | "start_time": "2022-01-31T09:22:29.628Z"
3175 | },
3176 | {
3177 | "duration": 8,
3178 | "start_time": "2022-01-31T09:22:29.639Z"
3179 | },
3180 | {
3181 | "duration": 9,
3182 | "start_time": "2022-01-31T09:22:29.649Z"
3183 | },
3184 | {
3185 | "duration": 8,
3186 | "start_time": "2022-01-31T09:22:29.659Z"
3187 | },
3188 | {
3189 | "duration": 4,
3190 | "start_time": "2022-01-31T09:24:42.453Z"
3191 | },
3192 | {
3193 | "duration": 49,
3194 | "start_time": "2022-01-31T09:25:03.125Z"
3195 | },
3196 | {
3197 | "duration": 11,
3198 | "start_time": "2022-01-31T09:25:36.533Z"
3199 | },
3200 | {
3201 | "duration": 266,
3202 | "start_time": "2022-01-31T09:28:06.853Z"
3203 | },
3204 | {
3205 | "duration": 11,
3206 | "start_time": "2022-01-31T09:41:04.476Z"
3207 | },
3208 | {
3209 | "duration": 3,
3210 | "start_time": "2022-01-31T10:02:32.374Z"
3211 | },
3212 | {
3213 | "duration": 560,
3214 | "start_time": "2022-01-31T10:11:57.771Z"
3215 | },
3216 | {
3217 | "duration": 3,
3218 | "start_time": "2022-01-31T10:12:24.760Z"
3219 | },
3220 | {
3221 | "duration": 20,
3222 | "start_time": "2022-01-31T10:12:29.669Z"
3223 | },
3224 | {
3225 | "duration": 18,
3226 | "start_time": "2022-01-31T10:12:35.211Z"
3227 | },
3228 | {
3229 | "duration": 19,
3230 | "start_time": "2022-01-31T10:12:40.083Z"
3231 | },
3232 | {
3233 | "duration": 18,
3234 | "start_time": "2022-01-31T10:12:43.148Z"
3235 | },
3236 | {
3237 | "duration": 20,
3238 | "start_time": "2022-01-31T10:12:46.606Z"
3239 | },
3240 | {
3241 | "duration": 13,
3242 | "start_time": "2022-01-31T10:12:49.932Z"
3243 | },
3244 | {
3245 | "duration": 289,
3246 | "start_time": "2022-01-31T10:13:03.221Z"
3247 | },
3248 | {
3249 | "duration": 20,
3250 | "start_time": "2022-01-31T10:14:14.455Z"
3251 | },
3252 | {
3253 | "duration": 19,
3254 | "start_time": "2022-01-31T10:14:18.952Z"
3255 | },
3256 | {
3257 | "duration": 20,
3258 | "start_time": "2022-01-31T10:14:24.210Z"
3259 | },
3260 | {
3261 | "duration": 17,
3262 | "start_time": "2022-01-31T10:14:28.269Z"
3263 | },
3264 | {
3265 | "duration": 21,
3266 | "start_time": "2022-01-31T10:14:33.377Z"
3267 | },
3268 | {
3269 | "duration": 17,
3270 | "start_time": "2022-01-31T10:14:36.345Z"
3271 | },
3272 | {
3273 | "duration": 19,
3274 | "start_time": "2022-01-31T10:15:22.536Z"
3275 | },
3276 | {
3277 | "duration": 17,
3278 | "start_time": "2022-01-31T10:15:26.700Z"
3279 | },
3280 | {
3281 | "duration": 20,
3282 | "start_time": "2022-01-31T10:16:47.277Z"
3283 | },
3284 | {
3285 | "duration": 20,
3286 | "start_time": "2022-01-31T10:17:39.703Z"
3287 | },
3288 | {
3289 | "duration": 20,
3290 | "start_time": "2022-01-31T10:17:45.329Z"
3291 | },
3292 | {
3293 | "duration": 17,
3294 | "start_time": "2022-01-31T10:17:48.313Z"
3295 | },
3296 | {
3297 | "duration": 20,
3298 | "start_time": "2022-01-31T10:17:52.285Z"
3299 | },
3300 | {
3301 | "duration": 18,
3302 | "start_time": "2022-01-31T10:17:56.465Z"
3303 | },
3304 | {
3305 | "duration": 19,
3306 | "start_time": "2022-01-31T10:19:25.205Z"
3307 | },
3308 | {
3309 | "duration": 18,
3310 | "start_time": "2022-01-31T10:19:30.782Z"
3311 | },
3312 | {
3313 | "duration": 3,
3314 | "start_time": "2022-01-31T10:19:33.269Z"
3315 | },
3316 | {
3317 | "duration": 47,
3318 | "start_time": "2022-01-31T10:19:39.074Z"
3319 | },
3320 | {
3321 | "duration": 30,
3322 | "start_time": "2022-01-31T10:19:52.182Z"
3323 | },
3324 | {
3325 | "duration": 51,
3326 | "start_time": "2022-01-31T10:20:51.234Z"
3327 | },
3328 | {
3329 | "duration": 51,
3330 | "start_time": "2022-01-31T10:20:55.477Z"
3331 | },
3332 | {
3333 | "duration": 4,
3334 | "start_time": "2022-01-31T10:21:19.005Z"
3335 | },
3336 | {
3337 | "duration": 20,
3338 | "start_time": "2022-01-31T10:21:22.437Z"
3339 | },
3340 | {
3341 | "duration": 17,
3342 | "start_time": "2022-01-31T10:21:25.389Z"
3343 | },
3344 | {
3345 | "duration": 21,
3346 | "start_time": "2022-01-31T10:21:30.558Z"
3347 | },
3348 | {
3349 | "duration": 17,
3350 | "start_time": "2022-01-31T10:21:35.174Z"
3351 | },
3352 | {
3353 | "duration": 3,
3354 | "start_time": "2022-01-31T10:23:08.983Z"
3355 | },
3356 | {
3357 | "duration": 554,
3358 | "start_time": "2022-01-31T10:23:13.602Z"
3359 | },
3360 | {
3361 | "duration": 4,
3362 | "start_time": "2022-01-31T10:28:23.030Z"
3363 | },
3364 | {
3365 | "duration": 22,
3366 | "start_time": "2022-01-31T10:28:27.331Z"
3367 | },
3368 | {
3369 | "duration": 26,
3370 | "start_time": "2022-01-31T10:28:31.469Z"
3371 | },
3372 | {
3373 | "duration": 21,
3374 | "start_time": "2022-01-31T10:28:35.949Z"
3375 | },
3376 | {
3377 | "duration": 21,
3378 | "start_time": "2022-01-31T10:30:08.243Z"
3379 | },
3380 | {
3381 | "duration": 3,
3382 | "start_time": "2022-01-31T10:33:19.045Z"
3383 | },
3384 | {
3385 | "duration": 528,
3386 | "start_time": "2022-01-31T10:33:23.182Z"
3387 | },
3388 | {
3389 | "duration": 532,
3390 | "start_time": "2022-01-31T10:34:28.331Z"
3391 | },
3392 | {
3393 | "duration": 569,
3394 | "start_time": "2022-01-31T10:44:01.003Z"
3395 | },
3396 | {
3397 | "duration": 526,
3398 | "start_time": "2022-01-31T10:44:59.420Z"
3399 | },
3400 | {
3401 | "duration": 4,
3402 | "start_time": "2022-01-31T10:50:59.132Z"
3403 | },
3404 | {
3405 | "duration": 62,
3406 | "start_time": "2022-01-31T10:51:02.471Z"
3407 | },
3408 | {
3409 | "duration": 3,
3410 | "start_time": "2022-01-31T10:52:06.395Z"
3411 | },
3412 | {
3413 | "duration": 21,
3414 | "start_time": "2022-01-31T10:52:12.485Z"
3415 | },
3416 | {
3417 | "duration": 19,
3418 | "start_time": "2022-01-31T10:52:17.644Z"
3419 | },
3420 | {
3421 | "duration": 7,
3422 | "start_time": "2022-01-31T10:53:30.200Z"
3423 | },
3424 | {
3425 | "duration": 566,
3426 | "start_time": "2022-01-31T10:53:33.505Z"
3427 | },
3428 | {
3429 | "duration": 3,
3430 | "start_time": "2022-01-31T10:54:45.301Z"
3431 | },
3432 | {
3433 | "duration": 1382,
3434 | "start_time": "2022-01-31T10:54:50.229Z"
3435 | },
3436 | {
3437 | "duration": 557,
3438 | "start_time": "2022-01-31T10:57:02.718Z"
3439 | },
3440 | {
3441 | "duration": 627,
3442 | "start_time": "2022-01-31T11:00:56.025Z"
3443 | },
3444 | {
3445 | "duration": 3,
3446 | "start_time": "2022-01-31T11:01:46.107Z"
3447 | },
3448 | {
3449 | "duration": 24,
3450 | "start_time": "2022-01-31T11:01:49.816Z"
3451 | },
3452 | {
3453 | "duration": 20,
3454 | "start_time": "2022-01-31T11:01:57.505Z"
3455 | },
3456 | {
3457 | "duration": 22,
3458 | "start_time": "2022-01-31T11:02:01.840Z"
3459 | },
3460 | {
3461 | "duration": 4,
3462 | "start_time": "2022-01-31T11:03:06.596Z"
3463 | },
3464 | {
3465 | "duration": 61,
3466 | "start_time": "2022-01-31T11:03:12.398Z"
3467 | },
3468 | {
3469 | "duration": 4,
3470 | "start_time": "2022-01-31T11:04:08.489Z"
3471 | },
3472 | {
3473 | "duration": 54,
3474 | "start_time": "2022-01-31T11:04:13.145Z"
3475 | },
3476 | {
3477 | "duration": 8,
3478 | "start_time": "2022-01-31T11:05:08.373Z"
3479 | },
3480 | {
3481 | "duration": 50,
3482 | "start_time": "2022-01-31T11:05:12.570Z"
3483 | },
3484 | {
3485 | "duration": 3,
3486 | "start_time": "2022-01-31T11:06:29.452Z"
3487 | },
3488 | {
3489 | "duration": 556,
3490 | "start_time": "2022-01-31T11:06:32.394Z"
3491 | },
3492 | {
3493 | "duration": 643,
3494 | "start_time": "2022-01-31T11:07:12.258Z"
3495 | },
3496 | {
3497 | "duration": 535,
3498 | "start_time": "2022-01-31T11:08:51.684Z"
3499 | },
3500 | {
3501 | "duration": 3,
3502 | "start_time": "2022-01-31T11:09:09.961Z"
3503 | },
3504 | {
3505 | "duration": 547,
3506 | "start_time": "2022-01-31T11:09:13.849Z"
3507 | },
3508 | {
3509 | "duration": 4,
3510 | "start_time": "2022-01-31T11:13:54.617Z"
3511 | },
3512 | {
3513 | "duration": 16,
3514 | "start_time": "2022-01-31T11:13:58.529Z"
3515 | },
3516 | {
3517 | "duration": 14,
3518 | "start_time": "2022-01-31T11:14:01.509Z"
3519 | },
3520 | {
3521 | "duration": 15,
3522 | "start_time": "2022-01-31T11:14:02.733Z"
3523 | },
3524 | {
3525 | "duration": 14,
3526 | "start_time": "2022-01-31T11:14:03.560Z"
3527 | },
3528 | {
3529 | "duration": 16,
3530 | "start_time": "2022-01-31T11:14:04.276Z"
3531 | },
3532 | {
3533 | "duration": 13,
3534 | "start_time": "2022-01-31T11:14:04.988Z"
3535 | },
3536 | {
3537 | "duration": 296,
3538 | "start_time": "2022-01-31T11:14:52.006Z"
3539 | },
3540 | {
3541 | "duration": 246,
3542 | "start_time": "2022-01-31T11:23:21.847Z"
3543 | },
3544 | {
3545 | "duration": 303,
3546 | "start_time": "2022-01-31T11:23:32.170Z"
3547 | },
3548 | {
3549 | "duration": 4,
3550 | "start_time": "2022-01-31T11:23:42.337Z"
3551 | },
3552 | {
3553 | "duration": 7,
3554 | "start_time": "2022-01-31T11:24:08.561Z"
3555 | },
3556 | {
3557 | "duration": 11,
3558 | "start_time": "2022-01-31T12:36:03.114Z"
3559 | },
3560 | {
3561 | "duration": 8,
3562 | "start_time": "2022-01-31T12:36:06.489Z"
3563 | },
3564 | {
3565 | "duration": 112,
3566 | "start_time": "2022-01-31T12:50:14.889Z"
3567 | },
3568 | {
3569 | "duration": 4,
3570 | "start_time": "2022-01-31T12:50:29.714Z"
3571 | },
3572 | {
3573 | "duration": 256,
3574 | "start_time": "2022-01-31T12:53:53.660Z"
3575 | },
3576 | {
3577 | "duration": 17,
3578 | "start_time": "2022-01-31T12:54:21.945Z"
3579 | },
3580 | {
3581 | "duration": 13,
3582 | "start_time": "2022-01-31T12:55:08.105Z"
3583 | },
3584 | {
3585 | "duration": 16,
3586 | "start_time": "2022-01-31T12:55:24.557Z"
3587 | },
3588 | {
3589 | "duration": 13,
3590 | "start_time": "2022-01-31T12:55:34.753Z"
3591 | },
3592 | {
3593 | "duration": 9,
3594 | "start_time": "2022-01-31T13:04:16.765Z"
3595 | },
3596 | {
3597 | "duration": 10,
3598 | "start_time": "2022-01-31T13:05:39.827Z"
3599 | },
3600 | {
3601 | "duration": 10,
3602 | "start_time": "2022-01-31T13:05:42.965Z"
3603 | },
3604 | {
3605 | "duration": 4,
3606 | "start_time": "2022-01-31T13:05:47.746Z"
3607 | },
3608 | {
3609 | "duration": 10,
3610 | "start_time": "2022-01-31T13:06:58.768Z"
3611 | },
3612 | {
3613 | "duration": 6,
3614 | "start_time": "2022-01-31T13:07:05.000Z"
3615 | },
3616 | {
3617 | "duration": 5,
3618 | "start_time": "2022-01-31T13:07:08.887Z"
3619 | },
3620 | {
3621 | "duration": 5,
3622 | "start_time": "2022-01-31T13:08:09.250Z"
3623 | },
3624 | {
3625 | "duration": 4,
3626 | "start_time": "2022-01-31T13:08:24.710Z"
3627 | },
3628 | {
3629 | "duration": 4,
3630 | "start_time": "2022-01-31T13:14:00.041Z"
3631 | },
3632 | {
3633 | "duration": 5,
3634 | "start_time": "2022-01-31T13:14:15.760Z"
3635 | },
3636 | {
3637 | "duration": 19,
3638 | "start_time": "2022-01-31T13:14:30.607Z"
3639 | },
3640 | {
3641 | "duration": 3,
3642 | "start_time": "2022-01-31T13:14:48.479Z"
3643 | },
3644 | {
3645 | "duration": 115,
3646 | "start_time": "2022-01-31T13:14:48.483Z"
3647 | },
3648 | {
3649 | "duration": 9,
3650 | "start_time": "2022-01-31T13:14:48.600Z"
3651 | },
3652 | {
3653 | "duration": 21,
3654 | "start_time": "2022-01-31T13:14:48.610Z"
3655 | },
3656 | {
3657 | "duration": 3,
3658 | "start_time": "2022-01-31T13:14:48.633Z"
3659 | },
3660 | {
3661 | "duration": 40,
3662 | "start_time": "2022-01-31T13:14:48.637Z"
3663 | },
3664 | {
3665 | "duration": 4,
3666 | "start_time": "2022-01-31T13:14:48.679Z"
3667 | },
3668 | {
3669 | "duration": 22,
3670 | "start_time": "2022-01-31T13:14:48.685Z"
3671 | },
3672 | {
3673 | "duration": 14,
3674 | "start_time": "2022-01-31T13:14:48.708Z"
3675 | },
3676 | {
3677 | "duration": 20,
3678 | "start_time": "2022-01-31T13:14:48.723Z"
3679 | },
3680 | {
3681 | "duration": 73,
3682 | "start_time": "2022-01-31T13:14:48.745Z"
3683 | },
3684 | {
3685 | "duration": 60,
3686 | "start_time": "2022-01-31T13:14:48.819Z"
3687 | },
3688 | {
3689 | "duration": 44,
3690 | "start_time": "2022-01-31T13:14:48.881Z"
3691 | },
3692 | {
3693 | "duration": 8,
3694 | "start_time": "2022-01-31T13:14:48.927Z"
3695 | },
3696 | {
3697 | "duration": 8,
3698 | "start_time": "2022-01-31T13:14:48.937Z"
3699 | },
3700 | {
3701 | "duration": 30,
3702 | "start_time": "2022-01-31T13:14:48.946Z"
3703 | },
3704 | {
3705 | "duration": 8,
3706 | "start_time": "2022-01-31T13:14:48.977Z"
3707 | },
3708 | {
3709 | "duration": 18,
3710 | "start_time": "2022-01-31T13:14:48.987Z"
3711 | },
3712 | {
3713 | "duration": 20,
3714 | "start_time": "2022-01-31T13:14:49.007Z"
3715 | },
3716 | {
3717 | "duration": 5,
3718 | "start_time": "2022-01-31T13:14:49.029Z"
3719 | },
3720 | {
3721 | "duration": 30,
3722 | "start_time": "2022-01-31T13:14:49.036Z"
3723 | },
3724 | {
3725 | "duration": 19,
3726 | "start_time": "2022-01-31T13:14:49.067Z"
3727 | },
3728 | {
3729 | "duration": 17,
3730 | "start_time": "2022-01-31T13:14:49.087Z"
3731 | },
3732 | {
3733 | "duration": 16,
3734 | "start_time": "2022-01-31T13:14:49.106Z"
3735 | },
3736 | {
3737 | "duration": 16,
3738 | "start_time": "2022-01-31T13:14:49.124Z"
3739 | },
3740 | {
3741 | "duration": 16,
3742 | "start_time": "2022-01-31T13:14:49.142Z"
3743 | },
3744 | {
3745 | "duration": 14,
3746 | "start_time": "2022-01-31T13:14:49.160Z"
3747 | },
3748 | {
3749 | "duration": 25,
3750 | "start_time": "2022-01-31T13:14:49.175Z"
3751 | },
3752 | {
3753 | "duration": 8,
3754 | "start_time": "2022-01-31T13:14:49.202Z"
3755 | },
3756 | {
3757 | "duration": 15,
3758 | "start_time": "2022-01-31T13:14:49.212Z"
3759 | },
3760 | {
3761 | "duration": 31,
3762 | "start_time": "2022-01-31T13:14:49.228Z"
3763 | },
3764 | {
3765 | "duration": 9,
3766 | "start_time": "2022-01-31T13:14:49.261Z"
3767 | },
3768 | {
3769 | "duration": 12,
3770 | "start_time": "2022-01-31T13:14:49.272Z"
3771 | },
3772 | {
3773 | "duration": 8,
3774 | "start_time": "2022-01-31T13:14:49.286Z"
3775 | },
3776 | {
3777 | "duration": 9,
3778 | "start_time": "2022-01-31T13:14:49.296Z"
3779 | },
3780 | {
3781 | "duration": 5,
3782 | "start_time": "2022-01-31T13:14:49.306Z"
3783 | },
3784 | {
3785 | "duration": 11,
3786 | "start_time": "2022-01-31T13:14:49.313Z"
3787 | },
3788 | {
3789 | "duration": 7,
3790 | "start_time": "2022-01-31T13:14:49.325Z"
3791 | },
3792 | {
3793 | "duration": 21,
3794 | "start_time": "2022-01-31T13:15:23.831Z"
3795 | },
3796 | {
3797 | "duration": 45,
3798 | "start_time": "2022-01-31T13:15:37.476Z"
3799 | },
3800 | {
3801 | "duration": 2,
3802 | "start_time": "2022-01-31T13:16:29.802Z"
3803 | },
3804 | {
3805 | "duration": 135,
3806 | "start_time": "2022-01-31T13:16:29.806Z"
3807 | },
3808 | {
3809 | "duration": 9,
3810 | "start_time": "2022-01-31T13:16:29.943Z"
3811 | },
3812 | {
3813 | "duration": 38,
3814 | "start_time": "2022-01-31T13:16:29.954Z"
3815 | },
3816 | {
3817 | "duration": 4,
3818 | "start_time": "2022-01-31T13:16:29.994Z"
3819 | },
3820 | {
3821 | "duration": 12,
3822 | "start_time": "2022-01-31T13:16:30.000Z"
3823 | },
3824 | {
3825 | "duration": 4,
3826 | "start_time": "2022-01-31T13:16:30.013Z"
3827 | },
3828 | {
3829 | "duration": 54,
3830 | "start_time": "2022-01-31T13:16:30.019Z"
3831 | },
3832 | {
3833 | "duration": 17,
3834 | "start_time": "2022-01-31T13:16:30.075Z"
3835 | },
3836 | {
3837 | "duration": 31,
3838 | "start_time": "2022-01-31T13:16:30.093Z"
3839 | },
3840 | {
3841 | "duration": 66,
3842 | "start_time": "2022-01-31T13:16:30.126Z"
3843 | },
3844 | {
3845 | "duration": 57,
3846 | "start_time": "2022-01-31T13:16:30.194Z"
3847 | },
3848 | {
3849 | "duration": 70,
3850 | "start_time": "2022-01-31T13:16:30.252Z"
3851 | },
3852 | {
3853 | "duration": 8,
3854 | "start_time": "2022-01-31T13:16:30.324Z"
3855 | },
3856 | {
3857 | "duration": 3,
3858 | "start_time": "2022-01-31T13:16:30.334Z"
3859 | },
3860 | {
3861 | "duration": 14,
3862 | "start_time": "2022-01-31T13:16:30.339Z"
3863 | },
3864 | {
3865 | "duration": 15,
3866 | "start_time": "2022-01-31T13:16:30.371Z"
3867 | },
3868 | {
3869 | "duration": 10,
3870 | "start_time": "2022-01-31T13:16:30.388Z"
3871 | },
3872 | {
3873 | "duration": 9,
3874 | "start_time": "2022-01-31T13:16:30.399Z"
3875 | },
3876 | {
3877 | "duration": 2,
3878 | "start_time": "2022-01-31T13:16:30.410Z"
3879 | },
3880 | {
3881 | "duration": 24,
3882 | "start_time": "2022-01-31T13:16:30.413Z"
3883 | },
3884 | {
3885 | "duration": 36,
3886 | "start_time": "2022-01-31T13:16:30.439Z"
3887 | },
3888 | {
3889 | "duration": 27,
3890 | "start_time": "2022-01-31T13:16:30.479Z"
3891 | },
3892 | {
3893 | "duration": 12,
3894 | "start_time": "2022-01-31T13:16:30.508Z"
3895 | },
3896 | {
3897 | "duration": 24,
3898 | "start_time": "2022-01-31T13:16:30.521Z"
3899 | },
3900 | {
3901 | "duration": 30,
3902 | "start_time": "2022-01-31T13:16:30.547Z"
3903 | },
3904 | {
3905 | "duration": 10,
3906 | "start_time": "2022-01-31T13:16:30.579Z"
3907 | },
3908 | {
3909 | "duration": 16,
3910 | "start_time": "2022-01-31T13:16:30.591Z"
3911 | },
3912 | {
3913 | "duration": 13,
3914 | "start_time": "2022-01-31T13:16:30.609Z"
3915 | },
3916 | {
3917 | "duration": 10,
3918 | "start_time": "2022-01-31T13:16:30.624Z"
3919 | },
3920 | {
3921 | "duration": 31,
3922 | "start_time": "2022-01-31T13:16:30.636Z"
3923 | },
3924 | {
3925 | "duration": 29,
3926 | "start_time": "2022-01-31T13:16:30.668Z"
3927 | },
3928 | {
3929 | "duration": 16,
3930 | "start_time": "2022-01-31T13:16:30.698Z"
3931 | },
3932 | {
3933 | "duration": 11,
3934 | "start_time": "2022-01-31T13:16:30.716Z"
3935 | },
3936 | {
3937 | "duration": 14,
3938 | "start_time": "2022-01-31T13:16:30.729Z"
3939 | },
3940 | {
3941 | "duration": 5,
3942 | "start_time": "2022-01-31T13:16:30.744Z"
3943 | },
3944 | {
3945 | "duration": 15,
3946 | "start_time": "2022-01-31T13:16:30.751Z"
3947 | },
3948 | {
3949 | "duration": 6,
3950 | "start_time": "2022-01-31T13:16:30.772Z"
3951 | },
3952 | {
3953 | "duration": 598,
3954 | "start_time": "2022-02-09T15:43:42.147Z"
3955 | },
3956 | {
3957 | "duration": 152,
3958 | "start_time": "2022-02-09T15:43:42.747Z"
3959 | },
3960 | {
3961 | "duration": 20,
3962 | "start_time": "2022-02-09T15:43:42.902Z"
3963 | },
3964 | {
3965 | "duration": 30,
3966 | "start_time": "2022-02-09T15:43:42.924Z"
3967 | },
3968 | {
3969 | "duration": 5,
3970 | "start_time": "2022-02-09T15:43:42.956Z"
3971 | },
3972 | {
3973 | "duration": 50,
3974 | "start_time": "2022-02-09T15:43:42.963Z"
3975 | },
3976 | {
3977 | "duration": 3,
3978 | "start_time": "2022-02-09T15:43:43.015Z"
3979 | },
3980 | {
3981 | "duration": 35,
3982 | "start_time": "2022-02-09T15:43:43.021Z"
3983 | },
3984 | {
3985 | "duration": 19,
3986 | "start_time": "2022-02-09T15:43:43.059Z"
3987 | },
3988 | {
3989 | "duration": 38,
3990 | "start_time": "2022-02-09T15:43:43.080Z"
3991 | },
3992 | {
3993 | "duration": 65,
3994 | "start_time": "2022-02-09T15:43:43.120Z"
3995 | },
3996 | {
3997 | "duration": 84,
3998 | "start_time": "2022-02-09T15:43:43.187Z"
3999 | },
4000 | {
4001 | "duration": 74,
4002 | "start_time": "2022-02-09T15:43:43.272Z"
4003 | },
4004 | {
4005 | "duration": 12,
4006 | "start_time": "2022-02-09T15:43:43.348Z"
4007 | },
4008 | {
4009 | "duration": 4,
4010 | "start_time": "2022-02-09T15:43:43.363Z"
4011 | },
4012 | {
4013 | "duration": 35,
4014 | "start_time": "2022-02-09T15:43:43.369Z"
4015 | },
4016 | {
4017 | "duration": 26,
4018 | "start_time": "2022-02-09T15:43:43.406Z"
4019 | },
4020 | {
4021 | "duration": 14,
4022 | "start_time": "2022-02-09T15:43:43.434Z"
4023 | },
4024 | {
4025 | "duration": 13,
4026 | "start_time": "2022-02-09T15:43:43.450Z"
4027 | },
4028 | {
4029 | "duration": 4,
4030 | "start_time": "2022-02-09T15:43:43.466Z"
4031 | },
4032 | {
4033 | "duration": 41,
4034 | "start_time": "2022-02-09T15:43:43.472Z"
4035 | },
4036 | {
4037 | "duration": 21,
4038 | "start_time": "2022-02-09T15:43:43.515Z"
4039 | },
4040 | {
4041 | "duration": 18,
4042 | "start_time": "2022-02-09T15:43:43.540Z"
4043 | },
4044 | {
4045 | "duration": 47,
4046 | "start_time": "2022-02-09T15:43:43.561Z"
4047 | },
4048 | {
4049 | "duration": 17,
4050 | "start_time": "2022-02-09T15:43:43.610Z"
4051 | },
4052 | {
4053 | "duration": 17,
4054 | "start_time": "2022-02-09T15:43:43.629Z"
4055 | },
4056 | {
4057 | "duration": 10,
4058 | "start_time": "2022-02-09T15:43:43.647Z"
4059 | },
4060 | {
4061 | "duration": 11,
4062 | "start_time": "2022-02-09T15:43:43.698Z"
4063 | },
4064 | {
4065 | "duration": 10,
4066 | "start_time": "2022-02-09T15:43:43.711Z"
4067 | },
4068 | {
4069 | "duration": 4,
4070 | "start_time": "2022-02-09T15:43:43.723Z"
4071 | },
4072 | {
4073 | "duration": 42,
4074 | "start_time": "2022-02-09T15:43:43.729Z"
4075 | },
4076 | {
4077 | "duration": 30,
4078 | "start_time": "2022-02-09T15:43:43.773Z"
4079 | },
4080 | {
4081 | "duration": 19,
4082 | "start_time": "2022-02-09T15:43:43.804Z"
4083 | },
4084 | {
4085 | "duration": 14,
4086 | "start_time": "2022-02-09T15:43:43.825Z"
4087 | },
4088 | {
4089 | "duration": 10,
4090 | "start_time": "2022-02-09T15:43:43.841Z"
4091 | },
4092 | {
4093 | "duration": 5,
4094 | "start_time": "2022-02-09T15:43:43.854Z"
4095 | },
4096 | {
4097 | "duration": 8,
4098 | "start_time": "2022-02-09T15:43:43.899Z"
4099 | },
4100 | {
4101 | "duration": 4,
4102 | "start_time": "2022-02-09T15:43:43.909Z"
4103 | },
4104 | {
4105 | "duration": 11,
4106 | "start_time": "2022-02-09T15:44:14.239Z"
4107 | },
4108 | {
4109 | "duration": 16,
4110 | "start_time": "2022-02-09T15:46:28.895Z"
4111 | },
4112 | {
4113 | "duration": 325,
4114 | "start_time": "2022-02-09T15:48:34.053Z"
4115 | },
4116 | {
4117 | "duration": 11,
4118 | "start_time": "2022-02-09T15:48:41.152Z"
4119 | },
4120 | {
4121 | "duration": 319,
4122 | "start_time": "2022-02-10T07:16:45.538Z"
4123 | },
4124 | {
4125 | "duration": 172,
4126 | "start_time": "2022-02-10T07:17:00.049Z"
4127 | },
4128 | {
4129 | "duration": 261,
4130 | "start_time": "2022-02-10T07:24:31.511Z"
4131 | },
4132 | {
4133 | "duration": 168,
4134 | "start_time": "2022-02-10T07:24:32.363Z"
4135 | },
4136 | {
4137 | "duration": 403,
4138 | "start_time": "2022-02-10T07:30:50.367Z"
4139 | },
4140 | {
4141 | "duration": 830,
4142 | "start_time": "2022-02-10T07:30:57.862Z"
4143 | },
4144 | {
4145 | "duration": 187,
4146 | "start_time": "2022-02-10T07:30:58.695Z"
4147 | },
4148 | {
4149 | "duration": 38,
4150 | "start_time": "2022-02-10T07:30:58.885Z"
4151 | },
4152 | {
4153 | "duration": 14,
4154 | "start_time": "2022-02-10T07:30:58.927Z"
4155 | },
4156 | {
4157 | "duration": 45,
4158 | "start_time": "2022-02-10T07:30:58.943Z"
4159 | },
4160 | {
4161 | "duration": 14,
4162 | "start_time": "2022-02-10T07:30:58.991Z"
4163 | },
4164 | {
4165 | "duration": 49,
4166 | "start_time": "2022-02-10T07:30:59.008Z"
4167 | },
4168 | {
4169 | "duration": 7,
4170 | "start_time": "2022-02-10T07:30:59.060Z"
4171 | },
4172 | {
4173 | "duration": 34,
4174 | "start_time": "2022-02-10T07:30:59.073Z"
4175 | },
4176 | {
4177 | "duration": 22,
4178 | "start_time": "2022-02-10T07:30:59.123Z"
4179 | },
4180 | {
4181 | "duration": 29,
4182 | "start_time": "2022-02-10T07:30:59.147Z"
4183 | },
4184 | {
4185 | "duration": 108,
4186 | "start_time": "2022-02-10T07:30:59.178Z"
4187 | },
4188 | {
4189 | "duration": 109,
4190 | "start_time": "2022-02-10T07:30:59.289Z"
4191 | },
4192 | {
4193 | "duration": 81,
4194 | "start_time": "2022-02-10T07:30:59.401Z"
4195 | },
4196 | {
4197 | "duration": 14,
4198 | "start_time": "2022-02-10T07:30:59.485Z"
4199 | },
4200 | {
4201 | "duration": 22,
4202 | "start_time": "2022-02-10T07:30:59.502Z"
4203 | },
4204 | {
4205 | "duration": 14,
4206 | "start_time": "2022-02-10T07:30:59.526Z"
4207 | },
4208 | {
4209 | "duration": 16,
4210 | "start_time": "2022-02-10T07:30:59.542Z"
4211 | },
4212 | {
4213 | "duration": 16,
4214 | "start_time": "2022-02-10T07:30:59.561Z"
4215 | },
4216 | {
4217 | "duration": 58,
4218 | "start_time": "2022-02-10T07:30:59.581Z"
4219 | },
4220 | {
4221 | "duration": 23,
4222 | "start_time": "2022-02-10T07:30:59.642Z"
4223 | },
4224 | {
4225 | "duration": 5,
4226 | "start_time": "2022-02-10T07:30:59.667Z"
4227 | },
4228 | {
4229 | "duration": 58,
4230 | "start_time": "2022-02-10T07:30:59.674Z"
4231 | },
4232 | {
4233 | "duration": 20,
4234 | "start_time": "2022-02-10T07:30:59.735Z"
4235 | },
4236 | {
4237 | "duration": 20,
4238 | "start_time": "2022-02-10T07:30:59.759Z"
4239 | },
4240 | {
4241 | "duration": 52,
4242 | "start_time": "2022-02-10T07:30:59.781Z"
4243 | },
4244 | {
4245 | "duration": 21,
4246 | "start_time": "2022-02-10T07:30:59.837Z"
4247 | },
4248 | {
4249 | "duration": 19,
4250 | "start_time": "2022-02-10T07:30:59.861Z"
4251 | },
4252 | {
4253 | "duration": 43,
4254 | "start_time": "2022-02-10T07:30:59.882Z"
4255 | },
4256 | {
4257 | "duration": 16,
4258 | "start_time": "2022-02-10T07:30:59.927Z"
4259 | },
4260 | {
4261 | "duration": 13,
4262 | "start_time": "2022-02-10T07:30:59.945Z"
4263 | },
4264 | {
4265 | "duration": 6,
4266 | "start_time": "2022-02-10T07:30:59.961Z"
4267 | },
4268 | {
4269 | "duration": 64,
4270 | "start_time": "2022-02-10T07:30:59.970Z"
4271 | },
4272 | {
4273 | "duration": 17,
4274 | "start_time": "2022-02-10T07:31:00.036Z"
4275 | },
4276 | {
4277 | "duration": 22,
4278 | "start_time": "2022-02-10T07:31:00.056Z"
4279 | },
4280 | {
4281 | "duration": 49,
4282 | "start_time": "2022-02-10T07:31:00.080Z"
4283 | },
4284 | {
4285 | "duration": 13,
4286 | "start_time": "2022-02-10T07:31:00.132Z"
4287 | },
4288 | {
4289 | "duration": 7,
4290 | "start_time": "2022-02-10T07:31:00.147Z"
4291 | },
4292 | {
4293 | "duration": 12,
4294 | "start_time": "2022-02-10T07:31:00.156Z"
4295 | },
4296 | {
4297 | "duration": 11,
4298 | "start_time": "2022-02-10T07:31:00.170Z"
4299 | },
4300 | {
4301 | "duration": 42,
4302 | "start_time": "2022-02-10T07:31:00.183Z"
4303 | }
4304 | ],
4305 | "colab": {
4306 | "collapsed_sections": [
4307 | "E0vqbgi9ay0H",
4308 | "VUC88oWjTJw2"
4309 | ],
4310 | "name": "yandex_music_project_2021.2.ipynb",
4311 | "provenance": []
4312 | },
4313 | "kernelspec": {
4314 | "display_name": "Python 3 (ipykernel)",
4315 | "language": "python",
4316 | "name": "python3"
4317 | },
4318 | "language_info": {
4319 | "codemirror_mode": {
4320 | "name": "ipython",
4321 | "version": 3
4322 | },
4323 | "file_extension": ".py",
4324 | "mimetype": "text/x-python",
4325 | "name": "python",
4326 | "nbconvert_exporter": "python",
4327 | "pygments_lexer": "ipython3",
4328 | "version": "3.9.7"
4329 | },
4330 | "toc": {
4331 | "base_numbering": 1,
4332 | "nav_menu": {},
4333 | "number_sections": true,
4334 | "sideBar": true,
4335 | "skip_h1_title": true,
4336 | "title_cell": "Table of Contents",
4337 | "title_sidebar": "Contents",
4338 | "toc_cell": false,
4339 | "toc_position": {
4340 | "height": "calc(100% - 180px)",
4341 | "left": "10px",
4342 | "top": "150px",
4343 | "width": "292px"
4344 | },
4345 | "toc_section_display": true,
4346 | "toc_window_display": true
4347 | }
4348 | },
4349 | "nbformat": 4,
4350 | "nbformat_minor": 1
4351 | }
4352 |
--------------------------------------------------------------------------------
/catering_market/README.md:
--------------------------------------------------------------------------------
1 | # Исследование рынка заведений общественного питания Москвы
2 |
3 | ## Задача
4 |
5 | На основании открытых данных, необходимо проанализировать ситуацию на рынке общественного питания г. Москвы. Исследование поможет определиться с видом будущего заведения, количеством посадочных мест и районом расположения.
6 | Основные тезисы исследования необходимо оформить в виде презентации для демонстрации группе инвесторов.
7 |
8 | ## Данные
9 |
10 | Файл, содержащий информацию о заведениях общественного питания Москвы:
11 |
12 | — идентификатор объекта;
13 |
14 | — название объекта общественного питания;
15 |
16 | — сетевой ресторан;
17 |
18 | — тип объекта общественного питания;
19 |
20 | — адрес;
21 |
22 | — количество посадочных мест.
23 |
24 | ## Используемые библиотеки
25 | *pandas, numpy, matplotlib, seaborn, plotly.express*
26 |
--------------------------------------------------------------------------------
/cell_phone_plan/README.md:
--------------------------------------------------------------------------------
1 | # Определение перспективного тарифа для телеком-компании
2 |
3 | ## Данные
4 |
5 | Пять файлов, предоставленных заказчиком:
6 | - users (данные 500 пользователей заказчика: кто они, откуда, каким тарифом пользуются),
7 | - tariffs (данные о тарифных планах заказчика),
8 | - calls (информация о совершенных пользователями звонках в течение года),
9 | - internet (данные о пользовательском трафике за тот же срок),
10 | - messeges (информация об отправленных в течение года SMS .
11 |
12 | ## Задача
13 |
14 | Необходимо провести анализ пользовательского поведения и определить, какой тариф (из двух существующих) прибыльнее с точки зрения компании.
15 | Для ответа на этот вопрос будут проверены две гипотезы:
16 |
17 | * средняя выручка пользователей тарифов «Ультра» и «Смарт» различаются;
18 | * средняя выручка пользователей из Москвы отличается от выручки пользователей из других регионов.
19 |
20 | ## Используемые библиотеки
21 |
22 | *pandas, scipy, numpy, matplotlib, seaborn*
23 |
--------------------------------------------------------------------------------
/diplom.PNG:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ovalentinka/Data_analyst/b9ea66230401fea992c0496972622129f871024c/diplom.PNG
--------------------------------------------------------------------------------
/games/README.md:
--------------------------------------------------------------------------------
1 | # Анализ рынка продаж компьютерных игр
2 |
3 | ## Задача
4 |
5 | На основе данных из открытых источников выявить закономерности, определяющие успешность игр.
6 | В ходе анализа, так же, необходимо проверить две гипотезы:
7 | - средние пользовательские рейтинги платформ Xbox One и PC одинаковые;
8 | - средние пользовательские рейтинги жанров Action (англ. "действие", экшен-игры) и Sports(англ. "спортивные соревнования") разные.
9 |
10 | ## Данные
11 |
12 | Исторические данные о продажах игр, оценки пользователей и экспертов, жанры и платформы за 2016 год.
13 | - название игры;
14 | - игровая платформа;
15 | - год выпуска;
16 | - жанр игры;
17 | - продажи в Северной Америке (млн. проданных копий);
18 | - продажи в Европе (млн. проданных копий);
19 | - продажи в Японии (млн. проданных копий);
20 | - продажи в других странах (млн. проданных копий);
21 | - оценка критиков (максимум 100 баллов);
22 | - оценка пользователей (максимум 10 баллов);
23 | - возрастной рейтинг организации ESRB (англ. Entertainment Spftware Rating Board).
24 |
25 | ## Используемые библиотеки
26 |
27 | *pandas, scipy, numpy, matplotlib, seaborn*
28 |
--------------------------------------------------------------------------------
/graduation_project/README.md:
--------------------------------------------------------------------------------
1 | # Выпускной проект
2 |
3 | На основе всех полученных данных в курсе выполнить буткемп-проект по одной из выбранной областей,
4 | провести
5 |
6 | ## Часть I: [Банки — cегментация пользователей по потреблению продуктов](https://github.com/ovalentinka/Data_analyst/blob/3e4272acf1b22cbf9e49706375ad128ead6b89b8/graduation_project/yandex_ex1_bank_karpova_new.ipynb)
7 |
8 | ### Цель исследования
9 | Анализ и сегментация клиентов регионального банка по количеству потребляемых продуктов:
10 |
11 | - провединие исследовательского анализа данных,
12 | - сегментация пользователей на основе данных о количестве потребляемых продуктов,
13 | - формулировка и проверка статистических гипотез.
14 | - гипотеза различия дохода между теми клиентами, которые пользуются двумя продуктами банка, и теми, которые пользуются одним;
15 | - гипотеза о различии в скоринговых баллах действующих и ушедших клиентов банка.
16 |
17 | По результатам исследования необходимо подготовить:
18 | - презентацию,
19 | - дашборд (диаграмму, отражающая количество клиентов в зависимости от числа используемых продуктов)
20 |
21 | ### Входные данные
22 | Датасет содержит данные о клиентах банка:
23 | - идентификатор пользователя,
24 | - баллы кредитного скоринга,
25 | - город,
26 | - пол,
27 | - возраст,
28 | - количество объектов в собственности,
29 | - баланс на счёте,
30 | - количество продуктов, которыми пользуется клиент,
31 | - есть ли кредитная карта,
32 | - активный клиент,
33 | - заработная плата клиента,
34 | - ушёл или нет.
35 |
36 | ### Используемые библиотеки
37 |
38 | *pandas, numpy, matplotlib, seaborn, scikit learn, scipy*
39 |
40 |
41 | ## Часть II: [A/B-тестирование](https://github.com/ovalentinka/Data_analyst/blob/3e4272acf1b22cbf9e49706375ad128ead6b89b8/graduation_project/yandex_ex2_ab_karpova_new.ipynb)
42 |
43 | ### Цель исследования
44 | Проведение оценки результатов A/B-теста после введения улучшенной программы рекомендаций для региона EU.
45 |
46 | ### Входные данные
47 | - датасет с действиями пользователей,
48 | - вспомогательные датасеты (данные о пользователях, календарь маркетинговых событий и пр.),
49 | - Техническое задание.
50 |
51 | ### Используемые бибилотеки
52 |
53 | *pandas, numpy, matplotlib, seaborn, math, datetime, scipy*
54 |
55 | ## Часть III: [SQL](https://github.com/ovalentinka/Data_analyst/blob/3e4272acf1b22cbf9e49706375ad128ead6b89b8/graduation_project/yandex_ex3_SQL_karpova_new.ipynb)
56 |
57 | Проанализировать базу данных. В ней — информация о книгах, издательствах, авторах, а также пользовательские
58 | обзоры книг.
59 |
--------------------------------------------------------------------------------
/graduation_project/yandex_ex1_bank_prez_ovkarpova.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ovalentinka/Data_analyst/b9ea66230401fea992c0496972622129f871024c/graduation_project/yandex_ex1_bank_prez_ovkarpova.pdf
--------------------------------------------------------------------------------
/gym_churn/README.md:
--------------------------------------------------------------------------------
1 | # Прогнозирование оттока клиентов сети фитнес-центров
2 |
3 | ## Задача
4 |
5 | Провести анализ и подготовить план действий по удержанию клиентов:
6 |
7 | - научиться прогнозировать вероятность оттока (на уровне следующего месяца) для каждого клиента;
8 |
9 | - сформировать типичные портреты клиентов: выделить несколько наиболее ярких групп и охарактеризовать их основные свойства;
10 |
11 | - проанализировать основные признаки, наиболее сильно влияющие на отток;
12 |
13 | Сформулировать основные выводы и разработать рекомендации по повышению качества работы с клиентами:
14 | 1) выделить целевые группы клиентов;
15 | 2) предложить меры по снижению оттока;
16 | 3) определить другие особенности взаимодействия с клиентами.
17 |
18 | ## Данные
19 |
20 | Файл, который содержит данные на месяц до оттока и факт оттока на определённый месяц (файл gym_churn.csv)
21 | — пол;
22 | — проживание или работа в районе, где находится фитнес-центр;
23 | — сотрудник компании-партнёра клуба (сотрудничество с компаниями, чьи сотрудники могут получать скидки на абонемент — в таком случае фитнес-центр хранит информацию о работодателе клиента);
24 | — факт первоначальной записи в рамках акции «приведи друга» (использовал промо-код от знакомого при оплате первого абонемента);
25 | — наличие контактного телефона;
26 | — возраст;
27 | — время с момента первого обращения в фитнес-центр (в месяцах).
28 | — длительность текущего действующего абонемента (месяц, 6 месяцев, год);
29 | — срок до окончания текущего действующего абонемента (в месяцах);
30 | — факт посещения групповых занятий;
31 | — средняя частота посещений в неделю за все время с начала действия абонемента;
32 | — средняя частота посещений в неделю за предыдущий месяц;
33 | — суммарная выручка от других услуг фитнес-центра: кафе, спорттовары, косметический и массажный салон;
34 | — факт оттока в текущем месяце.
35 |
36 | ## Используемые бибилотеки
37 |
38 | *pandas, plotly, scikit learn, scipy, matplotlib*
39 |
--------------------------------------------------------------------------------
/hypothesis_ab/README.md:
--------------------------------------------------------------------------------
1 | # Принятие решений в бизнесе
2 |
3 | ## Задача
4 |
5 | 1. Необходимо приоритизировать гипотезы из списка гипотез, предоставленных отделом Маркетинга;
6 | 2. Провести анализ результатов проведенного А/В-тестирования и аргументировать решение по результатам теста.
7 | Варианты решений:
8 | - остановить тест, зафиксировать победу одной из групп.
9 | - остановить тест, зафиксировать отсутствие различий между группами.
10 | - продолжить тест.
11 |
12 | ## Данные
13 | Файлы, содержащие:
14 | - список гипотез и информация о них,
15 | - информация о заказах пользователей в интернет-магазине,
16 | - информация о посещениях пользователями интернет-магазина.
17 |
18 | ## Используемые библиотеки
19 | *pandas, numpy, matplotlib, seaborn, math, datetime, scipy*
20 |
--------------------------------------------------------------------------------
/loss_analysis/README.md:
--------------------------------------------------------------------------------
1 | # Анализ бизнес-показателей развлекательного приложения Procrastinate Pro+
2 |
3 | ## Задача
4 |
5 | На основе данных, предоставленных компанией, необходимо провести анализ и ответить на вопросы:
6 | - откуда приходят пользователи и какими устройствами они пользуются,
7 | - сколько стоит привлечение пользователей из различных рекламных каналов;
8 | - сколько денег приносит каждый клиент,
9 | - когда расходы на привлечение клиента окупаются,
10 | - какие факторы мешают привлечению клиентов.
11 |
12 | ## Данные
13 |
14 | Данные о пользователях (3 файла), привлечённых с 1 мая по 27 октября 2019 года:
15 |
16 | - лог сервера с данными об их посещениях (файл visits_info_short.csv)
17 | - выгрузка их покупок за этот период (файл orders_info_short.csv)
18 | - рекламные расходы (файл costs_info_short.csv)
19 |
20 | ## Используемые библиотеки
21 |
22 | *pandas, numpy, matplotlib, seaborn, datetime*
23 |
--------------------------------------------------------------------------------
/real_estate_market/README.md:
--------------------------------------------------------------------------------
1 | # Исследование объявлений о продаже квартир
2 |
3 | ## Данные
4 |
5 | Архив объявлений о продаже квартир в Санкт-Петербурге и соседних населённых пунктах за несколько лет:
6 | - расстояние до ближайшего аэропорта в метрах (м)
7 | - число балконов
8 | - высота потолков (м)
9 | - расстояние до центра города (м)
10 | - сколько дней было размещено объявление (от публикации до снятия)
11 | - дата публикации
12 | - этаж
13 | - всего этажей в доме
14 | - апартаменты (булев тип)
15 | - площадь кухни в квадратных метрах (м²) last_price — цена на момент снятия с публикации
16 | - жилая площадь в квадратных метрах (м²)
17 | - название населённого пункта
18 | - свободная планировка (булев тип)
19 | - число парков в радиусе 3 км
20 | - расстояние до ближайшего парка (м)
21 | - число водоёмов в радиусе 3 км
22 | - расстояние до ближайшего водоёма (м)
23 | - число комнат
24 | - квартира-студия (булев тип)
25 | - площадь квартиры в квадратных метрах (м²)
26 | - число фотографий квартиры в объявлении
27 |
28 | ## Задача
29 |
30 | Используя данные сервиса Яндекс.Недвижимость необходимо выявить основные параметры и факторы, влияющие на рыночную цену квартиры.
31 |
32 | ### Используемые библиотеки
33 |
34 | *pandas, numpy, matplotlib, seaborn*
35 |
--------------------------------------------------------------------------------
/sql/1_sql_tasks.sql:
--------------------------------------------------------------------------------
1 | ---
2 | SELECT COUNT(status)
3 | FROM company
4 | GROUP BY status
5 | HAVING status LIKE 'closed';
6 |
7 | ---
8 | SELECT funding_total
9 | FROM company
10 | WHERE category_code LIKE 'news'
11 | AND country_code LIKE 'USA'
12 | ORDER BY funding_total DESC;
13 |
14 | ---
15 | SELECT SUM(price_amount)
16 | FROM acquisition
17 | WHERE term_code LIKE 'cash'
18 | AND EXTRACT(YEAR from acquired_at) BETWEEN 2011 AND 2013
19 | GROUP BY term_code;
20 |
21 | ---
22 | SELECT first_name,
23 | last_name,
24 | twitter_username
25 | FROM people
26 | WHERE twitter_username LIKE 'Silver%';
27 |
28 | ---
29 | SELECT *
30 | FROM people
31 | WHERE twitter_username LIKE '%money%'
32 | AND last_name LIKE 'K%';
33 |
34 | ---
35 | SELECT country_code,
36 | SUM(funding_total)
37 | FROM company
38 | GROUP BY country_code
39 | ORDER BY SUM(funding_total) DESC;
40 |
41 | ---
42 | SELECT funded_at,
43 | MIN(raised_amount),
44 | MAX(raised_amount)
45 | FROM funding_round
46 | GROUP BY funded_at
47 | HAVING MIN(raised_amount) NOT IN (0, MAX(raised_amount));
48 |
49 | ---
50 | SELECT *,
51 | CASE
52 | WHEN invested_companies >= 100 THEN 'high_activity'
53 | WHEN invested_companies BETWEEN 20 AND 99 THEN 'middle_activity'
54 | ELSE 'low_activity'
55 | END
56 | FROM fund;
57 |
58 | ---
59 | SELECT CASE
60 | WHEN invested_companies>=100 THEN 'high_activity'
61 | WHEN invested_companies>=20 THEN 'middle_activity'
62 | ELSE 'low_activity'
63 | END AS activity,
64 | ROUND(AVG(investment_rounds))
65 | FROM fund
66 | GROUP BY activity
67 | ORDER BY ROUND(AVG(investment_rounds));
68 |
69 | ---
70 | SELECT country_code,
71 | MIN(invested_companies),
72 | MAX(invested_companies),
73 | AVG(invested_companies)
74 | FROM (SELECT *
75 | FROM fund
76 | WHERE EXTRACT(YEAR FROM founded_at) BETWEEN 2010 AND 2012) AS f
77 | GROUP BY country_code
78 | HAVING MIN(invested_companies) > 0
79 | ORDER BY AVG(invested_companies) DESC
80 | LIMIT 10;
81 |
82 | ---
83 | SELECT p.first_name,
84 | p.last_name,
85 | e.instituition
86 | FROM people AS p
87 | LEFT JOIN education AS e ON p.id = e.person_id;
88 |
89 | ---
90 | SELECT c.name,
91 | COUNT(DISTINCT tab2.instituition)
92 | FROM company AS c
93 | LEFT JOIN
94 | (SELECT tab1.instituition,
95 | p.company_id
96 | FROM
97 | (SELECT person_id,
98 | instituition
99 | FROM education
100 | WHERE instituition IS NOT NULL
101 | ) AS tab1
102 | INNER JOIN people AS p ON p.id = tab1.person_id
103 | ) AS tab2 ON tab2.company_id = c.id
104 | GROUP BY c.name
105 | ORDER BY COUNT(DISTINCT tab2.instituition) DESC
106 | LIMIT 5;
107 |
108 | ---
109 | SELECT DISTINCT name
110 | FROM company
111 | WHERE status LIKE 'closed'
112 | AND id IN (SELECT company_id
113 | FROM funding_round
114 | WHERE is_first_round = 1
115 | AND is_last_round = 1);
116 |
117 | ---
118 | SELECT DISTINCT p.id
119 | FROM company AS c
120 | INNER JOIN people AS p ON c.id = p.company_id
121 | WHERE c.status LIKE 'closed'
122 | AND c.id IN (SELECT company_id
123 | FROM funding_round
124 | WHERE is_first_round = 1
125 | AND is_last_round = 1);
126 |
127 | ---
128 | SELECT DISTINCT p.id,
129 | e.instituition
130 | FROM company AS c
131 | INNER JOIN people AS p ON c.id = p.company_id
132 | LEFT JOIN education AS e ON p.id = e.person_id
133 | WHERE c.status LIKE 'closed'
134 | AND c.id IN (SELECT company_id
135 | FROM funding_round
136 | WHERE is_first_round = 1
137 | AND is_last_round = 1)
138 | AND e.instituition IS NOT NULL;
139 |
140 |
141 | ---
142 | SELECT DISTINCT p.id,
143 | COUNT(e.instituition)
144 | FROM company AS c
145 | INNER JOIN people AS p ON c.id = p.company_id
146 | LEFT JOIN education AS e ON p.id = e.person_id
147 | WHERE c.status LIKE 'closed'
148 | AND c.id IN (SELECT company_id
149 | FROM funding_round
150 | WHERE is_first_round = 1
151 | AND is_last_round = 1)
152 | AND e.instituition IS NOT NULL
153 | GROUP BY p.id;
154 |
155 | ---
156 | SELECT AVG(tab1.count_in)
157 | FROM (SELECT DISTINCT p.id,
158 | COUNT(e.instituition) AS count_in
159 | FROM company AS c
160 | INNER JOIN people AS p ON c.id = p.company_id
161 | LEFT JOIN education AS e ON p.id = e.person_id
162 | WHERE c.status LIKE 'closed'
163 | AND c.id IN (SELECT company_id
164 | FROM funding_round
165 | WHERE is_first_round = 1
166 | AND is_last_round = 1)
167 | AND e.instituition IS NOT NULL
168 | GROUP BY p.id) AS tab1;
169 |
170 | ---
171 | SELECT AVG(tab1.count_in)
172 | FROM (SELECT DISTINCT p.id,
173 | COUNT(e.instituition) AS count_in
174 | FROM company AS c
175 | INNER JOIN people AS p ON c.id = p.company_id
176 | LEFT JOIN education AS e ON p.id = e.person_id
177 | WHERE c.name LIKE 'Facebook'
178 | AND e.instituition IS NOT NULL
179 | GROUP BY p.id
180 | ) AS tab1;
181 |
182 | ---
183 | SELECT f.name AS name_of_fund,
184 | C.name AS name_of_company,
185 | fr.raised_amount AS amount
186 | FROM investment AS i
187 | JOIN company AS c ON i.company_id=c.id
188 | JOIN fund AS f ON i.fund_id=f.id
189 | JOIN funding_round AS fr ON i.funding_round_id = fr.id
190 | WHERE EXTRACT(YEAR FROM fr.funded_at) BETWEEN 2012 AND 2013
191 | AND c.milestones > 6;
192 |
193 | ---
194 | SELECT company.name AS acquiring_company,
195 | tab2.price_amount,
196 | tab2.acquired_company,
197 | tab2.funding_total,
198 | ROUND(tab2.price_amount / tab2.funding_total)
199 | FROM
200 | (
201 | SELECT c.name AS acquired_company,
202 | c.funding_total,
203 | tab1.acquiring_company_id,
204 | tab1.price_amount
205 | FROM company AS c
206 | RIGHT JOIN (
207 | SELECT acquiring_company_id,
208 | acquired_company_id,
209 | price_amount
210 | FROM acquisition
211 | WHERE price_amount > 0
212 | ) AS tab1 ON c.id = tab1.acquired_company_id
213 | ) AS tab2 LEFT JOIN company ON company.id = tab2.acquiring_company_id
214 | WHERE tab2.funding_total > 0
215 | ORDER BY tab2.price_amount DESC, tab2.acquired_company
216 | LIMIT 10;
217 |
218 | ---
219 | SELECT c.name,
220 | tab1.month
221 | FROM company AS c
222 | RIGHT JOIN (
223 | SELECT company_id,
224 | EXTRACT(MONTH FROM funded_at) AS month
225 | FROM funding_round
226 | WHERE EXTRACT(YEAR FROM funded_at) BETWEEN 2010 AND 2013
227 | ) AS tab1 ON c.id = tab1.company_id
228 | WHERE c.category_code LIKE 'social';
229 |
230 | ---
231 | WITH
232 | -- выбираем месяц инвестиционных раундов в 2010-2013 гг
233 | tab1 AS (SELECT EXTRACT(MONTH FROM funded_at) AS month,
234 | id AS funding_round_id
235 | FROM funding_round
236 | WHERE EXTRACT(YEAR FROM funded_at) BETWEEN 2010 AND 2013
237 | ),
238 |
239 | -- считаем кол-во купленных и общую сумму по сделкам за 2010-2013 гг в разрезе месяца
240 | tab2 AS (SELECT EXTRACT(MONTH FROM acquired_at) AS month,
241 | COUNT(acquired_company_id) AS count_acquired,
242 | SUM(price_amount) AS total_amount
243 | FROM acquisition
244 | WHERE EXTRACT(YEAR FROM acquired_at) BETWEEN 2010 AND 2013
245 | GROUP BY EXTRACT(MONTH FROM acquired_at)
246 | ),
247 |
248 | -- ищем фонды из США
249 | tab3 AS (SELECT i.funding_round_id,
250 | f.name
251 | FROM investment AS i
252 | JOIN fund AS f ON f.id = i.fund_id
253 | WHERE fund_id IN (SELECT id
254 | FROM fund
255 | WHERE country_code LIKE 'USA')
256 | ),
257 |
258 | tab4 AS (SELECT month,
259 | COUNT(DISTINCT name) AS count_USA
260 | FROM tab1
261 | LEFT JOIN tab3 ON tab1.funding_round_id = tab3.funding_round_id
262 | GROUP BY month)
263 |
264 | SELECT tab4.month,
265 | tab4.count_USA,
266 | tab2.count_acquired,
267 | tab2.total_amount
268 | FROM tab4
269 | LEFT JOIN tab2 ON tab4.month = tab2.month;
270 |
271 |
272 | ---
273 | WITH
274 |
275 | total_11 AS (SELECT AVG(funding_total) AS total_2011,
276 | country_code
277 | FROM company
278 | GROUP BY country_code,
279 | EXTRACT(YEAR FROM founded_at)
280 | HAVING EXTRACT(YEAR FROM founded_at) = 2011),
281 |
282 | total_12 AS (SELECT AVG(funding_total) AS total_2012,
283 | country_code
284 | FROM company
285 | GROUP BY country_code,
286 | EXTRACT(YEAR FROM founded_at)
287 | HAVING EXTRACT(YEAR FROM founded_at) = 2012),
288 |
289 | total_13 AS (SELECT AVG(funding_total) AS total_2013,
290 | country_code
291 | FROM company
292 | GROUP BY country_code,
293 | EXTRACT(YEAR FROM founded_at)
294 | HAVING EXTRACT(YEAR FROM founded_at) = 2013)
295 |
296 | SELECT total_11.country_code,
297 | total_11.total_2011,
298 | total_12.total_2012,
299 | total_13.total_2013
300 | FROM total_11
301 | INNER JOIN total_12 ON total_11.country_code = total_12.country_code
302 | INNER JOIN total_13 ON total_11.country_code = total_13.country_code
303 | ORDER BY total_11.total_2011 DESC;
304 |
--------------------------------------------------------------------------------
/sql/README.md:
--------------------------------------------------------------------------------
1 | ## База данных
2 | 
3 |
4 | * acquisition (cодержит информацию о покупках одних компаний другими);
5 | * company (cодержит информацию о компаниях-стартапах);
6 | * education (хранит информацию об уровне образования сотрудников компаний);.
7 | * fund (хранит информацию о венчурных фондах);
8 | * funding_round (содержит информацию о раундах инвестиций);
9 | * investment (cодержит информацию об инвестициях венчурных фондов в компании-стартапы);
10 | * people (cодержит информацию о сотрудниках компаний-стартапов).
11 |
--------------------------------------------------------------------------------
/sql_advanced/2_sql_tasks.sql:
--------------------------------------------------------------------------------
1 | ---
2 | SELECT COUNT(id)
3 | FROM stackoverflow.posts
4 | WHERE post_type_id=1
5 | AND (score>300 OR favorites_count >= 100)
6 | GROUP BY post_type_id;
7 |
8 | ---
9 | SELECT ROUND(AVG(t.count),0)
10 | FROM (
11 | SELECT COUNT(id),
12 | creation_date::date
13 | FROM stackoverflow.posts
14 | WHERE post_type_id = 1
15 | GROUP BY creation_date::date
16 | HAVING creation_date::date BETWEEN '2008-11-01' AND '2008-11-18') AS t;
17 |
18 | ---
19 | SELECT COUNT(DISTINCT u.id)
20 | FROM stackoverflow.badges AS b
21 | JOIN stackoverflow.users AS u ON b.user_id=u.id
22 | WHERE b.creation_date::date = u.creation_date::date;
23 |
24 | ---
25 | SELECT COUNT(t.id)
26 | FROM (
27 | SELECT p.id
28 | FROM stackoverflow.posts AS p
29 | JOIN stackoverflow.votes AS v ON p.id = v.post_id
30 | JOIN stackoverflow.users AS u ON p.user_id = u.id
31 | WHERE u.display_name LIKE 'Joel Coehoorn'
32 | GROUP BY p.id
33 | HAVING COUNT(v.id)>=1) as t;
34 |
35 | ---
36 | SELECT *,
37 | ROW_NUMBER() OVER(ORDER BY id DESC) AS rank
38 | FROM stackoverflow.vote_types
39 | ORDER BY id;
40 |
41 | ---
42 | SELECT *
43 | FROM (
44 | SELECT v.user_id,
45 | COUNT(vt.id) AS cnt
46 | FROM stackoverflow.votes AS v
47 | JOIN stackoverflow.vote_types as vt ON vt.id = v.vote_type_id
48 | WHERE vt.name LIKE 'Close'
49 | GROUP BY v.user_id
50 | ORDER BY cnt DESC LIMIT 10
51 | ) AS t
52 | ORDER BY t.cnt DESC, t.user_id DESC;
53 |
54 | ---
55 | SELECT *,
56 | DENSE_RANK() OVER (ORDER BY t.cnt DESC) AS n
57 | FROM (SELECT COUNT(id) AS cnt,
58 | user_id
59 | FROM stackoverflow.badges
60 | WHERE creation_date::date BETWEEN '2008-11-15' AND '2008-12-15'
61 | GROUP BY 2
62 | ORDER BY cnt DESC, user_id LIMIT 10) as t;
63 |
64 | ---
65 | WITH t AS (
66 | SELECT ROUND(AVG(score)) AS avg_score,
67 | user_id
68 | FROM stackoverflow.posts
69 | WHERE title IS NOT NULL
70 | AND score <> 0
71 | GROUP BY user_id
72 | )
73 |
74 | SELECT p.title,
75 | t.user_id,
76 | p.score,
77 | t.avg_score
78 | FROM t
79 | JOIN stackoverflow.posts AS p ON t.user_id=p.user_id
80 | WHERE p.title IS NOT NULL
81 | AND p.score <> 0;
82 |
83 | ---
84 | SELECT title
85 | FROM stackoverflow.posts
86 | WHERE user_id IN (
87 | SELECT user_id
88 | FROM stackoverflow.badges
89 | GROUP BY user_id
90 | HAVING COUNT(id) >1000
91 | )
92 | AND title IS NOT NULL;
93 |
94 | ---
95 | SELECT id,
96 | views,
97 | CASE
98 | WHEN views>=350 THEN 1
99 | WHEN views<100 THEN 3
100 | ELSE 2
101 | END AS group
102 | FROM stackoverflow.users
103 | WHERE location LIKE '%United States%'
104 | AND views > 0;
105 |
106 | ---
107 | WITH tab AS
108 | (SELECT t.id,
109 | t.views,
110 | t.group,
111 | MAX(t.views) OVER (PARTITION BY t.group) AS max
112 | FROM (SELECT id,
113 | views,
114 | CASE
115 | WHEN views>=350 THEN 1
116 | WHEN views<100 THEN 3
117 | ELSE 2
118 | END AS group
119 | FROM stackoverflow.users
120 | WHERE location LIKE '%United States%'
121 | AND views > 0
122 | ) as t
123 | )
124 |
125 | SELECT tab.id,
126 | tab.views,
127 | tab.group
128 | FROM tab
129 | WHERE tab.views = tab.max
130 | ORDER BY tab.views DESC, tab.id;
131 |
132 | ---
133 | SELECT *,
134 | SUM(t.cnt_id) OVER (ORDER BY t.days) as nn
135 | FROM (
136 | SELECT EXTRACT(DAY FROM creation_date::date) AS days,
137 | COUNT(id) AS cnt_id
138 | FROM stackoverflow.users
139 | WHERE creation_date::date BETWEEN '2008-11-01' AND '2008-11-30'
140 | GROUP BY EXTRACT(DAY FROM creation_date::date)
141 | ) as t;
142 | ---
143 | WITH p AS
144 | (SELECT DISTINCT user_id,
145 | MIN(creation_date) OVER (PARTITION BY user_id) AS min_dt
146 | FROM stackoverflow.posts
147 | )
148 |
149 | SELECT p.user_id,
150 | (p.min_dt - u.creation_date) AS diff
151 | FROM stackoverflow.users AS u
152 | JOIN p ON u.id = p.user_id;
153 |
154 | ---
155 | SELECT SUM(views_count),
156 | DATE_TRUNC('month', creation_date)::date AS mnth
157 | FROM stackoverflow.posts
158 | GROUP BY DATE_TRUNC('month', creation_date)::date
159 | ORDER BY SUM(views_count) DESC;
160 |
161 | ---
162 | SELECT u.display_name,
163 | COUNT(DISTINCT p.user_id)
164 | FROM stackoverflow.posts AS p
165 | JOIN stackoverflow.users AS u ON p.user_id = u.id
166 | JOIN stackoverflow.post_types AS pt ON pt.id = p.post_type_id
167 | WHERE p.creation_date::date BETWEEN u.creation_date::date AND (u.creation_date::date + INTERVAL '1 month')
168 | AND pt.type LIKE '%Answer%'
169 | GROUP BY u.display_name
170 | HAVING COUNT(p.id) > 100
171 | ORDER BY u.display_name;
172 |
173 | ---
174 | WITH t AS (
175 | SELECT u.id
176 | FROM stackoverflow.posts AS p
177 | JOIN stackoverflow.users AS u ON p.user_id = u.id
178 | WHERE DATE_TRUNC('month', u.creation_date)::date = '2008-09-01'
179 | AND DATE_TRUNC('month', p.creation_date)::date = '2008-12-01'
180 | GROUP BY u.id
181 | HAVING COUNT(p.id)>0
182 | )
183 |
184 | SELECT COUNT(p.id),
185 | DATE_TRUNC('month', p.creation_date)::date
186 | FROM stackoverflow.posts AS p
187 | WHERE p.user_id IN (SELECT * FROM t)
188 | AND DATE_TRUNC('year', p.creation_date)::date = '2008-01-01'
189 | GROUP BY DATE_TRUNC('month', p.creation_date)::date
190 | ORDER BY DATE_TRUNC('month', p.creation_date)::date DESC;
191 |
192 | ---
193 | SELECT user_id,
194 | creation_date,
195 | views_count,
196 | SUM(views_count) OVER (PARTITION BY user_id ORDER BY creation_date)
197 | FROM stackoverflow.posts;
198 |
199 | ---
200 | SELECT ROUND(AVG(t.cnt))
201 | FROM (
202 | SELECT user_id,
203 | COUNT(DISTINCT creation_date::date) AS cnt
204 | FROM stackoverflow.posts
205 | WHERE creation_date::date BETWEEN '2008-12-01' AND '2008-12-07'
206 | GROUP BY user_id
207 | ) AS t
208 |
209 | ---
210 | WITH t AS (
211 | SELECT EXTRACT(MONTH from creation_date::date) AS month,
212 | COUNT(DISTINCT id)
213 | FROM stackoverflow.posts
214 | WHERE creation_date::date BETWEEN '2008-09-01' AND '2008-12-31'
215 | GROUP BY month
216 | )
217 |
218 | SELECT *,
219 | ROUND(((count::numeric / LAG(count) OVER (ORDER BY month)) - 1) * 100,2) AS user_growth
220 | FROM t;
221 |
222 | ---
223 | WITH t AS (
224 | SELECT user_id,
225 | COUNT(DISTINCT id) AS cnt
226 | FROM stackoverflow.posts
227 | GROUP BY user_id
228 | ORDER BY cnt DESC
229 | LIMIT 1),
230 |
231 | t1 AS (
232 | SELECT p.user_id,
233 | p.creation_date,
234 | extract('week' from p.creation_date) AS week_number
235 | FROM stackoverflow.posts AS p
236 | JOIN t ON t.user_id = p.user_id
237 | WHERE DATE_TRUNC('month', p.creation_date)::date = '2008-10-01'
238 | )
239 |
240 | SELECT DISTINCT week_number::numeric,
241 | MAX(creation_date) OVER (PARTITION BY week_number)
242 | FROM t1
243 | ORDER BY week_number;
244 |
--------------------------------------------------------------------------------
/sql_advanced/README.md:
--------------------------------------------------------------------------------
1 | # База данных
2 | 
3 |
4 | - badges (хранит информацию о значках, которые присуждаются за разные достижения),
5 | - post_types (содержит информацию о типе постов),
6 | - posts (содержит информацию о постах),
7 | - users (содержит информацию о пользователях),
8 | - vote_types (содержит информацию о метках, которые пользователи ставят посту),
9 | - votes (cодержит информацию о голосах за посты).
10 |
11 |
--------------------------------------------------------------------------------
/sql_border2880_1628581406.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ovalentinka/Data_analyst/b9ea66230401fea992c0496972622129f871024c/sql_border2880_1628581406.png
--------------------------------------------------------------------------------
/sql_border2880_1628581407.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ovalentinka/Data_analyst/b9ea66230401fea992c0496972622129f871024c/sql_border2880_1628581407.png
--------------------------------------------------------------------------------
/user_behavior/README.md:
--------------------------------------------------------------------------------
1 |
2 | # Анализ поведения пользователей мобильного приложения
3 |
4 | ## Задача
5 | Необходимо проанализировать поведение покупателей на основании логов пользователей и результатов А/А/В - эксперимента (изменение шрифта во всем приложении).
6 |
7 | ## Данные
8 |
9 | Логи пользователей мабильного приложения (файл logs_exp.csv)
10 | - название события;
11 | - уникальный идентификатор пользователя;
12 | - время события;
13 | - номер эксперимента: 246 и 247 — контрольные группы, а 248 — экспериментальная.
14 |
15 | ## Используемые библиотеки
16 | *pandas, numpy, matplotlib, seaborn, scipy, plotly*
17 |
--------------------------------------------------------------------------------