{ "cells": [ { "cell_type": "markdown", "metadata": { "id": "q0PjiV7v7aXC" }, "source": [ "# \n", "\n", "# Машинное обучение. ВМК МГУ" ] }, { "cell_type": "markdown", "metadata": { "id": "uvZhhOzlKCMH" }, "source": [ "# Практическое задание 4: Анализ данных и обработка категориальных признаков\n", "\n", "## Уровень: **Базовый (Base)**" ] }, { "cell_type": "markdown", "metadata": { "id": "uqAqpeYFxg5T" }, "source": [ "# О формате сдачи\n", "\n", "🔷 **При решении ноутбука используйте данный шаблон**\n", "\n", " ✅ Можно добавлять новые ячейки любых типов\n", " ❌ Не нужно удалять текстовые ячейки c разметкой частей ноутбука и формулировками заданий\n", "\n", "\n", "🔷 **При оценивании задач учитывается код**\n", "\n", " ✅ Задания, в которых необходим код, обычно помечаются фразами \"Your code here\"/\"Ваш код\" и аналогичными\n", " ❌ Ответы на вопросы без сопутствующего кода оцениваются в 0 баллов\n", " ❌ Наличе работоспособного кода в ноутбуке, если на сказано иного, обязательно\n", "\n", "🔷 **При оценивании задач учитываются выводы**\n", "\n", " ✅ Задания, в которых необходимы выводы, обычно помечаются фразами Вывод\"/\"Ответ на вопрос\"/\"Ваш текст\" и аналогичными\n", " ✅ Обычно выводы подразумевают под собой текстовый ответ (можно писать markdown, latex).\n", " ✅ Сопутствующие изображения, графики, таблички - приветствуются!\n", " ❌ При отсутствии выводов задание не засчитается на полный балл\n", "\n", "-----------\n", "\n", "\n", "\n", "\n", "\n", "\n" ] }, { "cell_type": "markdown", "metadata": { "id": "ciHgl9KGlJua" }, "source": [ "# Подготовка рабочей среды\n", "\n", "Сначала установим нужные нам версии библиотек. Мы гарантируем, что в данных версиях задание будет корректно отрабатывать.\n", "\n", "После установки нужных версий, **возможно,** нужно перезагрузить среду (runtime), но скорее всего вам это не понадобится\n", "\n", "\n", "На скачивание файла и установку понадобится не более 5 минут.\n", "\n", "**Важно!**\n", "\n", "Устанавливать нужные версии нужно каждый раз, когда создается новый рантайм. Например, если вы 2 часа подряд делаете это задание, то подготовить библиотеки достаточно 1 раз. Но если вы, например, начали в понедельник, затем закрыли/выключили ноутбук, то при продолжении в среду, вам нужно будет запустить рантайм заново и следовательно заново установить библиотеки.\n", "\n", "**Важно!**\n", "Если вы предпочитаете делать практические задания на своем личном ноутбуке, то проверьте, что вы установили рабочее окружение в [соответствии с гайдом](https://github.com/MSU-ML-COURSE/ML-COURSE-24-25/blob/main/tutorials/%D0%A2%D1%83%D1%82%D0%BE%D1%80%D0%B8%D0%B0%D0%BB%20%D0%BF%D0%BE%20%D1%83%D1%81%D1%82%D0%B0%D0%BD%D0%BE%D0%B2%D0%BA%D0%B5%20%D1%80%D0%B0%D0%B1%D0%BE%D1%87%D0%B5%D0%B3%D0%BE%20%D0%BE%D0%BA%D1%80%D1%83%D0%B6%D0%B5%D0%BD%D0%B8%D1%8F%20%D0%B2%20Python%20%D0%B4%D0%BB%D1%8F%20%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D1%8F%20%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%20(2).pdf)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "fMgnzKcqlIen" }, "outputs": [], "source": [ "! curl https://raw.githubusercontent.com/MSU-ML-COURSE/ML-COURSE-25-26/refs/heads/master/requirements/requirements.txt -o ./requirements_2025_26_for_colab_small.txt\n", "! pip install -q -r ./requirements_2025_26_for_colab_small.txt" ] }, { "cell_type": "markdown", "metadata": { "id": "-0DgvOqZix4h" }, "source": [ "Проверим версию библиотеки:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "QwWXXElyiRYq" }, "outputs": [], "source": [ "import catboost\n", "assert(catboost.__version__ == '1.2.8')" ] }, { "cell_type": "markdown", "metadata": { "id": "53PQKGPVizrv" }, "source": [ "Теперь можно приступать к выполнению задания! :)" ] }, { "cell_type": "markdown", "metadata": { "id": "7Z8vzxJLyEDk" }, "source": [ "-----------\n", "" ] }, { "cell_type": "markdown", "metadata": { "id": "6MBU1hOZ7aXH" }, "source": [ "# Часть 1. Анализ и обработка данных" ] }, { "cell_type": "markdown", "metadata": { "id": "_ZjnB4VJJuR6" }, "source": [ "В прошлом ноутбуке мы познакомились, как можно вызывать методы машинного обучения с помощью библиотеки `sklearn`. Казалось бы, бери самые передовые методы машинного обучения (да и нейросетей), применяй на данные, и радуйся жизни. Но на самом деле, на качество решения задачи влияет не столько вид модели, а то, какие данные мы подаем этой модели.\n", "\n", "В реальном мире данные редко бывают безупречными. Они могут включать ошибки ввода, неточности, пропуски и выбросы, что часто происходит из-за человеческих ошибок или нехватки информации. Если не провести предварительную обработку данных, это может негативно сказаться на качестве модели машинного обучения. Поэтому важно уделять внимание анализу и обработке данных перед их использованием.\n", "\n", " При правильном анализе и обработке датасета есть возможность сильно забустить качество, даже сильнее, чем если бы мы взяли какую-то более \"мощную\" модель машинного обучения.\n", "\n", "В данном секции мы разберем основные приемы, которые могут приняться при анализе и обработке данных - этапе, который производится перед подачей данных в саму модель и ее обучении." ] }, { "cell_type": "markdown", "metadata": { "id": "RXY7s3K2dkPX" }, "source": [ "## Работа с данными\n", "\n" ] }, { "cell_type": "markdown", "metadata": { "id": "70dA2XS_kYlz" }, "source": [ "Будем работать с датасетом [описания квартир на Airbnb](https://www.kaggle.com/datasets/arianazmoudeh/airbnbopendata/data)\n", "\n", "Мы уже скачали его за вас:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "sELlwalGkX10", "outputId": "5f001229-4e12-49e9-bf04-37b389f1fdbd" }, "outputs": [], "source": [ "import gdown\n", "\n", "gdown.download(id='1GKaJXuZm74Bs5b9FCxUrbcZAoLTaN5MT')" ] }, { "cell_type": "markdown", "metadata": { "id": "4zuTlT1wynOq" }, "source": [ "Работать с данными будем, как и раньше, через `pandas` + `numpy`" ] }, { "cell_type": "code", "execution_count": 54, "metadata": { "id": "3zby9wC0lh-M" }, "outputs": [], "source": [ "import pandas as pd\n", "import numpy as np\n", "\n", "pd.set_option('display.max_columns', None) # установим настройку, чтобы всегда отображались все столбцы" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "Vyhr0mE7lghl" }, "outputs": [], "source": [ "data = pd.read_csv(\"/content/Airbnb_Open_Data.csv\", low_memory=False)" ] }, { "cell_type": "markdown", "metadata": { "id": "xOC_uTKEy0VN" }, "source": [ "Посмотрим на все данные:" ] }, { "cell_type": "code", "execution_count": 56, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 503 }, "id": "tuH-EXfnls6e", "outputId": "6f0a9850-8d0e-4052-ce81-f6e20c829080" }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
idNAMEhost idhost_identity_verifiedhost nameneighbourhood groupneighbourhoodlatlongcountrycountry codeinstant_bookablecancellation_policyroom typeConstruction yearpriceservice feeminimum nightsnumber of reviewslast reviewreviews per monthreview rate numbercalculated host listings countavailability 365house_ruleslicense
01001254Clean & quiet apt home by the park80014485718unconfirmedMadalineBrooklynKensington40.64749-73.97237United StatesUSFalsestrictPrivate room2020.0$966$19310.09.010/19/20210.214.06.0286.0Clean up and treat the home the way you'd like...NaN
11002102Skylit Midtown Castle52335172823verifiedJennaManhattanMidtown40.75362-73.98377United StatesUSFalsemoderateEntire home/apt2007.0$142$2830.045.05/21/20220.384.02.0228.0Pet friendly but please confirm with me if the...NaN
21002403THE VILLAGE OF HARLEM....NEW YORK !78829239556NaNEliseManhattanHarlem40.80902-73.94190United StatesUSTrueflexiblePrivate room2005.0$620$1243.00.0NaNNaN5.01.0352.0I encourage you to use my kitchen, cooking and...NaN
31002755NaN85098326012unconfirmedGarryBrooklynClinton Hill40.68514-73.95976United StatesUSTruemoderateEntire home/apt2005.0$368$7430.0270.07/5/20194.644.01.0322.0NaNNaN
41003689Entire Apt: Spacious Studio/Loft by central park92037596077verifiedLyndonManhattanEast Harlem40.79851-73.94399United StatesUSFalsemoderateEntire home/apt2009.0$204$4110.09.011/19/20180.103.01.0289.0Please no smoking in the house, porch or on th...NaN
\n", "
" ], "text/plain": [ " id NAME host id \\\n", "0 1001254 Clean & quiet apt home by the park 80014485718 \n", "1 1002102 Skylit Midtown Castle 52335172823 \n", "2 1002403 THE VILLAGE OF HARLEM....NEW YORK ! 78829239556 \n", "3 1002755 NaN 85098326012 \n", "4 1003689 Entire Apt: Spacious Studio/Loft by central park 92037596077 \n", "\n", " host_identity_verified host name neighbourhood group neighbourhood \\\n", "0 unconfirmed Madaline Brooklyn Kensington \n", "1 verified Jenna Manhattan Midtown \n", "2 NaN Elise Manhattan Harlem \n", "3 unconfirmed Garry Brooklyn Clinton Hill \n", "4 verified Lyndon Manhattan East Harlem \n", "\n", " lat long country country code instant_bookable \\\n", "0 40.64749 -73.97237 United States US False \n", "1 40.75362 -73.98377 United States US False \n", "2 40.80902 -73.94190 United States US True \n", "3 40.68514 -73.95976 United States US True \n", "4 40.79851 -73.94399 United States US False \n", "\n", " cancellation_policy room type Construction year price service fee \\\n", "0 strict Private room 2020.0 $966 $193 \n", "1 moderate Entire home/apt 2007.0 $142 $28 \n", "2 flexible Private room 2005.0 $620 $124 \n", "3 moderate Entire home/apt 2005.0 $368 $74 \n", "4 moderate Entire home/apt 2009.0 $204 $41 \n", "\n", " minimum nights number of reviews last review reviews per month \\\n", "0 10.0 9.0 10/19/2021 0.21 \n", "1 30.0 45.0 5/21/2022 0.38 \n", "2 3.0 0.0 NaN NaN \n", "3 30.0 270.0 7/5/2019 4.64 \n", "4 10.0 9.0 11/19/2018 0.10 \n", "\n", " review rate number calculated host listings count availability 365 \\\n", "0 4.0 6.0 286.0 \n", "1 4.0 2.0 228.0 \n", "2 5.0 1.0 352.0 \n", "3 4.0 1.0 322.0 \n", "4 3.0 1.0 289.0 \n", "\n", " house_rules license \n", "0 Clean up and treat the home the way you'd like... NaN \n", "1 Pet friendly but please confirm with me if the... NaN \n", "2 I encourage you to use my kitchen, cooking and... NaN \n", "3 NaN NaN \n", "4 Please no smoking in the house, porch or on th... NaN " ] }, "execution_count": 56, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data.head()" ] }, { "cell_type": "markdown", "metadata": { "id": "YfOasHJPy9i2" }, "source": [ "Только на вещественные признаки:" ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 318 }, "id": "1g8X0fX8l4ZV", "outputId": "ee914cf5-40b3-48fb-f80b-b38b9445eadc" }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
idhost idlatlongConstruction yearminimum nightsnumber of reviewsreviews per monthreview rate numbercalculated host listings countavailability 365
count1.025990e+051.025990e+05102591.000000102591.000000102385.000000102190.000000102416.00000086720.000000102273.000000102280.000000102151.000000
mean2.914623e+074.925411e+1040.728094-73.9496442012.4874648.13584527.4837431.3740223.2791067.936605141.133254
std1.625751e+072.853900e+100.0558570.0495215.76555630.55378149.5089541.7466211.28465732.218780135.435024
min1.001254e+061.236005e+0840.499790-74.2498402003.000000-1223.0000000.0000000.0100001.0000001.000000-10.000000
25%1.508581e+072.458333e+1040.688740-73.9825802007.0000002.0000001.0000000.2200002.0000001.0000003.000000
50%2.913660e+074.911774e+1040.722290-73.9544402012.0000003.0000007.0000000.7400003.0000001.00000096.000000
75%4.320120e+077.399650e+1040.762760-73.9323502017.0000005.00000030.0000002.0000004.0000002.000000269.000000
max5.736742e+079.876313e+1040.916970-73.7052202022.0000005645.0000001024.00000090.0000005.000000332.0000003677.000000
\n", "
" ], "text/plain": [ " id host id lat long \\\n", "count 1.025990e+05 1.025990e+05 102591.000000 102591.000000 \n", "mean 2.914623e+07 4.925411e+10 40.728094 -73.949644 \n", "std 1.625751e+07 2.853900e+10 0.055857 0.049521 \n", "min 1.001254e+06 1.236005e+08 40.499790 -74.249840 \n", "25% 1.508581e+07 2.458333e+10 40.688740 -73.982580 \n", "50% 2.913660e+07 4.911774e+10 40.722290 -73.954440 \n", "75% 4.320120e+07 7.399650e+10 40.762760 -73.932350 \n", "max 5.736742e+07 9.876313e+10 40.916970 -73.705220 \n", "\n", " Construction year minimum nights number of reviews \\\n", "count 102385.000000 102190.000000 102416.000000 \n", "mean 2012.487464 8.135845 27.483743 \n", "std 5.765556 30.553781 49.508954 \n", "min 2003.000000 -1223.000000 0.000000 \n", "25% 2007.000000 2.000000 1.000000 \n", "50% 2012.000000 3.000000 7.000000 \n", "75% 2017.000000 5.000000 30.000000 \n", "max 2022.000000 5645.000000 1024.000000 \n", "\n", " reviews per month review rate number calculated host listings count \\\n", "count 86720.000000 102273.000000 102280.000000 \n", "mean 1.374022 3.279106 7.936605 \n", "std 1.746621 1.284657 32.218780 \n", "min 0.010000 1.000000 1.000000 \n", "25% 0.220000 2.000000 1.000000 \n", "50% 0.740000 3.000000 1.000000 \n", "75% 2.000000 4.000000 2.000000 \n", "max 90.000000 5.000000 332.000000 \n", "\n", " availability 365 \n", "count 102151.000000 \n", "mean 141.133254 \n", "std 135.435024 \n", "min -10.000000 \n", "25% 3.000000 \n", "50% 96.000000 \n", "75% 269.000000 \n", "max 3677.000000 " ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data.describe()" ] }, { "cell_type": "markdown", "metadata": { "id": "KY4Lc4F4y_X_" }, "source": [ "Только на категориальные и текстовые:" ] }, { "cell_type": "code", "execution_count": 57, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 264 }, "id": "pO88nbaHveyR", "outputId": "9527c494-0381-40b8-8f58-1badd015e5e6" }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
NAMEhost_identity_verifiedhost nameneighbourhood groupneighbourhoodcountrycountry codeinstant_bookablecancellation_policyroom typepriceservice feelast reviewhouse_ruleslicense
count10234910231010219310257010258310206710246810249410252310259910235210232686706504682
unique612812131907224112341151231247719761
topHome away from homeunconfirmedMichaelManhattanBedford-StuyvesantUnited StatesUSFalsemoderateEntire home/apt$206$416/23/2019#NAME?41662/AL
freq3351200881437927937102067102468514743434353701137526244327122
\n", "
" ], "text/plain": [ " NAME host_identity_verified host name \\\n", "count 102349 102310 102193 \n", "unique 61281 2 13190 \n", "top Home away from home unconfirmed Michael \n", "freq 33 51200 881 \n", "\n", " neighbourhood group neighbourhood country country code \\\n", "count 102570 102583 102067 102468 \n", "unique 7 224 1 1 \n", "top Manhattan Bedford-Stuyvesant United States US \n", "freq 43792 7937 102067 102468 \n", "\n", " instant_bookable cancellation_policy room type price \\\n", "count 102494 102523 102599 102352 \n", "unique 2 3 4 1151 \n", "top False moderate Entire home/apt $206 \n", "freq 51474 34343 53701 137 \n", "\n", " service fee last review house_rules license \n", "count 102326 86706 50468 2 \n", "unique 231 2477 1976 1 \n", "top $41 6/23/2019 #NAME? 41662/AL \n", "freq 526 2443 2712 2 " ] }, "execution_count": 57, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data.describe(include=\"object\")" ] }, { "cell_type": "markdown", "metadata": { "id": "DMPeXYQ1zJ3S" }, "source": [ "**Пояснение:** Здесь можно увидеть, что некоторые вещественные данные на самом деле хорошо бы считать категориальными (например `id`), а некоторые категориальные - вещественными (наприер, `price`). Данные наблюдения как раз относятся к анализу данных - если поправить тип данных, то можно потенциально улучшить качество модели" ] }, { "cell_type": "markdown", "metadata": { "id": "K4i5quhMz5-t" }, "source": [ "### **Задание 1 [1 балл]**\n", "\n", "1) **[0.5 баллa]:** Какие еще категориальные и текстовые признаки из датасета на самом деле нужно считать вещественными?\n", "\n", "2) **[0.5 баллa]:** Какие еще вещественные признаки из датасета на самом деле нужно считать категориальными или текстовыми?\n", "\n", "В каждом пункте приведите хотя бы по 1 примеру" ] }, { "cell_type": "markdown", "metadata": { "id": "G_GIAz9u0WBu" }, "source": [ "**Ваш ответ тут:**\n", "1. service fee можно отнести к вещественной переменной\n", "2. host id можно отнести к категориальной переменной" ] }, { "cell_type": "markdown", "metadata": { "id": "E6hw-E480Wso" }, "source": [ "---" ] }, { "cell_type": "markdown", "metadata": { "id": "UBFwiXt8LpzR" }, "source": [ "### Работа с пропусками в вещественных данных\n", "\n", "Но пока не будем это все исправлять: углубимся, как можно работать с пропусками в данных: не все модели хорошо умеют обучаться с пропусками в данных, а также их нивелирование может привести к улучшению качества обучаемых моделей\n", "\n", "**Tip:** Пропуски в данных для машинного обучения могут возникать из-за ошибок при сборе данных, например, из-за сбоев оборудования или человеческого фактора. Также они могут появляться в результате отсутствия информации, когда респонденты не отвечают на определенные вопросы в опросах или анкетах. Наконец, пропуски могут быть следствием фильтрации данных, когда некоторые записи удаляются из-за несоответствия критериям качества." ] }, { "cell_type": "markdown", "metadata": { "id": "9UEPM9kD1ktw" }, "source": [ "В поиске пропущенных значений нам поможет функция info:" ] }, { "cell_type": "code", "execution_count": 58, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "8H335Qlg1SDf", "outputId": "78c7ed24-dc5b-4395-affc-90a74e655d70" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "RangeIndex: 102599 entries, 0 to 102598\n", "Data columns (total 26 columns):\n", " # Column Non-Null Count Dtype \n", "--- ------ -------------- ----- \n", " 0 id 102599 non-null int64 \n", " 1 NAME 102349 non-null object \n", " 2 host id 102599 non-null int64 \n", " 3 host_identity_verified 102310 non-null object \n", " 4 host name 102193 non-null object \n", " 5 neighbourhood group 102570 non-null object \n", " 6 neighbourhood 102583 non-null object \n", " 7 lat 102591 non-null float64\n", " 8 long 102591 non-null float64\n", " 9 country 102067 non-null object \n", " 10 country code 102468 non-null object \n", " 11 instant_bookable 102494 non-null object \n", " 12 cancellation_policy 102523 non-null object \n", " 13 room type 102599 non-null object \n", " 14 Construction year 102385 non-null float64\n", " 15 price 102352 non-null object \n", " 16 service fee 102326 non-null object \n", " 17 minimum nights 102190 non-null float64\n", " 18 number of reviews 102416 non-null float64\n", " 19 last review 86706 non-null object \n", " 20 reviews per month 86720 non-null float64\n", " 21 review rate number 102273 non-null float64\n", " 22 calculated host listings count 102280 non-null float64\n", " 23 availability 365 102151 non-null float64\n", " 24 house_rules 50468 non-null object \n", " 25 license 2 non-null object \n", "dtypes: float64(9), int64(2), object(15)\n", "memory usage: 20.4+ MB\n" ] } ], "source": [ "data.info()" ] }, { "cell_type": "code", "execution_count": 59, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "S2OgAz621tPX", "outputId": "4e9ab01d-b663-49ad-a471-bec4830a00d3" }, "outputs": [ { "data": { "text/plain": [ "(102599, 26)" ] }, "execution_count": 59, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data.shape" ] }, { "cell_type": "markdown", "metadata": { "id": "lhKPKMxw2BKD" }, "source": [ "#### **Задание 2 [0.5 баллa]**\n", "\n", "В скольких столбцах есть хотя бы 1 пропуск?\n", "\n", "Можно вывести решение как программно, так и визуально" ] }, { "cell_type": "code", "execution_count": 60, "metadata": { "id": "1g-uZacW1-b5" }, "outputs": [ { "data": { "text/plain": [ "np.int64(23)" ] }, "execution_count": 60, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data.isnull().any().sum()" ] }, { "cell_type": "markdown", "metadata": { "id": "syylOBmD2Uwy" }, "source": [ "**Ваш ответ тут:**\n", "23 столбца" ] }, { "cell_type": "markdown", "metadata": { "id": "9oT6WcWO2KN7" }, "source": [ "#### **Задание 3 [1 балл]**\n", "\n", "На основе пропусков, какой бы вы 1 столбец выкинули из данных как совсем неинформативный?" ] }, { "cell_type": "markdown", "metadata": { "id": "S6A_bT5-2VRX" }, "source": [ "**Ваш ответ тут:** license, т.к. он содержит лишь 2 не нуль значения" ] }, { "cell_type": "markdown", "metadata": { "id": "-vMi_Xvu2iwC" }, "source": [ "----" ] }, { "cell_type": "markdown", "metadata": { "id": "EKQdgRxs2iNn" }, "source": [ "**Подход 1** Удаление объектов с пропусками" ] }, { "cell_type": "markdown", "metadata": { "id": "QTPolSpE28w7" }, "source": [ "Метод немного из \"пушки по воробьям\", но может быть иногда полезен\n", "\n", "Можно удалить все строки, где есть хотя бы 1 пропуск" ] }, { "cell_type": "code", "execution_count": 13, "metadata": { "id": "tPUKb91ByvMO" }, "outputs": [], "source": [ "data_drop_rows = data.dropna(axis=\"index\")" ] }, { "cell_type": "markdown", "metadata": { "id": "CKHVF4IT3JC2" }, "source": [ "Или все столбцы:" ] }, { "cell_type": "code", "execution_count": 14, "metadata": { "id": "cdMXGAss3F35" }, "outputs": [], "source": [ "data_drop_columns = data.dropna(axis=\"columns\")" ] }, { "cell_type": "markdown", "metadata": { "id": "TsA1uLKT3OEv" }, "source": [ "Посмотрим на них:" ] }, { "cell_type": "code", "execution_count": 15, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "f1LYlaGA3X0J", "outputId": "e60b0aff-67cd-40e3-8882-1d54c7ca1796" }, "outputs": [ { "data": { "text/plain": [ "(1, 26)" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data_drop_rows.shape" ] }, { "cell_type": "code", "execution_count": 16, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "fFYGNleB3PP2", "outputId": "488c31cb-659c-4b27-9a75-83a2e4832e0b" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "Index: 1 entries, 11114 to 11114\n", "Data columns (total 26 columns):\n", " # Column Non-Null Count Dtype \n", "--- ------ -------------- ----- \n", " 0 id 1 non-null int64 \n", " 1 NAME 1 non-null object \n", " 2 host id 1 non-null int64 \n", " 3 host_identity_verified 1 non-null object \n", " 4 host name 1 non-null object \n", " 5 neighbourhood group 1 non-null object \n", " 6 neighbourhood 1 non-null object \n", " 7 lat 1 non-null float64\n", " 8 long 1 non-null float64\n", " 9 country 1 non-null object \n", " 10 country code 1 non-null object \n", " 11 instant_bookable 1 non-null object \n", " 12 cancellation_policy 1 non-null object \n", " 13 room type 1 non-null object \n", " 14 Construction year 1 non-null float64\n", " 15 price 1 non-null object \n", " 16 service fee 1 non-null object \n", " 17 minimum nights 1 non-null float64\n", " 18 number of reviews 1 non-null float64\n", " 19 last review 1 non-null object \n", " 20 reviews per month 1 non-null float64\n", " 21 review rate number 1 non-null float64\n", " 22 calculated host listings count 1 non-null float64\n", " 23 availability 365 1 non-null float64\n", " 24 house_rules 1 non-null object \n", " 25 license 1 non-null object \n", "dtypes: float64(9), int64(2), object(15)\n", "memory usage: 216.0+ bytes\n" ] } ], "source": [ "data_drop_rows.info()" ] }, { "cell_type": "code", "execution_count": 17, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "H-4uCpOr3cCZ", "outputId": "50027b16-6fb6-49fa-91ed-f0e2797fe674" }, "outputs": [ { "data": { "text/plain": [ "(102599, 3)" ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data_drop_columns.shape" ] }, { "cell_type": "code", "execution_count": 18, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "5waki1Pv3Q90", "outputId": "6b6be840-b6bf-4ccd-d1a5-22523c615ed9" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "RangeIndex: 102599 entries, 0 to 102598\n", "Data columns (total 3 columns):\n", " # Column Non-Null Count Dtype \n", "--- ------ -------------- ----- \n", " 0 id 102599 non-null int64 \n", " 1 host id 102599 non-null int64 \n", " 2 room type 102599 non-null object\n", "dtypes: int64(2), object(1)\n", "memory usage: 2.3+ MB\n" ] } ], "source": [ "data_drop_columns.info()" ] }, { "cell_type": "markdown", "metadata": { "id": "wa_PSkzZz7Ai" }, "source": [ "#### **Задание 4 [2 баллa]**\n", "\n", "1) **[1 балл]** Какие проблемы вы видите в подходе удаления строк с пропусками, основываясь на значении data_drop_rows?\n", "\n", "2) **[1 балл]** Какие проблемы вы видите в подходе удаления столбцов с пропусками, основываясь на значении data_drop_columns?" ] }, { "cell_type": "markdown", "metadata": { "id": "8Qrd5tUz3uTF" }, "source": [ "**Ваши выводы тут:**\n", "\n", "Из размеров таблиц видно, что оба подхода могут не оставить данных\n", "- При удалении строк меняется распределение признаков \n", "- При удалении столбцов могут теряться важные признаки" ] }, { "cell_type": "markdown", "metadata": { "id": "yFaIdK1y3v5p" }, "source": [ "---" ] }, { "cell_type": "markdown", "metadata": { "id": "neZAhQTcBEdr" }, "source": [ "**Подход 2** Замена на число\n" ] }, { "cell_type": "markdown", "metadata": { "id": "CHlinvQi-ioJ" }, "source": [ "Можно заменить на конкретное число/среднее по столбцу/медиану по столбцу итд:" ] }, { "cell_type": "code", "execution_count": 19, "metadata": { "id": "yIlIAD7D4Min" }, "outputs": [], "source": [ "data_number = data.select_dtypes('number') # выберем только вещественные признаки" ] }, { "cell_type": "code", "execution_count": 20, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 240 }, "id": "fOcqmCWT4pKj", "outputId": "e71c6cc6-6489-48af-8091-51d0b2c81c3d" }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
idhost idlatlongConstruction yearminimum nightsnumber of reviewsreviews per monthreview rate numbercalculated host listings countavailability 365
010012548001448571840.64749-73.972372020.010.09.00.214.06.0286.0
110021025233517282340.75362-73.983772007.030.045.00.384.02.0228.0
210024037882923955640.80902-73.941902005.03.00.0NaN5.01.0352.0
310027558509832601240.68514-73.959762005.030.0270.04.644.01.0322.0
410036899203759607740.79851-73.943992009.010.09.00.103.01.0289.0
\n", "
" ], "text/plain": [ " id host id lat long Construction year \\\n", "0 1001254 80014485718 40.64749 -73.97237 2020.0 \n", "1 1002102 52335172823 40.75362 -73.98377 2007.0 \n", "2 1002403 78829239556 40.80902 -73.94190 2005.0 \n", "3 1002755 85098326012 40.68514 -73.95976 2005.0 \n", "4 1003689 92037596077 40.79851 -73.94399 2009.0 \n", "\n", " minimum nights number of reviews reviews per month review rate number \\\n", "0 10.0 9.0 0.21 4.0 \n", "1 30.0 45.0 0.38 4.0 \n", "2 3.0 0.0 NaN 5.0 \n", "3 30.0 270.0 4.64 4.0 \n", "4 10.0 9.0 0.10 3.0 \n", "\n", " calculated host listings count availability 365 \n", "0 6.0 286.0 \n", "1 2.0 228.0 \n", "2 1.0 352.0 \n", "3 1.0 322.0 \n", "4 1.0 289.0 " ] }, "execution_count": 20, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data_number.head()" ] }, { "cell_type": "code", "execution_count": 21, "metadata": { "id": "NCs3qcfD5faQ" }, "outputs": [], "source": [ "tmp = data_number.fillna(0) # на 0" ] }, { "cell_type": "code", "execution_count": 22, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 240 }, "id": "RL55VvGt4lZi", "outputId": "295fe3ee-2a19-47d6-ac77-86d1fcd55582" }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
idhost idlatlongConstruction yearminimum nightsnumber of reviewsreviews per monthreview rate numbercalculated host listings countavailability 365
010012548001448571840.64749-73.972372020.010.09.00.214.06.0286.0
110021025233517282340.75362-73.983772007.030.045.00.384.02.0228.0
210024037882923955640.80902-73.941902005.03.00.00.005.01.0352.0
310027558509832601240.68514-73.959762005.030.0270.04.644.01.0322.0
410036899203759607740.79851-73.943992009.010.09.00.103.01.0289.0
\n", "
" ], "text/plain": [ " id host id lat long Construction year \\\n", "0 1001254 80014485718 40.64749 -73.97237 2020.0 \n", "1 1002102 52335172823 40.75362 -73.98377 2007.0 \n", "2 1002403 78829239556 40.80902 -73.94190 2005.0 \n", "3 1002755 85098326012 40.68514 -73.95976 2005.0 \n", "4 1003689 92037596077 40.79851 -73.94399 2009.0 \n", "\n", " minimum nights number of reviews reviews per month review rate number \\\n", "0 10.0 9.0 0.21 4.0 \n", "1 30.0 45.0 0.38 4.0 \n", "2 3.0 0.0 0.00 5.0 \n", "3 30.0 270.0 4.64 4.0 \n", "4 10.0 9.0 0.10 3.0 \n", "\n", " calculated host listings count availability 365 \n", "0 6.0 286.0 \n", "1 2.0 228.0 \n", "2 1.0 352.0 \n", "3 1.0 322.0 \n", "4 1.0 289.0 " ] }, "execution_count": 22, "metadata": {}, "output_type": "execute_result" } ], "source": [ "tmp.head() # Обратите внимание на изменение 2й строки в столбце reviews per month" ] }, { "cell_type": "code", "execution_count": 23, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "qeFc1GbI4WgV", "outputId": "2d9f5aa8-8967-42cf-9fdd-ba0edf9d8fa0" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "RangeIndex: 102599 entries, 0 to 102598\n", "Data columns (total 11 columns):\n", " # Column Non-Null Count Dtype \n", "--- ------ -------------- ----- \n", " 0 id 102599 non-null int64 \n", " 1 host id 102599 non-null int64 \n", " 2 lat 102599 non-null float64\n", " 3 long 102599 non-null float64\n", " 4 Construction year 102599 non-null float64\n", " 5 minimum nights 102599 non-null float64\n", " 6 number of reviews 102599 non-null float64\n", " 7 reviews per month 102599 non-null float64\n", " 8 review rate number 102599 non-null float64\n", " 9 calculated host listings count 102599 non-null float64\n", " 10 availability 365 102599 non-null float64\n", "dtypes: float64(9), int64(2)\n", "memory usage: 8.6 MB\n" ] } ], "source": [ "tmp.info()" ] }, { "cell_type": "code", "execution_count": 24, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 240 }, "id": "aMpz3zss7ByJ", "outputId": "84658666-039f-4417-bb6e-0fadd1fd95d1" }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
idhost idlatlongConstruction yearminimum nightsnumber of reviewsreviews per monthreview rate numbercalculated host listings countavailability 365
010012548001448571840.64749-73.972372020.010.09.00.2100004.06.0286.0
110021025233517282340.75362-73.983772007.030.045.00.3800004.02.0228.0
210024037882923955640.80902-73.941902005.03.00.01.3740225.01.0352.0
310027558509832601240.68514-73.959762005.030.0270.04.6400004.01.0322.0
410036899203759607740.79851-73.943992009.010.09.00.1000003.01.0289.0
\n", "
" ], "text/plain": [ " id host id lat long Construction year \\\n", "0 1001254 80014485718 40.64749 -73.97237 2020.0 \n", "1 1002102 52335172823 40.75362 -73.98377 2007.0 \n", "2 1002403 78829239556 40.80902 -73.94190 2005.0 \n", "3 1002755 85098326012 40.68514 -73.95976 2005.0 \n", "4 1003689 92037596077 40.79851 -73.94399 2009.0 \n", "\n", " minimum nights number of reviews reviews per month review rate number \\\n", "0 10.0 9.0 0.210000 4.0 \n", "1 30.0 45.0 0.380000 4.0 \n", "2 3.0 0.0 1.374022 5.0 \n", "3 30.0 270.0 4.640000 4.0 \n", "4 10.0 9.0 0.100000 3.0 \n", "\n", " calculated host listings count availability 365 \n", "0 6.0 286.0 \n", "1 2.0 228.0 \n", "2 1.0 352.0 \n", "3 1.0 322.0 \n", "4 1.0 289.0 " ] }, "execution_count": 24, "metadata": {}, "output_type": "execute_result" } ], "source": [ "tmp = data_number.fillna(data_number.mean()) # Обратите внимание на изменение 2й строки в столбце reviews per month\n", "tmp.head()" ] }, { "cell_type": "code", "execution_count": 25, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "Obi7R24j4iuo", "outputId": "cbe97406-471b-470d-c041-cd7dcb9cc172" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "RangeIndex: 102599 entries, 0 to 102598\n", "Data columns (total 11 columns):\n", " # Column Non-Null Count Dtype \n", "--- ------ -------------- ----- \n", " 0 id 102599 non-null int64 \n", " 1 host id 102599 non-null int64 \n", " 2 lat 102599 non-null float64\n", " 3 long 102599 non-null float64\n", " 4 Construction year 102599 non-null float64\n", " 5 minimum nights 102599 non-null float64\n", " 6 number of reviews 102599 non-null float64\n", " 7 reviews per month 102599 non-null float64\n", " 8 review rate number 102599 non-null float64\n", " 9 calculated host listings count 102599 non-null float64\n", " 10 availability 365 102599 non-null float64\n", "dtypes: float64(9), int64(2)\n", "memory usage: 8.6 MB\n" ] } ], "source": [ "tmp.info()" ] }, { "cell_type": "markdown", "metadata": { "id": "F9i9Qk5a40ZU" }, "source": [ "#### **Задание 5 [0.5 баллa]**\n", "\n", "По аналогии с предыдущим кодом, замените пропуски на медианы по столбцам" ] }, { "cell_type": "code", "execution_count": 26, "metadata": { "id": "A7ahs_r65Bgm" }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
idhost idlatlongConstruction yearminimum nightsnumber of reviewsreviews per monthreview rate numbercalculated host listings countavailability 365
010012548001448571840.64749-73.972372020.010.09.00.214.06.0286.0
110021025233517282340.75362-73.983772007.030.045.00.384.02.0228.0
210024037882923955640.80902-73.941902005.03.00.00.745.01.0352.0
310027558509832601240.68514-73.959762005.030.0270.04.644.01.0322.0
410036899203759607740.79851-73.943992009.010.09.00.103.01.0289.0
\n", "
" ], "text/plain": [ " id host id lat long Construction year \\\n", "0 1001254 80014485718 40.64749 -73.97237 2020.0 \n", "1 1002102 52335172823 40.75362 -73.98377 2007.0 \n", "2 1002403 78829239556 40.80902 -73.94190 2005.0 \n", "3 1002755 85098326012 40.68514 -73.95976 2005.0 \n", "4 1003689 92037596077 40.79851 -73.94399 2009.0 \n", "\n", " minimum nights number of reviews reviews per month review rate number \\\n", "0 10.0 9.0 0.21 4.0 \n", "1 30.0 45.0 0.38 4.0 \n", "2 3.0 0.0 0.74 5.0 \n", "3 30.0 270.0 4.64 4.0 \n", "4 10.0 9.0 0.10 3.0 \n", "\n", " calculated host listings count availability 365 \n", "0 6.0 286.0 \n", "1 2.0 228.0 \n", "2 1.0 352.0 \n", "3 1.0 322.0 \n", "4 1.0 289.0 " ] }, "execution_count": 26, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# your code here\n", "temp = data_number.fillna(data_number.median())\n", "temp.head()" ] }, { "cell_type": "markdown", "metadata": { "id": "2xaLRuTn5Ivb" }, "source": [ "#### **Задание 6 [1 балл]**\n", "\n", "В чем основное преимущество замены на медиану по сравнению со средним с точки зрения анализа выбросов (аномальных значений)?" ] }, { "cell_type": "markdown", "metadata": { "id": "3eJRmvc05QUq" }, "source": [ "**Ваши выводы тут:** медиана значений устойчивей к выбросам больше, чем среднее." ] }, { "cell_type": "markdown", "metadata": { "id": "33YQN0C3BQlU" }, "source": [ "### Работа с пропусками в категориальных признаках\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "EHao1Lle_PEr" }, "outputs": [], "source": [ "data_object = data.select_dtypes('object') # выберем невещественные значения" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 469 }, "id": "MFmM_fwx585-", "outputId": "54d5b94e-84cc-43d0-a627-ba6ac178af8c" }, "outputs": [ { "data": { "application/vnd.google.colaboratory.intrinsic+json": { "type": "dataframe", "variable_name": "data_object" }, "text/html": [ "\n", "
\n", "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
NAMEhost_identity_verifiedhost nameneighbourhood groupneighbourhoodcountrycountry codeinstant_bookablecancellation_policyroom typepriceservice feelast reviewhouse_ruleslicense
0Clean & quiet apt home by the parkunconfirmedMadalineBrooklynKensingtonUnited StatesUSFalsestrictPrivate room$966$19310/19/2021Clean up and treat the home the way you'd like...NaN
1Skylit Midtown CastleverifiedJennaManhattanMidtownUnited StatesUSFalsemoderateEntire home/apt$142$285/21/2022Pet friendly but please confirm with me if the...NaN
2THE VILLAGE OF HARLEM....NEW YORK !NaNEliseManhattanHarlemUnited StatesUSTrueflexiblePrivate room$620$124NaNI encourage you to use my kitchen, cooking and...NaN
3NaNunconfirmedGarryBrooklynClinton HillUnited StatesUSTruemoderateEntire home/apt$368$747/5/2019NaNNaN
4Entire Apt: Spacious Studio/Loft by central parkverifiedLyndonManhattanEast HarlemUnited StatesUSFalsemoderateEntire home/apt$204$4111/19/2018Please no smoking in the house, porch or on th...NaN
\n", "
\n", "
\n", "\n", "
\n", " \n", "\n", " \n", "\n", " \n", "
\n", "\n", "\n", "
\n", " \n", "\n", "\n", "\n", " \n", "
\n", "
\n", "
\n" ], "text/plain": [ " NAME host_identity_verified \\\n", "0 Clean & quiet apt home by the park unconfirmed \n", "1 Skylit Midtown Castle verified \n", "2 THE VILLAGE OF HARLEM....NEW YORK ! NaN \n", "3 NaN unconfirmed \n", "4 Entire Apt: Spacious Studio/Loft by central park verified \n", "\n", " host name neighbourhood group neighbourhood country country code \\\n", "0 Madaline Brooklyn Kensington United States US \n", "1 Jenna Manhattan Midtown United States US \n", "2 Elise Manhattan Harlem United States US \n", "3 Garry Brooklyn Clinton Hill United States US \n", "4 Lyndon Manhattan East Harlem United States US \n", "\n", " instant_bookable cancellation_policy room type price service fee \\\n", "0 False strict Private room $966 $193 \n", "1 False moderate Entire home/apt $142 $28 \n", "2 True flexible Private room $620 $124 \n", "3 True moderate Entire home/apt $368 $74 \n", "4 False moderate Entire home/apt $204 $41 \n", "\n", " last review house_rules license \n", "0 10/19/2021 Clean up and treat the home the way you'd like... NaN \n", "1 5/21/2022 Pet friendly but please confirm with me if the... NaN \n", "2 NaN I encourage you to use my kitchen, cooking and... NaN \n", "3 7/5/2019 NaN NaN \n", "4 11/19/2018 Please no smoking in the house, porch or on th... NaN " ] }, "execution_count": 36, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data_object.head()" ] }, { "cell_type": "markdown", "metadata": { "id": "omDSwCDYBRl6" }, "source": [ "**Подход 1** Замена на определенную новую категорию\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 469 }, "id": "KcMV5o6C_WIa", "outputId": "2559f9b9-f45f-4150-f767-b0c4c431f251" }, "outputs": [ { "data": { "application/vnd.google.colaboratory.intrinsic+json": { "type": "dataframe", "variable_name": "tmp" }, "text/html": [ "\n", "
\n", "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
NAMEhost_identity_verifiedhost nameneighbourhood groupneighbourhoodcountrycountry codeinstant_bookablecancellation_policyroom typepriceservice feelast reviewhouse_ruleslicense
0Clean & quiet apt home by the parkunconfirmedMadalineBrooklynKensingtonUnited StatesUSFalsestrictPrivate room$966$19310/19/2021Clean up and treat the home the way you'd like...other
1Skylit Midtown CastleverifiedJennaManhattanMidtownUnited StatesUSFalsemoderateEntire home/apt$142$285/21/2022Pet friendly but please confirm with me if the...other
2THE VILLAGE OF HARLEM....NEW YORK !otherEliseManhattanHarlemUnited StatesUSTrueflexiblePrivate room$620$124otherI encourage you to use my kitchen, cooking and...other
3otherunconfirmedGarryBrooklynClinton HillUnited StatesUSTruemoderateEntire home/apt$368$747/5/2019otherother
4Entire Apt: Spacious Studio/Loft by central parkverifiedLyndonManhattanEast HarlemUnited StatesUSFalsemoderateEntire home/apt$204$4111/19/2018Please no smoking in the house, porch or on th...other
\n", "
\n", "
\n", "\n", "
\n", " \n", "\n", " \n", "\n", " \n", "
\n", "\n", "\n", "
\n", " \n", "\n", "\n", "\n", " \n", "
\n", "
\n", "
\n" ], "text/plain": [ " NAME host_identity_verified \\\n", "0 Clean & quiet apt home by the park unconfirmed \n", "1 Skylit Midtown Castle verified \n", "2 THE VILLAGE OF HARLEM....NEW YORK ! other \n", "3 other unconfirmed \n", "4 Entire Apt: Spacious Studio/Loft by central park verified \n", "\n", " host name neighbourhood group neighbourhood country country code \\\n", "0 Madaline Brooklyn Kensington United States US \n", "1 Jenna Manhattan Midtown United States US \n", "2 Elise Manhattan Harlem United States US \n", "3 Garry Brooklyn Clinton Hill United States US \n", "4 Lyndon Manhattan East Harlem United States US \n", "\n", " instant_bookable cancellation_policy room type price service fee \\\n", "0 False strict Private room $966 $193 \n", "1 False moderate Entire home/apt $142 $28 \n", "2 True flexible Private room $620 $124 \n", "3 True moderate Entire home/apt $368 $74 \n", "4 False moderate Entire home/apt $204 $41 \n", "\n", " last review house_rules license \n", "0 10/19/2021 Clean up and treat the home the way you'd like... other \n", "1 5/21/2022 Pet friendly but please confirm with me if the... other \n", "2 other I encourage you to use my kitchen, cooking and... other \n", "3 7/5/2019 other other \n", "4 11/19/2018 Please no smoking in the house, porch or on th... other " ] }, "execution_count": 37, "metadata": {}, "output_type": "execute_result" } ], "source": [ "tmp = data_object.fillna(\"other\") # обратите внимание на столбец house_rules в 4й строке\n", "tmp.head()" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "ijDgPrJaBpnz", "outputId": "fb59ee4f-bcbd-4651-b1a0-5c8b6631d353" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "RangeIndex: 102599 entries, 0 to 102598\n", "Data columns (total 15 columns):\n", " # Column Non-Null Count Dtype \n", "--- ------ -------------- ----- \n", " 0 NAME 102599 non-null object\n", " 1 host_identity_verified 102599 non-null object\n", " 2 host name 102599 non-null object\n", " 3 neighbourhood group 102599 non-null object\n", " 4 neighbourhood 102599 non-null object\n", " 5 country 102599 non-null object\n", " 6 country code 102599 non-null object\n", " 7 instant_bookable 102599 non-null object\n", " 8 cancellation_policy 102599 non-null object\n", " 9 room type 102599 non-null object\n", " 10 price 102599 non-null object\n", " 11 service fee 102599 non-null object\n", " 12 last review 102599 non-null object\n", " 13 house_rules 102599 non-null object\n", " 14 license 102599 non-null object\n", "dtypes: object(15)\n", "memory usage: 11.7+ MB\n" ] } ], "source": [ "tmp.info()" ] }, { "cell_type": "markdown", "metadata": { "id": "3bsLAtKYBS_E" }, "source": [ "**Подход 2** Замена на самую частую категорию по столбцам" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 503 }, "id": "_ty_mkMzAzm2", "outputId": "0dc59481-7878-4a50-d139-4ad61453c627" }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ ":1: FutureWarning: Downcasting object dtype arrays on .fillna, .ffill, .bfill is deprecated and will change in a future version. Call result.infer_objects(copy=False) instead. To opt-in to the future behavior, set `pd.set_option('future.no_silent_downcasting', True)`\n", " tmp = data_object.fillna(data_object.mode().iloc[0])\n" ] }, { "data": { "application/vnd.google.colaboratory.intrinsic+json": { "type": "dataframe", "variable_name": "tmp" }, "text/html": [ "\n", "
\n", "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
NAMEhost_identity_verifiedhost nameneighbourhood groupneighbourhoodcountrycountry codeinstant_bookablecancellation_policyroom typepriceservice feelast reviewhouse_ruleslicense
0Clean & quiet apt home by the parkunconfirmedMadalineBrooklynKensingtonUnited StatesUSFalsestrictPrivate room$966$19310/19/2021Clean up and treat the home the way you'd like...41662/AL
1Skylit Midtown CastleverifiedJennaManhattanMidtownUnited StatesUSFalsemoderateEntire home/apt$142$285/21/2022Pet friendly but please confirm with me if the...41662/AL
2THE VILLAGE OF HARLEM....NEW YORK !unconfirmedEliseManhattanHarlemUnited StatesUSTrueflexiblePrivate room$620$1246/23/2019I encourage you to use my kitchen, cooking and...41662/AL
3Home away from homeunconfirmedGarryBrooklynClinton HillUnited StatesUSTruemoderateEntire home/apt$368$747/5/2019#NAME?41662/AL
4Entire Apt: Spacious Studio/Loft by central parkverifiedLyndonManhattanEast HarlemUnited StatesUSFalsemoderateEntire home/apt$204$4111/19/2018Please no smoking in the house, porch or on th...41662/AL
\n", "
\n", "
\n", "\n", "
\n", " \n", "\n", " \n", "\n", " \n", "
\n", "\n", "\n", "
\n", " \n", "\n", "\n", "\n", " \n", "
\n", "
\n", "
\n" ], "text/plain": [ " NAME host_identity_verified \\\n", "0 Clean & quiet apt home by the park unconfirmed \n", "1 Skylit Midtown Castle verified \n", "2 THE VILLAGE OF HARLEM....NEW YORK ! unconfirmed \n", "3 Home away from home unconfirmed \n", "4 Entire Apt: Spacious Studio/Loft by central park verified \n", "\n", " host name neighbourhood group neighbourhood country country code \\\n", "0 Madaline Brooklyn Kensington United States US \n", "1 Jenna Manhattan Midtown United States US \n", "2 Elise Manhattan Harlem United States US \n", "3 Garry Brooklyn Clinton Hill United States US \n", "4 Lyndon Manhattan East Harlem United States US \n", "\n", " instant_bookable cancellation_policy room type price service fee \\\n", "0 False strict Private room $966 $193 \n", "1 False moderate Entire home/apt $142 $28 \n", "2 True flexible Private room $620 $124 \n", "3 True moderate Entire home/apt $368 $74 \n", "4 False moderate Entire home/apt $204 $41 \n", "\n", " last review house_rules license \n", "0 10/19/2021 Clean up and treat the home the way you'd like... 41662/AL \n", "1 5/21/2022 Pet friendly but please confirm with me if the... 41662/AL \n", "2 6/23/2019 I encourage you to use my kitchen, cooking and... 41662/AL \n", "3 7/5/2019 #NAME? 41662/AL \n", "4 11/19/2018 Please no smoking in the house, porch or on th... 41662/AL " ] }, "execution_count": 39, "metadata": {}, "output_type": "execute_result" } ], "source": [ "tmp = data_object.fillna(data_object.mode().iloc[0])\n", "tmp.head()" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "C_v4d-QjB9IA", "outputId": "1bb246ec-765a-43ee-9cfa-1aa7ba2519d6" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "RangeIndex: 102599 entries, 0 to 102598\n", "Data columns (total 15 columns):\n", " # Column Non-Null Count Dtype \n", "--- ------ -------------- ----- \n", " 0 NAME 102599 non-null object\n", " 1 host_identity_verified 102599 non-null object\n", " 2 host name 102599 non-null object\n", " 3 neighbourhood group 102599 non-null object\n", " 4 neighbourhood 102599 non-null object\n", " 5 country 102599 non-null object\n", " 6 country code 102599 non-null object\n", " 7 instant_bookable 102599 non-null bool \n", " 8 cancellation_policy 102599 non-null object\n", " 9 room type 102599 non-null object\n", " 10 price 102599 non-null object\n", " 11 service fee 102599 non-null object\n", " 12 last review 102599 non-null object\n", " 13 house_rules 102599 non-null object\n", " 14 license 102599 non-null object\n", "dtypes: bool(1), object(14)\n", "memory usage: 11.1+ MB\n" ] } ], "source": [ "tmp.info()" ] }, { "cell_type": "markdown", "metadata": { "id": "n17kJ6mg15yy" }, "source": [ "-------" ] }, { "cell_type": "markdown", "metadata": { "id": "ZQBgVAIvGoWG" }, "source": [ "### Работа с дублями" ] }, { "cell_type": "markdown", "metadata": { "id": "CCT_iGNKGqsQ" }, "source": [ "Иногда необходимо удалять дубли из данных, так как несколько одинаковых объектов не всегда указывают на их большую значимость для алгоритма. Дубли могут возникать также из-за ошибок ввода." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 423 }, "id": "hSOrKmppGurr", "outputId": "b4e0bb83-a707-45e5-b30e-3d5c8c66d0fd" }, "outputs": [ { "data": { "application/vnd.google.colaboratory.intrinsic+json": { "type": "dataframe", "variable_name": "data_geo" }, "text/html": [ "\n", "
\n", "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
latlong
040.64749-73.97237
140.75362-73.98377
240.80902-73.94190
340.68514-73.95976
440.79851-73.94399
.........
10259440.70862-73.94651
10259540.80460-73.96545
10259640.67505-73.98045
10259740.74989-73.93777
10259840.76807-73.98342
\n", "

102599 rows × 2 columns

\n", "
\n", "
\n", "\n", "
\n", " \n", "\n", " \n", "\n", " \n", "
\n", "\n", "\n", "
\n", " \n", "\n", "\n", "\n", " \n", "
\n", "
\n", "
\n" ], "text/plain": [ " lat long\n", "0 40.64749 -73.97237\n", "1 40.75362 -73.98377\n", "2 40.80902 -73.94190\n", "3 40.68514 -73.95976\n", "4 40.79851 -73.94399\n", "... ... ...\n", "102594 40.70862 -73.94651\n", "102595 40.80460 -73.96545\n", "102596 40.67505 -73.98045\n", "102597 40.74989 -73.93777\n", "102598 40.76807 -73.98342\n", "\n", "[102599 rows x 2 columns]" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data_geo = data[[\"lat\", \"long\"]].copy()\n", "data_geo" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 423 }, "id": "mQWczvELIu2v", "outputId": "1ba00e73-eb76-4d40-cbea-b910bfadeae3" }, "outputs": [ { "data": { "application/vnd.google.colaboratory.intrinsic+json": { "summary": "{\n \"name\": \"data_geo\",\n \"rows\": 67163,\n \"fields\": [\n {\n \"column\": \"lat\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 0.055961582329705606,\n \"min\": 40.49979,\n \"max\": 40.91697,\n \"num_unique_values\": 21991,\n \"samples\": [\n 40.85907,\n 40.68258,\n 40.68573\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"long\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 0.050278567228391156,\n \"min\": -74.24984,\n \"max\": -73.70522,\n \"num_unique_values\": 17774,\n \"samples\": [\n -73.97027,\n -73.98323,\n -73.85142\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n }\n ]\n}", "type": "dataframe" }, "text/html": [ "\n", "
\n", "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
latlong
040.64749-73.97237
140.75362-73.98377
240.80902-73.94190
340.68514-73.95976
440.79851-73.94399
.........
6828940.75330-73.99224
6829040.84722-73.93501
6829140.84753-73.94073
6829240.76181-73.93087
6829340.71135-73.96303
\n", "

67163 rows × 2 columns

\n", "
\n", "
\n", "\n", "
\n", " \n", "\n", " \n", "\n", " \n", "
\n", "\n", "\n", "
\n", " \n", "\n", "\n", "\n", " \n", "
\n", "
\n", "
\n" ], "text/plain": [ " lat long\n", "0 40.64749 -73.97237\n", "1 40.75362 -73.98377\n", "2 40.80902 -73.94190\n", "3 40.68514 -73.95976\n", "4 40.79851 -73.94399\n", "... ... ...\n", "68289 40.75330 -73.99224\n", "68290 40.84722 -73.93501\n", "68291 40.84753 -73.94073\n", "68292 40.76181 -73.93087\n", "68293 40.71135 -73.96303\n", "\n", "[67163 rows x 2 columns]" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data_geo.drop_duplicates()" ] }, { "cell_type": "markdown", "metadata": { "id": "FnCyMQZ71SMf" }, "source": [ "### Работа с вещественными выбросами (аномалиями)" ] }, { "cell_type": "markdown", "metadata": { "id": "SYm7ofprCk9N" }, "source": [ "Каждый признак в данных имеет свое распределение, которое описывает, как значения этого признака распределены по всему набору данных. Одним из способов выявления аномалий является использование интерквартильного размаха (IQR), который показывает диапазон значений между первым (Q1) и третьим квартилями (Q3).\n", "\n", "$$IQR = Q_3 - Q_1$$\n", "\n", "где $Q_1$ — первая квартиль — такое значение признака, меньше которого ровно 25% всех значений признаков. $Q_3$ — третья квартиль — значение, меньше которого ровно 75% всех значений признака.\n", "\n", "\n", "Аномалии могут быть определены как значения, выходящие за пределы диапазона\n", "\n", "$$[Q1 - 1.5 * IQR, Q3 + 1.5 * IQR]$$\n", "\n", " Такой подход позволяет эффективно находить выбросы, которые могут искажать анализ данных. Использование IQR помогает улучшить качество модели и повысить ее точность, исключая ненадежные данные." ] }, { "cell_type": "code", "execution_count": 27, "metadata": { "id": "xAQP4E4GEiHE" }, "outputs": [], "source": [ "import matplotlib.pyplot as plt\n", "import seaborn as sns\n", "\n", "sns.set()" ] }, { "cell_type": "markdown", "metadata": { "id": "RMpLXll-YN0J" }, "source": [ "В отображение графика box_plot (коробка с усами) уже входит отображение точек, выходящие за интерквартильный размах - в данном случает они выглядят как крулгые точки" ] }, { "cell_type": "code", "execution_count": 28, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 588 }, "id": "Xmw4hS1KEM9W", "outputId": "e90e4e35-52cb-465a-877f-26c080629743" }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAjwAAAImCAYAAABXQlBnAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAiHJJREFUeJztnQm8TeX+/x9DZjIPkeak4Roi6V6l4WrScOs2CJUiDSJCShNukkSiOUqjBho0KZoHooFkSkXImHkezv6/3t9/z/6tsx2cjnOctdb+vF+v0z577XV267HWetbn+Y4FEolEwgkhhBBCxJiC+X0AQgghhBB5jQSPEEIIIWKPBI8QQgghYo8EjxBCCCFijwSPEEIIIWKPBI8QQgghYo8EjxBCCCFijwSPEEIIIWKPBI8QQgghYk/h/D6AsEDB6YwMFZ0WQgghokLBggVcgQIFsrWvBM9fIHZWrFif34chhBBCiGxSvnxJV6hQ9gSPXFpCCCGEiD0SPEIIIYSIPRI8QgghhIg9EjxCCCGEiD0SPEIIIYSIPRI8QgghhIg9EjxCCCGEiD0SPEIIIYSIPRI8QgghhIg9qrQsRJqTkZHhZs2a4VatWuXKli3ratWq7QoW1FpICBEvJHiESGMmT57oXnrpObd8+bLktooVK7kWLVq7Bg0a5euxCSFEblIgQddM4bZvz1AvLZF2Ymfo0EGuTp367pxzznc1atR0Cxb87saMecNNmfKd69Chs0SPECICvbSyZ5GW4PkLCR6Rbm6sbt06msjp1KlrJhcWnw0ePMAtXDjf9e8/WO4tIUQsBI9mMiHSEGJ2cGNh2UkVNLxn+7JlS20/IYSIAxI8QqQhBCgDFp6sqF59/0z7CSFE1JHgESINIRsLiNnJCtxZwf2EECLqSPAIkYaQek42FgHKxOwE4T3bK1WqbPsJIUQckOARIg0hTofUc7KxCFCeM2e227hxo73ynu2XXtpKActCiNigLK2/UJaWSEeyqsODZQexo5R0IUTYUVp6DpDgEemKKi0LIaKKBE8OkOARQgghooXq8AghhBBCBJDgEUIIIUTskeARQgghROyR4BFCCCFE7JHgEUIIIUTskeARQgghROyR4BFCCCFE7JHgEUIIIUTskeARQgghROyR4BFCCCFE7JHgEUIIIUTskeARQgghROyR4BFCCCFE7JHgEUIIIUTskeARQgghROyR4BFCCCFE7JHgEUIIIUTskeARQgghROyR4BFCCCFE7JHgEUIIIUTsyRPBs2TJElerVq0dfkaPHm2fz5gxw7Vq1crVrVvXnXLKKe7ZZ5/N9PcZGRnuoYceck2aNLF92rVr5+bPn59pn919hxBCCCGEp7DLA2bOnOmKFi3qxo0b5woUKJDcXrp0abdy5UrXpk0bEym9evVyP/zwg72WLFnSXXjhhbbfI4884l588UXXr18/V7VqVXf//fe7tm3bujFjxrgiRYpk6zuEEEIIIfJU8MyePdsdeOCBrnLlyjt8NmLECLfPPvu43r17u8KFC7tDDjnEzZs3zz3xxBMmVrZs2eKGDx/uunbt6po2bWp/M2jQILP2fPDBB6558+bulVde2eV3CCGEEELkuUtr1qxZJkKyYvLkye64444zoeI5/vjj3dy5c93y5cvNOrR+/XrXuHHj5OdlypRxRx55pJs0aVK2vkMIIYQQYq9YeMqVK+datmzpfvvtN3fAAQe46667zp144olu8eLF7vDDD8+0v7cELVq0yD6HatWq7bCP/2x331GxYsUcHXfhworhFkIIIeJIrguebdu2uV9//dUdeuihrkePHq5UqVLunXfecddcc417+umn3aZNmywOJwjxPrB582a3ceNG+z2rfVavXm2/7+47ckLBggVcuXIlc/S3QgghhEgzwYObaeLEia5QoUKuWLFitu3oo492P//8sxs2bJhtI04niBcpJUqUSP4N+/jf/T7Fixe333f3HTkhIyPh1qzZkKO/FUIIIcTep0yZ4q5QoYL559IiWyqVww47zH3xxReWdbV06dJMn/n3VapUMQuR31azZs1M+5DaDrv7jpyybVtGjv9WCCGEEOEl14NWsOTUr1/frDxBpk2bZm6uhg0bum+//dZt3749+dmECRPcQQcd5CpUqOCOOOIIc4MF/37NmjVu+vTp9rewu+8QQgghhMhTwUN21sEHH2wp42RT/fLLL+7ee++1WjkELpM2vm7dOtezZ083Z84cK0b4zDPPuPbt29vfE5tDQcEBAwa48ePHW9ZW586dzarTrFkz22d33yGEEEIIEaRAIpFIuFyG1PAHHnjAff7552adIaWcujoNGjSwz6dOneruueces9pUqlTJXXXVVSZyPFhuBg4caEKGAGUsOnfeeaerUaNGcp/dfcff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EEIIEXtk4RFCiAiSkZHhZs2a4VatWuXKli3ratWqbSX6hRBZI8EjhBARY/Lkie6FF0a4FSv+TG4rX76Ca9nyCtegQaN8PTYhwoqWA0IIETGxM2TIwExiB3jPdj4XQuyILDwhqLAZ1oZxQojwubGefPLRXe7z1FOPuvr1G8q9JURcBA83/tChQ92rr77q1q5d6xo2bOjuvPNOt//++7uolRMPc5dcIUR4+OmnH92mTRt3uc/GjRttv2OOqbPXjktElz9X7vp6itOxRlbwPPLII+7FF190/fr1c1WrVnX333+/a9u2rRszZowrUqSIi1rvFIkeIf4eS5cucRs2rN+j75g799cdtpUoUTJHnaH3Bp9++lG295PgEdlhzLgd74G4EknBs2XLFjd8+HDXtWtX17RpU9s2aNAg16RJE/fBBx+45s2buzCLnZ11ypXoESJ7UHise/dOLpFI7NH33HXXrTtswxX00EOPWwn7sPHDD9/n6n5CnBPBwoNpJXhmzpzp1q9f7xo3bpzcVqZMGXfkkUe6SZMm5argmTdvrlu4cH629qVvyLp163a5z8kn/9s988xTmd5//PGHyffBzzylSpVy++1XPVvHUL36/u6AAw7M1r5ChI2/09unY8euWbp3/k45+/btO+ywrVix4nYc/ORlX5+csHXr5mwtnlL3E2JnpFPhwUgKnsWLF9trtWrVMm2vXLly8rPc4oUXnrFaF7lFUNzk5PPdQS2O22672+UHCsgOnyhYsWLFbmM+dsdXX32epSgoX758tv4+u6KAcXXvfpPbti3vevvkdq+fwoX3cf3756yvz5666w47rJb7/POPXeXKVd3SpYvt/c8/z8oXd93eviazIi+uSREvIil4CMqD1FidokWLutWrV+f4ewsX3jGr4fLL27iFCxdk6+8XLFjgNmzY0cIzbtwHyd9PO63Z3/68RIlSrkaNGtk6hurVa2Q5jrymZcuLdiqCXnjh1b1+PHFl+fJl7pbundzWbdsiIwr2KVzYDXjgIVexYqVd7se9szfFTm7A8XLcVapU3u2+c+f+lq25hPnt6aef3O1+iJugwMmOuw7atGnnihcvnq255MADD8reNXnLTW7r1uicu3322ccNGDB4t9fk3zlvu3oG/B2ee27YHj8DsnPeChUq+LcCgdeu2+K2bN3u8oIi+xRypUvtPvbWHyvHnpPn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yIueefPmmRBH1GF95CdK84gneLzcWwT0/uMf/3CHH364K1q0qMV13nHHHe6///2vu+uuu2w/rlXmmaiM78MPPzQBfs4559g8wjONuf+QQw4xSx3zzkknneRuuummSFjqJHhyiJ9MseRw0nnQoHbhpZdeci+++KJd+O3atYuspYfJlocHE22bNm1sG+ZaVmf4348//ngTP1GYrILHh3n2hx9+cNWrV7cHCwKHVTQPFs4jLgS2edN0FFbNjz32mMUMnHLKKW7BggUmfnh4XnLJJe6AAw4wKx3buCbhyy+/tOu0UqVKkRAF/n7zQpV4K8QO40GMI/AQ5Jxjxs/59O6hsMI1uO+++5rlDbHDOFhQEByKGDjssMNsPwQqCw8sBw0aNHC33nprZESPP29YqLhOeY/FgJgQLI9jxowx4c2DNArzSFZw3l599VW73nD/cF1edtllrly5cu7NN980kXrqqafamE888UQLAI4K69atszANnnNYhZkvWEixGORc9e3b102ePNkEbCSsPAge8ffIyMiw1/fffz9x/PHHJ/75z3/az//+97/kPi+++GLi3HPPTbRr1y5x7bXXJm6//fZE1Ni8eXPirLPOSvTq1WuH8ffp0ydRq1atxE033ZRpexgJHle/fv0S9erVS7Rq1cqO/4Ybbkj8+uuv9tl7772XOP/88xOXXXZZYvny5YkocemllyaOO+64xHXXXZe45pprElu3bk0MGTLEttWpUydx3333JX744Qfb96233rLxb9iwIRElpkyZkmjRokVi27Ztieuvv97O41FHHZW48sorbUzbt29PfPrpp4kLLrggsXr16kTYefbZZxNXXXWVHetPP/1k9xv3E2N6+OGHM+27bt26xIMPPpho3LhxYtiwYYko4O+7cePGJc4777zEv//978SJJ56YuPrqqxPTpk2ze4z78YQTTkg88cQTiagQnE8++eSTRLNmzRKTJ09OrF27NtG3b99EkyZNEkOHDk38+eefyXnlP//5j80r3JdhZtiwYfYc4/qbMWOGbVuxYoU9y5gvX3rpJdvGPQi///67bf/2228TUSD8y9cQwoqFIMPu3bvbD/ED+OBHjBhhyrdHjx4WJMp+n3zyicX0XH/99S7MZLWyYhWJa+C3336zLB9vHWBcWEfq169vgdp33nmn6927d2gtBf64nn32WVtRPvfcc2aW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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "data_new = data.select_dtypes('number').drop([\"id\", \"host id\"], axis=1)\n", "sns.boxplot(data_new)\n", "plt.xticks(rotation=45, ha='right')\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": 29, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 129 }, "id": "plM4BFgxChaJ", "outputId": "0e0246fb-adab-4d10-dc54-46064e06a9f5" }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
latlongConstruction yearminimum nightsnumber of reviewsreviews per monthreview rate numbercalculated host listings countavailability 365
0.2540.68874-73.982582007.02.01.00.222.01.03.0
0.7540.76276-73.932352017.05.030.02.004.02.0269.0
\n", "
" ], "text/plain": [ " lat long Construction year minimum nights \\\n", "0.25 40.68874 -73.98258 2007.0 2.0 \n", "0.75 40.76276 -73.93235 2017.0 5.0 \n", "\n", " number of reviews reviews per month review rate number \\\n", "0.25 1.0 0.22 2.0 \n", "0.75 30.0 2.00 4.0 \n", "\n", " calculated host listings count availability 365 \n", "0.25 1.0 3.0 \n", "0.75 2.0 269.0 " ] }, "execution_count": 29, "metadata": {}, "output_type": "execute_result" } ], "source": [ "quantiles = data_new.quantile([0.25, 0.75])\n", "quantiles" ] }, { "cell_type": "markdown", "metadata": { "id": "iAuoRrJTY7Kh" }, "source": [ "#### **Задание 7 [1 балл]**\n", "\n", "Посчитайте интерквартильный размах для всех признаков из `data_new`, удалите выбросы из `data_new` по предложенному правилу и отобразите новый очищенный датафрейм на аналогичном box_plot графике" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "mkLzRiQ_CP9j" }, "outputs": [], "source": [ "q1 = data_new.quantile(0.25)\n", "q3 = data_new.quantile(0.75)\n", "iqr = q3 - q1\n", "\n", "lower_bound = q1 - 1.5 * iqr\n", "upper_bound = q3 + 1.5 * iqr\n", "\n", "data_with_no_anomalies = data_new[~((data_new < lower_bound) | (data_new > upper_bound)).any(axis=1)]" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "JMIbNDRzJ5W3" }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAjMAAAImCAYAAACmSQvqAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAd5pJREFUeJztnQeYVcX9vwfEgigKKNYYO2osWFAxdo1GxZIYK2LvvRC7ohh77xULlmBPNPZeohiw9xIFKyCioIAN7v9555+5v7OXBRZY4Mzyvs+Dy957dz3DnDPzmW9tVqlUKkFEREQkU5pP7wsQERERmRIUMyIiIpI1ihkRERHJGsWMiIiIZI1iRkRERLJGMSMiIiJZo5gRERGRrFHMiIiISNYoZkRERCRrWoQZAIocjx1roWMREZFcaN68WWjWrFmDPjtDiBmEzLBhI6f3ZYiIiEgDadu2VZhppoaJGd1MIiIikjWKGREREckaxYyIiIhkjWJGREREskYxIyIiIlmjmBEREZGsUcyIiIhI1ihmREREJGsUMyIiIpI1ihkRERHJGsWMiIiIZI1iRkRERLJGMSMiIiJZM8lds7/77rtwwQUXhKeffjr88MMPoUOHDuGoo44Kq622Wnz/xRdfDOeee27473//GxZYYIFwyCGHhC222KL68z/99FM466yzwsMPPxx+/PHHsOGGG4YTTjghtG3btvqZif0OkYYyZMjgMGpU43dMn332VqF9+/ka/feKiMik06xSqVQm5Qf23HPP8PXXX4cePXqEdu3ahZtvvjncfffd4d577w38qj/96U9hjz32CFtttVUUPAif6667LnTu3Dn+/HHHHRf69+8fzjzzzDDLLLPE39OqVatwyy23xPcRMBP7HZPKmDFjw7Bhjb+hyfThm2+Ghu+/HzHRz40cOTKce+7p8b5sbJo3bx66dz8+3rsTY845W4d27eZp9GsQEWnKtG3bKsw0U/PGFzMDBw4Mm2yySbjtttvCqquuGl/jx3mtS5cu4ZtvvgnvvvtuuPPOO6s/g9UGa06vXr3C4MGDw/rrrx+uuuqqsN5668X3P/nkk/DHP/4x9OnTJ6y88srh5JNPnuDvmBwUM01LyBx9zGHh119+DbnQYuYW4ZyzL1bQiIhMJTEzSTEzbdq0Cddcc01YYYUVqq81a9Ys/hkxYkS0uNRaT9Zcc83w8ssvR9HD1/RaYrHFFgvzzTdf6NevX/x+Yr9DZmywyOQkZIDrbYglSUREpkHMTOvWrasWlcQjjzwSLTbHH398dDXNP//8dd5v3759GD16dPj222+jZQZBNOuss47zmUGDBsW/83VCv6MYWzMptGhhrHNTYO6554qWjpwEDdcbr9t7UESkHAHARV555ZUYA4ObCfcRAb3EwRRJ3//8889RkNS+D4gbAoNhYr9jcmjevFlo02bisQ1SfpjH6669LloCJwYB6gSXT62Ymb/97W9hjjnmaNAhAEEuIiIlEzOPP/546N69e1hllVXCeeedVxUltYIjfd+yZcsw22yz1StIEDK835DfMTmMHVsJI0aMmqyflfIx88ytQrt2Exen7dqFcMEFl8ZA4MaGwN9JyWb69ltjtkREJoXWrVs2OGZmssQMmUenn356DNw9++yzq5YT0qiHDBlS57N8P/vss4c555wzuo8I5EWcFK0vfIa4mYb8jsnl11/HTvbPSr60bTtv/DM18J4SESkHk+zEJ5PptNNOC127do0p00VRQq2Z//znP3U+37dv32i9wSxPBtTYsWOrgcApm4lYmk6dOjXod4iIiIgUmSR1gPA444wzwh/+8Iew3377haFDh8aaM/z5/vvvQ7du3cIbb7wR3U7Ui7n++utjcby99947/jzWF4rfnXjiieGll16Knz3yyCPD6quvHjp27Bg/M7HfISIiIjLZdWaoD3PhhRfW+x6F7qjs++yzz8bqvQMGDAgLL7xwrN67+eabVz83atSoKIjIgoJ11103ihuynBIT+x2TinVmRERE8mKqFc3LFcWMiIhIXky1onkiIiIiZUMxIyIiIlmjmBEREZGsUcyIiIhI1ihmREREJGsUMyIiIpI1ihkRERHJGsWMiIiIZI1iRkRERLJGMSMiIiJZo5gRERGRrFHMiIiISNYoZkRERCRrFDMiIiKSNYoZERERyRrFjIiIiGSNYkZERESyRjEjIiIiWaOYERERkaxRzIiIiEjWKGZEREQkaxQzIiIikjWKGREREckaxYyIiIhkjWJGREREskYxIyIiIlmjmBEREZGsUcyIiIhI1ihmREREJGsUMyIiIpI1ihkRERHJGsWMiIiIZI1iRkRERLJGMSMiIiJZo5gRERGRrFHMiIiISNYoZkRERCRrFDMiIiKSNYoZERERyRrFjIiIiGSNYkZERESyRjEjIiIiWaOYERERkaxRzIiIiEjWKGZEREQkaxQzIiIikjWKGREREckaxYyIiIhkjWJGREREskYxIyIiIlmjmBEREZGsUcyIiIhI1ihmREREJGsUMyIiIpI1ihkRERHJGsWMiIiIZI1iRkRERLJGMSMiIiJZo5gRERGRrFHMiIiISNYoZkRERCRrFDMiIiKSNYoZERERyRrFjIiIiGSNYkZERESyRjEjIiIiWaOYERERkaxRzIiIiMiMK2auvvrq0K1btzqvnXjiiaFDhw51/my44YbV98eOHRsuueSSsM4664SOHTuGffbZJ3z22Wd1fse7774bdtlll/g+P9u7d+8puUwRERFpwky2mLn11lvDRRddNM7r77//fth///3D888/X/1z1113Vd+/4oorwm233RZOO+200KdPnyhu9t577/Dzzz/H97/99tuwxx57hEUWWSTcfffd4aCDDgrnnXde/LuIiIhILS3CJDJ48ODQo0eP8NJLL4VFF120znuVSiV89NFHYd999w3zzjvvOD+LYLn++utD9+7dw/rrrx9fu/DCC6OV5tFHHw1dunQJd9xxR5h55plDz549Q4sWLcISSywRBg4cGK655pqw7bbbTurlioiISBNnki0zb7/9dhQb9913X1hppZXqvPfpp5+GUaNGhcUXX7zen33vvffCyJEjQ+fOnauvtW7dOiy33HKhX79+8fv+/fuH1VdfPQqZxJprrhkGDBgQhg4dOqmXKyIiIk2cSbbMEMNSjIEp8sEHH8SvN998c3j22WdD8+bNw7rrrhuOOOKIMOecc4ZBgwbF9xdYYIE6P9e+ffvqe3xdeumlx3kfvvrqqzDPPPOEyaFFC2OdRUREmiKTLGYmBGIGAYP4uOqqq6Kl5pxzzgkffvhhuOmmm8Lo0aPj52aZZZY6PzfrrLOG4cOHx7//+OOP9b4PP/3002RdV/PmzUKbNq0mc1QiIiIyw4iZAw44IOy8886hTZs28XssLMTObL/99uHNN98Ms802WzV2Jv09iZSWLVvGv/N6CgYuvg+zzz77ZF3X2LGVMGLEqMkel4iIiExbWrduGWaaqfm0FzNYZZKQSSy11FJV91FyLw0ZMiRmKyX4nhRumH/++eP3RdL3880332Rf26+/jp3snxUREZHy0qiBJEcffXTYfffd67yGRQaWXHLJsMwyy4Q55pgjZkIlRowYEd55553QqVOn+D1fX3755TBmzJjqZ/r27RsWW2yx0K5du8a8XBEREWkCNKqY2XTTTcOLL74YLrvsshgv88wzz4Tjjz8+plyTYk0sDMXwqBvzxBNPxOwmgoOxxmyyySbxd5B+/cMPP4QTTjghpnnfc8894cYbbwz77bdfY16qiIiINBEa1c200UYbxUJ61IS59tprYwbTlltuGQ4//PDqZw499NDw66+/xkrBBPtiienVq1dM9wasL9ddd104/fTTw5/+9KcYc4PFh7+LiIiI1NKsQqW7Js6YMWPDsGEjp/dliIiISANp27ZVgwOALb4iIiIiWaOYERERkaxRzIiIiEjWKGZEREQkaxQzIiIikjWKGREREckaxYyIiIhkjWJGREREskYxIyIiIlmjmBEREZGsUcyIiIhI1ihmREREJGsUMyIiIpI1ihkRERHJGsWMiIiIZI1iRkRERLJGMSMiIiJZo5gRERGRrFHMiIiISNYoZkRERCRrFDMiIiKSNYoZERERyRrFjIiIiGSNYkZERESyRjEjIiIiWaOYERERkaxRzIiIiEjWKGZEREQkaxQzIiIikjWKGREREckaxYyIiIhkjWJGREREskYxIyIiIlmjmBEREZGsUcyIiIhI1ihmREREJGsUMyIiIpI1ihkRERHJGsWMiIiIZI1iRkRERLJGMSMiIiJZo5gRERGRrFHMiIiISNYoZkRERCRrFDMiIiKSNYoZERERyRrFjIiIiGSNYkZERESyRjEjIiIiWaOYERERkaxRzIiIiEjWKGZEREQkaxQzIiIikjWKGREREckaxYyIiIhkjWJGREREskYxIyIiIlmjmBEREZGsUcyIiIhI1ihmREREJGsUMyIiIpI1ihkRERHJGsWMiIiIZI1iRkRERLJGMSMiIiJZo5gRERGRrFHMiIiISNYoZkRERGTGFTNXX3116NatW53X3n333bDLLruEjh07hg033DD07t27zvtjx44Nl1xySVhnnXXiZ/bZZ5/w2WefTdLvEBEREZliMXPrrbeGiy66qM5r3377bdhjjz3CIossEu6+++5w0EEHhfPOOy/+PXHFFVeE2267LZx22mmhT58+Udzsvffe4eeff27w7xARERFJtAiTyODBg0OPHj3CSy+9FBZddNE6791xxx1h5plnDj179gwtWrQISyyxRBg4cGC45pprwrbbbhsFy/XXXx+6d+8e1l9//fgzF154YbTSPProo6FLly4T/R0iIiIiU2SZefvtt6PYuO+++8JKK61U573+/fuH1VdfPYqQxJprrhkGDBgQhg4dGt57770wcuTI0Llz5+r7rVu3Dsstt1zo169fg36HiIiIyBRZZohh4U99DBo0KCy99NJ1Xmvfvn38+tVXX8X3YYEFFhjnM+m9if2OeeaZJ0wOLVoY6ywiItIUmWQxMyF+/PHHMMsss9R5bdZZZ41ff/rppzB69Oj49/o+M3z48Ab9jsmhefNmoU2bVpP1syIiIjIDiZnZZputGsibSAJk9tlnj+8Dn0l/T59p2bJlg37H5DB2bCWMGDFqsn5WREREpj2tW7cMM83UfNqLmfnnnz8MGTKkzmvp+/nmmy/8+uuv1dfIVip+pkOHDg36HZPLr7+OneyfFRERkfLSqIEknTp1Ci+//HIYM2ZM9bW+ffuGxRZbLLRr1y4ss8wyYY455oiZUIkRI0aEd955J/5sQ36HiIiIyFQTM6RO//DDD+GEE04IH330UbjnnnvCjTfeGPbbb7/4PrEwFMOjbswTTzwRs5uOOOKIaI3ZZJNNGvQ7RERERKaamwnLyXXXXRdOP/308Kc//SnMO++84eijj45/Txx66KHR3XTiiSfGYF8sMb169Yrp3g39HSIiIiKJZpVKpRKaOGPGjA3Dho2c3pchIiIiDaRt21YNDgC2+IqIiIhkjWJGREREskYxIyIiIlmjmBEREZGsUcyIiIhI1ihmREREJGsUMyIiIpI1ihkRERHJGsWMiIiIZI1iRkRERLJGMSMiIiJZo5gRERGRrFHMiIiISNYoZkRERCRrFDMiIiKSNYoZERERyRrFjIiIiGSNYkZERESyRjEjIiIiWaOYERERkaxRzIiIiEjWKGZEREQkaxQzIiIikjWKGREREckaxYyIiIhkjWJGREREskYxIyIiIlmjmBEREZGsUcyIiIhI1ihmREREJGsUMyIiIpI1ihkRERHJGsWMiIiIZI1iRkRERLJGMSMiIiJZo5gRERGRrFHMiIiISNYoZkRERCRrFDMiIiKSNYoZERERyRrFjIiIiGSNYkZERESyRjEjIiIiWaOYERERkaxRzIiIiEjWKGZEREQkaxQzIiIikjWKGREREckaxYyIiIhkjWJGREREskYxIyIiIlmjmBEREZGsUcyIiIhI1ihmREREJGsUMyIiIpI1ihkRERHJGsWMiIiIZI1iRkRERLJGMSMiIiJZo5gRERGRrFHMiIiISNYoZkRERCRrFDMiIiKSNYoZERERyRrFjIiIiGSNYkZERESyRjEjIiIiWaOYERERkaxpdDEzePDg0KFDh3H+3HPPPfH9d999N+yyyy6hY8eOYcMNNwy9e/eu8/Njx44Nl1xySVhnnXXiZ/bZZ5/w2WefNfZlioiISBOhRWP/wvfeey/MOuus4fHHHw/NmjWrvj7nnHOGb7/9Nuyxxx5RxJx66qnhtddei19btWoVtt122/i5K664Itx2223hrLPOCvPPP38499xzw9577x3uv//+MMssszT25YqIiEjmNLqY+eCDD8Kiiy4a2rdvP857N910U5h55plDz549Q4sWLcISSywRBg4cGK655pooZn7++edw/fXXh+7du4f1118//syFF14YrTSPPvpo6NKlS2NfroiIiGROo7uZ3n///ShS6qN///5h9dVXj0Imseaaa4YBAwaEoUOHRqvOyJEjQ+fOnavvt27dOiy33HKhX79+jX2pIiIi0gSYKpaZNm3ahK5du4ZPPvkk/Pa3vw0HHHBAWHfddcOgQYPC0ksvXefzyYLz1VdfxfdhgQUWGOcz6b3JpUULY51FRESaIo0qZn799dfw8ccfhyWXXDIce+yxYY455ggPPPBA2HfffcMNN9wQfvzxx3HiXoivgZ9++imMHj06/r2+zwwfPnyyr6t582ahTZtWk/3zIiIiMoOIGdxHL730UphpppnCbLPNFl9bfvnlw4cffhh69eoVXyMupggiBmafffbqz/CZ9Pf0mZYtW072dY0dWwkjRoya7J8XERGRaUvr1i3DTDM1nz5uJjKTallqqaXC888/H7OThgwZUue99P18880XLTvptUUWWaTOZ0jvnhJ+/XXsFP28iIiIlJNGDSTBArPKKqtE60yRt956K7qeOnXqFF5++eUwZsyY6nt9+/YNiy22WGjXrl1YZpllomuq+PMjRowI77zzTvxZERERkakqZshiWnzxxWPqNZlL//3vf8OZZ54Z68kQBEz69Q8//BBOOOGE8NFHH8VCejfeeGPYb7/9qrEyFNQ777zzwhNPPBGzm4444oho0dlkk00a81JFRESkidCsUqlUGvMXkmJ9/vnnh+eeey5aVUirpm7MaqutFt9/4403wumnnx6tLfPOO2/Yc889o4BJYLW54IILotAhYBiLzMknnxwWXnjhyb6mMWPGhmHDRjbK+ERERGTq07ZtqwbHzDS6mCkjihkREZGmK2YsviIiIiJZo5gRERGRrFHMiIiISNYoZkRERCRrGr1onoiIiOTFkCGDw6hRjZ8oM/vsrUL79vOFqY1iRkREZAbm++9HhKOPPixMjeTm5s2bh0suuTrMOWfrMDUxNVtERGQGZ0gDLTNffvlFuPrqy8J++x0cFlxwoalqmZmU1GwtMyIiIjM47SdRcCBkFl108VAWDAAWERGRrFHMiIiISNYoZkRERCRrFDMiIiKSNYoZERERyRrFjIiIiGSNYkZERESyRjEjIiIiWaOYERERkaxRzIiIiEjWKGZEREQkaxQzIiIikjWKGREREckaxYyIiIhkjWJGREREskYxIyIiIlmjmBEREZGsUcyIiIhI1ihmREREJGsUMyIiIpI1ihkRERHJGsWMiIiIZI1iRkRERLJGMSMiIiJZo5gRERGRrFHMiIiISNYoZkRERCRrFDMiIiKSNYoZERERyRrFjIiIiGSNYkZERESyRjEjIiIiWaOYERERkaxpMb0vQERERBqfb74ZGr7/fkSj/s4vv/yiztfGZM45W4d27eaZrJ9tVqlUKqGJM2bM2DBs2MjpfRkiIiLTBITMscceHn7++ZeQC7PMMnM466yLqoKmbdtWYaaZGuZA0jIjIiLSxPj++xFRyGy58eKhXZuWoex88+3ocP/jH8frnhzrjGJGRESkidKuTcsw/7ytQlPHAGARERHJGsWMiIiIZI1iRkRERLJGMSMiIiJZo5gRERGRrFHMiIiISNYoZkRERCRrFDMiIiKSNYoZERERyRrFjIiIiGSNYkZERESyRjEjIiIiWWOjSRHJkt1222Gc12666fbpci0iMn3RMiMiTULITOh1EWnaKGZEJCsmJlgUNCIzHooZEcmGhgoVBY3IjIViRkRERLLGAOBG5IUXXghXX31x9fv99jssrLXWWtP1mkRERJo6WmYaCczaRSEDfK+5W0REZOqiZaYRqBUsiy66eBgw4OM675syKiIi05pvvh0dZoTrVMw0gmspcdRRx4QVV1yl+v0bb7wSzj//7OrndDmJiMi05P7H/+9g3ZSZocXMwIEDwhdffNagz3755Rfhhx9+GOf1p556rPr3V155Jf6pD1xOH3zwzjivzzHHHGHBBRdq0DUstNBvwm9/u2iDPiuSM0OGDA6jRo2cot9RtI4mZp+9VWjffr4p+r0iObHlxouHdm1ahhwsM1MivGZoMXPrrTeG999/t9F+X1HYTM77E6NDh2XD8cefMkW/Q2YscqyS+/33I8LRRx8WKpXKFP2eHj2OG+e15s2bh0suuTrMOWfrKfrdIrnQrk3LMP+8rUJTp5RiZuzYseGyyy4Ld955Z/j+++9Dp06dwsknnxx+85vfNOr/p2vX3RvVMrPBBn+Y5Pcn1TIj0hhVcsssaBAa55xzcb2WmfoEyvg49dQz67XM5CBkchSh8v9x7qYPpRQzV1xxRbjtttvCWWedFeaff/5w7rnnhr333jvcf//9YZZZZmm0/w8umyl12yy99HLVLKZVVlllnJiZJGZM05ayVckt8wLbGK4gAvFzJFcRKs7d9KRZZUptuY3Mzz//HNZcc83QvXv3sPPOO8fXRowYEdZZZ51w+umnhy5dukzy7xwzZmwYNmzK/O+TcgP/5jeLhM8++7TOa97IMq0o3o8tWswWevW6qfr9XnvtFn799cfpcl9+883Q6EKaUhpinanPKjOpYMFp126eMC1pSCkH15JyUra5GzDg4/is7L7d77JwMw36emS48c6347ObDiJt27YKM83UPE/LzHvvvRdGjhwZOnfuXH2tdevWYbnllgv9+vWbLDEzteEGLd7IChkpS5DsSSf1qBMIy/dFMTCtgmQRMsccc0T45Zefw7RgUtxR42PmmWcJZ5994TQTNLWbYXHdKL7nKb98OHfTn9KJmUGDBsWvCyywQJ3X27dvX32vjHCDWgFYplWG3ejRo0Pv3r2meFMf3/u77rpXaNmyZaNl2GGRQcjM13apMPPMs4fG4PPBr4/z2sLzrdQov/uXX0aFwcM+jNfdEDEzKVanYcOGhR9/nHBNjf32Ozi88MJzdb6/+urLqt8X30vMNlvL0LZt20a3OjVG1ueUMrWyPidlbA0dH7GRN954XZ3vi7GTxfcSZrU2QTHDIg21sTGzzjprGD58+GT/3hYtpn6x43XXXTv+EZlcbrvtpvDee+Om8E9rGiKUYJlllgsnnXTqRD8399xzxUwiBMLUpD6BM7lwvVz3xNaOoUO/jtlXv/76a6P9v4vCZXLenxgtWrQI559/SZhnnnmzuScbSkPvyak1tqmd1drQ8c30P/dMbkXzuO7J2a9LJ2Zmm222auxM+jv89NNPDTop1kfz5s1Cmzbl9xmKHHTQAeHTT+u6KcfHd999F5+LWnr37l3n+1133bVB7xUPDnPPPXeDrmGRRRZp0LPFZy644ILwxRdfTPSzo0aNCpdffnmYGjRr1iwceOCBYfbZJ24dWmihhcJSS038BPzLLyNjBmZOcL1zzTV7g+ZuUu5JPje1LDPca415T07q2CY0vgceeKD69y222GKS358a4/vll/nCrLPMklXRPK534YXnm6z9unQBwG+88UbYbrvtwmOPPVZncnfaaafQoUOHcMopp0xWAPCIEXmoU5HGoGvX7Sb6mVtvvTOUOR6I2LnGplWrqVM077///SgMGvRVgz47fPh38bBWy5139qnz/Xbb7dig9xJYs+eaq2EidP75FwhLLLFkgz4rk/68FZ+tCb03tRk69OtY3mRi8KydddZpU1zbaXwWzmOOOTE+exNjzjnnrGMtbN26ZYMDgEsnZnjICf499thjo6gpZjOdccYZ9ara6Z3NJJJbdoVBiOWkbBkxMuPM3ZBGqLpdH1OSUDAp2UylEzNw4YUXhj59+kTxgqmXOjOff/55+Ne//hVmnnnmSf59ihmZUbGAV34oQvPFuWtcshczY8aMif71e+65J/z444/VCsALL7zwZP4+xYyI5IMiNF+cu8YjezHT2ChmRERE8iLronlSTjxtiIhIWZn6xVekSfcbERERmd4oZmSKGxaKiIhMT4yZkSnuN1L7noiIyJRiAHANM6KYaYx+KsWy2/QXmdT37TciIiKTi2KmhhlRzJxxxinh/fffDbnQocOy4fjjJ726s4iINE3MZpLQtevu2VlmREREJgctMzJejJkREZHphW6mGhQzM26/ERERafpixtRsmSKhopAREZHpjWJGJsr4BItCRkREyoBuJhERESkduplERERkhkExIyIiIlmjmBEREZGsUcyIiIhI1ihmREREJGsUMyIiIpI1ihkRERHJGsWMiIiIZI1iRkRERLJmhqgAzBDHjm3ywxQREWkyNG/eLDRr1qxBn50hxIyIiIg0XXQziYiISNYoZkRERCRrFDMiIiKSNYoZERERyRrFjIiIiGSNYkZERESyRjEjIiIiWaOYERERkaxRzIiIiEjWKGZEREQkaxQzIiIikjWKGREREckaxYyIiIhkjWJGmjQ2hReRxuCXX36Z3pcgE0Ax0wB++OGH6t/Hjh07Xa9FGg5z1axZs/j377//fnpfjsgMQVM8QHz00UfhnnvuqX7/448/hqbEZZddFgYNGhRypsX0voCy8/PPP4d//OMfYdVVVw3LLrtsaN68eZPb8Itjqv0+5wU1jeOiiy6Ki88hhxwSWrVqFZoCTWWeJmU+kzDNmaYyjgnB+F588cUwZMiQsPXWW4emMqZTTz01fPzxx2HOOecMCy64YBzbTDPNFHJnxx13DN99913Yd999Q87MOKvhZDJixIjwr3/9K9xwww3h2muvDX/729+azOmjuOE/8MAD8SvfNwXrU9ownnrqqfD444/HhWf22WcPTU3IcGL84IMPwqeffhqaCunZwiI6cuTIMGbMmCYhADgYpXEMGzYsft8U1pFEGsubb74ZDjvssDDzzDPHMTYFFltssXD55ZeHW2+9NVoxVlpppSYhZHbaaafoPsPqNMsss2R9PypmJsI888wTdtlll/Dyyy+HCy64IMw999zx9dwX16ILho3wqKOOin+akqBBxJx77rlh8cUXj1Y1NsWmJEAvvPDCcPDBB8cF6aWXXgpNgWS5QITuv//+Ydtttw3XXXddnfdz45lnnonXzWYBV1xxRdhrr71C165d4wb566+/hqYA8/bOO+/E8W222WZh8803Dy1aNA3jP8/c6NGj41wxpj59+mR5LxZhX8Nifffdd1cPeqyRuQrQpnGnTeWFtUOHDuHbb78N7du3jxv/e++9F5ZZZpnQFDbESy+9NLz99tuhdevW0TrDA8tilARNjq6MtMh888038XT4wgsvxJNw27Zt48Oa84kqCdBLLrkkLqgXX3xxHCMnRxahwYMHh9/85jch5/E98cQT4cgjjwx77713aNeuXVhnnXXqvJ8TWHM5zTMWNo8bb7wxWnkx6SNAH3nkkXifHn/88XEec4a1gzWkX79+1fWR9SPXZ652/evcuXMU2VieOPjxvOF6ypFh/7MMzj///NXXsPJyvyZX2u9///souGebbbaQA80qucvLaQCm7i+++CJu+tdff31Ycsklw3777Vd9YNM/YY4LLafes88+O8aScBOzSf7ud78L11xzTfxMLoKmeJ08pJyCee3JJ58MZ511VhRrjDVHQfPZZ5/FTZ3TE2NCWB9xxBHhgAMOiAvsf//73ygA7r333uiaYePcbbfdQm4wNgK1schsvPHG0XqBm7dv377R1UsMBptIp06dsok9+fLLL8OZZ54Z148//OEP4d133w3bb799WHvttcNPP/0UDw7co8TknXDCCdkLmoEDB0aRjWDDasifnNaRRPF6ebYIjl1xxRXD0ksvHWadddYYR3nSSSeFv/zlL6FHjx7xc9yrrDO5jO+xxx6L4nrLLbeM6wh7Gmv/EkssES1srDvrrbdeOPzww7OwsClm6iEtlFhgmFA2EVQq/P3vfw+33XZbvKn32WefbC00LKRsDCyie+yxR3wNEyqnKvzda665ZhQ2OSxExevDZPraa6+FhRZaKG4aiBdOv2wazCNmfV5L5uIcTrtXXXVV9NFvuOGG4fPPP4/Cho1xhx12CL/97W+jdY3XuCfh3//+d7xP55133iw2/PS8JRFKfBNChvEgtBFviG3mmPEzn8llU1a4B+eaa65oMUPIMA4OCwRastEvtdRS8XOITw4VnPhXW221cNxxx2UjaNK8YVniPuV7TvrEYGAxvP/++6OoZpPMYR2pD+btzjvvjPcbLhnuy5133jm0adMm/POf/4wCdKONNopjXnfddWMwbS788MMPMXSCfQ5rLusFhyQOeszVGWecEfr37x/FaRbWGcSM/B9jx46NXx9++OHKmmuuWfn9738f//ztb3+rfua2226rbLXVVpV99tmnsv/++1dOPPHESm789NNPlc0337xy6qmnjjP+0047rdKhQ4fK4YcfXuf1MlK8rrPOOquy8sorV3bZZZd4/QcddFDl448/ju899NBDlW222aay8847V4YOHVrJiR133LGy+uqrVw444IDKvvvuW/nll18ql156aXxtpZVWqpx99tmV1157LX72vvvui+MfNWpUJSdef/31yk477VT59ddfKwceeGCcx9/97neV3XffPY5pzJgxlWeeeaby5z//uTJ8+PBK2endu3dlzz33jNf69ttvx+eN54kxXX755XU++8MPP1QuuuiiSufOnSu9evWq5EB67h5//PHK1ltvXfnDH/5QWXfddSt77bVX5a233orPGM/jWmutVbnmmmsquVBcT55++unKJptsUunfv3/l+++/r5xxxhmVddZZp3LZZZdVvvnmm+q68qc//SmuKzyXZaZXr15x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Gz1CFTcM8BoijpMvbs+ybogE1GMRw1LBM0Z8DM9diitEzDBO3BLcp1T7xZrNe4hR3PEI7bJSn3jE6o5wYY3Aig0IGv7OVyw2jKsYlF62eQPWRkIkmDdKOLCecDAlZALvAgeklP7PfoBbieeP/a6Wsq6X9TK906nKxLPPPltZdtllKzfccEP8nlTQFVZYIaYdbrjhhjHFssyQvlof5513XkyxIzVvxIgRdd678sorK/vtt1/1Z0lBhNGjR1fKyJ133hlT5knlTSn0jO2FF16IabAffvhh5dhjj61sv/32lSOPPLLy888/10k3LDP/+te/Yppn165dYzr2yJEjq++RHkoZAN7nc7WUPS2UlNfPP/88plavscYasbwBr5EaSumDe+65J6Yv88wx9lVWWaUyZMiQSi68+uqrMb36qaeeqt5vDz74YKVjx46VY445pvo5UmL5TJqvMpY84DniGSL1/5Zbbql89913MSW5T58+sQTASy+9VNlggw1iKv37778fn8Xu3bvH0gGk/n700UeVXLjpppsqt956a53XBgwYUOnZs2dcZ0ixTzC2sq8ju+++e6VLly4xpXz55ZevpsVzn+22225xraSUSLF0w3vvvRd/hrUzZxQz9QiaZZZZpnL99dfH7z/77LPKBx98UPqFtShkXnnllcpzzz0X63MkzjzzzCjUbr755qpgSaQFlQe1bItrrUCjpsr5559fFTJsFnfccUdcQKlP8u2338b3eFjTWMq80deO74EHHojimc081Y5JUO+BMVLPA/GWIyycCOgVV1wx1gG6995743166KGH1tkEBw0aVMkF5qVTp05xTNQmSXDfMZ/co4iDWsp8X7Khn3766VHEUB+H+w6xmaDOytprr1054ogjKrnCGBgb4vruu++u897AgQMrO+ywQ5xTajrlMG8nnXRSZbvttotilBoxf/3rXytHHXVU9X3WRupUcUDnGURY//e//63svffesTbV+A7DuaCbqR6XEyZ9SsWTFkt+PkGxufRawg+PyZBrx2yI++yUU06JUev4PzF5Y14l2DJFtyeffRlNimlcqVQ4wb24l6iYypiIkcHPTbwFGT/EnZC2TN0HYFxl9fkW5w33BD5rzPUEGWISJg4GM3+KdSKImfgFMpmICcqpkjZBhcwdMWqMiWwzXC6Y7YlLw9yNKxd3G5TZvVTrouBaicli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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "sns.boxplot(data_with_no_anomalies)\n", "plt.xticks(rotation=45, ha='right')\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": { "id": "3f7bWt5EZVGl" }, "source": [ "#### **Задание 8 [1 балл]**\n", "\n", "Почему на получившемся графике все еще отображаются точки (аномалии)?" ] }, { "cell_type": "markdown", "metadata": { "id": "2uj4nQCoZbMI" }, "source": [ "**Ваши выводы тут:** seaborn ищет выбросы уже на новых данных, таким образом появляются новые аномалии, ведь значения квантилей могут измениться" ] }, { "cell_type": "markdown", "metadata": { "id": "hnMUSMAESrPy" }, "source": [ "### Работа с категориальными выбросами (аномалиями)" ] }, { "cell_type": "markdown", "metadata": { "id": "qgoePXv7aFq0" }, "source": [ "Анализ встречаемости категориальных признаков позволяет выявить категории с низкой частотой. Их можно объединить, что ускорит обучение алгоритмов и может улучшить качество модели. Этот подход также помогает обнаружить битые данные, о чем мы поговорим далее." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 334 }, "id": "6Lf-iSBhW38m", "outputId": "5f9a3d63-6340-441c-f1cd-32c9eb9e1509" }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
count
neighbourhood group
Manhattan43792
Brooklyn41842
Queens13267
Bronx2712
Staten Island955
brookln1
manhatan1
\n", "

" ], "text/plain": [ "neighbourhood group\n", "Manhattan 43792\n", "Brooklyn 41842\n", "Queens 13267\n", "Bronx 2712\n", "Staten Island 955\n", "brookln 1\n", "manhatan 1\n", "Name: count, dtype: int64" ] }, "execution_count": 20, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data_new = data.select_dtypes('object')\n", "value_counts = data_new[\"neighbourhood group\"].value_counts(ascending=False)\n", "value_counts" ] }, { "cell_type": "markdown", "metadata": { "id": "uBYh1L5feXCX" }, "source": [ "Например, в признаке `neighbourhood group` всего 2 выделяющихся значений: их можно как и записать в категорию `other`, так и в целом удалить из данных" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 303 }, "id": "az1WB8slcdWK", "outputId": "c37caa96-3ab5-42ef-802e-765104a34839" }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
count
neighbourhood group
Manhattan43792
Brooklyn41842
Queens13267
Bronx2712
Staten Island955
other2
\n", "

" ], "text/plain": [ "neighbourhood group\n", "Manhattan 43792\n", "Brooklyn 41842\n", "Queens 13267\n", "Bronx 2712\n", "Staten Island 955\n", "other 2\n", "Name: count, dtype: int64" ] }, "execution_count": 21, "metadata": {}, "output_type": "execute_result" } ], "source": [ "column_name = \"neighbourhood group\"\n", "data_new[data_new[column_name].isin(value_counts[value_counts <= 100].index)] = \"other\"\n", "data_new[\"neighbourhood group\"].value_counts(ascending=False)" ] }, { "cell_type": "markdown", "metadata": { "id": "ytMfh7wZjgKQ" }, "source": [ "---" ] }, { "cell_type": "markdown", "metadata": { "id": "LXLhhjepe9ky" }, "source": [ "# Часть 2. Обработка категориальных признаков" ] }, { "cell_type": "markdown", "metadata": { "id": "omYatNl7f1Re" }, "source": [ "Перед работой с данными сделаем небольшую работу над ними:" ] }, { "cell_type": "code", "execution_count": 32, "metadata": { "id": "0iUQ8nC1f2Oe" }, "outputs": [], "source": [ "def parse_price(x):\n", " try:\n", " return float(x[1:])\n", " except:\n", " return None" ] }, { "cell_type": "code", "execution_count": 33, "metadata": { "id": "CZY_euuIgvko" }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
idNAMEhost idhost_identity_verifiedhost nameneighbourhood groupneighbourhoodlatlongcountrycountry codeinstant_bookablecancellation_policyroom typeConstruction yearpriceservice feeminimum nightsnumber of reviewslast reviewreviews per monthreview rate numbercalculated host listings countavailability 365house_ruleslicense
01001254Clean & quiet apt home by the park80014485718unconfirmedMadalineBrooklynKensington40.64749-73.97237United StatesUSFalsestrictPrivate room2020.0$966$19310.09.010/19/20210.214.06.0286.0Clean up and treat the home the way you'd like...NaN
11002102Skylit Midtown Castle52335172823verifiedJennaManhattanMidtown40.75362-73.98377United StatesUSFalsemoderateEntire home/apt2007.0$142$2830.045.05/21/20220.384.02.0228.0Pet friendly but please confirm with me if the...NaN
21002403THE VILLAGE OF HARLEM....NEW YORK !78829239556NaNEliseManhattanHarlem40.80902-73.94190United StatesUSTrueflexiblePrivate room2005.0$620$1243.00.0NaNNaN5.01.0352.0I encourage you to use my kitchen, cooking and...NaN
31002755NaN85098326012unconfirmedGarryBrooklynClinton Hill40.68514-73.95976United StatesUSTruemoderateEntire home/apt2005.0$368$7430.0270.07/5/20194.644.01.0322.0NaNNaN
41003689Entire Apt: Spacious Studio/Loft by central park92037596077verifiedLyndonManhattanEast Harlem40.79851-73.94399United StatesUSFalsemoderateEntire home/apt2009.0$204$4110.09.011/19/20180.103.01.0289.0Please no smoking in the house, porch or on th...NaN
.................................................................................
1025946092437Spare room in Williamsburg12312296767verifiedKrikBrooklynWilliamsburg40.70862-73.94651United StatesUSFalseflexiblePrivate room2003.0$844$1691.00.0NaNNaN3.01.0227.0No Smoking No Parties or Events of any kind Pl...NaN
1025956092990Best Location near Columbia U77864383453unconfirmedMifanManhattanMorningside Heights40.80460-73.96545United StatesUSTruemoderatePrivate room2016.0$837$1671.01.07/6/20150.022.02.0395.0House rules: Guests agree to the following ter...NaN
1025966093542Comfy, bright room in Brooklyn69050334417unconfirmedMeganBrooklynPark Slope40.67505-73.98045United StatesUSTruemoderatePrivate room2009.0$988$1983.00.0NaNNaN5.01.0342.0NaNNaN
1025976094094Big Studio-One Stop from Midtown11160591270unconfirmedChristopherQueensLong Island City40.74989-73.93777United StatesUSTruestrictEntire home/apt2015.0$546$1092.05.010/11/20150.103.01.0386.0NaNNaN
1025986094647585 sf Luxury Studio68170633372unconfirmedRebeccaManhattanUpper West Side40.76807-73.98342United StatesUSFalseflexibleEntire home/apt2010.0$1,032$2061.00.0NaNNaN3.01.069.0NaNNaN
\n", "

102599 rows × 26 columns

\n", "
" ], "text/plain": [ " id NAME \\\n", "0 1001254 Clean & quiet apt home by the park \n", "1 1002102 Skylit Midtown Castle \n", "2 1002403 THE VILLAGE OF HARLEM....NEW YORK ! \n", "3 1002755 NaN \n", "4 1003689 Entire Apt: Spacious Studio/Loft by central park \n", "... ... ... \n", "102594 6092437 Spare room in Williamsburg \n", "102595 6092990 Best Location near Columbia U \n", "102596 6093542 Comfy, bright room in Brooklyn \n", "102597 6094094 Big Studio-One Stop from Midtown \n", "102598 6094647 585 sf Luxury Studio \n", "\n", " host id host_identity_verified host name neighbourhood group \\\n", "0 80014485718 unconfirmed Madaline Brooklyn \n", "1 52335172823 verified Jenna Manhattan \n", "2 78829239556 NaN Elise Manhattan \n", "3 85098326012 unconfirmed Garry Brooklyn \n", "4 92037596077 verified Lyndon Manhattan \n", "... ... ... ... ... \n", "102594 12312296767 verified Krik Brooklyn \n", "102595 77864383453 unconfirmed Mifan Manhattan \n", "102596 69050334417 unconfirmed Megan Brooklyn \n", "102597 11160591270 unconfirmed Christopher Queens \n", "102598 68170633372 unconfirmed Rebecca Manhattan \n", "\n", " neighbourhood lat long country country code \\\n", "0 Kensington 40.64749 -73.97237 United States US \n", "1 Midtown 40.75362 -73.98377 United States US \n", "2 Harlem 40.80902 -73.94190 United States US \n", "3 Clinton Hill 40.68514 -73.95976 United States US \n", "4 East Harlem 40.79851 -73.94399 United States US \n", "... ... ... ... ... ... \n", "102594 Williamsburg 40.70862 -73.94651 United States US \n", "102595 Morningside Heights 40.80460 -73.96545 United States US \n", "102596 Park Slope 40.67505 -73.98045 United States US \n", "102597 Long Island City 40.74989 -73.93777 United States US \n", "102598 Upper West Side 40.76807 -73.98342 United States US \n", "\n", " instant_bookable cancellation_policy room type \\\n", "0 False strict Private room \n", "1 False moderate Entire home/apt \n", "2 True flexible Private room \n", "3 True moderate Entire home/apt \n", "4 False moderate Entire home/apt \n", "... ... ... ... \n", "102594 False flexible Private room \n", "102595 True moderate Private room \n", "102596 True moderate Private room \n", "102597 True strict Entire home/apt \n", "102598 False flexible Entire home/apt \n", "\n", " Construction year price service fee minimum nights \\\n", "0 2020.0 $966 $193 10.0 \n", "1 2007.0 $142 $28 30.0 \n", "2 2005.0 $620 $124 3.0 \n", "3 2005.0 $368 $74 30.0 \n", "4 2009.0 $204 $41 10.0 \n", "... ... ... ... ... \n", "102594 2003.0 $844 $169 1.0 \n", "102595 2016.0 $837 $167 1.0 \n", "102596 2009.0 $988 $198 3.0 \n", "102597 2015.0 $546 $109 2.0 \n", "102598 2010.0 $1,032 $206 1.0 \n", "\n", " number of reviews last review reviews per month review rate number \\\n", "0 9.0 10/19/2021 0.21 4.0 \n", "1 45.0 5/21/2022 0.38 4.0 \n", "2 0.0 NaN NaN 5.0 \n", "3 270.0 7/5/2019 4.64 4.0 \n", "4 9.0 11/19/2018 0.10 3.0 \n", "... ... ... ... ... \n", "102594 0.0 NaN NaN 3.0 \n", "102595 1.0 7/6/2015 0.02 2.0 \n", "102596 0.0 NaN NaN 5.0 \n", "102597 5.0 10/11/2015 0.10 3.0 \n", "102598 0.0 NaN NaN 3.0 \n", "\n", " calculated host listings count availability 365 \\\n", "0 6.0 286.0 \n", "1 2.0 228.0 \n", "2 1.0 352.0 \n", "3 1.0 322.0 \n", "4 1.0 289.0 \n", "... ... ... \n", "102594 1.0 227.0 \n", "102595 2.0 395.0 \n", "102596 1.0 342.0 \n", "102597 1.0 386.0 \n", "102598 1.0 69.0 \n", "\n", " house_rules license \n", "0 Clean up and treat the home the way you'd like... NaN \n", "1 Pet friendly but please confirm with me if the... NaN \n", "2 I encourage you to use my kitchen, cooking and... NaN \n", "3 NaN NaN \n", "4 Please no smoking in the house, porch or on th... NaN \n", "... ... ... \n", "102594 No Smoking No Parties or Events of any kind Pl... NaN \n", "102595 House rules: Guests agree to the following ter... NaN \n", "102596 NaN NaN \n", "102597 NaN NaN \n", "102598 NaN NaN \n", "\n", "[102599 rows x 26 columns]" ] }, "execution_count": 33, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data" ] }, { "cell_type": "code", "execution_count": 34, "metadata": { "id": "8Ha0g_Qmfiad" }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
NAMEhost_identity_verifiedhost nameneighbourhood groupneighbourhoodlatlongcountrycountry codeinstant_bookablecancellation_policyroom typeConstruction yearminimum nightsnumber of reviewslast reviewreviews per monthreview rate numbercalculated host listings countavailability 365house_ruleslicenseprice_valueservice_fee_value
0Clean & quiet apt home by the parkunconfirmedMadalineBrooklynKensington40.64749-73.97237United StatesUSFalsestrictPrivate room2020.010.09.010/19/20210.214.06.0286.0Clean up and treat the home the way you'd like...NaN966.0193.0
1Skylit Midtown CastleverifiedJennaManhattanMidtown40.75362-73.98377United StatesUSFalsemoderateEntire home/apt2007.030.045.05/21/20220.384.02.0228.0Pet friendly but please confirm with me if the...NaN142.028.0
2THE VILLAGE OF HARLEM....NEW YORK !NaNEliseManhattanHarlem40.80902-73.94190United StatesUSTrueflexiblePrivate room2005.03.00.0NaNNaN5.01.0352.0I encourage you to use my kitchen, cooking and...NaN620.0124.0
3NaNunconfirmedGarryBrooklynClinton Hill40.68514-73.95976United StatesUSTruemoderateEntire home/apt2005.030.0270.07/5/20194.644.01.0322.0NaNNaN368.074.0
4Entire Apt: Spacious Studio/Loft by central parkverifiedLyndonManhattanEast Harlem40.79851-73.94399United StatesUSFalsemoderateEntire home/apt2009.010.09.011/19/20180.103.01.0289.0Please no smoking in the house, porch or on th...NaN204.041.0
...........................................................................
1025923BR/1 Ba in TriBeCa w/ outdoor deckunconfirmedNickManhattanTribeca40.71845-74.01183United StatesUSFalsemoderateEntire home/apt2016.01.00.0NaNNaN2.01.0177.0Guests should treat my home as if it were thei...NaN787.0157.0
102594Spare room in WilliamsburgverifiedKrikBrooklynWilliamsburg40.70862-73.94651United StatesUSFalseflexiblePrivate room2003.01.00.0NaNNaN3.01.0227.0No Smoking No Parties or Events of any kind Pl...NaN844.0169.0
102595Best Location near Columbia UunconfirmedMifanManhattanMorningside Heights40.80460-73.96545United StatesUSTruemoderatePrivate room2016.01.01.07/6/20150.022.02.0395.0House rules: Guests agree to the following ter...NaN837.0167.0
102596Comfy, bright room in BrooklynunconfirmedMeganBrooklynPark Slope40.67505-73.98045United StatesUSTruemoderatePrivate room2009.03.00.0NaNNaN5.01.0342.0NaNNaN988.0198.0
102597Big Studio-One Stop from MidtownunconfirmedChristopherQueensLong Island City40.74989-73.93777United StatesUSTruestrictEntire home/apt2015.02.05.010/11/20150.103.01.0386.0NaNNaN546.0109.0
\n", "

84263 rows × 24 columns

\n", "
" ], "text/plain": [ " NAME \\\n", "0 Clean & quiet apt home by the park \n", "1 Skylit Midtown Castle \n", "2 THE VILLAGE OF HARLEM....NEW YORK ! \n", "3 NaN \n", "4 Entire Apt: Spacious Studio/Loft by central park \n", "... ... \n", "102592 3BR/1 Ba in TriBeCa w/ outdoor deck \n", "102594 Spare room in Williamsburg \n", "102595 Best Location near Columbia U \n", "102596 Comfy, bright room in Brooklyn \n", "102597 Big Studio-One Stop from Midtown \n", "\n", " host_identity_verified host name neighbourhood group \\\n", "0 unconfirmed Madaline Brooklyn \n", "1 verified Jenna Manhattan \n", "2 NaN Elise Manhattan \n", "3 unconfirmed Garry Brooklyn \n", "4 verified Lyndon Manhattan \n", "... ... ... ... \n", "102592 unconfirmed Nick Manhattan \n", "102594 verified Krik Brooklyn \n", "102595 unconfirmed Mifan Manhattan \n", "102596 unconfirmed Megan Brooklyn \n", "102597 unconfirmed Christopher Queens \n", "\n", " neighbourhood lat long country country code \\\n", "0 Kensington 40.64749 -73.97237 United States US \n", "1 Midtown 40.75362 -73.98377 United States US \n", "2 Harlem 40.80902 -73.94190 United States US \n", "3 Clinton Hill 40.68514 -73.95976 United States US \n", "4 East Harlem 40.79851 -73.94399 United States US \n", "... ... ... ... ... ... \n", "102592 Tribeca 40.71845 -74.01183 United States US \n", "102594 Williamsburg 40.70862 -73.94651 United States US \n", "102595 Morningside Heights 40.80460 -73.96545 United States US \n", "102596 Park Slope 40.67505 -73.98045 United States US \n", "102597 Long Island City 40.74989 -73.93777 United States US \n", "\n", " instant_bookable cancellation_policy room type \\\n", "0 False strict Private room \n", "1 False moderate Entire home/apt \n", "2 True flexible Private room \n", "3 True moderate Entire home/apt \n", "4 False moderate Entire home/apt \n", "... ... ... ... \n", "102592 False moderate Entire home/apt \n", "102594 False flexible Private room \n", "102595 True moderate Private room \n", "102596 True moderate Private room \n", "102597 True strict Entire home/apt \n", "\n", " Construction year minimum nights number of reviews last review \\\n", "0 2020.0 10.0 9.0 10/19/2021 \n", "1 2007.0 30.0 45.0 5/21/2022 \n", "2 2005.0 3.0 0.0 NaN \n", "3 2005.0 30.0 270.0 7/5/2019 \n", "4 2009.0 10.0 9.0 11/19/2018 \n", "... ... ... ... ... \n", "102592 2016.0 1.0 0.0 NaN \n", "102594 2003.0 1.0 0.0 NaN \n", "102595 2016.0 1.0 1.0 7/6/2015 \n", "102596 2009.0 3.0 0.0 NaN \n", "102597 2015.0 2.0 5.0 10/11/2015 \n", "\n", " reviews per month review rate number calculated host listings count \\\n", "0 0.21 4.0 6.0 \n", "1 0.38 4.0 2.0 \n", "2 NaN 5.0 1.0 \n", "3 4.64 4.0 1.0 \n", "4 0.10 3.0 1.0 \n", "... ... ... ... \n", "102592 NaN 2.0 1.0 \n", "102594 NaN 3.0 1.0 \n", "102595 0.02 2.0 2.0 \n", "102596 NaN 5.0 1.0 \n", "102597 0.10 3.0 1.0 \n", "\n", " availability 365 house_rules \\\n", "0 286.0 Clean up and treat the home the way you'd like... \n", "1 228.0 Pet friendly but please confirm with me if the... \n", "2 352.0 I encourage you to use my kitchen, cooking and... \n", "3 322.0 NaN \n", "4 289.0 Please no smoking in the house, porch or on th... \n", "... ... ... \n", "102592 177.0 Guests should treat my home as if it were thei... \n", "102594 227.0 No Smoking No Parties or Events of any kind Pl... \n", "102595 395.0 House rules: Guests agree to the following ter... \n", "102596 342.0 NaN \n", "102597 386.0 NaN \n", "\n", " license price_value service_fee_value \n", "0 NaN 966.0 193.0 \n", "1 NaN 142.0 28.0 \n", "2 NaN 620.0 124.0 \n", "3 NaN 368.0 74.0 \n", "4 NaN 204.0 41.0 \n", "... ... ... ... \n", "102592 NaN 787.0 157.0 \n", "102594 NaN 844.0 169.0 \n", "102595 NaN 837.0 167.0 \n", "102596 NaN 988.0 198.0 \n", "102597 NaN 546.0 109.0 \n", "\n", "[84263 rows x 24 columns]" ] }, "execution_count": 34, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data['price_value'] = data['price'].apply(lambda x: parse_price(x))\n", "data['service_fee_value'] = data['service fee'].apply(lambda x: parse_price(x))\n", "data_cleared = data.dropna(subset=['price_value', 'service_fee_value'], axis=0)\n", "data_cleared = data_cleared.drop(['price', 'id', 'host id', 'service fee'], axis=1)\n", "data_cleared" ] }, { "cell_type": "markdown", "metadata": { "id": "rTz_nMeChu-y" }, "source": [ "Заменим все пропуски в вещественных признаках на среднее:" ] }, { "cell_type": "code", "execution_count": 35, "metadata": { "id": "3IhYAcSFiIo5" }, "outputs": [], "source": [ "number_columns = data_cleared.select_dtypes(include=['number']).columns\n", "\n", "data_cleared[number_columns] = data_cleared[number_columns].fillna(data_cleared[number_columns].mean())" ] }, { "cell_type": "markdown", "metadata": { "id": "M2zg4iP0g7tg" }, "source": [ "Пусть целевое значение, которое мы хотим предсказать - это `price`. Все остальное - признаки.\n", "\n", "Выделим обучающую и тестовую выборки:" ] }, { "cell_type": "code", "execution_count": 36, "metadata": { "id": "EWpB0QSRhEDC" }, "outputs": [], "source": [ "from sklearn.model_selection import train_test_split" ] }, { "cell_type": "code", "execution_count": 37, "metadata": { "id": "wOVimLTkhMij" }, "outputs": [], "source": [ "X_train, X_test, y_train, y_test = train_test_split(data_cleared.drop('price_value', axis=1), data_cleared[['price_value']], test_size=0.2)" ] }, { "cell_type": "code", "execution_count": 38, "metadata": { "id": "t6TQ18kOho1c" }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
NAMEhost_identity_verifiedhost nameneighbourhood groupneighbourhoodlatlongcountrycountry codeinstant_bookablecancellation_policyroom typeConstruction yearminimum nightsnumber of reviewslast reviewreviews per monthreview rate numbercalculated host listings countavailability 365house_ruleslicenseservice_fee_value
13783Private bedroom located in BushwickunconfirmedRobertBrooklynBushwick40.68597-73.91417United StatesUSFalsemoderatePrivate room2020.01.0000001.01/31/20160.0200005.01.048.0NaNNaN146.0
10388East Village Private Room & BathverifiedCanManhattanEast Village40.72775-73.98630United StatesUSTruemoderatePrivate room2009.02.0000000.0NaN1.3699454.02.0364.01. Please let me know ahead your arrival, che...NaN159.0
1254Beautiful bedroom in Prospect HeightsverifiedMaite & JaviBrooklynProspect Heights40.67440-73.96558United StatesUSFalseflexiblePrivate room2022.07.00000043.06/29/20190.5200003.01.0222.0NO Smoking. Pets permitted with fee.NaN65.0
92537MadininaunconfirmedBertinManhattanHarlem40.81294-73.94609United StatesUSTruemoderatePrivate room2022.02.00000030.07/1/20191.8800003.02.0331.0No Loud MusicNaN156.0
65750Light, spacious apartment in trendy neighborhoodunconfirmedKathrynBrooklynCrown Heights40.67521-73.94838United StatesUSTrueflexibleEntire home/apt2010.07.00000010.04/10/20210.2800005.01.00.0NaNNaN19.0
........................................................................
42632Times SquareverifiedJustinManhattanMidtown40.75492-73.98027United StatesUSTrueflexiblePrivate room2005.08.1101040.0NaN1.3699453.01.0201.01. Only the ORIGINAL OCCUPANTS at the time of ...NaN120.0
89920Walk through room close to everythingverifiedKateManhattanLower East Side40.71339-73.98926United StatesUSFalseflexiblePrivate room2018.03.00000047.05/22/20191.5000002.01.0217.0Please remember that this is a residential bui...NaN15.0
76426Cozy Private Bedroom, Access to TerraceunconfirmedEricBrooklynCrown Heights40.67700-73.95923United StatesUSFalsestrictPrivate room2005.030.0000000.0NaN1.3699452.01.088.0Please do not try and fit more than 4 occupant...NaN70.0
99652Sunny studio loft in BrooklynunconfirmedMichelleBrooklynWilliamsburg40.71783-73.94104United StatesUSTruemoderateEntire home/apt2005.03.00000012.05/27/20190.9300003.01.00.0At La Casita we expect our guests to be respec...NaN176.0
31904Beautiful and Spacious UES Gallery Like apartmentunconfirmedKennethManhattanUpper East Side40.76180-73.96546United StatesUSFalseflexibleEntire home/apt2022.02.0000000.0NaN1.3699452.01.083.0Please be courteous of our neighbors! We love ...NaN52.0
\n", "

67410 rows × 23 columns

\n", "
" ], "text/plain": [ " NAME \\\n", "13783 Private bedroom located in Bushwick \n", "10388 East Village Private Room & Bath \n", "1254 Beautiful bedroom in Prospect Heights \n", "92537 Madinina \n", "65750 Light, spacious apartment in trendy neighborhood \n", "... ... \n", "42632 Times Square \n", "89920 Walk through room close to everything \n", "76426 Cozy Private Bedroom, Access to Terrace \n", "99652 Sunny studio loft in Brooklyn \n", "31904 Beautiful and Spacious UES Gallery Like apartment \n", "\n", " host_identity_verified host name neighbourhood group \\\n", "13783 unconfirmed Robert Brooklyn \n", "10388 verified Can Manhattan \n", "1254 verified Maite & Javi Brooklyn \n", "92537 unconfirmed Bertin Manhattan \n", "65750 unconfirmed Kathryn Brooklyn \n", "... ... ... ... \n", "42632 verified Justin Manhattan \n", "89920 verified Kate Manhattan \n", "76426 unconfirmed Eric Brooklyn \n", "99652 unconfirmed Michelle Brooklyn \n", "31904 unconfirmed Kenneth Manhattan \n", "\n", " neighbourhood lat long country country code \\\n", "13783 Bushwick 40.68597 -73.91417 United States US \n", "10388 East Village 40.72775 -73.98630 United States US \n", "1254 Prospect Heights 40.67440 -73.96558 United States US \n", "92537 Harlem 40.81294 -73.94609 United States US \n", "65750 Crown Heights 40.67521 -73.94838 United States US \n", "... ... ... ... ... ... \n", "42632 Midtown 40.75492 -73.98027 United States US \n", "89920 Lower East Side 40.71339 -73.98926 United States US \n", "76426 Crown Heights 40.67700 -73.95923 United States US \n", "99652 Williamsburg 40.71783 -73.94104 United States US \n", "31904 Upper East Side 40.76180 -73.96546 United States US \n", "\n", " instant_bookable cancellation_policy room type \\\n", "13783 False moderate Private room \n", "10388 True moderate Private room \n", "1254 False flexible Private room \n", "92537 True moderate Private room \n", "65750 True flexible Entire home/apt \n", "... ... ... ... \n", "42632 True flexible Private room \n", "89920 False flexible Private room \n", "76426 False strict Private room \n", "99652 True moderate Entire home/apt \n", "31904 False flexible Entire home/apt \n", "\n", " Construction year minimum nights number of reviews last review \\\n", "13783 2020.0 1.000000 1.0 1/31/2016 \n", "10388 2009.0 2.000000 0.0 NaN \n", "1254 2022.0 7.000000 43.0 6/29/2019 \n", "92537 2022.0 2.000000 30.0 7/1/2019 \n", "65750 2010.0 7.000000 10.0 4/10/2021 \n", "... ... ... ... ... \n", "42632 2005.0 8.110104 0.0 NaN \n", "89920 2018.0 3.000000 47.0 5/22/2019 \n", "76426 2005.0 30.000000 0.0 NaN \n", "99652 2005.0 3.000000 12.0 5/27/2019 \n", "31904 2022.0 2.000000 0.0 NaN \n", "\n", " reviews per month review rate number calculated host listings count \\\n", "13783 0.020000 5.0 1.0 \n", "10388 1.369945 4.0 2.0 \n", "1254 0.520000 3.0 1.0 \n", "92537 1.880000 3.0 2.0 \n", "65750 0.280000 5.0 1.0 \n", "... ... ... ... \n", "42632 1.369945 3.0 1.0 \n", "89920 1.500000 2.0 1.0 \n", "76426 1.369945 2.0 1.0 \n", "99652 0.930000 3.0 1.0 \n", "31904 1.369945 2.0 1.0 \n", "\n", " availability 365 house_rules \\\n", "13783 48.0 NaN \n", "10388 364.0 1. Please let me know ahead your arrival, che... \n", "1254 222.0 NO Smoking. Pets permitted with fee. \n", "92537 331.0 No Loud Music \n", "65750 0.0 NaN \n", "... ... ... \n", "42632 201.0 1. Only the ORIGINAL OCCUPANTS at the time of ... \n", "89920 217.0 Please remember that this is a residential bui... \n", "76426 88.0 Please do not try and fit more than 4 occupant... \n", "99652 0.0 At La Casita we expect our guests to be respec... \n", "31904 83.0 Please be courteous of our neighbors! We love ... \n", "\n", " license service_fee_value \n", "13783 NaN 146.0 \n", "10388 NaN 159.0 \n", "1254 NaN 65.0 \n", "92537 NaN 156.0 \n", "65750 NaN 19.0 \n", "... ... ... \n", "42632 NaN 120.0 \n", "89920 NaN 15.0 \n", "76426 NaN 70.0 \n", "99652 NaN 176.0 \n", "31904 NaN 52.0 \n", "\n", "[67410 rows x 23 columns]" ] }, "execution_count": 38, "metadata": {}, "output_type": "execute_result" } ], "source": [ "X_train" ] }, { "cell_type": "markdown", "metadata": { "id": "cR6pxkE6ukve" }, "source": [ "Чуть позже будем пытаться обучить knn-регрессор." ] }, { "cell_type": "code", "execution_count": 39, "metadata": { "id": "_UM4QeCEocA-" }, "outputs": [], "source": [ "from sklearn.neighbors import KNeighborsRegressor\n", "from sklearn.preprocessing import MinMaxScaler\n", "from sklearn.metrics import mean_squared_error\n", "\n", "# не забываем сделать нормировку, так как метод метрический\n", "\n", "X_train_number = np.array(X_train.select_dtypes('number'))\n", "X_test_number = np.array(X_test.select_dtypes('number'))\n", "\n", "scaler = MinMaxScaler()\n", "scaler.fit(X_train_number)\n", "\n", "X_train_number_scaled = scaler.transform(X_train_number)\n", "X_test_number_scaled = scaler.transform(X_test_number)" ] }, { "cell_type": "markdown", "metadata": { "id": "_hSrQo-9kqOH" }, "source": [ "Одним из способов переводить категориальные признаки в численное представления является **One-Hot Encoding (OHE).**\n", "\n", "Это метод кодирования категориальных признаков, который преобразует каждую категорию в отдельный бинарный вектор. Для каждой уникальной категории создается новая колонка, где значение 1 указывает на присутствие данной категории, а 0 — на ее отсутствие. Например, если у нас есть признак \"Цвет\" с категориями \"Красный\", \"Зеленый\" и \"Синий\", OHE создаст три новых колонки: \"ЦветКрасный\", \"ЦветЗеленый\" и \"ЦветСиний\". Это позволяет алгоритмам машинного обучения лучше воспринимать категориальные данные, так как они не могут обрабатывать текстовые значения напрямую.\n", "\n", "**Примечание** Однако стоит помнить, что OHE может привести к увеличению размерности данных, особенно при наличии большого количества категорий." ] }, { "cell_type": "markdown", "metadata": { "id": "8-Z0P7eblIrY" }, "source": [ "![image.png](data:image/png;base64,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)" ] }, { "cell_type": "markdown", "metadata": { "id": "j30nOLC5lNkG" }, "source": [ "Существует два наиболее используемых способа применения данного алгоритма:\n", "\n", "1) Через метод `pandas.get_dummies`\n", "\n", "2) Через трансформер в `sklearn` `OneHotEncoder`" ] }, { "cell_type": "markdown", "metadata": { "id": "G21L_BYdmN2T" }, "source": [ "Давайте закодируем несколько признаков с помощью OHE и посмотрим, как обучать модель:" ] }, { "cell_type": "code", "execution_count": 40, "metadata": { "id": "IIUuToVGmWQB" }, "outputs": [], "source": [ "from sklearn.preprocessing import OneHotEncoder\n", "\n", "columns = [\"host_identity_verified\", \"neighbourhood group\", \"room type\", \"cancellation_policy\"]\n", "\n", "enc = OneHotEncoder(sparse_output=False, handle_unknown='ignore')\n", "# sparse_output - ставим такой параметр, чтобы вернулась обычная матрица\n", "# handle_unknown - не будет падать из-за ошибок\n", "enc.fit(X_train[columns])\n", "\n", "train_neighbourhood_group_ohe = enc.transform(X_train[columns])\n", "test_neighbourhood_group_ohe = enc.transform(X_test[columns])" ] }, { "cell_type": "markdown", "metadata": { "id": "4F9A48swmvyQ" }, "source": [ "Посмотрим, на сколько увеличилось число признаков:" ] }, { "cell_type": "code", "execution_count": 41, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "dGx2eEgdm4ya", "outputId": "3b8b18a0-e5ed-4432-b973-64579d122dc6" }, "outputs": [ { "data": { "text/plain": [ "(67410, 17)" ] }, "execution_count": 41, "metadata": {}, "output_type": "execute_result" } ], "source": [ "train_neighbourhood_group_ohe.shape" ] }, { "cell_type": "markdown", "metadata": { "id": "ioGW45L0m7Pl" }, "source": [ "Составим новый датасет:" ] }, { "cell_type": "code", "execution_count": 42, "metadata": { "id": "0AHtbasLjlw1" }, "outputs": [], "source": [ "X_train_new = np.hstack((X_train_number_scaled, train_neighbourhood_group_ohe))\n", "X_test_new = np.hstack((X_test_number_scaled, test_neighbourhood_group_ohe))" ] }, { "cell_type": "code", "execution_count": 43, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 79 }, "id": "gKbAHxpGnA04", "outputId": "e3ecb6b1-ce72-498e-a8a9-599fede49fd7" }, "outputs": [ { "data": { "text/html": [ "
KNeighborsRegressor()
In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.
" ], "text/plain": [ "KNeighborsRegressor()" ] }, "execution_count": 43, "metadata": {}, "output_type": "execute_result" } ], "source": [ "regr = KNeighborsRegressor(n_neighbors=5)\n", "\n", "regr.fit(X_train_new, np.array(y_train))" ] }, { "cell_type": "code", "execution_count": 44, "metadata": { "id": "hP2WQSFpoFcr" }, "outputs": [ { "data": { "text/plain": [ "2485.710831305999" ] }, "execution_count": 44, "metadata": {}, "output_type": "execute_result" } ], "source": [ "mean_squared_error(regr.predict(X_test_new), np.array(y_test)) # может работать несколько секунд" ] }, { "cell_type": "markdown", "metadata": { "id": "FLvDs6ErvW8L" }, "source": [ "### **Задание 9 [2 баллa]**" ] }, { "cell_type": "markdown", "metadata": { "id": "s1XWmf10vxXo" }, "source": [ "Изучите, как работает метод [pandas.get_dummies](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.get_dummies.html) и проделайте аналогичную операцию кодирования, используя только его\n", "\n", "Покажите, что модель с такими же признаки тоже обучается и выдает примерно такое же качество" ] }, { "cell_type": "code", "execution_count": 61, "metadata": { "id": "v5kA3duvr1V0" }, "outputs": [ { "data": { "text/html": [ "
KNeighborsRegressor()
In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.
" ], "text/plain": [ "KNeighborsRegressor()" ] }, "execution_count": 61, "metadata": {}, "output_type": "execute_result" } ], "source": [ "categorical_cols = [\"host_identity_verified\", \"neighbourhood group\", \"room type\", \"cancellation_policy\"]\n", "\n", "train_encoded = pd.get_dummies(X_train[categorical_cols])\n", "test_encoded = pd.get_dummies(X_test[categorical_cols])\n", "\n", "all_cols = train_encoded.columns.union(test_encoded.columns)\n", "train_encoded_aligned = train_encoded.reindex(columns=all_cols, fill_value=0)\n", "test_encoded_aligned = test_encoded.reindex(columns=all_cols, fill_value=0)\n", "\n", "X_train_final = np.hstack((X_train_number_scaled, train_encoded_aligned))\n", "X_test_final = np.hstack((X_test_number_scaled, test_encoded_aligned))\n", "\n", "knn_model = KNeighborsRegressor(n_neighbors=5)\n", "knn_model.fit(X_train_final, y_train.values)\n" ] }, { "cell_type": "code", "execution_count": 62, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "2448.2487129887854" ] }, "execution_count": 62, "metadata": {}, "output_type": "execute_result" } ], "source": [ "mean_squared_error(regr.predict(X_test_final), np.array(y_test))" ] } ], "metadata": { "colab": { "provenance": [] }, "kernelspec": { "display_name": ".venv", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.13.7" } }, "nbformat": 4, "nbformat_minor": 0 }