Блог Ромы Бунина

о визуализации данных, дизайне BI систем и работе с Tableau

Кривая ОФЗ

Одним из показателей макроэкономики в стране является кривая безкупонной доходности облигаций федерального займа (ОФЗ БКД) — это аппроксимация доходности государственных облигаций с разными датами погашения, если бы за них не платили купоны.

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

Кривая ОФЗ на 28 января 2014 года

Если кривая «инвертируется» или «уплощается», то это свидетельствует о кризисе — инвесторы не верят в долгосрочные вложения в страну.

Инвертированная кривая в кризис, 8 декабря 2008 года

Мне стало интересно, что же сейчас происходит в стране и я решил сделать небольшой инструмент для мониторинга кривой ОФЗ. Я вдохновлялся работой New York Times о кривой доходности государственных облигаций США и тем, чему научился во время работы над  Скайбоднс в Лаборатории данных. Немного рассказываю про этот проект и облигации на кодфесте.

Вот, что у меня получилось:

Интерактивная версия по клику в картинку и ссылке https://public.tableau.com/views/9363/sheet0

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

Ещё понравился вот такой вид, когда данные за каждый день представлены по годам слева направо:

Технические особенности
Тот редкий случай, когда 3d в графиках служит на пользу, а не во вред. Чтобы сделать псевдо-3d в Табло использовал преобразования в полярных координаторах, чтобы отрисовать с помощью линий проекцию трехмерного графика. Для этого умножаем каждую координату на сочетание cos() и sin(). Как это делается подсмотрел тут. С осями это выглядит так:

Сделать нормальную анимацию в Табло пока, к сожалению, нельзя, хотя это бывает мощный инструмент визуализации. А в вебе pages вообще не работают. Записал гифку с десктопа, но почему-то она не проигрывается при вставке в блог. Тогда ссылочкой — https://recordit.co/s161XJx5lp

Данные я брал с сайта центробанка, с помощью гугл-таблиц. Оказывается есть замечательные функции IMPORTHTML и IMPORTXML. Сделал гугл-табличку, которая подставляет в урл сайта нужную дату и парсит оттуда данные. Формула такая: IMPORTXML(«https://www.cbr.ru/hd_base/zcyc_params/zcyc/?DateTo=» & Text(A4201,«dd.mm.yyyy»),«//tr[2]»). Выглядит это так:

Парсинг данных через гугл-таблицы

Поставил гугл-таблицу и Табло обновляться автоматом, в теории дашборд теперь будет автоматом обновляться, посмотрим.

30 июля   пример   табло

Переверстка дашборда от MI Fit

Это будет экспериментальный пост с переверсткой мобильного дашборда в приложении MI Fit от Xiaomi.

Я пользуюсь их браслетом MI Band уже четвертый год и меня всегда бесил их дашборд с историей активности. Недавно делал мобильную версию дашборда для обзора рынка вакансий в BI области и понял, что дашборд в мобильном — это отдельная история и не так все просто, поэтому решил потренироваться и взял пример, который давно не нравится.

Вот как это выглядит в приложении:

Вот как я переверстал дашборд:

Я больше занимался логикой, чем графической версткой, но и её попытался подтянуть. Что я изменил:
— сместил график вправо и сделал столбики более пропорциональными, чтобы влезло больше данных;
— обозначил на графике цель пунктирной линией и подсветил градиентом ее достижение;
— добавил подписи на график;
— сделал более приятную верстку фактоидов внизу (убрал выравнивание по центру и сделал меньше расстояния);
— дополнил фактоид с шагами буллет-чартом. К нему явно нужна легенда. Я бы по клику разворачивал его с анимацией в полноценный бар-чарт. Вот так:

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

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

UPD
Кирилл Беляев предложил сдвинуть по высоте верхний график и сразу показывать бар-чарт, вместо буллет-чарта. Кажется, что для массовой программы это неплохое решение, хотя и хочется всех учить более сложным типам визуализаций.
«И внизу „д“, „нед“ и „м“ можно по человечески написать, места хватит.» — вот за это люблю Кирилла, смотрит не только на то, что в фокусе, но и вообще на интерфейс в целом.
У меня получился такой вариант как-то так, хотя можно было ещё и места под карту дать по-больше:

Обзор вакансий в области BI

Решил сделать небольшой обзор рынка вакансий в области BI. Данные брал с hh.ru через официальное API.

Немного про методологию. Хотя это сложно конечно назвать методологией. Я запрашивал с hh кол-во резюме и сводную статистику, по сути получал в ответ всё-то, что обычно вы видите в левой части сайта. Для этого пользовался методом clusters. Данные брал только в разрезе регионов за 22 июня 2019 года.

АПИ hh отдает такие же данные

Зарплата считается как средневзвешенная от кол-во вакансий с указанной зарплатой. Так как hh отдает данные с припиской «от», то думаю что можно прибавлять 5-10%. Для расчета конкурса на вакансию использовались только соискатели с таким названием профессии в название резюме или таким навыком в описании обязанностей или умений. Брались только актуальные вакансии и соискатели обновлявшие резюме в течении последнего месяца. Регион соискателя не учитывался.

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

Вот, что получилось:

 Ссылкой на Табло паблик — https://public.tableau.com/views/HHBI/BI
 
Выводы из анализа
Рынок сильно перегретый, даже для IT отрасли. Так, средний конкурс — 1,5 человека на вакансию, для сравнения в среднем по IT это 3, как пишет hh, но не уверен, что мы с ними считаем одинаково. Если проверять по той же методике, что делал я, то для сравнения получаются такие конкурсы:
— Front-end программист — 1,5
— Менеджер проектов — 2,7
— Дизайнер интерфейсов — 4,7
— Java-script — 21

Если посчитать конкурс на кол-во участников в чатиках Табло и Power BI в ТГ, то получается так:
— 2,3 участника чата Табло на одну вакансию с упоминанием Табло
— 1,2 участник чата Power BI на одну вакансию с упоминанием Power BI

Зарплаты указаны только в 14% случаев, это конечно немного для нормальной оценки. Интересно как коррелирует с реальным зарплатами, но как такое разузнать кроме опросов не придумал.

В целом понятно, что методика довольно кривая, но я пока не придумал лучше. Ведь и Табло и Power BI могут указать почти в любой профессии, но кажется, что общее представление, всё равно можно получить. Хочу ещё попробовать сделать тоже самая, но забирая с hh, не сводную информацию, а конкретные вакансии и анализировать уже полные данные. Будет здорово, если маякнёте, что такое было бы интересно. Для моих целей мне подойдет и этот анализ, но я готов попробовать такое для сообщества BI спецов. Или если знаете какие ещё ключевые слова и названия профессий надо попробовать загнать в анализ.

Технические особенности
Из этого мини-проекта могу поделится такими находками:
— Гугл-таблицы из коробки умеют подключатся к любому АПИ и парсить JSON, просто чума. Делается через написание простейшего скрипта. Я был покорен этой фичей. Мои любимые JS и гугл-таблицы, что может быть лучше.
— В Табло есть встроенная и не задокументированная функция RANDOM(), которая возвращает случайное число от 0 до 1. Использовал для житерринга в левом графике. Пока он смотрится не очень уместно, но я планирую в таком же духе положить все вакансии, если спаршу их.

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

UPD: Друг попросил сделать такой же обзор для вакансий в области управления проектами — https://public.tableau.com/profile/roman4734#!/vizhome/HHPM/sheet0

22 июня   пример   табло

Gartner BI Magic Quadrant

Каждый год аналитическое агенство Gartner публикует отчеты о развитии разных направлений IT. Меня всегда бесило, что чтобы сравнить год к году надо открывать кучу картинок. Моя интерактивная вариация про квадрант в области BI:

2019   пример

Консультации от Лаборатории данных

Таня Бибикова придумала новый формат услуг от лаборатории. Это консультации по визуализации данных. На выходе будут идеи по визуализации или интерактивный прототип, построенный на этих идеях.

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

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

Будет бесполезно тем, у кого мало данных (2-4 разреза данных с простой структурой и небольшим количеством самих данных) или нужно готовое решение продуктового качества.

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

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

Примеры прототипов
Job digitalisation
Климат в России
Возрастно-половая пирамида
Работы участников конкурса «Один раз увидеть»

Записаться на консультацию можно на сайте лаборатории.

П. С. Понял, что я уже был клиентом Тани в таком формате визуализаций. Так был сделан совет про OEE. А еще в таком же формате велась работа внутри лаборатории. Мы с дизайнерами приходили к Тане, как к артдиру, раз в неделю и получали те самые консультации. Дальше делали прототипы и макеты. Мне результат таких консультаций очень нравился. =)

П. П. С. Еще такой же формат консультаций получают все наши слушатели на курсе, когда делают практическую часть. Курс в мае, следите за анонсами.

2019  

Маленькое исследование рынка вакансий Москвы и России

Сделал маленькое исследование рынка вакансий Москвы и России. Взял интересные мне профессии и скилы. Данные с hh.ru и моего небольшого инструмента, там данные тоже с hh.
Если хотите чтобы добавил какие-то профессии — пишите. =)

https://public.tableau.com/views/_21975/sheet1

Оцифровка профессий в США

Кирилл Беляев в своём телеграмм-канале разобрал визуализацию про проникновение IT и  автоматизации в профессии. Я помогал ему обсуждениями и разработкой прототипа.

Вот, что получилось. На картинке финальный макет, которые сверстал Кирилл, а по ссылке прототип в Табло.

http://revealthedata.com/examples/job-digitalisation/

Как сделать контрол для переключения день/неделя/месяц в Табло

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

Создаем параметр, которым будет управлять пользователь. Правой кнопкой на панели с данными, затем create parameter.

Потом создаем расчетное поле:

DATE(
CASE [Date range]
WHEN "Day" THEN DATETRUNC('day', [Date])
WHEN "Week" THEN DATETRUNC('week', [Date])
WHEN "Month" THEN DATETRUNC('month', [Date])
END
)

Здесь вся фишка в том, что оборачиваем весь CASE в DATE, иначе Табло не будет воспринимать результат как дату, и используем DATETRUNC, чтобы выбрать уровень агрегации.

Подставляем получившиеся поле в нужное нам место и теперь можем управлять датой:

Ecли вы читаете мой блог и у вам есть вопросы по Табло — пишите на buninra@mail.ru. Если у меня будет время, то отвечу в блоге или скину полезную ссылку по вопросу.

Разделение на квантили в Табло

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

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

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

RUNNING_SUM(SUM([Frequency])/TOTAL(SUM([Frequency])))

Автоматическим инструментом bins для разбиения на квантили использовать не получится, так как это table calc. Поэтому создадим разбивку в ручную, ещё через одно расчетное поле.

IF [Runnig % of total] >=0 AND [Runnig % of total] <0.25
THEN "0-25%"
ELSEIF  [Runnig % of total] >= 0.25 AND [Runnig % of total] <0.5
THEN "25-50%"
ELSEIF [Runnig % of total] >= 0.5 AND [Runnig % of total] <0.75
THEN "50-75%"
ELSE "75-100%"
END

Кинем получившееся поле на цвет.

Получилась фигня, так как Табло не знает как отсортировать наши слова при расчете накопительного процента. Чтобы это исправить скажем ему как отсортировать слова. Для этого зайдем в редактор table calc и зададим сортировку:

Вуаля:

Добавил Парето и залил на Табло Паблик. Там можно скачать книгу и посмотреть как что реализовано.

https://public.tableau.com/views/Wordfreqineng/Wordfreqineng?:embed=y&:display_count=yes&publish=yes

55 работ участников «Один раз увидеть»

В том году закончился конкурс ОРУ (один раз увидеть). Спасибо организаторам и все участникам, было круто. Вот разбор работ и моя последняя работа. Делал её из отпуска на коленке, но считаю, что самая это моя самая сильная работа из всего конкурса. Не успел только картинки пожать, чтобы быстрее грузилось. В во время реализации узнал про «новую» фишку размеров в css c помощью vw и vh. Очень удобно и полезно для адаптивности визуализаций и приложений в вебе.

Лолипоп чарт с осью времени в Табло

У Кати, одного из участников курса, был вопрос — как сделать «лолипоп» чарт c временем по оси икс.

Что хотелось получить в итоге

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

Данные хранились в CSV, когда открываешь их в Табло получается фигня:

Чтобы это исправить идём в настройки парсинга файла и выбираем в качестве разделителя запятую:

Раз и данные прочитались как надо:

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

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

Подробнее про длинный и широкий формат в этой статье.

После функции pivot наши даты разместились в двух столбцах с названиями Pivot Filed Values и Pivot Filed Names:

В Values хранятся значения дат, а в Names — тип даты (дата рождения, обвинения, взятия под страду и дата смертной казни). Переназовём поля в Date и Date type:

Такой формат данных очень удобен для табло. Но теперь задваиваются (точнее зачетвиряются =) ) строки:

Тогда когда мы будем подсчитывать кол-во смертников, складывать сумму лет проведенных в тюрьме и т. п. мы будем получать неверный результат. Чтобы этого избежать можно продублировать источник (надо было сделать заранее) и в одном источнике сделать pivot, а в другом нет. Тогда источник с pivot будем использовать только для визуализации lolipop, а другие для других графиков. Делается, например, здесь:

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

Теперь нам надо добавить палочки между точками. Это делается довольно хитро. Для этого будем использовать визуальный атом в виде гант чарта. В отличии от обычных баров и засечек у этого визуального атома в Табло есть начало координат (где расположить бар на оси) и размер бара (его ширина).

Чтобы «закрасить» растояние между точками, создадим расчетное поле дублирующие даты и изменим ему тип данных на число с запятой. Это нужно чтобы мы потом могли применить к этому числу Quick Table Calculation, для дат его применять нельзя. Ещё надо перетащить копию дату в Measures.

Создадим ещё одну ось с датой и объединим её с предыдущей через dual axis:

Не забудем синхронизировать оси:

Теперь зададим, чтобы размер наших меток ганчарта зависел от копии даты:

Добавим быстрое Quick Table Calculation для подсчета разницы между точками.

Теперь настроим этот расчет:

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

Теперь мы получили разницу между точками, но она откладывается вправо:

Чтобы это исправить добавим в расчетное поле минус.

Вуаля! Подстроим размеры ганчарта и готово.

На таком графике сразу видно много интересного:

Ранее Ctrl + ↓