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».
