Конверсия и повторные покупатели
email_visits = 1000 # количество визитов из рассылок
context_visits = 2500 # количество визитов из контекстной рекламы
email_purchases = 50 # количество покупок из рассылок
context_purchases = 100 # количество покупок из контекстной рекламы
email_conversion = email_purchases/email_visits # поделите email_purchases на email_visits
context_conversion = context_purchases/context_visits# напишите ваш код здесь
# выведите значение конверсий рассылок
print('Конверсия рассылок: {:.0%}'.format(email_conversion))
# выведите на экран значения конверсий контекстной рекламы
print('Конверсия контекстной рекламы: {:.0%}'.format(context_conversion))
Задача №2
Продолжим автоматизировать труд маркетологов: научим Python сравнивать источники трафика и выбирать лучший. Если конверсия рассылок email_conversion
больше конверсии контекстной рекламы context_conversion
, выведите на экран: 'Вывод: рассылки эффективнее'. Если наоборот, то: 'Вывод: контекстная реклама эффективнее'. Не удаляйте из вывода результат предыдущей задачи.
email_visits = 1000 # количество визитов из рассылок
context_visits = 2500 # количество визитов из контекстной рекламы
email_purchases = 50 # количество покупок из рассылок
context_purchases = 100 # количество покупок из контекстной рекламы
email_conversion = email_purchases / email_visits
context_conversion = context_purchases / context_visits
print('Конверсия рассылок: {:.0%}'.format(email_conversion))
print('Конверсия контекстной рекламы: {:.0%}'.format(context_conversion))
# напишите условную конструкцию здесь
if email_conversion > context_conversion:
print ('Вывод: рассылки эффективнее')
else:
print ('Вывод: контекстная реклама эффективнее')
Задача №3
Добавьте случай, когда конверсии равны. При равенстве конверсий выводите: 'Конверсии равны, пора смотреть другие метрики'
.
email_visits = 1000 # количество визитов из рассылок
context_visits = 2500 # количество визитов из контекстной рекламы
email_purchases = 50 # количество покупок из рассылок
context_purchases = 100 # количество покупок из контекстной рекламы
email_conversion = email_purchases / email_visits
context_conversion = context_purchases / context_visits
print('Конверсия рассылок: {:.0%}'.format(email_conversion))
print('Конверсия контекстной рекламы: {:.0%}'.format(context_conversion))
# напишите условную конструкцию здесь
if email_conversion > context_conversion:
print ('Вывод: рассылки эффективнее')
elif email_conversion == context_conversion:
print ('Конверсии равны, пора смотреть другие метрики')
else:
print ('Вывод: контекстная реклама эффективнее')
Задача №4
Измените значения переменных email_visits
, context_visits
, email_purchases
, context_purchases
так, чтобы получить вывод, что контекстная реклама эффективнее или что конверсии рассылок и контекстной рекламы равны.
email_visits = 1000 # количество визитов из рассылок
context_visits = 1000 # количество визитов из контекстной рекламы
email_purchases = 50 # количество покупок из рассылок
context_purchases = 50 # количество покупок из контекстной рекламы
email_conversion = email_purchases / email_visits
context_conversion = context_purchases / context_visits
print('Конверсия рассылок: {:.0%}'.format(email_conversion))
print('Конверсия контекстной рекламы: {:.0%}'.format(context_conversion))
# напишите условную конструкцию здесь
if email_conversion > context_conversion:
print ('Вывод: рассылки эффективнее')
elif email_conversion == context_conversion:
print ('Конверсии равны, пора смотреть другие метрики')
else:
print ('Вывод: контекстная реклама эффективнее')
Задача №5
Вы уже умеете находить конверсию. Рассчитайте другую важную для бизнеса метрику — долю повторных покупателей.
В переменной total
посчитайте общее количество покупателей: сложите число пользователей, совершивших одну покупку, с числом тех, кто совершил две и более. Выведите результат в виде: 'Общее количество покупателей: ...'
first_purchase = 885 # количество пользователей, совершивших 1 покупку
repeated_purchase = 136 # количество пользователей, совершивших 2 и более покупок
total = first_purchase + repeated_purchase# общее количество покупателей
print ('Общее количество покупателей:', total)
Задача №6
Посчитайте долю повторных покупок как отношение repeated_purchase
к total
. Ответ положите в переменную repeated_purchase_part
. Результат выведите на экран так: 'Доля повторных покупок равна ...%'
. Процент отобразите в виде целого числа — с точностью ноль знаков после запятой.
first_purchase = 885
repeated_purchase = 136
total = first_purchase + repeated_purchase
repeated_purchase_part = repeated_purchase/total# поделите количество пользователей, совершивших 2 и более покупок, на общее количество покупателей
print ('Доля повторных покупок равна {:.0%}'.format(repeated_purchase_part))
Задача №7
Вам прислали таблицу со статистикой первичных и повторных покупок по источникам трафика. Прочитайте содержимое файла returned.csv
и сохраните его в датафрейме purchases
. Посчитайте общее число покупок для каждого источника трафика. Результат запишите в столбец 'total'
. Выведите весь датафрейм на экран.
Путь к файлу: /datasets/returned.csv
import pandas as pd
purchases = pd.read_csv('/datasets/returned.csv')
purchases['total'] = purchases['first'] + purchases['repeated']
print (purchases)
Задача №8
Для каждого источника трафика посчитайте долю повторных покупок — отношение количества повторных ко всем покупкам. Выведите весь датафрейм на экран.
import pandas as pd
purchases = pd.read_csv('/datasets/returned.csv')
purchases['total'] = purchases['first'] + purchases['repeated']
purchases['repeated_share'] = purchases['repeated'] / purchases['total'] # отношение повторных покупок ко всем покупкам
print (purchases)
Задача №9
Постройте рейтинг источников трафика по доле повторных покупок. Отсортируйте датафрейм purchases
по убыванию значений столбца 'repeated_share'
. Выражение напишите в скобках функции print()
, чтобы вывести результат на экран.
import pandas as pd
purchases = pd.read_csv('/datasets/returned.csv')
purchases['total'] = purchases['first'] + purchases['repeated']
purchases['repeated_share'] = purchases['repeated'] / purchases['total']
print (purchases.sort_values(by=['repeated_share'], ascending=False))
User ID и куки
Вы обнаружили NaN и None
import pandas as pd
logs = pd.read_csv('logs.csv')
print(logs['source'].value_counts())
>>>
other 133834
context 52032
email 12279
None 1674
undef 181
Name: source, dtype: int64
Источник трафика пропущен в 1674 случаях. Это менее 1% от всех значений датафрейма logs
, в котором 200 000 строк. Меньше процента — это немного, и в большинстве задач удаление такой доли строк не повлияет на результаты. Но что, если все пропуски сделаны на месте значений 'email'
? Тогда, удалив строки с None
, мы лишим себя почти 1/8 данных: 1674 / (12279 + 1674) ≈ 12%. Это повлияет на метрики email-рассылок и выводы исследования. Методом isna()
найдём все строки с пропусками в столбце email
и просмотрим первые пять.
print(logs[logs['email'].isna()].head())
user_id source email purchase
0 7141786820 other NaN 0
2 1914055396 context NaN 0
3 4099355752 other NaN 0
4 6032477554 context NaN 1
5 5872473344 other NaN 0
Этот код похож на фильтр. Выражение logs['email'].isna()
проверяет все строки в столбце email
и оставляет только те, в которых есть NaN
. Метод head()
выводит на экран первые пять строк. Чтобы сосчитать строки без email-адресов, вызовем функцию len()
.
print(len(logs[logs['email'].isna()]))
186047
В 186 047 строках из 200 000 электронный адрес пропущен. Вполне объяснимо: пользователи регистрируются на сайте неохотно.
Тем не менее, пропуски нельзя оставлять без внимания: группировка данных с NaN
может привести к некорректным результатам анализа. Удостоверимся на примере присуждения кубка в школе волшебников Хогвартс.
Ученики в течение года зарабатывают очки для своих факультетов: Гриффиндора, Слизерина, Пуффендуя и Когтеврана. Кубок школы предназначен факультету, набравшему наибольшее количество баллов. Цена ошибки велика.
Изучим таблицу с распределением баллов по факультетам.
Задача №1
Восстановите справедливость: верните Рону его факультет, заменив значение NaN
на 'Гриффиндор'
методом fillna()
. Выведите на экран таблицу hogwarts_points
.
import pandas as pd
hogwarts_points = pd.read_csv('/datasets/hogwarts_points.csv')
hogwarts_points = hogwarts_points.fillna('Гриффиндор')
print (hogwarts_points)
Задача №2
Измените код, чтобы результат приобрёл такой вид:
Сумма баллов учеников: # сумма значений столбца 'points'
Сумма баллов факультетов: # сумма баллов при группировке по факультетам
Кубок получает # название факультета
import pandas as pd
hogwarts_points = pd.read_csv('/datasets/hogwarts_points.csv')
hogwarts_points['faculty_name'] = hogwarts_points['faculty_name'].fillna(value='Гриффиндор')
print('Сумма баллов учеников:', hogwarts_points['points'].sum())# сумма значений столбца 'points'
print('Сумма баллов факультетов:', hogwarts_points.groupby('faculty_name')['points'].sum().sum() )
# сгруппируйте по столбцу 'faculty_name'
# сложите значения столбца 'points' этой группировки методом sum()
# и примените метод sum() к результату
print ('Кубок получает', hogwarts_points.groupby('faculty_name')['points'].sum().idxmax())
Задача №3
Применим полученные в Хогвартсе знания к реальной задаче. Возьмём источники трафика Яндекс.Маркета и рассчитаем конверсию. Найдите количество визитов из каждого источника трафика. Для этого сгруппируйте данные из столбца с идентификаторами пользователей по столбцу с источниками. Результат сохраните в переменной visits
и выведите на экран.
import pandas as pd
logs = pd.read_csv('/datasets/logs.csv')
#общее количество визитов из каждого источника
visits = logs.groupby('source')['user_id'].count()
print (visits)
Задача №4
Посчитайте количество совершённых покупок для каждого источника трафика. Результат сохраните в переменной purchase
и выведите на экран.
import pandas as pd
logs = pd.read_csv('/datasets/logs.csv')
# количество покупок для каждого источника
purchase = logs.groupby('source')['purchase'].sum()
print (purchase)
Задача №5
Посчитайте конверсию по каждому источнику трафика, результат сохраните в переменной conversion
и выведите на экран.
import pandas as pd
logs = pd.read_csv('/datasets/logs.csv')
visits = logs.groupby('source')['user_id'].count() # количество визитов
purchase = logs.groupby('source')['purchase'].sum() # количество покупок
conversion = purchase / visits # поделите количество покупок на количество визитов
print (conversion)
Категориальные и количественные переменные
Индексация в атрибуте loc
rows = [False, True, False, False, False, False, False, False]
, Если передать этот список в атрибут loc
, он вернет только нужную нам строку:
import pandas as pd
data = pd.read_csv('/datasets/projects.csv')
rows = [False, True, False, False, False, False, False, False]
print(data.loc[rows])
Имя Роль Новая функция Эксперимент Статья
1 Петя аналитик + - -
Логические выражения в атрибуте loc
Работа с пропусками в категориальных переменных
import pandas as pd
game_survey = pd.read_csv('/datasets/game_of_thrones.csv')
. .
Пропуски бывают трёх типов:
- Полностью случайные: если вероятность встретить пропуск не зависит ни от каких других значений. Таков пропуск пола Сансы Старк. Ответ на этот вопрос не зависит от характера самого вопроса и от других вопросов анкеты, а сам пропуск легко восстановить по имени.
- Случайные: если вероятность пропуска зависит от других значений в наборе данных, но не от значений собственного столбца. Случайным пропуском будет пропуск рода Джона Сноу. Пропущенное значение связано с тем, что рода Сноу не существует.
- Неслучайные: если вероятность пропуска зависит от других значений, в том числе и от значений собственного столбца. Это пропуск в политических намерениях Брана Старка: он не указал их нарочно, ведь умеет предвидеть будущее и не собирается сообщать о своих планах. Отсутствующее значение зависит как от характера вопроса, так и от особенности самого Брана Старка, то есть, значения переменной в другом столбце.
Существует несколько вариантов замены пропусков категориальных значений. Например, замена значением по умолчанию. Такой вариант хорошо подойдёт для заполнения случайных пропусков. В таблице с результатами анкетирования нельзя заполнить род Джона Сноу, но для выполнения операций отсутствующее значение мешает. Заменим его на пустую строку.
game_survey['family'] = game_survey['family'].fillna(value='')
Иногда пропуски в категориальных столбцах могут принимать не стандартное значение None
без определённого типа (NoneType)
, а значение типа str: например, 'None'
, '-'
, 'Null'
. В таких случаях метод fillna() не подойдёт — он работает только со значениями NaN
или None
. Для замены строковых значений вызывают атрибут loc
, он осуществляет логическую индексацию — выбор значений по заданному условию. Логическая индексация позволяет найти в столбце значения 'None'
или другие значения типа str
и заменить их. Таким способом можно заполнить полностью случайный пропуск в столбце gender
.
game_survey.loc[game_survey['gender'] == 'None', 'gender'] = 'женский'
Ранее вы считали количество визитов и покупок в задаче для Яндекс.Маркета. Посмотрим на результаты:
print(logs.groupby('source')['purchase'].count())
source
None 1674
context 52032
email 12279
other 133834
undef 181
Name: purchase, dtype: int64
Число визитов из источника undef
значительно меньше любого другого источника трафика. Ещё раз взглянем на количество покупок из этого источника:
purchase = logs.groupby('source')['purchase'].sum()
source
None 108
context 3029
email 913
other 8041
undef 12
Name: purchase, dtype: int64
Ранее вы находили конверсию так:
import pandas as pd
logs = pd.read_csv('/datasets/logs.csv')
visits = logs.groupby('source')['purchase'].count()
purchase = logs.groupby('source')['purchase'].sum()
conversion = purchase / visits
print(conversion)
Сперва посчитали количество строк с визитами, а затем суммировали значения в строках, чтобы найти число покупок. Для группировки столбца 'source' вызывали две функции: count() и sum().
Однако количество действий для решения задачи можно сократить.
Вызовем метод agg(), указывающий, какие именно функции применить к столбцу 'purchase'. Название столбца и сами функции запишем в особую структуру данных — словарь. Словарь состоит из ключа и значения:
{'purchase': ['count','sum']}
Здесь ключ — это название столбца, к которому нужно применить функции, а значением выступает список с названиями функций. Результат выполнения кода сохраним в переменной logs_grouped
:
logs_grouped = logs.groupby('source').agg({'purchase': ['count', 'sum']})
purchase
source count sum
None 1674 108
context 52032 3029
email 12279 913
other 133834 8041
undef 181 12
Методом agg()
посчитали все необходимые значения в одной таблице.
Названия столбцов после такого действия стали «двойными».
Чтобы обратиться к сумме покупок ['sum'] столбца ['purchase'], просто укажите их подряд:
logs_grouped['purchase']['sum']
Разберёмся с пропусками в данных Яндекс.Маркета и решим задачу.
Задача №1
В столбце email встречаются значения NaN — вместо электронных почт пользователей, не подписавшихся на рассылку магазина. Их электронный адрес вы вряд ли узнаете, и не сможете заполнить пропуски вручную. Да и самих NaN слишком много для ручной замены.
Тем не менее избавиться от значений NaN можно, если заменить их единым значением. Например, пустой строкой. Так изучать таблицу будет проще: не нужно будет различать NaN и email-адрес.
Замените пропуски пустыми строками, используя знакомый метод fillna()
. После этого преобразования выведите на экран первые 5 строк датафрейма.
import pandas as pd
logs = pd.read_csv('/datasets/logs.csv')
logs['email'] = logs['email'].fillna('')
print (logs.head(5))
Задача №2
Пропуски в столбце source
записаны в строковом формате — 'None'
вместо None
.
Выясните, случайно ли их возникновение: проверьте, имеет ли каждая строка с источником 'None'
определённый email.
Для этого примените к датафрейму logs
два фильтра: Источник source
равен 'None'; Значение столбца email
равно пустой строке ''.
Выведите датафрейм с применёнными фильтрами. Переменную с датафреймом при этом перезаписывать не нужно.
import pandas as pd
logs = pd.read_csv('/datasets/logs.csv')
logs['email'] = logs['email'].fillna(value='')
print (logs.loc[(logs['source'] == 'None')&(logs['email'] == '')])
Датафрейм пуст: у всех строк без источника есть email. Пользователи оставляют свой электронный адрес только в случае подписки на email-рассылку. Получается, подписчикам из этих строк не был присвоен их источник трафика: 'email'.
Задача №3
Замените пропуски в столбце source на значение 'email'. Проверьте результат методом value_counts().
import pandas as pd
logs = pd.read_csv('/datasets/logs.csv')
logs['email'] = logs['email'].fillna(value='')
logs.loc[logs['source'] == 'None', 'source'] = 'email'
print(logs['source'].value_counts())
other 133834
context 52032
email 13953
undef 181
Name: source, dtype: int64
Больше никаких None и NaN. Пропуски в категориальных переменных устранены.
Задача №4
Посчитайте количество визитов и покупок по источнику трафика ('source'). Вызовите метод agg
. Сохраните результат в переменной logs_grouped
и выведите на экран.
import pandas as pd
logs = pd.read_csv('/datasets/logs.csv')
logs['email'] = logs['email'].fillna(value='')
logs.loc[logs['source'] == 'None', 'source'] = 'email'
#запишите ваш код сюда
logs_grouped = logs.groupby('source').agg({'purchase':['count','sum']})
print (logs_grouped)
purchase
count sum
source
context 52032 3029
email 13953 1021
other 133834 8041
undef 181 12
Задача №5
Посчитайте конверсию визитов в покупки для каждого источника трафика (т. е. отношение столбца sum к count). Сохраните результат в новый столбец logs_grouped['conversion']
и выведите обновлённую таблицу на экран.
import pandas as pd
logs = pd.read_csv('/datasets/logs.csv')
logs['email'] = logs['email'].fillna(value='')
logs.loc[logs['source'] == 'None', 'source'] = 'email'
logs_grouped = logs.groupby('source').agg({'purchase': ['count', 'sum']})
logs_grouped['conversion'] = logs_grouped['purchase']['sum'] / logs_grouped['purchase']['count']
print (logs_grouped)
Для неопределенного источника трафика undef значение конверсии близко к источнику other. Поэтому можно объединить данные по ним обоим.
Задача №6
У 'undef'
всего 12 покупок. Эта категория на порядки отличается от своих более объёмных конкурентов, и сравнивать их некорректно. Объедините её с одной из «больших» категорий в данных, похожей на 'undef'
своей конверсией. Замените значение источника 'undef'
на 'other'
и посчитайте конверсию в покупки для каждого источника трафика после замены. Выведите logs_grouped
на экран.
import pandas as pd
logs = pd.read_csv('/datasets/logs.csv')
logs['email'] = logs['email'].fillna(value='')
logs.loc[logs['source'] == 'None', 'source'] = 'email'
logs.loc[logs['source'] == 'undef', 'source'] = 'other'
logs_grouped = logs.groupby('source').agg({'purchase': ['count', 'sum']})
logs_grouped['conversion'] = logs_grouped['purchase']['sum'] / logs_grouped['purchase']['count']
print (logs_grouped)
Работа с пропусками в источниках завершена! В нашем случае email-рассылки оказались самым эффективным источником трафика.
Работа с пропусками в количественных переменных
import pandas as pd
metrica = pd.read_csv('/datasets/metrica_data.csv')
print(metrica.head(10))
user_id device_type age time
7141786820 desktop 33.0 2127.0
5644686960 mobile 30.0 35.0
1914055396 desktop 25.0 NaN
4099355752 desktop 25.0 2123.0
6032477554 desktop 27.0 59.0
5872473344 mobile 27.0 NaN
7977025176 mobile NaN NaN
3512872755 desktop 40.0 65.0
1827368713 desktop 37.0 NaN
8688870165 desktop 36.0 2124.0
user_id
— идентификатор пользователя device_type
— тип устройства пользователя age
— возраст пользователя time
— время на сайте в секундах
Вроде бы всё готово к анализу данных, но снова появились пропуски. Для некоторых пользователей не указаны возраст и время, проведённое на сайте.
Время и возраст — количественные переменные. Пропуски в таких переменных заполняют характерными значениями. Это значения, характеризующие состояние выборки, — набора данных, выбранных для проведения исследования. Чтобы примерно оценить типичные значения выборки, годятся среднее арифметическое или медиана.
Среднее арифметическое — это сумма всех значений, поделённая на количество значений. Подсчитывается методом mean(). Напомним: его применяют ко всей таблице, к отдельному столбцу или к сгруппированным данным. Вычислим средний рост актёров, исполнявших роли учеников Хогвартса:
.
magician_stats = pd.DataFrame(
{
"student": [
"Гарри Поттер",
"Гермиона Гренджер",
"Полумна Лавгуд",
"Рон Уизли",
"Седрик Диггори",
],
"height": [173, 165, 158, 173, 185],
}
)
# Для получения среднего значения вызовем метод mean():
print(magician_stats['height'].mean())
>>> 170.8
Медиана — это такое число в выборке, что ровно половина элементов больше него, а другая половина — меньше. Чтобы посчитать медиану списка значений [3, 0, 2, 9, 4], сначала упорядочим их по возрастанию: [0, 2, 3, 4, 9]. Медиана здесь число 3: слева и справа от него одинаковое количество значений. Если значений чётное количество, то берут среднее двух значений, оказавшихся посередине. Для набора [0, 2, 3, 4, 9, 22] посередине 3 и 4. Медианой будет их среднее: 3.5.
Для нахождения медианы есть специальный метод median(). Как и mean(), его можно применять к таблице, столбцу или сгруппированным данным.
Зачем нужна медиана, если есть среднее?
Среднее значение некорректно характеризует данные, когда некоторые значения сильно выделяются среди большинства. Например, 5 сотрудников компании получают зарплату 100 000 рублей. Инвестор пригласил директора по маркетингу с зарплатой 300 000 рублей. На сколько процентов выросла средняя оплата труда в коллективе?
Зарплаты первоначального состава команды приведены в old_staff. В версии с директором по маркетингу — в new_director.
import pandas as pd
old_staff = pd.Series([100, 100, 100, 100, 100])
new_director = pd.Series([100, 100, 100, 100, 100, 300])
Вызвав метод mean(), рассчитаем среднее значение зарплаты в старом и новом коллективах:
old_staff_mean = old_staff.mean()
new_director_mean = new_director.mean()
Чтобы ответить, на сколько процентов выросла средняя зарплата в команде, поделим их друг на друга:
new_director_mean / old_staff_mean - 1
Дробь в формуле показывает, во сколько раз средняя зарплата в новой команде больше средней зарплаты в старой. Единицу отнимаем, чтобы определить, на какую долю выросла средняя зарплата после прихода директора по маркетингу. Результат выведем как привычно, в процентах:
print(f'Зарплата выросла на {new_director_mean / old_staff_mean - 1:.0%}')
Зарплата выросла на 33%
Вот так, ловким приёмом на работу нового высокооплачиваемого сотрудника средняя зарплата всех членов команды повышается на 33%. Как в известном анекдоте: у Пети 10 яблок, а у Васи 0 — в среднем у обоих по 5 яблок. Когда в выборке присутствуют выдающиеся значения (300 против 100), лучше использовать медиану.
Применим median() к набору данных new_director
new_director_median = new_director.median()
print(new_director_median)
100.0
Значит, зарплатная медиана как была равна 100, так и останется после прихода директора по маркетингу. Это более объективная информация о зарплате сотрудников, чем среднее значение. Проанализируем данные о пользователях и поищем факторы помимо источника трафика, которые влияли на решение о покупке.
Задача №1
Прочитайте данные из файла metrica_data.csv
.
Результат сохраните в переменной metrica
.
Посчитайте средний возраст пользователей и сохраните его в переменной age_avg
.
Выведите результат на экран.
Путь к файлу: /datasets/metrica_data.csv
import pandas as pd
metrica = pd.read_csv('/datasets/metrica_data.csv')
age_avg = metrica['age'].mean()
print (age_avg)
В случае возраста считать среднее — правильно. В таблице нет выдающихся значений, потому и среднее корректно характеризует данные.
Задача №2
Замените пропущенные значения в столбце age
на средний возраст. Выведите на экран первые 10 строк набора данных.
import pandas as pd
metrica = pd.read_csv('/datasets/metrica_data.csv')
age_avg = metrica['age'].mean()
metrica['age'] = metrica['age'].fillna(age_avg)
print (metrica.head(10))
Пропуски в столбце с возрастом нам больше не помеха.
Задача №3
Найдите среднее время просмотра сайта и сохраните в переменной time_avg. Выведите результат на экран.
import pandas as pd
metrica = pd.read_csv('/datasets/metrica_data.csv')
#запишите среднее время просмотра
time_avg = metrica['time'].mean()
print (time_avg)
Пользователи в среднем проводят около 23 минут на сайте. Это достаточно много, но как на это значение влияет разброс данных?
Задача №4
Можно заменить время на среднее значение. Однако пользователи заходят в интернет то с мобильного устройства, то с компьютера. Учтём этот факт для повышения точности заполнения пропущенных данных о времени на сайте.
Выберите строки таблицы с данными о просмотрах с компьютера, т.е. такие, где в столбце 'device_type' указано значение 'desktop'.
Сохраните результат в переменной desktop_data и выведите первые 5 строк на экран.
import pandas as pd
metrica = pd.read_csv('/datasets/metrica_data.csv')
desktop_data = metrica[metrica['device_type']=='desktop']
print (desktop_data.head(5))
user_id device_type age time
0 7141786820 desktop 33.0 2127.0
2 1914055396 desktop 25.0 NaN
3 4099355752 desktop 25.0 2123.0
4 6032477554 desktop 27.0 59.0
7 3512872755 desktop 40.0 65.0
Теперь можем получить среднее значение для пользователей десктопных платформ.
Задача №5
Установите, сколько времени в среднем проводят на сайте пользователи компьютеров. Результат сохраните в переменной desktop_data_time_avg
. Закомментируйте вывод предыдущего задания и выведите значение desktop_data_time_avg
на экран.
import pandas as pd
metrica = pd.read_csv('/datasets/metrica_data.csv')
desktop_data = metrica[metrica['device_type']=='desktop']
desktop_data_time_avg = desktop_data['time'].mean()
#print (desktop_data.head(5))
print (desktop_data_time_avg)
1741.8747158537378 = 29 минут — это больше, чем общее среднее время. Значит, пользователям комфортнее изучать сайт с компьютера.
Задача №6
Получите таблицу с данными о просмотрах с мобильных платформ. Сохраните результат в переменной mobile_data и выведите первые 5 строк на экран.
import pandas as pd
metrica = pd.read_csv('/datasets/metrica_data.csv')
mobile_data = metrica[metrica['device_type']=='mobile']
print (mobile_data.head(5))
user_id device_type age time
1 5644686960 mobile 30.0 35.0
5 5872473344 mobile 27.0 NaN
6 7977025176 mobile NaN NaN
10 7172802697 mobile 30.0 NaN
14 9312844109 mobile NaN 40.0
Аналитики Яндекса в 2015 году заметили, что с мобильных устройств в интернет заходит больше пользователей, чем с настольных компьютеров. Так что сейчас вы получите очень важную величину.
Задача №7
Посчитайте среднее время пребывания на сайте пользователей мобильных платформ. Результат сохраните в переменной mobile_data_time_avg
. Закомментируйте вывод предыдущего задания и выведите значение mobile_data_time_avg
на экран.
import pandas as pd
metrica = pd.read_csv('/datasets/metrica_data.csv')
mobile_data = metrica[metrica['device_type']=='mobile']
mobile_data_time_avg = mobile_data['time'].mean()
#print (mobile_data.head(5))
print (mobile_data_time_avg)
41.15691239238949
Всего 41 секунда! Видимо, с мобильной версией какие-то проблемы и об этом нужно сообщить. Если ничего не предпринять, результаты вливаний в увеличение трафика разочаруют инвестора. Сколько бы высокооплачиваемых директоров по маркетингу он ни нанимал.
Заполнение пропусков в количественных переменных по категориям
Заключение
Проверочные задания. Работа с пропусками
В position хранятся категориальные значения. В salary находятся количественные значения.
Задание 2 из 10 Какие столбцы в датафрейме people_df хранят количественные переменные, а какие — категориальные? import pandas as pd
people_df = pd.DataFrame( {'name': ['Mikhail', 'Semyon', 'Boris'], 'age': [23, 25, 29], 'city': ['Moscow', 'Chelyabinsk', 'Moscow'], 'has_driver_license': [1, 0, 1] }) name Категориальные age Количественные city Категориальные has_driver_license Категориальные
Задание 3 из 10 В датафрейме с данными жителей города пропущены значения в колонке с доходами. Данные о доходах понадобятся для анализа, но сначала нужно разобраться с пропусками. Чем заполнить пропущенные значения?
Медианным значением
Задание 4 из 10 В том же датафрейме обнаружились пропуски в колонке с именами жителей. Пропущенные значения нужно выделить и обработать. Чем заполнить пропуски?
Заранее выбранным значением, например 'unknown'
Задание 5 из 10 Данные о цене товаров в разных регионах собрали в датафрейм. Но в столбце price обнаружились пропуски. При этом известно, что стоимость зависит от типа товара и региона. Изучите фрагмент датафрейма и установите, как заполнить пропущенные значения в данных. import pandas as pd
goods_df = pd.DataFrame( {"item": ["Milk", "Bread", "Meat", "Milk", "Bread"], "region": ["Moscow", "St. Petersburg", "Moscow", "St. Petersburg", "Moscow"], "shop": ["Red", "Green", "Red", "Green", "Green"], "price":[1.9, None, 2.7, 1.4, 1.4] })
Сгруппировать по товару и региону, а после заполнить цену медианным значением каждой группы.
Задание 6 из 10 Выберите метод, который заменит пропуски на заданное значение.
fillna()
Задание 7 из 10 Какое медианное значение выведет код? import pandas as pd
price = pd.Series([230, 304, 465, 467, 610, 950])
print("Медианное значение:", price.median())
466.0
Задание 8 из 10 Какое медианное значение выведет код? import pandas as pd
price = pd.Series([230, 304, 465, None, 610, 950])
print("Медианное значение:", price.median())
465.0
Задание 9 из 10 Какое значение вернёт код? import pandas as pd
people_df = pd.DataFrame({ "name": ["Mikhail", None, "Boris"], "age": [23, 25, 29], "city": ['Moscow', 'Chelyabinsk', 'Moscow'] })
people_df["name"].count()
2
Задание 10 из 10 Данные в датафрейме обновились. Какое значение вернёт код? import pandas as pd
people_df = pd.DataFrame({ "name": ["Mikhail", "None", "Boris"], "age": [23, 25, 29], "city": ['Moscow', 'Chelyabinsk', 'Moscow'] })
people_df["name"].count()
Следующая тема: ПД. Изменение типов данных
Вернуться к разделу: "Предобработка данных"
Вернуться в оглавление: Я.Практикум