Перейти к содержимому
TelegramGitHub

Данные и типы

Прежде чем считать, нужно понять, какие у нас данные.

В таблице orders одна строка — один заказ. Это наблюдение. Один столбец — один признак (переменная): сумма, канал, устройство.

  • Генеральная совокупность — все объекты, о которых мы хотим знать. Например, все заказы магазина за всё время.
  • Выборка — часть совокупности, которую мы реально видим. Например, 1000 заказов за три месяца.

Почти всегда мы работаем с выборкой, а выводы хотим сделать про всю совокупность. Для этого нужна статистика. Подробнее — в уроке Выборка и доверительный интервал.

Если выборка собрана плохо, выводы будут неверными. Например, опрос только среди клиентов с мобильным приложением не покажет мнение всех клиентов.

ТипЧто этоПример в ordersЧто можно считать
Числовой непрерывныйЛюбое число на шкалеamount, delivery_hoursСреднее, медиана, разброс
Числовой дискретныйЦелые числа, счётitemsСреднее, медиана, мода
КатегориальныйГруппы без порядкаchannel, deviceКоличество и доля, мода
ПорядковыйГруппы с порядкомОценка 1–5, размер S/M/LМедиана, мода
ВремяДата или моментorder_dateГруппировка по дням и месяцам
ИдентификаторИмя записиorder_id, customer_idТолько считать. Среднее бессмысленно

Тип определяет, что можно считать. Среднее customer_id посчитать можно, но смысла в нём нет.

Подготовка: вы в папке stats-practice.

import csv
with open("data/orders.csv") as f:
orders = list(csv.DictReader(f))
print(len(orders))
# все суммы как числа
amount = [float(row["amount"]) for row in orders]
print(amount[:3])
# уникальные каналы
channels = set(row["channel"] for row in orders)
print(channels)

Ответ (порядок каналов в set может отличаться):

1000
[77.62, 34.75, 16.18]
{'organic', 'ads', 'email'}

[float(row["amount"]) for row in orders] — это генератор списка. Он берёт каждую строку и делает из текста число.

Сколько строк в orders? Сколько разных клиентов (customer_id) сделали заказы? Посчитайте на Python и на SQL.

Проверка: 1000 заказов, 288 клиентов.

Решение

Python:

import csv
with open("data/orders.csv") as f:
orders = list(csv.DictReader(f))
print(len(orders))
print(len(set(row["customer_id"] for row in orders)))

SQL:

SELECT count(*), count(DISTINCT customer_id) FROM orders;

Определите тип каждого столбца orders: непрерывный, дискретный, категориальный, время или идентификатор.

Проверка:

СтолбецТип
order_id, customer_idидентификатор
order_dateвремя
channel, deviceкатегориальный
itemsдискретный
amount, delivery_hoursнепрерывный

Сколько заказов сделано в феврале 2024? Назовём это задание «на фильтр».

Проверка: 312.

Решение

Python. Дата в файле — текст вида 2024-02-11. Значит, подходит проверка начала строки:

feb = [row for row in orders if row["order_date"].startswith("2024-02")]
print(len(feb))

SQL:

SELECT count(*)
FROM orders
WHERE order_date >= '2024-02-01' AND order_date < '2024-03-01';

Сколько заказов пришло через каждый канал? Какой канал самый частый?

Проверка: organic — 386, ads — 360, email — 254. Самый частый — organic.

Решение

Python:

from collections import Counter
print(Counter(row["channel"] for row in orders))

Counter считает, сколько раз встретился каждый элемент.

SQL:

SELECT channel, count(*) AS n
FROM orders
GROUP BY channel
ORDER BY n DESC;

Дальше: Среднее, медиана, мода.