Инсайт из данных: почему опыт не всегда конвертируется в доход 👨🦳
Этим летом я проводил эконометрическое исследование, изучая влияние различных факторов на заработные платы в регионах России.
Для регрессионного анализа я выбрал данные по жителям Челябинска и Челябинской области.
В ходе EDA и построения регрессионных моделей мне удалось выявить, что зависимость заработной платы от возраста (и, как следствие, стажа) - квадратичная.
Позже я поискал похожие исследования и понял, что такая ситуация стандартна при моделировании зарплат, и многие эконометристы сталкиваются с ней.
Как можно заметить такую зависимость?
Я построил модель, где целевой переменной является логарифмированная зарплата, а среди регрессоров есть возраст и квадрат возраста. Пример кода для построения такой модели:
И ключевые моменты из получившейся таблички ANOVA:
Заметим, что коэффициент перед регрессором age^2 статистически значим и отрицателен.
Как мы помним из школьной алгебры, парабола с ветвями вниз задается уравнением y = -ax^2 + bx + c.
Можем сделать вывод, что с возрастом зарплата растет, потом достигает пика и начинает снижаться.
При этом мы можем определить возраст, после которого начинается снижение - это точка максимума параболы, то есть -b/2a.
В своем исследовании я так же построил 2 полиномиальные регрессии - отдельно для женщин и мужчин ( визуализации регрессий на графике).
И вот какие закономерности для мужчин и женщин удалось выявить:
- у женщин снижение зарплаты начинается позже - после ~50 лет
- зарплаты мужчин на всем возрастном интервале выше . Думаю, это связано с разницей в карьерных возможностях, вынужденных перерывах в занятости или неполной занятости из-за необходимости ухода за детьми.
- зависимость у обоих полов нелинейная
Почему возникает такая зависимость? 🤔
Почему зарплата в начале растет с возрастом ясно - молодые специалисты нарабатывают годы стажа и вместе с этим постепенно растет их зарплата.
Интереснее поразмышлять над причинами спада после ~ 45 лет.
Для себя я выявил такие причины:
- возрастная трудовая дискриминация: компании не хотят нанимать, а соответственно, и платить высокие зарплаты, возрастным специалистам, так как тут больше рисков (чаще болеют, менее мотивированы)
- переход с возрастом многих людей на менее трудозатратную работу из-за проблем со здоровьем / накопившейся усталости : например, работа консьержами
А как вы объясняете данную зависимость?
Пишите в комментариях💬
Ставьте ❤️, если знакомы с этой закономерностью,
🔥, если подчерпнули для себя что-то новое
И 🤩, если хотите больше подобных постов
Ссылка на мое исследование🔗
#исследование_зарплат #статистика #эконометрика #анализ_данных
Этим летом я проводил эконометрическое исследование, изучая влияние различных факторов на заработные платы в регионах России.
Для регрессионного анализа я выбрал данные по жителям Челябинска и Челябинской области.
В ходе EDA и построения регрессионных моделей мне удалось выявить, что зависимость заработной платы от возраста (и, как следствие, стажа) - квадратичная.
Позже я поискал похожие исследования и понял, что такая ситуация стандартна при моделировании зарплат, и многие эконометристы сталкиваются с ней.
Как можно заметить такую зависимость?
Я построил модель, где целевой переменной является логарифмированная зарплата, а среди регрессоров есть возраст и квадрат возраста. Пример кода для построения такой модели:
ols_10_logwage = smf.ols('log_wage ~ age + I(age**2) + educ + female + smoke', data=df).fit()
print(ols_10_logwage.summary())И ключевые моменты из получившейся таблички ANOVA:
OLS Regression Results
Ключевые коэффициенты:
age 0.0605 (p=0.109)
age^2 -0.0007 (p=0.077) ← значим на 10%
female -0.5787 (p=0.000) ← значим
educ 0.1646 (p=0.008) ← значим
Заметим, что коэффициент перед регрессором age^2 статистически значим и отрицателен.
Как мы помним из школьной алгебры, парабола с ветвями вниз задается уравнением y = -ax^2 + bx + c.
Можем сделать вывод, что с возрастом зарплата растет, потом достигает пика и начинает снижаться.
При этом мы можем определить возраст, после которого начинается снижение - это точка максимума параболы, то есть -b/2a.
В своем исследовании я так же построил 2 полиномиальные регрессии - отдельно для женщин и мужчин ( визуализации регрессий на графике).
И вот какие закономерности для мужчин и женщин удалось выявить:
- у женщин снижение зарплаты начинается позже - после ~50 лет
- зарплаты мужчин на всем возрастном интервале выше . Думаю, это связано с разницей в карьерных возможностях, вынужденных перерывах в занятости или неполной занятости из-за необходимости ухода за детьми.
- зависимость у обоих полов нелинейная
Почему возникает такая зависимость? 🤔
Почему зарплата в начале растет с возрастом ясно - молодые специалисты нарабатывают годы стажа и вместе с этим постепенно растет их зарплата.
Интереснее поразмышлять над причинами спада после ~ 45 лет.
Для себя я выявил такие причины:
- возрастная трудовая дискриминация: компании не хотят нанимать, а соответственно, и платить высокие зарплаты, возрастным специалистам, так как тут больше рисков (чаще болеют, менее мотивированы)
- переход с возрастом многих людей на менее трудозатратную работу из-за проблем со здоровьем / накопившейся усталости : например, работа консьержами
А как вы объясняете данную зависимость?
Пишите в комментариях💬
Ставьте ❤️, если знакомы с этой закономерностью,
🔥, если подчерпнули для себя что-то новое
И 🤩, если хотите больше подобных постов
Ссылка на мое исследование
#исследование_зарплат #статистика #эконометрика #анализ_данных
Please open Telegram to view this post
VIEW IN TELEGRAM
❤10🔥6🤩6👍1🤔1😈1
Как взаимодействие признаков спасло мою модель: разбор кейса 🛟
Продолжаем серию постов про эконометрическое исследование зарплат (первый пост), и на этот раз разберем перекрестные переменные (переменные взаимодействия) на конкретном примере.
Это произведение двух или более регрессоров, которое добавляем в модель. Они помогают найти скрытое влияние признаков на таргет.
В моем исследовании удачным оказалось взаимодействие пола (0-м/1-ж) и уровня образования (0-школа, 1-колледж, 2-универ).
Теперь разберем конкретно мой кейс
Сначала модель была такой:
Тест Рамсея показал, что модель неправильно специфицирована.
Добавил квадрат возраста — тест все еще показывал проблемы. Тогда добавил взаимодействие образования и пола.
Новая модель:
Результаты:
• Все регрессоры стали значимы на 10%
• Тест Рамсея: модель теперь верна
• R-squared adjusted вырос с 0.252 до 0.286
• Обнаружен значимый эффект взаимодействия
Как интерпретировать коэффициенты?
В модели с взаимодействием:
•
•
•
Что на практике?
Для мужчин (female=0):
Каждый уровень образования увеличивает зарплату на ~33.5% (коэф. 0.3352, p=0.000)
Для женщин (female=1):
Общий эффект: 0.3352 + (-0.2827) = 0.0525
Каждый уровень образования дает всего ~5.3% прибавки
Гендерный разрыв:
•
•
Что видно на графике?📈
Визуализация подтверждает: у мужчин — крутой рост зарплаты с образованием, у женщин — почти горизонтальная линия. Разница особенно очевидна при переходе к высшему образованию.
Главный инсайт:
Проблема не только в том, что женщины получают меньше. Они получают значительно меньшую отдачу за каждый уровень образования.
Ставьте ❤️, если использовали перекрестные переменные
🔥, если будете использовать
⚡️, если хотите больше постов про эконометрику
Ссылка на мое исследование🔗
#аналитические_методы #статистика #эконометрика #анализ_данных
Продолжаем серию постов про эконометрическое исследование зарплат (первый пост), и на этот раз разберем перекрестные переменные (переменные взаимодействия) на конкретном примере.
Это произведение двух или более регрессоров, которое добавляем в модель. Они помогают найти скрытое влияние признаков на таргет.
В моем исследовании удачным оказалось взаимодействие пола (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🤩2❤1😈1
Этот метод pandas я использую каждый день. И вот почему 🟢🟡🔴
Решил продолжить серию постов про визуализацию данных (первый пост), и сегодня расскажу про красивый способ табличной визуализации
Речь пойдет про🎨
Подробно расскажу про 2 его модификации –
highlight_min/max⚡️
Позволяет выделить желаемым цветом минимум/максимум по столбцу/строке.
Это может быть полезно, например, для:
- поиска лучшей по метрике качества модели, когда мы обучаем много моделей и хотим понять, какая показала лучшее качество
- поиска аномалий во временных рядах (поиске минимума/максимума величины за период)
Пример с временным рядом (фото 1):
background_gradient🚩
Позволяет раскрасить столбцы/строки в палитру, где наименьшие значения будут, например, ярко красными, а наибольшие тёмно-зелёными.
Это может быть полезно, например, для:
- сравнения финансовых показателей компаний при составлении портфеля – визуализация позволяет провести комплексный анализ
- ранжирования моделей по значению метрики качества (удобно определить, например, какой класс моделей демонстрирует лучшее качество на этих данных)
Пример сравнения ML-моделей (фото 2):
Также
А вы используете данный инструмент? 🤔
❤️ Да, использую и кайфую
🔥 Нет, но теперь буду использовать!
Пишите в комментариях, какая тематика постов вам интересна?💬
#визуализация_данных #pandas #python
Решил продолжить серию постов про визуализацию данных (первый пост), и сегодня расскажу про красивый способ табличной визуализации
Речь пойдет про
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
🔥9⚡3👍3❤1😈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 #анализ_данных #регрессия
Сегодня я решил разобрать регуляризацию в контексте линейной регрессии. Если ваша модель идеально предсказывает данные, на которых выучилась, и проваливается на новых — этот пост для вас. Сегодня разбираем, как два вида регуляризации — 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😍3⚡1👍1😈1👨💻1
Цифры, из-за которых хочется бросить всё и уехать в Штаты 😮
Недавно я решил сделать последнее ДЗ курса по ML, которое когда-то отложил до лучших времён 🙃🤫
Там было предложено поработать с данными по зарплатам IT-специалистов (ссылка на датасет). Выше можете найти пост про элегантный способ визуализации данных, разобранный на примере данного датасета.
В ходе feature engineering у меня появилась идея рассматривать не отдельные страны, а объединить их в макрорегионы: Северная Америка, Латинская Америка, Западная Европа, Восточная Европа, Азия, Африка и Океания🌎
Я визуализировал среднюю зарплату по макрорегионам и очень удивился, увидев такую картину (фото 1).
Средняя зарплата в Северной Америке почти в 2 раза выше, чем в Океании, которая находится на 2 месте.
Затем я обучал бустинги и при анализе важности признаков заметил, что для CatBoost флаг работы в Северной Америке с большим отрывом является важнейшим признаком , влияющим на зарплату, (фото 2), что подтверждает устойчивость наблюдаемого явления.
Меня смутили такие результаты и я решил проверить, что данные в разных макрорегионах сбалансированы по грейдам (джуниор/миддл/сеньор/лид), а также зарплаты внутри одних и тех же грейдов подчиняются той же закономерности. Оказалось, что закономерность сохраняется и внутри грейдов, но в большинстве грейдов отрыв Северной Америки не такой радикальный.
При этом присутствует сильный дисбаланс грейдов по макро регионам. В Северной Америке ~74% представителей выборки – сеньоры. В остальном мире доля сеньоров ~30%. Поэтому значительная часть разрыва, продемонстрированного на фото 1, объясняется смещённой структурой IT-сообщества в Северной Америке в сторону старших грейдов. Однако тот факт, что закономерность сохраняется и внутри грейдов, окончательно подтверждает ее устойчивость.
Для себя я выделил 3 главные причины данного явления:
• Концентрация капитала💲 . В Северной Америке сфокусирована основная доля мирового венчурного капитала, а также базируются крупнейшие технологические компании (FAANG и др.). Такая среда порождает высочайшую конкуренцию за грамотных специалистов и приводит к бусту зарплат.
• Культура акций (equity)📈 . В Северной Америке, особенно в США, принято оплачивать часть дохода специалистов акциями компании. Это не просто бонус, а существенная часть компенсационного пакета, которая серьёзно влияет на общий доход и мотивацию.
• Высокая мобильность специалистов🦘 . Частая смена работы за бОльшие деньги — это норма. Компании вынуждены постоянно поднимать зарплаты, чтобы удержать лучших, что в итоге "раздувает" вилки оплаты на рынке.
А какие причины данного явления можете выделить вы?
Пишите в комментариях💬
Ставьте
🤩 если готовы прямо сейчас бросить всё и ехать в Северную Америку работать
🐳 если хотите больше постов про EDA и поиск инсайтов в данных
👨💻 если хотите больше постов про IT-рынок труда
#из_моей_практики #рынок_труда #исследование_зарплат
Недавно я решил сделать последнее ДЗ курса по ML, которое когда-то отложил до лучших времён 🙃🤫
Там было предложено поработать с данными по зарплатам IT-специалистов (ссылка на датасет). Выше можете найти пост про элегантный способ визуализации данных, разобранный на примере данного датасета.
В ходе feature engineering у меня появилась идея рассматривать не отдельные страны, а объединить их в макрорегионы: Северная Америка, Латинская Америка, Западная Европа, Восточная Европа, Азия, Африка и Океания
Я визуализировал среднюю зарплату по макрорегионам и очень удивился, увидев такую картину (фото 1).
Средняя зарплата в Северной Америке почти в 2 раза выше, чем в Океании, которая находится на 2 месте.
Затем я обучал бустинги и при анализе важности признаков заметил, что для CatBoost флаг работы в Северной Америке с большим отрывом является важнейшим признаком , влияющим на зарплату, (фото 2), что подтверждает устойчивость наблюдаемого явления.
Меня смутили такие результаты и я решил проверить, что данные в разных макрорегионах сбалансированы по грейдам (джуниор/миддл/сеньор/лид), а также зарплаты внутри одних и тех же грейдов подчиняются той же закономерности. Оказалось, что закономерность сохраняется и внутри грейдов, но в большинстве грейдов отрыв Северной Америки не такой радикальный.
При этом присутствует сильный дисбаланс грейдов по макро регионам. В Северной Америке ~74% представителей выборки – сеньоры. В остальном мире доля сеньоров ~30%. Поэтому значительная часть разрыва, продемонстрированного на фото 1, объясняется смещённой структурой IT-сообщества в Северной Америке в сторону старших грейдов. Однако тот факт, что закономерность сохраняется и внутри грейдов, окончательно подтверждает ее устойчивость.
Для себя я выделил 3 главные причины данного явления:
• Концентрация капитала
• Культура акций (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🔥4❤1👏1😈1
Мышление как суперсила: мой путь развития 🧠💥
В этой серии постов я хочу поговорить про аналитическое мышление — навык, который считаю самым ценным для специалистов, работающих с данными, да и не только. Эти посты будут полезны как практикующим аналитикам, так и школьникам, студентам и их родителям.
На мой взгляд, ум человека можно разделить на 3 составляющие:
• знания
• кругозор
• мышление
Многие хорошо понимают, как набраться знаний в конкретной области или расширить кругозор. Это можно сделать в любом возрасте.
Куда интереснее разобрать, как развивать мышление. Ведь это в целом сложнее, так еще и с годами усложняется.
Всю свою сознательную жизнь я так или иначе занимался активностями, которые направлены на развитие мышления. В начале пути родители направляли меня, а позже я сам оценил, насколько это важно и понял, что мне нравится осознавать, что я мыслю яснее и понимаю, как совершенствоваться в этом.
В школьные годы процесс развития моего мышления был связан не только с решением математических/логических задач в школе, но и с:
1. Шахматами♟
Свой путь в этой игре я начал еще в 5 лет, потом в 8 перестал ими заниматься, а в 14 вернулся. Именно шахматам я в большей мере благодарен наличию у меня любви к анализу и прогнозированию наперед.
В дальнейшем это помогло мне как в изучении наук о данных, так и в работе. Например, опыт в просчитывании ходов наперед помогает в планировании работы над проектами, помогает чувствовать, что может пойти не так и на какие этапы стоит заложить больше времени.
2. Просмотром разборов футбольных матчей⚽️
Каждую неделю я смотрел по несколько разборов матчей из топовых лиг на YouTube, где ведущий разбирал планы команд на матч, структуру игры, перемещения игроков.
Это помогало мне не только лучше играть в футбол, но и развивало навык системного мышления, понимание, как использовать свои сильные и слабые стороны. Эти навыки пригождаются мне постоянно.
Например, при построении дашбордов я стараюсь оценивать продукт со всех сторон и строить визуализации, которые выстраиваются в общую картину и помогают сделать полезные для бизнеса выводы.
Все эти активности заложили во мне фундамент, который помог подготовиться к поступлению в Университет, войти в сферу аналитики и в целом расти как личность.
В следующем посте — главные инструменты развития аналитического мышления. 🔧
Разберем всё: от наук и логики до игр и рабочих задач.
А задумывались ли вы над тем, что сильнее всего повлияло на развитие вашего мышления? 🤔Пишите в комментариях!💬
Ставьте
❤️, если согласны, что активности из детства являются ключевым фактором в развитии мышления,
🔥, если использовали похожие практики для развития аналитического мышления
и 👀, если ждёте продолжения серии
#жизнь_аналитика
#софт_скиллы
#образование
#аналитическое_мышление
В этой серии постов я хочу поговорить про аналитическое мышление — навык, который считаю самым ценным для специалистов, работающих с данными, да и не только. Эти посты будут полезны как практикующим аналитикам, так и школьникам, студентам и их родителям.
На мой взгляд, ум человека можно разделить на 3 составляющие:
• знания
• кругозор
• мышление
Многие хорошо понимают, как набраться знаний в конкретной области или расширить кругозор. Это можно сделать в любом возрасте.
Куда интереснее разобрать, как развивать мышление. Ведь это в целом сложнее, так еще и с годами усложняется.
Всю свою сознательную жизнь я так или иначе занимался активностями, которые направлены на развитие мышления. В начале пути родители направляли меня, а позже я сам оценил, насколько это важно и понял, что мне нравится осознавать, что я мыслю яснее и понимаю, как совершенствоваться в этом.
В школьные годы процесс развития моего мышления был связан не только с решением математических/логических задач в школе, но и с:
1. Шахматами
Свой путь в этой игре я начал еще в 5 лет, потом в 8 перестал ими заниматься, а в 14 вернулся. Именно шахматам я в большей мере благодарен наличию у меня любви к анализу и прогнозированию наперед.
В дальнейшем это помогло мне как в изучении наук о данных, так и в работе. Например, опыт в просчитывании ходов наперед помогает в планировании работы над проектами, помогает чувствовать, что может пойти не так и на какие этапы стоит заложить больше времени.
2. Просмотром разборов футбольных матчей
Каждую неделю я смотрел по несколько разборов матчей из топовых лиг на YouTube, где ведущий разбирал планы команд на матч, структуру игры, перемещения игроков.
Это помогало мне не только лучше играть в футбол, но и развивало навык системного мышления, понимание, как использовать свои сильные и слабые стороны. Эти навыки пригождаются мне постоянно.
Например, при построении дашбордов я стараюсь оценивать продукт со всех сторон и строить визуализации, которые выстраиваются в общую картину и помогают сделать полезные для бизнеса выводы.
Все эти активности заложили во мне фундамент, который помог подготовиться к поступлению в Университет, войти в сферу аналитики и в целом расти как личность.
В следующем посте — главные инструменты развития аналитического мышления. 🔧
Разберем всё: от наук и логики до игр и рабочих задач.
А задумывались ли вы над тем, что сильнее всего повлияло на развитие вашего мышления? 🤔Пишите в комментариях!
Ставьте
❤️, если согласны, что активности из детства являются ключевым фактором в развитии мышления,
🔥, если использовали похожие практики для развития аналитического мышления
и 👀, если ждёте продолжения серии
#жизнь_аналитика
#софт_скиллы
#образование
#аналитическое_мышление
Please open Telegram to view this post
VIEW IN TELEGRAM
👀5❤4🔥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 по этому плану
и 👀, если ждёте новые подборки!
Сегодня решил собрать для вас подборку полезных материалов по 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 замена значений в столбце по условию». Сразу же видите статью на 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
🔥12❤4
Красивая визуализация: множественные линии в Plotly 📈🔝
Продолжаю рассказывать про красивые способы визуализации. Сегодня разберем комбинацию линейных графиков, которую удобно построить с помощью plotly.
Мне такой график помог визуализировать динамику количества поездок по часам в сутках в разбивке по дням недели. По нему удобно сравнивать динамику показателя в зависимости от категориального признака (в моём случае – день недели).
Синтаксис + пример построения графика:
💡 Какие инсайты выявил график:
• Воскресенье : минимум поездок днем + пик в ночные часы
Объяснение: люди возвращаются с вечерних мероприятий
• Рабочие дни : утренний/вечерний пик спроса
Объяснение: классические "часы пик" по дороге на работу и домой
• Общая динамика : ночной спад → утренний рост → вечерний пик
Объяснение: универсальный паттерн городской мобильности
Как нетрудно заметить, казалось бы, простой график дал нам возможность выудить несколько важных инсайтов из данных.
Мне кажется, что построить подобный график с помощью matplotlib/seaborn было бы сложнее. Именно в таких случаях мне нравится использовать plotly.
А вы используете plotly в повседневных задачах? Какие библиотеки визуализации предпочитаете? Пишите в комментариях💬
Ссылка на выполненное мной ДЗ, где я строил данный график🔗
Ссылка на документацию plotly🔗
Ставьте:
❤️ — если было полезно
🔥 — если хотите видеть больше постов про визуализацию данных
⚡️ — если интересно почитать конкретно про plotly
#визуализация_данных #python #аналитические_методы #из_моей_практики
Продолжаю рассказывать про красивые способы визуализации. Сегодня разберем комбинацию линейных графиков, которую удобно построить с помощью 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🔥4⚡1🥰1😍1😈1
Мультиколлинеарность: как найти и обезвредить ⚠️🔧
Начинаю серию постов о проблемах в данных, которые исследует эконометрика.
В этой серии разберем такие проблемы и борьбу с ними:
• Выбросы в данных
• Гетероскедастичность
• Ненормальные распределения остатков и тд
А сегодня поговорим про мультиколлинеарность - сильную коррелированность регрессоров между собой, то есть линейную связь между ними, мешающую строить эффективные оценки.
Несмещенными и состоятельными оценки при этом остаются
Нарушение эффективности влечёт за собой сильную чувствительность оценок к выборке: оценки становятся неустойчивыми к малейшим изменениям в выборке, а доверительные интервалы слишком расширяются, что затрудняет интерпретацию.
Почему нужно бороться с мультиколлинеарностью?💊
При сильной мультиколлинеарности регрессионная модель может не обучиться, выдав ошибку вырожденной матрицы или численной нестабильности.
Важный нюанс: Ансамблевые методы (бустинг, случайный лес) более устойчивы к мультиколлинеарности, чем линейные модели, благодаря встроенному отбору признаков.
Однако даже в ансамблях мультиколлинеарность может:
• Снижать интерпретируемость feature importance
• Делать модель менее стабильной при небольших изменениях данных
• Увеличивать время обучения без прироста качества
Поэтому анализ корреляций полезен при работе с любыми моделями.
Как распознать данную особенность в данных? 🕵️♂️
Столкнуться с мультиколлинеарностью можно при анализе практически любых табличных данных, будь то финансовые показатели или, например, признаки поддержанных автомобилей.
Мультиколлинеарность можно заметить, посмотрев на матрицу корреляций. Если в ней встречаются высокие значения (как правило, высокими корреляциями считают корреляции >0.8), значит, в данных скорее всего присутствует мультиколлинеарность.
Также можно рассчитать Variance inflation factor (VIF) - подробнее про него можно прочитать здесь.
Если кратко, то чем больше его значение, тем выше степень мультиколлинеарности. VIF > 5 указывает на умеренную, VIF > 10 — на серьезную мультиколлинеарность.
На практике, обычно смотрят на VIF и уже в зависимости от его значения решают, нужно ли бороться с мультиколлинеарностью, или же она незначительна.
Что делать, если обнаружили мультиколлинеарность? 🤔
Есть несколько способов борьбы с мультиколлинеарностью. Рассмотрим основные из них:
• Удаление одного из скоррелированных признаков
Удаляем признаки с высоким VIF по одному, пока все показатели не придут в норму
• Смена функциональной формы
Создаём новые признаки на основе старых: например, заменяем рост и вес на индекс массы тела. Убирает мультиколлинеарность, сохраняя смысл.
• Ортогонализация факторов
Преобразуем признаки так, чтобы они стали статистически независимыми. Например, с помощью метода главных компонент (PCA). Полностью решает проблему, но усложняет интерпретацию коэффициентов.
• Ridge/Lasso регрессия
Добавляют штраф за большие коэффициенты, "усредняя" вклад коррелированных признаков. Ridge уменьшает все коэффициенты, Lasso — обнуляет менее важные.
Я чаще всего пробую удаление скоррелированных признаков или Lasso регрессию, но другие методы тоже хороши и эффективны.
Полезные материалы 📚
В процессе подготовки этого поста я наткнулся на классную статью на Хабре 📰
Если хотите детальнее углубиться в проблему мультиколлинеарности и лучше понять теорию, которая за ней стоит, рекомендую данную лекцию📺
А сталкивались ли Вы с мультиколлинеарностью в своих задачах или исследованиях? Пишите в комментарии💬
Ставьте 🔥, если интересна серия постов про проблемы, которые изучает эконометрика,
❤️, если пост был полезен,
и ⚡️, если уже использовали упомянутые методы для борьбы с мультиколлинеарностью
Начинаю серию постов о проблемах в данных, которые исследует эконометрика.
В этой серии разберем такие проблемы и борьбу с ними:
• Выбросы в данных
• Гетероскедастичность
• Ненормальные распределения остатков и тд
А сегодня поговорим про мультиколлинеарность - сильную коррелированность регрессоров между собой, то есть линейную связь между ними, мешающую строить эффективные оценки.
Несмещенными и состоятельными оценки при этом остаются
Нарушение эффективности влечёт за собой сильную чувствительность оценок к выборке: оценки становятся неустойчивыми к малейшим изменениям в выборке, а доверительные интервалы слишком расширяются, что затрудняет интерпретацию.
Почему нужно бороться с мультиколлинеарностью?
При сильной мультиколлинеарности регрессионная модель может не обучиться, выдав ошибку вырожденной матрицы или численной нестабильности.
Важный нюанс: Ансамблевые методы (бустинг, случайный лес) более устойчивы к мультиколлинеарности, чем линейные модели, благодаря встроенному отбору признаков.
Однако даже в ансамблях мультиколлинеарность может:
• Снижать интерпретируемость 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🔥4⚡3😱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 #эконометрика
Сегодня поговорим про приём, который часто помогает в анализе экономических показателей (доходов, заработных плат и т.д.) – логарифмирование. 🔍
Так повелось, что показатели, выраженные в деньгах, зачастую имеют логнормальное распределение
Зачем вообще нужно логарифмирование? 🤔
Вот несколько причин, почему при работе с денежными показателями может понадобиться логарифмирование:
⚡️ Борьба с асимметрией
Как уже упомянул выше, данные имеют скошенное распределение, которое неудобно анализировать и моделировать, так как нарушаются предпосылки многих статистических моделей (нормальное распределение ошибок, постоянная дисперсия). Происходит это из-за того, что в денежных показателях почти всегда найдутся далекие выбросы. Крупнейшие компании, миллиардеры и т.п.
📐 Необходимость относительной, а не абсолютной интерпретации
После логарифмирования интерпретация коэффициентов в линейных моделях меняется.
В лог-линейной модели (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
🔥8☃4❤3🤩3💯1😈1🦄1
Невидимые враги анализа: разбираем выбросы👻 🗑
Сегодня продолжим серию постов о проблемах в данных, с которыми сталкиваются аналитики, и поговорим про выбросы.
Что такое выбросы? 🔍
Выбросы — это аномальные наблюдения, которые по своим значениям сильно отличаются от остальной выборки.
Простой пример из реальной жизни: если мы анализируем расходы на путешествия, где средний чек составляет 50,000 рублей, а одно путешествие стоит 500,000 рублей — это явный выброс. Такие наблюдения выделяются не только по цене, но и по другим признакам: длительности, категории отеля, сезону.
На что влияют выбросы и почему их следует исследовать отдельно? ⚠️
Выбросы могут серьёзно искажать наше представление о данных:
• Для описательного анализа: среднее значение смещается, дисперсия увеличивается, что мешает корректно оценивать выборку и делать выводы о генеральной совокупности
• Для построения моделей: в эконометрических и ML-моделях выбросы часто приводят к смещённым и несостоятельным оценкам
• Особенно чувствительны линейные модели — один мощный выброс может буквально «потянуть» за собой всю линию регрессии, сильно исказив результат
• Ансамблевые методы (бустинг, бэггинг) справляются лучше благодаря своей структуре, но и они не идеальны
Как найти выбросы? 🕵️♂️
Обычно выбросы ищут в контексте непрерывных признаков, используя два подхода вместе: визуализацию и статистические методы.
• Boxplot — график, который наглядно показывает распределение и выбросы. Чаще всего за выбросы принимают наблюдения, выходящие за пределы интерквартильного размаха (IQR)
• Статистические критерии: если выбросы занимают <10% данных, с ними можно работать, но всё зависит от конкретной задачи
Фото: пример boxplot с выбросами
Пока готовил пост, наткнулся на хорошую статью про боксплоты📰
Практический пример поиска:
Кейсы, когда мне приходилось бороться с выбросами🔥
🚕Первый кейс связан с всё той же задачей предсказания длительности поездок.
В датасете были поездки, длительность которых меньше 60 секунд. Скорее всего, это ошибки в данных, поэтому я исключил такие наблюдения из анализа.
👨🦳Второй кейс — исследование факторов долголетия — принципиально иной. Выбросами здесь были реальные долгожители (110+ лет). В отличие от ошибок, эти данные — ценная информация. Они могут объясняться уникальной генетикой, особыми условиями жизни (например, в "голубых зонах" Кавказа) или сочетанием факторов. Удалять их — значит игнорировать саму цель изучения предела продолжительности жизни. Вместо этого я использовал методы, устойчивые к выбросам, чтобы они не искажали общую модель, но оставались частью картины, которую мы анализируем.
В следующем посте расскажу про продвинутые методы поиска выбросов и методы их обработки🛠
А как вы обычно находите и обрабатываете выбросы? Пишите в комментариях💬
Ставьте:
🔥 если пост был полезен,
❤️ если хотите больше постов про проблемы в данных
🤩 если хотите больше постов про работу с выбросами
#аналитические_методы
#eda
#из_моей_практики
#статистика
#ml
#эконометрика
Сегодня продолжим серию постов о проблемах в данных, с которыми сталкиваются аналитики, и поговорим про выбросы.
Что такое выбросы? 🔍
Выбросы — это аномальные наблюдения, которые по своим значениям сильно отличаются от остальной выборки.
Простой пример из реальной жизни: если мы анализируем расходы на путешествия, где средний чек составляет 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🎄3☃2🌭2💋2❤1👾1
Секрет быстрого кода: векторизованные операции в Python 🏃♂️
Сегодня решил рассказать вам про силу векторизованных операций в Python и сравнить их с другими методами обработки, выявив ключевые преимущества.
Зачем они нужны?🧐
Векторизованные операции помогают производить операции над массивами не поэлементно, а сразу для всего набора данных. Это в разы ускоряет код, что особенно ценно при больших объемах данных. Простая аналогия: можно взять каждый из 1000 камней поочередно и перенести их, а можно зачерпнуть их ковшом экскаватора и перевезти все сразу. Экскаватор в данном примере и есть векторизованная операция.
В основе векторизованных операций — библиотеки NumPy (работа с массивами) и Pandas
(надстройка для таблиц).
Какие они бывают?🧬
Перечислю основные векторизованные операции, которые могут понадобиться аналитику:
1. Арифметика и базовая математика
2. Статистика по столбцу
3. Логические операции и фильтрация
- Сравнения:
-
-
-
4. Строковые операции (через `.str`)
5. Дата-время (через `.dt`)
6. Оконные функции для временных рядов
7. Быстрое создание столбцов
Ключевое преимущество векторизованных операций - скорость работы.🔥
Разберем на примере скорость работы векторизованных операций в сравнении с другими методами.
📊 Фото 1: Логарифмический барплот — визуализирует разницу в скорости на 1 млн строк.
📈 Фото 2: Зависимость времени от размера данных — показывает, как разрыв растет с объемом.
Чеклист для операций с массивами📝
+ ✅ Правило 1: Всегда ищите встроенную векторизованную операцию в Pandas/NumPy.
+ ✅ Правило 2: Если ее нет — проверьте, можно ли решить через
+ ✅ Правило 3: Только в крайнем случае используйте
+ ✅ Правило 4: Цикл
Планы на будущее🚀
В дальнейшем я планирую глубже погрузиться в тему векторизации, и написать пост об этом.
А вы используете векторизованные операции в работе? Какие из них оказались самыми полезными? Делитесь в комментариях💬
Ставьте
🔥, если пост был полезен
❤️, если интересно увидеть больше постов про обработку данных с помощью Python
🤩, если ждете новый пост про векторизованные операции
#аналитические_методы
#python
#pandas #numpy
Сегодня решил рассказать вам про силу векторизованных операций в 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(условие, если_да, если_нет) — аналог IF4. Строковые операции (через `.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: Всегда ищите встроенную векторизованную операцию в 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😈3❤1👨💻1
Говорящий код: сила комментариев 💬
Наверняка каждый из вас хоть раз сталкивался с необходимостью разбираться в чужом коде. И наверное вы заметили, что делать это намного проще и быстрее, если в коде есть качественные комментарии.
Представьте: перед вами две вкладки в Jupyter Notebook. В одной — лаконичный код с непонятной магией преобразований. В другой — те же операции, но с пояснениями «почему» и «зачем». В какой вы разберетесь быстрее? Ответ очевиден.
Сегодня поговорим о важности и практической пользе написания комментариев в коде.
Зачем тратить время на комментарии? 🤔
Во-первых, это в будущем поможет вам.
Когда вы вернетесь к своему коду спустя время, есть большая вероятность, что вы не вспомните, зачем, например, преобразовывали таргет в модели, или почему заменили пропуски, например, медианой, а не средним.
Комментарии такого рода помогут вам сразу вспомнить весь контекст:
Во-вторых, это поможет коллегам, которым, возможно, нужно будет работать с вашим кодом. По своему опыту могу уверенно сказать, что разбираться в чужом коде, как правило, намного сложнее, чем писать свой.
Когда стоит писать комментарии?✅
· Перед началом нового блока кода. Например, в этой ячейке вы планируете сгруппировать данные по 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. Не ленитесь оставить комментарий, даже если в моменте всё кажется очевидным. Очевидность имеет свойство испаряться с течением времени.
А комментируете ли вы свой код?
Пишите в комментариях к посту!💬
Ставьте:
🔥— если было полезно
❤️ — если всегда стараетесь комментировать свой код
🤩— если интересны посты на тему оформления кода
#из_моей_практики
#код
#оформление
Наверняка каждый из вас хоть раз сталкивался с необходимостью разбираться в чужом коде. И наверное вы заметили, что делать это намного проще и быстрее, если в коде есть качественные комментарии.
Представьте: перед вами две вкладки в 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
В моделях машинного обучения гиперпараметры играют ключевую роль. Они определяют устройство модели, а их грамотный подбор может значительно улучшить качество.
Сегодня я расскажу про 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🏆2❤1🍌1😈1👻1🤪1