Мир аналитика данных
4.6K subscribers
139 photos
3 videos
114 links
Пишу о рабочих буднях аналитика. Тут много рабочего кода, прохождение собеседований и еще много всего полезного.
https://www.linkedin.com/in/valeriashuvaeva
Автор канала: @Valeria_Shuvaeva
Download Telegram
Yandex DataLens 💡

Вот какой дашборд получилось создать в DataLens. Переходите по ссылке и потыкайте в фильтры. Красотища ведь!

Оказывается Yandex создал свой BI инструмент для визуализации данных. И все - бесплатно. Можно подключиться к базам или просто залить csv файл. На том бесплатном курсе (выше пост) была дана инструкция как сделать такую красоту.

Мне понравилось! Если кто не успел записаться тогда, то вот тут инструкция как создать подключение к базе и как сконструировать дашборд.
👍28
Задания по Excel.

В каждом втором тестовом на аналитика есть задания по Excel. Так что тренируемся на чем можем. 💪
Сперва необходимо было построить сводную таблицу и создать условное форматирование. Если таблицу сделать не сложно, то вот с условным форматированием, как правило, все мало работают.
Я вот только на этой работе стала им пользоваться по просьбе отдела продаж для определенных отчетов.

Подскажу как я сделала форматирование тут. Сначала построим саму таблицу.

Задание по сводной таблице.
В файле с материалами занятия построить сводную таблицу, в которой отобразить статьи расходов по строкам, а регионы – по столбцам. В значениях нужны суммы расходов.

На картинке видно, что в строки мы поставили Статьи расходов, а в столбцы – Регионы. В значения перетащила суммы. Тут все просто.

Задание по условному форматированию.
Продолжение тут ->
🔥11👍41🥰1
🔥Дополнение к hh.ru

Смотрите какой сайт с вакансиями есть! Даже и не знала про него раньше. Тут подборки по странам, по позициям. Вот, что для младших аналитиков есть:

Младший аналитик / Отисифарм
https://careerspace.app/job/52601

Стажер бизнес-аналитик / ЭКОПСИ
https://careerspace.app/job/52641

Младший аналитик / ivi.ru
https://careerspace.app/job/52460

P.S. Не бойтесь отказов. Это нормально. Не упускайте возможность. Вдруг это ваше 🍀
16👏5👍2
Учебный курс «Анализ данных»
Если вам не хватает к резюме каких-то свежих "корочек", то вот, что нашлось на любимом Степике:

Регистрируйтесь на курс до 1 декабря 2022 года и получите удостоверение о повышении квалификации государственного образца от Тюменского Государственного Университета!
https://stepik.org/course/126333/syllabus
Им нужно прислать скан диплома о первом высшем или о среднем профессиональном образовании.
Ну и курс пройти конечно. Пишут в отзывах, что базовый, легкий. По сути ознакомительный.

Мне даже интересно с какой целью Тюменский Университет такую акцию запустил? Может хочет потом базу потенциальных клиентов на уже платный большой курс собрать. А может что-то еще..
👍14🔥1
🔥 Сводная таблица pivot_table().
Очень часто в работе используется эта функция из Pandas библиотеки. Она преобразовывает DataFrame в сводную таблицу. Хоть таблица и называется сводная, но она не сводит все ваши проблемы на “нет”. А вот задачи преобразования табличных данных решает на “ура”.

Разберемся как она работает на примере. Есть таблица с визитами на страницы. В ней есть дата захода на конкретную страницу, номер юзера, который зашел, сайт самой страницы и ее название.
| created_date | user | page | title
| 2022 – 11 – 01 | 3548329123|https://… | Как добавить счётчик Яндекс.Метрики на страницу
| 2022 – 11 – 02 | 3596921140|https://… | Новый редактор автовебинаров

💡 Задача – подсчитать кол-во заходов и кол-во уникальных юзеров (какое кол-во человек заходили на данную страницу)

df = df.pivot_table(
index = ['title','page'], # в строках будет сайт страницы и его название
columns = 'created_date' , # в колонках - дата захода (если дата не важна, то можно не прописывать)
values = 'user', # подсчитываем по юзерам
aggfunc=('count','nunique')) # как именно подсчитываем, тут считаем кол-во и уникальность.

В качестве aggfunc можно использовать в других задачах 'sum' если нужно подсчитать сумму, допустим выручки по клиентам.
В результате получим таблицу c такой структурой:
| title | page | count | nunique
| Как добавить ... |https://… | 22 | 17
| Новый редактор автовебинаров|https://… | 10 | 10
👍17
Сегодня вышел бесплатный курс по SQL у Карпова! Это офигеть событие в условиях, что качественное обучение, как правило платно. Еще и скачивать ничего не нужно.
Чему можно научиться:
- Составлять простые и продвинутые SQL-запросы к базам данных.
- Выгружать данные, анализировать их и визуализировать результаты.
- Проверять гипотезы и принимать решения на основе данных. (вот это очень хочу, практики в таком очень мало)
А на десерт будет раздел с продуктовыми задачами.

Там 60+ SQL-ЗАДАЧ! https://karpov.courses/simulator-sql
👍34🔥1910💘1
🍀 Как мне помогла теория вероятности.
Прислали мне тут вот такую задачку – отобрать всех клиентов, у которых нет заявок на определенный доп.функционал или тех, у кого заявку одобрили, но клиент пока отключил у себя эту опцию. И еще у них среднемесячная выручка с начала 2022 года должна быть больше 800 тыс. руб.
Сначала я нашла тех, у кого больше 800 тыс.руб. в мес. - df_more_800

А вот потом в мозгу у меня все смешалось – что с чем соединить? 😜 И тут я составила табличку вероятностного пространства всех возможных вариантов, чтобы наглядно понять, как вытащить данные.
Получилась вот такая таблица:
| Есть заявка| Одобрена | Клиент включил опцию у себя |
| Есть заявка| Одобрена | Клиент НЕ включил опцию у себя |
| Есть заявка| НЕ одобрена| - |
| НЕТ заявки | - | - |

Сначала ищу клиентов, кто вообще подал заявку.
query = f"""
select account_id
from sales.request
where account_id in {tuple(df_more_800['account_id'])}
"""
df_request = pd.read_sql(query, connection)

Потом я нашла аккаунты тех клиентов, кто не включил опцию:
query = f"""
select account_id
from sales.request
where account_id in {tuple(df_more_800['account_id'])}
and status = 1 -- одобренность заявки
and active = 0 -- клиент отключил у себя
"""
df_off = pd.read_sql(query, connection)
Исключим с помощью isin те школы, кот подавали заявку, чтобы оставить тех, кто НЕ ПОДАВАЛ ЗАЯВКУ . Вот этот знак (~) оставляет в df_more_800 все, кроме тех аккаунтов, что указаны в df_request

df_wo_application = df_more_800[~df_more_800['account_id'].isin(tuple(df_request['account_id']))]

А теперь объединим с помощью concat тех, кто не подавал заявку и тех, кто выключил у себя эту опцию. Это и будет финалочка! 👌
df_final = pd.concat([df_wo_application, df_off], ignore_index = True)
👍17
С наступающим! А кого-то уже с наступившим!🎄

Друзья, хочу пожелать, чтобы каждый в Новом Году получил заветный оффер, нашел направление, которое принесет радость, деньги и конечно удовлетворение!
Исполняйте мечты, будьте здоровы, полны энергии и верьте в свои силы! 🌟
А теперь моя маленькая история. Когда я получала отказы, то в какой-то момент, я решила не отсылать больше свое резюме, руки опускались, так как пробиться в IT очень трудно. Но я отчетливо помню, как в какой-то момент я задумалась, а какую работу я бы хотела получить, чтоб прям по сердцу. Все равно ведь есть та вакансия, которую мне предложит вселенная, которая будет именно моей. Я без уныния, с каким-то теплым чувством в душе мысленно представила условия вакансии, и чтобы я там делала, и не поверите, спустя небольшое количество времени именно такой оффер я и получила. Фантастика!
Продолжение -»
👍319👎1
Как ваш первый рабочий день? Я в запаре. Все отделы заказывают отчеты. Поэтому сегодня в блоге тема легкая. Мозг бережем. 😜

Когда я только создавала канал, я зарегистрировалась на https://tgstat.ru – это каталог Telegram – каналов и чатов и вот какую открытку я от них получила по итогу года. Вас уже так много! ❤️ Мне очень радостно, что мой труд идет кому-то на пользу в работе или учебе, а кого-то подпитывает вдохновеньем. 🎈
Давайте проведем небольшой опрос, чтобы лучше Вас узнать.
🔥17👍2
По результатам опроса у нас из 243 проголосовавших 143 человека используют в работе Excel и 100 человек – не используют. В любом случае он нужен, как правило, тем, кто будет устраиваться аналитиком и нужен тем, кто работает, но уже в качестве прокачки скиллов. Короче он нужен всегда! 😜😂
Поэтому иногда буду показывать какие-то эксельные хитрости. 👌

Иногда может потребоваться список всех файлов с какого-то вашего диска. Как их выгрузить в Excel? Подруга подсказала способ. Сейчас кратко его вам опишу. На картинке для удобства все видно.
Вбиваем в ячейку путь откуда смотрим файлы: C:\Пример\*.*
Потом идем в Формулы-> Диспетчер Имен (Ctrl+F3). Жмем Создать. Задаем имя. Я так и назвала “Файл”.
В Диапазоне прописываем =ФАЙЛЫ(Лист1!$A$1) - ссылка на ячейку, где путь прописан. Сохраняем, закрываем. В столбце в Excel пишем 1, 2 и т.д. Можно зажать ctrl и протянуть 1, автоматически получим столбец от 1 до сколько у вас примерно файлов.
Продолжение ->
👍21
Отвал клиентов

У меня тут на днях попросили сделать статистику по отвалу клиентов по месяцам. Причем в строках должны быть месяцы первой покупки тарифа. Допустим, купили 766 компаний первый тариф в январе 2022 года. А через месяц из них 149 отвалились, значит 149 стоит в строке “2022-01” и в колонке “отвал через 1 месяц”.
Клиент сначала покупает тариф, потом может его менять. Тариф действует определенный период времени. Есть его первая дата покупки. Есть дата, до которой он действует. Если срок истек, значит клиент считается не актуальным, выбывшим. И вот какой алгоритм я придумала.
Тут видно лучше https://telegra.ph/Statistika-po-klientam-01-27

Я ищу sql запросом (датафрейм df_finish), все оплаты первых тарифов с января 2022 года. Получаю таблицу.
Продолжение ->
👍28👏3
Хочется красиво..
Задача была следующая – вытащить три топ клиента за год в каждой нише. Сначала – sql запросом (с сортировкой order by 3 desc по уменьшению) сформировала выгрузку всех клиентов с оборотом и с указанием ниши. Получилась такая табличка (df):
номер клиента | ниша | сумма
А вот потом задумалась, а как мне взять топ три клиента из каждой ниши. Просто head мне же даст первые три школы из всех, они могут быть из одной ниши. Не подойдет.
Я сделала быстро и надежно
df1 = df[df['ниша'] == 'инфобизнес'].head(3)
df2 = df[df['ниша'] == 'астрология'].head(3)
И так по каждой нише, а потом concat просто их все соединила.

Позже "потыкавшись", поняла, что все-таки groupby срабатывает и даже справляется быстрее. Особенно когда много категорий, то задолбаешься их соединять.
df.groupby('ниша').head(3) выдает трех клиентов в каждой нише в порядке убывания сумм по клиенту. На картинке слева.
А еще крутой способ потом обнаружила с помощью lambda и nlargest:
Продолжение->
👍223🔥2
Для бизнес аналитиков канал подъехал, берите на пользу!

Канал с материалами про процессы, проекты и управление.
Статьи, книги, блоги, стандарты, конференции, эксперты и практические наработки.
На канале есть база знаний, которая формировалась около 3-х лет о процессах, проектах, изменениях и управлении:
Канал: https://t.iss.one/timethod
База знаний (карта): https://miro.com/app/board/uXjVPMeMjGI=/
Владелец канала: https://t.iss.one/timethod1
Развиваю его потому, что в какое-то время мне надоело то, что у нас происходит в стране с процессным управлением и культурой руководства.
Цель канала - распространять знания, инструменты, подходы, технологии области процессного управления для стабильного, прибыльного, сконцентрированного развития организаций нашей страны. Бесплатно. Доступно. Качественно. Без надувания экспертных щёк)

Приходите, всем будем очень рады!
👍9🔥3
Отвал клиентов сиквел

Помните задачку по отвалу клиентов? https://t.iss.one/analysts_world/51
Так вот теперь есть продолжение к той задаче. На этот раз нужно собрать ту же статистику, но по отвалу клиентов, админы которых входят в несколько определенных групп.
Каждый свод код оставляйте с комментариями, чтобы потом вспомнить, что вы делали и если нужно накрутить на него еще дополнительный скрипт 😜

Сначала мы опять смотрим клиентов, кто покупал тарифы. Опять ищем sql запросом (датафрейм df_finish), все оплаты тарифов с января 2022 года.

Потом находим кто у них является админами df_admins. Ищем админов, которые входят в интересующие нас группы df_in_groups и мерджим с df_admins.
df_merge1 = pd.merge(df_admins,df_in_groups, on = ['user_id'], how = 'left').fillna(0)

Получаем такую табличку. В in_group будет 0 или 1, то есть админ входит в группу или нет
user_id | account_id | in_group

Теперь можем составить список аккаунтов, у которых кто-то из админов в группах.
accounts_list_groups = tuple(set(df_merge1[df_merge1['in_group'] == 1]['account_id']))

Оставляем клиентов из df_finish, которые входят в этот список с помощью isin
df_finish_in_groups = df_finish[df_finish['account_id'].isin(accounts_list_groups)]

Есть еще способ c query. К списку приписываем @ и тогда все срабатывает также
df_finish_in_groups=df_finish.query('account_id in
@accounts_list_groups')

А потом уже делаем все по клиентам как в прошлый раз, группируем и пр. 🍀
df_part1_in_group = df_finish_in_groups.groupby(['month'],as_index = False).agg({"account_id":"count"})
👍4🔥1
🎯 Еще один канал для всех кто увлекается аналитикой данных, data science, бизнес-анализом.
Привет!

Готовлюсь к запуску 3-го потока курса "Бизнес-анализ в IT"

Старт обучения: 21 февраля

На курсы вы сможете:
получить теорию и практику по сбору требований для разработки ПО
научиться детализировать требования исходя из их типа (бизнес, пользовательские, функциональные, нефункциональные)
познакомиться с тонкостями работы по Agile (Scrum, Kanban) и научиться работать с системами таск-трекинга и wiki для оформления требований
получить готовые и отработанные шаблоны для оформления документации
закрепить все полученные знания при решении бизнес-кейса по разработке системы и сбора требований

Больше информации о курсе, формате обучения, программы уроков вы можете найти на сайте https://datastudy.ru/2

P.S. На сайте указаны неправильные сроки старта обучения, до правок еще не добрался)))

По всем вопросам можете писать мне лично. Либо заполните форму предзаписи, я вам сам напишу 😉

Заполнить форму
3
Вопросы с собеседований по SQL

📍 В чем разница между сount(*) и count(колонка)?
count(*) считает все строки, в т.ч. с NULLs, а count(колонка) нет.
Как пример, привела скрины dbeawer из базы. Есть колонка first_payed_product_at с пропусками. В варианте count(*) считается все, а в варианте count(first_payed_product_at) только заполненные строки (820 значений).

📍 В чем разница между UNION и UNION ALL?
Основное различие между UNION и UNION ALL заключается в том, что операция UNION удаляет дублированные строки из результирующего набора, а UNION ALL не удаляет дубликаты.

📍 Что такое OVER()? Это предложение (clause) , которое превращает агрегатные функции в оконные.

📍 Перечислите основные команды SQL. Просто перечисляете Select, From, Where, Group by, Having, Order by, если еще и оконки назовете, то вообще класс!

📍 Задачка. ->
🔥24👍71
Фантастический сumsum() ⭐️

Если нужно посчитать кол-во дней от момента регистрации клиента до первых 100 тыс. за месяц, то можно сделать это через волшебную, фантастическую функцию сumsum. 🐍
SQL выгрузкой вытаскиваем данные о номере клиента, дате его регистрации, дате оплаты, ну и сумму его выручки конечно. Отсортировано по order by account_id, payment_date. То есть сверху будут самые ранние даты выручки. Получаем вот такой df с колонками:
|account_id) | account_reg_date |payment_date|amount|

✏️ Группируем по аккаунту, создаем новую колонку с кумулятивной суммой, то есть которая накапливается (см.пример на скрине)
df['cumsum_amount'] = df.groupby(['account_id '])['amount'].cumsum()

✏️ Потом мы оставляем только те строки, где накопленная выручка больше или равна ста тысяч
df_100k = df[df.cumsum_amount >= 100000]
Продолжение ->
👍10🔥3😍1
Функция transform() в Python 🐍

👍 Подглядела эту функцию у коллеги. Не влюбиться в функцию просто не возможно! Она такая крутая! Короче, это метод, который применяет функцию к каждой группе данных и возвращает результат в том же порядке, что и исходные данные. Это очень удобный способ изменения исходных данных.

✏️ Синтаксис:
DataFrame.groupby('column_name').transform(function_name)

Создадим dataframe
data =
{'Name': ['Петров', 'Удалова', 'Ковалев', 'Сидоров', 'Ефремов', 'Титова'],
'Department': ['Sales', 'It', 'It', 'Sales', 'Other', 'Other'],
'Salary': [50000, 57000, 62000, 45000, 59000, 70000]}
df = pd.DataFrame(data)

Создаем новый столбец '%' – процент з/пл сотрудника к общей з/пл отдела. А почему бы и нет, что называется.
df['%'] =
df.groupby('Department')['Salary'].transform(lambda x: x/x.sum())
Этот код создаст новый столбец, который посчитает % зарплаты каждого работника к общей з/пл отдела. Функция transform() применяется к столбцу Salary каждой группы, сгруппированной по полю Department.

А еще можно сделать вот что
df['min'] =
df.groupby('Department')['Salary'].transform('min')
И напротив каждой строки будет указана минимальная сумма з/пл в отделе. Также можно посчитать максимальную з/пл, среднюю и общую сумму в отделе (max, mean и sum).

P.s. Хотите такого мультяшного персонажа? Заливаете свое фото и получаете через минуту 🔝
https://imagetocartoon.com Можете в комменты кидать своих персов, чтобы веселее было 🤩
Please open Telegram to view this post
VIEW IN TELEGRAM
👍20🔥31
А что, так можно было?

Я зарегистрировалась в LinkedIn еще в 2013 году, но ничего о себе не заполняла и вскоре забросила. Мне всегда hh помогал с поиском работы.
Но недавно я решила его реанимировать. Я думала, что там только для тех, кто хочет уехать зарубеж, а я вроде как не планирую. У меня тут семья, родные. Но в последнее время стала замечать, что очень много вакансий с телеграмм каналов и с geekjob.ru ссылаются на Linkedin. И там конкретный человек (HR или тимлид) описывает вакансию и кого именно они ищут. У нас есть возможность пообщаться напрямую с тимлидом даже без эйчар! И эти компании русские! Там их полно, если не все.
А еще очень важно создавать свою сеть контактов или модное сейчас слово networking. Ведь человек после общения с вами может порекомендовать вас в компанию. Чем больше у вас контактов, тем больше людей сможет с вами связаться.

VPN я не ставила, а вот тор-браузер скачала (firefox) и захожу через него.
Еще есть вот такой вариант - через расширение:
https://chrome.google.com/webstore/detail/%D0%B4%D0%BE%D1%81%D1%82%D1%83%D0%BF-%D0%BA-linkedin/lfpfgkjmoclpggokhdacgidpeoedmhjh

Оставляйте в комментариях ссылки на свой linkedin! Давайте создадим большое полезное сообщество!

Вот мой Linkedin

P.S. картинку сгенерировала в midjourney (если нужно, то поделюсь как получить безграничное кол-во попыток)
🥰10👍87