Forked from dsibi/1. Анализ данных продолжается здесь
Created
November 8, 2022 14:06
-
-
Save legale/65e766b38e10969802a04c0cdb5a8eae to your computer and use it in GitHub Desktop.
yandex_python_data_analyst_5_Pandas для анализа данных
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Данные исследуют в четыре стадии: | |
| Получение данных и ознакомление с ними | |
| Предподготовка данных | |
| Анализ данных | |
| Оформление результатов исследования | |
| В этой теме мы начнём с первой стадии. В получении данных и ознакомлении с ними важную роль выполняет библиотека Pandas. | |
| Чему вы научитесь | |
| Познакомитесь с библиотекой Pandas и её базовыми методами: чтением файла, выводом данных на экран, получением сводной информации и запросом значений из определённых ячеек таблицы. | |
| Сколько времени это займёт | |
| 2 часа = 6 уроков от 2 до 30 минут. | |
| Постановка задачи | |
| Решим задачу из реальной практики сервиса Яндекс.Музыка: исследовать предпочтения пользователей и ответить на вопрос, целесообразна ли интеграция двух сервисов — Музыки и Радио. |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Мы готовим к запуску новый релиз, где соединим вместе приложения Музыка и Радио. Нам важно понимать, как пользователи отреагируют на такое новшество. Для этого мы оцениваем на небольшом количестве пользователей, насколько им понравилась возможность быстрого доступа к Радио. | |
| Каждая компания по-разному оценивает реакцию пользователя на нововведения. Продуктовые исследования в нашем сервисе показали, что среднее время прослушивания лучше всего отражает лояльность пользователей. | |
| Метрика удовлетворенности пользователя сервисом называется happiness. В Яндекс.Музыке метрика happiness равна среднему времени прослушивания треков. Чем выше этот показатель, тем больше доволен пользователь. | |
| image | |
| Есть и другие метрики, которые помогают ответить на вопрос: «Как дела у нашего продукта?» | |
| Если метрика happiness в эксперименте повысится, команда примет решение добавить Радио всем пользователям. | |
| Ваша задача как аналитика Яндекс.Музыки определить текущее значение метрики happiness. Вы пройдёте все стадии – от знакомства с данными до решения бизнес-задачи. |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Вот так выглядят наши данные на этапе знакомства: | |
| image | |
| Этот хаос нужно превратить в аккуратную табличку, поддающуюся обработке. Для такой задачи подойдёт и Excel, но лучше использовать профильный инструмент — программную библиотеку Pandas. | |
| Библиотеки – это наборы готовых методов для решения распространённых задач. Из того, что есть в Python, для операций с таблицами чаще всего применяют Pandas. Название — от сокращения panel data (англ. «панельные данные») — пришло из терминологии применяемого в экономике панельного анализа, который изучает изменение определённого признака у определённого объекта во времени (например, уровень бедности в Бразилии во второй половине 20 века). Библиотека Pandas оказалась таким универсальным инструментом, что годится для исследования любых данных, которые вообще можно собрать в таблицу. | |
| Почему библиотека Pandas такая крутая и популярная? У неё богатейшие возможности: | |
| Готовые методы для всяческих манипуляций с таблицами: добавления, удаления, преобразования, агрегирования данных; | |
| Одновременная обработка данных из разных файлов; | |
| Готовые методы для операций с пропущенными значениями, выявления и устранения проблемных данных; | |
| Использование данных в самых разных форматах. | |
| Кроме того, вы всегда можете обратиться к хорошо подготовленной документации и активному комьюнити. | |
| Инструменты библиотеки становятся доступны, когда мы вызываем её командой import. | |
| import pandas | |
| Библиотека хранится в переменной, через которую можно вызвать её методы. В сообществе принято давать ей короткое имя pd. | |
| import pandas as pd | |
| Эта команда означает «импортируй библиотеку Pandas как pd». | |
| У нас есть набор данных, который нужно превратить в таблицу. Это делается вызовом конструктора DataFrame(). | |
| Конструктор принимает два аргумента – список данных и названия столбцов, которые должны быть в таблице. Например, если информация о столицах разных стран хранится в переменной atlas: | |
| atlas = [ | |
| ['Франция','Париж'], | |
| ['Россия','Москва'], | |
| ['Китай','Пекин'], | |
| ['Мексика','Мехико'], | |
| ['Египет','Каир'] | |
| ] | |
| и нужно построить таблицу из двух столбцов country и capital, | |
| geography = ['country', 'capital'] | |
| синтаксис вызова конструктора DataFrame() выглядит так: | |
| world_map = pd.DataFrame(data = atlas , columns = geography) | |
| image | |
| Обратите внимание, что DataFrame() – это конструктор библиотеки Pandas, поэтому перед именем конструктора стоит обращение к переменной, в которой библиотека хранится – pd.DataFrame(). | |
| atlas = [ | |
| ['Франция','Париж'], | |
| ['Россия','Москва'], | |
| ['Китай','Пекин'], | |
| ['Мексика','Мехико'], | |
| ['Египет','Каир'], | |
| ] | |
| geography = ['country', 'capital'] | |
| world_map = pd.DataFrame(data = atlas , columns = geography) # таблица сохраняется в переменной с произвольно выбранным именем world_map | |
| print(world_map) # вывод на экран | |
| COUNTRY CAPITAL | |
| 0 Франция Париж | |
| 1 Россия Москва | |
| 2 Китай Пекин | |
| 3 Мексика Мехико | |
| 4 Египет Каир | |
| В результате простой список пар страна-столица превратился в таблицу с индексами и именованными столбцами. Давайте создадим таблицу с данными о ваших музыкальных предпочтениях. | |
| TASK_1_4 | |
| Получите доступ к библиотеке Pandas, используйте имя переменной pd. | |
| SOLUTION | |
| import pandas as pd | |
| TASK_2_4 | |
| Создайте список music с 5 парами «имя вашего любимого исполнителя - название его песни». Пример такого списка - atlas из теоретического введения к этому уроку. | |
| import pandas as pd | |
| SOLUTION | |
| import pandas as pd | |
| music=[['Меладзе','Она была'], | |
| ['Билан','Тоска'], | |
| ['Пресняков','Стюардесса'], | |
| ['Тальков','Чистые пруды'], | |
| ['Розенбаум','Брат мой'], | |
| ] | |
| TASK_3_4 | |
| Создайте список entries с названиями для двух столбцов — artist и track (здесь эти английские слова употребляются в значении «исполнитель» и «композиция»). | |
| SOLUTION | |
| import pandas as pd | |
| music=[['Меладзе','Она была'], | |
| ['Билан','Тоска'], | |
| ['Пресняков','Стюардесса'], | |
| ['Тальков','Чистые пруды'], | |
| ['Розенбаум','Брат мой'], | |
| ] | |
| entries=['artist','track'] | |
| TASK_4_4 | |
| Используя конструктор DataFrame(), создайте таблицу из списка ваших любимых исполнителей music и списка столбцов entries. Сохраните таблицу в переменной playlist и выведите эту сборную таблицу на экран. | |
| SOLUTION | |
| import pandas as pd | |
| music=[['Меладзе','Она была'], | |
| ['Билан','Тоска'], | |
| ['Пресняков','Стюардесса'], | |
| ['Тальков','Чистые пруды'], | |
| ['Розенбаум','Брат мой'], | |
| ] | |
| entries=['artist','track'] | |
| playlist=pd.DataFrame(data=music, columns=entries) | |
| print (playlist) |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| У вас есть набор данных. Чтобы начать работу с ним, данные нужно прочитать. Давайте разберёмся, как это сделать. | |
| Знакомому формату электронной таблицы Excel в Pandas соответствует структура данных DataFrame. Аналитики обычно называют такие объекты просто DataFrame. | |
| В рабочей практике вы столкнётесь с тем, что данные хранят в файлах разных форматов. Из них самый распространённый – CSV (от англ. Comma-Separated Values, «значения, разделённые запятой»). Каждая строка такого файла представляет собой одну строку таблицы, где данные разделены запятыми. В первой строке собраны заголовки столбцов (если они есть). | |
| Посмотрите, как одинаковые данные выглядят в Excel (снизу) и CSV (сверху): | |
| image | |
| Файлы CSV удобнее всего открывать вызовом метода read_csv() из библиотеки Pandas. | |
| import pandas as pd | |
| df = pd.read_csv('music_log.csv') # аргумент - путь к файлу | |
| Обратите внимание, что содержимое файла CSV сохраняется в переменной df. Это имя, которое будет встречаться постоянно — общепринятое сокращение от DataFrame. | |
| Теперь все данные из файла можно напечатать на экране командой print(df), но это не всегда нужно делать — не исключено, что таблица огромна и неудобна для изучения. Для знакомства с данными запрашивают несколько строк из начала или конца таблицы, вызывая специальные методы head() и tail(). По умолчанию head() возвращает первые 5 строк набора данных, а метод tail() – последние 5 строк. Когда нужно не 5, количество строк передаётся этим методам как аргумент. Например, head(10) вернёт первые 10 строк. Давайте возьмёмся за поставленную менеджером задачу и откроем файл с данными сервиса Яндекс.Музыка. Получим первый десяток строк этой обширной таблицы: | |
| print(df.head(10)) | |
| USER_ID TOTAL PLAY ARTIST GENRE TRACK | |
| 0 BF6EA5AF 92.851388 Marina Rei pop Musica | |
| 1 FB1E568E 282.981000 Stive Morgan ambient Love Planet | |
| 2 FB1E568E 282.981000 Stive Morgan ambient Love Planet | |
| 3 EF15C7BA 8.966000 NaN dance Loving Every Minute | |
| 4 82F52E69 193.776327 Rixton pop Me And My Broken Heart | |
| 5 4166D680 3.007000 Henry Hall & His Gleneagles Hotel Band jazz Home | |
| 6 F4F5677 0.100000 NaN classicmetal NaN | |
| 7 386FE1ED 211.880000 NaN electronic Riviera | |
| 8 A5E0D927 3.161000 Andrew Paul Woodworth pop The Name of This Next Song Is Called | |
| 9 E9E8A0CA 274.390000 Pillar Point indie Dove | |
| TASK_1_2 | |
| Прочитайте файл music_log.csv и сохраните его в переменной df. Сохраните первые 5 строк с данными из music_log.csv в переменной music_head и выведите значение переменной на экран. | |
| SOLUTION | |
| # <импортируйте библиотеку pandas> | |
| import pandas as pd | |
| df=pd.read_csv('music_log.csv') | |
| music_head = df[:5] | |
| print(music_head.head()) | |
| TASK_2_2 | |
| Прочитайте файл music_log.csv и сохраните его в переменной df. Сохраните последние 10 строк с данными из music_log.csv в переменной music_tail и выведите значение переменной на экран. | |
| SOLUTION | |
| import pandas as pd | |
| df=pd.read_csv('music_log.csv') | |
| music_tail = df[-10:] | |
| print(music_tail.tail(10)) |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Таблица, которую мы получили, хранится в структуре данных DataFrame. Давайте подробно разберём, из чего состоит этот объект и какие операции с ним можно выполнять. | |
| image | |
| DataFrame — это двумерная структура данных Pandas, где у каждого элемента есть две координаты: по строке и по столбцу. | |
| image | |
| Вы видите две оси, которые формируют объект DataFrame. Первая ось называется индексы, вторая ось — столбцы. По умолчанию индексация в DataFrame начинается с нуля. | |
| Каждая строка — это одно наблюдение, запись об объекте исследования. А столбцы — признаки объектов. В нашем случае одна строка — это одно действие одного пользователя. Прослушивание такой-то композиции в исполнении такой-то группы в течение такого-то времени. | |
| Для лучшего понимания данных полезно получить доступ к их описанию. Это либо документация со сведениями о содержании каждого столбца, либо – не самый лучший вариант – рассказ человека, который предоставил вам эту информацию. Сейчас документация выглядит так: | |
| user_id — содержит информацию об уникальном идентификаторе пользователя; | |
| total play — сколько секунд пользователь слушал трек; | |
| Artist — имя исполнителя; | |
| genre — жанр (рок, поп, электронная музыка, классическая и др.); | |
| track — название трека. | |
| Такое описание поможет нам ставить себе корректные задачи. | |
| У DataFrame есть неотъемлемые свойства, значения которых можно запросить. Они называются атрибуты. Например, атрибут columns содержит информацию о названиях столбцов в наборе данных. | |
| print(df.columns) | |
| image | |
| В данном случае атрибут columns вернул список названий столбцов и сообщил, что каждое из них имеет тип данных object. | |
| Вообще типы данных могут быть разные. Для просмотра типа данных каждого столбца лучше всего использовать атрибут dtypes. | |
| print(df.dtypes) | |
| image | |
| Типы данных, о которых сообщают нам атрибуты — это типы данных библиотеки Pandas. Каждому из них соответствует определённый тип данных языка Python. | |
| Так, для int таким «двойником» в Pandas будет int64. Тип данных object используется, когда данные не подходят ни под одну категорию или соответствуют в Python типу «строка». Вот таблица соответствия типов данных Pandas и Python: | |
| PANDAS DTYPE PYTHON TYPE ЗНАЧЕНИЕ | |
| object str Строка | |
| int64 int Целые числа | |
| float64 float Вещественные числа | |
| bool bool Логический тип данных | |
| О размерах таблицы с данными сообщает её атрибут shape. В результате получается кортеж (неизменяемый список) из двух чисел: первое – количество строк, второе – количество столбцов. | |
| print(df.shape) | |
| image | |
| В таблице 67963 строк (наблюдений) и 5 столбцов. | |
| Кортеж – одномерная неизменяемая последовательность. Это структура данных, похожая на список, её тоже можно сохранять в переменной. Например, кортеж artist содержит имена исполнителей: | |
| artist = ('Queen', 'Led Zeppelin', 'Scorpions') | |
| Но если мы попытаемся изменить элемент кортежа, то Python вернёт ошибку: | |
| artist[0] = 'Spice Girls' | |
| --------------------------------------------------------------------------- | |
| TypeError Traceback (most recent call last) | |
| <ipython-input-25-4409a5f0dbe8> in <module>() | |
| ----> 1 artist[0] = 'Spice Girls' | |
| TypeError: 'tuple' object does not support item assignment | |
| Можно получить информацию как обо всём кортеже, так и об отдельных его элементах: | |
| print(artist) | |
| ('Queen', 'Led Zeppelin', 'Scorpions') | |
| print(artist[0]) | |
| 'Queen' | |
| Кортеж нужен для хранения и чтения данных, которые лучше не изменять. Он похож на текстовый документ, защищённый от редактирования. | |
| Всю информацию, которую предоставляют разные атрибуты DataFrame, можно получить вызовом одного-единственного метода info(). Изучив результаты, которые этот метод возвращает, аналитик выбирает тактику дальнейшей работы с таблицей. | |
| df.info() | |
| <class 'pandas.core.frame.DataFrame'> | |
| RangeIndex: 67963 entries, 0 to 67962 | |
| Data columns (total 5 columns): | |
| user_id 67963 non-null object | |
| total play 67963 non-null float64 | |
| Artist 60157 non-null object | |
| genre 65223 non-null object | |
| track 65368 non-null object | |
| dtypes: float64(1), object(4) | |
| memory usage: 2.6+ MB | |
| image | |
| Например, здесь в разных столбцах разное количество элементов с определёнными значениями (non-null). Следовательно, в таблице есть пропущенные значения (null). Прежде чем анализировать такие данные, их нужно обработать. Это одна из самых интересных задач аналитика, и мы поговорим о ней подробнее в следующей теме. | |
| TASK_1_4 | |
| Прочитайте файл music_log.csv и сохраните его в переменной df. Создайте переменную shape_table и сохраните в ней размеры таблицы music_log.csv. Напечатайте на экране размер таблицы в таком виде: | |
| Размер таблицы: ... | |
| SOLUTION | |
| import pandas as pd | |
| df=pd.read_csv('music_log.csv') | |
| shape_table=df.shape | |
| print('Размер таблицы:', shape_table) | |
| TASK_2_4 | |
| Сколько наблюдений в наборе данных? В переменной shape_table хранится кортеж. Его первый элемент — количество наблюдений, который надо сохранить в переменной observations_table (не забывайте, что индексация элементов идёт с 0). Напечатайте на экране ответ в таком виде: | |
| Количество наблюдений: ... | |
| SOLUTION | |
| import pandas as pd | |
| df = pd.read_csv('music_log.csv') | |
| shape_table = df.shape | |
| observations_table = shape_table [0] | |
| print('Количество наблюдений:', observations_table) | |
| TASK_3_4 | |
| Найдите в информации, которую вернул метод info(), число наблюдений. Вручную присвойте это число как значение переменной observations_info_table. | |
| SOLUTION | |
| import pandas as pd | |
| df = pd.read_csv('music_log.csv') | |
| df.info() | |
| observations_info_table = 67963 | |
| TASK_4_4 | |
| Вы ещё не запутались? Давайте осмотримся и заодно вспомним условные конструкции. | |
| Поскольку в ходе работы аналитик объявляет разные переменные и сохраняет в них добытую разными способами информацию, запутаться очень легко. Именно поэтому необходимо проверять себя и текущие результаты. Сравните полученные результаты в переменных observations_info_table и observations_table. Если значения переменных совпадают, то выведите количество наблюдений и сообщение: | |
| "Решение верно, количество наблюдений равно", observations_table | |
| Если значения переменных не совпадают, то выведите сообщение: | |
| "Решение неверно, проверьте ещё раз!" | |
| SOLUTION | |
| import pandas as pd | |
| df = pd.read_csv('music_log.csv') | |
| observations_info_table = df.shape[0] | |
| observations_table = 67963 | |
| if observations_info_table == observations_table: | |
| print("Решение верно, количество наблюдений равно", observations_table) | |
| else: | |
| print("Решение неверно, проверьте ещё раз!", observations_table) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment