Статьи

Бизнес-аналитика с CouchDB и NoFlo

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

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

Но сначала вот как выглядит наша система:

Proggis отображает план проекта IKS

Откуда поступают данные?

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

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

В случае IKS, большая часть данных была доступна в виде ряда электронных таблиц. С их помощью мы создали необходимые рабочие процессы для того, чтобы сначала преобразовать электронные таблицы в XML с помощью Apache Tika , а затем извлечь из них информацию в разумном подмножестве JSON-LD.

Поскольку IKS является совместным проектом, информация должна собираться из разнообразной группы партнерских организаций. Некоторые из них имеют системы, которые предоставляют необходимые API (например, Basecamp , который мы используем), и мы можем просто периодически импортировать данные. Но со многими мы выбрали простой подход к обмену данными: электронные таблицы обрабатываются по электронной почте.

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

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

Обеспечение согласованности данных

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

Таким образом, если какой-либо партнер случайно отправил неверные данные или что-то еще сломалось, полученная неверная информация может быть легко удалена. Здесь можно использовать возможности управления версиями CouchDB.

Анализ данных

CouchDB построен на основе концепции карты / уменьшения. Здесь вы можете изменять и комбинировать данные различными способами, используя простые функции JavaScript . В нашем случае мы решили написать весь наш код CouchDB на CoffeeScript для простоты. Например, вот функция сокращения в CoffeeScript, которая подсчитывает общее время, запланированное, использованное время и оставшееся время для задачи или партнера в проекте:

(keys, values, rereduce) ->
    roundNumber = (rnum, rlength) ->
        Math.round(parseFloat(rnum) * Math.pow(10, rlength)) / Math.pow(10, rlength)
    data =
        planned: 0.0
        spent: 0.0
        left: 0.0

    if rereduce
        for reducedData in values
            data.planned += reducedData.planned
            data.spent += reducedData.spent
        data.left = data.planned - data.spent
        return data

    for doc in values
        if doc['@type'] is 'effortallocation'
            data.planned += roundNumber doc.value, 1
        if doc['@type'] is 'effort'
            data.spent += roundNumber doc.value, 1
    data.left = roundNumber data.planned - data.spent, 1
    return data

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

Визуализация данных

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

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

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

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

В двух словах

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

  • Apache CouchDB — центральное хранилище данных
  • Все данные хранятся в виде сущностей JSON-LD
  • NoFlo обрабатывает все импорт данных
  • Аналитика на основе данных выполняется с помощью карты CouchDB / уменьшить
  • Визуализация происходит с CouchApp с использованием JavaScript InfoVis Toolkit

Простая архитектура для системы бизнес-аналитики

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

Использование JSON-LD для хранения данных имеет большой смысл, так как таким образом легко обрабатывать отношения между различными частями информации. А использование URI для идентификаторов данных означает, что вы можете легко объединять информацию, поступающую из разных источников вместе.

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