С момента прошлой публикации пришлось примеряться к ряду различных задач, связанных тем или иным образом с обработкой данных. Задачи совершенно разные, но во всех случаях инструменты R позволили элегантно и эффективно их решить. Ниже, собственно, кейсы (картинок нет).
Case #1: Анализ документов (Web-scrapping)
Постановка проектной задачи проста. Необходимо провести экспертный анализ документов, доступных только по запросам на веб портале и по относящимся к исходной задаче составить аналитический отчет. Звучит просто если бы не следующие нюансы:
- БД документов недоступна напрямую.
- Никакого API к порталу не существует.
- Документы по прямой ссылке нельзя адресовать, только через механизм создания сессионного подключения и поиска.
- Полный текст документа недоступен, его показ формируется JS скриптами для «постраничного» листания.
- По каждому из подходящих документов необходимо, опираясь на plain text 1-ой страницы сделать реферативную сводку по его атрибутам.
- Документов ~100 тыс, реально относящихся к задаче ~0.5%, времени на первый релиз ~ 1 неделя.
Группа «классических» аналитиков засучили рукава и ушли в сверхурочный режим чтения и ручной обработки документов. Ни времени ни желания убеждать в ущербности этого подхода не было.
Мы пошли другим путем, а именно, веб-скраппинг средствами R. По поводу веб-скраппинга в интернете и на хабре достаточно много материалов, не буду повторяться. Пример подобной публикации на хабре: «Web Scraping с помощью python».
В классическом подходе для подобных задач используют Perl\Python, но мы решили не делать микс из инструментов, а использовать R в боевых условиях. Задача была решена более чем успешно в таких конечных метриках:
- 0.5 дня на анализ портала (структура, запросы, ответы, навигация) средствами разработчиков, встроенных в Chrome\Firefox.
- 1 день на разработку R скриптов по подготовке списков документов и их последующему атрибутивному обогащению.
- ~8 часов на формирование задач, автоматизированный сбор данных и формирование табличного представления.
- ~2 дня на ручное ознакомление со списком, отсечение лишнего и прочтение потенциально подходящих документов. После прочтения неподходящими были признаны лишь пара десятков документов.
Несмотря на то, что документы генерировались динамически (JS), удалось найти лазейку по получению 1-ой страницы, а там были все необходимые атрибуты, и тем самым обойтись без Selenium\PahntomJS. Это существенно ускорило процесс сбора данных.
Более того, поскольку веб-запросы работают в асинхронном режиме, задача была распараллелена (средствами R). Время ~8 часов указано для исполнения на 4-х ядрах, так оно было бы раза в 3 дольше.
Группа «классических» аналитиков упорно продолжает работать...
Технические детали
- Для парсинга страниц и выбора необходимого контента использовались различные комбинации методик XPath+regexp.
- Весь код составил ~200 строк из которых 50% — комментарии и переносы длинных строк для соблюдения code conventions.
- Подключенный явными декларациями набор пакетов:
library(lubridate)
library(dplyr)
library(tidyr)
library(tibble)
library(readr)
library(stringi)
library(stringr)
library(jsonlite)
library(magrittr)
library(curl)
library(httr)
library(xml2)
library(rvest)
library(iterators)
library(foreach)
library(doParallel)
library(future)
Case #2: Прогнозирование качества фабричной продукции
Постановка задачи также очень проста.
Есть технологическая линия по производству из сырья продукта. В ходе технологического процесса сырье подвергается различной физической обработке, а именно, пресс, формование, хим. обработка, нагрев… Метрики на отдельных процесса измеряются с разной периодичностью, и разными способами. Где-то автоматически, где-то, вручную, например, лабораторный контроль исходного сырья. Совокупно метрик ~50-60 шт. Длительность процесса составляет 1.5-2 часа.
Задача — получить выходную продукцию с заданными физическими параметрами.
Сложности возникают, когда опускаемся чуть ниже:
- Точной аналитической модели тех.процессов нет.
- Параметры сырья меняются от загрузки к загрузке.
- Поддерживается модель заказного производства, когда параметры выходного продукта должны меняться в соответствии с текущим заказом.
- «Эксперименты» по перестройке параметров технологической линии по принципу обратной связи оборачиваются бизнесу слишком дорогой ценой. За 1.5-2 часа полного цикла до выхода продукции будет переведена не одна тонна сырья. Если параметры линии выставлены неправильно — будет брак, заказ надо переделывать.
Необходимо правильно выставлять параметры линии сразу со старта производства заказа и корректировать их по мере тех. процесса для нивелирования возможных флуктуаций в процессе производства.
Что имели на входе:
- Описание технологического процесса.
- Excel «простыни» с элементами VBA автоматизации, содержащих значения параметров при выпуске того или иного заказа. Разные смены и разные фабрики — немного отличающийся стиль заполнения.
Сложная для обычных средств задача средствами R решилась в 2 шага:
- Адаптивный импорт excel данных в структурированное представление.
- Применение алгоритма RandomForest для построения прогнозной модели.
- Редукция списка параметров исходя из результатов прогонов RandomForest и общих физических соображений по техпроцессу.
Полученная точность прогнозирования параметров выходной продукции в размере 3-5% оказалась вполне достаточной и адекватной нормативам.
Для справедливости необходимо отметить, что это все было выполнено в режиме «proof-of-concept». После демонстрации решаемости «нерешаемой» задачи и чуть более детальной проработки решения акцент сместился в область улучшения процедур измерения технических параметров. Это как раз тот случай, когда оперативное применение R позволило расчистить сознание от вторичных цифровых задач и вернуться к первичным проблемам физического мира.
Технические детали
- Весь код составил ~150 строк из которых 30% — комментарии и переносы длинных строк для соблюдения code conventions.
- Подключенный явными декларациями набор пакетов:
library(dplyr)
library(lubridate)
library(ggplot2)
library(tidyr)
library(magrittr)
library(purrr)
library(stringi)
library(stringr)
library(tibble)
library(readxl)
library(iterators)
library(foreach)
library(doParallel)
library(zoo)
library(randomForest)
Case #3: Сводная аналитика и верификация в разношерстной продуктивной среде
Постановка задачи:
- Есть сотни выгрузок из SAP в формате Excel по иерархическим объектам. Форматы выгрузок ориентированы на визуальное восприятие человеком и крайне неудобны для восприятия машиной.
- Есть Excel выгрузки из сторонних систем + данные ручного ввода\оцифровки.
- Есть данные в базах Access.
Совокупно может быть несколько сотен тысяч\миллионов записей по всем объектам, подлежащим анализу.
Необходимо:
- Проводить выверку данных в рамках отдельного отчета по кастомным многопараметрическим правилам.
- Проводить кросс-сверку данных из различных источников данных по кастомным многопараметрическим правилам. Результаты расхождений выдавать аналитикам.
- Ежемесячно готовить сводные аналитические отчеты на основе всего этого массива информации. Сотни страниц с различными графическими и табличными представлениями
- Предоставить инструменты аналитику для оперативной произвольной манипуляции с данными по заранее неизвестным правилам.
Предполагаемые пути решения до начала PoC на базе R:
- разработка на SAP (прогнозируемый срок исполнения 5-7 лет, не все требования легко закрываются);
- разработка на access (прогнозируемый срок исполнения 1-1.5 года, не все требования закрываются);
- разработка на чем-то еще (прогнозируемый срок исполнения ???).
Да, задача масштабная просто потому что много данных и отчетов, отнюдь не на 2 дня.
Для доказательства реализуемости провели за неделю «proof-of-concept» на базе R.
В рамках PoC охватили:
- Импорт excel данных с поддержкой «плавающего» формата данных
- Импорт access данных.
- Реализацию подмножества проверок (числовых, текстовых, комбинированных).
- Генерация графических\табличных представлений.
- Генерация html\doc представление с графикой, текстом, таблицами.
- Интерфейс аналитика для работы с данными
В целом, по результатам пилота было получено подтверждение технической реализуемости всех требований; обрисован потенциал по развитию; получены оценки по трудозатратам на реализацию с применением R. Оценки по сравнению с SAP ниже на порядок и более. Возможности по автоматизации и настройке многократно превышают все прочие решения.
Технические детали PoC
- Весь код составил ~500 строк из которых 20% — комментарии и переносы длинных строк для соблюдения code conventions.
- Время импорта массивов данных — секунды.
- Время исполнения проверок — секунды.
- Время генерации выходных отчетов (html\doc) — доли минут.
- Подключенный явными декларациями набор пакетов:
library(dplyr) library(lubridate) library(ggplot2) library(tidyr) library(magrittr) library(purrr) library(stringi) library(stringr) library(tibble) library(readxl) library(iterators) library(foreach) library(doParallel) library(zoo) library(gtable) library(grid) library(gridExtra) library(RColorBrewer) library(futile.logger)
Заключение
Факты есть факты. Можно в R верить, можно не верить; можно сомневаться в возможностях; можно по сто раз проверять и дожидаться, пока с трибун не возвестят, что действовать надо так… Но те, кто наберутся смелости и терпения и заменят старые подходы по обработке данных на платформу R получат многократную экономию и преимущества здесь и сейчас.
Предыдущий пост: «Применение R для подготовки и передачи «живой» аналитики другим бизнес-подразделениям»