├── .gitignore ├── README.md └── big_cities_music ├── README.md └── music_project.ipynb /.gitignore: -------------------------------------------------------------------------------- 1 | .idea/* 2 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Пример репозитория для выпускников профессий "Аналитик данных" и "Специалист по Data Science" 2 | 3 | Этот репозиторий может служить примером того, как нужно оформлять свои проекты в резюме. 4 | 5 | ## Пример описания проектов в README.md 6 | 7 | Данные проекты были выполнены в ходе обучения в Яндекс.Практикуме, профессии "Аналитик данных" / "Специалист по Data Science". 8 | 9 | | Название проекта | Описание | Используемые библиотеки | 10 | | :---------------------- | :---------------------- | :---------------------- | 11 | | [Музыка больших городов](big_cities_music) | Сравнение предпочтений пользователей Яндекс.Музыки из Москвы и Санкт-Петербурга в зависимости от времени (утро и вечер) и дня недели (понедельник, среда, пятница)| *pandas* | -------------------------------------------------------------------------------- /big_cities_music/README.md: -------------------------------------------------------------------------------- 1 | # Пример описания проекта в README.md - Музыка больших городов 2 | 3 | 4 | ## Данные 5 | 6 | В наличии были следующие данные о прослушиваниях треков в сервисе Яндекс.Музыка: 7 | - Название трека 8 | - Исполнитель 9 | - Жанр 10 | - Город 11 | - День прослушивания 12 | - Время прослушивания 13 | 14 | ## Задача 15 | 16 | Провести сравнение музыкальных предпочтений у пользователей Яндекс.Музыки, проживающих в Москве и Санкт-Петербурге. Сравнить прослушивания в понедельник, среду и пятницу по городам, а также сравнить жанры, которые слушают пользователи утром в понедельник и вечером в пятницу в Москве и Санкт-Петербурге. 17 | 18 | ## Используемые библиотеки 19 | *pandas* 20 | -------------------------------------------------------------------------------- /big_cities_music/music_project.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "nbformat_minor": 1, 3 | "nbformat": 4, 4 | "cells": [ 5 | { 6 | "source": [ 7 | "# Этап 1. Получение данных" 8 | ], 9 | "cell_type": "markdown", 10 | "metadata": { 11 | "colab_type": "text", 12 | "id": "5UYxO1GdF6Wy", 13 | "deletable": false, 14 | "tags": [ 15 | "f6c88c58-a82b-4f28-8bd6-fd55c0017917" 16 | ] 17 | } 18 | }, 19 | { 20 | "source": [ 21 | "Изучим данные, предоставленные сервисом для проекта." 22 | ], 23 | "cell_type": "markdown", 24 | "metadata": { 25 | "colab_type": "text", 26 | "id": "iI4ITclJaFWh", 27 | "deletable": false 28 | } 29 | }, 30 | { 31 | "source": [ 32 | "## Импорт библиотек" 33 | ], 34 | "cell_type": "markdown", 35 | "metadata": { 36 | "colab_type": "text", 37 | "id": "0skiEFxDZ0Tr", 38 | "deletable": false 39 | } 40 | }, 41 | { 42 | "source": [ 43 | "# <импорт библиотеки pandas>" 44 | ], 45 | "cell_type": "code", 46 | "metadata": { 47 | "colab_type": "code", 48 | "id": "HirRov5vZ3MT", 49 | "colab": {}, 50 | "deletable": false 51 | }, 52 | "execution_count": 0, 53 | "outputs": [] 54 | }, 55 | { 56 | "source": [ 57 | "Прочитаем файл *music_project.csv* и сохраним его в переменной *df*. " 58 | ], 59 | "cell_type": "markdown", 60 | "metadata": { 61 | "colab_type": "text", 62 | "id": "Tr8dl3PWGFIk", 63 | "deletable": false 64 | } 65 | }, 66 | { 67 | "source": [ 68 | "# <чтение файла с данными с сохранением в df>" 69 | ], 70 | "cell_type": "code", 71 | "metadata": { 72 | "colab_type": "code", 73 | "id": "NB6j931yS4hy", 74 | "colab": {}, 75 | "deletable": false 76 | }, 77 | "execution_count": 0, 78 | "outputs": [] 79 | }, 80 | { 81 | "source": [ 82 | "Получение первых 10 строк таблицы." 83 | ], 84 | "cell_type": "markdown", 85 | "metadata": { 86 | "colab_type": "text", 87 | "id": "y2usmNMlDLbY", 88 | "deletable": false, 89 | "tags": [ 90 | "f3a2f13f-d110-4558-a520-4805b5bd1dfe" 91 | ] 92 | } 93 | }, 94 | { 95 | "source": [ 96 | "# <получение первых 10 строк таблицы df>" 97 | ], 98 | "cell_type": "code", 99 | "metadata": { 100 | "colab_type": "code", 101 | "id": "DY5i8tgXVDGj", 102 | "colab": {}, 103 | "deletable": false 104 | }, 105 | "execution_count": 0, 106 | "outputs": [] 107 | }, 108 | { 109 | "source": [ 110 | "Общая информация о данных таблицы *df*.\n", 111 | "\n", 112 | "\n" 113 | ], 114 | "cell_type": "markdown", 115 | "metadata": { 116 | "colab_type": "text", 117 | "id": "FrIiRHuHIBbN", 118 | "deletable": false, 119 | "tags": [ 120 | "0210c096-9595-4600-b91d-42ab36a6c3f0" 121 | ] 122 | } 123 | }, 124 | { 125 | "source": [ 126 | "# <получение общей информации о данных в таблице df>" 127 | ], 128 | "cell_type": "code", 129 | "metadata": { 130 | "colab_type": "code", 131 | "id": "K7t8OdZsYN2y", 132 | "colab": {}, 133 | "deletable": false 134 | }, 135 | "execution_count": 0, 136 | "outputs": [] 137 | }, 138 | { 139 | "source": [ 140 | "Рассмотрим полученную информацию подробнее.\n", 141 | "\n", 142 | "Всего в таблице 7 столбцов, тип данных у каждого столбца - < напишите название типа данных >.\n", 143 | "\n", 144 | "Подробно разберём, какие в *df* столбцы и какую информацию они содержат:\n", 145 | "\n", 146 | "* userID — идентификатор пользователя;\n", 147 | "* Track — название трека; \n", 148 | "* artist — имя исполнителя;\n", 149 | "* genre — название жанра;\n", 150 | "* City — город, в котором происходило прослушивание;\n", 151 | "* time — время, в которое пользователь слушал трек;\n", 152 | "* Day — день недели.\n", 153 | "\n", 154 | "Количество значений в столбцах различается. Это говорит о том, что в данных есть <введите определение> значения.\n", 155 | "\n" 156 | ], 157 | "cell_type": "markdown", 158 | "metadata": { 159 | "colab_type": "text", 160 | "id": "CnHv9HZCc7LN", 161 | "deletable": false 162 | } 163 | }, 164 | { 165 | "source": [ 166 | "**Выводы**" 167 | ], 168 | "cell_type": "markdown", 169 | "metadata": { 170 | "colab_type": "text", 171 | "id": "DCYFm5VrevuB", 172 | "deletable": false 173 | } 174 | }, 175 | { 176 | "source": [ 177 | "Каждая строка таблицы содержит информацию о композициях определённого жанра в определённом исполнении, которые пользователи слушали в одном из городов в определённое время и день недели. Две проблемы, которые нужно решать: пропуски и некачественные названия столбцов. Для проверки рабочих гипотез особенно ценны столбцы *time*, *day* и *City*. Данные из столбца *genre* позволят узнать самые популярные жанры." 178 | ], 179 | "cell_type": "markdown", 180 | "metadata": { 181 | "colab_type": "text", 182 | "id": "PCEtjdmvezRm", 183 | "deletable": false 184 | } 185 | }, 186 | { 187 | "source": [ 188 | "# Этап 2. Предобработка данных" 189 | ], 190 | "cell_type": "markdown", 191 | "metadata": { 192 | "colab_type": "text", 193 | "id": "ZYaC0bU-IZ0a", 194 | "deletable": false, 195 | "tags": [ 196 | "2c946931-9c91-4e15-baf8-43fb79bcb454" 197 | ] 198 | } 199 | }, 200 | { 201 | "source": [ 202 | "Исключим пропуски, переименуем столбцы, а также проверим данные на наличие дубликатов." 203 | ], 204 | "cell_type": "markdown", 205 | "metadata": { 206 | "colab_type": "text", 207 | "id": "Dl8grmTrPxZi", 208 | "deletable": false 209 | } 210 | }, 211 | { 212 | "source": [ 213 | "Получаем перечень названий столбцов. Какая наблюдается проблема — кроме тех, что уже были названы ранее?" 214 | ], 215 | "cell_type": "markdown", 216 | "metadata": { 217 | "colab_type": "text", 218 | "id": "6OIhlsG_IjI8", 219 | "deletable": false 220 | } 221 | }, 222 | { 223 | "source": [ 224 | "# <перечень названий столбцов таблицы df>" 225 | ], 226 | "cell_type": "code", 227 | "metadata": { 228 | "colab_type": "code", 229 | "id": "Tag65F_Uitsx", 230 | "colab": {}, 231 | "deletable": false 232 | }, 233 | "execution_count": 0, 234 | "outputs": [] 235 | }, 236 | { 237 | "source": [ 238 | "В названиях столбцов есть пробелы, которые могут затруднять доступ к данным." 239 | ], 240 | "cell_type": "markdown", 241 | "metadata": { 242 | "colab_type": "text", 243 | "id": "x6iJC-cEhnRL", 244 | "deletable": false 245 | } 246 | }, 247 | { 248 | "source": [ 249 | "Переименуем столбцы для удобства дальнейшей работы. Проверим результат.\n", 250 | "\n" 251 | ], 252 | "cell_type": "markdown", 253 | "metadata": { 254 | "colab_type": "text", 255 | "id": "BK6m6-DZhlTs", 256 | "deletable": false, 257 | "tags": [ 258 | "c2b469cf-2148-4115-8806-0fbb00a9d55d" 259 | ] 260 | } 261 | }, 262 | { 263 | "source": [ 264 | "# <переименование столбцов>" 265 | ], 266 | "cell_type": "code", 267 | "metadata": { 268 | "colab_type": "code", 269 | "id": "XintVfCniw2-", 270 | "colab": {}, 271 | "deletable": false 272 | }, 273 | "execution_count": 0, 274 | "outputs": [] 275 | }, 276 | { 277 | "source": [ 278 | "# <проверка результатов - перечень названий столбцов>" 279 | ], 280 | "cell_type": "code", 281 | "metadata": { 282 | "colab_type": "code", 283 | "id": "ozQL91G4izdp", 284 | "colab": {}, 285 | "deletable": false 286 | }, 287 | "execution_count": 0, 288 | "outputs": [] 289 | }, 290 | { 291 | "source": [ 292 | "Проверим данные на наличие пропусков вызовом набора методов для суммирования пропущенных значений." 293 | ], 294 | "cell_type": "markdown", 295 | "metadata": { 296 | "colab_type": "text", 297 | "id": "oc2qS2UBIkQu", 298 | "deletable": false, 299 | "tags": [ 300 | "325fae3b-abce-4c7c-8c41-87ed8a26ff5d" 301 | ] 302 | } 303 | }, 304 | { 305 | "source": [ 306 | "# <суммарное количество пропусков, выявленных методом isnull() в таблице df>" 307 | ], 308 | "cell_type": "code", 309 | "metadata": { 310 | "colab_type": "code", 311 | "id": "BZh9yLHhjy_R", 312 | "colab": {}, 313 | "deletable": false 314 | }, 315 | "execution_count": 0, 316 | "outputs": [] 317 | }, 318 | { 319 | "source": [ 320 | "Пустые значения свидетельствуют, что для некоторых треков доступна не вся информация. Причины могут быть разные: скажем, не назван конкретный исполнитель народной песни. Хуже, если проблемы с записью данных. Каждый отдельный случай необходимо разобрать и выявить причину." 321 | ], 322 | "cell_type": "markdown", 323 | "metadata": { 324 | "colab_type": "text", 325 | "id": "OJXGaa02tSJJ", 326 | "deletable": false 327 | } 328 | }, 329 | { 330 | "source": [ 331 | "Заменяем пропущенные значения в столбцах с названием трека и исполнителя на строку 'unknown'. После этой операции нужно убедиться, что таблица больше не содержит пропусков." 332 | ], 333 | "cell_type": "markdown", 334 | "metadata": { 335 | "colab_type": "text", 336 | "id": "-fBDAWZUkAg-", 337 | "deletable": false 338 | } 339 | }, 340 | { 341 | "source": [ 342 | "# <замена пропущенных значений в столбце 'track_name' на строку 'unknown' специальным методом замены>\n" 343 | ], 344 | "cell_type": "code", 345 | "metadata": { 346 | "colab_type": "code", 347 | "id": "EO8zFcJPlbvV", 348 | "colab": {}, 349 | "deletable": false 350 | }, 351 | "execution_count": 0, 352 | "outputs": [] 353 | }, 354 | { 355 | "source": [ 356 | "# <замена пропущенных значений в столбце 'artist_name' на строку 'unknown' специальным методом замены>" 357 | ], 358 | "cell_type": "code", 359 | "metadata": { 360 | "colab_type": "code", 361 | "id": "3hsNZcLST0UW", 362 | "colab": {}, 363 | "deletable": false 364 | }, 365 | "execution_count": 0, 366 | "outputs": [] 367 | }, 368 | { 369 | "source": [ 370 | "# <проверка: вычисление суммарного количества пропусков, выявленных в таблице df>" 371 | ], 372 | "cell_type": "code", 373 | "metadata": { 374 | "colab_type": "code", 375 | "id": "Ua-Z8TAblgzC", 376 | "colab": {}, 377 | "deletable": false 378 | }, 379 | "execution_count": 0, 380 | "outputs": [] 381 | }, 382 | { 383 | "source": [ 384 | "Удаляем в столбце с жанрами пустые значения; убеждаемся, что их больше не осталось." 385 | ], 386 | "cell_type": "markdown", 387 | "metadata": { 388 | "colab_type": "text", 389 | "id": "-cjfT0w2ln9C", 390 | "deletable": false, 391 | "tags": [ 392 | "9cb28dd4-e24e-4490-aebd-b37ba9e492c5" 393 | ] 394 | } 395 | }, 396 | { 397 | "source": [ 398 | "# <удаление пропущенных значений в столбце 'genre_name'>" 399 | ], 400 | "cell_type": "code", 401 | "metadata": { 402 | "colab_type": "code", 403 | "id": "TIpk7lwtnZkZ", 404 | "colab": {}, 405 | "deletable": false 406 | }, 407 | "execution_count": 0, 408 | "outputs": [] 409 | }, 410 | { 411 | "source": [ 412 | "# <проверка>" 413 | ], 414 | "cell_type": "code", 415 | "metadata": { 416 | "colab_type": "code", 417 | "id": "-1CT-CCZnzTA", 418 | "colab": {}, 419 | "deletable": false 420 | }, 421 | "execution_count": 0, 422 | "outputs": [] 423 | }, 424 | { 425 | "source": [ 426 | "Необходимо установить наличие дубликатов. Если найдутся, удаляем, и проверяем, все ли удалились." 427 | ], 428 | "cell_type": "markdown", 429 | "metadata": { 430 | "colab_type": "text", 431 | "id": "QsBXpJFzpxA9", 432 | "deletable": false, 433 | "tags": [ 434 | "ea46db29-6746-4c02-a47b-75283dde9025" 435 | ] 436 | } 437 | }, 438 | { 439 | "source": [ 440 | "# <получение суммарного количества дубликатов в таблице df>" 441 | ], 442 | "cell_type": "code", 443 | "metadata": { 444 | "colab_type": "code", 445 | "id": "VRVI_B0RqIgT", 446 | "colab": {}, 447 | "deletable": false 448 | }, 449 | "execution_count": 0, 450 | "outputs": [] 451 | }, 452 | { 453 | "source": [ 454 | "# <удаление всех дубликатов из таблицы df специальным методом>" 455 | ], 456 | "cell_type": "code", 457 | "metadata": { 458 | "colab_type": "code", 459 | "id": "nSYF38OeqZn-", 460 | "colab": {}, 461 | "deletable": false 462 | }, 463 | "execution_count": 0, 464 | "outputs": [] 465 | }, 466 | { 467 | "source": [ 468 | "# <проверка на отсутствие>" 469 | ], 470 | "cell_type": "code", 471 | "metadata": { 472 | "colab_type": "code", 473 | "id": "O-RfjmkCqIgV", 474 | "colab": {}, 475 | "deletable": false 476 | }, 477 | "execution_count": 0, 478 | "outputs": [] 479 | }, 480 | { 481 | "source": [ 482 | "Дубликаты могли появиться вследствие сбоя в записи данных. Стоит обратить внимание и разобраться с причинами появления такого «информационного мусора»." 483 | ], 484 | "cell_type": "markdown", 485 | "metadata": { 486 | "colab_type": "text", 487 | "id": "e6cyWPTwsLKw", 488 | "deletable": false 489 | } 490 | }, 491 | { 492 | "source": [ 493 | "Сохраняем список уникальных значений столбца с жанрами в переменной *genres_list*. \n", 494 | "\n", 495 | "Объявим функцию *find_genre()* для поиска неявных дубликатов в столбце с жанрами. Например, когда название одного и того же жанра написано разными словами.\n", 496 | "\n", 497 | "\n", 498 | "\n" 499 | ], 500 | "cell_type": "markdown", 501 | "metadata": { 502 | "colab_type": "text", 503 | "id": "QH-HgrApInjO", 504 | "deletable": false, 505 | "tags": [ 506 | "46fb87e8-2d9c-497d-9c6e-746eaa2631ab" 507 | ] 508 | } 509 | }, 510 | { 511 | "source": [ 512 | "# <сохранение в переменной genres_list списка уникальных значений, выявленных специальным методом в столбце 'genre_name'>" 513 | ], 514 | "cell_type": "code", 515 | "metadata": { 516 | "colab_type": "code", 517 | "id": "FfaTfKAN-PCx", 518 | "colab": {}, 519 | "deletable": false 520 | }, 521 | "execution_count": 0, 522 | "outputs": [] 523 | }, 524 | { 525 | "source": [ 526 | "# <создание функции find_genre()>\n", 527 | "# функция принимает как параметр строку с названием искомого жанра\n", 528 | "# в теле объявляется переменная-счётчик, ей присваивается значение 0,\n", 529 | "# затем цикл for проходит по списку уникальных значений\n", 530 | "# если очередной элемент списка равен параметру функции, \n", 531 | "# то значение счётчика увеличивается на 1\n", 532 | "# по окончании работы цикла функция возвращает значение счётчика" 533 | ], 534 | "cell_type": "code", 535 | "metadata": { 536 | "colab_type": "code", 537 | "id": "TA_k-VLi-S0R", 538 | "colab": {}, 539 | "deletable": false 540 | }, 541 | "execution_count": 0, 542 | "outputs": [] 543 | }, 544 | { 545 | "source": [ 546 | "Вызов функции *find_genre()* для поиска различных вариантов названия жанра хип-хоп в таблице.\n", 547 | "\n", 548 | "Правильное название — *hiphop*. Поищем другие варианты:\n", 549 | "\n", 550 | "* hip\n", 551 | "* hop\n", 552 | "* hip-hop\n" 553 | ], 554 | "cell_type": "markdown", 555 | "metadata": { 556 | "colab_type": "text", 557 | "id": "vb3CTOciIL27", 558 | "deletable": false, 559 | "tags": [ 560 | "b57e3325-29fc-4ade-83a3-91113c5dad32" 561 | ] 562 | } 563 | }, 564 | { 565 | "source": [ 566 | "# <вызовом функции find_genre() проверяется наличие варианта 'hip'>" 567 | ], 568 | "cell_type": "code", 569 | "metadata": { 570 | "colab_type": "code", 571 | "id": "YrwqExZS-dyQ", 572 | "colab": {}, 573 | "deletable": false 574 | }, 575 | "execution_count": 0, 576 | "outputs": [] 577 | }, 578 | { 579 | "source": [ 580 | "# <проверяется наличие варианта 'hop'>" 581 | ], 582 | "cell_type": "code", 583 | "metadata": { 584 | "colab_type": "code", 585 | "id": "ZoL4EEcR-dyU", 586 | "colab": {}, 587 | "deletable": false 588 | }, 589 | "execution_count": 0, 590 | "outputs": [] 591 | }, 592 | { 593 | "source": [ 594 | "# <проверяется наличие варианта 'hip-hop'>" 595 | ], 596 | "cell_type": "code", 597 | "metadata": { 598 | "colab_type": "code", 599 | "id": "MFowmiug-qZD", 600 | "colab": {}, 601 | "deletable": false 602 | }, 603 | "execution_count": 0, 604 | "outputs": [] 605 | }, 606 | { 607 | "source": [ 608 | "Объявим функцию *find_hip_hop()*, которая заменяет неправильное название этого жанра в столбце *'genre_name'* на *'hiphop'* и проверяет успешность выполнения замены.\n", 609 | "\n", 610 | "Так исправляем все варианты написания, которые выявила проверка." 611 | ], 612 | "cell_type": "markdown", 613 | "metadata": { 614 | "colab_type": "text", 615 | "id": "a7BQY6ORLMSG", 616 | "deletable": false, 617 | "tags": [ 618 | "11f77aa1-5478-453d-b31e-f20041047bb7" 619 | ] 620 | } 621 | }, 622 | { 623 | "source": [ 624 | "# <создание функции find_hip_hop()>\n", 625 | "# функция принимает как параметры таблицу df и неверное название\n", 626 | "# к столбцу 'genre_name' применяется специальный метод, \n", 627 | "# который заменяет второй параметр на строку 'hiphop'\n", 628 | "# результат работы равен подсчитанному методом count() числу значений столбца, \n", 629 | "# которые равны второму параметру\n", 630 | "# функция возвращает результат" 631 | ], 632 | "cell_type": "code", 633 | "metadata": { 634 | "colab_type": "code", 635 | "id": "31xlzL_c_FgB", 636 | "colab": {}, 637 | "deletable": false 638 | }, 639 | "execution_count": 0, 640 | "outputs": [] 641 | }, 642 | { 643 | "source": [ 644 | "# <замена одного неверного варианта на hiphop вызовом функции find_hip_hop()>" 645 | ], 646 | "cell_type": "code", 647 | "metadata": { 648 | "colab_type": "code", 649 | "id": "ZFXMV2qW_FgE", 650 | "colab": {}, 651 | "deletable": false 652 | }, 653 | "execution_count": 0, 654 | "outputs": [] 655 | }, 656 | { 657 | "source": [ 658 | "Получаем общую информацию о данных. Убеждаемся, что чистка выполнена успешно." 659 | ], 660 | "cell_type": "markdown", 661 | "metadata": { 662 | "colab_type": "text", 663 | "id": "i90BILA9JQpE", 664 | "deletable": false, 665 | "tags": [ 666 | "30535c8e-1643-4088-925b-2a32180e0333" 667 | ] 668 | } 669 | }, 670 | { 671 | "source": [ 672 | "# <получение общей информации о данных таблицы df>" 673 | ], 674 | "cell_type": "code", 675 | "metadata": { 676 | "colab_type": "code", 677 | "id": "-yyvdzHA_uJm", 678 | "colab": {}, 679 | "deletable": false 680 | }, 681 | "execution_count": 0, 682 | "outputs": [] 683 | }, 684 | { 685 | "source": [ 686 | "**Вывод**" 687 | ], 688 | "cell_type": "markdown", 689 | "metadata": { 690 | "colab_type": "text", 691 | "id": "AReHO17cMRPM", 692 | "deletable": false 693 | } 694 | }, 695 | { 696 | "source": [ 697 | "На этапе предобработки в данных обнаружились не только пропуски и проблемы с названиями столбцов, но и всяческие виды дубликатов. Их удаление позволит провести анализ точнее. Поскольку сведения о жанрах важно сохранить для анализа, не просто удаляем все пропущенные значения, но заполним пропущенные имена исполнителей и названия треков. Имена столбцов теперь корректны и удобны для дальнейшей работы." 698 | ], 699 | "cell_type": "markdown", 700 | "metadata": { 701 | "colab_type": "text", 702 | "id": "yscfstUqMS4c", 703 | "deletable": false 704 | } 705 | }, 706 | { 707 | "source": [ 708 | "# Действительно ли музыку в разных городах слушают по-разному?" 709 | ], 710 | "cell_type": "markdown", 711 | "metadata": { 712 | "colab_type": "text", 713 | "id": "MF4nnd1YJUrI", 714 | "deletable": false, 715 | "tags": [ 716 | "ac8df732-1797-479a-9c4c-a03745931a9d" 717 | ] 718 | } 719 | }, 720 | { 721 | "source": [ 722 | "Была выдвинута гипотеза, что в Москве и Санкт-Петербурге пользователи слушают музыку по-разному. Проверяем это предположение по данным о трёх днях недели — понедельнике, среде и пятнице.\n", 723 | "\n", 724 | "Для каждого города устанавливаем количество прослушанных в эти дни композиций с известным жанром, и сравниваем результаты." 725 | ], 726 | "cell_type": "markdown", 727 | "metadata": { 728 | "colab_type": "text", 729 | "id": "AYSL1OvyM2pL", 730 | "deletable": false 731 | } 732 | }, 733 | { 734 | "source": [ 735 | "Группируем данные по городу и вызовом метода *count()* подсчитываем композиции, для которых известен жанр." 736 | ], 737 | "cell_type": "markdown", 738 | "metadata": { 739 | "colab_type": "text", 740 | "id": "OM5Eeh7FNWC-", 741 | "deletable": false 742 | } 743 | }, 744 | { 745 | "source": [ 746 | "# <группировка данных таблицы df по столбцу 'city' и подсчёт количества значений столбца 'genre_name'>" 747 | ], 748 | "cell_type": "code", 749 | "metadata": { 750 | "colab_type": "code", 751 | "id": "AtH_pP1i_0m1", 752 | "colab": {}, 753 | "deletable": false 754 | }, 755 | "execution_count": 0, 756 | "outputs": [] 757 | }, 758 | { 759 | "source": [ 760 | "В Москве прослушиваний больше, чем в Питере, но это не значит, что Москва более активна. У Яндекс.Музыки в целом больше пользователей в Москве, поэтому величины сопоставимы." 761 | ], 762 | "cell_type": "markdown", 763 | "metadata": { 764 | "colab_type": "text", 765 | "id": "XBR226DMpIDf", 766 | "deletable": false 767 | } 768 | }, 769 | { 770 | "source": [ 771 | "Сгруппируем данные по дню недели и подсчитаем прослушанные в понедельник, среду и пятницу композиции, для которых известен жанр." 772 | ], 773 | "cell_type": "markdown", 774 | "metadata": { 775 | "colab_type": "text", 776 | "id": "P7EcNQuyNbNB", 777 | "deletable": false, 778 | "tags": [ 779 | "133ddd49-3b63-45b1-b50c-9e6ab5fc4175" 780 | ] 781 | } 782 | }, 783 | { 784 | "source": [ 785 | "# <группировка данных по столбцу 'weekday' и подсчёт количества значений столбца 'genre_name'>\n" 786 | ], 787 | "cell_type": "code", 788 | "metadata": { 789 | "colab_type": "code", 790 | "id": "A8E_Tb2b_3un", 791 | "colab": {}, 792 | "deletable": false 793 | }, 794 | "execution_count": 0, 795 | "outputs": [] 796 | }, 797 | { 798 | "source": [ 799 | "Понедельник и пятница — время для музыки; по средам пользователи немного больше вовлечены в работу." 800 | ], 801 | "cell_type": "markdown", 802 | "metadata": { 803 | "colab_type": "text", 804 | "id": "Zhh6hehCpq_U", 805 | "deletable": false 806 | } 807 | }, 808 | { 809 | "source": [ 810 | "Создаём функцию *number_tracks()*, которая принимает как параметры таблицу, день недели и название города, а возвращает количество прослушанных композиций, для которых известен жанр. Проверяем количество прослушанных композиций для каждого города и понедельника, затем среды и пятницы." 811 | ], 812 | "cell_type": "markdown", 813 | "metadata": { 814 | "colab_type": "text", 815 | "id": "bYab2U5BNdmZ", 816 | "deletable": false, 817 | "tags": [ 818 | "bae0a168-5e2b-40f9-9701-bfb32d016517" 819 | ] 820 | } 821 | }, 822 | { 823 | "source": [ 824 | "# <создание функции number_tracks()>\n", 825 | "# объявляется функция с тремя параметрами: df, day, city\n", 826 | "# в переменной track_list сохраняются те строки таблицы df, для которых \n", 827 | "# значение в столбце 'weekday' равно параметру day\n", 828 | "# и одновременно значение в столбце 'city' равно параметру city\n", 829 | "# в переменной track_list_count сохраняется число значений столбца 'genre_name',\n", 830 | "# рассчитанное методом count() для таблицы track_list\n", 831 | "# функция возвращает значение track_list_count" 832 | ], 833 | "cell_type": "code", 834 | "metadata": { 835 | "colab_type": "code", 836 | "id": "4SqpGSi5_7hA", 837 | "colab": {}, 838 | "deletable": false 839 | }, 840 | "execution_count": 0, 841 | "outputs": [] 842 | }, 843 | { 844 | "source": [ 845 | "# <список композиций для Москвы в понедельник>" 846 | ], 847 | "cell_type": "code", 848 | "metadata": { 849 | "deletable": false 850 | }, 851 | "execution_count": null, 852 | "outputs": [] 853 | }, 854 | { 855 | "source": [ 856 | "# <список композиций для Санкт-Петербурга в понедельник>" 857 | ], 858 | "cell_type": "code", 859 | "metadata": { 860 | "deletable": false 861 | }, 862 | "execution_count": null, 863 | "outputs": [] 864 | }, 865 | { 866 | "source": [ 867 | "# <список композиций для Москвы в среду>" 868 | ], 869 | "cell_type": "code", 870 | "metadata": { 871 | "deletable": false 872 | }, 873 | "execution_count": null, 874 | "outputs": [] 875 | }, 876 | { 877 | "source": [ 878 | "# <список композиций для Санкт-Петербурга в среду>" 879 | ], 880 | "cell_type": "code", 881 | "metadata": { 882 | "deletable": false 883 | }, 884 | "execution_count": null, 885 | "outputs": [] 886 | }, 887 | { 888 | "source": [ 889 | "# <список композиций для Москвы в пятницу>" 890 | ], 891 | "cell_type": "code", 892 | "metadata": { 893 | "deletable": false 894 | }, 895 | "execution_count": null, 896 | "outputs": [] 897 | }, 898 | { 899 | "source": [ 900 | "# <список композиций для Санкт-Петербурга в пятницу>" 901 | ], 902 | "cell_type": "code", 903 | "metadata": { 904 | "deletable": false 905 | }, 906 | "execution_count": null, 907 | "outputs": [] 908 | }, 909 | { 910 | "source": [ 911 | "Сведём полученную информацию в одну таблицу, где ['city', 'monday', 'wednesday', 'friday'] названия столбцов.\n" 912 | ], 913 | "cell_type": "markdown", 914 | "metadata": { 915 | "colab_type": "text", 916 | "id": "tCB9zwzzqZ8g", 917 | "deletable": false, 918 | "tags": [ 919 | "d73e12bf-3635-484b-8fb6-c7ccc2101671" 920 | ] 921 | } 922 | }, 923 | { 924 | "source": [ 925 | "# <таблица с полученными данными>" 926 | ], 927 | "cell_type": "code", 928 | "metadata": { 929 | "deletable": false 930 | }, 931 | "execution_count": null, 932 | "outputs": [] 933 | }, 934 | { 935 | "source": [ 936 | "**Вывод**" 937 | ], 938 | "cell_type": "markdown", 939 | "metadata": { 940 | "colab_type": "text", 941 | "id": "LKCYeMXgqPxD", 942 | "deletable": false 943 | } 944 | }, 945 | { 946 | "source": [ 947 | "Результаты показывают, что относительно среды музыку в Петербурге и Москве слушают «зеркально»: в Москве пики приходятся на понедельник и пятницу, а в среду время прослушивания снижается. Тогда как в Санкт-Петербурге среда — день самого большого интереса к музыке, а в понедельник и пятницу он меньше, причём почти одинаково меньше." 948 | ], 949 | "cell_type": "markdown", 950 | "metadata": { 951 | "colab_type": "text", 952 | "id": "RJpg6I8jqQ0x", 953 | "deletable": false 954 | } 955 | }, 956 | { 957 | "source": [ 958 | "# Утро понедельника и вечер пятницы — разная музыка или одна и та же?" 959 | ], 960 | "cell_type": "markdown", 961 | "metadata": { 962 | "colab_type": "text", 963 | "id": "tLdpUGyewzGf", 964 | "deletable": false, 965 | "tags": [ 966 | "1eb8124a-f066-4c43-b1f4-bc672c5efd57" 967 | ] 968 | } 969 | }, 970 | { 971 | "source": [ 972 | "Ищем ответ на вопрос, какие жанры преобладают в разных городах в понедельник утром и в пятницу вечером. Есть предположение, что в понедельник утром пользователи слушают больше бодрящей музыки (например, жанра поп), а вечером пятницы — больше танцевальных (например, электронику)." 973 | ], 974 | "cell_type": "markdown", 975 | "metadata": { 976 | "colab_type": "text", 977 | "id": "SaQlxcVntL3x", 978 | "deletable": false 979 | } 980 | }, 981 | { 982 | "source": [ 983 | "Получим таблицы данных по Москве *moscow_general* и по Санкт-Петербургу *spb_general*." 984 | ], 985 | "cell_type": "markdown", 986 | "metadata": { 987 | "colab_type": "text", 988 | "id": "lYGAneOaPBhS", 989 | "deletable": false 990 | } 991 | }, 992 | { 993 | "source": [ 994 | "# получение таблицы moscow_general из тех строк таблицы df, \n", 995 | "# для которых значение в столбце 'city' равно 'Moscow'" 996 | ], 997 | "cell_type": "code", 998 | "metadata": { 999 | "colab_type": "code", 1000 | "id": "Pyz1i56nA5IS", 1001 | "colab": {}, 1002 | "deletable": false 1003 | }, 1004 | "execution_count": 0, 1005 | "outputs": [] 1006 | }, 1007 | { 1008 | "source": [ 1009 | "# <получение таблицы spb_general>" 1010 | ], 1011 | "cell_type": "code", 1012 | "metadata": { 1013 | "colab_type": "code", 1014 | "id": "w3NNN-2hA-al", 1015 | "colab": {}, 1016 | "deletable": false 1017 | }, 1018 | "execution_count": 0, 1019 | "outputs": [] 1020 | }, 1021 | { 1022 | "source": [ 1023 | "Создаём функцию *genre_weekday()*, которая возвращает список жанров по запрошенному дню недели и времени суток с такого-то часа по такой-то." 1024 | ], 1025 | "cell_type": "markdown", 1026 | "metadata": { 1027 | "colab_type": "text", 1028 | "id": "duDdH_WiPLky", 1029 | "deletable": false, 1030 | "tags": [ 1031 | "7f7cae13-ec1c-45c4-9204-0a4354fe1766" 1032 | ] 1033 | } 1034 | }, 1035 | { 1036 | "source": [ 1037 | "# объявление функции genre_weekday() с параметрами df, day, time1, time2\n", 1038 | "# в переменной genre_list сохраняются те строки df, для которых одновременно:\n", 1039 | "# 1) значение в столбце 'weekday' равно параметру day,\n", 1040 | "# 2) значение в столбце 'time' больше time1 и\n", 1041 | "# 3) меньше time2.\n", 1042 | "# в переменной genre_list_sorted сохраняются в порядке убывания \n", 1043 | "# первые 10 значений Series, полученной подсчётом числа значений 'genre_name'\n", 1044 | "# сгруппированной по столбцу 'genre_name' таблицы genre_list\n", 1045 | "# функция возвращает значение genre_list_sorted" 1046 | ], 1047 | "cell_type": "code", 1048 | "metadata": { 1049 | "colab_type": "code", 1050 | "id": "JhUdQynHBEYw", 1051 | "colab": {}, 1052 | "deletable": false 1053 | }, 1054 | "execution_count": 0, 1055 | "outputs": [] 1056 | }, 1057 | { 1058 | "source": [ 1059 | "Cравниваем полученные результаты по таблице для Москвы и Санкт-Петербурга в понедельник утром (с 7 до 11) и в пятницу вечером (с 17 до 23)." 1060 | ], 1061 | "cell_type": "markdown", 1062 | "metadata": { 1063 | "colab_type": "text", 1064 | "id": "bxGC8kXkP7B-", 1065 | "deletable": false, 1066 | "tags": [ 1067 | "63e2c3f3-fa64-4376-8221-e8b753264535" 1068 | ] 1069 | } 1070 | }, 1071 | { 1072 | "source": [ 1073 | "# <вызов функции для утра понедельника в Москве (вместо df таблица moscow_general)>" 1074 | ], 1075 | "cell_type": "code", 1076 | "metadata": { 1077 | "colab_type": "code", 1078 | "id": "kbgeq-55BLEI", 1079 | "colab": {}, 1080 | "deletable": false 1081 | }, 1082 | "execution_count": 0, 1083 | "outputs": [] 1084 | }, 1085 | { 1086 | "source": [ 1087 | "# <вызов функции для утра понедельника в Петербурге (вместо df таблица spb_general)>" 1088 | ], 1089 | "cell_type": "code", 1090 | "metadata": { 1091 | "colab_type": "code", 1092 | "id": "XHwa8N2EBRXO", 1093 | "colab": {}, 1094 | "deletable": false 1095 | }, 1096 | "execution_count": 0, 1097 | "outputs": [] 1098 | }, 1099 | { 1100 | "source": [ 1101 | "# <вызов функции для вечера пятницы в Москве>" 1102 | ], 1103 | "cell_type": "code", 1104 | "metadata": { 1105 | "colab_type": "code", 1106 | "id": "YvdSbg2jBUeq", 1107 | "colab": {}, 1108 | "deletable": false 1109 | }, 1110 | "execution_count": 0, 1111 | "outputs": [] 1112 | }, 1113 | { 1114 | "source": [ 1115 | "# <вызов функции для вечера пятницы в Питере>" 1116 | ], 1117 | "cell_type": "code", 1118 | "metadata": { 1119 | "colab_type": "code", 1120 | "id": "Ew3ig4fPBUeu", 1121 | "colab": {}, 1122 | "deletable": false 1123 | }, 1124 | "execution_count": 0, 1125 | "outputs": [] 1126 | }, 1127 | { 1128 | "source": [ 1129 | "Популярные жанры в понедельник утром в Питере и Москве оказались похожи: везде, как и предполагалось, популярен поп. Несмотря на это, концовка топ-10 для двух городов различается: в Питере в топ-10 входит джаз и русский рэп, а в Москве жанр *world*.\n", 1130 | "\n", 1131 | "В конце недели ситуация не меняется. Поп-музыка всё так же на первом месте. Опять разница заметна только в концовке топ-10, где в Питере пятничным вечером тоже присутствует жанр *world*." 1132 | ], 1133 | "cell_type": "markdown", 1134 | "metadata": { 1135 | "colab_type": "text", 1136 | "id": "UenYBZTIwYT-", 1137 | "deletable": false 1138 | } 1139 | }, 1140 | { 1141 | "source": [ 1142 | "**Вывод**" 1143 | ], 1144 | "cell_type": "markdown", 1145 | "metadata": { 1146 | "colab_type": "text", 1147 | "id": "MBxfrKPAykp_", 1148 | "deletable": false 1149 | } 1150 | }, 1151 | { 1152 | "source": [ 1153 | "Жанр поп безусловный лидер, а топ-5 в целом не различается в обеих столицах. При этом видно, что концовка списка более «живая»: для каждого города выделяются более характерные жанры, которые действительно меняют свои позиции в зависимости от дня недели и времени." 1154 | ], 1155 | "cell_type": "markdown", 1156 | "metadata": { 1157 | "colab_type": "text", 1158 | "id": "j8ypBMwSymL6", 1159 | "deletable": false 1160 | } 1161 | }, 1162 | { 1163 | "source": [ 1164 | "# Москва и Питер — две разные столицы, два разных направления в музыке. Правда?" 1165 | ], 1166 | "cell_type": "markdown", 1167 | "metadata": { 1168 | "colab_type": "text", 1169 | "id": "D7YMmgKRw270", 1170 | "deletable": false, 1171 | "tags": [ 1172 | "f363205e-76b1-4883-abf1-bf21c9572dc7" 1173 | ] 1174 | } 1175 | }, 1176 | { 1177 | "source": [ 1178 | "Гипотеза: Питер богат своей рэп-культурой, поэтому это направление там слушают чаще, а Москва — город контрастов, но основная масса пользователей слушает попсу.\n", 1179 | "\n" 1180 | ], 1181 | "cell_type": "markdown", 1182 | "metadata": { 1183 | "colab_type": "text", 1184 | "id": "Wc5srT13zb4Z", 1185 | "deletable": false 1186 | } 1187 | }, 1188 | { 1189 | "source": [ 1190 | "Сгруппируем таблицу *moscow_general* по жанру, сосчитаем численность композиций каждого жанра методом *count()*, отсортируем в порядке убывания и сохраним результат в таблице *moscow_genres*.\n", 1191 | "\n", 1192 | "Просмотрим первые 10 строк этой новой таблицы." 1193 | ], 1194 | "cell_type": "markdown", 1195 | "metadata": { 1196 | "colab_type": "text", 1197 | "id": "2SFE9_RV2KEL", 1198 | "deletable": false 1199 | } 1200 | }, 1201 | { 1202 | "source": [ 1203 | "# одной строкой: группировка таблицы moscow_general по столбцу 'genre_name', \n", 1204 | "# подсчёт числа значений 'genre_name' в этой группировке методом count(), \n", 1205 | "# сортировка Series в порядке убывания и сохранение в moscow_genres" 1206 | ], 1207 | "cell_type": "code", 1208 | "metadata": { 1209 | "colab_type": "code", 1210 | "id": "OohoTcsYBheo", 1211 | "colab": {}, 1212 | "deletable": false 1213 | }, 1214 | "execution_count": 0, 1215 | "outputs": [] 1216 | }, 1217 | { 1218 | "source": [ 1219 | "# <просмотр первых 10 строк moscow_genres>" 1220 | ], 1221 | "cell_type": "code", 1222 | "metadata": { 1223 | "colab_type": "code", 1224 | "id": "h7IhIKDrBher", 1225 | "colab": {}, 1226 | "deletable": false 1227 | }, 1228 | "execution_count": 0, 1229 | "outputs": [] 1230 | }, 1231 | { 1232 | "source": [ 1233 | "Сгруппируем таблицу *spb_general* по жанру, сосчитаем численность композиций каждого жанра методом *count()*, отсортируем в порядке убывания и сохраним результат в таблице *spb_genres*.\n", 1234 | "\n", 1235 | "Просматриваем первые 10 строк этой таблицы. Теперь можно сравнивать два города." 1236 | ], 1237 | "cell_type": "markdown", 1238 | "metadata": { 1239 | "colab_type": "text", 1240 | "id": "gjnf0lol2fUy", 1241 | "deletable": false, 1242 | "tags": [ 1243 | "f7503a48-1b28-483d-9f7b-bae79fb182b5" 1244 | ] 1245 | } 1246 | }, 1247 | { 1248 | "source": [ 1249 | "# <группировка таблицы spb_general, расчёт, сохранение в spb_genres>" 1250 | ], 1251 | "cell_type": "code", 1252 | "metadata": { 1253 | "colab_type": "code", 1254 | "id": "eQrdA85dB1LO", 1255 | "colab": {}, 1256 | "deletable": false 1257 | }, 1258 | "execution_count": 0, 1259 | "outputs": [] 1260 | }, 1261 | { 1262 | "source": [ 1263 | "# <просмотр первых 10 строк spb_genres>" 1264 | ], 1265 | "cell_type": "code", 1266 | "metadata": { 1267 | "colab_type": "code", 1268 | "id": "AE-Z-1wCB1LS", 1269 | "colab": {}, 1270 | "deletable": false 1271 | }, 1272 | "execution_count": 0, 1273 | "outputs": [] 1274 | }, 1275 | { 1276 | "source": [ 1277 | "**Вывод**" 1278 | ], 1279 | "cell_type": "markdown", 1280 | "metadata": { 1281 | "colab_type": "text", 1282 | "id": "J5E-kLgK2piO", 1283 | "deletable": false 1284 | } 1285 | }, 1286 | { 1287 | "source": [ 1288 | "В Москве, кроме абсолютно популярного жанра поп, есть направление русской популярной музыки. Значит, что интерес к этому жанру шире. А рэп, вопреки предположению, занимает в обоих городах близкие позиции." 1289 | ], 1290 | "cell_type": "markdown", 1291 | "metadata": { 1292 | "colab_type": "text", 1293 | "id": "-9R3-Qh02tNt", 1294 | "deletable": false 1295 | } 1296 | }, 1297 | { 1298 | "source": [ 1299 | "# Этап 4. Результаты исследования\n" 1300 | ], 1301 | "cell_type": "markdown", 1302 | "metadata": { 1303 | "colab_type": "text", 1304 | "id": "gLlT9nKMQ3ky", 1305 | "deletable": false, 1306 | "tags": [ 1307 | "0d44c8c0-390b-4c9e-b797-ddc3993f6e58" 1308 | ] 1309 | } 1310 | }, 1311 | { 1312 | "source": [ 1313 | "Рабочие гипотезы:\n", 1314 | "\n", 1315 | "* музыку в двух городах — Москве и Санкт-Петербурге — слушают в разном режиме;\n", 1316 | "\n", 1317 | "* списки десяти самых популярных жанров утром в понедельник и вечером в пятницу имеют характерные отличия;\n", 1318 | "\n", 1319 | "* население двух городов предпочитает разные музыкальные жанры.\n", 1320 | "\n", 1321 | "**Общие результаты**\n", 1322 | "\n", 1323 | "Москва и Петербург сходятся во вкусах: везде преобладает популярная музыка. При этом зависимости предпочтений от дня недели в каждом отдельном городе нет — люди постоянно слушают то, что им нравится. Но между городами в разрезе дней неделей наблюдается зеркальность относительно среды: Москва больше слушает в понедельник и пятницу, а Петербург наоборот - больше в среду, но меньше в понедельник и пятницу.\n", 1324 | "\n", 1325 | "В результате первая гипотеза < укажите подтверждена/не подтверждена>, вторая гипотеза < укажите подтверждена/не подтверждена > и третья < укажите подтверждена/не подтверждена >." 1326 | ], 1327 | "cell_type": "markdown", 1328 | "metadata": { 1329 | "colab_type": "text", 1330 | "id": "GtvyRBbD7dv5", 1331 | "deletable": false 1332 | } 1333 | } 1334 | ], 1335 | "metadata": { 1336 | "kernelspec": { 1337 | "display_name": "Python 3", 1338 | "name": "python3", 1339 | "language": "python" 1340 | }, 1341 | "language_info": { 1342 | "mimetype": "text/x-python", 1343 | "nbconvert_exporter": "python", 1344 | "name": "python", 1345 | "pygments_lexer": "ipython3", 1346 | "version": "3.6.3", 1347 | "file_extension": ".py", 1348 | "codemirror_mode": { 1349 | "version": 3, 1350 | "name": "ipython" 1351 | } 1352 | } 1353 | } 1354 | } --------------------------------------------------------------------------------