Data Science «спецназ» собственными силами

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


    Все дело в том, что, в отличии от классических проектов по поставке железа или внедрению вендорских решений, укладывающихся в линейную модель исполнения, задачи, связанные с продвинутой аналитикой (data science) очень трудно формализуются в виде четкого и однозначного ТЗ в виде достаточным для передачи исполнителю. Ситуация отягощается тем, что для реализации задачи требуется интеграция массы различных внутренних ИТ систем и источников данных, часть вопросов и ответов может появиться только после того, как начинается работа с данными и вскрывается реальное положение дел, сильно отличающееся от документальной картины мира. Это все означает, что для написания грамотного ТЗ необходимо провести предварительную часть работы сопоставимую с половиной проекта, посвященную изучению и формализации реальных потребностей, анализу источников данных, их связей, структуры и пробелов. В рамках организаций сотрудников, которые способны провернуть такую масштабную работу, практически не бывает. Вот и получается, что на конкурсы выкладывают совсем сырые требования. В лучшем случае конкурсы отменяются (отправляются на доработку) после цикла уточняющих вопросов. В худшем случае — за громадный бюджет и длинные сроки получается нечто, совершенно не похожее на планы авторов требований. И остаются они у разбитого корыта.


    Разумной альтернативой является создания внутри компании команды data science (DS). Если не замахиваться на строительство египетских пирамид, то команда и 2-3 грамотных специалистов может сделать весьма и весьма много. Но тут возникает другой вопрос, как подготовить этих спецов. Ниже хочу поделиться набором успешно апробированных соображений по быстрой подготовке такого «спецназа» с R в качестве оружия.


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


    Проблематика


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


    • нет возможность обучаться месяцы, результат нужно получать максимально быстро;
    • необходимо ставить акцент на реальные задачи компании;
    • в промышленном DS много больше задач, связанных с обработкой данных, нежели с AI\ML;
    • промышленный DS не арт-хаус, а структурированная деятельность, воплощающаяся в виде стабильно работающего кода приложений.

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


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


    В результате различных экспериментов получился структурный подход «Deep Dive Into R» к подаче базового материала.


    Погружение в R


    • Оптимальная продолжительность курса — 50 часов (~ 7-9 дней по 7-6 часов).
    • Ключевая цель курса — формирование практических навыков по быстрому написанию качественного и эффективного кода с применением оптимальных алгоритмов.
    • Комплексные демонстрационные примеры лучше всего создавать на конкретных задачах — так можно ознакомиться с инструментами и подходами гораздо быстрее.
    • Большое количество рассматриваемых вопросов служит для формирования представления и «закладок» о возможностях экосистемы.
    • Подневная разбивка не догма, а плановое управление фокусом.
    • В рамках каждого дня для демонстрации и закрепления материала разбираются практические задачи разной степени сложности и объемности.

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


    День 1


    Кратко об R. Синтаксис и структура языка. Основы применения IDE RStudio для анализа и разработки. Базовые типы и данных. Интерактивные вычисления и исполнение программного кода. Краткое знакомство c R Markdown и R notebook. Принципы работы с библиотеками. Подготовка к аналитической работе, установка необходимых библиотек, создание проекта. Принципы профилировки вычислений, поиск узких (крайне длительных) мест и их устранение.


    • History and Ecology of R
    • RStudio Cheatsheets
    • Getting-started-with-R-Markdown
    • Критерии качества обучения/работы: быстро пишем быстрый и компактный код с применением оптимальных алгоритмов
      • Векторизация
      • Оценка скорости исполнения кода: system.time, tictoc, benchmark, bench, profvis
      • Оценка производительности системы: benchmarkme
    • Экосистема R, основы языка
    • Значения NA, NULL, NaN.
    • Операторы =, ==, <-
    • Функции is.na(), is.null(), is.nan(), (is.finite(), is.infinite())
    • Subsetting & slicing

    День 2


    Концепция и экосистема пакетов ‘tidyverse’ (https://www.tidyverse.org/). Краткий обзор входящих в него пакетов (импорт/обработка/визуализация/экспорт). Концепция tidy data как основа методов работы в tidyverse. ‘tibble’ как формат представления данных. (Пакеты из экосистемы tidyverse). Преобразования и манипуляции с данными. Синтаксис и принципы потоковой обработки (pipe). Группировка - вычисление - сборка. (Пакеты tibble, dplyr, tidyr.)



    День 3


    Формирование графических представлений средствами ggplot (https://ggplot2.tidyverse.org/reference/index.html). Использование графических средств для анализа бизнес-данных.



    День 4


    Работа со строковыми и перечислимыми типами. Основы регулярных выражений. Работа с датами. (Пакеты stringi, stringr, forcats, re2r, lubridate, anytime)



    День 5


    Расширенный импорт данных. txt, csv, json, odbc, web scrapping (REST API), xlsx.
    (Пакеты readr, opexlsx, jsonlite, curl, rvest, httr, readtext, DBI, data.table)


    • Рабочая директория. getwd(), setwd(). Применение пакета here
    • Add-in rspivot. rspivot is a Shiny gadget for RStudio for viewing data frames.
    • Пакет и add-in datapasta.
    • Introduction to readr. Пробежаться по особенностям специфицирования колонок.
    • работа с Excel:
    • Web-scrapping на демо-примере:

    День 6


    Экспорт данных. rds, csv, json, xlsx, docx, pptx, odbc. Основы R Markdown и R Notebook.
    (Пакеты opexlsx, officer, DBI, jsonlite, readr, data.table, knitr)


    В т.ч.


    • Создание презентаций средствами R officer.
    • Экспорт в PDF через knit -> LaTeX
    • Прямой экспорт в Word

    День 7


    Основы программирования в R. Создание функций. Область видимости переменных. Просмотр объектов. Просмотр объектов, их структуры. Принципы работы «по ссылкам».


    • Понятие функции. Создание собственных функций.
    • Концепция окружения. Advanced R. 7 Environments
    • for loop, while loop
    • purrr tutorial
    • концеппция "безопасных" вычислений, применение их в пакетном анализе (safely)
    • Profvis — Profiling tools for faster R code
    • Подход lazy_evaluation, non-standard evaluation, пакет lobstr

    День 8


    Подходы к валидации промежуточных и финальных результатов. Принципы совместной работы и формирования воспроизводимых вычислений. Демонстрация shiny приложений, как целевого интерфейса для конечных потребителей. (Пакеты checkmate, reprex, futile.logger, shiny)



    День 9


    Методы и подходы в работе с данными «среднего» размера. Пакет data.table. Основные функции. Сравнительный экспериментальный анализ.
    Обзор дополнительных вопросов, появившихся за 1-8 день.


    День 10


    Защита курсовой


    Требования к рабочим местам участников на базе Windows 10



    Книги



    Заключение


    1. Предлагаемая последовательность подачи материала не является догмой. Могут быть различные отступления и включения доп. материалов, включая математические вставки. Все определяется реальными актуальными вопросами и задачами, которые будут определены для курсовых и списком востребованных производственных вопросов. Наиболее популярными оказываются алгоритмы регрессии, кластеризации, text mining, работа с временными рядами.
    2. Вопросы параллельных вычислений, создания shiny приложений, использования ML алгоритмов и внешних платформ не умещаются в концепцию «быстрого погружения», но могут являться продолжением после начала практической работы.

    P.S. Обычно у HR возникают сложности с формулировкой требований к вакансии.
    Вот возможный пример для затравки. Каждый дополняет и правит исходя из своих ожиданий.


    Data Science (DS): большие данные и аналитика. Требования к вакансии


    • Образование:
      • Техническое или естественно научное высшее.
      • Приветствуется наличие сертификатов по предметным курсам (Coursera, DataCamp).
      • Английский язык в активе (свободное чтение технической литературы, уверенное понимание устной неадаптированной речи, разговорный язык на уровне технического общения).
    • Опыт работы:
      • В области DS – не менее 1 года.
      • Опыт командной разработки ПО по гибким (agile) методологиям – не менее 2 лет.
      • Наличие опыта разработки пользовательских интерфейсов (WEB + JS).
      • Наличие опыта разработки документации.
    • Уверенное владение следующими технологиями (минимум, 30% из списка):
      • SQL + No-SQL backend (хотя бы по одной из БД каждого типа).
      • Open-source языки программирования для задач DS (Python, R, либо оба).
      • Платформы для хранения и обработки больших данных (Hadoop и его производные, Spark\Ignite, ClickHouse, Vertica, ELK стек … )
      • Основы HTML+JS+CSS в разрезе разработки web-GUI для конечных пользователей.
      • Уверенное владение основами математической статистики и линейной алгебры.
      • Временные ряды (включая прогнозирование и поиск аномалий).
      • Машинное обучение, нейронные сети.
      • Text mining и регулярные выражения.
      • Основы администрирования windows+nix систем.
      • Инструменты и алгоритмы для обработки и визуализации геоинформации (ESRI, OpenStreet, Yandex Maps, Google Maps, leaflet, ..), работа с shapе и GPX файлами.
      • Импорт данных в data science инструменты и их нормализация (файлы, ODBC, REST API, Web — crawling).
      • Визуализация (Tableau, QlikView, Excel, Shiny\Dash).
      • Коммерческие математические пакеты (Wolfram Mathematica, Maple, Matlab).
    • Должностные обязанности:
      • Обследование и подготовка исходных данных.
      • Выработка гипотез и их проверка на исходных данных.
      • Разработка математических моделей и их апробация.
      • Разработка программных проектных решений.
      • Разработка WEB-приложений и интерактивных дашбордов.
      • Разработка hard-copy отчетов.
      • Настройка, тестирование, развитие и сопровождение аналитического контура.
      • Актуализация проектной документации.

    Предыдущая публикация — «Насколько R быстр для продуктива?».

    Поделиться публикацией

    Комментарии 14

      0

      Как насчет furrr для обощения полученных знаний на область параллельных вычислений? Работает поверх future и мимикрирует под синтакс purrr. Можно спокойно использовать вместо purrr во многих местах, так как дефолтное поведение — последовательное выполнение, слабо отличающееся от purrr.
      Из преимуществ — future позволяет менять топологию бэкэнда, благодаря чему можно оптимизировать вложенные вызовы future_*.
      Вот reprex:


      library(purrr)
      library(furrr)
      
      plan(cluster, workers = 2)
      1:10 %>% future_map_int(~Sys.getpid())
      #>  [1] 7112 7112 7112 7112 7112 6624 6624 6624 6624 6624
      
      plan(sequential)
      
      1:10 %>% future_map_int(~Sys.getpid())
      #>  [1] 7032 7032 7032 7032 7032 7032 7032 7032 7032 7032
      
        0

        За пример в комментарии спасибо.


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

          0

          Я ни в коем случае не настиваю, просто предложил простое "расширение".
          Я отказался от %dopar% и foreach в какой-то момент из-за произвольного unlist-a и проблем с экспортом обновленных функций.


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

        0
        Качественная, исчерпывающая подборка. Хотелось бы поделиться некоторыми субъективными наблюдениями:
        • 50 часов на весь этот материал скорее всего хватит только на поверхностное чтение об азах и на выполнение стандартных написанных примеров. Тут работы-изучения минимум на месяц безвылазного чтения и написания кода.
        • Я бы обучал основам написания функций как можно раньше, т.к. это очень важный навык для «написания качественного и эффективного кода»: понимать, что код хорошо бы разбивать на маленькие понятные функции.
        • Нет ничего про тестирование написанного кода (testthat, covr, и т.д.). Это должно быть важно для «промышленной» разработки.
        • Сюда можно добавить азы создания пакетов, как принятого способа организации и документирования кода.
        • Очень полезная книга для такого рода «быстрого обучения написанию эффективного кода» — Efficient R programming
          0

          Полностью согласен, но… приходится делать выбор. Тут все подробно описано.


          1. Никто на практике не даст учиться несколько месяцев. В бой кидают как можно раньше. Поэтому приходится максимально ужимать материал.
          2. Функциям и функциональному подходу, а также безопасному выполнению функций внутри pipe выделяется почти целый день.
          3. Тестирование, пакеты и документирование — несомненно нужные вещи, но к этому можно приходить только после получения базовых навыков работы в R.

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


          Из электронных книг можно было бы еще посоветовать, если голова не опухнет,


          0
          Простите нубаса, никто не подскажет такую же подборочку по десантированию в питон?
            0

            Спасибо за богатый материал, есть что почитать. Но на мой взгляд эти требования соответствуют должности "Разработчик R" или "BI аналитик". Мат.стат, машинное обучение и какое-нибудь численное моделирование нужное для DS отсутствуют, а их постижение — это вопрос нескольких лет. Или нескольких месяцев для верхнеуровнего знакомства.

              0

              Зависит от того, кого искать будете.
              В требованиях к вакансии упомянут определенный бэкграунд "Уверенное владение следующими технологиями (минимум, 30% из списка):"


              Народ с ВМК, например, должен знать многие вещи, если не прогуливал.


              К вопросу о программировании и знании R.
              Для примера, сможете ли комбинаторно решить на R за 3-4 строчки длиной <= 80 символов такую детскую олимпиадную задачу по математике (3-ий класс)?


              "Можно ли расставить знаки действий вместо _, 
              чтобы значение выражения 76 _ 4 _ 51 _ 3 равнялось 36?"
                +1
                Может так?
                a<-as.numeric(str_split(c(«76 _ 4 _ 51 _ 3»),"_", simplify = T))
                b<-c("*","-", "/","+")
                for (i in 1:4) for (j in 1:4) for (k in 1:4)
                if (eval(parse(text=paste0(a[1], b[i], a[2] ,b[j], a[3], b[k], a[4] )))==36) print(c(b[i],b[j],b[k]))
                  0

                  Точно! И поговорить про NSE и принципы quotation.


                  Только я память не жалею и упираю на `tidyverse`, чтобы на пальцах все шаги показать
                  c('*', '/', '+', '-') %>%
                    {expand.grid(op1 = ., op2 = ., op3 = ., stringsAsFactors = FALSE)} %>%
                    mutate(data = glue::glue("76 {op1} 4 {op2} 51 {op3} 3")) %>%
                    filter(purrr::map_dbl(rlang::parse_exprs(data), rlang::eval_bare) == 36)

                  Одна детская задачка дает фактуру для почти дневного разговора.

                    0
                    signs = c('+', '-', '*', '/')
                    exprs = expand.grid(76, signs, 4, signs, 51, signs, 3, '==', 36, stringsAsFactors=F)
                    for (i in 1:nrow(exprs))
                      if (eval(parse(text=(str=paste(exprs[i,], collapse='')))))
                        print(str)
                  0

                  "
                  К вопросу о программировании и знании R.
                  "


                  Смогу :)


                  А вот коллеге, который знал про R "всё" пришлось довольно долго объяснять что такое Random Forest. А объяснить важность предположения о независимости сл.величины так и не смог, вроде. Порядок абстракций другой...

                    0

                    "The Art of Computer Programming" вроде пока никто не отменял и не обесценивал.


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


                    Есть масса прекрасных курсов по ML, тут ведь речь совершенно не про них. И на русском и на английском. Может Вашему коллеге просто надо на них обратить внимание?
                    Еще вот и хороший мультфильм про random forrest на 10 минут. В этой подборке вообще много короткометражных мультфильмов по математике.

                      0
                      «The Art of Computer Programming» вроде пока никто не отменял и не обесценивал.


                      Это, безусловно, важно. Говнокод никто читать не хочет, не говоря уже о производительности. Еще R Inferno можно здесь упомянуть…

                      Просто моя мысль в том, что B-тип дата сайентиста это программист, он тоже нужен. Но без говнокода типа A (анализ) многие проекты просто не полетят или полетят не туда.

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