0.3 NumPy и графики: от таблицы к X и y

Урок 0.3. NumPy и графики

После урока вы сможете:

  • выполнять вычисления над массивами NumPy без циклов;
  • строить линейный график, столбчатую диаграмму и гистограмму;
  • выбирать тип графика под вопрос;
  • готовить таблицу признаков X и целевую переменную y.

NumPy: вычисления без циклов

NumPy — библиотека для быстрых вычислений над массивами чисел. На ней построены pandas и scikit-learn. Главная идея: операция применяется сразу ко всему массиву.

import numpy as np

prices_arr = np.array([120, 150, 190, 210, 240])

prices_arr * 1.1         # [132. 165. 209. 231. 264.] — повышение цен на 10%
prices_arr.mean()        # 182.0
np.median(prices_arr)    # 190.0
np.log1p(prices_arr)     # логарифм — понадобится в модулях 2 и 5

Почему это важно: цикл по миллиону строк в Python работает секунды, операция NumPy — миллисекунды. Поэтому в pandas пишут df['revenue'] = df['quantity'] * df['price_som'], а не цикл по строкам.

Какой график для какого вопроса

Вопрос График Команда
Как показатель меняется во времени? Линейный plt.plot()
Как сравнить категории? Столбчатый .plot.bar(), .plot.barh()
Как распределены значения? Гистограмма .plot.hist()
Как связаны два числа? Точечный .plot.scatter()

Выручка по дням

import matplotlib.pyplot as plt

daily = df.groupby('date')['revenue'].sum()
plt.figure(figsize=(10, 3.5))
plt.plot(daily.index, daily.values)
plt.title('Выручка сети по дням, сом')
plt.xticks(rotation=45); plt.tight_layout(); plt.show()

Часы и категории

fig, ax = plt.subplots(1, 2, figsize=(12, 4))      # два графика рядом
df.groupby('hour')['order_id'].count().plot.bar(ax=ax[0], title='Заказы по часам')
df.groupby('category')['profit'].sum().sort_values().plot.barh(ax=ax[1], title='Прибыль по категориям, сом')
plt.tight_layout(); plt.show()

Что показали графики «Ала-Арча Кофе»: два пика гостей — утром в 9 часов (кофе перед работой) и в обед в 13 часов, затем вечерняя волна в 18–19 часов. Кофе приносит 437 тысяч сомов прибыли — больше, чем чай, выпечка и десерты вместе. Вывод для владельца: в пиковые часы нужен второй бариста, а не второй кондитер.

Распределение суммы заказа

df['revenue'].plot.hist(bins=30, title='Распределение суммы заказа, сом')

Средний заказ — около 280 сомов, медиана — 230. Среднее больше медианы, потому что немногие большие заказы тянут его вверх. Такое распределение называется скошенным вправо. В модулях 2 и 5 вы узнаете, почему для таких данных полезен логарифм.

Мост к машинному обучению: X и y

Любая задача машинного обучения с учителем начинается с одного и того же шага: разделить данные на признаки X (что знаем) и целевую переменную y (что хотим предсказать).

X = df[['branch', 'hour', 'is_weekend', 'category', 'customer_type']]   # таблица признаков
y = df['revenue']                                                         # столбец-цель
X.shape, y.shape     # ((4000, 5), (4000,))

Например, по этим признакам можно было бы прогнозировать сумму заказа. Как построить такую модель и проверить её качество — тема модуля 1.

Задание для самопроверки: в какой час выходных дней сеть получает наибольшую прибыль? Подсказка: отфильтруйте выходные, сгруппируйте по часу и найдите максимум через .idxmax(). Решение — в конце ноутбука.

Итоги урока и модуля

  • NumPy выполняет операции над целыми массивами — быстро и без циклов.
  • Тип графика выбирается по вопросу: время, сравнение, распределение или связь.
  • Если среднее заметно больше медианы, распределение скошено.
  • Данные для ML делятся на признаки X и целевую переменную y.

Вы готовы к основному курсу. Выполните практическое задание модуля и переходите к модулю 1 — первой модели машинного обучения для агентства недвижимости «BishkekDom».