Data Driven / Bogdan Ivanov
892 subscribers
68 photos
47 videos
2 files
53 links
Данные, карьера, саморазвитие

https://datadrivenbogdan.com/

Помогаю вырасти в работе с данными и зарабатывать больше.
За менторством и сотрудничеством — @b_ivanov_kz
Download Telegram
Сегодня хочу порекомендовать вам канал Змеиный Анализ на который я наткнулся совсем недавно. Это канал Кямрана, он бывший бэкенд-разработчик, который осознанно свичнулся в аналитику.
И, да, это было одно из лучших карьерных решений.

Почему принял такое решение❓
Он подробно рассказал об этом в этом посте

📊 В аналитике он уже почти 3 года
Недавно сменил компанию, прошёл весь путь собеседований и онбординга заново, со свежей головой и актуальным рынком.

Сейчас он:

➖работает аналитиком в коммерческом продукте

➖консультирует и менторит ребят, которые только вкатываются в аналитику

➖помогает понять, куда идти, что учить и как не слить год впустую

В этом канале вы найдете:

Весь его путь и как пришел в IT

Почему решил свичнуться из BACKEND разработки в АНАЛИТИКУ.

Топ пять инструментов для анализа данных

Советы для аналитика данных. Как стать лучше?

Как нашел новую работу с оффером 180к, спустя два месяца собесов

Если ты:

➖думаешь о свиче в аналитику

➖уже учишься, но не понимаешь, что делать дальше

➖или хочешь аналитику с мозгами разработчика, а не «таблички ради табличек»

👉 Подписывайся. У него полезно.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥8❤7👍7🍌11
Обзор собеседования (Ч. 1)

Компания: USETECH (аутстафф)
Вилка: +-250к net
Должность: Дата аналитик
Формат: Удаленный
Этапы собеседования:
HR – Тех. собес 1 (внутренний) – Тех. собес 2 (у заказчика) – Offer
Грейд: Middle / Middle +
Дата собеседования: декабрь 2025

Давно не было обзоров и вот опять! Тех. собес был оч длинный - около 1.5-2х часов
Cначала сама галера собесит, дальше уже напрямую заказчик. Как сказала HR, иногда могут сразу напрямую к заказчику направить на собес (минуя внутренний тех. этап).
Из явных плюсов - удобно для второй работы, тк могут оформлять по ИП/ГПХ.

Сам обзор разобью на 2 части - материала много и он показался интересным. В данной части разберем техничку SQL + Python, а в след. блоке обсудим теор/практические вопросы, которые поднимались на собесе.

Технический блок: SQL + Python

1️⃣ Выручка по месяцам

Посчитать месячную выручку по таблице orders.
Решение:
SELECT
DATE_TRUNC('month', order_date) AS month_id,
SUM(amount) AS rev
FROM orders
GROUP BY 1;


2️⃣ Клиенты с повторными заказами

Найти клиентов, у которых больше одного заказа.
Решение:
SELECT customer_id
FROM orders
GROUP BY 1
HAVING COUNT(*) > 1;


3️⃣ Порядковый номер заказа клиента

Пронумеровать заказы каждого клиента по дате.
Решение:
SELECT
customer_id,
order_id,
ROW_NUMBER() OVER (
PARTITION BY customer_id
ORDER BY order_date
) AS rn
FROM orders;


4️⃣ Доля сотрудников с зарплатой выше порога

Посчитать долю сотрудников с зарплатой выше 50 000.
employee_salaries (employee_id, salary)
Решение:
SELECT
COUNT(*) FILTER (WHERE salary > 50000) * 1.0 / COUNT(*) AS share
FROM employee_salaries;

ps проверяют знание FILTER и понимание целочисленного деления (в SQL int / int дает 0 без приведения к float, те если не умножим числитель/знаменатель на 1.0/ не переведем его в float - в выводе будет 0)

5️⃣ Корреляция зарплаты и перформанса

Оценить корреляцию между зарплатой и performance score.
employee_salaries (employee_id, salary, performance_score)
Решение:
SELECT
CORR(salary, performance_score) AS corr
FROM employee_salaries;

ps база по статистике + допом был вопрос почему корреляция не равна причинности
(показывает наличие связи, но не объясняет (не)влияния друг на друга)

6️⃣ Средняя зарплата и разброс по департаментам

Посчитать среднюю зарплату и стандартное отклонение по департаментам.
employee_salaries (employee_id, department_id, salary)
Решение:
SELECT
department_id,
AVG(salary) AS avg_sal,
STDDEV(salary) AS std_sal
FROM employee_salaries
GROUP BY 1;

ps базовая статистика в SQL

Python

7️⃣ Агрегация по категориям

Посчитать суммарные net sales по категориям.
df (category, net_sales)
Решение:
result = df.groupby("category", as_index=False).agg(
total_net=("net_sales", "sum"))

ps база по работе с пандас

8️⃣ Флаг «выше среднего»

Создать бинарный флаг: продажи выше среднего. df (sales)
Решение:
avg_sales = df["sales"].mean()
df["flag"] = (df["sales"] > avg_sales).astype(int)


9️⃣MinMaxScaler

Нормализовать продажи через MinMaxScaler
df (sales) (Написать самому, без import'a)
Решение:
df["sales_norm"] = (
(df["sales"] - df["sales"].min()) /
(df["sales"].max() - df["sales"].min()) )

ps это один из подходов к нормализации данных - приведение признаков к единому масштабу [0;1], чтобы признаки были сопоставимы между собой (часто требуется для обучения моделей). Альтернатива - стандартизация, данные приводятся к среднему 0 (от значения отнимается среднее) и стандартному отклонению 1 (делится на стандартное отклонение)

1️⃣0️⃣ NaN / None / NA

*️⃣None - объект Python (NoneType), обозначает отсутствие значения, используется без дополнительных библиотек
*️⃣NaN - специальное числовое значение типа float («не число»), применяется для пропусков в числовых данных (math / numpy / pandas)
*️⃣NA - тип pandas NA, используется в pandas как универсальное обозначение пропусков и совместим с NaN

В целом, задачки не сложные, по теор. блоку спрос был посерьезнее, но это уже во 2 части

А ты бы решил все задачки?👇

@data_driven_bogdan
Please open Telegram to view this post
VIEW IN TELEGRAM
❤18🔥6
Предновогодние итоги🎄

Если честно — напиздел...

Никаких итогов года подводить не хочется. Хочется верить, что каждый и так знает, что в текущем году он сделал максимум и в предстоящий год заходит с намерением сделать еще лучше. За себя могу сказать точно - стремлюсь в значимых для меня вещах выкладываться на максимум. А значит, можно честно сказать себе: молодец. И предлагаю каждому в эти дни найти время и смелость сказать себе спасибо — за все, что получилось и за все, что было непросто.

Поэтому сегодня просто про Новый год и то, что действительно важно в эти дни.

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

И есть у нас одна семейная традиция, которой мы придерживаемся уже много лет:

31 декабря — мы идем в баню🧖‍♂️
А вечером — обязательно в кинотеатр🎬


Каждый год одно и то же, но именно в этом и кайф. Как будто Новый год без этого просто не запускается
Никакой суеты, спокойный день, ощущение завершения и перехода в праздник.

Ну и, конечно, хочу поздравить вас всех с наступающим! 🎄
Пусть праздники дадут вам отдых, тепло, время для себя и близких.
А в новом году — спокойствия, здоровья, сил и простого человеческого счастья.

А теперь вопрос вам👇

Есть ли у вас какие-то традиции в предновогодний день или на новогодних праздниках?

Очень интересно почитать в комментариях 👀👀👀

@data_driven_bogdan
Please open Telegram to view this post
VIEW IN TELEGRAM
❤35🔥97
Итоги от ЛЛМки👨‍💻

Увидел у коллег по цеху такую прикольную штуку с итогами года от ЛЛМки по тг каналам и решил тоже посмотреть что же она выдаст по моему
(да-да, самому писать их, как вы поняли, мне максимально впадлу...)

Вбил свой канал иии
тут я ахуел...

Вот что она написала первой строкой:

tech-savvy Gen Z фаундер вайб

Что это блядь за набор букв и какого хуя она меня обозвала, подумал я тут же — и полез разбираться😡

Коротко, что это значит:

*️⃣tech-savvy — шаришь в технологиях и используешь их по делу
*️⃣Gen Z вайб — простой язык, без пафоса и корпоративного буллшита
*️⃣фаундер — не «исполнитель по ТЗ», а человек, который сам думает, как и зачем что-то делать

Короче: человек из практики, который пишет про технологии нормально, по-человечески, и не строит из себя доктора наук.

Остальной анализ я прикреплю скрином — там она довольно прикольно расписала — что за канал, про что он и почему + немного статистики по каналу.

Ниже также выложу блок "Что она думает о канале":

1️⃣Анализ постов показал, что основной фокус — на практической аналитике: SQL, Python, ETL, архитектура данных. Темы повторяются в разных форматах — обзоры собесов, лайфхаки, теория.

2️⃣Тон канала — разговорный, без пафоса, с лёгкой самоиронией. Автор не претендует на гуру, а делится опытом как коллега, который тоже учится.

3️⃣Ключевой инсайт: канал не просто учит инструментам, а помогает понять, как они работают в реальных кейсах — от собесов до архитектуры Greenplum.

4️⃣Часто упоминаются конкретные технологии: SQL, Python, dbt, Airflow, Greenplum, Kafka, ClickHouse — это не абстракции, а реальные инструменты из жизни.

5️⃣ Автор делает акцент на деталях: например, как работает UNION ALL с NULL, почему важно выбирать distribution key в Greenplum, как писать эффективный SQL.

6️⃣Важно, что канал не только про технические навыки, но и про процесс: как писать резюме, как готовиться к собесу, как выстраивать карьеру в аналитике.

7️⃣Есть элементы мемности: «не знал, буду юзать», «все и так работает, так что оставь себе и не еби мозг», «контента на этой недели нет — всему виной мой трип».

8️⃣Канал живой, не формальный, с лёгким юмором, но без кринжа. Автор — не эксперт, а практик, который делится тем, что реально работает.

Итого:
К счастью — она меня не обзывала, диагнозов не ставила так что все нормально,
в новый год можно идти с хорошим настроением!😁

Так что всех еще раз с Наступающим!🎄🥂🎄

P.S. Исходя из статистики канала план на следующий год следующий: добавить минимум один нолик к текущему количеству подписчиков.

Услышимся в 2026🚀🚀🚀

@data_driven_bogdan
Please open Telegram to view this post
VIEW IN TELEGRAM
❤17😁127👍5
Праздники ещё идут — и нет, я не спился😁

Начало января 2026 для меня — про размеренный отдых и паузу.
Без спешки и перегруза. Просто время, в котором можно: выспаться, выдохнуть, спокойно подумать и, в целом, нормально отдохнуть

Сейчас я в Белграде🇷🇸 — гуляю, знакомлюсь с городом и страной, ловлю ощущение перезагрузки. Очень классное чувство — начинать год без суеты, без дедлайнов, без вечного «надо было ещё вчера».

Особенно это ощущалось сегодня, 7 января — здесь празднуют Рождество.
Город буквально нажал на паузу: около 95% всего закрыто — музеи, заведения, магазины. Работают только точечные кафешки (и то, они начали открываться ближе к 14-15) и, конечно же, храмы. Люди никуда не торопятся, день просто проживается.

Фотки с Сербии прикладываю в посте📸
Пока это 3 день, поэтому, вероятно, дополню после поездки и мб напишу про Сербию отдельный пост (в рамках какой-нибудь конкретной темы). Кстати, если что-то интересно — пишите в комментарии, вполне это может перерасти в пост.

А вообще, иногда лучший способ провести праздники — позволить себе тишину и неспешность, хотя я тот ещё любитель покутить.

А как вы проводите свои праздники? 👀

@data_driven_bogdan
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
❤30🔥21😍13
Что за вкус интересно…
🧐🤨🤔

@data_driven_bogdan
😁322118
✈️ Tax Free в путешествиях: как вернуть бабки с покупок и не проебаться

Думал, про что написать с Сербии — и, под конец поездки тема сама пришла, мы вспомнили о возможности возврата НДС после покупок, которой и воспользовались, поэтому я решил рассказать о tax free что это и как им воспользоваться и вернуть себе бабки после трат за границей.

С этой темой я сталкивался еще раньше, когда ездил в США, и вот в крайний день в Сербии мы тоже про это вспомнили — как раз вовремя.

Коротко, что это вообще такое

Tax Free — это возможность вернуть НДС с покупок, при выезде из страны, в которой они были приобретены (должен быть нерезидентом).

В Сербии, например:
*️⃣минимальная сумма чека для Tax Free — от 6 000 динар (+- 4.8к рублей)
*️⃣действует не на все товары

ставка НДС в Сербии 20%/10%/0% также, в зависимости от товара.

PS В каждой стране правила разные — перед поездкой лучше загуглить конкретно под страну.

Какие вообще бывают Tax Free❓

Глобально — 2 варианта:

1️⃣ Instant Tax Free

Ты показываешь паспорт прямо при покупке, и тебе сразу вычитают НДС из суммы.
Очень удобно, такое чаще встречается в Азии — в Японии точно есть.

2️⃣ Классический

Ты сначала платишь полную сумму, а потом уже занимаешься возвратом НДС. Такой вариант распространен в Европе.

Дальше разберем именно этот вариант (чеков можно оформлять несколько)

1️⃣ Купили вещи на >6к динар в одном чеке

2️⃣ Просим Tax Free Form на кассе

Кстати, как оказалось: не обязательно делать это день в день, мы вообще пришли за формой в последний день

При себе нужно иметь паспорт

Далее на кассе заполняют форму, к ней крепят чеки и далее ты выбираешь способ возврата: кэшом или на карту

От этого дальше будет зависеть сценарий.

Кстати, как обычно, у меня все прошло не без проблем - на этом этапе у меня не правильно заполнили форму. В итоге нашли вариант выхода из данной ситуации: сделали возврат покупки, пробили их заново, оформили новый Tax Free Form на новые чеки. Повезло, что вещи были с собой.
Если бы нет — могли быть проблемы.


Что дальше (если не instant, тк при нем просто показываем паспорт при покупке и нам вычитают НДС из стоимости).

3️⃣ При выезде из страны нужно заверить форму Tax Free у таможни

Условия к моменту выезда:
*️⃣вещи не использованы
*️⃣с бирками
*️⃣желательно в коробке

Сам штамп ставят
*️⃣после регистрации, но до паспортного контроля
*️⃣либо прямо на регистрации просишь вызвать таможенника,
если планируешь сдать эти вещи в багаж

Там ставят штамп — и все, форма валидна.

4️⃣Как дальше получить бабки❓

*️⃣Наличкой в аэропорту

После паспортного контроля, в зоне вылета - в Сербии был отдельный магазик, где выдают кеш
Как обычно, тут не без проблем - я летел обратно ночью, а начинал этот магазин работать только с 6 утра)) В любом случае, возврат кэшем я не выбирал, но если выберите вы, посмотрите есть ли такой магазин/пункт при выезде из страны у вас и время его работы перед выбором возврата денег на этапе оформления формы.

*️⃣ При возврате в страну

В течение 1 года (иногда 3 месяца — зависит от страны).
Приходишь в магазин с формой — возвращают всю сумму НДС.

Есть вариант передать "штампованную" форму человеку, который планирует ехать в эту страну и он уже получит эти деньги и вернет тебе (или кинет, смотря кого попросил). У этого варианты есть свои минусы, тк нужен вариант кого то, кто едет в эту страну, либо самому планировать приезд, но в таком случае, ты сможешь вернешь всю сумму НДС (на примере чека - это 20%)

*️⃣Посредники (как сделал я)

Я воспользовался Global Blue.

Как это работает:
*️⃣загружаешь Tax Free Form в приложение
*️⃣подтверждаешь штамп в таможне
*️⃣через 1–3 дня приходит возврат на карту
ps статусы обновляются автоматически

Из явных минусов — возвращают не всю сумму НДС
из 20% по факту выходит примерно 10–15% но, за то быстро, в моем случае вернули 12%

Если всё сделать правильно — можно вернуть приятную сумму и закрыть вопрос без стресса, надеюсь кто-то сможет вернуть свою лавеху🍌

👇Пользовались ли tax free услугой?

@data_driven_bogdan
Please open Telegram to view this post
VIEW IN TELEGRAM
1❤53👍41🔥35
Обзор собеседования

Продолжаем разбор собеседования в USETECH (Ч. 2). В первой части были SQL + Python задачки, их можно посмотреть тут. Во второй — теория, системное мышление и вопросы “на понимание”.

SQL

1️⃣ Что такое подзапрос
Запрос внутри запроса, может быть в SELECT, WHERE или FROM.

2️⃣ Коррелированный подзапрос
Подзапрос, который ссылается на внешнюю таблицу и фактически сравнивает строку с самой собой по условию.

3️⃣ CTE (WITH)
Подзапрос, вынесенный в отдельную временную таблицу для читаемости и переиспользования.

4️⃣ UNION vs UNION ALL
UNION — убирает дубликаты
UNION ALL — просто склеивает результаты

5️⃣ INTERSECT и EXCEPT
INTERSECT — строки, которые есть в обеих таблицах
EXCEPT — строки из первой, которых нет во второй

6️⃣ Работа с NULL (COALESCE)
COALESCE заполняет NULL первым ненулевым значением из списка аргументов.

7️⃣ Работа с датами
EXTRACT / DATE_PART — получить год, месяц
CAST или :: — приведение типов

8️⃣ Оконные функции
Считают агрегаты без схлопывания строк.

9️⃣ ROW_NUMBER / RANK / DENSE_RANK
ROW_NUMBER — уникальный номер
RANK — с пропусками
DENSE_RANK — без пропусков

1️⃣0️⃣ PIVOT / UNPIVOT
Транспонирование таблицы: строки ↔️ колонки.

Python / Pandas

1️⃣1️⃣ list vs tuple
list — изменяемый
tuple — неизменяемый

1️⃣2️⃣ Почему NumPy быстрее циклов
Векторизованные операции выполняются на уровне C, а не Python.

1️⃣3️⃣ Что такое векторизация
Операции сразу над массивом, а не поэлементно.

1️⃣4️⃣ Если данные не помещаются в память
Читать и обрабатывать чанками.

1️⃣5️⃣ Работа с большими файлами (chunks)
Чтение и запись по частям, без загрузки всего в память.

1️⃣6️⃣ Parquet
Колоночный формат хранения, компактный и быстрый для аналитики.

1️⃣7️⃣ loc vs iloc
loc — по меткам
iloc — по индексам

1️⃣8️⃣ Типовой пайплайн в Pandas
read → describe → чистка → трансформации → EDA → сохранение

1️⃣9️⃣ merge vs concat
merge — аналог JOIN
concat — склейка по строкам или колонкам (аналог UNION)

Статистика

2️⃣0️⃣ Корреляция
Мера связи между числовыми переменными, от −1 до 1.

2️⃣1️⃣ Пирсон vs Спирмен
Пирсон — линейная связь
Спирмен — ранговая

2️⃣2️⃣ Почему корреляция ≠ причинность
Показывает связь, но не объясняет влияние.

2️⃣3️⃣ ДИ
Диапазон, в котором с заданной вероятностью лежит истинное значение параметра.

2️⃣4️⃣ Интерпретация 95% ДИ
В 95% случаев интервал накрывает истинное значение.

2️⃣5️⃣ Среднее / медиана / мода
Среднее — сумма / количество
Медиана — центральное значение
Мода — самое частое

2️⃣6️⃣ Почему медиана устойчивее
Меньше чувствительна к выбросам.

БД и архитектура

2️⃣7️⃣ SMP vs MPP
SMP — один узел
MPP — параллельные вычисления на сегментах

2️⃣8️⃣ PostgreSQL vs Greenplum
Postgres — SMP, строковое хранение
Greenplum — MPP, распределённые вычисления

2️⃣9️⃣ Почему Greenplum быстрее
Параллельные вычисления на сегментах.

3️⃣0️⃣ Дистрибуция данных
Распределение строк по сегментам.

3️⃣1️⃣ Data skew
Неравномерное распределение данных → самый медленный сегмент тормозит весь запрос.

3️⃣2️⃣ ClickHouse — плюсы и минусы
Плюсы: колоночное хранение, быстрые агрегации
Минусы: слаб для OLTP, частых JOIN и INSERT

3️⃣3️⃣ Data Lake
Хранилище файлов/ сырые данные, дешёвое, без строгой схемы.

Инфа / DE

3️⃣4️⃣ Docker vs VM
Контейнеры шарят ОС → легче и быстрее
VM — отдельная ОС → тяжелее

3️⃣5️⃣ Dockerfile
Инструкция сборки контейнера из слоёв.

3️⃣6️⃣ Порядок слоёв в Dockerfile
Влияет на кэширование и скорость сборки.

3️⃣7️⃣ Как уменьшить Docker-образ
Slim / Alpine образы, меньше слоёв, правильный порядок RUN.

3️⃣8️⃣ Docker Compose
YAML-файл для запуска нескольких контейнеров и их сети.

3️⃣9️⃣ Airflow
Инструмент оркестрации пайплайнов.

4️⃣0️⃣ DAG
Граф задач с зависимостями.

4️⃣1️⃣ Kafka
Брокер сообщений для стриминга данных.

4️⃣2️⃣ Producer / Consumer / Topic / Partition
Producer пишет в topic
Consumer читает из партиций

4️⃣3️⃣ Consumer Group
Группа консьюмеров, каждый читает свою партицию.

4️⃣4️⃣ At-least-once / At-most-once / Exactly-once
At-least-once — возможны дубли
At-most-once — возможны потери
Exactly-once — ровно один раз (самый сложный)

@data_driven_bogdan
Please open Telegram to view this post
VIEW IN TELEGRAM
❤38🔥31206👍1👏1
This media is not supported in your browser
VIEW IN TELEGRAM
Хорошего окончания рабочей недели!
И немного юморка вам в придачу — чтобы никто такое безобразие вам в mr не предлагал!

@data_driven_bogdan
❤29🤣20🔥13🥰7👍4👏4
Обзор собеседования (Ч.1)

Компания: Dodo brands
Вилка: +-350 net
Должность: Дата аналитик
Формат: Удаленный
Этапы собеседования:
HR – Тех. собес (внутренний) – Хуево кукуево созвонов с кем только можно – Offer
Грейд: Middle + / Senior
Дата собеседования: декабрь 2025

Небольшое предисловие перед обзором тех собеса. На самом деле, вторая половина декабря выдалась очень насыщенной на собеседования - их было у меня просто не нормально много, как и сообщений от хрок. Кто бы что не говорил о том, что это уже не сезон и все кто мог ушли на фриз, есть такое ощущение, что те, кто не ушли на фриз еще больше заинтересованы в этот момент в найме. Предполагаю это связано в том числе с тем, что команды с потребностями заинтересованы растратить свой бюджет к концу когда, чтобы им его не подрезали с учетом того, что они его не затратили в "достаточном" виде в текущем. Что такое "достаточный" вид каждый ответственный за бюджет трактует как ему кайф - цель одна, в некст году хотя бы не меньше. (могу быть не прав)

SQL, Python и немного статистического мышления

Технический блок: SQL + Python

1️⃣ 60-day retention по когортам (SQL)

Необходимо посчитать 60-day retention по факту покупок пользователей
orders (order_id, user_id, order_date)

В ответе должна быть выведена след. таблица:
- cohort_month (Первый день месяца первой покупки, YYYY-MM-01)
- cohort_size (Общее количество новых покупателей в этом месяце)
- retention_60d (Процент повторно купивших в течение 60 дней)

Решение:
-- определяем дату первой покупки каждого юзера
WITH first_order AS (
SELECT
user_id,
MIN(order_date) AS first_order_date
FROM orders
GROUP BY 1
),
-- находим юзеров, которые сделали хотя бы 1 покупку после первой в теч. 60 дней

returns AS (
SELECT DISTINCT
f.user_id
FROM first_order f
JOIN orders o
ON f.user_id = o.user_id
AND o.order_date > f.first_order_date
AND o.order_date <= f.first_order_date + INTERVAL '60 day'
)

-- считаем стату, left'ом оставляем юзеров без повторной покупки

SELECT
DATE_TRUNC('month', f.first_order_date)::date AS cohort_month,
COUNT(f.user_id) AS cohort_size,
ROUND(
COUNT(r.user_id) * 1.0 / COUNT(f.user_id),
2
) AS retention_60d
FROM first_order f
LEFT JOIN returns r USING (user_id)
GROUP BY 1;


2️⃣ Клиенты с суммарным весом покупок > 2 кг (Python)

Посчитать клиентов, у которых за последний месяц суммарный вес покупок больше 2 кг.

SALES: client_id, date, sku, cnt
DICT: sku (товар), weight (вес в кг)

Решение:
-- ласт месяц берем
last_month = sales[
sales["date"] >= sales["date"].max() - pd.DateOffset(months=1)
]
-- дикс мерджим с фактом
df = last_month.merge(dict_, on="sku", how="inner")

-- считаем тотал вес (штуки на справочный вес)
df["total_weight"] = df["cnt"] * df["weight"]

-- агрегация сум. веса по каждому клиенту и отбор по общему весу >2 кг
result = (
df.groupby("client_id", as_index=False)["total_weight"]
.sum()
.query("total_weight > 2")
)
-- список client_id
clients = result["client_id"].tolist()


3️⃣ Реализация дисперсии (Python)

Написать функцию для расчёта несмещенной выборочной дисперсии.

Решение:

def var(a: list):
mean = sum(a) / len(a)
return sum((x - mean) ** 2 for x in a) / (len(a) - 1)


Важно не перепутать population и sample variance (ну и помнить конечно, что такое дисперсия в целом — мера разброса значений относительно среднего, если на человеческом)
Несмещенная выборочная дисперсия отличается от обычной тем, что в знаменателе не n, а на n − 1 это корректирует смещение оценки дисперсии генеральной совокупности

4️⃣ Анализ распределения (статистика)

Дана выборка клиентов с тратами и нужно было проанализировать распределение
60 клиентов — 0 ₽
38 клиентов — 1000–1500 ₽
2 клиента — 10 000 ₽

Коротко:
*️⃣распределение с heavy tail
*️⃣среднее будет сильно смещено выбросами
*️⃣медиана и перцентили устойчивее

В некст части больше упора будет на статистику и потом будет 3ая очень интересная часть про переговоры

🍌 Подпишись и поддержи канал бустом

@data_driven_bogdan
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥45🦄2513❤8👏55👍4
Channel photo updated
Работаем на дефицит 🤝💼

@data_driven_bogdan
Please open Telegram to view this post
VIEW IN TELEGRAM
😁10🔥7❤64👍1