Мир аналитика данных
4.59K subscribers
139 photos
3 videos
114 links
Пишу о рабочих буднях аналитика. Тут много рабочего кода, прохождение собеседований и еще много всего полезного.
https://www.linkedin.com/in/valeriashuvaeva
Автор канала: @Valeria_Shuvaeva
Download Telegram
This media is not supported in your browser
VIEW IN TELEGRAM
6👍1👏1
Всем привет! Меня зовут Лера и я с недавнего времени – аналитик данных! От любого процесса нужно получать удовольствие. Особенно если этот процесс – ваша работа. Поэтому я сменила свою профессию.
От работы, к которой не лежит душа, можно уйти, найти другую и прежняя ни слова не скажет против. Любимая работа поддержит Вас, накормит и вдохновит. Но это сложное искусство - поиск именно той своей работы. Этому процессу нужно уделять время и дарить немного любви.
О том как работается аналитику, с чем он сталкивается и вообще о пути к мечте – мой блог.
Я люблю цифры, графики, данные. С ними просто и легко. Их можно собирать, обрабатывать (хоть это и не грибы), по-разному структурировать. За ними прячется смысл, который интересно искать и находить. От этого я получаю удовольствие, за которое мне теперь еще и платят. Конечно, на работе не бывает безоблачно. Нужно много тренироваться, постоянно совершенствовать навыки, иногда ошибаться и считать себя чайником, пополнять копилку знаний SQL и Pandas – шикарной библиотеки Python.
👍4817🔥8💘2
Я работаю полностью удаленно. 🌟 Моя работа началась с того, что мне выдали ноут и доступы в dbeawer и Jupiter notebook. Cъездить в офис, забрать, настроить все дома – на это и ушел первый день. Чтобы удобнее было работать подключила клаву и монитор и погрузилась в непонятный пока еще мир. Мне сказали какие основные базы использует компания, но описаний к ним в компании не было. Я изучала их, пробовала разные выгрузки, в excel выстроила себе систему связей по ключам между базами. Конечно не все было понятно. Баз оочень много. Основных – где-то штук 15. Как формируется выручка, почему есть несколько колонок в базах с похожим смыслом, что значит user_id и чем он отличается от account_ id, почему иногда что-то пытаюсь выгрузить, но оно не выгружается (оказывается если ставить доп условия по id, то запрос срабатывает быстрее). Очень удобно, что Jupiterу нас bi, а значит общий и я вижу скрипты коллег. Есть стандартные скрипты для выгрузки тех или иных данных. Это очень помогает. 👍
👍29🔥1
Как выглядит реальный скрипт?
Это пример по расчету выручки по разным нишам (в компании могут быть свои срезы, критерии и т.п).
В Jupiter прописываем сначала SQL запрос, в query = """ запрос""", а потом питоном вытаскиваем данные и либо обрабатываем пандасом (как-то группируем строки, меняем колонки, объединяем таблицы по условию), либо выгружаем в Excel файл. Названия баз я конечно изменила, чтобы был понятен смысл.

query = """
select fv.string_val as name,
sum(case when p.currency = 'RUB' then p.amount when p.currency = 'RUR' then p.amount else (p.amount * cr.rate) end) as 'all_sum'
from База_платежей p
join База_счетов sa ON p.ACCOUNT_ID = sa.id
left join База_с_нишами fv ON sa.form_value_set_id=fv.form_value_set_id
left join База_курсов c on p.currency = c.code
left join База_курсов2 cr on c.id = cr.currency_id and substring(p.created_at,1,10) = substring(cr.created_at,1,10)
where p.id > 23000000
and p.deleted=0 and p.status='accepted'
and p.created_at >= '2022-06-01'
and p.created_at < '2022-07-01'
group by 1
"""
params = {}
df = mql.read_query( connection, query, params )
df.to_excel('Revenue.xls')
df.head()

Как видите, ничего сложного. SQL можно изучить самим, не только на курсах. Но об этом позже..
👍21🔥21💩1
Что вы делали позапрошлым летом?

Я вот тогда решила сменить профессию.
Работала много лет финансовым контролером в разных компаниях. Делала управленческую отчетность. И везде одно и тоже – вечные переработки. В дни отчетов нас финансистов из офиса на такси по ночам развозили по домам. Меняла компанию – и там то же самое. И ладно бы это мы плохо работали, не знали бы тонкостей Excel, тупили, но дело было абсолютно не в нашем отделе.

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

И так это все надоело. Мне нравилось придумывать как сделать быстрее хотя бы в тех рамках, в которых позволено было творить, я чувствовала, что могу даже не столько БОЛЬШЕ, сколько ПО- ДРУГОМУ.

Продолжение в комментариях ->
👏21👍1🔥1
Аналитики на вкус и цвет..

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

Итак, аналитики бывают:

Бизнес аналитики. Они должны понимать потребность бизнеса, проводить анализ всех внутренних процессов. Их задача - разобраться в потребностях заказчиков, фиксировать бизнес-требования и их решения по реализации в виде бизнес-процессов. Короче, у них много бумажной работы.

Системный аналитик отвечает за автоматизацию этих бизнес процессов. Он является фильтром и преобразователем между бизнесом и разработкой. Мало чего там бизнес аналитики с заказчиками напридумывают. Реально ли это все воплотить – вот в чем вопрос. Он выбирает какую систему ставить, какое программное обеспечение должно быть, какие приложения будут использоваться.
Продолжение в комментариях 👉
👍111🔥1
Мотивация 🎯

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

Вот чтобы вы ели, вас нужно мотивировать? А для сна вам нужна мотивация? А чтобы любить? Если у вас есть ЖЕЛАНИЕ, то вам не нужна мотивация! Просто ЖЕЛАНИЕ🌟, ХОТЕЛКА так сказать. Меняя одну работу на другую, нужно понимать ради чего ты это делаешь. Если только ради денег или престижа, или чего-то, что идет от головы, а не от сердца, то вот тут начинают требоваться “плюшки” и “морковки” и этим пользуются те, кто пишет такие мотивационные книги. Именно ОНИ зарабатывают на Вас, давая вам ложные цели и навязывают те стремления, которых у вас возможно и не было.

Продолжение 👉
👍202🔥2
Базовые понятия: трафик, лиды и конверсия.

Разберем сегодня эти понятия на рабочих примерах.
Трафик. Что же это такое? Это количество посетителей на сайте за определённый период времени. В sql можно подсчитать как count(distinct visitor_id)
Count – подсчет количества, distinct – убирает дубликаты. Как пример, у нас Иванов зашел два раза на сайт с большим промежутком времени, Петров зашел один раз, а потом и Сидоров раза три зашел, но в течение нескольких минут. У нас посчитается, что трафик равен (2+1+1) четырем. Потому что visitor_id (присвоенный номер при заходе на сайт) будет у Иванова разным, хоть он один и тот же человек, но из-за большого промежутка времени захода (допустим час) visitor_id будет уже другой присвоен.
У Петрова будет один заход и visitor_id будет какой-то один, а вот Иванов заходил три раза, но быстро выходил, а потом опять заходил и ему на сайте присвоится одинаковый номер.

Не берусь отвечать за все компании, но в нашей именно такой подход. Если у вас по-другому, то расскажите. Интересно будет сравнить методику.

А теперь разберем понятие лид.
Лид — это потенциальный клиент, который заинтересовался товаром или услугой и оставил свои контакты: оформил заявку, заказал звонок или указал email в форме обратной связи. В нашей компании это тот, кто зарегистрировался на сайте. То есть если Иванов решил зарегистрироваться, то ему присваивается определенный номер в специальной базе данных (user_id), не тот номер посетителя, а прям уже номер пользователя, так сказать.
сount (user_id) – подсчитает нам количество лидов, здесь уже не нужно убирать дубликаты, так как каждая строчка в этой базе – уникальный номер зарегистрировавшегося человека.

Конверсия трафика в лиды звучит устрашающе. На самом деле это просто кол-во лидов деленное на трафик. Как правило, указывается в %. Чем выше, тем лучше. Показатель показывает в % сколько клиентов не просто заходят на сайт, а регистрируются с целью использования/покупки и прочее. Если, допустим на сайт за какой-то период (например за неделю) зашли 20 000 человек, а зарегистрировались 1 200, то конверсия получится шесть процентов: (1 200/20 000)*100=6%
👍21🔥21
Мир аналитика данных pinned «Всем привет! Меня зовут Лера и я с недавнего времени – аналитик данных! От любого процесса нужно получать удовольствие. Особенно если этот процесс – ваша работа. Поэтому я сменила свою профессию. От работы, к которой не лежит душа, можно уйти, найти другую…»
Between преткновения

Вот, казалось бы, как можно накосячить с оператором between в SQL? Легко, ребята 😊

Да, оператор включает границы диапазона. На курсе это проходили. Да и сама я когда училась раньше, использовала его часто “для красоты”.

Допустим нужно мне ограничить дату выгрузки, и я ставлю условие
where date between '2022-07-01' and '2022-07-31'. Чего проще?
Понятно же, что выкачка будет с первого июля по 31 июля включительно, то есть за целый месяц.
А вот и не всегда! Вернее конечно всегда, но с нюансами.
Если у вас дата в базе идет с компонентом времени, то есть вот так: 01.07.2022 17:40:03, то between хихикает над вами и не загружает последний день, так как считает, что вы ввели '2022-07-31 00:00:00, а нужно было тогда вписывать '2022-07-31 23:59:59'
Короче я теперь всегда и везде использую простое сравнение.
where date >= '2022-07-01' and date < '2022-08-01'
👍31👏32🔥2
Живой кодинг

Однажды у меня было собеседование с живым кодингом. Даже не буду скрывать компанию. Это был Сбербанк. Они искали аналитика данных со знанием Питона, SQL и опытом проведения A/B тестов в команду для улучшения их банковских приложений.

У меня не было опыта A/B тестов, но я все равно откликнулась ради опыта. Вообще, хочу порекомендовать проходить как можно больше собеседований и относиться к ним как к квесту. Чем больше в вашей копилке прохождений, тем больше опыта и больше вопросов, ответы на которые вы будете потом гуглить, чтобы знать к следующей “битве”!

Итак, эйчар из Сбера предупредила, что это будет живой кодинг, я дала добро и назначили время.
Тестирование было на сайте https://codeinterview.io/
Мне сбросили ссылку, и я зашла.

Задания были следующие:

Создать датафрейм из данных, которые загнаны в словарь exam_data {} из кортежей []
df = pd.DataFrame(exam_data)

Выбрать записи, где число попыток = 3
df[df['attempts'] == 3]['score']

Продолжение 👉
👍242🔥2
Делала я как-то тестовое на аналитика для Skyeng. Хорошее тестовое, я на нем отлично потренировалась. Им отослала, потом с тим лидом пообщалась. Но как оказалось, им нужен был уровень senior и упор делался на поиск опытного продуктового аналитика.

Самое смешное, что я работала как раз в Skyeng в финансовом отделе и участвовала в карьерном треке. У меня было расписано, что я изучаю, что нужно подтянуть. Программу составляли вместе с нашим эйчаром. По факту я сама ее составила (как-нибудь скину потом), так как я понимала, что мне надо еще подтянуть и что изучить дополнительно.

Продолжение в комментах 👉
👍25🔥5
На днях из одного отдела поступил крик о помощи. И связан он был с Excel.

Файл весил 125 МБ и был очень тяжел для работы с ним. Меня, как специалиста по Excel (не зря же столько лет с Excel дружу 😜) попросили как-то его уменьшить. И тут настал мой звездный час! 🌟 Я, ничего не удаляя, облегчила файл вдвое до 61 МБ.

Как мне это удалось:
1) Меню Данные -> значок Изменить связи. Выбираем там Разорвать связь. Все данные, что подтягиваются из других файлов сохранятся и превратятся в значения.
2) Сохранить файл в формате (Тип файла) не [книга Excel], выбрать [Двоичная книга Excel]

Еще можно в настройках Excel выбрать Меню ФайлПараметрыФормулы, Вычисления в книге вручную. Тогда пересчет формул осуществляться не будет пока вы его вручную не сделаете и это позволяет работать с файлом, который не будет надолго зависать и тормозить. Но эта настройка индивидуальна для каждого пользователя. Ее нельзя передать в файле.

Подумала, что Вам эта инфа может тоже пригодится.
👍52🔥194
Всех с пятницей! 🌟

Поговорим сегодня о красоте, о красоте Сатурна 🪐. Ой, то есть Юпитера.
Это не про планету, а про среду разработки.

В Jupyter Notebook можно вставить картинку. Я обычно стандартным приложением "Ножницы" вырезаю часть картинки, обычно это задание, которое присылают, правой клавишей мыши выбираю копировать (в буфер обмена). Потом в Jupyter меняю тип строки на markdown и вставляю Ctrl+V.
Однако, если выкачать потом файл ноутбука (кому-то отправить захотите), то лучше картинку убрать, а то там вместо нее человек увидит длиннющий код.

Ну и про сами маркдауны напомню. Чтобы выделить заголовки пририсовываем решетки ##
и жмем выполнение ячейки. Я обычно Ctrl + Enter жму.

# Заголовок большой
## Заголовок поменьше
### Заголовок еще меньше

Можно даже с помощью html кода оформлять, но я не пробовала.
Если у Вас есть какой-то красивый бьютихак 💡оформления, то делитесь способами!
👍161🔥1
Excel vs Google таблицы 🎯

Насколько я люблю Excel, настолько мне не по вкусу работа в Google таблицах. Хотя в них есть и плюсы. Но обо всем поподробнее.
На текущем месте, учитывая, что многие работают удаленно, все пользуются Google таблицами. Общей сети нет (что для меня странно, но сейчас не об этом).
В любимом Excel были горячие клавиши, что ускоряло работу. В нем писать формулы, строить сводные таблицы – одно удовольствие ❤️, а теперь приходится узнавать, где спрятана та или иная функция. Как вариант, можно выкачать файл (Файл – Скачать – Microsoft Excel XLSX) себе на диск (у меня пока есть оплаченный Excel) и уже в скаченном варианте поработать c ним. Я так и делаю, когда мне попадается большой файл и в нем много всего. Потом гружу его обратно (Файл - Импортировать). Каждый раз так играться нет смысла, поэтому будем изучать Гугл таблицы.

Вот тут можете посмотреть, как они выглядят. И не только посмотреть. Я создала этот файл для тренировки. Доступ всем открыла на редактирование. Прода 👉
👍121🔥1
Метод format 💡

По понедельникам я гружу много разных данных за предыдущую неделю. Это и трафик, и количество лидов, и выручка в разных нишах, и тип продаж (новому клиенту продали или повторному), и количество писем отправленных, и прочее, прочее.
Каждый раз прописывать в SQL даты прошлой недели мне надоело.
Вот так это выглядело:
WHERE created_date >= '2022-08-29' and created_date < '2022-09-05'

Я добавила в скрипт метод format. Ведь он не только меняет форматирование при выводе, но еще и принимает аргументы. Теперь в начале большого скрипта у меня прописаны даты:

start_date_2022 = '2022-08-29'
end_date_2022 = '2022-09-05'

А в самих запросах (тут пример расчета у нас трафика) я уже везде одинаково в WHERE обращаюсь к параметрам.
Это выглядит так:
query = """
select
uniq(visitor_id) visitor_count,
uniqIf(visitor_id, has_registered) register_count
from stat.visit
where started_date >= '{params[0]}' and started_date < '{params[1]}'
""".format(params=[start_date_2022, end_date_2022])

params[0] – это start_date_2022,
params[1] – соответственно end_date_2022.

Короче говоря, оптимизируемся, друзья!
👍233🔥2
З..2..1..ПУСК..ОТКЛЮЧЕНО 💻

На работе обсуждали кто как справляется с попыткой обновления Windows.
Как оказалось, один коллега вообще не выключает ноутбук. Я, прям, пожалела его “железо”. У меня какая-то врожденная установка, что техника тоже должна отдыхать.
Другая коллега нажимает отложить обновление.

А я поискала и нашла такой способ, которым конечно со всеми на работе поделилась:

Заходим в Пуск, жмем букву с, появляются Службы.
Открываем эти Службы и внизу находим Центр обновления Window (на картинке вверху). Жмем правой клавишей на нем и выбираем Свойства.

Выбираем тип запуска: Отключена. И внизу в состоянии я нажала Остановить. После этого выключила ноут и хоть он оранжевым огоньком подсвечивал обновление, но сам процесс не запустился уже. 👌
👍41🔥1
HAVING Это Present Continuous в английском, но речь тут не об этом. 😜
Это команда в SQL, которая фильтрует результат группировки. Разберем на рабочем примере.

Казалось бы, у нас же есть уже условие WHERE, куда мы вписываем условия.
Но если нам нужно вывести клиентов с месячным оборотом больше одного миллиона, то WHERE нам тут не поможет. А вот HAVING спасет ситуацию.

Найдем суммы выручки за месяц по каждому клиенту, а потом HAVING отберет тех, у кого сумма avg_amount получилась больше миллиона

select p.ACCOUNT_ID,
sum(case when p.currency in ('RUB','RUR') then p.amount else (p.amount * cr.rate) end)/(MONTH(CURRENT_DATE) - 1) as avg_amount,
from sales.payment p -- вытаскиваем из базы платежей
left join sales.currency c - - присоединяем базу с валютами
on p.currency = c.code - - по совпадающему ключу
left join sales.currency_rate cr - - присоединяем базу с курсами валют
on
c.id = cr.currency_id - - по совпадающему ключу
where p.created_at <= CURRENT_DATE group by 1 - - группировка по номеру клиента
having avg_amount > 1000000

Тут, кстати, видно как работает оператор case 👌 когда нужно посчитать выручку в рублях
👍12🔥21
SQL + Pandas = ❤️

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

1) Основная платежная система (ПС) – Клаудпеймент.
2) % комиссии выше 3.5%
3) Оборот за август больше 1 млн
4) Минус тех, у кого есть заявка на определенную платежную систему

Сначала я выгрузила SQL запросом:
- оборот за август. Получила таблицу df_aug с номером аккаунта клиента 'account_id', типом ПС - 'type', суммой – 'amount' и комиссией – ' сommission'.
- оборот с августа до текущей даты - df_from_aug, чтобы найти основную платежную систему – то есть ту, через которую прошли максимальные платежи c августа.
df_big = df_from_aug.groupby(by='account_id').last().reset_index()

Потом с помощью пандаса делаем:
Отсортируем базу по тем, у кого основной ПС - cloud_payments.
df_cloud= df_big[df_big['type'] == 'cloud_payments']
Найдем аккаунты, у кот выручка за август больше 1 млн. Берем наш df_aug и суммируем все суммы по каждому аккаунту
df_grouped = df_aug.groupby(['account_id']).agg({'amount':'sum'}).reset_index()
df_more_1mln = df_grouped[df_grouped['amount'] > 1000000]

Создаем кортеж из аккаунтов, которые удовлетворяют условию больше ляма:
account_lst_more_1mln = tuple(df_more_1mln['account_id'])
Теперь из аккаунтов, у которых основная ПС=cloud_payments отбираем те, у которых выручка за август была БОЛЬШЕ 1 млн. Воспользуемся isin и нашим кортежем (можно и списком, но кортеж вроде быстрей срабатывает)

df_cloud_more_1mln = df_cloud[df_cloud['account_id'].isin(account_lst_more_1mln)]

Добавим расчет rate %.
df_cloud_more_1mln['rate'] = df_cloud_more_1mln['сommission']/df_cloud_more_1mln['amount']

Отфильтруем те, у кот rate > 3.5%
df_cloud_more_1mln_rate = df_cloud_more_1mln[df_cloud_more_1mln['rate'] > 0.035]

Потом SQL запросом вытаскиваю аккаунты подключённые к внутренней системе нашей компании
query = """
select DISTINCT ACCOUNT_ID
from sales.checkout_request
"""
params = {}
gp_requests = mql.read_query( connection_gp, query, params )

Вот тут опять загоняем аккаунты в кортеж:
lst_gp_requests = tuple(gp_requests['ACCOUNT_ID'])
Минусуем тех, кто содержится в этом кортеже с помощью isin и значка ~ (кроме)
df_cloud_more_1mln = df_cloud_more_1mln_rate[~df_cloud_more_1mln_rate['account_id'].isin(lst_gp_requests)]

Создаем кортеж из оставшихся аккаунтов клиентов:
accounts_group = tuple((df_cloud_more_1mln['account_id'].drop_duplicates()))

Ну и в финале выгружаем SQL почты владельцев эти аккаунтов в csv формате.
Как-то так..
13👏10🔥1
Условное форматирование в Google таблицах.

Я обычно не люблю раскрашивать Excel таблички в цвета "вырви-глаз". Максимум, я красила светло-зеленым заголовки когда работала еще фин.контролером, и на этом все.

А вот теперь наш отдел продаж просил применить разноцветное условное форматирование к их данным. Я им формировала рейтинг менеджеров.

Так неудобно делать правило для каждой колонки отдельно, но я не нашла другого способа. 🙈

Итак, выделяем колонку. Формат -> Условное Форматирование. Выбираем “Градиент”. Щелкаем по нему и выбираем “От зеленого к красному через желтый” (нижний ряд, в середине). Можно и другие цвета выбрать, конечно. Настраиваем цвет для мин.значения, макс.значения и для точки середины. Любуемся своим творением и повторяем те же действия для другой колонки, судорожно вспоминая оттенок цвета выбранного для первой колонки 😂
Продолжение ->
🔥91
Найти беглеца! 😂

Формирую я себе спокойненько топ 150 клиентов по выручке в разрезе месяцев (df). У меня есть номер клиента, месяц выручки, еще несколько колонок с разной инфой, ну и сумма естественно.
Мне нужно перевернуть таблицу, чтобы месяцы превратились в столбцы, и на каждого клиента была бы одна строчка. В таком случае всегда используется pivot_table.
В индексы загоняю номер школы (account_id), первую дату оплаты (first_payed_product_at), а в колонки месяцы (columns=['month']). В значения (values) - чем будет заполнена таблица - суммы выручки 'all_sum'.

df2 = pd.DataFrame(df)
df_pivot1 = df2.pivot_table(index = ['account_id','first_payed_product_at'], columns=['month'], values = 'all_sum',aggfunc = 'sum',margins=True).reset_index().rename_axis(None, axis=1)

Смотрю я что получилось и вижу, что вместо 150 клиентов, у меня – 149! Куда делся один не понятно. Оказалось, что когда выгрузилась первоначальная таблица df, то в столбце first_payed_product_at по одному клиенту было пусто (данных не было), и pivot забил на такого клиента и не перевернул по нему данные, полностью его проигнорировав.

Выход из этого – проставить нули везде, где нет данных, тогда никто не будет потерян - fillna(0)
👍16🔥1