Analyst’s Notebook📖
340 subscribers
43 photos
26 links
Жизнь аналитика: карьера, образование, хард и софт скиллы etc
Автор: @glebgavrin
Download Telegram
Как взаимодействие признаков спасло мою модель: разбор кейса 🛟

Продолжаем серию постов про эконометрическое исследование зарплат (первый пост), и на этот раз разберем перекрестные переменные (переменные взаимодействия) на конкретном примере.

Это произведение двух или более регрессоров, которое добавляем в модель. Они помогают найти скрытое влияние признаков на таргет.

В моем исследовании удачным оказалось взаимодействие пола (0-м/1-ж) и уровня образования (0-школа, 1-колледж, 2-универ).

Теперь разберем конкретно мой кейс

Сначала модель была такой:
log_wage ~ age + educ + female

Тест Рамсея показал, что модель неправильно специфицирована.

Добавил квадрат возраста — тест все еще показывал проблемы. Тогда добавил взаимодействие образования и пола.

Новая модель:
log_wage ~ age + I(age**2) + educ + female + educ:female

Результаты:
• Все регрессоры стали значимы на 10%
• Тест Рамсея: модель теперь верна
• R-squared adjusted вырос с 0.252 до 0.286
• Обнаружен значимый эффект взаимодействия

Как интерпретировать коэффициенты?

В модели с взаимодействием:
educ: влияние образования для мужчин (female=0)
female: разница в зарплате при нулевом образовании (educ=0)
educ:female: дополнительное влияние образования для женщин

Что на практике?

Для мужчин (female=0):
Каждый уровень образования увеличивает зарплату на ~33.5% (коэф. 0.3352, p=0.000)

Для женщин (female=1):
Общий эффект: 0.3352 + (-0.2827) = 0.0525
Каждый уровень образования дает всего ~5.3% прибавки

Гендерный разрыв:
educ:female = -0.2827 (p=0.009) — отдача от образования для женщин значительно ниже
female = -0.2775 (p=0.057) — на старте карьеры женщины уже получают меньше

Что видно на графике? 📈
Визуализация подтверждает: у мужчин — крутой рост зарплаты с образованием, у женщин — почти горизонтальная линия. Разница особенно очевидна при переходе к высшему образованию.

Главный инсайт:
Проблема не только в том, что женщины получают меньше. Они получают значительно меньшую отдачу за каждый уровень образования.

Ставьте ❤️, если использовали перекрестные переменные
🔥, если будете использовать
⚡️, если хотите больше постов про эконометрику

Ссылка на мое исследование🔗

#аналитические_методы #статистика #эконометрика #анализ_данных
Please open Telegram to view this post
VIEW IN TELEGRAM
8🔥3🤩21😈1
Этот метод pandas я использую каждый день. И вот почему 🟢🟡🔴

Решил продолжить серию постов про визуализацию данных (первый пост), и сегодня расскажу про красивый способ табличной визуализации

Речь пойдет про df.style – метод, благодаря которому можно украшать датафреймы и выделять цветами самое важное 🎨

Подробно расскажу про 2 его модификации –
highlight_min/max и background_gradient , а про другие можете прочитать в документации.

highlight_min/max ⚡️

Позволяет выделить желаемым цветом минимум/максимум по столбцу/строке.

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

Пример с временным рядом (фото 1):

import pandas as pd
import numpy as np

dates = pd.date_range('2024-03-01', periods=10, freq='D')
price_data = {
'Дата': dates,
'Цена акции, $': [152.3, 148.7, 155.2, 147.1, 159.8, 145.5, 162.3, 158.9, 144.8, 160.1]
}

df = pd.DataFrame(price_data)

print("Динамика цены акции с выделением экстремумов:")
display(df.style
.highlight_max(subset=['Цена акции, $'], color='lightgreen')
.highlight_min(subset=['Цена акции, $'], color='#ffcccc'))


background_gradient 🚩

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

Это может быть полезно, например, для:
- сравнения финансовых показателей компаний при составлении портфеля – визуализация позволяет провести комплексный анализ
- ранжирования моделей по значению метрики качества (удобно определить, например, какой класс моделей демонстрирует лучшее качество на этих данных)

Пример сравнения ML-моделей (фото 2):

from sklearn.metrics import mean_absolute_error, mean_squared_error, mean_absolute_percentage_error
import numpy as np

def calculate_metrics(y_true, y_pred, model_name):

mae = mean_absolute_error(y_true, y_pred)
mse = mean_squared_error(y_true, y_pred)
rmse = np.sqrt(mse)
mape = mean_absolute_percentage_error(y_true, y_pred) * 100

return {
'Модель': model_name,
'MAE': mae,
'MSE': mse,
'RMSE': rmse,
'MAPE': mape,
}

# Пример вычисления метрик для разных моделей
metrics_arima100 = calculate_metrics(y_true, y_pred_arima100, 'ARIMA(1,0,0)')
metrics_arima020 = calculate_metrics(y_true, y_pred_arima020, 'ARIMA(0,2,0)')
metrics_ets = calculate_metrics(y_true, y_pred_ets, 'ETS')

import pandas as pd
metrics_df = pd.DataFrame([metrics_arima100, metrics_arima020, metrics_ets])
metrics_df = metrics_df.set_index('Модель')
print("Метрики качества моделей:")
display(metrics_df.style
.background_gradient(subset=['MAE', 'MSE', 'RMSE', 'MAPE'], cmap='RdYlGn_r'))


Также style можно использовать для покраски текста, форматирования чисел и других крутых визуализаций.


А вы используете данный инструмент? 🤔
❤️ Да, использую и кайфую
🔥 Нет, но теперь буду использовать!

Пишите в комментариях, какая тематика постов вам интересна? 💬

#визуализация_данных #pandas #python
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥93👍31😈1
Штраф за сложность: разбираем Ridge и Lasso на пальцах ⚖️

Сегодня я решил разобрать регуляризацию в контексте линейной регрессии. Если ваша модель идеально предсказывает данные, на которых выучилась, и проваливается на новых — этот пост для вас. Сегодня разбираем, как два вида регуляризации — Ridge и Lasso — помогают бороться с этой проблемой

Зачем нужна регуляризация? 🤔

Во первых, регуляризация снижает переобучение модели - излишнюю подгонку под обучающую выборку и неспособность хорошо работать на новых данных (пост про переобучение обязательно когда-нибудь напишу). Эмпирически доказано, что к переобучению ведут большие веса и большое количество признаков. Так вот, регуляризация помогает снизить или даже занулить (чаще всего в случае применения Lasso) веса.

Во вторых, регуляризация может помочь в отборе признаков . Это касается L1-регуляризации (Lasso регрессии). Менее важные предикторы исключаются путём обнуления их коэффициентов.


Чем отличаются Ridge и Lasso от обычной линейной регрессии? 🧩

Они подразумевают наличие дополнительного штрафа в функции потерь (фото). В случае Lasso, это L1-норма весов (то есть коэффициент регуляризации лямбда, умноженный на сумму модулей весов). В случае Ridge, это L2-норма весов (то есть коэффициент регуляризации лямбда, умноженный на сумму квадратов весов). С помощью этого штрафа как раз и уменьшается подгонка под обучающие данные и, как следствие, переобучение.


Когда использовать Ridge, а когда – Lasso? ⚔️

Ridge отлично подходит, когда мы предполагаем, что все регрессоры в модели важны и хоть немного влияют на таргет и при этом хотим снизить переобучение. Ridge только уменьшает коэффициенты перед признаками, оставляя все регрессоры в модели.
Lasso пригодится, если мы предполагаем, что в модели есть избыточные регрессоры, которые не оказывают значимого влияния на таргет и только зашумляют модель. Lasso автоматически отбирает значимые признаки , упрощая модель и снижая вероятность переобучиться.


Кейсы из моей практики, когда пригодились Ridge и Lasso 💼

Ridge🏔: В рамках одного из дз по ML я работал с данными о поездках на такси в Нью-Йорке. Таргетом была продолжительность поездок. Действительно информативных признаков было около 15 – это были признаки на основе координат и признаки на основе времени начала/конца поездки. Понять, что эти признаки скорее всего будут информативными, мне помог EDA, который я провел до моделирования. Благодаря Ridge регуляризации модель не переобучилась под какие-то очень информативные признаки и при этом не зануляла никакие веса, как могло бы получиться с Lasso, и качество получилось хорошим.

Lasso🪢: Однажды, перед тем, как обучать бустинговую модель, я отобрал признаки с помощью Lasso-регрессии. Lasso занулил веса перед неинформативными признаками, и я не использовал такие признаки в бустинге. Качество получилось отличным. Для эксперимента я проверил, каким бы было качество без предварительного отбора признаков, и оно оказалось хуже.

💎 Резюмируем
Боитесь переобучения и хотите сделать модель стабильнее — ваш выбор Ridge.
Нужно упростить модель и отобрать самые важные признаки — смело применяйте Lasso.
Регуляризация — это инструмент для создания более надежных и интерпретируемых моделей.

А вы уже используете Ridge или Lasso в своих проектах?

Делитесь опытом в комментариях!💬

Также в процессе подготовки этого поста я нашёл классную статью на Хабре. В ней более подробно описана математическая поднаготная Ridge и Lasso регрессий. Если интересно лучше углубиться – советую прочитать!
Еще есть статья на geeksforgeeks, она более простая для восприятия.

Ставьте
🔥, если хотите больше постов про линейные модели
и ❤️, если пост был для вас полезен

#ml #анализ_данных #регрессия
Please open Telegram to view this post
VIEW IN TELEGRAM
6🔥6😍31👍1😈1👨‍💻1
Цифры, из-за которых хочется бросить всё и уехать в Штаты 😮

Недавно я решил сделать последнее ДЗ курса по ML, которое когда-то отложил до лучших времён 🙃🤫

Там было предложено поработать с данными по зарплатам IT-специалистов (ссылка на датасет). Выше можете найти пост про элегантный способ визуализации данных, разобранный на примере данного датасета.

В ходе feature engineering у меня появилась идея рассматривать не отдельные страны, а объединить их в макрорегионы: Северная Америка, Латинская Америка, Западная Европа, Восточная Европа, Азия, Африка и Океания 🌎

Я визуализировал среднюю зарплату по макрорегионам и очень удивился, увидев такую картину (фото 1).
Средняя зарплата в Северной Америке почти в 2 раза выше, чем в Океании, которая находится на 2 месте.

Затем я обучал бустинги и при анализе важности признаков заметил, что для CatBoost флаг работы в Северной Америке с большим отрывом является важнейшим признаком , влияющим на зарплату, (фото 2), что подтверждает устойчивость наблюдаемого явления.

Меня смутили такие результаты и я решил проверить, что данные в разных макрорегионах сбалансированы по грейдам (джуниор/миддл/сеньор/лид), а также зарплаты внутри одних и тех же грейдов подчиняются той же закономерности. Оказалось, что закономерность сохраняется и внутри грейдов, но в большинстве грейдов отрыв Северной Америки не такой радикальный.

При этом присутствует сильный дисбаланс грейдов по макро регионам. В Северной Америке ~74% представителей выборки – сеньоры. В остальном мире доля сеньоров ~30%. Поэтому значительная часть разрыва, продемонстрированного на фото 1, объясняется смещённой структурой IT-сообщества в Северной Америке в сторону старших грейдов. Однако тот факт, что закономерность сохраняется и внутри грейдов, окончательно подтверждает ее устойчивость.

Для себя я выделил 3 главные причины данного явления:

Концентрация капитала💲. В Северной Америке сфокусирована основная доля мирового венчурного капитала, а также базируются крупнейшие технологические компании (FAANG и др.). Такая среда порождает высочайшую конкуренцию за грамотных специалистов и приводит к бусту зарплат.

Культура акций (equity)📈. В Северной Америке, особенно в США, принято оплачивать часть дохода специалистов акциями компании. Это не просто бонус, а существенная часть компенсационного пакета, которая серьёзно влияет на общий доход и мотивацию.

Высокая мобильность специалистов🦘. Частая смена работы за бОльшие деньги — это норма. Компании вынуждены постоянно поднимать зарплаты, чтобы удержать лучших, что в итоге "раздувает" вилки оплаты на рынке.

А какие причины данного явления можете выделить вы?
Пишите в комментариях 💬

Ставьте
🤩 если готовы прямо сейчас бросить всё и ехать в Северную Америку работать
🐳 если хотите больше постов про EDA и поиск инсайтов в данных
👨‍💻 если хотите больше постов про IT-рынок труда

#из_моей_практики #рынок_труда #исследование_зарплат
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👨‍💻8🐳7🔥41👏1😈1
Мышление как суперсила: мой путь развития 🧠💥


В этой серии постов я хочу поговорить про аналитическое мышление — навык, который считаю самым ценным для специалистов, работающих с данными, да и не только. Эти посты будут полезны как практикующим аналитикам, так и школьникам, студентам и их родителям.

На мой взгляд, ум человека можно разделить на 3 составляющие:
знания
кругозор
мышление

Многие хорошо понимают, как набраться знаний в конкретной области или расширить кругозор. Это можно сделать в любом возрасте.

Куда интереснее разобрать, как развивать мышление.
Ведь это в целом сложнее, так еще и с годами усложняется.

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

В школьные годы процесс развития моего мышления был связан не только с решением математических/логических задач в школе, но и с:

1. Шахматами

Свой путь в этой игре я начал еще в 5 лет, потом в 8 перестал ими заниматься, а в 14 вернулся. Именно шахматам я в большей мере благодарен наличию у меня любви к анализу и прогнозированию наперед.
В дальнейшем это помогло мне как в изучении наук о данных, так и в работе. Например, опыт в просчитывании ходов наперед помогает в планировании работы над проектами, помогает чувствовать, что может пойти не так и на какие этапы стоит заложить больше времени.


2. Просмотром разборов футбольных матчей ⚽️

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


Все эти активности заложили во мне фундамент,
который помог подготовиться к поступлению в Университет, войти в сферу аналитики и в целом расти как личность.

В следующем посте — главные инструменты развития аналитического мышления. 🔧
Разберем всё: от наук и логики до игр и рабочих задач.


А задумывались ли вы над тем, что сильнее всего повлияло на развитие вашего мышления?
🤔Пишите в комментариях! 💬

Ставьте
❤️, если согласны, что активности из детства являются ключевым фактором в развитии мышления,
🔥, если использовали похожие практики для развития аналитического мышления
и 👀, если ждёте продолжения серии

#жизнь_аналитика
#софт_скиллы
#образование
#аналитическое_мышление
Please open Telegram to view this post
VIEW IN TELEGRAM
👀54🔥3👏1
Pandas: полная roadmap для начинающих 🐼


Сегодня решил собрать для вас подборку полезных материалов по pandas - библиотеке для работы с табличными данными

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

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

Базовые операции:
• Чтение/загрузка файлов (.xlsx, .csv)
• Выбор нужных столбцов
• Методы информации о датафрейме (.columns, .info(), .isnull().sum())

Анализ данных:
• Анализ столбцов (.unique(), .nunique(), .describe())
• Быстрая визуализация (.hist())
• Фильтрация данных (&, |)
• Сортировка (sort_values())

Продвинутые методы:
• Методы .loc и .iloc
• Merge для соединений таблиц
• Поиск дубликатов (.duplicated())
• Группировка (.groupby() + .agg())


Теперь о ресурсах, с помощью которых это всё можно изучить 📚:

1. Есть отличный туториал на YouTube, где все методы разбираются на примере работы с реальными данными. Если выберете его для изучения, рекомендую параллельно с просмотром самостоятельно выполнять те же действия у себя в Jupyter. Так материал усвоится в разы лучше, чем если просто посмотреть + у вас останется ноутбук, к которому сможете возвращаться, если подзабудете что-то. Он на английском языке. Если для вас лучше на русском, смотрите варианты ниже. 📺

2. Супер плейлист, разбитый по темам. Так же, как и в первом случае, рекомендую параллельно самостоятельно выполнять код. Плейлист очень удобен для точечного изучения тем📌

3. Видео на русском языке 🇷🇺

4. Статья-шпаргалка на Хабре, где разбирается большинство нужных для начала методов. 📰


Рекомендую не пытаться изучить всё сразу. Правильнее всего будет изучить базовые методы, а потом, по мере надобности, гуглить и читать материалы.
💡Формула поиска: «pandas + [что сделать] + [с чем]»

Например, вы встретились с задачей, где нужно заменить конкретные значения столбца, соответствующие условию, конкретными числами.
Заходите в поисковик и набираете: «pandas замена значений в столбце по условию». Сразу же видите статью на geeksforgeeks, где подробно разбирается, как сделать это, так еще и тремя разными способами! 🤩


Если хотите сразу потренироваться, рекомендую вот это ДЗ с майнора ФКН ВШЭ. Оно делается недолго, но будет очень полезно для отработки теории!⚡️

Так же рекомендую сохранить ноутбук-шпаргалку - это сэкономит часы в будущем! 🕰

Пишите в комментариях, какую подборку материалов хотели бы увидеть в следующий раз? 💬

Ставьте ❤️, если было полезно, 🔥, если будете изучать pandas по этому плану
и 👀, если ждёте новые подборки!
Please open Telegram to view this post
VIEW IN TELEGRAM
8👀3👍2🍓2🔥1
100 подписчиков! 🎉
Огромное спасибо каждому, кто читает мой канал! Обещаю много интересных постов и чаще выпускать новый контент🚀
Ваша поддержка очень важна!❤️
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥124
Красивая визуализация: множественные линии в Plotly 📈🔝

Продолжаю рассказывать про красивые способы визуализации. Сегодня разберем комбинацию линейных графиков, которую удобно построить с помощью plotly.

Мне такой график помог визуализировать динамику количества поездок по часам в сутках в разбивке по дням недели. По нему удобно сравнивать динамику показателя в зависимости от категориального признака (в моём случае – день недели).

Синтаксис + пример построения графика:

import plotly.graph_objects as go

# Подготовка данных
trip_day_count_dt = (df.groupby('pickup_datetime')['id']
.count()
.reset_index(name='trip_count')
.sort_values(by='pickup_datetime'))
trip_day_count_dt['hour'] = trip_day_count_dt.pickup_datetime.dt.hour
trip_day_count_dt['dayofweek'] = trip_day_count_dt['pickup_datetime'].dt.day_name()

hour_day_trip_count = (trip_day_count_dt
.groupby(['hour', 'dayofweek'])['trip_count']
.sum()
.reset_index(name='trips'))

# Построение графика
fig = go.Figure()
for day in hour_day_trip_count['dayofweek'].unique():
day_data = hour_day_trip_count[hour_day_trip_count["dayofweek"] == day]
fig.add_trace(
go.Scatter(
x=day_data["hour"],
y=day_data["trips"],
name=str(day)
)
)

fig.update_layout(
title="Динамика поездок по часам суток",
xaxis_title="Час суток",
yaxis_title="Количество поездок",
width=1400,
height=600
)
fig.show()


💡 Какие инсайты выявил график:

Воскресенье : минимум поездок днем + пик в ночные часы
Объяснение: люди возвращаются с вечерних мероприятий

Рабочие дни : утренний/вечерний пик спроса
Объяснение: классические "часы пик" по дороге на работу и домой

Общая динамика : ночной спад → утренний рост → вечерний пик
Объяснение: универсальный паттерн городской мобильности

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

Мне кажется, что построить подобный график с помощью matplotlib/seaborn было бы сложнее. Именно в таких случаях мне нравится использовать plotly.

А вы используете plotly в повседневных задачах? Какие библиотеки визуализации предпочитаете? Пишите в комментариях 💬

Ссылка на выполненное мной ДЗ, где я строил данный график 🔗
Ссылка на документацию plotly 🔗

Ставьте:
❤️ — если было полезно
🔥 — если хотите видеть больше постов про визуализацию данных
⚡️ — если интересно почитать конкретно про plotly
#визуализация_данных #python #аналитические_методы #из_моей_практики
Please open Telegram to view this post
VIEW IN TELEGRAM
7🔥41🥰1😍1😈1
Мультиколлинеарность: как найти и обезвредить ⚠️🔧

Начинаю серию постов о проблемах в данных, которые исследует эконометрика.

В этой серии разберем такие проблемы и борьбу с ними:
• Выбросы в данных
• Гетероскедастичность
• Ненормальные распределения остатков и тд

А сегодня поговорим про мультиколлинеарность - сильную коррелированность регрессоров между собой, то есть линейную связь между ними, мешающую строить эффективные оценки.

Несмещенными и состоятельными оценки при этом остаются

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


Почему нужно бороться с мультиколлинеарностью?
💊

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

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

Однако даже в ансамблях мультиколлинеарность может:
• Снижать интерпретируемость feature importance
• Делать модель менее стабильной при небольших изменениях данных
• Увеличивать время обучения без прироста качества

Поэтому анализ корреляций полезен при работе с любыми моделями.

Как распознать данную особенность в данных? 🕵️‍♂️

Столкнуться с мультиколлинеарностью можно при анализе практически любых табличных данных, будь то финансовые показатели или, например, признаки поддержанных автомобилей.

Мультиколлинеарность можно заметить, посмотрев на матрицу корреляций. Если в ней встречаются высокие значения (как правило, высокими корреляциями считают корреляции >0.8), значит, в данных скорее всего присутствует мультиколлинеарность.

Также можно рассчитать Variance inflation factor (VIF) - подробнее про него можно прочитать здесь.
Если кратко, то чем больше его значение, тем выше степень мультиколлинеарности. VIF > 5 указывает на умеренную, VIF > 10 — на серьезную мультиколлинеарность.
На практике, обычно смотрят на VIF и уже в зависимости от его значения решают, нужно ли бороться с мультиколлинеарностью, или же она незначительна.


Что делать, если обнаружили мультиколлинеарность? 🤔

Есть несколько способов борьбы с мультиколлинеарностью. Рассмотрим основные из них:

Удаление одного из скоррелированных признаков
Удаляем признаки с высоким VIF по одному, пока все показатели не придут в норму

Смена функциональной формы
Создаём новые признаки на основе старых: например, заменяем рост и вес на индекс массы тела. Убирает мультиколлинеарность, сохраняя смысл.

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

Ridge/Lasso регрессия
Добавляют штраф за большие коэффициенты, "усредняя" вклад коррелированных признаков. Ridge уменьшает все коэффициенты, Lasso — обнуляет менее важные.


Я чаще всего пробую удаление скоррелированных признаков или Lasso регрессию, но другие методы тоже хороши и эффективны.

Полезные материалы 📚

В процессе подготовки этого поста я наткнулся на классную статью на Хабре 📰

Если хотите детальнее углубиться в проблему мультиколлинеарности и лучше понять теорию, которая за ней стоит, рекомендую данную лекцию📺


А сталкивались ли Вы с мультиколлинеарностью в своих задачах или исследованиях? Пишите в комментарии💬

Ставьте 🔥, если интересна серия постов про проблемы, которые изучает эконометрика,
❤️, если пост был полезен,
и ⚡️, если уже использовали упомянутые методы для борьбы с мультиколлинеарностью
Please open Telegram to view this post
VIEW IN TELEGRAM
11🔥43😱1💋1😈1🎄1
Логарифмирование в анализе данных: зачем нужно и как применять

Сегодня поговорим про приём, который часто помогает в анализе экономических показателей (доходов, заработных плат и т.д.) – логарифмирование. 🔍

Так повелось, что показатели, выраженные в деньгах, зачастую имеют логнормальное распределение📈 . Это значит, что если ввести новую переменную – натуральный логарифм (подойдёт любой логарифм, но принято брать натуральный) от исследуемого показателя, то его распределение станет близко к нормальному. Так происходит потому, что денежные показатели обычно имеют тяжелый правый хвост, а логарифм сглаживает разрывы между значениями. ⚖️

Зачем вообще нужно логарифмирование? 🤔

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

⚡️ Борьба с асимметрией
Как уже упомянул выше, данные имеют скошенное распределение, которое неудобно анализировать и моделировать, так как нарушаются предпосылки многих статистических моделей (нормальное распределение ошибок, постоянная дисперсия). Происходит это из-за того, что в денежных показателях почти всегда найдутся далекие выбросы. Крупнейшие компании, миллиардеры и т.п.

📐 Необходимость относительной, а не абсолютной интерпретации
После логарифмирования интерпретация коэффициентов в линейных моделях меняется.

В лог-линейной модели (log(Y) = a + b*X) интерпретация будет такой: при увеличении X на 1 единицу, Y изменяется в среднем на (e^b - 1) * 100%.

В лог-лог модели (log(Y) = a + b*log(X)) интерпретация такая: при увеличении X на 1%, Y изменяется в среднем на b%.

Таким приёмом удобно измерять эластичность – чувствительность к изменениям. Например, если в нашей модели Y – выручка с продаж, а X – рекламный бюджет, и в лог-лог модели коэффициент перед X оказался равен 0.4, то можно сказать, что увеличение рекламного бюджета на 1% увеличивает выручку на 0.4%. 💲

🎨 Улучшение качества визуализации
На одном графике сложно показать и маленькие компании, и гигантов индустрии. Логарифмическая шкала помогает увидеть относительные изменения всех наблюдений выборки одновременно.

Как правильно подходить к логарифмированию? 👍

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

🔹 Если есть нули или небольшие отрицательные значения (по модулю меньше 1), хорошо подойдет ln(1 + x). В numpy для этого есть специальная функция np.log1p().

🔹 Если минимальное значение в выборке < -1, то лучше использовать преобразование: asinh(x) = ln(x + √(x² + 1))

🔹 Если все значения в выборке > 0, то идеальный вариант – просто ln(x).

Кейсы, когда мне помогло логарифмирование 🔥

Я не раз прибегал к логарифмированию в рабочих и учебных проектах. Расскажу про 2 случая, когда этот приём помог.

🚕 Первый случай связан с моделированием продолжительности поездок на такси. Распределение имело тяжелейший правый хвост (Фото 1). После логарифмирования распределение стало нормальным (Фото 2) и получилось построить хорошие линейные модели. Продолжительность поездок выражена не в деньгах, но здесь все вышесказанное было уместно.

🛍 Второй случай связан с построением визуализации. В учебном проекте нужно было построить scatterplot, где по оси X была вероятность покупки товара на маркетплейсе, а по оси Y – потенциальный доход с этой продажи. Точки были раскрашены: зеленый – постоянные клиенты (покупки чаще 1 раза в месяц, суммарно более 5 покупок), красный – остальные.

Сначала я построил визуализацию без логарифмирования дохода (Фото 3). Визуализацию было сложно интерпретировать из-за нагромождения точек. После логарифмирования потенциального дохода график стал намного лучше визуально восприниматься (Фото 4). Мы всё так же можем оценить интересные взаимосвязи, но теперь график понятен.

А вы использовали логарифмирование переменных в своих проектах? Делитесь опытом в комментариях 💬

Ставьте:
🔥 если пост был полезен
❤️ если хотите больше постов про преобразования данных
🤩 если хотите больше постов про работу с ненормальными распределениями

#аналитические_методы #из_моей_практики #статистика #ml #эконометрика
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥843🤩3💯1😈1🦄1
Невидимые враги анализа: разбираем выбросы👻🗑

Сегодня продолжим серию постов о проблемах в данных, с которыми сталкиваются аналитики, и поговорим про выбросы.

Что такое выбросы? 🔍

Выбросы — это аномальные наблюдения, которые по своим значениям сильно отличаются от остальной выборки.

Простой пример из реальной жизни: если мы анализируем расходы на путешествия, где средний чек составляет 50,000 рублей, а одно путешествие стоит 500,000 рублей — это явный выброс. Такие наблюдения выделяются не только по цене, но и по другим признакам: длительности, категории отеля, сезону.

На что влияют выбросы и почему их следует исследовать отдельно? ⚠️

Выбросы могут серьёзно искажать наше представление о данных:

Для описательного анализа: среднее значение смещается, дисперсия увеличивается, что мешает корректно оценивать выборку и делать выводы о генеральной совокупности
Для построения моделей: в эконометрических и ML-моделях выбросы часто приводят к смещённым и несостоятельным оценкам
Особенно чувствительны линейные модели — один мощный выброс может буквально «потянуть» за собой всю линию регрессии, сильно исказив результат
Ансамблевые методы (бустинг, бэггинг) справляются лучше благодаря своей структуре, но и они не идеальны

Как найти выбросы? 🕵️‍♂️

Обычно выбросы ищут в контексте непрерывных признаков, используя два подхода вместе: визуализацию и статистические методы.

Boxplot — график, который наглядно показывает распределение и выбросы. Чаще всего за выбросы принимают наблюдения, выходящие за пределы интерквартильного размаха (IQR)
Статистические критерии: если выбросы занимают <10% данных, с ними можно работать, но всё зависит от конкретной задачи

Фото: пример boxplot с выбросами
Пока готовил пост, наткнулся на хорошую статью про боксплоты📰

Практический пример поиска:
# Простой способ посмотреть на выбросы
Q1 = data.quantile(0.25)
Q3 = data.quantile(0.75)
IQR = Q3 - Q1
outliers = data[(data < Q1 - 1.5*IQR) | (data > Q3 + 1.5*IQR)]
print(f"Найдено выбросов: {len(outliers)} ({len(outliers)/len(data)*100:.1f}%)")



Кейсы, когда мне приходилось бороться с выбросами🔥

🚕Первый кейс связан с всё той же задачей предсказания длительности поездок.
В датасете были поездки, длительность которых меньше 60 секунд. Скорее всего, это ошибки в данных, поэтому я исключил такие наблюдения из анализа.

👨‍🦳Второй кейс — исследование факторов долголетия — принципиально иной. Выбросами здесь были реальные долгожители (110+ лет). В отличие от ошибок, эти данные — ценная информация. Они могут объясняться уникальной генетикой, особыми условиями жизни (например, в "голубых зонах" Кавказа) или сочетанием факторов. Удалять их — значит игнорировать саму цель изучения предела продолжительности жизни. Вместо этого я использовал методы, устойчивые к выбросам, чтобы они не искажали общую модель, но оставались частью картины, которую мы анализируем.

В следующем посте расскажу про продвинутые методы поиска выбросов и методы их обработки 🛠


А как вы обычно находите и обрабатываете выбросы? Пишите в комментариях💬

Ставьте:
🔥 если пост был полезен,
❤️ если хотите больше постов про проблемы в данных
🤩 если хотите больше постов про работу с выбросами

#аналитические_методы
#eda
#из_моей_практики
#статистика
#ml
#эконометрика
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥12🎄32🌭2💋21👾1
Секрет быстрого кода: векторизованные операции в Python 🏃‍♂️

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

Зачем они нужны?🧐

Векторизованные операции помогают производить операции над массивами не поэлементно, а сразу для всего набора данных. Это в разы ускоряет код, что особенно ценно при больших объемах данных. Простая аналогия: можно взять каждый из 1000 камней поочередно и перенести их, а можно зачерпнуть их ковшом экскаватора и перевезти все сразу. Экскаватор в данном примере и есть векторизованная операция.

В основе векторизованных операций — библиотеки NumPy (работа с массивами) и Pandas
(надстройка для таблиц).

Какие они бывают?
🧬

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

1. Арифметика и базовая математика
+ - * / ** с целыми столбцами, np.abs(), np.log1p(), .round()

2. Статистика по столбцу
.sum(), .mean(), .median(), .min(), .max(), .std()

3. Логические операции и фильтрация
- Сравнения: df['sales'] > 1000
- Комбинации: & (И), | (ИЛИ)
- .isin([список]) — фильтр по нескольким значениям
- .isna() для поиска пропусков
- np.where(условие, если_да, если_нет) — аналог IF

4. Строковые операции
(через `.str`)
.str.lower(), .str.upper(), .str.contains('текст'), .str.split(' '), .str.replace('old','new')

5. Дата-время
(через `.dt`)
.dt.year, .dt.month, .dt.day, .dt.dayofweek,
разница дат через - и pd.Timedelta()

6. Оконные функции для временных рядов
.shift(1) — вчерашнее значение, .pct_change() — процент изменения, .cumsum() — накопленная сумма

7. Быстрое создание столбцов

df['прибыль'] = df['доход'] - df['расход']
df['категория'] = np.where(df['оценка'] > 80, 'Высокая', 'Низкая')



Ключевое преимущество векторизованных операций - скорость работы.🔥

Разберем на примере скорость работы векторизованных операций в сравнении с другими методами.

📊Фото 1: Логарифмический барплот — визуализирует разницу в скорости на 1 млн строк.

📈Фото 2: Зависимость времени от размера данных — показывает, как разрыв растет с объемом.

Чеклист для операций с массивами
📝

+ Правило 1: Всегда ищите встроенную векторизованную операцию в Pandas/NumPy.
+ Правило 2: Если ее нет — проверьте, можно ли решить через .str / .dt / логические операции.
+ Правило 3: Только в крайнем случае используйте .apply().
+ Правило 4: Цикл for по датафрейму — это антипаттерн в анализе данных.


Планы на будущее
🚀

В дальнейшем я планирую глубже погрузиться в тему векторизации, и написать пост об этом.

А вы используете векторизованные операции в работе?
Какие из них оказались самыми полезными? Делитесь в комментариях 💬

Ставьте
🔥, если пост был полезен
❤️, если интересно увидеть больше постов про обработку данных с помощью Python
🤩, если ждете новый пост про векторизованные операции

#аналитические_методы
#python
#pandas #numpy
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥14🤩3😈31👨‍💻1
Говорящий код: сила комментариев 💬

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

Представьте: перед вами две вкладки в Jupyter Notebook. В одной — лаконичный код с непонятной магией преобразований. В другой — те же операции, но с пояснениями «почему» и «зачем». В какой вы разберетесь быстрее? Ответ очевиден.

Сегодня поговорим о важности и практической пользе написания комментариев в коде.

Зачем тратить время на комментарии?
🤔

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

Комментарии такого рода помогут вам сразу вспомнить весь контекст:
# В ходе EDA анализа выяснил, что распределение таргета — логнормальное.
# Для линейной модели использую логарифмирование, чтобы удовлетворить предпосылку о нормальности остатков.
df['target_log'] = np.log1p(df['target'])

# Заменил пропуски в столбце 'age' именно медианой, а не средним,
# потому что распределение имеет значительные выбросы (см. boxplot в ячейке выше).
median_age = df['age'].median()
df['age'].fillna(median_age, inplace=True)

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

Когда стоит писать комментарии?


· Перед началом нового блока кода. Например, в этой ячейке вы планируете сгруппировать данные по user_id и вычислить суммарное количество потраченных средств. Перед этим можно написать комментарий такого рода: # вычисляю суммарные затраты каждого пользователя.
· Когда есть неочевидная операция. Например, вы решили, что респонденты в опросе, на котором построена выборка, занижали свой возраст, и хотите добавить к столбцу age 3 года. Перед этим преобразованием стоит добавить комментарий, зачем вы меняете значения и почему выбрали именно 3.
· Когда вы меняете чужой код. В таком случае можно внести в комментарий исходный кусок кода и объяснить причину изменений.

Какими должны быть комментарии?
ℹ️

Главная цель — сделать комментарии в коде есть качественные комментарии.

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

Например, для строки i = i + 1, которая является частью цикла, комментарий # прибавляем к i единицу будет неинформативен, так как это и так ясно из кода. А вот комментарий # сдвигаем скользящее окно на 1 позицию сразу даст понять, что к чему.

Чек-лист по комментариям
📝

Золотые правила, которые спасут ваши нервы в будущем:

1. Пишите для своего «будущего Я». Представьте, что вернетесь к коду через полгода после отпуска. Что вам нужно было бы написать, чтобы мгновенно включиться в контекст?

2. Комментарий — это не перевод кода . Не пишите # Прибавляем к счетчику 1. Лучше объясните цель: # Сдвигаем окно агрегации, т.к. данные приходят с запаздыванием в 1 день.

3. Сначала хороший нейминг, потом комментарий. Стремитесь к тому, чтобы код читался как книга. user_total_spent = df.groupby('user_id')['revenue'].sum() — уже почти не нуждается в пояснениях. Комментируйте только решение, стоящее за строчкой.

4. Не ленитесь оставить комментарий, даже если в моменте всё кажется очевидным. Очевидность имеет свойство испаряться с течением времени.

А комментируете ли вы свой код?
Пишите в комментариях к посту!💬

Ставьте:

🔥— если было полезно
❤️ — если всегда стараетесь комментировать свой код
🤩— если интересны посты на тему оформления кода

#из_моей_практики
#код
#оформление
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥10🐳2👍1🤩1🍾1🎄1
Как улучшить точность модели на 5-10%: правильный подбор гиперпараметров 🎯

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

Сегодня я расскажу про 3 самые популярные на данный момент метода (и библиотеки) для подбора гиперпараметров - GridSearchCV, RandomizedSearchCV и Optuna 🧮

Самый тривиальный из методов - GridSearchCV. Этот метод перебирает все возможные комбинации гиперпараметров из заданной сетки. Например, если мы предоставим ему такую сетку: {‘max_depth’: [4, 6, 8], ‘n_estimators’: [200, 400]}, он обучит 3 * 2 = 6 моделей и выберет лучшую. Особенностью GridSearch является то, что он всегда находит лучшее решение (так как просто напросто перебирает все комбинации).

Главный минус такого подхода - скорость вычислений. Если мы хотим перебрать большую сетку, GridSearchCV - не лучший вариант ☺️

Пример кода с использованием GridSearchCV вы найдете в комментарии.

RandomizedSearchCV
работает иначе. Он принимает на вход сетку гиперпараметров и параметр n_iter, и в процессе подбора перебирает n_iter случайных комбинаций гиперпараметров. Главный минус такого подхода в том, что мы можем упустить оптимальное решение.
Важной фишкой RandomizedSearchCV является возможность задавать не только детерминированные значения параметров, но и распределения. Например, равномерное распределение: 'alpha': uniform(0.01, 10.0).

Пример кода с использованием RandomizedSearchCV ждет вас в комментарии.

Optuna
- это библиотека для умного подбора гиперпараметров.
Главное ее преимущество в том, что в процессе подбора она использует историю предыдущих испытаний для выбора следующих параметров. Это помогает отсекать огромное количество слабых комбинаций. Плюс Optuna умеет распараллеливать вычисления , что заметно увеличивает скорость подбора.
Еще одним ключевым преимуществом Optuna является возможность визуализации. 📊
Например, можно визуализировать важность гиперпараметров. Это может быть полезно, если после первого подбора мы хотим еще улучшить модель.
Например, визуализация важности показала, что важность гиперпараметров subsample и max_depth в разы меньше, чем важность гиперпараметров learning_rate и colsample_bytree. В таком случае мы можем зафиксировать subsample и max_depth такими, как их подобрали с первого раза, и дальше продолжить подбирать learning_rate и colsample_bytree, чтобы еще повысить качество модели.

Пример кода с Optuna в комментарии.


Чек-лист:
что когда использовать? 📝

GridSearch
будет лучшим выбором, если у вас изначально маленькая сетка гиперпараметров, или неограниченные ресурсы 🥹

RandomizedSearch
подойдет, если нужно быстро получить хороший, не обязательно идеальный результат 🏎

Optuna
-моя любимая библиотека для подбора гиперпараметров 🔝
В большинстве случаев она будет идеальным выбором благодаря:

· умному алгоритму обучения
· высокой скорости
· уникальным возможностям (визуализации, параллельные вычисления и т.д)

Графики ниже демонстрируют процесс работы Optuna:

2. История оптимизации — как менялась метрика с каждым испытанием (trial).
3. Важность параметров — какие гиперпараметры повлияли на результат сильнее всего.

Сравнивайте, экспериментируйте и делитесь вашим опытом в комментариях!
💬

---

Полные рабочие примеры кода для каждого метода опубликованы в комментариях к этому посту.

Ставьте
🔥 если было полезно
❤️ если интересны посты на тему машинного обучения
🤩 если хотели бы видеть еще посты на тему подбора гиперпараметров

#аналитические_методы
#ml
#python
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥8🏆21🍌1😈1👻1🤪1