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

В этом канале я буду публиковать самое интересное, с чем встречаюсь на работе или учёбе.

Кто я? 🧑‍💻
Мне 20, учусь на Факультете экономических наук НИУ ВШЭ и уже год работаю аналитиком в крупном банке.

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

О чём я буду писать здесь? ✍️
Вот какие темы и хештеги вы здесь встретите:

#жизнь_аналитика
— Как совмещать работу и учебу
— Истории из офиса и не только
— Мысли о карьере и развитии

#софт_скиллы 🗣
Опыт коммуникации с командой и менеджерами, презентации результатов, критическая оценка задач

#аналитические_методы 🔎
Всевозможные аналитические приемы и методы, которыми я пользуюсь и хочу поделиться

#визуализация_данных 📊
Красивые и понятные способы визуализации (matplotlib, seaborn, plotly etc)

#образование 👨‍🎓
Мои отзывы о курсах, связанных с анализом данных

#карьера 🚀
Здесь я буду рассказывать, как войти в анализ данных и продолжать развиваться

#из_моей_практики 💡
Интересные закономерности и явления, которые я обнаружил в данных

А также технические теги: 🖥
#sql #python #ml #статистика

#offtop 🍿
Всё, что не вошло в другие рубрики

Почему вам может быть интересно?
Если вы начинающий аналитик, студент или просто интересуетесь данными — вам сюда.

Чем могу быть полезен?
Пишите мне в личку @glebgavrin с любым вопросом. Обещаю, что отвечу и постараюсь помочь!
Мои проекты и код: Github - здесь я выкладываю свои выполненные ДЗ с курсов, пет-проекты и т.п


Подписывайтесь — вместе будет интересно!❤️
7🔥4💯1😭1👻1
Классный способ визуализации, который открыл для себя недавно

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

В чём суть?🤔

Берём два категориальных признака (в моём примере — IT-специализация и грейд) и для каждой их комбинации строим boxplot. Это позволяет одним взглядом оценить комплексное влияние двух факторов на целевую переменную.

Какие инсайты можно найти? 💡

Вот что я обнаружил на примере датасета с зарплатами в IT:
• Чёткий рост зарплаты от middle к senior почти во всех специализациях
• В сфере Research and Advanced ML джуны получают неожиданно много — часто больше, чем миддлы в других направлениях. Вероятно, сказывается высокий порог входа и нехватка сильных кадров
Аномально высокие зарплаты у некоторых джунов (например, 300к у AI Developer) — возможно, это ошибки в данных или уникальные кейсы
• Самый перспективный карьерный рост (по разрыву в зарплате между грейдами) — в ML Engineering, Management и Data Engineering

Как это построить?
🛠

Вот пример кода на Python с seaborn:

import matplotlib.pyplot as plt
import seaborn as sns

plt.figure(figsize=(10, 8))
sns.boxplot(x='experience_level', y='salary_in_usd', hue='job_category', data=df, palette='Set2')
plt.title('Зависимость зарплаты от грейда и сферы деятельности', fontsize=15)
plt.xlabel('Грейд')
plt.ylabel('Заработная плата, $ в год')
plt.legend(title='Сфера деятельности')
plt.tight_layout()
plt.show()

Ссылка на датасет
А как вы визуализируете подобные зависимости?
💬

Буду рад обсуждению в комментариях!

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

#визуализация_данных #python #аналитические_методы #из_моей_практики
🔥113👏3😍1😈1
Продвинутый метод pandas, который обожают на собесах 💥

Расскажу про explode() — метод, который буквально «взрывает» датафрейм, превращая списки в ячейках в отдельные строки. Элегантная альтернатива циклам.

▫️ Как работает?
DataFrame.explode(column, ignore_index=False)

· ignore_index=False — сохраняет исходные индексы (появятся дубли)
· ignore_index=True — пересобирает индекс с нуля

▫️ Пример «взрыва»

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

Было:
| user_id | cities          |
|---------|-----------------|
| 1 | [Москва, Сочи] |
| 2 | [Казань] |

Стало после df.explode('cities'):
| user_id | cities  |
|---------|---------|
| 1 | Москва |
| 1 | Сочи |
| 2 | Казань |


🔥 3 потенциальных способа применения:

1. Анализ популярности городов
cities_popularity = (df.explode('cities')
.groupby('cities')['user_id']
.count()
.sort_values(ascending=False))

2. Поиск пользователей по городам
target_cities = ['Москва', 'Лондон']
filtered_users = (df.explode('cities')
.query('cities in @target_cities')['user_id']
.unique())

3. Создание парных комбинаций
from itertools import combinations

tags_pairs = (df.explode('cities')
.groupby('user_id')['cities']
.apply(lambda x: list(combinations(x, 2)))
.explode()
.dropna())


💡 Личный опыт
Именно этот метод помог мне красиво решить задачу на собеседовании в ❤️!

Ставьте ❤️, если уже использовали explode()
Ставьте 🔥, если раньше не использовали, но теперь обязательно возьмёте на вооружение!

💎 Полезный метод?
Сохраните в закладки
— пригодится на собеседовании!

#python
#аналитические_методы
#pandas
#вопросы_с_собеседований
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥15🆒3👏2
Этот метод 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
Красивая визуализация: множественные линии в 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
Секрет быстрого кода: векторизованные операции в 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
Как улучшить точность модели на 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
Мой топ: как я подбираю визуализацию и библиотеку под неё 📊

Визуальный анализ — база любого проекта.
Для частых задач я собрал свой набор графиков, где миксую matplotlib, seaborn и plotly.
Сегодня расскажу, какую библиотеку и под какой сценарий беру.


Гистограмма распределения с выделением мер центральной тенденции
↗️

Для визуализации распределения я обычно использую seaborn, так как kde-сглаживание и hue-группировка делаются в одну строку. Добавление линий среднего и медианы помогает понять, в каком хвосте выбросы. Если среднее заметно правее/левее медианы — почти наверняка в этой стороне есть выбросы. На первой картинке видно: хвост справа тянет среднее за собой.


Распределения + выбросы
🔭

Еще для изучения распределений и детекции выбросов хорошо подходят графики boxplot, их я тоже строю с помощью seaborn. Причем можно как просто визуализировать распределение одной непрерывной переменной, так и разбить выборку по какому-нибудь категориальному признаку и сравнить распределения - пример на второй картинке. Еще я делал пост про более сложную визуализацию, которая помогает хорошо отследить взаимосвязи между несколькими переменными.


Временные ряды
📈

Для временных рядов я обычно использую plotly line.
Plotly позволяет быстро подсветить максимумы/минимумы. Я могу навести курсор и сразу увидеть дату и значение без дополнительного кода — это ускоряет поиск аномалий.
Пример использования на третьей картинке. Также есть пост про визуализацию нескольких рядов сразу для сравнения.


Столбчатые диаграммы
📊

Для столбчатых диаграмм я использую как seaborn, так и plotly. Seaborn в основном предпочитаю в случаях, когда надо визуализировать частотность (countplot) или сравнить средние/медианы по группам (группировка + barplot) - примеры на 4й и 5й картинках.
В plotly легко сделать анимированные или накопительные доли, а интерактивность помогает смотреть структуру без тонны графиков.
Пример на шестой картинке.


Тепловая карта корреляций
🎨

Для анализа корреляций идеально подходит heatmap от seaborn. Чем выше корреляция - тем ярче заливка ячейки. Пример на седьмой картинке.


Код для построения всех этих графиков с датасетами выложил на kaggle.


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

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

#визуализация_данных
#python
#matplotlib
#seaborn
#plotly
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥1511🐳1