gram news
Data analysis | Анализ данных | DA channel avatar

Data analysis | Анализ данных | DA

@business_stats

Про анализ данных для аналитиков (Data analysis): базы данных (БД), SQL, Python и IT По всем вопросам - @connection_07 Мой курс по анализу данных - https://stepik.org/a/269469 Реклама на бирже - https://telega.in/channels/business_stats/card

ProjectsRUProgramming

1,720subscribers

Open the Channel

Latest posts

  • Data analysis | Анализ данных | DA

    21 Sept, 07:04

    Когда выгоднее всего покупать авиабилеты?Есть популярный миф, что покупать билеты задолго до даты вылета выгоднее, потому что потом они начинают резко дорожать. И еще иногда этот миф дополняется тем, что в самый последний момент цена может резко упасть.Чтобы проверить, действительно ли так всё происходит, можно взять датасет Flight Price Prediction и проанализировать его. Здесь собраны 300 000 бронирований билетов за 1.5 месячный промежуток времени с индийского сайта EaseMyTrip.В датасете есть ключевые поля:▶️Дней до вылета ▶️ЦенаИ вспомогательные:▶️Название авиакомпании ▶️Flight Code ▶️Город отправления ▶️Время вылета ▶️Кол-во пересадок ▶️Время прибытия ▶️Город назначения
    19331Open in Telegram
  • Data analysis | Анализ данных | DA

    17 Sept, 07:02

    Что такое Zero-ETL и Reverse ETLКлассические ETL-процессы сначала извлекают данные из источника, затем они преобразовываются и загружаются уже в целевые хранилища. В случае с Zero-ETL и Reverse ETL всё немного иначе.▶️Zero-ETL - это подход, при котором данные из одной системы-источника становятся доступны в хранилище без классического процесса извлечения-трансформации-загрузки, который нужно строить и поддерживать вручную.Работает это следующим образом. Вместо построения отдельного ETL-процесса делается снимок данных в БД на определенный момент времени и переносится уже в целевое хранилище. Актуальность же этого снимка в хранилище поддерживается с помощью журнала транзакций. То есть любое изменение в источнике сразу же отражается в целевом хранилище с помощью Change Data Capture.То есть по сути это автоматически обновляемая репликация, в которой отсутствует этап трансформации
  • Data analysis | Анализ данных | DA

    10 Sept, 09:05

    Какие профессии может заменить ИИ?Попробуем понять это, проанализировав датасет AI Occupational Impact Index (Meo Advisors, методология AIOE). Это уже готовый рейтинг на основе американской макроэкономической статистике по рынку труда. Он включает в себя 1016 различных профессий.В этих данных существует ключевой показатель - ai_exposure_score. Этот показатель принимает значения от 0 до 100, где 0 - минимальный риск замены ИИ, а 100 - максимальный.В двух словах, риск замены ИИ считается как пересечение навыков, нужных для той или иной профессий, с теми навыками, которые ИИ уже может покрывать. Чем больше пересечений, тем, соответственно, выше и риск, а значит, и само значение ai_exposure_score. Конечно, само по себе пересечение навыков на 100% не гарантирует того, что профессию заменит ИИ, но это значительно может повысить риск.🟠В рамках же этого анализа попробуем сделать
  • Data analysis | Анализ данных | DA

    7 Sept, 08:41

    Как найти серии подряд идущих дней в 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:
    55344Open in Telegram
  • Data analysis | Анализ данных | DA

    31 Aug, 07:29

    Функции обработки 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 аргумента и по
    63732Open in Telegram
  • Data analysis | Анализ данных | DA

    25 Aug, 08:08

    Есть ли смысл искать жильё в аренду напрямую от собственника?На примере выгрузки из Циана по московскому рынку аренды жилья за 2026 год Moscow Rent Cian With Images, содержащей около 25 тысяч объявлений, выясним, действительно ли цена аренды от агента отличается от цены аренды от собственника, и если да, то на сколько? Причем разницу будем искать не в виде единоразового первоначального платежа, а в виде стоимости самой аренды на весь срок.🟠Сравнение будет проводиться с учетом следующих факторов:— Район — Расстояние до метро (мин пешком) — Тип ремонта — Год постройки дома — Площадь квартиры — Число комнат — Этаж и этажей всего🟠Анализировать будем с помощью метода ближайших соседей: для каждой квартиры будет подбираться максимально похожий аналог напрямую из датасета с учетом вышеперечисленных факторов.Таким образом будет сформировано множество пар практически полностью
    65531Open in Telegram
  • Data analysis | Анализ данных | DA

    20 Aug, 11:01

    Как читать вывод по множественной регрессии?Если вы решите запустить 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. - мультиколлинеарность, показывает, коррелируют ли факторы между собой.
    Image from a post by Data analysis | Анализ данных | DAImage from a post by Data analysis | Анализ данных | DA
    66122Open in Telegram
  • Data analysis | Анализ данных | DA

    17 Aug, 09:13

    Действительно ли удаленка снижает зарплату?Это экспериментальный формат. Я буду брать реальные данные из открытых источников, формулировать насущную гипотезу и доказывать её с помощью разных аналитических методовДанные взяты с kaggle - Stack Overflow Annual Developer Survey 2025. Датасет представляет собой крупнейший опрос айтишников за 2025 год из разных стран мира на тему профессии. Включает в себя более 50 тысяч опрошенных человек и детализацию более чем по 170 параметрам. В датасете представлены профессии разработчиков, аналитиков, инженеров, менеджеров, администраторов.🟠Стоит держать в голове, что:▶️Опрос - это прежде всего срез данных по тем людям, которые согласились сами пройти опрос и прошли его. Информация по тем, кто в опросе НЕ участвовал, нам закономерно неизвестна.▶️Ключевые поля в датасете - это ConvertedCompYearly (зарплата в USD) и RemoteWork
    66642Open in Telegram
  • Data analysis | Анализ данных | DA

    12 Aug, 07:02

    Регрессия к среднему как ловушка в аналитикеСтатистическое правило, которое часто неверно понимается: если какой-то показатель был слишком хорошим или слишком плохим, то в следующем периоде он станет ближе к норме. И это ухудшение или улучшение происходит само по себе, вне зависимости от того, вмешивается ли кто-либо или нет.И из-за этого довольно легко подумать, что именно то самое вмешательство вернуло показатель в норму, хотя это не так (ну или не совсем так).🟠Как же бороться с таким эффектом? Как оценить эффект именно от вмешательства, а не от статистической закономерности?Для этого вводятся контрольные группы.Контрольная группа - это часть выборки, к которой не применяется вмешательство. Она нужна именно для того, чтобы отделить реальный эффект от естественной регрессии к среднему.Логика следующая: если и тестовая группа, и контрольная синхронно сдвигаются к норме, это
  • Data analysis | Анализ данных | DA

    6 Aug, 05:01

    Таблицы фактов без фактовЕсли вспомнить классические схемы БД, такие как звезда или снежинка, то мы обнаружим, что центральная таблица - таблица фактов - обычно содержит ключи и числовые метрики, которые отображают факт произошедшего события (например, сколько товаров было продано).Но встречаются ситуации, когда у события нет численных метрик. Например, когда нужно отразить, посетил ли человек мероприятие или нет; была ли активна подписка или нет; было ли отправлено письмо и т.п.🟠Для этих случаев используются таблицы фактов без фактов (Factless Fact Table). И выглядят они следующим образом.1️⃣Если нам нужно зафиксировать сам факт наступления события (например, отправку письма), то используется такая структура:CREATE TABLE fact_email_sends ( date_id INT NOT NULL, user_id INT NOT NULL, campaign_id INT NOT NULL, channel_id INT NOT NULL)Таблица содержит информацию о том, когда
  • Data analysis | Анализ данных | DA

    3 Aug, 08:27

    Как искать расхождения?Болезненная и довольная частая тема. Допустим, мы написали какой-то SQL-запрос, выгрузили по нему данные из БД и решили проверить, правильно ли всё сделано. Но внезапно выяснилось, что контрольные суммы по всей выгрузке и по изначальной таблице различаются.🟠Значит, где-то есть ошибки, и надо их искать. Но как?▶️Самый очевидный вариант - проверить дубликаты при джоинах. Делается это достаточно просто и возможно даже быстро:SELECT id, COUNT() AS cnt FROM table GROUP BY id HAVING COUNT() > 1▶️Может еще быть такое, что дубликатов при джоинах не возникло, зато какие-то id не включились в выгрузку. Или наоборот включились лишние. В этом случае могут помочь подзапросы:SELECT FROM table WHERE id NOT IN (SELECT id FROM query_result)
    65042Open in Telegram
  • Data analysis | Анализ данных | DA

    31 Jul, 11:24

    Как спрогнозировать сезонные данные на PythonПредставим, что у нас есть временной ряд (например, продажи). И нужно понять, какая часть колебаний - это регулярный сезонный паттерн, а какая - тренд и "чистое" изменение показателя без сезонного шума.❗️Так как тема достаточно объемная, код будет написан не весь, а только самые важные моменты. Считаю важным рассказать именно про логику и последовательность.🟠Итак, для этих целей есть 2 вида моделей:▶️Аддитивная модель используется тогда, когда амплитуда сезонных колебаний постоянна и не зависит от уровня ряда (например, каждый декабрь +500 продаж сверх тренда, всегда +500, вне зависимости от того, растёт бизнес или нет).▶️Мультипликативная модель используется тогда, когда амплитуда колебаний растёт вместе с уровнем ряда (например, декабрь даёт +20% к тренду, и если тренд вырос, абсолютная прибавка тоже растёт).🟠В реальных
  • Data analysis | Анализ данных | DA

    28 Jul, 12:40

    Проблемы в оптимизации SQL-запросовИногда приходится сталкиваться с запросами, где должно быть большое количество условий. Например, много условий в WHERE, много полей в GROUP BY, много JOIN и т.п. И такие запросы будут выполняться очень медленно и даже не факт, что выполнятся вообще.🟠Но почему такое происходит?▶️WHERE сам по себе работает как фильтр данных. Если вспомнить порядок выполнения SQL-запроса, то WHERE выполняется одним из первых. И по идее, если добавлять в WHERE по 5-10 условий через AND, то лишних данных может отсеяться очень много, что в итоге сделает запрос легче и быстрее. И в целом, это так и работает, и запрос реально может стать быстрее или хотя бы не измениться.Но в случае, если у нас прописаны индексы на 1-2 самых часто используемых столбцах, то добавление дополнительных неиндексированных столбцов может значительно замедлить работу. Происходит это из-за
  • Data analysis | Анализ данных | DA

    25 Jul, 10:02

    Маркетинговые метрикиШпаргалка по наиболее популярным маркетинговым метрикам, может быть очень полезна при собеседованиях в профильные компании:🟠Финансовые метрики и окупаемость. Показывают, насколько маркетинг выгоден для бизнеса.▶️ROAS (Return on Ad Spend) - окупаемость затрат на рекламу. Показывает, сколько рублей дохода приносит каждый рубль, вложенный в рекламу.Доход от рекламы / Затраты на рекламу▶️LTV (Lifetime Value) - пожизненная ценность клиента. Общая сумма денег, которую клиент приносит компании за все время сотрудничества.Средний чек Частота покупок Время жизни клиента▶️CAC (Customer Acquisition Cost) - стоимость привлечения одного платящего клиента.Затраты на рекламу / Кол-во новых клиентов▶️LTV:CAC - соотношение ценности клиента к стоимости его привлечения. Самой оптимальной считается пропорция 3:1 и выше.
  • Data analysis | Анализ данных | DA

    23 Jul, 05:02

    Как на SQL найти постоянных клиентов, которые уже ушлиПредположим, есть таблица с заказами, в которой нас интересуют лишь поля:▶️client_id - id клиента ▶️order_date - дата заказаИ нужно найти тех клиентов, которые не совершали покупок более 90 дней, НО которые при этом раньше покупали регулярно (например, минимум 1 раз каждые 7 дней, суммарно не менее 5 покупок). С маркетинговой точки зрения такая выборка покажет, какие из наиболее лояльных и постоянных клиентов вдруг потеряли полностью интерес к нашей продукции🟠Сделать такую выборку можно на SQL, используя СТЕ и оконные функции.1️⃣Начать запрос можно с того, чтобы вывести с помощью оконных функций самую последнюю order_date и предыдущую от текущей order_date для каждого клиента, а также посчитать общее кол-во покупок у каждого клиента:WITH client_orders AS ( SELECT client_id, order_date, MAX(order_date) OVER (PARTITION BY
    69252Open in Telegram
  • Data analysis | Анализ данных | DA

    20 Jul, 05:05

    Нечёткий поиск и дедупликация записей на PythonВ DWH бывают ситуации, когда разные записи означают одно и то же. Например, "ООО Ромашка", "ООО Ромашкa" (с лат. 'a') и "Ромашка ООО" могут быть 3 разными клиентами в витрине, но 1 реальным бизнесом. Таких расхождений может быть много. Вручную перебирать это долго и неэффективно, т.к. есть риск что-то пропустить.На помощь приходит кластеризация дубликатов при помощи косинусного сходства. Суть метода в следующем:1️⃣Данные нужно подготовить, т.е. привести к одному формату: убрать лишние пробелы и переносы, сокращения, привести текст к нижнему регистру. Нужно это для облегчения работы алгоритма и для снижения риска лишних ошибок. Делается это просто и быстро:import pandas as pd import numpy as np from sklearn.feature_extraction.text import TfidfVectorizer from sklearn.metrics.pairwise import cosine_similarity#ДАННЫЕ + DataFramedf['n
    82261Open in Telegram
  • Data analysis | Анализ данных | DA

    16 Jun, 09:40

    Данные с запозданием в БДПредположим, в базе данных случаются ситуации: операция была произведена 30-ого числа, а в DWH эта запись отразилась только 5-ого. В случае, если по таким данным строятся отчеты, то такие отчеты будут неполными, т.к. в них не будут входить подобные операции (если берем отчеты за месяц). Исправлять же уже готовые отчеты задним числом тоже не совсем правильно и допустимо.И для того, чтобы избегать таких ситуаций и иметь корректные отчеты, было придумано несколько способов:▶️Отчеты можно делать в виде Insert-only витрин. Это значит, что все факты добавляются новыми строками, а старые не перезаписываются. Отчёт считается и обновляется автоматически и является динамическим, при этом он защищен от удалений и включает все когда-либо пришедшие данные. Но такой способ подойдет далеко не всем и не всегда.▶️Также в DWH можно ввести понятие "закрытый период",
    1,06071Open in Telegram
  • Data analysis | Анализ данных | DA

    3 Jun, 13:50

    Предвзятость отбора в аналитикеПредвзятость отбора (selection bias) - это систематическая ошибка, которая возникает в случаях, когда выборка не является репрезентативной для генеральной совокупности. И из-за того, что аналитика изначально уже строится на таких искаженных данных, получаются неверные выводы.И хоть это кажется интуитивно понятным, что всего-то и нужно, что брать объективные данные, которые отображают как "плюс", так и "минус", на деле это бывает далеко не всегда очевидно.Существуют множество видов так называемых bias, но самые основные из них это:▶️Sampling bias – наиболее очевидный вариант: способ сбора данных искажает распределение. Возникает на этапе формирования выборки.Например, если строится модель кредитоспособности клиентов, которая должна уметь предсказывать дефолты, то нужно брать не только тех, кто получил кредит, а еще и тех, кому было отказано.
  • Data analysis | Анализ данных | DA

    1 Jun, 06:24

    INTERSECT и EXCEPT/MINUS в SQLВсе мы знаем такие операторы, как UNION и UNION ALL, которые объединяют результаты двух и более SELECT в одну таблицу (без дубликатов и с дубликатами соответственно). Но существуют еще менее популярные, но иногда полезные аналоги традиционных UNION: INTERSECT и EXCEPT (или же MINUS в Oracle).Все эти команды используются в одном и том же месте в запросах - между SELECT:SELECT col1, col2... FROM table1...[UNION | UNION ALL | INTERSECT | EXCEPT (MINUS)]SELECT col1, col2... FROM table2...При этом для всего этого действуют такие же общие правила: количество столбцов в запросах должно быть одинаковым; типы данных должны быть сопоставимы; наличие 2 и более NULL считается дубликатами и т.д.▶️INTERSECT нужен для того, чтобы выводить строки, которые присутствуют в обоих SELECT, то есть этот оператор отвечает за пересечение. При этом, что логично, эта
  • Data analysis | Анализ данных | DA

    28 May, 14:14

    GeoPandas в PythonGeoPandas - это надстройка над Pandas в Python, которая используется для географического анализа. Главная её особенность - поддержка географических объектов с помощью GeoDataFrame и GeoSeries.▶️GeoDataFrame - это, по сути, тот же DataFrame, только с поддержкой географических объектов в столбце geometry. Создается он следующим образом:import geopandas as gpd import pandas as pd#data = Данные с координатамиdf = pd.DataFrame(data)gdf = gpd.GeoDataFrame( df, geometry=gpd.points_from_xy(df['lon'], df['lat']), crs="EPSG:4326" )Получится та же самая таблица, что и при обычном df, только координаты (широта и долгота) будут записаны в специальном формате в отдельном столбце geometry в виде point(). Позже их можно будет использовать для разных пространственных расчетов: нахождение площади, расстояния, построение границ и т.д.
    97743Open in Telegram