├── 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 | ![-](https://github.com/ovalentinka/Data_analyst/blob/be6663a961ed1bd26a89ce2832cc5e280c711f56/diplom.PNG) 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 | " \n", 124 | " \n", 125 | " \n", 126 | " \n", 127 | " \n", 128 | " \n", 129 | " \n", 130 | " \n", 131 | " \n", 132 | " \n", 133 | " \n", 134 | " \n", 135 | " \n", 136 | " \n", 137 | " \n", 138 | " \n", 139 | " \n", 140 | " \n", 141 | " \n", 142 | " \n", 143 | " \n", 144 | " \n", 145 | " \n", 146 | " \n", 147 | " \n", 148 | " \n", 149 | " \n", 150 | " \n", 151 | " \n", 152 | " \n", 153 | " \n", 154 | " \n", 155 | " \n", 156 | " \n", 157 | " \n", 158 | " \n", 159 | " \n", 160 | " \n", 161 | " \n", 162 | " \n", 163 | " \n", 164 | " \n", 165 | " \n", 166 | " \n", 167 | " \n", 168 | " \n", 169 | " \n", 170 | " \n", 171 | " \n", 172 | " \n", 173 | " \n", 174 | " \n", 175 | " \n", 176 | " \n", 177 | " \n", 178 | " \n", 179 | " \n", 180 | " \n", 181 | " \n", 182 | " \n", 183 | " \n", 184 | " \n", 185 | " \n", 186 | " \n", 187 | " \n", 188 | " \n", 189 | " \n", 190 | " \n", 191 | " \n", 192 | " \n", 193 | " \n", 194 | " \n", 195 | " \n", 196 | " \n", 197 | " \n", 198 | " \n", 199 | " \n", 200 | " \n", 201 | " \n", 202 | " \n", 203 | " \n", 204 | " \n", 205 | " \n", 206 | " \n", 207 | " \n", 208 | " \n", 209 | " \n", 210 | " \n", 211 | " \n", 212 | " \n", 213 | " \n", 214 | " \n", 215 | " \n", 216 | " \n", 217 | " \n", 218 | " \n", 219 | " \n", 220 | " \n", 221 | " \n", 222 | " \n", 223 | " \n", 224 | " \n", 225 | " \n", 226 | " \n", 227 | " \n", 228 | " \n", 229 | " \n", 230 | " \n", 231 | " \n", 232 | " \n", 233 | " \n", 234 | "
userIDTrackartistgenreCitytimeDay
0FFB692ECKamigata To BootsThe Mass MissilerockSaint-Petersburg20:28:33Wednesday
155204538Delayed Because of AccidentAndreas RönnbergrockMoscow14:07:09Friday
220EC38Funiculì funiculàMario LanzapopSaint-Petersburg20:58:07Wednesday
3A3DD03C9Dragons in the SunsetFire + IcefolkSaint-Petersburg08:37:09Monday
4E2DC1FAESoul PeopleSpace EchodanceMoscow08:34:34Monday
5842029A1ПреданнаяIMPERVTORrusrapSaint-Petersburg13:09:41Friday
64CB90AA5TrueRoman MesserdanceMoscow13:00:07Wednesday
7F03E1C1FFeeling This WayPolina GriffithdanceMoscow20:47:49Wednesday
88FA1D3BEИ вновь продолжается бойNaNruspopMoscow09:17:40Friday
9E772D5C0PessimistNaNdanceSaint-Petersburg21:20:49Wednesday
\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 | " \n", 1426 | " \n", 1427 | " \n", 1428 | " \n", 1429 | " \n", 1430 | " \n", 1431 | " \n", 1432 | " \n", 1433 | " \n", 1434 | " \n", 1435 | " \n", 1436 | " \n", 1437 | " \n", 1438 | " \n", 1439 | " \n", 1440 | " \n", 1441 | " \n", 1442 | "
user_id
city
Moscow42741
Saint-Petersburg18512
\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 | " \n", 1504 | " \n", 1505 | " \n", 1506 | " \n", 1507 | " \n", 1508 | " \n", 1509 | " \n", 1510 | " \n", 1511 | " \n", 1512 | " \n", 1513 | " \n", 1514 | " \n", 1515 | " \n", 1516 | " \n", 1517 | " \n", 1518 | " \n", 1519 | " \n", 1520 | " \n", 1521 | " \n", 1522 | " \n", 1523 | " \n", 1524 | "
user_id
day
Friday21840
Monday21354
Wednesday18059
\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 | " \n", 1790 | " \n", 1791 | " \n", 1792 | " \n", 1793 | " \n", 1794 | " \n", 1795 | " \n", 1796 | " \n", 1797 | " \n", 1798 | " \n", 1799 | " \n", 1800 | " \n", 1801 | " \n", 1802 | " \n", 1803 | " \n", 1804 | " \n", 1805 | " \n", 1806 | " \n", 1807 | " \n", 1808 | " \n", 1809 | " \n", 1810 | " \n", 1811 | "
citymondaywednesdayfriday
0Moscow157401105615945
1Saint-Petersburg561470035895
\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 | " \n", 2210 | " \n", 2211 | " \n", 2212 | " \n", 2213 | " \n", 2214 | " \n", 2215 | " \n", 2216 | " \n", 2217 | " \n", 2218 | " \n", 2219 | " \n", 2220 | " \n", 2221 | " \n", 2222 | " \n", 2223 | " \n", 2224 | " \n", 2225 | " \n", 2226 | " \n", 2227 | " \n", 2228 | " \n", 2229 | " \n", 2230 | " \n", 2231 | " \n", 2232 | " \n", 2233 | " \n", 2234 | " \n", 2235 | " \n", 2236 | " \n", 2237 | " \n", 2238 | " \n", 2239 | " \n", 2240 | " \n", 2241 | " \n", 2242 | " \n", 2243 | " \n", 2244 | " \n", 2245 | " \n", 2246 | " \n", 2247 | " \n", 2248 | " \n", 2249 | " \n", 2250 | " \n", 2251 | " \n", 2252 | " \n", 2253 | " \n", 2254 | " \n", 2255 | " \n", 2256 | " \n", 2257 | " \n", 2258 | "
genre
genre
pop5892
dance4435
rock3965
electronic3786
hiphop2096
classical1616
world1432
alternative1379
ruspop1372
rusrap1161
\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 | " \n", 2349 | " \n", 2350 | " \n", 2351 | " \n", 2352 | " \n", 2353 | " \n", 2354 | " \n", 2355 | " \n", 2356 | " \n", 2357 | " \n", 2358 | " \n", 2359 | " \n", 2360 | " \n", 2361 | " \n", 2362 | " \n", 2363 | " \n", 2364 | " \n", 2365 | " \n", 2366 | " \n", 2367 | " \n", 2368 | " \n", 2369 | " \n", 2370 | " \n", 2371 | " \n", 2372 | " \n", 2373 | " \n", 2374 | " \n", 2375 | " \n", 2376 | " \n", 2377 | " \n", 2378 | " \n", 2379 | " \n", 2380 | " \n", 2381 | " \n", 2382 | " \n", 2383 | " \n", 2384 | " \n", 2385 | " \n", 2386 | " \n", 2387 | " \n", 2388 | " \n", 2389 | " \n", 2390 | " \n", 2391 | " \n", 2392 | " \n", 2393 | " \n", 2394 | " \n", 2395 | " \n", 2396 | " \n", 2397 | "
genre
genre
pop5892
dance4435
rock3965
electronic3786
hiphop2096
classical1616
world1432
alternative1379
ruspop1372
rusrap1161
\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 | ![bd](https://github.com/ovalentinka/Data_analyst/blob/02637d04843ceffe28d0538b4c287128a376f325/sql_border2880_1628581406.png) 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 | ![db](https://github.com/ovalentinka/Data_analyst/blob/ae55496bf70dfb61ab269f693ec4c6e9e6759aa0/sql_border2880_1628581407.png) 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 | --------------------------------------------------------------------------------