Logo
TGCATALOG
Catálogo Selecciones Blog
Análisis de datos - DA SQL

Análisis de datos - DA SQL

Análisis de datos: SQL, Python.

Sin valoraciones
582
29.10.2026
582
29.10.2026
Sin valoraciones
582
29.10.2026
Redirección segura vía bot
О канале

Análisis de datos: SQL, Python.

Подписчиков 1,700
Тематика Tecnología
Язык Español
Ссылка t.me/business_stats

También te recomendamos

Kekaton AI  Voz en off y clon de voz
Kekaton AI Voz en off y clon de voz
Bot

bot de IA para clonar texto a voz y voz en Telegram. Cree audio utilizando la red neuronal de forma rápida y fácil.

Descripción

Acerca del análisis de datos: bases de datos, SQL, Python y más para analistas.

Últimas publicaciones

Análisis de datos - DA SQL
Análisis de datos - DA SQL
🔒Открыть пост
и посмотреть медиа
Когда выгоднее всего покупать авиабилеты? Есть популярный миф, что покупать билеты задолго до даты вылета выгоднее, потому что потом они начинают резко дорожать. И еще иногда этот миф дополняется тем, что в самый последний момент цена может резко упасть. Чтобы проверить, действительно ли так всё происходит, можно взять датасет Flight Price Prediction и проанализировать его. Здесь собраны 300 000 бронирований билетов за 1.5 месячный промежуток времени с индийского сайта EaseMyTrip. В датасете есть ключевые поля: ▶️Дней до вылета ▶️Цена И вспомогательные: ▶️Название авиакомпании ▶️Flight Code ▶️Город отправления ▶️Время вылета ▶️Кол-во пересадок ▶️Время прибытия ▶️Город назначения ▶️Класс (эконом или бизнес) ▶️Продолжительность полета 🟠Проводить анализ можно на SQL. Основной план - брать по отдельности каждый рейс и внутри него следить за динамикой цены в зависимости от того, как скоро будет вылет. И в конце вывести среднее по всем рейсам и сделать выводы. Но есть одна проблема - явно из датасета вытащить отдельно каждый рейс нельзя. Не поможет даже Flight Code, потому что он может повторяться из рейса в рейс. Поэтому определять где какой рейс можно по совокупности вспомогательных полей. И есть еще одна проблема - в датасете собрано огромное множество самых разных рейсов с разным уровнем цен. Напрямую всё это сравнивать и искать среднее нельзя, поэтому нужна нормализация. Внутри каждого рейса с помощью AVG можно определить базовую цену и считать изменения относительно нее в процентах. 🟠В коде это всё можно записать так: WITH flight_groups AS ( SELECT *, AVG(price) OVER ( PARTITION BY airline, flight, source_city, destination_city, departure_time, arrival_time, class, stops) AS group_avg_price, COUNT(*) OVER ( PARTITION BY airline, flight, source_city, destination_city, departure_time, arrival_time, class, stops) AS group_size FROM flights) по совокупности признаков определяем, где какой рейс, и для каждого выводим среднюю цену для будущей нормализации и кол-во. Затем уже считаем само соотношение, отсекая слишком малые группы: SELECT days_left, AVG(price / group_avg_price) AS n_price, COUNT(*) AS n_obs FROM flight_groups WHERE group_size >= 20 GROUP BY days_left ORDER BY days_left ❗️В итоге получилась таблица, где вывелось кол-во дней до вылета, нормализованная цена и кол-во наблюдений. Каждый наблюдаемый день стат значим, выводится на основе 3000 - 6500 рейсов от 6 авиакомпаний: ▶️В промежутке с 49-ого дня до 18-ого включительно цена очень стабильна и находится примерно на уровне 80-90% от базовой. То есть дисконт составляет 10-20%. ▶️Затем она начинает расти. Дисконт растворяется полностью за 16 дней до вылета, а уже c 14-ого дня цена идет с наценкой аж 30-40%. И такая картина сохраняется вплоть до 4-ого дня. ▶️Потом цена начинает расти еще сильнее, и уже за 2 дня до вылета наценка составляет уже целых 70%. А за 1 день до вылета цена вырастает в 2 раза, то есть наценка уже 100%. То есть миф оказался отчасти правдивым. Цена действительно растет ближе к вылету, но в последний момент за 1 день она не обваливается, а наоборот взлетает вплоть до удвоения. 🟠А более подробно полный цикл анализа реальных данных можно научиться проводить в моем курсе на Stepik.
Análisis de datos - DA SQL
Análisis de datos - DA SQL
🔒Открыть пост
и посмотреть медиа
Что такое Zero-ETL и Reverse ETL Классические ETL-процессы сначала извлекают данные из источника, затем они преобразовываются и загружаются уже в целевые хранилища. В случае с Zero-ETL и Reverse ETL всё немного иначе. ▶️Zero-ETL - это подход, при котором данные из одной системы-источника становятся доступны в хранилище без классического процесса извлечения-трансформации-загрузки, который нужно строить и поддерживать вручную. Работает это следующим образом. Вместо построения отдельного ETL-процесса делается снимок данных в БД на определенный момент времени и переносится уже в целевое хранилище. Актуальность же этого снимка в хранилище поддерживается с помощью журнала транзакций. То есть любое изменение в источнике сразу же отражается в целевом хранилище с помощью Change Data Capture. То есть по сути это автоматически обновляемая репликация, в которой отсутствует этап трансформации данных. Показатели придется рассчитывать уже в самом хранилище. Нужно это всё прежде всего для того, чтобы быстро перемещать данные из источника в хранилище, чтобы минимизировать задержку обновлений и чтобы избавиться от необходимости написания и запуска классического ETL-скрипта. ▶️Reverse ETL - это движение данных в обратном направлении: не из источника в хранилище, а из хранилища обратно в операционные системы. Логика работы обычно следующая. Reverse ETL берёт уже посчитанные в DWH метрики и отправляет их обратно в операционные системы, которыми пользуется бизнес. Данные могут передаваться разными методами, в т.ч. SQL-запросами. Для переноса также настраиваются и мэппинги, чтобы поля из DWH соответствовали полям в целевых системах. И после переноса данные могут постоянно обновляться при необходимости. Reverse ETL можно назвать дополнением обычного ETL. Ведь перед тем, как посчитанные метрики вернуть обратно в системы-источники, они должны сначала попасть в DWH и там трансформироваться. Нужно это всё для того, чтобы другие команды, которые работают с CRM, ERP и подобными системами получали готовые аналитические показатели без необходимости обращаться напрямую к хранилищу.
Análisis de datos - DA SQL
Análisis de datos - DA SQL
🔒Открыть пост
и посмотреть медиа
Какие профессии может заменить ИИ? Попробуем понять это, проанализировав датасет AI Occupational Impact Index (Meo Advisors, методология AIOE). Это уже готовый рейтинг на основе американской макроэкономической статистике по рынку труда. Он включает в себя 1016 различных профессий. В этих данных существует ключевой показатель - ai_exposure_score. Этот показатель принимает значения от 0 до 100, где 0 - минимальный риск замены ИИ, а 100 - максимальный. В двух словах, риск замены ИИ считается как пересечение навыков, нужных для той или иной профессий, с теми навыками, которые ИИ уже может покрывать. Чем больше пересечений, тем, соответственно, выше и риск, а значит, и само значение ai_exposure_score. Конечно, само по себе пересечение навыков на 100% не гарантирует того, что профессию заменит ИИ, но это значительно может повысить риск. 🟠В рамках же этого анализа попробуем сделать кластеризацию данного рейтинга, чтобы найти какие-нибудь закономерности. В качестве признаков для кластеризации возьмем, непосредственно, сам ai_exposure_score, а также логарифмы кол-ва работников и их зарплат. После очистки датасета от аномалий и ключевых полей от пропусков останется 934 профессии. И еще проведем нормализацию. Кластеризация будет проводиться с помощью KMeans из sklearn. Оптимальное кол-во кластеров, найденное через silhouette_score - 3 шт. ❗️После проведенной кластеризации получились следующие кластеры: 1️⃣кластер. Воздействие ИИ самое маленькое - около 42-43%. Включает в себя 480 профессий и почти 70 млн человек, занятых в этих сферах. Медианная зарплата - чуть ниже 50 тыс. USD в год, самая низкая среди кластеров. Типичные профессии, максимально близкие к центроиду кластера - это технические специалисты среднего звена типа геологов/инженеров, детективы, охранники, работники социальной сферы. 2️⃣кластер. Воздействие ИИ среднее - около 55-56%. Включает в себя 315 профессий и почти 64 млн человек, занятых в этих сферах. Медианная зарплата - в районе 100 тыс. USD в год, самая высокая среди кластеров. Типичные профессии, максимально близкие к центроиду кластера - это преподаватели вузов, экологи, веб-разработчики, учёные. 3️⃣кластер. Воздействие ИИ самое высокое - около 80%. Включает в себя почти 140 профессий и 63 млн человек, занятых в этих сферах. Медианная зарплата - в районе 60-65 тыс. USD в год. Типичные профессии, максимально близкие к центроиду кластера - это служащие с рутинными, регламентированными задачами: почтовые сортировщики, клерки, организаторы мероприятий, рядовые финансисты. 🟠Первое, что бросается в глаза - уровень дохода не влияет на риск замены. То есть самая уязвимая группа - работники с примерно средней по стране зарплатой. Отдельный расчет корреляции подтверждает это - коэффициент всего лишь ниже 0.3. Также можно заметить, что в 3 кластере самая высокая концентрация на рынке труда - медианно на каждую профессию приходится больше 200 тыс человек, тогда как на 1 и 2 кластеры - 30-60 тыс. чел. Ну и самое очевидное - чем выше компьютеризация и рутинность профессии, тем больше шанс, что она попадет под уязвимость ИИ. Но при этом если сфера узкая, в ней небольшая конкуренция и есть специфичные задачи, то есть вероятность, что ИИ будет добираться до этой профессии медленнее. 🟠А более подробно полный цикл анализа реальных данных можно научиться проводить в моем курсе на Stepik.
Análisis de datos - DA SQL
Análisis de datos - DA SQL
🔒Открыть пост
и посмотреть медиа
Как найти серии подряд идущих дней в SQL Классическая задача gaps and islands: есть таблица событий visits, которая имеет поля: ▶️client_id (id клиента) ▶️visit_date (дата визита) Нужно понять, сколько дней подряд клиент был активен, какая у него максимальная серия и когда она прервалась. 🟠Если пронумеровать визиты клиента по порядку через ROW_NUMBER и вычесть номер из даты, то у всех дней внутри одной непрерывной серии получится одно и то же значение. Как только в датах появляется дыра, значение меняется, значит, началась новая серия. SELECT client_id, visit_date, visit_date-ROW_NUMBER() OVER (PARTITION BY client_id ORDER BY visit_date)*INTERVAL '1 day' AS grp FROM visits Дальше достаточно сгруппировать по client_id и grp: WITH marked AS (запрос выше) SELECT client_id, MIN(visit_date) AS начало, MAX(visit_date) AS конец, COUNT(*) AS длина FROM marked GROUP BY client_id, grp ORDER BY длина DESC В итоге выведутся все серии по каждому клиенту с датами начала, конца и длиной. Максимальная серия достаётся обычным MAX(длина), текущая - фильтром по конец = CURRENT_DATE. ❗️Но есть нюансы, на которые нужно обратить внимание: ▶️Дубли. Если на клиента в один день приходится несколько строк, нумерация поедет и серии порвутся. Перед расчётом нужен DISTINCT или агрегация по дню. ▶️Шаг. Приём работает для равномерного шага. Для месяцев нужно вычитать номер из номера месяца. Для недель - привести дату к началу недели. А если разрывом считается произвольный интервал (например, пауза больше 30 дней), то вместо вычитания берётся LAG и накопительная сумма флага разрыва.
Análisis de datos - DA SQL
Análisis de datos - DA SQL
🔒Открыть пост
и посмотреть медиа
Функции обработки NULL в SQL Список всех нужных функций, которые позволяют работать с NULL в запросах: ▶️COALESCE(v1, v2, ..., vn) - наиболее универсальная функция в SQL. По порядку проверяет все заданные столбцы и возвращает первое попавшееся значение, которое не является NULL. Если в итоге все значения NULL - возвращает NULL. Работает в MySQL и в Oracle. Аргументов может быть сколько угодно (от 2 и больше), в отличие от большинства других функций в этом списке, где строго 1, 2 или 3 аргумента. Пример: COALESCE(phone_mobile, phone_home, phone_work, 'нет телефона') - вернет первый заполненный номер телефона из трех вариантов, а если все три пустые - вернет текст-заглушку. ▶️ISNULL(v1) - в MySQL проверяет, является ли поле NULL. Если да - возвращает 1, если нет - 0. Важно не путать с одноименной функцией ISNULL в SQL Server - там она работает совсем иначе, принимает 2 аргумента и по смыслу ближе к IFNULL/NVL. В MySQL же ISNULL(v1) - это просто проверка, а не замена значения. ▶️IFNULL(v1, v2) - для MySQL возвращает v1, если поле не NULL, и v2 - если поле NULL. Например, IFNULL(discount, 0) - если скидка не указана, в результате будет 0 вместо NULL, что удобно для дальнейших математических расчетов (сложение, умножение), поскольку любая операция с NULL дает в результате NULL. ▶️NVL(v1, v2) - работает точно так же, как и IFNULL, только в Oracle. ▶️NULLIF(v1, v2) - если v1 = v2, возвращает NULL, если не равно, то возвращает v1. Работает в MySQL и в Oracle. Часто применяется, чтобы избежать деления на ноль. Например, если записать revenue / NULLIF(quantity, 0), то если quantity = 0, функция вернет NULL вместо ошибки деления на ноль, и вся операция деления корректно завершится с результатом NULL, а не прервется. ▶️NVL2(v1, v2, v3) - "расширенная версия" NVL, тоже для Oracle. Выполняет тройную логику: если v1 NOT NULL, возвращает v2, если IS NULL - v3. Удобна, когда нужно вернуть не само значение поля, а какой-то текст или флаг в зависимости от того, заполнено оно или нет. Например, NVL2(discount, 'скидка есть', 'скидки нет') - вернет текстовую метку в зависимости от того, заполнено поле discount или нет, без необходимости писать CASE WHEN. ▶️LNNVL(condition) - специфичная функция Oracle: возвращает TRUE, если условие ложно или неопределённо (с NULL). Удобна в WHERE вместо громоздких конструкций. Например, если написать LNNVL(bonus = 500), то функция вернет TRUE, если bonus != 500 или если bonus - NULL. И вернет FALSE, если bonus = 500.
Análisis de datos - DA SQL
Análisis de datos - DA SQL
🔒Открыть пост
и посмотреть медиа
Есть ли смысл искать жильё в аренду напрямую от собственника? На примере выгрузки из Циана по московскому рынку аренды жилья за 2026 год Moscow Rent Cian With Images, содержащей около 25 тысяч объявлений, выясним, действительно ли цена аренды от агента отличается от цены аренды от собственника, и если да, то на сколько? Причем разницу будем искать не в виде единоразового первоначального платежа, а в виде стоимости самой аренды на весь срок. 🟠Сравнение будет проводиться с учетом следующих факторов: — Район — Расстояние до метро (мин пешком) — Тип ремонта — Год постройки дома — Площадь квартиры — Число комнат — Этаж и этажей всего 🟠Анализировать будем с помощью метода ближайших соседей: для каждой квартиры будет подбираться максимально похожий аналог напрямую из датасета с учетом вышеперечисленных факторов. Таким образом будет сформировано множество пар практически полностью аналогичных квартир, но одна из которых - от собственника, а другая - от агента. Затем сравним стоимость аренды внутри каждой пары и проверим это всё на статистическую значимость. 🟠Перед анализом, как и обычно, нужно очистить датасет от пропусков, т.к. метод ближайших соседей с ними не работает. Поэтому можно выделить основные факторы модели: сдающий (собственник/агент), цена, район, площадь и кол-во комнат. Здесь важно удалить все строки с пропусками по этим факторам. И в итоге получится выборка почти из 21 000 объявлений, из которых от собственника - чуть больше 5500. Значит, потенциально может быть выборка примерно из 5500 пар собственник-агент с контролем факторов. Пропуски по второстепенным факторам (тем, которые остались), можно заполнить медианными значениями по каждому району. 🟠Затем кодируем признаки и применяем NearestNeighbors() из библиотеки sklearn. В качестве параметров - евклидово расстояние между факторами и поиск только лишь по 1 ближайшему соседу на каждую квартиру. Ожидаемо, что не все пары получились идеальными. 10% пар нужно было отсечь из-за того, что общее расстояние между ними было слишком велико. Из оставшихся пар еще 24% нужно было отсечь из-за того, что сравнивались несопоставимые факторы при других равных факторах (например, площадь 132 кв. м. сравнивалась с 43 кв. м.). Итого получилось около 3800 вменяемых пар. ❗️Вывод: при анализе 3800 пар практически полностью сопоставимых между собой по перечисленным факторам квартир, обнаружилось, что по медиане стоимость аренды от собственника на 5,5% дороже стоимости аренды от агента. В рублях медианная разница вышла около 4 000 руб/мес. При этом доля пар, где у собственника цена дороже - около 57%. У агента дороже в 33% случаев, а одинаковая цена в 10% пар. Все результаты стат значимы. 🟠А более подробно полный цикл анализа реальных данных можно научиться проводить в моем курсе на Stepik.
Análisis de datos - DA SQL
Análisis de datos - DA SQL
🔒Открыть пост
и посмотреть медиа
Как читать вывод по множественной регрессии? Если вы решите запустить OLS Regression из библиотеки statmodels и вывести результат через summary(), то столкнетесь с прикрепленной выше таблицей. Самое важное, что нужно знать: ▶️Строка Intercept - базовое значение Y, когда факторы находятся в базовой категории ▶️Столбец coef - влияние фактора на Intercept. ▶️Столбцы std err, t и P>|t| - вспомогательные, они все про стат значимость. Её лучше сразу вывести отдельно через Pval. ▶️Столбцы [0.025 0.975] - доверительный интервал, разброс значений ▶️R-squared - R-квадрат, показывает, на сколько % наблюдаемое явление можно объяснить самой моделью ▶️Durbin-Watson - Автокорреляция остатков. Проверяет, коррелируют ли ошибки между собой. Желательно, чтобы значение было ближе к 2, но не меньше 0 и не больше 4. ▶️Cond. No. - мультиколлинеарность, показывает, коррелируют ли факторы между собой. Не должен быть слишком большим (несколько сотен). Но для большого кол-ва факторов иногда допустимо разумное превышение.
Análisis de datos - DA SQL
Análisis de datos - DA SQL
🔒Открыть пост
и посмотреть медиа
Действительно ли удаленка снижает зарплату? Это экспериментальный формат. Я буду брать реальные данные из открытых источников, формулировать насущную гипотезу и доказывать её с помощью разных аналитических методов Данные взяты с kaggle - Stack Overflow Annual Developer Survey 2025. Датасет представляет собой крупнейший опрос айтишников за 2025 год из разных стран мира на тему профессии. Включает в себя более 50 тысяч опрошенных человек и детализацию более чем по 170 параметрам. В датасете представлены профессии разработчиков, аналитиков, инженеров, менеджеров, администраторов. 🟠Стоит держать в голове, что: ▶️Опрос - это прежде всего срез данных по тем людям, которые согласились сами пройти опрос и прошли его. Информация по тем, кто в опросе НЕ участвовал, нам закономерно неизвестна. ▶️Ключевые поля в датасете - это ConvertedCompYearly (зарплата в USD) и RemoteWork (удаленка/гибрид/офис). Поэтому анализируемый датасет будет очищен от тех строк, где хоть 1 ключевое поле имеет значение NaN. ▶️Помимо ключевых полей будут учитываться поля: — MainBranch - основной вид деятельности — Age - возраст — Employment - тип занятости — EdLevel - уровень образования — WorkExp - опыт работы — DevType - специализация профессии — OrgSize - размер организации — Country - страна ▶️Также датасет будет еще дополнительно ограничен по параметрам: — MainBranch - мы будем учитывать только тех, у кого профессия разработчика - основной вид деятельности (не хобби и не подработка); — Employment - учитываются только люди, работающие по ТК или по B2B (без фрилансеров, самозанятых и пр) — Country - страна может очень сильно влиять на разброс зарплат, поэтому, чтобы чересчур не усложнять модель, возьмем только США. 🟠Итак, приступим. После применения всех фильтров (в т.ч. с NaN) получаем выборку 3880 человек. Но это еще не всё. Нужно также очистить датасет от аномалий по зарплате - будем брать только 1-99 перцентили, чтобы не было экстремальных нерепрезентативных перекосов. Получим диапазон зарплат от 9,460 USD до 651,200 USD в год и выборку около 3800 человек. И еще немного правок - сделаем группы побольше с помощью мэппингов. 🟠Основной план - построить множественную регрессию по log(ConvertedCompYearly) с контролем RemoteWork и остальных перечисленных параметров. Зарплата берётся в логарифме, потому что распределение доходов сильно скошено вправо, и лог-трансформация делает эффекты интерпретируемыми в процентах, а не в долларах. Посчитаем данные по мн. регрессии (OLS) и выведем summary с помощью библиотеки statmodels. Базовые значения - офисный формат работы, средний опыт, средний размер компании, профессия - разработчик. Остальные - по умолчанию. С базовыми значениями будет сравниваться эффект. ❗️Вывод: При прочих равных с учетом возраста, опыта, специализации, образования, размера компании - удаленка не снижает зп. Напротив - она её даже повышает в среднем на 15.2% относительно офиса. А гибрид повышает зп относительно офиса в среднем на 6.5%. Все результаты получились стат значимыми. Важно: это статистическая связь при контроле на несколько факторов, а не доказательство причинности. Не исключено, что часть эффекта объясняется неучтёнными переменными - например, регионами внутри США, конкретной компанией или индивидуальными переговорными навыками, которые не входили в модель. Также стоит учесть, что это всё - средний эффект. Далеко не факт, что, условно, для джуна и для сеньора удаленка будет давать по +15% к зп.
Análisis de datos - DA SQL
Análisis de datos - DA SQL
🔒Открыть пост
и посмотреть медиа
Регрессия к среднему как ловушка в аналитике Статистическое правило, которое часто неверно понимается: если какой-то показатель был слишком хорошим или слишком плохим, то в следующем периоде он станет ближе к норме. И это ухудшение или улучшение происходит само по себе, вне зависимости от того, вмешивается ли кто-либо или нет. И из-за этого довольно легко подумать, что именно то самое вмешательство вернуло показатель в норму, хотя это не так (ну или не совсем так). 🟠Как же бороться с таким эффектом? Как оценить эффект именно от вмешательства, а не от статистической закономерности? Для этого вводятся контрольные группы. Контрольная группа - это часть выборки, к которой не применяется вмешательство. Она нужна именно для того, чтобы отделить реальный эффект от естественной регрессии к среднему. Логика следующая: если и тестовая группа, и контрольная синхронно сдвигаются к норме, это значит, что дело не во вмешательстве. А вот если тестовая группа улучшилась заметно сильнее контрольной, то это уже скорее всего реальный эффект. 🟠Но как узнать, насколько сильно должна измениться тестовая группа по отношению к контрольной, чтобы сказать, что это - с огромной вероятностью эффект вмешательства? Где именно проходит эта граница? Для этого нужно посчитать статистическую значимость. Суть в следующем. Например, у нас есть n магазинов. Из этих n магазинов выбираем 10% самых худших по выручке с целью повысить их показатели. Эти 10% магазинов случайным образом делим на 2 группы: по 5% на тестовую и контрольную группы. Затем берем среднее значение внутри каждой группы ДО и ПОСЛЕ эксперимента. Считаем прирост и стандартное отклонение для этого прироста. Получившиеся результаты вставляем в формулу по расчету t-статистики, с помощью которой уже находим p-value и определяем, действительно ли меры были эффективны или это всё же результат статистической закономерности.
Análisis de datos - DA SQL
Evolución de suscriptores
+-0.5% últimos 30 días
Actuales
1,700
Hace un mes
1,709
Crecimiento medio
+0 / día
Actualizado
hace 11 horas

Reseñas de canal Análisis de datos - DA SQL

Inicia sesión para dejar una reseña

Solo los usuarios registrados pueden compartir su opinión.

Aún no hay reseñas

¡Sé el primero en compartir tu experiencia con este recurso!

Recursos similares

Loading
Cambiar a tema claro
Inicio Catálogo Selecciones Blog Entrar