Следующий раздел: Полезные инструкции для учебы

Вернуться в оглавление: Я.Практикум

7. Финальный проект.

   7.1 Введение. 

     Добро пожаловать в завершающую тему этого курса! Чтобы решить финальный кейс, вам понадобятся почти все полученные до этого знания и навыки.
     В этой теме вы:
  • проведёте полноценное исследование, пройдя весь путь — от изучения данных до проверки гипотез;
  • напишете несколько инструкций, чтобы собрать нужные показатели;
  • поупражняетесь в построении и анализе хитмэпов;
  • примените алгоритм машинного обучения для задачи классификации.
      Мы будем рядом и подскажем нужный инструмент, если вы с ним ещё не знакомы. Самое необходимое вы уже умеете: искать уникальные значения, группировать данные, строить разные типы графиков, обучать алгоритм ближайших соседей и предсказывать целевую переменную. Если забудете что-нибудь из пройденного, обратитесь к материалам предыдущих тем и уроков.

   7.2 Данные снова в деле.

   7.3 Работа с уникальными значениями.

Задача 2

Когда вы работаете с достаточно большим объёмом информации, поверхностного знакомства с данными недостаточно — важно подробно изучить значения в каждом столбце. Это помогает выявить проблемы в данных, а также подготовиться к дальнейшему анализу.
Для начала выясните, данные за какие периоды есть в датасете. Для этого выведите на экран список уникальных значений столбца interval
import pandas

data = pandas.read_csv('support_data_ds.csv')

#interval = data['internal'].unique() # примените метод unique() к столбцу data['interval']
interval = data['interval'].unique()
# выведите interval на экран
print (interval)
Задача 3
Оценить изменения показателей после внедрения роботов можно только в том случае, если данные распределены более или менее равномерно: если из всех 32 тысяч значений на период «после» приходится всего 100, сделанные выводы нельзя будет считать корректными.
Узнайте, сколько строк приходится на каждый период — посчитайте количество значений 'До внедрения роботов' и 'После внедрения роботов' с помощью метода value_counts() и сохраните результат в переменной interval_count.
import pandas

data = pandas.read_csv('support_data_ds.csv')

# посчитайте значения в столбце interval методом value_counts()
interval_count = data['interval'].value_counts()

print(interval_count)

Задача 4

Выясните, какие уникальные значения встречаются в столбце segment. Код для вывода списка значений уже написан.
import pandas

data = pandas.read_csv('support_data_ds.csv')

# найдите уникальные значения столбца segment
unique_names = data['segment'].unique()

print(unique_names)

Оценим соотношение значений в датасете по сегментам пользователей. Для этого нужно посчитать строки, которые относятся к каждому сегменту: 'Segment 0', 'Segment 1', 'Segment 2'. Сгруппируем значения по сегментам (один сегмент — одна группа) и в сгруппированных данных выберем столбец с номерами покупателей (customer_id). Затем вызовем метод count(), который посчитает строки в каждой группе.

import pandas

data = pandas.read_csv('support_data_ds.csv')

# группируем, выбираем столбец, считаем значения в каждой группе
segment_counts = data.groupby('segment')['customer_id'].count()
print(segment_counts)

Если не выбрать столбец customer_id после группировки, метод count() посчитает значения в группах для каждого столбца. Получилось бы много дубликатов, то есть повторяющихся значений. Убедитесь в этом сами, запустив код:

import pandas

data = pandas.read_csv('support_data_ds.csv')

# найдите уникальные значения столбца segment
segment_counts = data.groupby('segment').count()
print(segment_counts)

    7.6 Сегментация пользователей.

Группируем значения

Первый шаг для проверки гипотезы — вычислить общее число у клиентов в каждом из сегментов. Как это сделать? Нужно отобрать строчки таблицы, в которых указан сегмент, и сложить количество робокотов из колонки robocats. Строчки, которые относятся к одному сегменту, формируют группу. Объединить данные в такие группы поможет метод groupby() из библиотеки pandas.
Метод groupby() чаще всего сочетают с другими командами, например с sum() — этот метод посчитает сумму значений в каждой группе.
Таким образом, чтобы посчитать робокотов в разных сегментах, нужно последовательно применить несколько инструментов в одной строчке кода:
  1. Сгруппировать данные по столбцу segment с помощью groupby().
  2. Выбрать столбец robocats.
  3. Суммировать число робокотов в каждом сегменте с помощью sum().
Получившиеся значения можно вывести на экран на разных строках по порядку: нулевой сегмент, первый, второй.
import pandas

data = pandas.read_csv('support_data_ds.csv')

# сгруппируйте значения по столбцу segment,
# выберите столбец robocats
# и вызовите метод sum()

segment_counts = data.groupby('segment')['robocats'].sum()
print(segment_counts)

Задание 1

Теперь рассчитайте средние показатели самостоятельно. В каждом сегменте разделите количество робокотов на количество обращений. Робокотов вы уже посчитали. Осталось посчитать обращения. Действия похожи: сначала группировка и выбор столбца, а потом — подсчёт количества вместо суммы. На этот раз выберите столбец segment, а не robocats.
Выведите полученные значения на экран на отдельных строках в обычном порядке: нулевой, первый, второй.
import pandas

data = pandas.read_csv('support_data_ds.csv')

robocats_counts = data.groupby('segment')['robocats'].sum()
client_counts = data.groupby('segment')['segment'].count() # найдите количество обращений в каждом сегменте
segment_means = robocats_counts/ client_counts # разделите количество робокотов на количество обращений
print(segment_means)
Похоже, гипотеза подтвердилась: пользователи действительно разделены на сегменты по количеству купленных ими робокотов. Пользователи нулевого сегмента пока не приобрели ни одного робокота, первого — наслаждаются обществом одного робокота, второго — завели уже порядка десяти робокотов. Осталось дать им «говорящие» названия.

   7.7 Роботы и люди. Сравнение.

Чтобы сравнение было максимально наглядным, для каждого значимого показателя можно построить тепловую карту с дополнительными настройками:

import pandas
import seaborn

data = pandas.read_csv('support_data_ds.csv')

# списки со старыми и новыми названиями сегментов, а также периодами
segments_old = ['Segment 0', 'Segment 1', 'Segment 2']
segments_new = ['Потенциальные клиенты', 'Обычные клиенты', 'VIP-клиенты']
intervals = ['До внедрения роботов', 'После внедрения роботов']

# ненастоящие значения
mean_scores = [[1, 2],
               [3, 4],
               [5, 6]]

# настраиваем и строим хитмэп
seaborn.heatmap(mean_scores,
                xticklabels=intervals,
                yticklabels=segments_new,
                annot=True,
                cmap='RdYlGn')
Вот за что отвечают новые параметры в скобках heatmap():
  • xticklabels=intervals — для подписей на оси X взять значения из intervals;
  • yticklabels=segments_new — для подписей на оси Y взять значения из segments_new;
  • annot=True — добавить на график аннотации, то есть отображать не только цвета «ячеек» хитмэпа, но также их значения;
  • cmap='RdYlGn' — цветовая схема для числовой шкалы, в варианте 'RdYlGn' красный соответствует минимальным значениям, а зелёный — максимальным.

Задача 1

Найдите сумму и количество оценок по группам. Воспользуйтесь алгоритмом выше.
Затем посчитайте среднее: поделите сумму оценок на их количество.
import pandas
import seaborn

data = pandas.read_csv('support_data_ds.csv')

segments_new = ['Потенциальные клиенты', 'Обычные клиенты', 'VIP-клиенты']
intervals = ['До внедрения роботов', 'После внедрения роботов']

scores_sum = data.groupby(['segment', 'interval'])['score'].sum() # для каждой пары сегмент-интервал посчитайте сумму оценок 
scores_count =data.groupby(['segment', 'interval'])['score'].count() # для каждой пары сегмент-интервал найдите количество записей

mean_scores = scores_sum/scores_count # посчитайте среднее: разделите сумму оценок на их количество
print(mean_scores)

Построим тепловую карту по настоящим значениям — средним пользовательским оценкам в каждом из сегментов до и после внедрения роботов.

import pandas
import seaborn

data = pandas.read_csv('support_data.csv')

segments_new = ['Потенциальные клиенты', 'Обычные клиенты', 'VIP-клиенты']
intervals = ['До внедрения роботов', 'После внедрения роботов']

# для каждой пары сегмент-интервал считаем сумму оценок
scores_sum = data.groupby(['segment', 'interval'])['score'].sum()    
# для каждой пары сегмент-интервал считаем количество записей
scores_count = data.groupby(['segment', 'interval'])['score'].count()

mean_scores = scores_sum / scores_count

# строим тепловую карту для средних значений
# столбец mean_scores получился вложенным из-за группировки по двум столбцам,
# поэтому его нужно «развернуть» методом unstack()
seaborn.heatmap(mean_scores.unstack('interval'),
                xticklabels=intervals,
                yticklabels=segments_new,
                annot=True,
                cmap='RdYlGn')

Задача 2

Задача аналогична предыдущей, только вместо столбца score нужно обращаться к столбцу duration.
import pandas
import seaborn

data = pandas.read_csv('support_data_ds.csv')

segments_new = ['Потенциальные клиенты', 'Обычные клиенты', 'VIP-клиенты']
intervals = ['До внедрения роботов', 'После внедрения роботов']

duration_sum = data.groupby(['segment', 'interval'])['duration'].sum() # для каждой пары сегмент-интервал посчитайте сумму продолжительности ответов
duration_count = data.groupby(['segment', 'interval'])['duration'].count() # для каждой пары сегмент-интервал найдите количество записей

mean_duration = duration_sum/duration_count # посчитайте среднее: разделите сумму продолжительности на количество записей
print(mean_duration)
Теперь построим тепловую карту по длительности ответов.
import pandas
import seaborn

data = pandas.read_csv('support_data_ds.csv')

segments_new = ['Потенциальные клиенты', 'Обычные клиенты', 'VIP-клиенты']
intervals = ['До внедрения роботов', 'После внедрения роботов']

# для каждой пары сегмент-интервал считаем сумму продолжительностей
duration_sum = data.groupby(['segment', 'interval'])['duration'].sum()    
# для каждой пары сегмент-интервал считаем количество записей
duration_count = data.groupby(['segment', 'interval'])['duration'].count()

# считаем среднее: делим сумму на количество
mean_duration = duration_sum / duration_count
print(mean_duration)

# строим тепловую карту для длительности ответов
# столбец mean_duration получился вложенным из-за группировки по двум столбцам,
# поэтому его нужно «развернуть» методом unstack()
seaborn.heatmap(mean_duration.unstack('interval'), xticklabels=intervals, yticklabels=segments_new, annot=True, cmap='RdYlGn')

Задача 3

Найдите количество промокодов и обращений. Чтобы посчитать промокоды, найдите сумму столбца 'promo'. В этом столбце записаны только 1 и 0, поэтому сумма даст количество промокодов.
Затем посчитайте среднее количество выданных промокодов.
import pandas
import seaborn

data = pandas.read_csv('support_data_ds.csv')

segments_new = ['Потенциальные клиенты', 'Обычные клиенты', 'VIP-клиенты']
intervals = ['До внедрения роботов', 'После внедрения роботов']

# для каждой пары сегмент-интервал посчитайте сумму выданных промокодов
# так как в столбце promo есть только значения 1 и 0, сумма даст количество промокодов
promo_sum = data.groupby(['segment', 'interval'])['promo'].sum()
# для каждой пары сегмент-интервал найдите количество записей
promo_count = data.groupby(['segment', 'interval'])['promo'].count()

mean_promo =promo_sum/promo_count # посчитайте среднее: разделите количество промокодов на количество записей
print(mean_promo)

Теперь посмотрите тепловую карту и проанализируйте среднее количество выданных промокодов.

import pandas
import seaborn

data = pandas.read_csv('support_data_ds.csv')

segments_new = ['Потенциальные клиенты', 'Обычные клиенты', 'VIP-клиенты']
intervals = ['До внедрения роботов', 'После внедрения роботов']

# для каждой пары сегмент-интервал считаем сумму выданных промокодов
# так как в столбце promo есть только значения 1 и 0, то сумма даст количество промокодов
promo_sum = data.groupby(['segment', 'interval'])['promo'].sum()    
# для каждой пары сегмент-интервал считаем количество записей
promo_count = data.groupby(['segment', 'interval'])['promo'].count()

# считаем среднее: делим сумму на количество
mean_promo = promo_sum / promo_count
print(mean_promo)

# строим тепловую карту для количества промокодов
# столбец mean_promo получился вложенным из-за группировки по двум столбцам,
# поэтому его нужно «развернуть» методом unstack()
seaborn.heatmap(mean_promo.unstack('interval'),
                xticklabels=intervals,
                yticklabels=segments_new,
                annot=True,
                cmap='RdYlGn')

Задача 4

Постройте тепловую карту, отображающую зависимость оценки от среднего количества выданных промокодов. Для этого:
  • найдите уникальные значения оценок из столбца score;
  • посчитайте среднее количество промокодов для каждой оценки.
Чтобы построить тепловую карту, уникальные значения должны быть отсортированы по убыванию. Для этого выполните поиск уникальных значений внутри функции sorted() — она расположит значения в правильном порядке. Поэтому напишите необходимый код в скобках рядом с названием функции. Оно уже в прекоде.
import pandas
import seaborn

# считываем данные
data = pandas.read_csv('support_data_ds.csv')

# для каждой пары интервал-оценка считаем количество выданных промокодов
sum_promo = data.groupby(['interval', 'score'])['promo'].sum()
# для каждой пары интервал-оценка считаем количество записей
count_promo = data.groupby(['interval', 'score'])['promo'].count()

# формируем список интервалов
intervals = ['До внедрения роботов', 'После внедрения роботов']

scores = sorted(data['score'].unique()) # соберите все уникальные оценки из столбца score

promo_chance = sum_promo/count_promo # разделите количество промокодов на количество записей
print (promo_chance)
#seaborn.heatmap(unstack('promo_chance')) # постройте тепловую карту для среднего количества промокодов;
seaborn.heatmap(promo_chance.unstack('interval'),
                xticklabels=intervals,
                yticklabels=scores,
                annot=True,
                cmap='RdYlGn')

   7.8 Каждому свое.

   7.9 Рекомендации клиентам.

Задача 1

Загрузите тренировочные и тестовые данные клиентов Moscow Catnamycs и выведите на экран их размеры с помощью атрибута shape.
import pandas

 # загрузите файл с данными для обучения 'train_data_cat.csv'
X_train =pandas.read_csv('train_data_cat.csv') 
# загрузите файл с данными для теста 'test_data_cat.csv'
X_test = pandas.read_csv('test_data_cat.csv')
y_train = pandas.read_csv('train_target.csv') # целевая переменная target из обучающей выборки
y_test = pandas.read_csv('test_target.csv') # целевая переменная target из тестовой выборки

print (X_train.shape) # выведите на экран размер X_train
print (X_test.shape) # выведите на экран размер X_test
Задача 2
Импортируйте из модуля sklearn.neighbors алгоритм ближайших соседей для решения задачи классификации. Задайте ему 3 ближайших соседа в параметре n_neighbors.
import pandas
from sklearn.neighbors import KNeighborsClassifier # импортируйте KNeighborsClassifier из sklearn.neighbors

X_train = pandas.read_csv('train_data_cat.csv')
X_test = pandas.read_csv('test_data_cat.csv')

y_train = pandas.read_csv('train_target.csv')
y_test = pandas.read_csv('test_target.csv')

knn = KNeighborsClassifier(n_neighbors=3) # передайте KNeighborsClassifier в качестве аргумента 3 соседа

# напечатайте knn
print (knn)
Задача 3
Обучите алгоритм ближайших соседей с тремя соседями на тренировочных данных. Затем предскажите на тестовых данных целевую переменную и выведите её на экран.
import pandas
from sklearn.neighbors import KNeighborsClassifier

X_train = pandas.read_csv('train_data_cat.csv')
X_test = pandas.read_csv('test_data_cat.csv')

y_train = pandas.read_csv('train_target.csv')
y_test = pandas.read_csv('test_target.csv')

knn = KNeighborsClassifier(n_neighbors=3)

knn.fit(X_train,y_train) # обучите алгоритм на тренировочных данных

y_pred = knn.predict(X_test) # предскажите целевую переменную на тестовой выборке при помощи обученного алгоритма

# напечатайте y_pred
print (y_pred)
Осталось оценить получившийся алгоритм. Для этого проще всего воспользоваться одной из самых известных метрик качества в классификации — подсчитать долю правильных ответов.
 
Задача 4
Выведите на экран долю правильных ответов, которую предсказывает алгоритм на тестовых данных клиентов.
import pandas
from sklearn.neighbors import KNeighborsClassifier
# импортируйте метрику доли правильных ответов accuracy_score из sklearn.metrics
from sklearn.metrics import accuracy_score
X_train = pandas.read_csv('train_data_cat.csv')
X_test = pandas.read_csv('test_data_cat.csv')

y_train = pandas.read_csv('train_target.csv')
y_test = pandas.read_csv('test_target.csv')

knn = KNeighborsClassifier(n_neighbors=3)

knn.fit(X_train, y_train)

y_pred = knn.predict(X_test)

accuracy = accuracy_score(y_test,y_pred) # подсчитайте долю правильных ответов предсказанных значений целевой переменной с истинными ответами на тестовой выборке

print("Accuracy is: ", accuracy)

   7.10 Последствия.

   7.11 Заключение.

Вы решили последний кейс вводного курса и помогли Гоше восстановить справедливость. Поздравляем! Образовательная часть этого курса завершена.
За время прохождения курса вы освоили базовые концепции Python, выучили множество полезных функций, научились строить несколько видов графиков, а также обучать свою первую модель машинного обучения. Кроме этого, вы приобрели важнейшие навыки: научились правильно уточнять задачи, выдвигать и проверять гипотезы, исследовать данные и формулировать выводы.
Вы решили четыре кейса и научились профессионально работать с данными — изучать, находить проблемы, связи и закономерности, визуализировать. Спасибо за вложенные в учёбу время и силы. Эти знания помогут вам успешно пройти дальнейшее обучение и полностью освоить профессию.
Поздравляем с завершением курса!
Будем рады видеть вас среди студентов нового потока.
Пожалуйста, ответьте на несколько вопросов.
 

Следующий раздел: Полезные инструкции для учебы

Вернуться в оглавление: Я.Практикум