17 заметок с тегом

bi

Обзор дашборда в Superset

Время чтения текста – 2 минуты

В сегодняшней статье в рамках большого обзора BI-систем мы вновь посмотрим на обновленный и улучшенный Apache Superset — open-source инструмент с множеством опций, которые позволяют пользователям с любым опытом изучать и визуализировать данные, от простых линейных графиков до высокодетализированных геопространственных диаграмм (ух!).

В видео обзоре мы разберем интерфейс этого BI-инструмента, конфигурацию, настроим отчеты и визуализацию (с дополнительными примерами), поговорим о фишках и сложностях Apache Superset, и построим итоговый дашборд.
Кстати, первую версию дашборда мы сделали еще в прошлом году, но с тех пор вышло много апдейтов и мы построили новый. Так как мы уже показывали вам дашборд в Superset, в видео мы сравним предыдущую версию с новой и обсудим различия.

Все аналитики команды Valiotti Analytics оценили дашборд в Superset. В итоге, мы получили следующие средние оценки (1 — худшая оценка, 10 — лучшая):
Отвечает ли заданным вопросам — 8,1
Порог входа в инструмент — 5,8
Функциональность инструмента — 7,7
Удобство пользования — 8,1
Соответствие результата макету — 8,9
Визуальная составляющая — 7,3

Итог: дашборд получает 7,7 баллов из 10. Посмотрите на финальный результат и тоже оцените его!

Автор дашборда, член команды Valiotti Analytics — Егор Сатюков

Обзор дашборда в Metabase

Время чтения текста – 2 минуты

В новом обзоре BI-систем мы посмотрим на Metabase — open-source инструмент для бизнес-аналитики, в котором можно писать запросы к данным нескольких видов и визуализировать результаты на дашбордах. Ещё Metabase может сам описать ваш датасорс и построить множество разных графиков, а ещё инструмент позволяет создавать «пульсы» благодаря встроенной системе оповещений, которые будет отправлять вам в Slack или на почту уведомления об изменениях в данных.

В видео говорим про интерфейс BI-инструмента, про виды запросов и визуализаций в Metabase, про подключение датасорсов, про реализацию переменных и фильтров, про сводные таблицы (сделаны очень грамотно!), вёрстку дашборда в системе и публикацию в сети.

Внутри команды мы оценили дашборд в Metabase и получили следующие средние оценки (1 — худшая оценка, 10 — лучшая):
Отвечает ли заданным вопросам — 8,6
Порог входа в инструмент — 6,0
Функциональность инструмента — 7,2
Удобство пользования — 7,4
Соответствие результата макету — 7,0
Визуальная составляющая — 6,6

Итог: дашборд получает 7,1 баллов из 10. Посмотрите на полученный результат.

Автор дашборда, член команды Valiotti Analytics — Мария Авдеева

Обзор дашборда Yandex DataLens

Время чтения текста – 2 минуты

Два года назад Яндекс выпустил собственный инструмент для визуализации данных — Yandex DataLens, работающий на базе Yandex Cloud. В блоге уже выходил обзор инструмента — но тогда сервис был на стадии Preview, и за два года функционал инструмента расширили. Сервис тарифицируемый и без привязки платёжного аккаунта поработать в нём не получится, но помимо платного тарифа есть и бесплатный.

Подробнее о тарифах Yandex DataLens можно почитать в документации

В сегодняшнем обзоре BI-систем мы посмотрим, как зарегистрировать аккаунт в DataLens, подключить датасет и создать дополнительные таблицы на основе SQL-запросов, построить визуализации, связать их с фильтрами и добавить на дашборд согласно макету, а затем опубликовать результат.

Внутри команды мы оценили дашборд в DataLens и получили следующие средние оценки (1 — худшая оценка, 10 — лучшая):

Отвечает ли заданным вопросам — 7,0
Порог входа в инструмент — 8,0
Функциональность инструмента — 7,0
Удобство пользования — 8,3
Соответствие результата макету — 7,5
Визуальная составляющая — 8,5
Итог: дашборд получает 8 баллов из 10. Посмотрите на полученный результат.

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

Время чтения текста – 15 минут

Этот материал — перевод статьи «How to Make Dashboards Using a Product Thinking Approach»

Ни для кого не секрет, что передача результатов исследований другим людям — важнейшая часть науки о данных. Один из инструментов, который мы часто используем в Shopify — дашборды. Этот пост — пошаговое руководство по созданию дашбордов, ориентированных на пользователя и результат.

Люди используют слово «дашборд» для обозначения разных вещей. В этом посте я сужаю своё определение до автоматически обновляемого набора визуализаций данных и бизнес-показателей.

К сожалению, если вы несерьёзно относитесь к процессу создания дашборда, получится так, что вы вложили много усилий в создание продукта, который не имеет реальной ценности. Дашборд, который никто не использует полезен примерно так же, как барахло из магазинов на диване. Итак, как вы можете убедиться том, что ваш дашборд удовлетворяет запросам пользователя?

Ключевой момент — продуктовое мышление. Это неотъемлемая часть отдела Data Science в Shopify. Как мы создаём продукты, думая о наших продавцах, так и специалисты по обработке данных создают дашборды, ориентированные на потребности аудитории.

Нужен ли мне дашборд?

Прежде чем мы погрузимся в создание дашбордов, первое, о чём вы должны спросить себя — подходит ли этот инструмент вам. Есть множество других способов передачи данных, включая длинные отчёты и презентации. Создание и обслуживание дашборда может занять много времени, и вам ни к чему тратить силы без необходимости.

Вопросы, которые следует задать себе:

  1. Будут ли данные дашборда обновляться динамически?
  2. Хотите ли вы, чтобы исследование было интерактивным?
  3. Ваша цель заключается в том, чтобы мониторить что-то и отвечать на вопросы, связанные с данными?
  4. Нужно ли пользователю возвращаться к этим данным ввиду их ежедневного изменения?

Если на большинство вопросов вы ответили «Да», то дашборд — хороший выбор для решения вашей проблемы.

Иначе, если ваша цель — призыв пользователя к действию, дашборд — не лучший выбор. Дашборды удобны, потому что они автоматически представляют обновляемые метрики и визуализации. Если вы хотите рассказать историю, чтобы повлиять на аудиторию, вам лучше поработать с историческими статическими данными в отчёте или презентации.

1. Поймите проблему и аудиторию

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

Аудитория Цель
Команда обработки данных Решить, нужно ли отправлять экспериментальную фичу всем нашим продавцам
Руководство Мониторить влияние COVID-19 на продавцов в розничных магазинах
Продуктовая команда Обнаружить изменения в поведении пользователей после внедрения новой фичи

Может получиться так, что для одной аудитории у вас больше одной цели. Это означает, что вам нужно больше одного дашборда.

Четко определив свою аудиторию и причину создания дашборда, вам нужно выяснить, какие показатели лучше всего удовлетворяют потребностям группы. В большинстве случаев это неочевидно и может превратиться в долгую беседу с пользователем, и это нормально! Время, потраченное на данном этапе, принесёт плоды позже.

Хорошие показатели — те, которые тщательно отобраны с учётом поставленных целей. Если ваша цель — отслеживание аномалий, вам необходимо включить широкий спектр метрик и визуализаций с заданными пороговыми значениями. Если вы хотите, чтобы дашборд показывал, насколько успешен ваш продукт, вам нужно подумать о небольшом количестве KPI, которые являются показателями реальной ценности.

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

Пример макета дашборда. Визуальное представление способствует быстрому согласованию

Теперь, когда у вас есть план, вы готовы приступить к созданию дашборда.

2. Помните о своих пользователях

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

Когда дело доходит до точности и эффективности, вам, вероятно, придётся написать код или запросы для создания показателей или визуализации на основе ваших данных. В Shopify при написании кода мы всегда следуем лучшим методам работы с программным обеспечением.

  1. Придерживайтесь единых стандартов оформления, чтобы сделать запросы более читабельными
  2. Оптимизируйте запросы, чтобы сделать их максимально эффективными
  3. Пользуйтесь системами контроля версий, чтобы отслеживать изменение кода в процессе разработки
  4. Получите обратную связь по дашборду для обмена контекстом

Способ представления данных напрямую влияет на понимание данных пользователем.

Используйте макет, чтобы сосредоточить внимание пользователей

Как и на первой полосе газеты, вашим пользователям нужно узнать самую важную информацию в первые несколько секунд. Один из способов сделать это — структурировать дашборд в виде перевернутой пирамиды, у которой вверху самые «сочные» заголовки, в середине — важные детали, а внизу — общая, но не менее важная справочная информация.

Перевернутая пирамида — пример организации иерархии информации, которую вы отражаете на дашборде

Не забудьте использовать исходные цели из первого этапа при формировании иерархии.

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

Визуальная иерархия, группировка разделов и свободное пространство делают дашборд удобным для чтения

Не бойтесь добавлять свободное пространство — оно даёт пользователям передышку улучшает понимание информации.

Оставляйте только целевой контент

Визуализации, которые вы выбираете для дашборда, могут сделать его лучше или навредить. По этому поводу существует множество ресурсов, поэтому я не буду вдаваться в подробности, но стоит ознакомиться с теорией и поэкспериментировать с тем, что лучше всего подходит для вашей ситуации.

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

Убедитесь, что ваш дашборд включает бизнес-контекст и контекст данных

Обеспечьте достаточный бизнес-контекст, чтобы кто-то, открывший ваш дашборд, мог сразу получить ответы на такие вопросы:

  1. Почему существует этот дашборд
  2. Для кого он создан
  3. Когда он был построен и когда он перестанет быть актуальным
  4. Какие функции он реализует

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

Статистика справа лучше, чем слева, потому что преподносит контекст.

Контекст можно предоставить и другим путём — например, наладив сегментацию или фильтрацию данных. Различные сегменты могут давать результаты с совершенно противоположными значениями.

Перед публикацией подумайте об актуальности данных

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

3. Поддержка

Предположим, вы приложили много усилий, чтобы понять проблему и аудиторию, и создали лучший дашборд на свете. Однако важно помнить, что дашборд — это прежде всего инструмент, и важно убедиться, что он используется и приносит пользу.

«Продавайте» дашборд

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

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

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

Используйте и улучшайте

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

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

Если дашборд не дал желаемого результата, выясните, что пошло не так. Есть ли что-то, что вы могли бы изменить, чтобы сделать его полезнее? Используйте это исследование, чтобы улучшить следующий дашборд.

Поддерживайте

Наконец, как и в случае с любой информационной системой, без надлежащего обслуживания дашборд придёт в негодность. Назначьте специалиста по данным или группу специалистов, которые ответят на вопросы или исправят возникшие проблемы.

Ключевые выводы

Посмотрите и другие наши переводы — «10 правил для совершенного дизайна дашбордов» и «Полное руководство по созданию таблиц»

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

  1. Понять проблему и аудиторию, спроектировать дашборд, который хорошо справляется с одной задачей для чёткого круга пользователей
  2. Учесть интересы пользователей, чтобы он был точным и простым для понимания
  3. Поддерживать полученный результат, продвигая и улучшая его в дальнейшем

Выполнив эти три шага, вы создадите дашборд, который будет в центре внимания вашей аудитории.

Radial pie в Tableau

Время чтения текста – 11 минут

Как-то раз на просторах YouTube мы нашли вот такое видео с гайдом по Radial Pie в Tableau:

Нам очень понравилась реализация — диаграмма сильно напоминает кольца активности Apple Watch. Но, к сожалению, по задумке графика кольца останавливаются на 270 градусах. Показываем, как сделать максимально приближенную к кольцам активности реализацию.

Кольца активности в Apple Watch

Подготовка данных

Данная визуализация является весьма спорной в контексте бизнес-дашбордов

Загрузим датасорс в Tableau. Наши кольца — это круги из 360 точек, и для каждой нам нужно своё наблюдение. Это легко реализовать при помощи Bins: сначала перетянем файл под поле с этим же файлом, чтобы объединить датасет с самим собой. В результате датасет должен «удвоиться» и появится новое поле с наименованием файла.

Создадим новое вычисляемое поле и назовем его Path.

Затем перейдём на график. Кликнем правой кнопкой мыши по Path из раздела Measures и создадим из этого поля Bins. Size of bins установим на единицу:

Создадим новое вычисляемое поле Index:

И поле Percentage, которое отобразит, насколько выполнены цели. Если достижение по цели будет больше самой цели, мы отобразим 1, чтобы не появлялись значения больше единицы.

Теперь создаём следующие меры:

wc_start — мера начальной координаты каждого кольца. Она считается по полю Order, соответственно, у Stand Order равен 1, а значит начинаться это кольцо будет раньше всех, в точке 1 по OY. У кольца Exercise Order равен 2, оно будет в середине. У Move Order равен 3 — это кольцо будет внешним и начнётся в точке 3.

percentage_label — мера для Label, в которой записано процентное отношение достижения по цели к самой цели:

Y2 — вспомогательная мера для начальных точек колец:

Наконец, финальные поля X и Y. Если значение меньше 360, мы описываем при помощи синуса внутреннюю линию кольца, если больше — то внешнюю линию, иначе — острие, на котором кончается кольцо. Формула вычисления Y аналогична X, но считаем не синус, а косинус.

Визуализация

Измерение Path (bin) перетянем в поле Detail, X — в Columns, а Y — в Rows. X и Y должны вычисляться при помощи Path:

Тип графика сменим с Automatic на Polygon и перетянем меру Index в поле Path. Поле Description перетягиваем в Color.

Меру Y2 тоже перетягиваем в Rows и устанавливаем для оси Dual Axis. Из All в Marks необходимо удалить Measure Names. Правой кнопкой мыши кликаем на ОY и синхронизируем оси:

Для Y2 устанавливаем тип Circle и корректируем размер:

Работа над оформлением

В Tableau есть возможность самому подобрать нужную гамму. Для жмём на Colors, затем на Edit colors, выбираем нужное поле и указываем цвет. Для гаммы колец из WatchOS мы подобрали такие цвета:

  1. Красный: rgb(229, 54, 83)
  2. Зелёный: rgb(186, 252, 79)
  3. Синий: rgb(117, 229, 228)

В Label Y2 перетягиваем поля Description и percentage_label. Устанавливаем выравнивание, Description выделяем жирным цветом, ставим галочку в Options у поля Allow labels to overlap other marks, чтобы Label был виден:

Скрываем все линии, границы и индикатор, заливаем фон чёрным цветом. Результат — такая диаграмма:

Книга и таблица из примера доступны в нашем репозитории на GitHub.

Обзор дашборда в Excel

Время чтения текста – 1 минута

На Excel я собаку съел: проработав много лет аналитиком, при помощи этого инструмента я автоматизировал маркетинговую отчетность, рассчитывал всевозможные репорты и рекламную эффективность, писал макросы, а однажды даже автоматизировал подключение MS Excel к базе данных Oracle через TextBox, в котором был записан текст запроса: получилась собственная SQL-консоль вроде Redash.

В сегодняшнем видео на примере датасета SuperStore я покажу, что Excel — не просто калькулятор строк и столбцов, но и мощнейший аналитический инструмент, сопоставимый с промышленными BI-системами.

Внутри команды мы оценили дашборд и получили следующие средние оценки (1 — худшая оценка, 10 — лучшая):

Отвечает ли заданным вопросам — 8,4
Порог входа в инструмент — 7,0
Функциональность инструмента — 8,0
Удобство пользования — 6,0
Соответствие результата макету — 8,4
Визуальная составляющая — 7,4

Итог: дашборд в Excel получает 7,5 баллов из 10. Посмотрите на полученный результат.

Сравнение программ обучения Tableau и PowerBI

Время чтения текста – 11 минут

В этом году мне удалось пройти сертификацию Tableau Desktop Associate. И когда я думал о том, как к ней лучше подготовиться, я наткнулся на курсы elearning от Tableau, которые ещё и оказались бесплатными на 90 дней.

Я решил, что нельзя упускать такую возможность и решил пройти все три блока Fundamentals в бодром темпе. Когда получил сертификацию мне стало интересно, какие программы обучения предлагают другие производители BI-инструментов. И первым делом пошёл изучать обучающие материалы по PowerBI. В этой небольшой статье хочу попытаться сравнить программы обучения от Tableau и PowerBI.

Дисклеймер: в итоге у меня сформировалось предвзятое положительное отношение к Tableau, поэтому сторонникам PowerBI данная статья может оказаться не по нраву и в чем-то окажется субъективной (справедливости ради слова похвалы PowerBI тоже присутствуют).

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

Прежде всего, существует огромная пропасть в подходе к материалам и проверке их понимания. Несмотря на то, что обучающие материалы Tableau носят более технический характер и в меньшей степени уделяют внимание дизайну, обучаясь через их видео, всё же можно делать отличные рабочие визуализации. Что и говорить, после прохождения всех трёх ступеней обучения Tableau появляется желание творить новые крутые отчёты с использованием всех LOD Expressions, Filter Actions и создавать удобные интерфейсы. А вот после просмотра всех материалов по PowerBI остаётся один вопрос: зачем я потратил своё время? Для объективности сравнения и те, и другие материалы я изучал на английском языке. Думаю, в индустрии это стандарт, поскольку открыв 2-3 ссылки на русском понимаешь, что переведено это пяткой левой ноги.

Если отбросить эмоции, есть несколько ключевых вещей, которые оказались принципиальны для меня в результате изучения материалов.

Так выглядит хороший дашборд по версии Microsoft

Качество подготовки контента и примеров в обучении

Если посмотреть на логику изложения обучающих видео Tableau и вопросов в формате квиза, которые задаются в конце прохождения материала, начинаешь проникаться идеей софта. Но в случае с PowerBI тебя ждёт тотальное разочарование. Взгляните, к примеру, на материал об обнаружении выбросов, тут Microsoft предлагает построить диаграмму scatter plot и визуально определить все выбросы на глаз.

Дизайн отчётов и дашбордов

Существуют достаточно объективные придирки к обучающим материалам Tableau на тему дизайна графиков и элементов управления, но всё равно они сделаны аккуратно и красиво. А теперь взгляните на тот ужас, который предлагает в качестве результата работы аналитика Microsoft. А вот хорошо построенный дашборд по версии Microsoft.

Проверка полученных знаний из обучения

Во время обучения Tableau ты сразу же после небольшой лекции учишься применению куска изученного материала на практике. Нужно нажать конкретные кнопки в интерфейсе, чтобы решить задачу. В PowerBI предполагаются «лабораторные работы», которые должны были запуститься с удалённой машины. Мне не удалось начать ни одну лабораторную работу, я трижды писал в саппорт, саппорт так и не смог решить мою проблему, поэтому поэкспериментировать с заданиями в PowerBI у меня так и не вышло.

Результат работы аналитика по версии Microsoft

Следующие пункты больше относятся к самому софту, чем к программам обучения.

Кроссплатформенность

Я давно работаю с Tableau, и 4 года назад пересел на Mac. После перехода с Windows мой опыт использования Tableau никак не изменился: по сути, Tableau развивался, а я вместе с ним, но при этом ключевые элементы интерфейса команда не меняла. Я экспериментировал с построением отчётов в PowerBI, но мне были неудобны различные архаизмы Microsoft типа публикаций через какой-нибудь share-портал, где обязательно нужно иметь учётную запись MS и настраивать что-то через администратора. Вся эта головная боль жутко утомляет.

Однако гораздо больше меня поразил тот факт, что я не могу воспользоваться PowerBI на Mac. Вообще, совсем никак, и это принципиальная позиция Microsoft, которая в ближайшем будущем не планируется меняться. С моей точки зрения, такое программное обеспечение относится к сегменту B2B в области аналитики, предполагает подключение ко всевозможным СУБД, но отрицает факт существования альтернативной операционной системы, на которой потенциальное n-ное количество консультантов могут продвигать и использовать PowerBI как аналитический инструмент.

Наверняка есть рациональные причины, связанные с тем, что любой софт от Microsoft не очень здорово работает на Mac, но факт остаётся фактом: для меня софт становится недоступным. Тем не менее, я не искал лёгких путей и поставил PowerBI через Parallels для того, чтобы всё-таки честно посмотреть ещё раз на инструмент с учётом обучающих материалов.

Опции визуализации

И в Tableau, и в PowerBI очень крутые опции визуализации данных. К слову, в данном разрезе PowerBI всё же предлагает видео и чуть больше информации, чем обычно. Так что по этой части инструменты представлены одинаково хорошо.

Функциональность

А тут хочется отдать должное функциональности PowerBI. Действительно, багаж инструментов даже без подключения сторонних библиотек крайне широкий. К примеру, автоматическая кластеризация, Decomposition Tree, Data Profiler или Настройка фильтров по графику

Синтаксис внутреннего языка

Для работы с PowerBI следует выучить DAX. Это не язык программирования, а функциональный язык. Что-то своё написать не получится, но оно и не понадобится — внутри уже реализованы все функции, которыми нужно только научиться правильно пользоваться. Microsoft неплохо рассказывает про DAX в мануале. Определение новой меры на языке DAX выглядит так:

Revenue YoY % =
DIVIDE(
	[Revenue]
		- CALCULATE(
			[Revenue],
			SAMEPERIODLASTYEAR('Date'[Date])
	),
	CALCULATE(
		[Revenue],
		SAMEPERIODLASTYEAR('Date'[Date])
	)
)

Подготовка данных к анализу

Внутри PowerBI есть фича Unpivot, которая позволяет привести данные, разложенные по столбцам с временными периодами к форме, удобной для использования в сводных таблицах:

Впрочем, в ETL-инструменте для очистки и предобработки данных Tableau Prep такое тоже реализовано

Выводы:

1) Программы обучения построены совершенно по-разному, методология погружения в инструмент от Tableau намного продуманнее и эффективнее. Есть возможность сразу же получить практический опыт решения задач и получить обратную связь (хоть и автоматическую).
2) Дизайн отчетов и дашбордов в обучающих материалах от Microsoft выглядит едва ли профессионально, у Tableau реализация выглядит на порядок лучше
3) Реализация проверки знаний от Microsoft ниже плинтуса (совершенно формальные тесты как в плохой школе), у Tableau реализовано хорошо, погружаешься в задачу, думаешь над ответом и решаешь.
4) Кроссплатформенность явно не является коньком PowerBI, однако в случае Tableau это отличное конкурентное преимущество
5) Функциональность и возможности инструментов, разумеется, находятся на высоком уровне, и в чем-то победу одерживает PowerBI.

Посмотрите наши обзоры дашбордов в Tableau, PowerBI, Google Data Studio, SAP Analytics Cloud, QlikSense, Redash и в других BI-системах.

Обзор дашборда в Google DataStudio

Время чтения текста – 1 минута

В прошлом гайде по BI-системам мы рассмотрели Redash, а в этот раз поговорим о дашборде, построенном при помощи Google DataStudio. Пройдёмся по результату и посмотрим, как подключать в системе датасорсы из Google SpreadSheets или других источников, добавлять новые фактоиды, фильтры и настраивать данные и визуализации.

Внутри команды мы оценили дашборд и получили следующие средние оценки (1 — худшая оценка, 10 — лучшая):

  1. Отвечает ли заданным вопросам — 8,7
  2. Порог входа в инструмент — 7,0
  3. Функциональность инструмента — 7,5
  4. Удобство пользования — 6,5
  5. Соответствие результата макету — 8,7
  6. Визуальная составляющая — 7,8

Итог: дашборд в Google DataStudio получает 7,7 баллов из 10. Посмотрите на полученный результат.

Конференция Coalesce от dbt: что посмотреть?

Время чтения текста – 4 минуты

С 7 по 11 декабря проходила конференция Coalesce, о которой я рассказывал ранее. В этом году все организаторы решили проводить конференции по 5 дней с кучей докладов.

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

Однако мне удалось посмотреть большую часть докладов, кое-что пролистывая. Для начала коротко в целом о впечатлениях: очень круто изучать доклады с подобной конференции как Coalesce, потому что речь идет в основном о современных инструментах и облачных решениях. Почти в каждом докладе можно услышать про Redshift / BigQuery / Snowflake, а с точки зрения BI: Mode / Tableau / Looker / Metabase. В центре всего, разумеется, dbt.

Мой шорт-лист докладов, которые рекомендую изучить:

  1. dbt 101 — вводный доклад и интро в то, что такое dbt и как его используют
  2. Kimball in the context of the modern data warehouse: what’s worth keeping, and what’s not — интересный и очень-очень спорный доклад, который вызвал массу вопросов в slack dbt. Вкратце, автор предлагает перейти на «широкие» аналитические таблицы и отказаться от нормальных форм всюду.
  3. Building a robust data pipeline with dbt, Airflow, and Great Expectations — в докладе про небезынтересный инструмент greatexpectations, суть которого в валидации данных
  4. Orchestrating dbt with Dagster — мне было несколько скучновато слушать, но если хочется познакомиться с Dagster — самое то
  5. Supercharging your data team — ребята сделали обертку к dbt, назвали dbt executor 9000 и рассказывают о нем
  6. Presenting: SQLFluff — про очень классную штуку SQLFluff, которая автоматически редактирует SQL-код согласно канонам
  7. Quickstart your analytics with Fivetran dbt packages — из доклада можно узнать, что такое Fivetran и как его используют совместно с dbt
  8. Perfect complements: Using dbt with Looker for effective data governance — про взаимодействие dbt и looker, про различия и схожие части инструментов

Обзор дашборда в Redash

Время чтения текста – 2 минуты

О создании credentials и работе с Google Spreadsheets API мы рассказывали в материале «Собираем данные по рекламным кампаниям ВКонтакте»

В этот раз в цикле материалов по BI-системам рассмотрим Redash: open source инструмент, представляющий собой SQL-консоль, который можно совершенно бесплатно развернуть у себя на сервере и подключить в качестве датасорса множество баз данных (включая Clickhouse!) или другой источник по API, например, Google Sheets.

В видео обсудим плюсы и минусы Redash, посмотрим, как создавать отчёты и дашборды при помощи визуализаций запросов, подключить датасорсы, реализовать фактоиды, визуализацию Word Cloud и прочие аналогии графиков оригинального макета.

Внутри команды мы оценили дашборд в Redash и получили следующие средние оценки (1 — худшая оценка, 10 — лучшая):

  1. Отвечает ли заданным вопросам — 7,3
  2. Порог входа в инструмент — 7,5
  3. Функциональность инструмента — 5,5
  4. Удобство пользования — 7,5
  5. Соответствие результата макету — 6,0
  6. Визуальная составляющая — 5,2

Итог: дашборд получает 6,5 баллов из 10. Посмотрите на полученный результат.

Обзор дашборда в SAP Analytics Cloud

Время чтения текста – 2 минуты

В прошлом гайде по BI-системам мы рассмотрели PowerBI, а в этот раз поговорим о дашборде в SAP Analytics Cloud, который для нас построил ведущий BI консультант SAPRUN Алексей Салынин.

В видео рассказываем, как в SAP создавать новый источник данных, реализовать Tree Map, встроить графики в таблицы, настроить предпросмотр на мобильных устройствах и как работать с умным помощником Smart Insight.

Вместе с Алексеем (его оценки в скобках) мы оценили дашборд внутри команды и получили такие средние оценки:

  1. Отвечает ли заданным вопросам — 9,8 (10)
  2. Порог входа в инструмент — 6,5 (7)
  3. Функциональность инструмента — 9,8 (9)
  4. Удобство пользования — 8,2 (8)
  5. Соответствие результата макету — 9,3 (10)
  6. Визуальная составляющая — 8,6 (9)

Итог — дашборд в SAP Analytics Cloud получает 8,71 балл из 10. Посмотрите на полученный результат.

Обзор дашборда в PowerBI

Время чтения текста – 1 минута

Продолжаем цикл материалов о BI-системах: сегодня рассмотрим дашборд, который собран в PowerBI по датасету SuperStore Sales. Изучим, как подключать данные к системе, настраивать кастомные цвета для визуализаций и создавать новые меры, реализовать переключение между графиками при помощи закладок и с какими сложностями столкнулись в процессе построения дашборда.

Внутри команды мы оценили дашборд и получили следующие средние оценки (1 — худшая оценка, 10 — лучшая):

  1. Отвечает ли заданным вопросам — 9,8
  2. Порог входа в инструмент — 3,0
  3. Функциональность инструмента — 9,5
  4. Удобство пользования — 7,5
  5. Соответствие результата макету — 9,5
  6. Визуальная составляющая — 8,8

Итог — дашборд PowerBI получает 8,0 баллов из 10. Посмотрите на полученный результат.

А что вы думаете о получившимся дашборде? Поставьте свои оценки в нашем Telegram-канале!

Обзор дашборда в Tableau

Время чтения текста – 2 минуты

В прошлый раз мы разобрались с постановкой задачи, построили макет и поставили цель спроектировать дашборд в Tableau по датасету SuperStore Sales, который поможет понять среди каких регионов, продуктовых групп и клиентских сегментов формируется прибыль и каковы общие показатели деятельности за прошедшее время.

В видео рассказываю весь процесс создания дашборда в первом рассматриваемом инструменте — Tableau: как мы подготавливали данные, создавали отчёты, верстали дашборд, с какими сложностями и правками столкнулись, а также как опубликовать его на сервере Tableau Public и насколько результат соответствует поставленной задаче.

Мы оценили внутренней командой дашборд по критериям и получили следующие средние оценки (1 — худшая оценка, 10 — лучшая):

  1. Отвечает ли заданным вопросам — 10,0

  2. Порог входа в инструмент — 5,5

  3. Функциональность инструмента — 9,0

  4. Удобство пользования — 8,5

  5. Соответствие результата макету — 10,0

  6. Визуальная составляющая — 9,7

Итог — дашборд на Tableau получает 8,8 баллов из 10 от нашей команды. Посмотрите на полученный результат.

А что вы думаете о получившимся дашборде? Поставьте свои оценки в нашем Telegram-канале!

Анимируем теннисные мячики в Tableau

Время чтения текста – 1 минута

В прошлом видео мы научились визуализировать теннисные мячики из Swing Vision на графике в Tableau с кастомным фоном и кастомными фигурами. Сегодня будем анимировать дашборд, чтобы посмотреть, как менялись удары и получим видео с результатами игры, которое можно экспортировать и кому-нибудь показать.

Краткое резюме:

  1. Создаём элемент Pages. Он позволяет управлять движением анимации: нажимая на кнопку Play, Title страницы будет меняться.
  2. Добавим историю: ставим галочку на Show History ниже и выберем длину в 7 ударов.
  3. Вернёмся на дашборд. Переходим во вкладку Worksheet — Show Cards и выбираем Current Page.
  4. Для захвата видео с экрана добавим новый контейнер и перенесём в него панель с ударами.
  5. Утилитой записи экрана выбираем область с дашбордом и жмём на Play. Для macOS можно воспользоваться встроенной: достаточно нажать комбинацию клавиш ⌘ + Shift + 5.

Постановка задачи для дашборда

Время чтения текста – 6 минут

В предыдущем материале шла речь о создании гайда по современным BI-системам, и сегодня начнём с постановки задачи. Возьмём довольно типичный сценарий в крупной организации — он встречался почти во всех, в которых мне довелось поработать. Предположим, что ежемесячно команда топ-менеджеров собирается и подводит итоги прошедшего месяца. Ключевая цель компании — максимизация прибыли и дивидендов. Исходя из этого команде нужен инструмент, который отобразит динамику прибыли и других основных показателей за отчётный период. Инструмент необходим для того, чтобы понять, где и как формируется прибыль, что является драйверами изменений прибыли. В качестве такого инструмента мы предлагаем использовать дашборд.

Постановка задачи

Наша задача — спроектировать и реализовать дашборд на тестовом датасете SuperStore Sales (он, кстати, весьма приближен к реальности), который ответит на следующие вопросы:

  1. Каковы общие показатели деятельности за прошедший месяц? Необходимо для подведения итогов в сравнении с аналогичным периодом прошлого года.
  2. Какие ключевые регионы формируют прибыль, а какие не эффективны?
  3. Какие категории, подкатегории, товары и клиенты формируют прибыль, а какие приносят убытки?

О датасете

В данных содержится информация о покупках (лист Orders) и возвратах (лист Returns) клиентов. Данные о покупках содержат всю доступную информацию о заказах: идентификаторы записи, даты заказов, приоритетность заказов, количество позиций, объём продаж и размер прибыли, размеры скидкок, типы и цены доставки, данные о клиентах и прочую полезную информацию. Мы будем работать только с листом данных Orders.

Фрагмент листа Orders

Макет дашборда

В верхней панели расположен заголовок дашборда с его кратким описанием. На том же уровне фильтр временного отрезка (конкретный месяц отчета). На уровне ниже — подзаголовок «KPI».

В первую очередь мы хотим понять общие ключевые изменения, поэтому далее расположим фактоиды:

  • Прибыль (Profit) и прирост YoY
  • Продажи (Sales) и прирост YoY
  • Количество заказов (Orders count) и прирост YoY
  • Средняя скидка (Avg Discount) и прирост YoY
  • Число клиентов (Customers) и прирост YoY
  • Продажи на клиента (Sales per Customer) и прирост YoY

Ниже будет расположен график с топом регионов по продажам, визуализированный в виде древовидной карты (или аналога). Размер прямоугольника на графике будет соответствовать объёму продаж, а цвет — показателю прибыли. Такая визуализация даст понять, какие регионы эффективны, а какие нет. Классно, если у исследуемого BI-инструмента будет возможность получить расширенную информацию при клике на регион и посмотреть, чем отличаются прибыльные регионы от неэффективных.

Правее расположим график с динамикой прибыли: в нём будем рассматривать, как в зависимости от времени меняется показатель. Хочется, чтобы на графике точками были отмечены анализируемый месяц и аналогичный месяц год назад для понимания тренда.

Следующий блок анализа — продукты и клиентские сегменты. На левой горизонтальной столбчатой диаграмме типа «Градусник» расположим объём продаж и прибыль по категориям и подкатегориям. По возможности BI-системы к диаграмме добавим фильтр топа товарных наименований по прибыли.

О том, как строить диаграмму Градусник в Python можно почитать в материале о красивой визуализации

Справа — горизонтальная столбчатая диаграмма с топом продуктов, отсортированных по прибыли.

Самая нижняя горизонтальная столбчатая диаграмма — топ клиентов по прибыли. Он аналогичен предыдущему графику, только вместо товаров покажет имена клиентов, сгруппированых по клиентскому сегменту и прибыль, которую они принесли.

В итоге получится приблизительно такой макет дашборда:

Предполагаемый макет дашборда в BI-инструменте

Гайд по современным BI-системам

Время чтения текста – 4 минуты

В новой серии постов постараемся подробно изучить различные BI-системы на популярной группе датасетов SuperStore Sales. В основе данных — продажи и прибыль сетевого ритейлера в долларах.

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

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

Ниже перечислен перечень BI-систем и инструментов для работы, с данными, которые хотелось бы опробовать и описать опыт построения дашборда. Приглашаю тех, кто желает поучаствовать в решении данной задачи написать мне в Telegram — @valiotti. Разумеется, авторство дашборда будет указано. Проект некоммерческий, но полезный для сравнения современных систем для аналитики независимо от квадрантов Gartner.

Сейчас в планах подготовить материалы о следующих инструментах:

Бесплатные (Open source):

Бесплатные (cloud):

Платные (cloud):

  • Mode
  • Cluvio
  • Holistic
  • Chartio
  • Periscope
  • DeltaDNA
  • Klipfolio
  • Count.co
  • SAP Analytics Cloud: 8,7 баллов из 10

Платные:

  • PowerBI: 8,0 балла из 10
  • Tableau: 8,8 баллов из 10
  • Looker: 7,7 балла из 10
  • Excel: 7,5 балла из 10
  • Alteryx
  • Qlik Sense: 8,4 балла из 10

Итоговая цель — оценить системы по нескольким внутренним критериям:

  • порог входа в инструмент (1 — супер сложно, 10 — легко)
  • функциональность инструмента (1 — очень бедный функционал, 10 — сложно что-то добавить)
  • удобство пользования (1 — очень неудобно, 10 — супер удобно)
  • соответствие результата задаче (1 — совсем не попали в желаемый макет, 10 — очень близко к описанию и макету)
  • визуальная составляющая (1 — выглядит непривлекательно, 10 — визуально привлекательный дашборд)

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

Параллельно, результаты работы будут представлены в Telegram-канале @leftjoin, и подписчики также смогут высказать свое мнение относительно полученного результата.
В итоге каждый инструмент будет описан точкой на плоскости, а сама плоскость будет поделена на 4 части.

По мере написания новых материалов в цикле этот пост будет обновляться: будут добавляться ссылки на посты и оценки.

Анализ рынка вакансий аналитики и BI: дашборд в Tableau

Время чтения текста – 16 минут

По данным рейтинга SimilarWeb, hh.ru — третий по популярности сайт о трудоустройстве в мире. В одном из разговоров с Ромой Буниным у нас появилась идея сделать совместный проект: собрать данные из открытого HeadHunter API и визуализировать их при помощи Tableau Public. Нам захотелось понять, как меняется зарплата в зависимости от указанных в вакансии навыков, наименования позиции и сравнить, как обстоят дела в Москве, Санкт-Петербурге и регионах.

Как мы собирали данные?

Схема данных основана на коротком представлении вакансии, которую возвращает метод GET /vacancies. Из представления собираются следующие поля: тип вакансии, идентификатор, премиальность вакансии, необходимость прохождения тестирования, адрес компании, информация о зарплате, график работы и другие. Соответствующий CREATE-запрос для таблицы:


Запрос создания таблицы vacancies_short

CREATE TABLE headhunter.vacancies_short
(
    `added_at` DateTime,
    `query_string` String,
    `type` String,
    `level` String,
    `direction` String,
    `vacancy_id` UInt64,
    `premium` UInt8,
    `has_test` UInt8,
    `response_url` String,
    `address_city` String,
    `address_street` String,
    `address_building` String,
    `address_description` String,
    `address_lat` String,
    `address_lng` String,
    `address_raw` String,
    `address_metro_stations` String,
    `alternate_url` String,
    `apply_alternate_url` String,
    `department_id` String,
    `department_name` String,
    `salary_from` Nullable(Float64),
    `salary_to` Nullable(Float64),
    `salary_currency` String,
    `salary_gross` Nullable(UInt8),
    `name` String,
    `insider_interview_id` Nullable(UInt64),
    `insider_interview_url` String,
    `area_url` String,
    `area_id` UInt64,
    `area_name` String,
    `url` String,
    `published_at` DateTime,
    `employer_url` String,
    `employer_alternate_url` String,
    `employer_logo_urls_90` String,
    `employer_logo_urls_240` String,
    `employer_logo_urls_original` String,
    `employer_name` String,
    `employer_id` UInt64,
    `response_letter_required` UInt8,
    `type_id` String,
    `type_name` String,
    `archived` UInt8,
    `schedule_id` Nullable(String)
)
ENGINE = ReplacingMergeTree
ORDER BY vacancy_id

Первый скрипт собирает данные с HeadHunter по API и отправляет их в Clickhouse. Он использует следующие библиотеки:

import requests
from clickhouse_driver import Client
from datetime import datetime
import pandas as pd
import re

Далее загружаем таблицу с запросами и подключаемся к CH:

queries = pd.read_csv('hh_data.csv')
client = Client(host='1.234.567.890', user='default', password='', port='9000', database='headhunter')

Таблица queries хранит список поисковых запросов. Она содержит следующие колонки: тип запроса, уровень вакансии для поиска, направление вакансии и саму поисковую фразу. В строку с запросом можно помещать логические операторы: например, чтобы найти вакансии, в которых должны присутствовать ключевые слова «Python», «data» и «анализ» между ними можно указать логическое «И».

Не всегда вакансии в выдаче соответствуют ожиданиям: случайно в базу могут попасть повара, маркетологи и администраторы магазина. Чтобы этого не произошло, опишем функцию check_name(name) — она будет принимать наименование вакансии и возвращать True в случае, если вакансия не подошла по названию.

def check_name(name):
    bad_names = [r'курьер', r'грузчик', r'врач', r'менеджер по закупу',
           r'менеджер по продажам', r'оператор', r'повар', r'продавец',
          r'директор магазина', r'директор по продажам', r'директор по маркетингу',
          r'кабельщик', r'начальник отдела продаж', r'заместитель', r'администратор магазина', 
          r'категорийный', r'аудитор', r'юрист', r'контент', r'супервайзер', r'стажер-ученик', 
          r'су-шеф', r'маркетолог$', r'региональный', r'ревизор', r'экономист', r'ветеринар', 
          r'торговый', r'клиентский', r'начальник цеха', r'территориальный', r'переводчик', 
          r'маркетолог /', r'маркетолог по']
    for item in bad_names:
        if re.match(item, name):
            return True

Затем объявляем бесконечный цикл — мы собираем данные без перерыва. Идём по DataFrame queries и сразу забираем оттуда тип вакансии, уровень, направление и поисковый запрос в отдельные переменные. Сначала по ключевому слову отправляем один запрос к методу /GET vacancies и получаем количество страниц. После идём от нулевой до последней страницы, отправляем те же запросы и заполняем список vacancies_from_response с полученными в выдаче короткими представлениями всех вакансий. В параметрах указываем 10 вакансий на страницу — больше ограничения HH API получить не позволяют. Так как мы не указали параметр area, API возвращает вакансии по всему миру.

while True:
   for query_type, level, direction, query_string in zip(queries['Тип'], queries['Уровень'], queries['Направление'], queries['Ключевое слово']):
           print(f'ключевое слово: {query_string}')
           url = 'https://api.hh.ru/vacancies'
           par = {'text': query_string, 'per_page':'10', 'page':0}
           r = requests.get(url, params=par).json()
           added_at = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
           pages = r['pages']
           found = r['found']
           vacancies_from_response = []

           for i in range(0, pages + 1):
               par = {'text': query_string, 'per_page':'10', 'page':i}
               r = requests.get(url, params=par).json()
               try:
                   vacancies_from_response.append(r['items'])
               except Exception as E:
                   continue

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

for item in vacancies_from_response:
               for vacancy in item:
                   if client.execute(f"SELECT count(1) FROM vacancies_short WHERE vacancy_id={vacancy['id']} AND query_string='{query_string}'")[0][0] == 0:
                       name = vacancy['name'].replace("'","").replace('"','')
                       if check_name(name):
                           continue

Теперь проходим по вакансии и собираем все нужные поля. В случае отсутствия некоторых данных будем отправлять пустые строки:


Код для сбора данных о вакансии

vacancy_id = vacancy['id']
                       is_premium = int(vacancy['premium'])
                       has_test = int(vacancy['has_test'])
                       response_url = vacancy['response_url']
                       try:
                           address_city = vacancy['address']['city']
                           address_street = vacancy['address']['street']
                           address_building = vacancy['address']['building']
                           address_description = vacancy['address']['description']
                           address_lat = vacancy['address']['lat']
                           address_lng = vacancy['address']['lng']
                           address_raw = vacancy['address']['raw']
                           address_metro_stations = str(vacancy['address']['metro_stations']).replace("'",'"')
                       except TypeError:
                           address_city = ""
                           address_street = ""
                           address_building = ""
                           address_description = ""
                           address_lat = ""
                           address_lng = ""
                           address_raw = ""
                           address_metro_stations = ""
                       alternate_url = vacancy['alternate_url']
                       apply_alternate_url = vacancy['apply_alternate_url']
                       try:
                           department_id = vacancy['department']['id']
                       except TypeError as E:
                           department_id = ""
                       try:
                           department_name = vacancy['department']['name']
                       except TypeError as E:
                           department_name = ""
                       try:
                           salary_from = vacancy['salary']['from']
                       except TypeError as E:
                           salary_from = "cast(Null as Nullable(UInt64))"
                       try:
                           salary_to = vacancy['salary']['to']
                       except TypeError as E:
                           salary_to = "cast(Null as Nullable(UInt64))"
                       try:
                           salary_currency = vacancy['salary']['currency']
                       except TypeError as E:
                           salary_currency = ""
                       try:
                           salary_gross = int(vacancy['salary']['gross'])
                       except TypeError as E:
                           salary_gross = "cast(Null as Nullable(UInt8))"
                       try:
                           insider_interview_id = vacancy['insider_interview']['id']
                       except TypeError:
                           insider_interview_id = "cast(Null as Nullable(UInt64))"
                       try:
                           insider_interview_url = vacancy['insider_interview']['url']
                       except TypeError:
                           insider_interview_url = ""
                       area_url = vacancy['area']['url']
                       area_id = vacancy['area']['id']
                       area_name = vacancy['area']['name']
                       url = vacancy['url']
                       published_at = vacancy['published_at']
                       published_at = datetime.strptime(published_at,'%Y-%m-%dT%H:%M:%S%z').strftime('%Y-%m-%d %H:%M:%S')
                       try:
                           employer_url = vacancy['employer']['url']
                       except Exception as E:
                           print(E)
                           employer_url = ""
                       try:
                           employer_alternate_url = vacancy['employer']['alternate_url']
                       except Exception as E:
                           print(E)
                           employer_alternate_url = ""
                       try:
                           employer_logo_urls_90 = vacancy['employer']['logo_urls']['90']
                           employer_logo_urls_240 = vacancy['employer']['logo_urls']['240']
                           employer_logo_urls_original = vacancy['employer']['logo_urls']['original']
                       except Exception as E:
                           print(E)
                           employer_logo_urls_90 = ""
                           employer_logo_urls_240 = ""
                           employer_logo_urls_original = ""
                       employer_name = vacancy['employer']['name'].replace("'","").replace('"','')
                       try:
                           employer_id = vacancy['employer']['id']
                       except Exception as E:
                           print(E)
                       response_letter_required = int(vacancy['response_letter_required'])
                       type_id = vacancy['type']['id']
                       type_name = vacancy['type']['name']
                       is_archived = int(vacancy['archived'])

Последнее поле — график работы. В случае, если вакансия подразумевает вахтовый метод работы она нам точно не подходит.

try:
    schedule = vacancy['schedule']['id']
except Exception as E:
    print(E)
    schedule = ''
if schedule == 'flyInFlyOut':
    continue

Теперь формируем список из полученных переменных, заменяем в нём None-значения на пустые строки во избежании конфликтов с Clickhouse и вставляем строку в таблицу.

vacancies_short_list = [added_at, query_string, query_type, level, direction, vacancy_id, is_premium, has_test, response_url, address_city, address_street, address_building, address_description, address_lat, address_lng, address_raw, address_metro_stations, alternate_url, apply_alternate_url, department_id, department_name,
salary_from, salary_to, salary_currency, salary_gross, insider_interview_id, insider_interview_url, area_url, area_name, url, published_at, employer_url, employer_logo_urls_90, employer_logo_urls_240,  employer_name, employer_id, response_letter_required, type_id, type_name, is_archived, schedule]
for index, item in enumerate(vacancies_short_list):
    if item is None:
        vacancies_short_list[index] = ""
tuple_to_insert = tuple(vacancies_short_list)
print(tuple_to_insert)
client.execute(f'INSERT INTO vacancies_short VALUES {tuple_to_insert}')

Как подключили Tableau к данным?

Tableau Public не умеет работать с базами данных, поэтому мы написали коннектор Clickhouse к Google Sheets. Он использует библиотеки gspread и oauth2client для авторизации в Google Spreadsheets API и библиотеку schedule для ежедневной работы по графику.

Работа с Google Spreadseets API подробно разобрана в материале «Собираем данные по рекламным кампаниям ВКонтакте»

import schedule
from clickhouse_driver import Client
import gspread
import pandas as pd
from oauth2client.service_account import ServiceAccountCredentials
from datetime import datetime

scope = ['https://spreadsheets.google.com/feeds', 'https://www.googleapis.com/auth/drive']
client = Client(host='54.227.137.142', user='default', password='', port='9000', database='headhunter')
creds = ServiceAccountCredentials.from_json_keyfile_name('credentials.json', scope)
gc = gspread.authorize(creds)

Опишем функцию update_sheet() — она будет брать все данные из Clickhouse и вставлять их в таблицу Google Docs.

def update_sheet():
   print('Updating cell at', datetime.now())
   columns = []
   for item in client.execute('describe table headhunter.vacancies_short'):
       columns.append(item[0])
   vacancies = client.execute('SELECT * FROM headhunter.vacancies_short')
   df_vacancies = pd.DataFrame(vacancies, columns=columns)
   df_vacancies.to_csv('vacancies_short.csv', index=False)
   content = open('vacancies_short.csv', 'r').read()
   gc.import_csv('1ZWS2kqraPa4i72hzp0noU02SrYVo0teD7KZ0c3hl-UI', content.encode('utf-8'))

Чтобы скрипт запускался в 16:00 по МСК каждый день используем библиотеку schedule:

schedule.every().day.at("13:00").do(update_sheet)
while True:
   schedule.run_pending()

А что в результате?

Рома построил на полученных данных дашборд.

И в youtube-ролике рассказывает о том, как эффективно использовать дашборд

Инсайты, которые можно извлечь из дашборда

  1. Аналитики с навыком бизнес-аналитики востребованы на рынке больше всего: по такому запросу нашлось больше всего вакансий. Тем не менее, средняя зарплата выше у продуктовых аналитиков и аналитиков BI.
  2. В Москве средние зарплаты выше на 10-30 тысяч рублей, чем в Санкт-Петербурге и на 30-40 тысячи рублей, чем в регионах. Там же работы нашлось больше всего в России.
  3. Самые высокооплачиваемые должности: руководитель отдела аналитики (в среднем, 110 тыс. руб. в месяц), инженер баз данных (138 тыс. руб. в месяц) и директор по машинному обучению (250 тыс. руб. в месяц).
  4. Самые полезные навыки на рынке — владение Python c библиотеками pandas и numpy, Tableau, Power BI, Etl и Spark. Вакансий с такими требованиями больше и зарплаты в них указаны выше прочих. Для Python-программистов знание matplotlib ценится на рынке выше, чем владение plotly.

Полный код проекта доступен на GitHub