Прогноз и контроль оттока клиентов с помощью машинного обучения

Машинное обучение

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

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

Традиционная и расширенная аналитика

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

 

Пример сценария: отток клиентов в телекоммуникационной компании

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

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

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

Традиционная аналитика: обзор оттока клиентов за последний месяц

 

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

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

Традиционная аналитика: данные оттока клиентов за последний месяц

 

График вверху этого изображения показывает распределение – те, кто ушли, представлены красным, а те, кто остался – синим. Чем больше разброс, тем меньше отток, и наоборот – чем меньше разброс, тем больше отток (что указывает на проблему).

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

На этой панели показаны клиенты с разбивкой по типу интернет-услуг, которые они используют.

Традиционная аналитика: сведения о типе интернет-сервиса

 

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

На этой панели показаны клиенты с разбивкой по типу оплаты.

Традиционная аналитика: разбивка по типам платежей

 

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

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

 

Введение в машинное обучение в данных

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

Модель машинного обучения оценивает данные и добавляет число достоверности оттока

 

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

Пороговые значения доверительной вероятности позволяют проводить анализ «что, если»

 

Идем дальше – каков профиль наших лояльных и постоянных клиентов?

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

Модель машинного обучения предоставляет подробную информацию об атрибутах для каждого клиента

 

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

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

 

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

 

Больше вопросов к данным

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

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

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

 

7 элементов стратегии данных

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

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

 

Начните со стратегии данных

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

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

 

Станьте аналитически более зрелыми

Стратегия данных должна включать в себя подробный план развития аналитических способностей и переходить от принятия решений на основе ретроспективных исследований, к принятию решений на основе прогнозов на будущее. Как видно из модели Gartner Analytic Ascendancy, цель должна заключаться в том, чтобы перейти от использования описательной аналитики («что случилось?») к предписывающей аналитике («как мы можем это сделать?»).

Аналитическая модель Gartner

 

7 элементов стратегии данных

  1. Деловые требования

Для достижения стратегических целей и создания реальной ценности данные должны соответствовать конкретным потребностям бизнеса. Первым шагом в определении бизнес-требований является определение лидера, всех заинтересованных сторон и SME (эксперт в предметной области) в организации. Лидер стратегии данных – исполнительный лидер, который поддерживает инвестиции. Заинтересованные стороны и SME представляют конкретные отделы или функции в компании.

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

Начав со сбора и документирования бизнес-требований, мы преодолеваем первое препятствие для многих ИТ или технических проектов: знание того, чего пытается достичь бизнес.

 

  1. Источники и сбор данных

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

Для данных, которые можно найти в самой компании, мы отмечаем исходную систему и любые препятствия на пути оценки этих данных. Нам также необходимо определить, имеют ли данные правильный уровень детализации и обновляются ли они с правильной частотой, чтобы получить ответы на наши вопросы. Например, являются ли данные достоверными (особенно в свете GDPR (Общие положения о защите данных) и CCPA (патентные права))? Защищены ли они ограничениями по лицензионному программному обеспечению?

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

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

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

 

  1. Требования к технологической инфраструктуре

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

  • Как операционная система может поддерживать аналитические потребности? Скорее всего, очень слабо. Как правило для удовлетворения аналитических потребностей не рекомендуется использовать операционную систему, а это означает, что вам пригодится центральное хранилище данных.
  • Есть ли в организации навыки и техническая инфраструктура для поддержки хранилища данных у себя в компании, или целесообразнее использовать облачное решение?
  • Как будут заполняться пробелы в тех местах, где сегодня не хватает данных? Можно ли рассчитать или оценить данные? Можно ли купить их на рынке или получить макроэкономические данные? Можно ли реализовать новую исходную систему для генерации данных?
  • Существует ли стандартный инструмент интеграции для передачи данных из исходных систем в центральное хранилище? Будет ли этот уровень архитектуры использоваться для бизнес-логики, чтобы данные были готовы к использованию?
  • Как вы будете предоставлять доступ к данным? Будут ли ИТ-специалисты создавать отчеты, или вы включите самообслуживание? Будут ли эти отчеты достаточными (пригодными для печати) позволят ли они пользователю взаимодействовать с данными? Будут ли они встроены в веб-сайты и предоставлены людям вне сети?

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

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

Концептуальная архитектура данных

 

  1. Превращение данных в понимание

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

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

  • Визуализации – вы должны быть в состоянии быстро определять тенденции и тренды и избегать путаницы из-за плохой презентации.
  • Рассказывание историй – панель инструментов должна представлять контекст метрик и предвидеть пользовательский путь исследования и диагностики.
  • Демократизация данных – у кого есть доступ к каким данным? Нужно поощрять совместное использование и широкое распространение, а также определять общие определения и метрики в организации.
  • Гранулярность данных – уметь обеспечить правильный уровень детализации для нужной аудитории. Аналитику может потребоваться более подробная информация, чем руководителю, а некоторым людям может потребоваться детализация.
  1. Люди и процессы

Как мы уже говорили, для управления данными требуется больше, чем просто технология. На этом этапе мы смотрим на людей в организации и процессы, связанные с созданием, обменом и управлением данными. Стратегия данных, вероятно, представит больше данных и анализа, и, возможно, новые инструменты. Исходя из этого, имеет смысл взглянуть на набор навыков пользователей, чтобы понять их сильные стороны и те места, где потребуется поддержка. Должны ли они пройти обучение? Вам нужно нанять больше людей? Организационную структуру тоже необходимо оценить – аналитики должны быть привязаны к бизнес-единице или к ИТ? И как ИТ поддержит бизнес в своих аналитических потребностях? Даже такие темы, как отзывы сотрудников и планы стимулирования тоже нужно оценить. В конце концов, их можно использовать как рычаги, чтобы побудить сотрудников использовать данные в соответствии с целями организации.

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

 

Пример учебного плана

 

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

  1.  Управление данными

Управление данными – это то, что в конечном итоге позволяет обмениваться ими на уровне предприятия, это масло, которое смазывает механизм аналитической практики.

Программа управления данными обеспечит следующее:

  • Расчеты, используемые по всей компании, определяются на основе входных данных по всей компании;
  • Правильные люди получат доступ к нужным данным;
  • Будет определено происхождение данных (откуда появились и как они преобразовывались с момента создания).

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

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

  1. Дорожная карта

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

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

Вот еще факторы для включения в дорожную карту:

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

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

Пример проекта

 

 

Советы и стратегии по переходу на корпоративное использование Qlik

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

 

Создайте свою BI стратегию

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

Вот некоторые элементы, которые мы хотели бы рассмотреть с нашими клиентами при разработке стратегии:

  • Задачи: мы начинаем с того, что задаем вопросы типа «Почему?», или «Чего пытается достичь бизнес?», «Как мы собираемся использовать эти данные для улучшения бизнеса?». Это помогает нам перед поиском решения понять приоритеты. Мы всегда начинаем с расспросов клиентов.
  • Обзор решения. Мы гарантированно добиваемся того, что клиенты понимают возможности Qlik и пути того, как он может помочь бизнесу.
  • Лучшие практики: мы также обучаем клиентов лучшим практикам, таким как денормализация исходных таблиц и перемещение сложных вычислений из пользовательского интерфейса в сценарий загрузки, чтобы пользователи начинали с правильных методов и не создавали для себя лишней работы.
  • Управление: мы обсуждаем, как разработать структуру управления, которая позволит вам включить аналитику самообслуживания, а также обеспечить контроль, надежность и безопасность данных.
  • Архитектура данных: мы обсуждаем такие вещи, как: место хранения данных, способ их организации и интеграции, у кого будет доступ к ним, как обеспечить безопасность и многое другое.
  • Расширения: перед созданием решения вы можете реализовать «стандартный» Qlik, но расширения позволяют использовать его такими способами, которых нет в стандартной реализации. Общие расширения включают QlikMaps, расширенные объекты KPI и те, которые записывают пользовательские данные обратно в базу данных из пользовательского интерфейса Qlik.
  • Обучение. Мы обсудим план обучения для всех пользователей Qlik. Обучение повышает производительность, снижает затраты на обслуживание, увеличивает скорость внедрения и учит пользователей, как максимально эффективно использовать возможности Qlik. Кроме того, чем больше вы знаете, тем меньше вы должны полагаться на консультанта.

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

 

Создать матрицу BI приоритизации

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

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

  1. Как такое поведение повлияет на бизнес?
  2. Какова целесообразность этого? Сколько времени и ресурсов уйдет на получение этой функциональность?

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

Матрица BI Приоритетов помогает вам составить дорожную карту для своих приоритетов и увидеть вещи, которые вы можете легко реализовать.

 

Определить централизованную метрику

После того, как ваш план будет готов, вы захотите внедрить BI платформу таким образом, чтобы она была масштабируема и пригодна для корпоративного использования. Одной из проблем при работе с Qlik является определение централизованной библиотеки для основных элементов, которая может использоваться несколькими приложениями. Одним из методов, который поможет в этом, является служба управляемых метрик, расширение серверной среды Qlik Sense. Она позволяет вам определять ваши метрики извне, загружать их в Qlik Sense и применять их к любым/всем выбранным вами приложениям. Это обеспечивает согласованность (помните «единый источник правды?») и сокращает администрирование, поскольку вам не нужно дублировать сложные основные элементы в приложениях.

Внешние показатели хранятся в архитектуре этого продукта (таблица Excel, таблица базы данных и т. д.); QVD базируется на этом принципе; на сервере установлен инструмент управления управляемыми метриками, и это интерфейс, который вы используете для использования библиотеки метрик в приложениях.

 

Служба управляемых метрик

 

Заранее проверьте масштабируемость вашей системы

Если вы её построите, то, когда появятся новые пользователи… сможет ли ваше железо справиться с таким наплывом? Тестирование масштабируемости необходимо выполнить на ранней стадии процесса реализации, чтобы ответить на неопределенности относительно большего объема памяти или более быстрых процессоров. Набор инструментов для масштабируемости (Scalability Toolkit) поможет вам выполнить регрессионное аварийное тестирование с помощью автоматического тестирования. Этот инструментарий позволяет настроить гипотетический сценарий типичного и нетипичного использования приложения, а затем прогнать этот сценарий, чтобы получить метрики и выходные данные для анализа. Например, вы можете оценить, как увеличившееся количество пользователей влияет на использование ОЗУ и время отклика. Важно протестировать производительность, выявить слабые места и внести соответствующие изменения, прежде чем пользователи начтут взаимодействовать с системой.

 

Управление Qlik с помощью утилит QMC

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

  • App Mover (Перемещение приложений): без этого инструмента вы можете выполнить несколько шагов: экспортировать приложение, присвоить ему имя, сохранить и импортировать его, предоставить соответствующие разрешения и многое другое. App Mover упрощает все эти процедуры, перемещая приложение и всю связанную с ним информацию из одной среды в другую.
  • Object Approver (Подтверждение объектов): при ручном перемещении в другую среду некоторые объекты можно пропустить, поэтому данный инструмент упрощает перемещение всех объектов.
  • Security Rules Manager (Менеджер правил безопасности): воссоздание правил в разных средах утомительно и может привести к ошибкам. Это позволяет легко экспортировать и импортировать правила между средами.
  • Custom Property Bulk Loader (Массовый загрузчик настраиваемых свойств): позволяет вносить массовые изменения в различные компоненты вашей реализации Qlik вместо одного объекта за раз.

 

Автоматический контроль версии С IN4BI

In4BI, доступный для Qlik Sense и QlikView – это инструмент, который позволяет разработчикам работать с одним и тем же документом параллельно с формализованным процессом проверки и некоторыми дополнительными функциями управления. Администраторы действуют как привратники и контролируют продвижение приложений между средами, гарантируя, что QA выполнен и контрольные списки заполнены. Кроме того, номера версий присваиваются автоматически, чтобы избежать путаницы среди разработчиков.

 

Хорошенько подумайте о возможности использования Qlik в облаке

Вполне возможно, что часть вашей системы уже находится в облаке, например, один из ваших компонентов Qlik или другие данные исходной системы (например, данные CRM на Salesforce.com), которые вы загружаете в свою систему. Запуск Qlik в облаке должен стать серьезным фактором при переходе от решения для отдела к решению для всей компании. Размещение компонентов на сервере Qlik в облаке дает вам несколько преимуществ:

  • Упрощение масштабирования, увеличение или уменьшение: добавьте больше вычислительных ресурсов, таких как RAM, CPU и IO, без принятия решений, затрат, времени и установки, связанных с физическими серверами. Вместо этого добавьте пространство, быстро отметив флажок в Интернете, и получите немедленные преимущества. Также есть возможность автоматически запускать и останавливать экземпляры в зависимости от ваших потребностей с помощью недорогих инструментов для самостоятельной работы.
  • Устойчивость и защита от сбоев: в облаке у вас есть кластеры серверов в различных центрах обработки данных. Таким образом, если один центр обработки данных выходит из строя, другие все еще активны. Крайне маловероятно, что два или более центра обработки данных, поддерживающих облачную среду, выйдут из строя одновременно.

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

 

 

Детальный разбор и сравнение лицензирования Power BI и Tableau

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

При разборе моделей лицензирования я разработал следующую таблицу, которую сейчас объясню.

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

Во-первых, у Power BI действительно есть два разных режима лицензирования: классическое лицензирование с Power BI Pro и новое лицензирование с Power BI Premium. Последние три строки касаются цены Power BI Premium, которая начинается с 5000 USD в месяц для экземпляра Power BI P1. В Power BI Premium просмотр отчетов предоставляется только пользователям, а издателям контента по-прежнему нужна лицензия Power BI Pro по цене 10 USD на пользователя в месяц.

В классическом лицензировании Power BI клиент для настольных ПК всегда бесплатный. Единственное, что стоит денег – это использование функций Pro в Power BI Service, цена здесь – 10 USD за 1 пользователя в месяц. Однако в этой модели, если в отчете используются функции Pro, то все пользователи, включая пользователей, которые просто хотят просмотреть отчет, должны иметь лицензию Pro.

Теперь и Tableau стал чем-то похож на это, но есть некоторые нюансы. У Tableau также есть десктопная версия, но вы будете платить 35 USD за 1 пользователя в месяц за персональную версию и 70 USD за 1 пользователя в месяц за Pro версию. Если вы хотите публиковать и делиться отчетами через Tableau Online, то для этого потребуется еще 42 USD за 1 пользователя в месяц. Если пользователи хотят получить возможность просматривать или редактировать эти отчеты в Интернете, им также требуется лицензия по цене 42 USD за 1 пользователя в месяц.

Итак, давайте посмотрим на простой сценарий в рамках классической модели лицензирования Power BI и сравним его с Tableau. И именно в этом сценарии мы ищем «переломный момент» в ценах между Power BI и Tableau. Итак, если мы начнем с начальных условий – организация хочет создать модель, опубликовать и поделиться ею с определенным количеством пользователей, модель будет доступна только для чтения. Как это будет выглядеть?

Что ж, предположим, что нам нужна лицензия для настольного ПК и лицензия, чтобы иметь возможность обмениваться созданными отчетами. В мире Tableau это означает, что нам нужна лицензия Desktop Pro по цене 70 USD в месяц и лицензия Tableau Online по цене 42 USD в месяц. Благодаря нехитрым расчетам мы получаем 112 USD в месяц. В Power BI лицензия для настольных ПК бесплатна, и все, что нам нужно – это лицензия Pro на 10 USD в месяц. Теперь мы добавляем 10 «читательских» лицензий по цене 42 USD на 1 пользователя в месяц с Tableau и 10 USD на 1 пользователя в месяц для Power BI. Tableau всегда будет дороже, чем Power BI:

Представленный выше сценарий сохраняется в Power BI classic до тех пор, пока общее число пользователей не достигнет 550. И мы предполагаем, что соотношение читателей и разработчиков составляет 10 к 1. Имейте в виду, что цены Power BI всегда будут лучше цен Tableau.

Это – точка безубыточности при использовании Premium.

Итак, если в вашей организации работает более 550 человек, вы почти наверняка захотите использовать Power BI Premium. Кроме того, после того, как вы приблизитесь к этому условному размеру организации, цены Tableau станут еще менее привлекательными, так как лицензии «только для чтения» бесплатны для Power BI Premium и, не так уж бесплатны в Tableau Online.

В наборе инструментов бизнес-аналитики Microsoft есть множество бесплатных альтернатив. Это и использование бесплатного Power BI Desktop и простое размещение файлов в общей папке или в службах отчетов SQL Server. Или, например, использование Power BI Desktop и лицензии Free Power BI и бесплатной функции публикации в Интернете. Кроме того, всегда есть Excel, у которого есть множество функциональных возможностей Power BI с PowerPivot.

Теперь, несмотря на все вышесказанное, у меня есть предположения относительно будущего лицензирования Power BI. Я могу быть совершенно не прав, но есть одна вещь, которую я заметил в Power BI Premium. Меня не удивит, если Microsoft введет дополнительные уровни между этими двумя классами обслуживания. Представьте, что общая емкость имеет меньше ограничений, чем общий сервис Power BI, но больше ограничений, чем выделенная емкость 100%. Может показаться, что Microsoft может создать один или несколько уровней обслуживания, используя менее ограниченную общую емкость, которая будет оптимизирована для создания ценовых категорий, которые будут привлекательны для среднего бизнеса, эффективно предоставляя им всю или большую часть функциональности Premium. Несмотря на все сказанное, каков реальный стимул сделать такое, если ваша цена 20% или даже меньше от вашего наиболее вероятного конкурента?

В конце концов, новая модель лицензирования является благом для крупных компаний и, на мой взгляд, в целом повышает ценность предложения Power BI. Рассмотрим организацию с 5000 активных пользователей BI. Расходы этой организации в соответствии со старой моделью лицензирования составят 50 000 USD (5 000*10 USD) в месяц или 600 000 USD в год. В соответствии с новой моделью лицензирования с двумя экземплярами P1 будет больше на 15 000 USD (500*10 + 2*5 000) в месяц или 180 000 USD в год. При использовании Power BI Premium экономия по сравнению с классическим лицензированием Power BI составляет 60%. И та же организация будет платить 245 000 USD (500 * 70 USD + 350 * 42 USD + 4500 * 42 USD) в месяц или 2 940 000 USD в год за Tableau.

 

Сравниваем лицензирование Qlik и Power BI

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

 

Здесь довольно много совпадений, и мне кажется, что вам нужны оба продукта, чтобы получить полную функциональность Power BI Pro. Но ещё есть Qlik NPrinting для «генерации, распределения и планирования отчетов», который включен в Power BI. И Qlik GeoAnalytics для визуализации карты, которая, опять же, включена в Power BI. И Qlik Connectors, по-видимому, дополнительное требование для QlikView. Все коннекторы, доступные для Power BI, входят в комплект поставки, без дополнительной платы за «дополнительные» коннекторы. Но не будем забывать, что Qlik Analytics аналогичен Power BI Embedded, теперь включенному в Power BI Premium и, наконец, Qlik DataMarket, который кажется аналогичным ныне несуществующему Microsoft DataMarket.

Qlik Sense, похоже, сегодня является флагманским продуктом. Если вы перейдете на домашнюю страницу Qlik, всё, что они рекламируют, это Qlik Sense, Qlik Sense Cloud и платформу Qlik Analytics. Давайте разберемся. Мысль здесь состоит в том, что если Qlik Sense сам по себе дороже, чем Power BI, то анализировать дальше, действительно, не нужно. В этот момент вы платите больше за меньшее. Если бы Qlik Sense был дешевле, чем Power BI, то мы бы копали немного глубже.

К сожалению, сложность здесь не прекращается. Понимаете, сам Qlik Sense поставляется в трех вариантах: Qlik Sense Desktop, Qlik Sense Cloud и Qlik Sense Enterprise. И даже в Qlik Sense Cloud есть Qlik Sense Cloud Basic, Qlik Sense Cloud Plus и Qlik Sense Cloud Business. Хорошо, поэтому мы можем, по крайней мере, начать делать некоторые аналогии между продуктами. Казалось бы, Qlik Sense Desktop бесплатен. И Qlik Sense Cloud Basic является бесплатным.  Таким образом, комбинация из них, по-видимому, будет примерно эквивалентна Power BI Free. Тогда есть Qlik Sense Cloud Plus и Qlik Sense Cloud Business. Qlik заявляет, что Plus для индивидуума, а Business- для групп и команд. Хорошо, мы можем примерно сопоставить это с Power BI Pro. И Qlik Sense Enterprise, ну, должно быть, это эквивалент Power BI Premium.

В любом случае, начнем с бесплатных версий

ОК, не удивительно, бесплатно это бесплатно. Получаете ли вы все те же функции в Qlik Free, что и в Power BI Free, это, вероятно, тема для совсем другой статьи.

Давайте перейдем к индивидуальному использованию Qlik или Power BI. В Qlik Sense Cloud это Qlik Sense Cloud Plus 20 долларов США за пользователя в месяц. В Power BI это 10 долларов США за пользователя в месяц.

Индивидуальная подписка в месяц

Итак, Qlik для человека вдвое дороже, чем Power BI. Это предполагает, что вам, как человеку, понадобится Power BI Pro и вы не сможете обойтись без Power BI Free. Но, поскольку вы не можете делить на ноль, мы просто зайдем с Power BI Pro.

ОК, рассмотрим группы и команды. В Qlik это, по-видимому, означает Qlik Sense Cloud Business на уровне $ 25 за пользователя в месяц, а с Power BI это означает, что Power BI Pro стоит 10 долларов США за пользователя в месяц. Мы предположим, что в команде 50 человек.

Таким образом, Qlik для групп и команд в 2,5 раза дороже Power BI. На самом деле не имеет значения, сколько людей в команде, Qlik в этом сценарии всегда будет в 2,5 раза дороже.

Интересно, однако, что мы можем найти точку, где можно было бы подумать о переходе на Power BI Premium от Qlik Sense Cloud Business. Этот момент составляет около 201 пользователя (5000 долл. США / 25 долл. США). 201 вместо 200, потому что мы предполагаем, что у вас будет как минимум 1 автор и, следовательно, придется заплатить 10 долларов США за пользователя за месяц.

Итак, в Power BI Premium вы заплатили бы $ 5000 за месяц плюс 10 долларов США за пользователя за месяц для пользователей Pro. При этом для 201 пользователя вам будет лучше использовать Power BI Pro, так как это обойдется вам всего в 2000 долларов в месяц.

Пока все хорошо. Хорошо и довольно просто. К сожалению, все это заканчивается здесь. Почему? Потому что теперь мы прибыли в Qlik Sense Enterprise и его «лицензирование на основе токенов». Qlik утверждает, что их лицензирование на основе токенов является «гибкой и простой маркерной моделью». У Power BI Premium есть своя лицензия, и это то, что мы собираемся сравнить с Qlik Sense Enterprise.

Первое, что нужно знать о лицензировании на основе токенов Qlik, — это то, что каждый токен стоит 1500 долларов. Во-вторых, токены приходят в двух вариантах. Первый способ, которым вы можете использовать токен, — присвоить его именованному пользователю как «логин». Таким образом, это было бы аналогично в Power BI Premium-land для пользователя Power BI Pro, который является частым пользователем «power». Второй способ, которым вы можете использовать токен, — это присвоить ему 10 «логинов в систему».

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

Для целей сценария ценообразования мы будем использовать сценарий лицензирования, приведенный в техническом документе Qlik. Как указано в техническом документе, вам нужно создать дополнительный запас, потому что вы не можете точно знать, сколько раз пользователи будут фактически получать доступ к системе в любой конкретный месяц. Они используют буфер 20%, и они принимают в среднем 4 обращения на пользователя и что есть 103 пользователя. По их расчетам 103 x 4 x 120% / 10 (пропуск доступа на вход для каждого токена) вы получаете 49,4 нужных токена, которые округляются до 50.

Итак, 50 идентификаторов доступа для входа в систему доступа, и мы также предположим, что будет один именованный пользователь, который является основным автором отчетов и т. д., поэтому добавьте еще один токен для этого именованного пользователя, и мы уложимся в 51 токен. Но Qlik Enterprise работает на сервере, поэтому мы добавим те же расходы на сервер и хранилище от Power BI и Tableau Licensing Deconstructed and Compared VOL. 2. Эти расходы составляют $ 438 / месяц для сервера и $ 800 / месяц для хранения 10 ТБ.

Хорошо, но другая интересная вещь о Qlik Enterprise заключается в том, что лицензирование маркеров, хотя они стоят 1500 долларов каждый, кажется, бессрочно. Таким образом, нам нужно будет определить способ разбить это на ежемесячные расходы. Поэтому мы будем предполагать 3-летнюю стоимость системы. Это означает, что у нас есть 50 токенов доступа для входа в систему по цене 1500 долл. США за токен, разделенный на 36 месяцев или 2083 долл. США в месяц. Плюс 1 токен доступа пользователя по цене 1500 долларов за токен, разделенный на 36 месяцев или 42 доллара США в месяц. Это дает нам следующую таблицу:

В этом случае Power BI Premium дороже, чем Qlik Enterprise, но Power BI Pro дешевле.

Используя ту же модель, что и выше, точка разрыва маркера для Qlik vs Power BI Premium составляет около 91 токенов или около 188 пользователей плюс 1 именованный пользователь. 90 токенов доступа для входа по цене 1 500 долларов США за токен, разделенный на 36 месяцев, составляет 3750 долларов США в месяц плюс 42 доллара США за месяц для указанного токена пользователя, получаем таблицу:

В этой точке безубыточности Qlik Enterprise и Power BI Premium имеют одинаковую цену, но Qlik Enterprise — это более чем 2,5-кратная стоимость Power BI Pro.

Точка разрыва между Power BI Pro и Power BI Premium — это 550 пользователей, у которых 50 пользователей, а 500 — читатели.

В этом случае нам понадобится 240 токенов доступа для входа (240 * $ 1,500 / 36 = 10 000 долларов США) и 50 токенов доступа пользователей (50 * $ 1,500 / 36 = $ 2,083) для Qlik. Эта таблица выглядит так:

Таким образом, в истинном корпоративном сценарии Qlik Enterprise почти в 2,5 раза превосходит стоимость Power BI, независимо от того, лицензирована ли она как Power BI Pro или Power BI Premium.

С этого момента Power BI Premium будетдешевле, чем Qlik Enterprise, потому что пользователи Power BI бесплатны или всего лишь 10 долларов США в месяц, а не около 42 долларов США в месяц. Давайте посмотрим, как этот окончательный сценарий складывается против Power BI On-Prem:

Почти в 3 раза дороже!

Поэтому нет сценария ценообразования, где Qlik дешевле Power BI. Также очевидно, но скорее, что система на основе токенов эффективно заставляет вас переплачивать, чтобы обрабатывать более чем среднее (оценочное) использование системы.

 

 

Руководство: как создать расширение Qlik Sense с помощью D3

Новые API Qlik Sense упрощают создание расширений, которые создают новые визуализации. Распространенным источником этих визуализаций является d3.js, мощная библиотека javascript для визуализации данных.

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

  1. Получить код d3 для использования
  2. Получить тестовые данные для использования и загрузить их в Qlik Sense
  3. Инициализировать новое расширение и настроить его свойства.
  4. Вставьте код d3 в расширение и изменить его для получения исходных данных из расширения.

Предварительные условия: В этом руководстве предполагается, что вы обладаете базовыми знаниями о сценариях Qlik Sense и JavaScript, поэтому этот вопрос не будет затрагиваться. Однако, все примеры кодов и шаги будут сопровождаться краткими пояснениями, так что вы сможете скопировать и вставить те части, которые вы не полностью понимаете.

Ресурсы:

Руководство покажет вам, как создать следующую диаграмму:

Теперь перейдем собственно к самому процессу.

Получение кода D3 для использования

Я собираюсь построить диаграмму рассеяния d3, показанную здесь: http://bl.ocks.org/mbostock/3887118. Диаграмма отображает точки по 2 метрикам, а также окрашивает их в зависимости от измерения атрибута. Qlik Sense имеет встроенную диаграмму рассеяния, которая строит точки на основе одного измерения. Там нет возможности добавить второе измерение, которое может группировать точки по цвету. Диаграмма рассеяния d3 представляет эту новую функциональность.

Если вы посмотрите на исходный код под диаграммой, то увидите два файла: html-файл, который отображает диаграмму, и файл *.tsv, который содержит данные. Мы будем использовать подмножества html-файла и данные Qlik Sense вместо tsv-файла.

Мы вернемся к этому примеру, когда будем готовы реализовать код d3.

Получите тестовые данные и загрузите их в Qlik Sense

Для диаграммы рассеяния нам нужен набор данных с 2 метриками и 2 измерениями. 2 метрики будут нанесены на оси X и Y. 1 измерение будет использоваться для отрисовки каждой точки; второе измерение будет использоваться для назначения цвета точкам. Я взял примерный набор данных из Отчета о развитии человека за 2014 год. Этот набор данных включен выше в разделе Ресурсы.

Заголовки таблицы:

Исследуемая группа Страна Ожирение в% Ожидаемая продолжительность жизни в возрасте 60 лет

В качестве двух показателей я выбрал «Ожирение в%» и «Ожидаемая продолжительность жизни в возрасте 60 лет». Отображаемые измерения будут представлять отдельные страны. Для цвета я буду использовать исследуемую группу, в которую входит каждая страна. Я также удалил все страны, в которых отсутствовали данные.

Сохраним ваш набор данных в папку, откуда вы сможете загрузить его.

Создаем новое приложение в Qlik Sense

Первое, что нам нужно сделать, это создать новое приложение в Qlik Sense. Откройте Qlik Sense. Вы должны увидеть кнопку «Create new app» (Создать новое приложение) в правом верхнем углу.

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

Изменение скрипта загрузки и загрузка ваших данных

Итак, мы создали и открыли новое приложение, оно пустое. Теперь нам нужно загрузить наши данные. Данные можно загрузить с помощью редактора загрузки данных. Нажмите на значок компаса в верхнем левом углу и выберите «Data load editor» (Редактор загрузки данных), чтобы открыть это окно.

Редактор загрузки данных содержит язык сценариев для загрузки данных в Qlik Sense. Слева вы увидите панель, которая организует ваш скрипт загрузки в разные вкладки. Главная вкладка автоматически заполняется некоторыми переменными конфигурации. Здесь не нужно ничего изменять. Нажмите на знак «+», чтобы создать новую вкладку под Главной. Дайте вкладке имя.

Теперь справа должна отображаться пустая вкладка сценариев. Чтобы сгенерировать наш скрипт загрузки, нам нужно установить соединение с папкой, из которой мы будем загружать данные. Справа от области сценариев находится кнопка с надписью «Create connection» (Создать соединение). Нажмите эту кнопку и перейдите к папке, в которой сохранен ваш CSV. Дайте этой папке имя и нажмите «Сохранить».

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

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

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

Теперь мы можем загрузить данные в наше приложение, нажав кнопку «Load Data» (Загрузить данные) в правом верхнем углу.

Инициализация нового расширения и настройка

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

Перейдите в папку «Extensions» (Расширения). Эта папка находится в папке Мои документы\Qlik\Sense\Extensions. Вы найдете папку для каждого установленного вами расширения. Для этого урока мы продублируем расширение «SimpleTable».

Инициализация расширения

Создайте дубликат папки расширения «SimpleTable» и переименуйте его в «TwoDimScatter». Затем откройте папку. Вы должны увидеть следующие файлы:

  • com-qliktech-simpletable.js – файл Javascript, который извлекает данные из Qlik Sense и создает пользовательскую визуализацию
  • com-qliktech-simpletable.qext – файл свойств, который содержит такие атрибуты, как имя расширения
  • simpletable.css – файл стилей, в котором мы можем определить визуальные атрибуты, такие как шрифты и цвета
  • wbfolder.wbl – нам не нужно будет его менять

Обновите все имена файлов, кроме файла wbfolder.wbl, с помощью «twodimscatter», названия нашего расширения. Например, «com-qliktech-simpletable.js» должен стать «twodimscatter.js». Также нам нужно включить в эту папку файл d3.min.js, что позволит использовать библиотеку D3. Последняя версия привязана к разделу Resources выше. Полученная папка должна выглядеть примерно так:

Настройка файла свойств расширения

Откройте файл «twodimscatter.qext» в текстовом редакторе. Вы должны увидеть JSON со свойствами, такими как имя, автор и т. д. Эти значения будут видны во внешнем интерфейсе Qlik Sense, где вы выбираете объекты для добавления на лист. Обновите значения, чтобы отразить ваше новое расширение. Например, мой код такой:

[code lang="js"]{
"name" : "Two Dimensional Scatter",
"description" : "A scatter plot that uses two dimensions",
"icon" : "table",
"type" : "visualization",
"version": "1.0",
"preview" : "table",
"author": "Speros"
}[/code]

Сохраните и закройте этот файл.

Подготовка CSS

Откройте файл «twodimscatter.css» в текстовом редакторе. Здесь мы собираемся вставить CSS, специфичный для расширения d3. Файл CSS будет содержать правила стиля, такие как размеры шрифта и цвета для элементов нашей визуализации. А пока давайте очистим содержимое этого файла и оставим только то, что нам нужно. В первой строке есть запись для «.qv-object-com-qliktech-simpletable div.qv-object-content-container». Div.qv-object-content-container — это div, который будет содержать наше расширение. Первый класс, указанный там, «.qv-object-com-qliktech-simpletable», — это класс, к которому будет применяться наш объект расширения. Мы хотим включить это различие в класс, чтобы наш CSS применялся только к элементам, которые мы создаем в своем расширении. Мы сохраним эту запись, но с 2 изменениями:

  1. Переименуйте первый класс из «.qv-object-com-qliktech-simpletable» в «.qv-object-twodimscatter»
  2. Уберите строку «overflow: auto;»

Остальную часть текста в файле CSS можно удалить. Ваш CSS файл должен выглядеть так:

[code lang="css"].qv-object-twodimscatter div.qv-object-content-container {
}[/code]

Настройка файла JS

Откройте файл Javascript с помощью текстового редактора. Этот файл определяет, что делает объект расширения. Мы собираемся сначала установить начальные свойства и функции нашего расширения.

Зависимости файлов

В самой первой строке файла вы увидите оператор define(), который принимает список файлов для загрузки, а затем запускает функцию после их загрузки. Этот оператор позволяет нам загружать файлы, от которых будет зависеть наш код расширения, прежде чем мы попытаемся запустить этот код расширения. Define() является частью AMD API и доступен для нас в расширениях благодаря использованию Qlik Sense RequireJS.

Мы должны изменить этот оператор define(), чтобы получить файлы, которые нам нужны для нашего расширения: jQuery, наш файл css и наш файл d3.min.js. Измените массив определения:

["jquery", "text!./simpletable.css"]

на

["jquery", "text!./twodimscatter.css","./d3.min"]

Наш код расширения теперь загрузит эти файлы, прежде чем пытаться что-то нарисовать. Примечание: Qlik Sense поставляется с jQuery, поэтому нам не нужно хранить локальную копию в своем расширении. В своем расширении мы будем использовать jQuery, чтобы добавить нашу визуализацию в контейнер объекта расширения

Свойства и определения

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

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

[code lang="js"] return {
initialProperties : {
version: 1.0,
qHyperCubeDef : {
qDimensions : [],
qMeasures : [],
qInitialDataFetch : [{
qWidth : 10,
qHeight : 50
}]
}
},
definition : {
type : "items",
component : "accordion",
items : {
dimensions : {
uses : "dimensions",
min : 1
},
measures : {
uses : "measures",
min : 0
},
sorting : {
uses : "sorting"
},
settings : {
uses : "settings",
items : {
initFetchRows : {
ref : "qHyperCubeDef.qInitialDataFetch.0.qHeight",
label : "Initial fetch rows",
type : "number",
defaultValue : 50
},
}
}
}
},[/code]

В строке 2 создается объект initialProperties. В строке 10 qWidth указано, сколько столбцов должно иметь расширение. Измените qWidth с «10» на «4», так как у нас есть два измерения и две меры. Атрибут qHeight ниже указывает, сколько строк можно загрузить. Измените значение с «50» на «1000».

В строке 13 определяется объект определения. Этот объект включает измерение и пределы измерения. В строках 19 и 23 вы увидите, что минимальные измерения установлены на «1», а минимальные меры были установлены в «0». Для нашего расширения мы хотим ровно 2 измерения и 2 меры.

В строке 19 измените минимальные размеры с «1» на «2». Затем добавьте запятую и в новой строке добавьте максимальное значение «2». Сделайте то же самое для мер. Это ограничивает наше расширение необходимостью выполнения ровно 2 измерений и 2 мер. Результат должен выглядеть так:

[code lang="js"]dimensions : {
uses : "dimensions",
min : 2,
max: 2
},
measures : {
uses : "measures",
min : 2,
max: 2
},[/code]

В строке 32 создается объект «items». Для нашего расширения этот объект можно удалить. Нужно удалить строки с 32 по 39. Вы также можете удалить предыдущую запятую. Результат должен выглядеть так:

[code lang="js"]settings : {
uses : "settings"
}[/code]

Функция рисования

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

  1. Измените функцию так, чтобы она принимала два параметра: $element и layout
function($element,layout) {
  1. Очистите текущее содержимое функции
function($element,layout) {}
  1. Выведите эти два элемента, чтобы можно было исследовать их содержание
function($element,layout) {
console.log($element);
console.log(layout);
}

Console.log() принимает любые введенные данные и отображает их в консоль JavaScript, которую мы можем просмотреть в Qlik Sense и в веб-браузерах. Регистрируя эти элементы, мы можем использовать консоль, чтобы выяснить, что в них содержится и как мы можем использовать их для рисования нашей визуализации.

Наша функция рисования должна выглядеть так:

[code lang="js"]paint : function($element,layout) {
console.log($element);
console.log(layout);
}[/code]

Инициализация расширения в Qlik Sense и его просмотр

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

Откройте созданное приложение Qlik Sense и создайте новый лист на экране «App Overview».

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

После добавления диаграммы Qlik Sense предоставит вам возможность добавить ваши измерения и меры. Добавьте «Development Group» в качестве первого измерения и «Country» в качестве второго измерения. Для измерений нам нужно будет выбрать поле, которое будет использоваться, и вычисления, которые должны быть выполнены на нем. Выберите «Ожирение в%» и «Ожидаемая продолжительность жизни в возрасте 60 лет» в качестве показателей. Для функций можно использовать «sum» или «avg». Поскольку эти значения записываются на уровне страны, мы будем суммировать или усреднять только одно число, поэтому результат будет таким же. Я предлагаю функцию avg, чтобы в случае, если данные будут реструктурированы на более детальном уровне позже, показатель все равно будет рассчитывать действительный результат.

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

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

Откройте представление инструментов разработчика, нажав Ctrl + Shift + правую кнопку мыши на странице и выбрав «Show Dev Tools». Выберите «Console» сверху, чтобы просмотреть консоль JavaScript. Вы должны увидеть два элемента, которые мы выводили раньше. Вы можете использовать консоль для изучения этих элементов. Например, если я открою объект макета, я смогу найти данные, которые мы хотим получить для нашего расширения:

На изображении выше показано, где хранится одна строка данных по Албании. Мы видим, что макет содержит объект с именем qHyperCube, который содержит массив с именем qDataPages, который содержит объект с массивом с именем qMatrix, который содержит массив объектов для каждой строки данных. Каждый объект в строке представляет отдельный столбец. Мы можем использовать эту информацию для написания нашего кода JavaScript, который будет собирать данные для визуализации d3.

Мы также можем найти заголовки меток в объекте макета в qHyperCube.qMeasureInfo.qFallbackTitle:

В общем, консоль является хорошим инструментом для отслеживания и отладки кода.

Вставляем и изменяем код D3

Откройте файл «twodimscatter.js» с помощью текстового редактора.

Настройка данных и контейнера div

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

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

[code lang="js"] // получить массив данных qMatrix
var qMatrix = layout.qHyperCube.qDataPages[0].qMatrix;
// создаем новый массив, который содержит метки меры
var measureLabels = layout.qHyperCube.qMeasureInfo.map(function(d) {
return d.qFallbackTitle;
});
// Создать новый массив для нашего расширения со строкой для каждой строки в qMatrix
var data = qMatrix.map(function(d) {
// для каждого элемента в матрице создаем новый объект со свойство
// для измерения группировки, первой метрики и второй метрики

{
"Dim1":d[0].qText,
"Metric1":d[2].qNum,
"Metric2":d[3].qNum
}
});
[/code]

Теперь у нас есть массив measureLabels, который содержит текстовые значения наших меток мер, и у нас есть массив данных с нашими данными в нем. Обратите внимание, что мы не храним оба измерения в этом массиве; мы оставляем только исследуемую группу, которая используется для окрашивания точек. Это должно имитировать данные, которые принимает код d3 диаграммы рассеяния; это не требует от нас перечислять идентификаторы каждой записи, которые в нашем примере являются названиями страны.

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

[code lang="js"]
// Ширина объекта диаграммы
var width = $element.width();
// Высота объекта диаграммы
var height = $element.height();
// Идентификатор объекта диаграммы
var id = "container_" + layout.qInfo.qId;
// Проверяем, был ли элемент диаграммы уже создан
if (document.getElementById(id)) {
// если он был создан, очистите его содержимое, чтобы мы могли перерисовать его
$("#" + id).empty();
}
else {
// если он не был создан, создайте его с соответствующим идентификатором и размером
$element.append($('<div />').attr("id", id).width(width).height(height));
}[/code]

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

[code lang="js"]viz(data,measureLabels,width,height,id);[/code]

Полная функция рисования должна выглядеть так:

[code lang="js"] paint : function($element,layout) {
// получить массив данных qMatrix
var qMatrix = layout.qHyperCube.qDataPages[0].qMatrix;
// создаем новый массив, который содержит метки меры
var measureLabels = layout.qHyperCube.qMeasureInfo.map(function(d) {
return d.qFallbackTitle;
});
// создаем новый массив для нашего расширения со строкой для каждой строки в qMatrix
var data = qMatrix.map(function(d) {
// для каждого элемента в матрице создаем новый объект со свойством
// для измерения группировки, первой метрики и второй метрики
return {
"Dim1":d[0].qText,
"Metric1":d[2].qNum,
"Metric2":d[3].qNum
}
});

// Ширина объекта диаграммы
var width = $element.width();
// Высота объекта диаграммы
var height = $element.height();
// Идентификатор объекта диаграммы
var id = "container_" + layout.qInfo.qId;

// Проверяем, был ли элемент диаграммы уже создан
if (document.getElementById(id)) {
// если он был создан, очистите его содержимое, чтобы мы могли перерисовать его
$("#" + id).empty();
}
else {
// если он не был создан, создайте его с соответствующим идентификатором и размером
$element.append($('<div />;').attr("id", id).width(width).height(height));
}
viz(data,measureLabels,width,height,id);
}[/code]

Мы можем создать нашу новую функцию viz в нижней части нашего JS-файла вне оператора define(). Нам нужно определить его с соответствующим количеством входов

[code lang="js"]var viz = function(data,labels,width,height,id) {
};[/code]

Копирование кода D3

Давайте вернемся к примеру с d3, который мы хотим использовать, и скопируем JavaScript. Часть JavaScript-файла находится внутри html-файла, внутри тега <script> в теле. Мы хотим скопировать фрагмент от начала оператора «var margin» до начала оператора «</script>». Не копируйте строку «</script>»; только до линии перед ней. Затем мы можем вставить этот код в нашу пустую функцию viz. Код должен выглядеть так:

[code lang="js"]var margin = {top: 20, right: 20, bottom: 30, left: 40},
width = 960 - margin.left - margin.right,
height = 500 - margin.top - margin.bottom;

var x = d3.scale.linear()
.range([0, width]);

var y = d3.scale.linear()
.range([height, 0]);

var color = d3.scale.category10();

var xAxis = d3.svg.axis()
.scale(x)
.orient("bottom");

var yAxis = d3.svg.axis()
.scale(y)
.orient("left");

var svg = d3.select("body").append("svg")
.attr("width", width + margin.left + margin.right)
.attr("height", height + margin.top + margin.bottom)
.append("g")
.attr("transform", "translate(" + margin.left + "," + margin.top + ")");

d3.tsv("data.tsv", function(error, data) {
data.forEach(function(d) {
d.sepalLength = +d.sepalLength;
d.sepalWidth = +d.sepalWidth;
});

x.domain(d3.extent(data, function(d) { return d.sepalWidth; })).nice();
y.domain(d3.extent(data, function(d) { return d.sepalLength; })).nice();

svg.append("g")
.attr("class", "x axis")
.attr("transform", "translate(0," + height + ")")
.call(xAxis)
.append("text")
.attr("class", "label")
.attr("x", width)
.attr("y", -6)
.style("text-anchor", "end")
.text("Sepal Width (cm)");

svg.append("g")
.attr("class", "y axis")
.call(yAxis)
.append("text")
.attr("class", "label")
.attr("transform", "rotate(-90)")
.attr("y", 6)
.attr("dy", ".71em")
.style("text-anchor", "end")
.text("Sepal Length (cm)")

svg.selectAll(".dot")
.data(data)
.enter().append("circle")
.attr("class", "dot")
.attr("r", 3.5)
.attr("cx", function(d) { return x(d.sepalWidth); })
.attr("cy", function(d) { return y(d.sepalLength); })
.style("fill", function(d) { return color(d.species); });

var legend = svg.selectAll(".legend")
.data(color.domain())
.enter().append("g")
.attr("class", "legend")
.attr("transform", function(d, i) { return "translate(0," + i * 20 + ")"; });

legend.append("rect")
.attr("x", width - 18)
.attr("width", 18)
.attr("height", 18)
.style("fill", color);

legend.append("text")
.attr("x", width - 24)
.attr("y", 9)
.attr("dy", ".35em")
.style("text-anchor", "end")
.text(function(d) { return d; });

});[/code]

Изменение кода D3

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

  1. Мы можем удалить часть по загрузке данных кода D3. Наши данные уже загружены через расширение.
  2. Измените жестко заданную ширину и высоту, чтобы использовать наши входные значения
  3. Добавьте наш элемент svg, который будет содержать нашу диаграмму, к элементу div, который мы создали вместо тела html.
  4. Измените все ссылки на данные из исходного набора данных для ссылки на столбцы в нашем наборе данных расширения

  1. Удаление загрузки данных D3

В примере кода d3 примерно на полпути вниз есть строка,

[code lang="js"]d3.tsv("data.tsv", function(error, data) {
data.forEach(function(d) {
d.sepalLength = +d.sepalLength;
d.sepalWidth = +d.sepalWidth;
});[/code]

Функция d3.tsv принимает два параметра: путь к файлу и функцию обратного вызова для выполнения. Функция обратного вызова запускает код построения визуализации после загрузки файла «data.tsv». Мы хотим удалить этот вызов, а также оператор data.forEach под ним. Наша переменная данных уже заполняется, когда мы вызываем функцию viz в нашем методе рисования, поэтому нам не нужно ее изменять. Обратите внимание, что функция обратного вызова инкапсулирует не только этот оператор data.forEach, но и остальную часть кода визуализации. Поэтому, когда мы удаляем этот раздел, мы также должны удалить закрывающий «});» в конце нашего кода визуализации, который заканчивается после оператора legend.append («text»). Результат должен выглядеть примерно так:

[code lang="js"]var margin = {top: 20, right: 20, bottom: 30, left: 40},
width = 960 - margin.left - margin.right,
height = 500 - margin.top - margin.bottom;

var x = d3.scale.linear()
.range([0, width]);

var y = d3.scale.linear()
.range([height, 0]);

var color = d3.scale.category10();

var xAxis = d3.svg.axis()
.scale(x)
.orient("bottom");

var yAxis = d3.svg.axis()
.scale(y)
.orient("left");

var svg = d3.select("body").append("svg")
.attr("width", width + margin.left + margin.right)
.attr("height", height + margin.top + margin.bottom)
.append("g")
.attr("transform", "translate(" + margin.left + "," + margin.top + ")");

x.domain(d3.extent(data, function(d) { return d.sepalWidth; })).nice();
y.domain(d3.extent(data, function(d) { return d.sepalLength; })).nice();

svg.append("g")
.attr("class", "x axis")
.attr("transform", "translate(0," + height + ")")
.call(xAxis)
.append("text")
.attr("class", "label")
.attr("x", width)
.attr("y", -6)
.style("text-anchor", "end")
.text("Sepal Width (cm)");

svg.append("g")
.attr("class", "y axis")
.call(yAxis)
.append("text")
.attr("class", "label")
.attr("transform", "rotate(-90)")
.attr("y", 6)
.attr("dy", ".71em")
.style("text-anchor", "end")
.text("Sepal Length (cm)")

svg.selectAll(".dot")
.data(data)
.enter().append("circle")
.attr("class", "dot")
.attr("r", 3.5)
.attr("cx", function(d) { return x(d.sepalWidth); })
.attr("cy", function(d) { return y(d.sepalLength); })
.style("fill", function(d) { return color(d.species); });

var legend = svg.selectAll(".legend")
.data(color.domain())
.enter().append("g")
.attr("class", "legend")
.attr("transform", function(d, i) { return "translate(0," + i * 20 + ")"; });

legend.append("rect")
.attr("x", width - 18)
.attr("width", 18)
.attr("height", 18)
.style("fill", color);

legend.append("text")
.attr("x", width - 24)
.attr("y", 9)
.attr("dy", ".35em")
.style("text-anchor", "end")
.text(function(d) { return d; });[/code]
  1. Обновление значений ширины и высоты

Вторая и третья строки кода D3 указывают, что ширина и высота должны быть жестко закодированы значениями минус размер полей. В этом случае ширина и высота кодируются до 960 и 500. Мы можем заменить это нашими входными значениями ширины и высоты:

[code lang="js"] width = width - margin.left - margin.right,
height = height - margin.top - margin.bottom;[/code]
  1. Добавление элемента svg в наш контейнер

В строке var svg код d3 добавляет новый элемент svg в тело страницы. Мы можем изменить этот оператор так, чтобы код d3 выбирал созданный нами контейнерный div и вместо него добавлял новый svg.

[code lang="js"]var svg = d3.select("#"+id).append("svg")[/code]
  1. Обновление ссылки на данные, чтобы использовать правильные имена свойств

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

[code lang="js" highlight="6,7,8"]svg.selectAll(".dot")
.data(data)
.enter().append("circle")
.attr("class", "dot")
.attr("r", 3.5)
.attr("cx", function(d) { return x(d.sepalWidth); })
.attr("cy", function(d) { return y(d.sepalLength); })
.style("fill", function(d) { return color(d.species); });[/code]

Нам нужно заменить все ссылки в коде на d.sepalWidth на d.Metric1; d.sepalLength до d.Metric2 и d.side до d.Dim1.

Метки для осей также жестко закодированы, как в определении оси X, где для .text() задана строка «Sepal Width (cm)»:

[code lang="js" highlight="10"]svg.append("g")
.attr("class", "x axis")
.attr("transform", "translate(0," + height + ")")
.call(xAxis)
.append("text")
.attr("class", "label")
.attr("x", width)
.attr("y", -6)
.style("text-anchor", "end")
.text("Sepal Width (cm)");[/code]

Вместо жесткого кодирования меток для наших осей мы можем использовать введенную нами переменную для динамического применения соответствующих меток. Переменная метки – это массив, первый элемент которого является меткой для метрики 1, а второй элемент – меткой для метрики 2. Мы можем переписать ось X с помощью этой переменной:

[code lang="js" highlight="10"] svg.append("g")
.attr("class", "x axis")
.attr("transform", "translate(0," + height + ")")
.call(xAxis)
.append("text")
.attr("class", "label")
.attr("x", width)
.attr("y", -6)
.style("text-anchor", "end")
.text(labels[0]);[/code]

Результирующая функция viz со всеми этими обновлениями должна выглядеть следующим образом:

[code lang="js" highlight="4,5,29,30,41,52,59,60,61"]var viz = function (data,labels,width,height,id) {

var margin = {top: 20, right: 20, bottom: 30, left: 40},
width = width - margin.left - margin.right,
height = height - margin.top - margin.bottom;

var x = d3.scale.linear()
.range([0, width]);

var y = d3.scale.linear()
.range([height, 0]);

var color = d3.scale.category10();

var xAxis = d3.svg.axis()
.scale(x)
.orient("bottom");

var yAxis = d3.svg.axis()
.scale(y)
.orient("left");

var svg = d3.select("#"+id).append("svg")
.attr("width", width + margin.left + margin.right)
.attr("height", height + margin.top + margin.bottom)
.append("g")
.attr("transform", "translate(" + margin.left + "," + margin.top + ")");

x.domain(d3.extent(data, function(d) { return d.Metric1; })).nice();
y.domain(d3.extent(data, function(d) { return d.Metric2; })).nice();

svg.append("g")
.attr("class", "x axis")
.attr("transform", "translate(0," + height + ")")
.call(xAxis)
.append("text")
.attr("class", "label")
.attr("x", width)
.attr("y", -6)
.style("text-anchor", "end")
.text(labels[0]);

svg.append("g")
.attr("class", "y axis")
.call(yAxis)
.append("text")
.attr("class", "label")
.attr("transform", "rotate(-90)")
.attr("y", 6)
.attr("dy", ".71em")
.style("text-anchor", "end")
.text(labels[1])

svg.selectAll(".dot")
.data(data)
.enter().append("circle")
.attr("class", "dot")
.attr("r", 3.5)
.attr("cx", function(d) { return x(d.Metric1); })
.attr("cy", function(d) { return y(d.Metric2); })
.style("fill", function(d) { return color(d.Dim1); });

var legend = svg.selectAll(".legend")
.data(color.domain())
.enter().append("g")
.attr("class", "legend")
.attr("transform", function(d, i) { return "translate(0," + i * 20 + ")"; });

legend.append("rect")
.attr("x", width - 18)
.attr("width", 18)
.attr("height", 18)
.style("fill", color);

legend.append("text")
.attr("x", width - 24)
.attr("y", 9)
.attr("dy", ".35em")
.style("text-anchor", "end")
.text(function(d) { return d; });

}[/code]

Изменение CSS

Последний шаг в настройке нашего расширения – изменение CSS. Если вы посмотрите на HTML-код исходной диаграммы d3, верхняя часть кода содержит тег стиля со следующими значениями:

[code lang="css"]body {
font: 10px sans-serif;
}

.axis path,
.axis line {
fill: none;
stroke: #000;
shape-rendering: crispEdges;
}

.dot {
stroke: #000;
}[/code]

Мы можем изменить этот код и поместить его в наш файл twodimscatter.css. Мы должны внести следующие изменения:

  1. Измените стиль «body», чтобы применить к нашему объекту контейнера вместо него
  2. Добавьте класс «.qv-object-twodimscatter» чтобы наш CSS не влиял ни на какие элементы вне нашего объекта диаграммы, которые имеют классы, такие как «dot», или элементы, такие как пути и линии.

Добавление этих изменений приводит к файлу twodimscatter.css, например, так:

[code lang="css"].qv-object-twodimscatter div.qv-object-content-container {
font: 10px sans-serif;
}

.qv-object-twodimscatter .axis path,
.qv-object-twodimscatter .axis line {
fill: none;
stroke: #000;
shape-rendering: crispEdges;
}

.qv-object-twodimscatter .dot {
stroke: #000;
}[/code]

Просмотр расширения

После внесения этих изменений мы можем сохранить все наши файлы и просмотреть изменения в нашем приложении. Откройте приложение Qlik Sense и перейдите к листу с объектом расширения. Если лист уже открыт, нажмите «F5», чтобы обновить страницу. Расширение теперь будет отображать диаграмму рассеяния с цветной легендой. Вы можете изменить лист, чтобы добавить списки и другие диаграммы, чтобы использовать ассоциативную модель Qlik Sense с этим расширением d3.

Следующие шаги

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

Весь исходный код этого расширения можно найти здесь.

Дополнительные ресурсы

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

 

21 совет и рекомендация для Qlik

Вот 21 совет и рекомендация, которые помогут вам в разработке и проектировании приложений с использованием QlikView и Qlik Sense. Большинство из них относятся к обоим продуктам, но некоторые относятся только к QlikView. Это ясно показано в каждом разделе. Некоторые чисто технические, другие помогут при построении любых объектов.

  1. Делаем комментарий
  2. Комментируем оператор
  3. Делаем выход из скрипта
  4. Быстрое удаление
  5. Придерживаемся скрипта
  6. Ограничиваем загрузку
  7. Apply Map по умолчанию
  8. Подсказка для include
  9. Обозреватель таблиц/Модель данных – ваш друг!
  10. Избегайте if
  11. Краш-тест
  12. Лучше «Сохранить», чем сожалеть
  13. Храните данные снаружи
  14. Больше постоянных временных таблиц
  15. «Стоительные леса»
  16. Один календарь
  17. Храните все свои данные в одном месте
  18. Цветной Копир
  19. Интересное выражение
  20. Куда ушел этот Объект?
  21. Если есть сомнения, загуглите

 

  1. Делаем комментарий

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

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

 

  1. Комментируем оператор

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

Отметьте текст в QlikView, а затем щелкните правой кнопкой мыши, чтобы оставить комментарий или раскомментировать.

В Qlik Sense отметьте текст, затем используйте значок комментария.

Вы также можете закомментировать целый раздел скрипта, поместив маркеры в начале и в конце.

/* чтобы отметить начало закомментированного раздела.

*/ чтобы отметить конец закомментированного раздела.

Пример:

 

  1. Делаем выход из скрипта

Если вам нужно отладить сложный скрипт, создайте в ней вкладку с командой «EXIT SCRIPT» (Выход из скрипта).

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

 

  1. Быстрое удаление

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

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

 

  1. Придерживаемся скрипта

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

В скрипте больше силы и гибкости.

Выполнение сложных действий в скрипт упрощает измерения и выражения для вас и других при создании визуализаций.

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

 

  1. Ограничиваем загрузку

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

Это доступно в QlikView и Sense, как показано ниже.

 

 

  1. Apply Map по умолчанию

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

Например. ApplyMap(‘MyMappingTable’, LookUpField, ‘No match’)

Найдите значение «No match» (Нет совпадений) в этом поле, чтобы найти дыры в данных сопоставления.

 

  1. Подсказка для include

При использовании включаемых файлов команда $(include) не будет работать автоматически (сообщение об ошибке не появится), если включаемый файл не найден.

Вместо этого используйте $(Must_Include), так как это приведет к сообщению об ошибке, если файл включения отсутствует.

 

  1. Обозреватель таблиц/Модель данных – ваш друг!

Используйте средство просмотра таблиц (QV) или средство просмотра моделей данных (QS) каждый раз, когда добавляете таблицы или вносите изменения в связи между таблицами.

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

 

  1. Избегайте if

Избегайте использования операторов if в диаграммах и табличных выражениях, особенно если у вас большой объем данных.

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

Анализ множества – лучший вариант…

… но это тема для отдельного поста.

 

  1. Краш-тест

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

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

Попробуйте закрыть все экземпляры рабочего стола QlikView, а затем повторите попытку.

 

  1. Лучше «Сохранить», чем сожалеть

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

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

 

  1. Храните данные снаружи

В QlikView и Qlik Sense вы можете открыть недавно открытое приложение без данных.

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

В QlikView выберите «Start Page» (Начальная страница), затем «Recently Opened Documents» (Недавно открытые документы), выберите нужный документ, затем щелкните правой кнопкой мыши и выберите ‘Open <app name> Without Data’ (Открыть <имя приложения> Без данных).

В Qlik Sense щелкните правой кнопкой мыши приложение в концентраторе и выберите «Open without data» (Открыть без данных).

 

  1. Больше постоянных временных таблиц

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

Отладка проблем в этих таблицах может быть затруднена, так как они временные. Но есть хитрость, которую можно здесь применить – использовать команду STORE для записи их в QVD. Файл QVD можно просмотреть после перезагрузки, чтобы увидеть, какие данные были в таблице на тот момент.

 

  1. «Строительные леса»

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

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

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

 

  1. Один календарь

В большинстве приложений используется выбор даты (финансовые периоды, диапазоны дат и т. д.). Лучший способ работать с этим – использовать основной календарь.

Как правило, все данные в приложении должны быть связаны с основным календарем. Старайтесь не использовать два или более выбора даты, так как это может сбить пользователя с толку и повлечь много работы для поддержания разделения.

 

  1. Храните все свои данные в одном месте

Мы часто работаем с данными из более чем одной системы. Каждая система обычно имеет свою таблицу данных с датами и набором измерений.

Один из способов обойти потенциальную неразбериху, которая может возникнуть в ассоциативной модели (используемой QlikView и Qlik Sense) является объединение всех данных в одну таблицу. Это упрощает соединения и работает очень хорошо.

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

 

  1. Цветной Копир

QlikView позволяет копировать и вставлять цвета везде, где они используются. Даже те цвета, которые определены с помощью логики в выражении.

Просто щелкните правой кнопкой мыши в поле цвета и выберите «Copy» (Копировать), найдите место назначения для того же цвета, а затем выберите «Paste All» (Вставить все).

 

  1. Интересное выражение

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

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

 

  1. Куда ушел этот Объект?

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

Это работает очень хорошо, если вы не ошибетесь в логическом условии – тогда они могут исчезнуть без следа.

Их можно восстановить, выполняя для листов следующие действия:

Document Properties (Свойства документа) > Sheets (Листы)

Или следующее для объектов:

Sheet Properties (Свойства листа) > Objects (Объекты).

 

  1. Если есть сомнения, загуглите.

Множество информации о QlikView и Qlik Sense содержится на форуме Qlik.

Язык скриптов и функций QlikView и Qlik Sense практически идентичны, так что информация поможет для обеих систем в большинстве случаев.

 

Контрольный список по производительности Tableau

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

Конечно, могут возникнуть проблемы. Контрольный список производительности Tableau даст вам рекомендации как повысить производительность.

Список

Контрольный список производительности Tableau разделен на семь основных категорий.

Данные

  • Пусть анализ будет простым. Работайте с подмножеством данных.
  • Вводите только данные, необходимые для анализа. Попробуйте добавить фильтр источника данных или использовать экстракт. При использовании объединения минимизируйте количество объединяемых таблиц.
  • Используйте «Describe» (Описать), чтобы исследовать измерения в новых наборах данных, не загружая их в viz (сочетание клавиш CTRL + E).
  • Удаляйте неиспользуемые столбцы (меры/измерения), чтобы минимизировать время обновления экстракта или время пользовательского запроса SQL.
  • Создайте опубликованный файл TDS для вашей бизнес-группы, а не для каждого аналитика, создающего собственный источник данных. Сюда входят все метаданные, связанные с измерениями, мерами, вычисляемыми полями, иерархиями, наборами, параметрами и соглашениями об именах.
  • Используйте экстракты везде, где это возможно, чтобы ускорить производительность. Скрывайте неиспользуемые и конфиденциальные поля. Сверните детализацию данных путем предварительной агрегации или фильтрации. Разбейте иерархии только на видимые измерения.

Фильтрация

  • Минимизируйте количество быстрых фильтров. Используйте действия фильтра панели инструментов там, где это возможно.
  • Избегайте выбора «Only relevant values» (Только соответствующие значения) для ваших быстрых фильтров. Это требует последовательных запросов. Не используйте это, когда не нужно.
  • Избегайте быстрых фильтров высокой мощности (множественный выбор или выпадающие списки). Быстрые фильтры высокой мощности медленно загружаются и отображаются.
  • Избегайте быстрых фильтров или действий, которые управляют фильтрами контекста. Они требуют перезагрузки таблицы контекста, и их следует избегать везде, где это возможно.
  • Пусть диапазон быстрого фильтра будет простым. Чем сложнее диапазон, тем медленнее запрос.
  • Замените быстрые фильтры, показывающие «Only Relevant Values» (Только релевантные значения) и большое количество быстрых фильтров, на фильтрацию с панели мониторинга. Они будут каскадно взаимодействовать с вашим пользователем и работать быстрее.
  • Не ленитесь с пользовательскими фильтрами. Безопасность от пользовательских фильтров может повлиять на производительность на сервере Tableau, поскольку сервер не может совместно использовать соединения и кэши запросов, если пользовательские фильтры активны. Подумайте о создании сводного представления, которое представляет собой независимый от пользователя обзор с использованием предварительно агрегированного извлечения со скрытыми основными данными. Для подробного просмотра ограничьте его конкретными пользователями или группами активных каталогов вместо пользовательских фильтров.

Пользовательский SQL

  • Ограничьте пользовательский SQL в живых соединениях так как они могут быть неэффективными. Там, где это возможно, создайте представление на сервере базы данных для реализации вашего собственного SQL и подключите Tableau к вашему представлению.
  • Избегайте параметров в пользовательском SQL в Tableau. Tableau оборачивает пользовательский SQL в подзапрос, который многие базы данных плохо обрабатывают. Рассмотрите возможность создания представления в базе данных или используйте объединение с несколькими таблицами с фильтрами.
  • Следите за бесполезными стоками, например, ORDER BY. Tableau пересортирует данные после загрузки в любом случае.

Вычисления

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

Построение

  • Избегайте множества отметок. Больше отметок = больше времени рендеринга. Ограничивайте использование подробных текстовых таблиц с большим количеством отметок.
  • Минимизируйте размер файла изображений или пользовательских форм, где это возможно. Храните изображения размером менее 50 КБ.
  • Если используются пользовательские рисунки, используйте PNG с прозрачным фоном вместо JPG. Отображения станет чище, а файлы форм займут меньше места.

Локальные вычисления

  • Даже если рабочая книга опубликована на сервере Tableau, локальные вычисления по-прежнему влияют на производительность. По возможности используйте Tableau Server, ограничивая локальные вычисления, такие как группы, иерархии, контрольные линии, вычисления таблиц и смешивание.
  • Табличные вычисления довольно мощные, но они могут выполняться медленно. Они зависят от локального механизма вычислений и могут требовать много памяти.

Макет информационной панели

  • Ограничивайте количество рабочих листов на информационной панели. Если у вас есть более четырех визуализаций на одной панели, лучше пересмотрите ее.
  • Исправьте размер информационной панели относительно потребления конечным пользователем. Автоматическое определение размера менее эффективно, чем указание размера панели.

 

11 лучших советов и приемов QlikView

 1.  Выбор нескольких объектов – для этого просто выберите объекты с помощью мыши (так же, как вы выбираете несколько элементов на рабочем столе компьютера). Если ваша панель управления огромна, и вы не видите все объекты, которые хотите выбрать, или они просто не расположены рядом, используйте Shift. Держите его нажатым и добавляйте объекты в выделение, щелкая по их названиям.

При выборе с помощью мыши убедитесь, что выбран весь объект. Если вы пропустите 1 пиксель, QV не добавит этот объект в выделение.

2.  Массовое изменение свойств для нескольких выбранных объектов. Щелкните правой кнопкой мыши по заголовку любого из выбранных объектов и выберите «Properties» (Свойства) (или просто нажмите Ctrl + Enter). После этого вы сможете изменить параметры Font/Layout/Caption (Шрифт/Макет/Заголовок) для всех объектов одновременно.

 

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

 

4. Перемещайте заблокированные объекты с помощью клавиши Alt. Перемещение заблокированных объектов с помощью клавиши весьма простое: если у объекта в конструкторе нет опции «Allow move/size» (Разрешить перемещение / размер), вы не сможете его переместить. Если, конечно, вы нажмете Alt, прежде чем пытаться это сделать. Курсор изменится, чтобы уведомить вас о том, что объект является подвижным:

 

5. Изменение размера / перемещение частей графика. Удерживайте Ctrl + Shift, когда выбран объект Chart (График). Используя этот метод, вы можете, например, переместить (и закрепить) легенду внизу диаграммы:

 

6.  Перемещение объекта между листами. Чтобы переместить объект на другой лист, выберите его и перетащите поверх нужного имени листа. Когда появится белая стрелка (как на картинке) – отпустите кнопку. Это очень полезно, так как стандартная операция «Вырезать -> Вставить» изменяет идентификатор объекта, что не очень хорошо, когда вы строите макрос вокруг существующей структуры. Этот метод будет перемещать именно тот объект, который перетаскивается, вместо создания нового экземпляра этого объекта.

 

7.  Перемещение выбранного объекта на 1 пиксель в каждом направлении с помощью Ctrl + клавиш со стрелками – перемещение выбранного объекта на 1 пиксель (это также работает с заблокированными объектами!)

8.  Перемещение выделенного объекта на 10 пикселей в каждом направлении с помощью клавиш Ctrl + Shift  + клавиши со стрелками – переместите выбранный объект на 10 пикселей (это также работает с заблокированными объектами!):

9.  Переключение между открытыми файлами QVW, нажимая Ctrl + TAB

10.  Открыть окно с подробной технической информацией документа – нажмите Ctrl+ Shift + Q

11.  Самые полезные (на мой взгляд) комбинации Qlikview:

  • Обзор выражений: Ctrl+ Alt + E
  • Открыть редактор скрипта: Ctrl+ E
  • Перезагрузить документ: Ctrl+ R
  • Активировать предыдущий/следующий лист: F6/ F7
  • Открыть свойства объекта: Alt+ Enter
  • Комментировать/раскомментировать код: Ctrl+ K C / Ctrl + K U
  • Ввести пример кода: Ctrl+ Q Q

 

Блок-схема оптимизации производительности Tableau

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

 

Устранение проблем с производительностью таблицы

Мы начнем с простого, общего вопроса: «Почему моя информационная панель Tableau работает медленно?». Если мы знаем, что вызывает замедление, мы спрашиваем: «Что я могу сделать, чтобы это исправить?» Ответы делятся на несколько основных категорий:

  • Нагрузка на серверах Tableau
  • Чувствительность базы данных (включая экстракты из Tableau)
  • Количество данных для отображения
  • Обновление элементов пользовательского интерфейса, таких как выпадающие фильтры
  • Эффективность расчёта

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

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

Вы можете скачать полную PDF-версию диаграммы. Вот краткий обзор первой страницы

Не забывайте: время загрузки – это еще не все

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

  • Как долго люди должны ждать изменений в дизайне панели инструментов?
  • Сколько времени требуется пользователю, чтобы понять представленные данные?
  • Требуется ли несколько кликов (и ждать между каждым кликом), чтобы получить желаемое представление?

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

Дальнейшее чтение

Любой, кто разрабатывает информационные панели Tableau, должен прочитать официальный документ Tableau «Designing Efficient Workbooks». Это долго, но оно стоит потраченного времени.

 

 

63 queries in 0,384 seconds