Учебники

Big Data Analytics — Краткое руководство

Аналитика больших данных — обзор

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

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

Организация бизнеса

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

Аналитика больших данных — жизненный цикл данных

Традиционный жизненный цикл интеллектуального анализа данных

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

Методология CRISP-DM

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

Посмотрите на следующую иллюстрацию. Он показывает основные этапы цикла, описанные методологией CRISP-DM, и их взаимосвязь.

Жизненный цикл

CRISP-DM был задуман в 1996 году, а в следующем году он был реализован как проект Европейского Союза в рамках инициативы финансирования ESPRIT. Проект возглавляли пять компаний: SPSS, Teradata, Daimler AG, NCR Corporation и OHRA (страховая компания). Проект был наконец включен в SPSS. Методология чрезвычайно детально ориентирована на то, как должен быть определен проект интеллектуального анализа данных.

Давайте теперь узнаем немного больше о каждом из этапов жизненного цикла CRISP-DM —

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Методология SEMMA

SEMMA — это еще одна методология, разработанная SAS для моделирования интеллектуального анализа данных. Он обозначает S достаточно, E xplore, M odify, M odel и A sses. Вот краткое описание его этапов —

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

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

  • Modify — фаза Modify содержит методы для выбора, создания и преобразования переменных при подготовке к моделированию данных.

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

  • Оценка — Оценка результатов моделирования показывает надежность и полезность созданных моделей.

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

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

Modify — фаза Modify содержит методы для выбора, создания и преобразования переменных при подготовке к моделированию данных.

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

Оценка — Оценка результатов моделирования показывает надежность и полезность созданных моделей.

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

Жизненный цикл больших данных

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

Большой цикл анализа данных может быть описан следующим этапом —

  • Определение бизнес-проблемы
  • Исследование
  • Оценка человеческих ресурсов
  • Получение данных
  • Data Munging
  • Хранилище данных
  • Исследовательский анализ данных
  • Подготовка данных для моделирования и оценки
  • моделирование
  • Реализация

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

Определение бизнес-проблемы

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

Исследование

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

Оценка человеческих ресурсов

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

Получение данных

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

Data Munging

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

Предположим, что один источник данных дает обзоры с точки зрения рейтинга в звездах, поэтому его можно считать отображением для переменной отклика y ∈ {1, 2, 3, 4, 5} . Другой источник данных дает обзоры с использованием системы двух стрелок, одна для голосования «за», а другая для голосования «за». Это подразумевало бы переменную ответа вида y ∈ {положительный, отрицательный} .

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

Хранилище данных

Как только данные обработаны, их иногда необходимо сохранить в базе данных. Технологии больших данных предлагают множество альтернатив в этом отношении. Наиболее распространенной альтернативой является использование файловой системы Hadoop для хранения, которая предоставляет пользователям ограниченную версию SQL, известную как язык запросов HIVE. Это позволяет выполнять большинство задач аналитики аналогично тому, как это делается в традиционных хранилищах данных BI, с точки зрения пользователя. Другими вариантами хранения, которые следует учитывать, являются MongoDB, Redis и SPARK.

Эта стадия цикла связана со знаниями человеческих ресурсов с точки зрения их способности реализовывать различные архитектуры. Модифицированные версии традиционных хранилищ данных все еще используются в крупномасштабных приложениях. Например, teradata и IBM предлагают базы данных SQL, которые могут обрабатывать терабайты данных; Решения с открытым исходным кодом, такие как postgreSQL и MySQL, все еще используются для крупномасштабных приложений.

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

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

Исследовательский анализ данных

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

Подготовка данных для моделирования и оценки

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

моделирование

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

Реализация

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

Аналитика больших данных — методология

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

В аналитике больших данных нам представляются данные. Мы не можем разработать эксперимент, который соответствует нашей любимой статистической модели. В крупномасштабных аналитических приложениях требуется большой объем работы (обычно 80% усилий) только для очистки данных, поэтому он может использоваться моделью машинного обучения.

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

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

Аналитика больших данных — основные результаты

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

  • Реализация машинного обучения — это может быть алгоритм классификации, модель регрессии или модель сегментации.

  • Система рекомендаций — Цель состоит в том, чтобы разработать систему, которая рекомендует выбор на основе поведения пользователя. Netflix является характерным примером этого продукта данных, где на основе оценок пользователей рекомендуются другие фильмы.

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

  • Специальный анализ — как правило, в бизнес-сферах есть вопросы, гипотезы или мифы, на которые можно ответить, выполнив специальный анализ с данными.

Реализация машинного обучения — это может быть алгоритм классификации, модель регрессии или модель сегментации.

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

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

Специальный анализ — как правило, в бизнес-сферах есть вопросы, гипотезы или мифы, на которые можно ответить, выполнив специальный анализ с данными.

Аналитика больших данных — ключевые заинтересованные стороны

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

  • Узнайте, кто и где является спонсором других проектов, похожих на тот, который вас интересует.

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

  • Кто выиграет от вашего проекта? Кто станет вашим клиентом, как только проект будет запущен?

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

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

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

Кто выиграет от вашего проекта? Кто станет вашим клиентом, как только проект будет запущен?

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

Лучший способ найти спонсоров для проекта — понять проблему и каков будет конечный продукт данных после его внедрения. Это понимание даст преимущество в убеждении руководства в важности проекта больших данных.

Big Data Analytics — Аналитик данных

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

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

  • Понимание бизнеса
  • Программирование SQL
  • Разработка и реализация отчетов
  • Разработка панели инструментов

Аналитика больших данных — Data Scientist

Роль исследователя данных обычно связана с такими задачами, как прогнозирующее моделирование, разработка алгоритмов сегментации, системы рекомендаций, системы A / B-тестирования и часто работа с необработанными неструктурированными данными.

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

Вот набор навыков, которыми обычно должен обладать ученый данных:

  • Программирование в статистическом пакете, таком как: R, Python, SAS, SPSS или Julia
  • Возможность очищать, извлекать и исследовать данные из разных источников
  • Исследование, разработка и внедрение статистических моделей
  • Глубокие статистические, математические и компьютерные знания

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

Аналитика больших данных — определение проблемы

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

Описание Проекта

Целью этого проекта будет разработка модели машинного обучения для прогнозирования почасовой заработной платы людей с использованием их биографических данных (CV) в качестве входных данных.

Используя рамки, определенные выше, просто определить проблему. Мы можем определить X = {x 1 , x 2 ,…, x n } как резюме пользователей, где каждая функция может быть самым простым способом, сколько раз это слово появляется. Тогда ответ реально оценен, мы пытаемся прогнозировать почасовую зарплату физических лиц в долларах.

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

Определение проблемы

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

Большинство проблем с большими данными можно классифицировать следующими способами:

  • Контролируемая классификация
  • Контролируемая регрессия
  • Неконтролируемое обучение
  • Учимся оценивать

Давайте теперь узнаем больше об этих четырех понятиях.

Контролируемая классификация

Учитывая матрицу признаков X = {x 1 , x 2 , …, x n }, мы разрабатываем модель M для прогнозирования различных классов, определенных как y = {c 1 , c 2 , …, c n } . Например: учитывая данные о транзакциях клиентов в страховой компании, можно разработать модель, которая будет прогнозировать, будет ли клиент работать на рынке или нет. Последняя является проблемой двоичной классификации, где есть два класса или целевые переменные: отток и не отток.

Другие проблемы включают предсказание более чем одного класса, мы могли бы быть заинтересованы в распознавании цифр, поэтому вектор ответа будет определяться как: y = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9} Современная модель будет представлять собой сверточную нейронную сеть, а матрица признаков будет определяться как пиксели изображения.

Контролируемая регрессия

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

Обучение без учителя

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

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

Учимся ранжировать

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

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

Big Data Analytics — Сбор данных

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

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

Twitter Mini Project

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

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

  • Перейдите на https://twitter.com/apps/new и войдите в систему.

  • После заполнения основной информации перейдите на вкладку «Настройки» и выберите «Чтение, запись и доступ к прямым сообщениям».

  • Убедитесь, что вы нажали на кнопку «Сохранить» после этого

  • На вкладке «Сведения» запишите ключ и секрет клиента.

  • В вашей сессии R вы будете использовать ключ API и секретные значения API

  • Наконец запустите следующий скрипт. Это установит пакет twitteR из его репозитория на github.

Перейдите на https://twitter.com/apps/new и войдите в систему.

После заполнения основной информации перейдите на вкладку «Настройки» и выберите «Чтение, запись и доступ к прямым сообщениям».

Убедитесь, что вы нажали на кнопку «Сохранить» после этого

На вкладке «Сведения» запишите ключ и секрет клиента.

В вашей сессии R вы будете использовать ключ API и секретные значения API

Наконец запустите следующий скрипт. Это установит пакет twitteR из его репозитория на github.

install.packages(c("devtools", "rjson", "bit64", "httr"))  

# Make sure to restart your R session at this point 
library(devtools) 
install_github("geoffjentry/twitteR") 

Мы заинтересованы в том, чтобы получить данные, в которые включена строка «big mac», и выяснить, какие темы выделяются по этому поводу. Для этого первым шагом является сбор данных из твиттера. Ниже приведен наш R скрипт для сбора необходимых данных из твиттера. Этот код также доступен в файле bda / part1 / collect_data / collect_data_twitter.R.

rm(list = ls(all = TRUE)); gc() # Clears the global environment
library(twitteR)
Sys.setlocale(category = "LC_ALL", locale = "C")

### Replace the xxx’s with the values you got from the previous instructions

# consumer_key = "xxxxxxxxxxxxxxxxxxxx"
# consumer_secret = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

# access_token = "xxxxxxxxxx-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

# access_token_secret= "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

# Connect to twitter rest API
setup_twitter_oauth(consumer_key, consumer_secret, access_token, access_token_secret)

# Get tweets related to big mac
tweets <- searchTwitter(’big mac’, n = 200, lang = en’)
df <- twListToDF(tweets)

# Take a look at the data
head(df)

# Check which device is most used
sources <- sapply(tweets, function(x) x$getStatusSource())
sources <- gsub("</a>", "", sources)
sources <- strsplit(sources, ">")
sources <- sapply(sources, function(x) ifelse(length(x) > 1, x[2], x[1]))
source_table = table(sources)
source_table = source_table[source_table > 1]
freq = source_table[order(source_table, decreasing = T)]
as.data.frame(freq)

#                       Frequency
# Twitter for iPhone       71
# Twitter for Android      29
# Twitter Web Client       25
# recognia                 20

Аналитика больших данных — очистка данных

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

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

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

  • Гомогенизация — включает перевод разных языков на язык, на котором у нас больше данных. Качество услуг перевода приемлемо, но если мы хотим перевести большие объемы данных с помощью API, стоимость будет значительной. Для этой задачи доступны программные средства, но это будет слишком дорого.

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

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

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

Twitter Mini Project

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

Например, после получения твитов мы получаем следующие странные символы: «<ed> <U + 00A0> <U + 00BD> <ed> <U + 00B8> <U + 008B>». Вероятно, это смайлики, поэтому для очистки данных мы просто удалим их, используя следующий скрипт. Этот код также доступен в файле bda / part1 / collect_data / cleaning_data.R.

rm(list = ls(all = TRUE)); gc() # Clears the global environment
source('collect_data_twitter.R')
# Some tweets
head(df$text)

[1] "I’m not a big fan of turkey but baked Mac &
cheese <ed><U+00A0><U+00BD><ed><U+00B8><U+008B>"
[2] "@Jayoh30 Like no special sauce on a big mac. HOW"
### We are interested in the text - Let’s clean it!

# We first convert the encoding of the text from latin1 to ASCII
df$text <- sapply(df$text,function(row) iconv(row, "latin1", "ASCII", sub = ""))

# Create a function to clean tweets
clean.text <- function(tx) {
  tx <- gsub("htt.{1,20}", " ", tx, ignore.case = TRUE)
  tx = gsub("[^#[:^punct:]]|@|RT", " ", tx, perl = TRUE, ignore.case = TRUE)
  tx = gsub("[[:digit:]]", " ", tx, ignore.case = TRUE)
  tx = gsub(" {1,}", " ", tx, ignore.case = TRUE)
  tx = gsub("^\\s+|\\s+$", " ", tx, ignore.case = TRUE)
  return(tx)
}  

clean_tweets <- lapply(df$text, clean.text)

# Cleaned tweets
head(clean_tweets)
[1] " WeNeedFeminlsm MAC s new make up line features men woc and big girls "
[1] " TravelsPhoto What Happens To Your Body One Hour After A Big Mac "

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

Аналитика больших данных — обобщение данных

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

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

Следующий пример демонстрирует, что означает суммирование данных. Перейдите в папку bda / part1 / sumrize_data и внутри папки откройте файл sumrize_data.Rproj , дважды щелкнув по нему. Затем откройте сценарий sumrize_data.R, посмотрите на код и следуйте приведенным объяснениям.

# Install the following packages by running the following code in R. 
pkgs = c('data.table', 'ggplot2', 'nycflights13', 'reshape2') 
install.packages(pkgs)

Пакет ggplot2 отлично подходит для визуализации данных. Пакет data.table является отличным вариантом для быстрого и эффективного суммирования памяти в R. Недавний тест показывает, что это даже быстрее, чем pandas , библиотека python, используемая для подобных задач.

Скамья Марк

Посмотрите на данные, используя следующий код. Этот код также доступен в файле bda / part1 / summaryrize_data / summaryrize_data.Rproj .

library(nycflights13) 
library(ggplot2) 
library(data.table) 
library(reshape2)  

# Convert the flights data.frame to a data.table object and call it DT 
DT <- as.data.table(flights)  

# The data has 336776 rows and 16 columns 
dim(DT)  

# Take a look at the first rows 
head(DT) 

#   year    month  day   dep_time  dep_delay  arr_time  arr_delay  carrier 
# 1: 2013     1     1      517       2         830         11       UA 
# 2: 2013     1     1      533       4         850         20       UA 
# 3: 2013     1     1      542       2         923         33       AA 
# 4: 2013     1     1      544      -1        1004        -18       B6 
# 5: 2013     1     1      554      -6         812        -25       DL 
# 6: 2013     1     1      554      -4         740         12       UA  

#     tailnum  flight  origin   dest    air_time   distance    hour   minute 
# 1:  N14228   1545     EWR      IAH      227        1400       5       17 
# 2:  N24211   1714     LGA      IAH      227        1416       5       33 
# 3:  N619AA   1141     JFK      MIA      160        1089       5       42 
# 4:  N804JB    725     JFK      BQN      183        1576       5       44 
# 5:  N668DN    461     LGA      ATL      116        762        5       54 
# 6:  N39463   1696     EWR      ORD      150        719        5       54

В следующем коде приведен пример суммирования данных.

### Data Summarization
# Compute the mean arrival delay  
DT[, list(mean_arrival_delay = mean(arr_delay, na.rm = TRUE))] 
#        mean_arrival_delay 
# 1:           6.895377  
# Now, we compute the same value but for each carrier 
mean1 = DT[, list(mean_arrival_delay = mean(arr_delay, na.rm = TRUE)), 
   by = carrier] 
print(mean1) 
#      carrier    mean_arrival_delay 
# 1:      UA          3.5580111 
# 2:      AA          0.3642909 
# 3:      B6          9.4579733 
# 4:      DL          1.6443409 
# 5:      EV         15.7964311 
# 6:      MQ         10.7747334 
# 7:      US          2.1295951 
# 8:      WN          9.6491199 
# 9:      VX          1.7644644 
# 10:     FL         20.1159055 
# 11:     AS         -9.9308886 
# 12:     9E          7.3796692
# 13:     F9         21.9207048 
# 14:     HA         -6.9152047 
# 15:     YV         15.5569853 
# 16:     OO         11.9310345

# Now let’s compute to means in the same line of code 
mean2 = DT[, list(mean_departure_delay = mean(dep_delay, na.rm = TRUE), 
   mean_arrival_delay = mean(arr_delay, na.rm = TRUE)), 
   by = carrier] 
print(mean2) 

#       carrier    mean_departure_delay   mean_arrival_delay 
# 1:      UA            12.106073          3.5580111 
# 2:      AA             8.586016          0.3642909 
# 3:      B6            13.022522          9.4579733 
# 4:      DL             9.264505          1.6443409 
# 5:      EV            19.955390         15.7964311 
# 6:      MQ            10.552041         10.7747334 
# 7:      US             3.782418          2.1295951 
# 8:      WN            17.711744          9.6491199 
# 9:      VX            12.869421          1.7644644 
# 10:     FL            18.726075         20.1159055 
# 11:     AS             5.804775         -9.9308886 
# 12:     9E            16.725769          7.3796692 
# 13:     F9            20.215543         21.9207048 
# 14:     HA             4.900585         -6.9152047 
# 15:     YV            18.996330         15.5569853 
# 16:     OO            12.586207         11.9310345

### Create a new variable called gain 
# this is the difference between arrival delay and departure delay 
DT[, gain:= arr_delay - dep_delay]  

# Compute the median gain per carrier 
median_gain = DT[, median(gain, na.rm = TRUE), by = carrier] 
print(median_gain)

Аналитика больших данных — исследование данных

Исследовательский анализ данных — это концепция, разработанная Джоном Тьюки (John Tuckey, 1977), которая основана на новом взгляде на статистику. Идея Тьюки заключалась в том, что в традиционной статистике данные не изучались графически, а просто использовались для проверки гипотез. Первая попытка разработать инструмент была сделана в Стэнфорде, проект получил название prim9 . Инструмент был способен визуализировать данные в девяти измерениях, поэтому он мог обеспечить многомерную перспективу данных.

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

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

Лучшие аналитические пакеты

Следующая программа демонстрирует использование разведочного анализа данных.

Ниже приведен пример аналитического анализа данных. Этот код также доступен в файле part1 / eda / exploratory_data_analysis.R .

library(nycflights13) 
library(ggplot2) 
library(data.table) 
library(reshape2)  

# Using the code from the previous section 
# This computes the mean arrival and departure delays by carrier. 
DT <- as.data.table(flights) 
mean2 = DT[, list(mean_departure_delay = mean(dep_delay, na.rm = TRUE), 
   mean_arrival_delay = mean(arr_delay, na.rm = TRUE)), 
   by = carrier]  

# In order to plot data in R usign ggplot, it is normally needed to reshape the data 
# We want to have the data in long format for plotting with ggplot 
dt = melt(mean2, id.vars = ’carrier’)  

# Take a look at the first rows 
print(head(dt))  

# Take a look at the help for ?geom_point and geom_line to find similar examples 
# Here we take the carrier code as the x axis 
# the value from the dt data.table goes in the y axis 

# The variable column represents the color 
p = ggplot(dt, aes(x = carrier, y = value, color = variable, group = variable)) +
   geom_point() + # Plots points 
   geom_line() + # Plots lines 
   theme_bw() + # Uses a white background 
   labs(list(title = 'Mean arrival and departure delay by carrier', 
      x = 'Carrier', y = 'Mean delay')) 
print(p)  

# Save the plot to disk 
ggsave('mean_delay_by_carrier.png', p,  
   width = 10.4, height = 5.07)

Код должен создать изображение, такое как следующее —

Средняя задержка

Big Data Analytics — Визуализация данных

Чтобы понять данные, часто полезно визуализировать их. Обычно в приложениях Big Data интерес заключается в том, чтобы находить понимание, а не просто создавать красивые сюжеты. Ниже приведены примеры различных подходов к пониманию данных с использованием графиков.

Чтобы начать анализ данных о рейсах, мы можем начать с проверки наличия корреляции между числовыми переменными. Этот код также доступен в файле bda / part1 / data_visualization / data_visualization.R .

# Install the package corrplot by running
install.packages('corrplot')  

# then load the library 
library(corrplot)  

# Load the following libraries  
library(nycflights13) 
library(ggplot2) 
library(data.table) 
library(reshape2)  

# We will continue working with the flights data 
DT <- as.data.table(flights)  
head(DT) # take a look  

# We select the numeric variables after inspecting the first rows. 
numeric_variables = c('dep_time', 'dep_delay',  
   'arr_time', 'arr_delay', 'air_time', 'distance')

# Select numeric variables from the DT data.table 
dt_num = DT[, numeric_variables, with = FALSE]  

# Compute the correlation matrix of dt_num 
cor_mat = cor(dt_num, use = "complete.obs")  

print(cor_mat) 
### Here is the correlation matrix 
#              dep_time   dep_delay   arr_time   arr_delay    air_time    distance 
# dep_time   1.00000000  0.25961272 0.66250900  0.23230573 -0.01461948 -0.01413373 
# dep_delay  0.25961272  1.00000000 0.02942101  0.91480276 -0.02240508 -0.02168090 
# arr_time   0.66250900  0.02942101 1.00000000  0.02448214  0.05429603  0.04718917 
# arr_delay  0.23230573  0.91480276 0.02448214  1.00000000 -0.03529709 -0.06186776 
# air_time  -0.01461948 -0.02240508 0.05429603 -0.03529709  1.00000000  0.99064965 
# distance  -0.01413373 -0.02168090 0.04718917 -0.06186776  0.99064965  1.00000000  

# We can display it visually to get a better understanding of the data 
corrplot.mixed(cor_mat, lower = "circle", upper = "ellipse")  

# save it to disk 
png('corrplot.png') 
print(corrplot.mixed(cor_mat, lower = "circle", upper = "ellipse")) 
dev.off()

Этот код генерирует следующую визуализацию матрицы корреляции —

корреляция

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

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

Мы также можем сделать одномерный анализ данных. Простой и эффективный способ визуализации распределений — это блочные графики . Следующий код демонстрирует, как создавать коробчатые и решетчатые диаграммы с использованием библиотеки ggplot2. Этот код также доступен в файле bda / part1 / data_visualization / boxplots.R .

source('data_visualization.R') 
### Analyzing Distributions using box-plots  
# The following shows the distance as a function of the carrier 

p = ggplot(DT, aes(x = carrier, y = distance, fill = carrier)) + # Define the carrier 
   in the x axis and distance in the y axis 
   geom_box-plot() + # Use the box-plot geom 
   theme_bw() + # Leave a white background - More in line with tufte's 
      principles than the default 
   guides(fill = FALSE) + # Remove legend 
   labs(list(title = 'Distance as a function of carrier', # Add labels 
      x = 'Carrier', y = 'Distance')) 
p   
# Save to disk 
png(‘boxplot_carrier.png’) 
print(p) 
dev.off()   

# Let's add now another variable, the month of each flight 
# We will be using facet_wrap for this 
p = ggplot(DT, aes(carrier, distance, fill = carrier)) + 
   geom_box-plot() + 
   theme_bw() + 
   guides(fill = FALSE) +  
   facet_wrap(~month) + # This creates the trellis plot with the by month variable
   labs(list(title = 'Distance as a function of carrier by month', 
      x = 'Carrier', y = 'Distance')) 
p   
# The plot shows there aren't clear differences between distance in different months  

# Save to disk 
png('boxplot_carrier_by_month.png') 
print(p) 
dev.off()

Аналитика больших данных — Введение в R

Этот раздел посвящен знакомству пользователей с языком программирования R. R можно скачать с сайта крана . Для пользователей Windows полезно установить rtools и IDE rstudio .

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

Перейдите в папку zip-файла книги bda / part2 / R_introduction и откройте файл R_introduction.Rproj . Это откроет сеанс RStudio. Затем откройте файл 01_vectors.R. Запустите скрипт построчно и следуйте комментариям в коде. Еще одна полезная опция для обучения — просто набрать код, это поможет вам привыкнуть к синтаксису R. В R комментарии пишутся с символом #.

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

# Create a vector of numbers 
numbers = c(1, 2, 3, 4, 5) 
print(numbers) 

# [1] 1 2 3 4 5  
# Create a vector of letters 
ltrs = c('a', 'b', 'c', 'd', 'e') 
# [1] "a" "b" "c" "d" "e"  

# Concatenate both  
mixed_vec = c(numbers, ltrs) 
print(mixed_vec) 
# [1] "1" "2" "3" "4" "5" "a" "b" "c" "d" "e"

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

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

### Evaluate the data types using class

### One dimensional objects 
# Integer vector 
num = 1:10 
class(num) 
# [1] "integer"  

# Numeric vector, it has a float, 10.5 
num = c(1:10, 10.5) 
class(num) 
# [1] "numeric"  

# Character vector 
ltrs = letters[1:10] 
class(ltrs) 
# [1] "character"  

# Factor vector 
fac = as.factor(ltrs) 
class(fac) 
# [1] "factor"

R поддерживает двумерные объекты также. В следующем коде приведены примеры двух самых популярных структур данных, используемых в R: матрица и data.frame.

# Matrix
M = matrix(1:12, ncol = 4) 
#      [,1] [,2] [,3] [,4] 
# [1,]    1    4    7   10 
# [2,]    2    5    8   11 
# [3,]    3    6    9   12 
lM = matrix(letters[1:12], ncol = 4) 
#     [,1] [,2] [,3] [,4] 
# [1,] "a"  "d"  "g"  "j"  
# [2,] "b"  "e"  "h"  "k"  
# [3,] "c"  "f"  "i"  "l"   

# Coerces the numbers to character 
# cbind concatenates two matrices (or vectors) in one matrix 
cbind(M, lM) 
#     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] 
# [1,] "1"  "4"  "7"  "10" "a"  "d"  "g"  "j"  
# [2,] "2"  "5"  "8"  "11" "b"  "e"  "h"  "k"  
# [3,] "3"  "6"  "9"  "12" "c"  "f"  "i"  "l"   

class(M) 
# [1] "matrix" 
class(lM) 
# [1] "matrix"  

# data.frame 
# One of the main objects of R, handles different data types in the same object.  
# It is possible to have numeric, character and factor vectors in the same data.frame  

df = data.frame(n = 1:5, l = letters[1:5]) 
df 
#   n l 
# 1 1 a 
# 2 2 b 
# 3 3 c 
# 4 4 d 
# 5 5 e 

Как показано в предыдущем примере, в одном и том же объекте можно использовать разные типы данных. В общем, это то, как данные представлены в базах данных, часть данных API — это текстовые или символьные векторы и другие числовые значения. Задача аналитика — определить, какой тип статистических данных назначить, а затем использовать для него правильный тип данных R. В статистике мы обычно рассматриваем переменные следующих типов:

  • числовой
  • Номинальный или категориальный
  • порядковый

В R вектор может быть следующих классов:

  • Числовое — целое число
  • фактор
  • Упорядоченный фактор

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

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

# Let's create a data.frame
df = data.frame(numbers = 1:26, letters) 
head(df) 
#      numbers  letters 
# 1       1       a 
# 2       2       b 
# 3       3       c 
# 4       4       d 
# 5       5       e 
# 6       6       f 

# str gives the structure of a data.frame, it’s a good summary to inspect an object 
str(df) 
#   'data.frame': 26 obs. of  2 variables: 
#   $ numbers: int  1 2 3 4 5 6 7 8 9 10 ... 
#   $ letters: Factor w/ 26 levels "a","b","c","d",..: 1 2 3 4 5 6 7 8 9 10 ...  

# The latter shows the letters character vector was coerced as a factor. 
# This can be explained by the stringsAsFactors = TRUE argumnet in data.frame 
# read ?data.frame for more information  

class(df) 
# [1] "data.frame"  

### Indexing
# Get the first row 
df[1, ] 
#     numbers  letters 
# 1       1       a  

# Used for programming normally - returns the output as a list 
df[1, , drop = TRUE] 
# $numbers 
# [1] 1 
#  
# $letters 
# [1] a 
# Levels: a b c d e f g h i j k l m n o p q r s t u v w x y z  

# Get several rows of the data.frame 
df[5:7, ] 
#      numbers  letters 
# 5       5       e 
# 6       6       f 
# 7       7       g  

### Add one column that mixes the numeric column with the factor column 
df$mixed = paste(df$numbers, df$letters, sep = ’’)  

str(df) 
# 'data.frame': 26 obs. of  3 variables: 
# $ numbers: int  1 2 3 4 5 6 7 8 9 10 ...
# $ letters: Factor w/ 26 levels "a","b","c","d",..: 1 2 3 4 5 6 7 8 9 10 ... 
# $ mixed  : chr  "1a" "2b" "3c" "4d" ...  

### Get columns 
# Get the first column 
df[, 1]  
# It returns a one dimensional vector with that column  

# Get two columns 
df2 = df[, 1:2] 
head(df2)  

#      numbers  letters 
# 1       1       a 
# 2       2       b 
# 3       3       c 
# 4       4       d 
# 5       5       e 
# 6       6       f  

# Get the first and third columns 
df3 = df[, c(1, 3)] 
df3[1:3, ]  

#      numbers  mixed 
# 1       1     1a
# 2       2     2b 
# 3       3     3c  

### Index columns from their names 
names(df) 
# [1] "numbers" "letters" "mixed"   
# This is the best practice in programming, as many times indeces change, but 
variable names don’t 
# We create a variable with the names we want to subset 
keep_vars = c("numbers", "mixed") 
df4 = df[, keep_vars]  

head(df4) 
#      numbers  mixed 
# 1       1     1a 
# 2       2     2b 
# 3       3     3c 
# 4       4     4d 
# 5       5     5e 
# 6       6     6f  

### subset rows and columns 
# Keep the first five rows 
df5 = df[1:5, keep_vars] 
df5 

#      numbers  mixed 
# 1       1     1a 
# 2       2     2b
# 3       3     3c 
# 4       4     4d 
# 5       5     5e  

# subset rows using a logical condition 
df6 = df[df$numbers < 10, keep_vars] 
df6 

#      numbers  mixed 
# 1       1     1a 
# 2       2     2b 
# 3       3     3c 
# 4       4     4d 
# 5       5     5e 
# 6       6     6f 
# 7       7     7g 
# 8       8     8h 
# 9       9     9i 

Big Data Analytics — Введение в SQL

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

Ядром SQL являются три оператора: SELECT, FROM и WHERE. В следующих примерах используются наиболее распространенные варианты использования SQL. Перейдите в папку bda / part2 / SQL_introduction и откройте файл SQL_introduction.Rproj . Затем откройте скрипт 01_select.R. Чтобы написать код SQL на R, нам нужно установить пакет sqldf , как показано в следующем коде.

# Install the sqldf package
install.packages('sqldf')  

# load the library 
library('sqldf') 
library(nycflights13)  

# We will be working with the fligths dataset in order to introduce SQL  

# Let’s take a look at the table 
str(flights) 
# Classes 'tbl_d', 'tbl' and 'data.frame': 336776 obs. of  16 variables: 

# $ year     : int  2013 2013 2013 2013 2013 2013 2013 2013 2013 2013 ... 
# $ month    : int  1 1 1 1 1 1 1 1 1 1 ... 
# $ day      : int  1 1 1 1 1 1 1 1 1 1 ... 
# $ dep_time : int  517 533 542 544 554 554 555 557 557 558 ... 
# $ dep_delay: num  2 4 2 -1 -6 -4 -5 -3 -3 -2 ... 
# $ arr_time : int  830 850 923 1004 812 740 913 709 838 753 ... 
# $ arr_delay: num  11 20 33 -18 -25 12 19 -14 -8 8 ...
# $ carrier  : chr  "UA" "UA" "AA" "B6" ... 

# $ tailnum  : chr  "N14228" "N24211" "N619AA" "N804JB" ... 
# $ flight   : int  1545 1714 1141 725 461 1696 507 5708 79 301 ... 
# $ origin   : chr  "EWR" "LGA" "JFK" "JFK" ... 
# $ dest     : chr  "IAH" "IAH" "MIA" "BQN" ... 
# $ air_time : num  227 227 160 183 116 150 158 53 140 138 ... 
# $ distance : num  1400 1416 1089 1576 762 ... 
# $ hour     : num  5 5 5 5 5 5 5 5 5 5 ... 
# $ minute   : num  17 33 42 44 54 54 55 57 57 58 ...

Оператор select используется для извлечения столбцов из таблиц и выполнения расчетов по ним. Простейшее утверждение SELECT продемонстрировано в ej1 . Мы также можем создать новые переменные, как показано в ej2 .

### SELECT statement
ej1 = sqldf(" 
   SELECT  
   dep_time 
   ,dep_delay 
   ,arr_time 
   ,carrier 
   ,tailnum 
   FROM 
   flights
")  

head(ej1) 
#    dep_time   dep_delay  arr_time  carrier  tailnum 
# 1      517         2      830      UA       N14228 
# 2      533         4      850      UA       N24211 
# 3      542         2      923      AA       N619AA 
# 4      544        -1     1004      B6       N804JB 
# 5      554        -6      812      DL       N668DN 
# 6      554        -4      740      UA       N39463  

# In R we can use SQL with the sqldf function. It works exactly the same as in 
a database 

# The data.frame (in this case flights) represents the table we are querying 
and goes in the FROM statement  
# We can also compute new variables in the select statement using the syntax: 

# old_variables as new_variable 
ej2 = sqldf(" 
   SELECT 
   arr_delay - dep_delay as gain, 
   carrier 
   FROM 
   flights
")  

ej2[1:5, ] 
#    gain   carrier 
# 1    9      UA 
# 2   16      UA 
# 3   31      AA 
# 4  -17      B6 
# 5  -19      DL

Одной из наиболее часто используемых функций SQL является оператор group by. Это позволяет вычислить числовое значение для разных групп другой переменной. Откройте скрипт 02_group_by.R.

### GROUP BY      

# Computing the average 
ej3 = sqldf(" 
  SELECT 
   avg(arr_delay) as mean_arr_delay, 
   avg(dep_delay) as mean_dep_delay, 
   carrier 
   FROM 
   flights 
   GROUP BY 
   carrier 
")  

#    mean_arr_delay   mean_dep_delay carrier 
# 1       7.3796692      16.725769      9E 
# 2       0.3642909       8.586016      AA 
# 3      -9.9308886       5.804775      AS 
# 4       9.4579733      13.022522      B6 
# 5       1.6443409       9.264505      DL 
# 6      15.7964311      19.955390      EV 
# 7      21.9207048      20.215543      F9 
# 8      20.1159055      18.726075      FL 
# 9      -6.9152047       4.900585      HA 
# 10     10.7747334      10.552041      MQ
# 11     11.9310345      12.586207      OO 
# 12      3.5580111      12.106073      UA 
# 13      2.1295951       3.782418      US 
# 14      1.7644644      12.869421      VX 
# 15      9.6491199      17.711744      WN 
# 16     15.5569853      18.996330      YV  

# Other aggregations 
ej4 = sqldf(" 
   SELECT 
   avg(arr_delay) as mean_arr_delay, 
   min(dep_delay) as min_dep_delay, 
   max(dep_delay) as max_dep_delay, 
   carrier 
   FROM  
   flights 
   GROUP BY 
   carrier 
")  

# We can compute the minimun, mean, and maximum values of a numeric value 
ej4 
#      mean_arr_delay    min_dep_delay   max_dep_delay   carrier 
# 1       7.3796692           -24           747          9E 
# 2       0.3642909           -24          1014          AA 
# 3      -9.9308886           -21           225          AS 
# 4       9.4579733           -43           502          B6
# 5       1.6443409           -33           960         DL 
# 6      15.7964311           -32           548         EV 
# 7      21.9207048           -27           853         F9 
# 8      20.1159055           -22           602         FL 
# 9      -6.9152047           -16          1301         HA 
# 10     10.7747334           -26          1137         MQ 
# 11     11.9310345           -14           154         OO 
# 12      3.5580111           -20           483         UA 
# 13      2.1295951           -19           500         US 
# 14      1.7644644           -20           653         VX 
# 15      9.6491199           -13           471         WN 
# 16     15.5569853           -16           387         YV  

### We could be also interested in knowing how many observations each carrier has  
ej5 = sqldf(" 
   SELECT 
   carrier, count(*) as count 
   FROM  
   flights 
   GROUP BY 
   carrier 
")  

ej5 
#      carrier  count 
# 1       9E    18460
# 2       AA   32729 
# 3       AS   714 
# 4       B6   54635 
# 5       DL   48110 
# 6       EV   54173 
# 7       F9   685 
# 8       FL   3260 
# 9       HA   342 
# 10      MQ   26397 
# 11      OO   32 
# 12      UA   58665 
# 13      US   20536 
# 14      VX   5162 
# 15      WN   12275 
# 16      YV   601 

Самая полезная особенность SQL — это объединения. Объединение означает, что мы хотим объединить таблицу A и таблицу B в одну таблицу, используя один столбец, чтобы соответствовать значениям обеих таблиц. Существуют различные типы объединений, с практической точки зрения, для начала они будут наиболее полезными: внутреннее объединение и левое внешнее объединение.

# Let’s create two tables: A and B to demonstrate joins.
A = data.frame(c1 = 1:4, c2 = letters[1:4]) 
B = data.frame(c1 = c(2,4,5,6), c2 = letters[c(2:5)])  

A 
# c1 c2 
# 1  a 
# 2  b 
# 3  c 
# 4  d  

B 
# c1 c2 
# 2  b 
# 4  c 
# 5  d 
# 6  e  

### INNER JOIN 
# This means to match the observations of the column we would join the tables by.   
inner = sqldf(" 
   SELECT 
   A.c1, B.c2 
   FROM 
   A INNER JOIN B 
   ON A.c1 = B.c1 
")  

# Only the rows that match c1 in both A and B are returned 
inner 
# c1 c2 
#  2  b 
#  4  c  

### LEFT OUTER JOIN
# the left outer join, sometimes just called left join will return the  
# first all the values of the column used from the A table  
left = sqldf(" 
  SELECT 
   A.c1, B.c2 
  FROM 
   A LEFT OUTER JOIN B 
   ON A.c1 = B.c1 
")  

# Only the rows that match c1 in both A and B are returned 
left 
#   c1    c2 
#    1  <NA> 
#    2    b 
#    3  <NA> 
#    4    c 

Аналитика больших данных — диаграммы и графики

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

  • Одномерный анализ
  • Многомерный анализ

Одномерные графические методы

Одномерный — это статистический термин. На практике это означает, что мы хотим анализировать переменную независимо от остальных данных. Сюжеты, которые позволяют сделать это эффективно, —

Box-участки

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

# We will be using the ggplot2 library for plotting
library(ggplot2)  
data("diamonds")  

# We will be using the diamonds dataset to analyze distributions of numeric variables 
head(diamonds) 

#    carat   cut       color  clarity  depth  table   price    x     y     z 
# 1  0.23    Ideal       E      SI2    61.5    55     326     3.95  3.98  2.43 
# 2  0.21    Premium     E      SI1    59.8    61     326     3.89  3.84  2.31 
# 3  0.23    Good        E      VS1    56.9    65     327     4.05  4.07  2.31 
# 4  0.29    Premium     I      VS2    62.4    58     334     4.20  4.23  2.63 
# 5  0.31    Good        J      SI2    63.3    58     335     4.34  4.35  2.75 
# 6  0.24    Very Good   J      VVS2   62.8    57     336     3.94  3.96  2.48 

### Box-Plots
p = ggplot(diamonds, aes(x = cut, y = price, fill = cut)) + 
   geom_box-plot() + 
   theme_bw() 
print(p)

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

Коробочные участки

Гистограммы

source('01_box_plots.R')

# We can plot histograms for each level of the cut factor variable using 
facet_grid 
p = ggplot(diamonds, aes(x = price, fill = cut)) + 
   geom_histogram() + 
   facet_grid(cut ~ .) + 
   theme_bw() 

p  
# the previous plot doesn’t allow to visuallize correctly the data because of 
the differences in scale 
# we can turn this off using the scales argument of facet_grid  

p = ggplot(diamonds, aes(x = price, fill = cut)) + 
   geom_histogram() + 
   facet_grid(cut ~ ., scales = 'free') + 
   theme_bw() 
p  

png('02_histogram_diamonds_cut.png') 
print(p) 
dev.off()

Вывод вышеприведенного кода будет следующим:

Гистограмма

Многовариантные графические методы

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

Чтобы продемонстрировать это, мы будем использовать набор данных diamonds. Чтобы следовать коду, откройте скрипт bda / part2 / charts / 03_multivariate_analysis.R .

library(ggplot2)
data(diamonds) 

# Correlation matrix plots  
keep_vars = c('carat', 'depth', 'price', 'table') 
df = diamonds[, keep_vars]  
# compute the correlation matrix 
M_cor = cor(df) 

#          carat       depth      price      table 
# carat 1.00000000  0.02822431  0.9215913  0.1816175 
# depth 0.02822431  1.00000000 -0.0106474 -0.2957785 
# price 0.92159130 -0.01064740  1.0000000  0.1271339 
# table 0.18161755 -0.29577852  0.1271339  1.0000000  

# plots 
heat-map(M_cor)

Код выдаст следующий вывод —

Тепловая карта

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

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

library(GGally)
ggpairs(df) 

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

диаграммы рассеяния

Это отношение можно визуализировать на диаграмме рассеяния цена-карат, расположенной в (3, 1) индексе матрицы рассеяния.

Big Data Analytics — Инструменты анализа данных

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

Язык программирования R

R — это язык программирования с открытым исходным кодом с упором на статистический анализ. Это конкурентоспособно с коммерческими инструментами, такими как SAS, SPSS с точки зрения статистических возможностей. Считается, что это интерфейс к другим языкам программирования, таким как C, C ++ или Fortran.

Еще одним преимуществом R является большое количество доступных библиотек с открытым исходным кодом. В CRAN есть более 6000 пакетов, которые можно скачать бесплатно, а в Github доступно множество R-пакетов.

С точки зрения производительности R медленен для интенсивных операций, учитывая большое количество доступных библиотек, медленные части кода написаны на скомпилированных языках. Но если вы собираетесь выполнять операции, требующие глубокого написания циклов for, тогда R не будет вашей лучшей альтернативой. Для анализа данных есть хорошие библиотеки, такие как data.table, glmnet, ranger, xgboost, ggplot2, caret, которые позволяют использовать R в качестве интерфейса для более быстрых языков программирования.

Python для анализа данных

Python является языком программирования общего назначения и содержит значительное количество библиотек, посвященных анализу данных, таких как pandas, scikit-learn, theano, numpy и scipy .

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

Для машинного обучения scikit-learn — это хорошая среда, в которой доступно большое количество алгоритмов, которые без проблем могут обрабатывать наборы данных среднего размера. По сравнению с эквивалентной библиотекой R (caret), Scikit-learn имеет более чистый и согласованный API.

Юля

Julia — это высокопроизводительный динамический язык программирования для технических вычислений. Его синтаксис очень похож на R или Python, поэтому, если вы уже работаете с R или Python, будет довольно просто написать тот же код на Julia. Язык довольно новый и значительно вырос за последние годы, так что это определенно вариант на данный момент.

Мы бы порекомендовали Джулию для прототипирования алгоритмов, которые требуют больших вычислительных ресурсов, таких как нейронные сети. Это отличный инструмент для исследований. С точки зрения внедрения модели в производство, вероятно, у Python есть лучшие альтернативы. Однако это становится меньшей проблемой, поскольку существуют веб-сервисы, которые занимаются разработкой моделей на R, Python и Julia.

ПАВ

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

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

SPSS

SPSS, в настоящее время является продуктом IBM для статистического анализа. Он в основном используется для анализа данных опроса, и для пользователей, которые не умеют программировать, это достойная альтернатива. Возможно, его так же просто использовать, как и SAS, но с точки зрения реализации модели это проще, поскольку он предоставляет код SQL для оценки модели. Этот код обычно неэффективен, но это только начало, тогда как SAS продает продукт, который оценивает модели для каждой базы данных в отдельности. Для небольших данных и неопытного коллектива SPSS — такой же хороший выбор, как и SAS.

Программное обеспечение, однако, довольно ограничено, и опытные пользователи будут на порядок более продуктивными, используя R или Python.

Матлаб, Октава

Доступны и другие инструменты, такие как Matlab или его версия с открытым исходным кодом (Octave). Эти инструменты в основном используются для исследований. С точки зрения возможностей R или Python могут делать все, что доступно в Matlab или Octave. Покупать лицензию на продукт имеет смысл только в том случае, если вы заинтересованы в поддержке, которую они предоставляют.

Аналитика больших данных — статистические методы

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

  • Корреляционный анализ
  • Дисперсионный анализ
  • Проверка гипотезы

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

Корреляционный анализ

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

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

library(ggplot2)

# Select variables that are interesting to compare pearson and spearman 
correlation methods. 
x = diamonds[, c('x', 'y', 'z', 'price')]  

# From the histograms we can expect differences in the correlations of both 
metrics.  
# In this case as the variables are clearly not normally distributed, the 
spearman correlation 

# is a better estimate of the linear relation among numeric variables. 
par(mfrow = c(2,2)) 
colnm = names(x) 
for(i in 1:4) { 
   hist(x[[i]], col = 'deepskyblue3', main = sprintf('Histogram of %s', colnm[i])) 
} 
par(mfrow = c(1,1)) 

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

Нормальное распределение

Чтобы вычислить корреляцию в R, откройте файл bda / part2 / statistics_methods / correlation / correlation.R, в котором есть этот раздел кода.

## Correlation Matrix - Pearson and spearman
cor_pearson <- cor(x, method = 'pearson') 
cor_spearman <- cor(x, method = 'spearman')  

### Pearson Correlation 
print(cor_pearson) 
#            x          y          z        price 
# x      1.0000000  0.9747015  0.9707718  0.8844352 
# y      0.9747015  1.0000000  0.9520057  0.8654209 
# z      0.9707718  0.9520057  1.0000000  0.8612494 
# price  0.8844352  0.8654209  0.8612494  1.0000000  

### Spearman Correlation 
print(cor_spearman) 
#              x          y          z      price 
# x      1.0000000  0.9978949  0.9873553  0.9631961 
# y      0.9978949  1.0000000  0.9870675  0.9627188 
# z      0.9873553  0.9870675  1.0000000  0.9572323 
# price  0.9631961  0.9627188  0.9572323  1.0000000 

Тест хи-квадрат

Тест хи-квадрат позволяет нам проверить, являются ли две случайные переменные независимыми. Это означает, что распределение вероятностей каждой переменной не влияет на другую. Чтобы оценить тест в R, нам нужно сначала создать таблицу сопряженности, а затем передать таблицу в функцию chisq.test R.

Например, давайте проверим, существует ли связь между переменными: cut и color из набора данных diamonds. Тест формально определяется как —

  • H0: переменная огранка и алмаз независимы
  • H1: переменная огранка и алмаз не являются независимыми

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

В следующем фрагменте кода мы обнаружили, что значение p теста равно 2.2e-16, что практически равно нулю в практическом плане. Затем после запуска теста, выполняющего моделирование по методу Монте-Карло , мы обнаружили, что значение p составляет 0,0004998, что все еще значительно ниже порога 0,05. Этот результат означает, что мы отвергаем нулевую гипотезу (H0), поэтому считаем, что переменные cut и color не являются независимыми.

library(ggplot2)

# Use the table function to compute the contingency table 
tbl = table(diamonds$cut, diamonds$color) 
tbl  

#              D    E    F    G    H    I    J 
# Fair       163  224  312  314  303  175  119 
# Good       662  933  909  871  702  522  307 
# Very Good 1513 2400 2164 2299 1824 1204  678 
# Premium   1603 2337 2331 2924 2360 1428  808 
# Ideal     2834 3903 3826 4884 3115 2093  896  

# In order to run the test we just use the chisq.test function. 
chisq.test(tbl)  

# Pearson’s Chi-squared test 
# data:  tbl 
# X-squared = 310.32, df = 24, p-value < 2.2e-16
# It is also possible to compute the p-values using a monte-carlo simulation 
# It's needed to add the simulate.p.value = TRUE flag and the amount of 
simulations 
chisq.test(tbl, simulate.p.value = TRUE, B = 2000)  

# Pearson’s Chi-squared test with simulated p-value (based on 2000 replicates) 
# data:  tbl 
# X-squared = 310.32, df = NA, p-value = 0.0004998

Т-тест

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

data = diamonds[diamonds$cut %in% c('Fair', 'Ideal'), ]

data$cut = droplevels.factor(data$cut) # Drop levels that aren’t used from the 
cut variable 
df1 = data[, c('cut', 'price')]  

# We can see the price means are different for each group 
tapply(df1$price, df1$cut, mean) 
# Fair    Ideal  
# 4358.758 3457.542

T-тесты реализованы в R с помощью функции t.test . Интерфейс формулы для t.test является самым простым способом его использования, идея состоит в том, что числовая переменная объясняется групповой переменной.

Например: t.test (numeric_variable ~ group_variable, data = data) . В предыдущем примере numeric_variable это цена, а group_variable обрезается .

Со статистической точки зрения мы проверяем, есть ли различия в распределении числовой переменной между двумя группами. Формально проверка гипотезы описывается нулевой гипотезой (H0) и альтернативной гипотезой (H1).

  • H0: нет различий в распределении переменной цены между группами Fair и Ideal

  • H1 Существуют различия в распределении переменной цены между группами Fair и Ideal

H0: нет различий в распределении переменной цены между группами Fair и Ideal

H1 Существуют различия в распределении переменной цены между группами Fair и Ideal

Следующее может быть реализовано в R с помощью следующего кода:

t.test(price ~ cut, data = data)

# Welch Two Sample t-test 
#  
# data:  price by cut 
# t = 9.7484, df = 1894.8, p-value < 2.2e-16 
# alternative hypothesis: true difference in means is not equal to 0 
# 95 percent confidence interval: 
#   719.9065 1082.5251 
# sample estimates: 
#   mean in group Fair mean in group Ideal  
#   4358.758            3457.542   

# Another way to validate the previous results is to just plot the 
distributions using a box-plot 
plot(price ~ cut, data = data, ylim = c(0,12000),  
   col = 'deepskyblue3') 

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

Команда plot создает график, который показывает связь между ценой и переменной среза. Это коробка-сюжет; мы рассмотрели этот график в разделе 16.0.1, но он в основном показывает распределение переменной цены для двух анализируемых уровней снижения.

Различный уровень Cut

Дисперсионный анализ

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

ANOVA полезны для сравнения трех или более групп по статистической значимости, поскольку выполнение нескольких t-тестов с двумя выборками приведет к увеличению вероятности совершения статистической ошибки типа I.

С точки зрения предоставления математического объяснения, следующее необходимо для понимания теста.

x ij = x + (x i — x) + (x ij — x)

Это приводит к следующей модели —

x ij = μ + α i + ∈ ij

где μ — среднее значение, а α i — среднее по i -й группе. Предполагается, что ошибочный член ij является iid из нормального распределения. Нулевая гипотеза теста заключается в том, что —

α 1 = α 2 =… = α k

С точки зрения вычисления тестовой статистики нам нужно вычислить два значения:

  • Сумма квадратов для разности групп —

SSDB= sumki sumnj( barx bari barx)2

  • Суммы квадратов внутри групп

SSDW= sumki sumnj( barx barij barx bari))2

где SSD B имеет степень свободы k − 1, а SSD W имеет степень свободы N − k. Затем мы можем определить среднеквадратичные различия для каждой метрики.

MS B = SSD B / (k — 1)

MS w = SSD w / (N — k)

Наконец, тестовая статистика в ANOVA определяется как отношение двух вышеуказанных величин.

F = MS B / MS w

который следует F-распределению с k − 1 и N − k степенями свободы. Если нулевая гипотеза верна, F, вероятно, будет близок к 1. В противном случае среднеквадратичное MSB между группами, вероятно, будет большим, что приводит к большому значению F.

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

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

library(ggplot2)
# We will be using the mtcars dataset 

head(mtcars) 
#                    mpg  cyl disp  hp drat  wt  qsec   vs am  gear carb 
# Mazda RX4         21.0   6  160 110 3.90 2.620 16.46  0  1    4    4 
# Mazda RX4 Wag     21.0   6  160 110 3.90 2.875 17.02  0  1    4    4 
# Datsun 710        22.8   4  108  93 3.85 2.320 18.61  1  1    4    1 
# Hornet 4 Drive    21.4   6  258 110 3.08 3.215 19.44  1  0    3    1 
# Hornet Sportabout 18.7   8  360 175 3.15 3.440 17.02  0  0    3    2 
# Valiant           18.1   6  225 105 2.76 3.460 20.22  1  0    3    1  

# Let's see if there are differences between the groups of cyl in the mpg variable. 
data = mtcars[, c('mpg', 'cyl')]  
fit = lm(mpg ~ cyl, data = mtcars) 
anova(fit)  

# Analysis of Variance Table 
# Response: mpg 
#           Df Sum Sq Mean Sq F value    Pr(>F)     
# cyl        1 817.71  817.71  79.561 6.113e-10 *** 
# Residuals 30 308.33   10.28 
# Signif. codes:  0 *** 0.001 ** 0.01 * 0.05 . 
# Plot the distribution 
plot(mpg ~ as.factor(cyl), data = mtcars, col = 'deepskyblue3')

Код выдаст следующий вывод —

Анализ отклонений

Значение p, которое мы получаем в этом примере, значительно меньше 0,05, поэтому R возвращает символ «***», чтобы обозначить это. Это означает, что мы отвергаем нулевую гипотезу и находим различия между средними значениями mpg между различными группами переменной cyl .

Машинное обучение для анализа данных

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

Машинное обучение можно разделить на два типа задач —

  • Контролируемое обучение
  • Обучение без учителя

Контролируемое обучение

Контролируемое обучение относится к типу проблемы, когда есть входные данные, определенные как матрица X, и мы заинтересованы в прогнозировании ответа y . Где X = {x 1 , x 2 ,…, x n } имеет n предикторов и имеет два значения y = {c 1 , c 2 } .

В качестве примера приложения можно было бы предсказать вероятность того, что веб-пользователь нажмет на рекламу, используя демографические функции в качестве предикторов. Это часто вызывается для прогнозирования рейтинга кликов (CTR). Тогда y = {click, not-click}, и предикторами могут быть используемый IP-адрес, день, когда он зашел на сайт, город пользователя, страна и другие функции, которые могут быть доступны.

Обучение без учителя

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

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

Аналитика больших данных — наивный байесовский классификатор

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

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

Наивный байесовский алгоритм — это условная вероятностная модель: учитывая классифицируемый экземпляр задачи, представленный вектором x = (x 1 ,…, x n ), представляющим некоторые n признаков (независимых переменных), он присваивает этому экземпляру вероятности для каждого из K возможные результаты или занятия.

p(Ck|x1,.....,xn)

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

p(Ck|x)= fracp(Ck)p(x|Ck)p(x)

Это означает, что при указанных выше предположениях о независимости условное распределение по переменной класса C равно:

p(Ck|x1,.....,xn)= frac1Zp(Ck) prodni=1p(xi|Ck)

где доказательство Z = p ( x ) — это масштабный коэффициент, зависящий только от x 1 ,…, x n , то есть константа, если известны значения характерных переменных. Одно общее правило — выбрать наиболее вероятную гипотезу; это называется максимальным апостериорным или MAP-правилом принятия решения. Соответствующий классификатор, классификатор Байеса, является функцией, которая присваивает метку класса  haty=Ck для некоторого k следующим образом:

 haty=argmaxp(Ck) prodni=1p(xi|Ck)

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

Следующий скрипт доступен в файле bda / part3 / naive_bayes / naive_bayes.R .

# Install these packages 
pkgs = c("klaR", "caret", "ElemStatLearn") 
install.packages(pkgs)  
library('ElemStatLearn') 
library("klaR") 
library("caret")  

# Split the data in training and testing 
inx = sample(nrow(spam), round(nrow(spam) * 0.9)) 
train = spam[inx,] 
test = spam[-inx,]  

# Define a matrix with features, X_train 
# And a vector with class labels, y_train 
X_train = train[,-58] 
y_train = train$spam  
X_test = test[,-58] 
y_test = test$spam  
# Train the model 
nb_model = train(X_train, y_train, method = 'nb',  
   trControl = trainControl(method = 'cv', number = 3)) 

# Compute  
preds = predict(nb_model$finalModel, X_test)$class 
tbl = table(y_test, yhat = preds) 
sum(diag(tbl)) / sum(tbl) 
# 0.7217391 

Как видно из результата, точность наивной байесовской модели составляет 72%. Это означает, что модель правильно классифицирует 72% экземпляров.

Аналитика больших данных — кластеризация K-Means

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

При заданном наборе наблюдений (x 1 , x 2 ,…, x n ) , где каждое наблюдение представляет собой вещественный реальный вектор в d-измерении, кластеризация k-средних имеет целью разделить n наблюдений на k групп G = {G 1 , G 2 ,…, G k }, чтобы минимизировать сумму квадратов в пределах кластера (WCSS), определенную следующим образом:

argmin sumki=1 sumx inSi параллельныйx mui параллельный2

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

В следующем примере показано, как запустить алгоритм кластеризации k-средних в R.

library(ggplot2)
# Prepare Data 
data = mtcars  

# We need to scale the data to have zero mean and unit variance 
data <- scale(data)  

# Determine number of clusters 
wss <- (nrow(data)-1)*sum(apply(data,2,var)) 
for (i in 2:dim(data)[2]) { 
   wss[i] <- sum(kmeans(data, centers = i)$withinss) 
}  

# Plot the clusters 
plot(1:dim(data)[2], wss, type = "b", xlab = "Number of Clusters", 
   ylab = "Within groups sum of squares")

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

Числовой кластер

Теперь, когда значение K определено, необходимо запустить алгоритм с этим значением.

# K-Means Cluster Analysis
fit <- kmeans(data, 5) # 5 cluster solution 

# get cluster means  
aggregate(data,by = list(fit$cluster),FUN = mean) 

# append cluster assignment 
data <- data.frame(data, fit$cluster) 

Аналитика больших данных — правила ассоциации

Пусть I = i 1 , i 2 , …, i n будет набором из n двоичных атрибутов, называемых элементами. Пусть D = t 1 , t 2 , …, t m — набор транзакций, называемый базой данных. Каждая транзакция в D имеет уникальный идентификатор транзакции и содержит подмножество элементов в I. Правило определяется как следствие вида X ⇒ Y, где X, Y ⊆ I и X ∩ Y = ∅.

Наборы элементов (для коротких наборов элементов) X и Y называются предшествующими (левая сторона или LHS) и последовательными (правая сторона или RHS) правила.

Чтобы проиллюстрировать концепции, мы используем небольшой пример из домена супермаркета. Набор элементов — это I = {молоко, хлеб, масло, пиво}, а небольшая база данных, содержащая элементы, показана в следующей таблице.

номер транзакции Предметы
1 молоко, хлеб
2 хлеб, масло
3 пиво
4 молоко, хлеб, масло
5 хлеб, масло

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

Поддержка Supp (X) набора элементов X определяется как доля транзакций в наборе данных, которые содержат набор элементов. В примере базы данных в Таблице 1 набор элементов {молоко, хлеб} имеет поддержку 2/5 = 0,4, поскольку он происходит в 40% всех транзакций (2 из 5 транзакций). Поиск частых наборов предметов можно рассматривать как упрощение проблемы обучения без присмотра.

Доверие к правилу определено conf (X ⇒ Y) = supp (X ∪ Y) / supp (X). Например, правило {молоко, хлеб} ⇒ {масло} имеет достоверность 0,2 / 0,4 = 0,5 в базе данных в таблице 1, что означает, что для 50% операций, содержащих молоко и хлеб, правило является правильным. Доверие можно интерпретировать как оценку вероятности P (Y | X), вероятности нахождения RHS правила в транзакциях при условии, что эти транзакции также содержат LHS.

В скрипте, расположенном в bda / part3 / apriori.R, можно найти код для реализации алгоритма apriori .

# Load the library for doing association rules
# install.packages(’arules’) 
library(arules)  

# Data preprocessing 
data("AdultUCI") 
AdultUCI[1:2,]  
AdultUCI[["fnlwgt"]] <- NULL 
AdultUCI[["education-num"]] <- NULL  

AdultUCI[[ "age"]] <- ordered(cut(AdultUCI[[ "age"]], c(15,25,45,65,100)), 
   labels = c("Young", "Middle-aged", "Senior", "Old")) 
AdultUCI[[ "hours-per-week"]] <- ordered(cut(AdultUCI[[ "hours-per-week"]], 
   c(0,25,40,60,168)), labels = c("Part-time", "Full-time", "Over-time", "Workaholic")) 
AdultUCI[[ "capital-gain"]] <- ordered(cut(AdultUCI[[ "capital-gain"]], 
   c(-Inf,0,median(AdultUCI[[ "capital-gain"]][AdultUCI[[ "capitalgain"]]>0]),Inf)), 
   labels = c("None", "Low", "High")) 
AdultUCI[[ "capital-loss"]] <- ordered(cut(AdultUCI[[ "capital-loss"]], 
   c(-Inf,0, median(AdultUCI[[ "capital-loss"]][AdultUCI[[ "capitalloss"]]>0]),Inf)), 
   labels = c("none", "low", "high"))

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

# Convert the data into a transactions format
Adult <- as(AdultUCI, "transactions") 
Adult 
# transactions in sparse format with 
# 48842 transactions (rows) and 
# 115 items (columns)  

summary(Adult)  
# Plot frequent item-sets 
itemFrequencyPlot(Adult, support = 0.1, cex.names = 0.8)  

# generate rules 
min_support = 0.01 
confidence = 0.6 
rules <- apriori(Adult, parameter = list(support = min_support, confidence = confidence))

rules 
inspect(rules[100:110, ]) 
# lhs                             rhs                      support     confidence  lift
# {occupation = Farming-fishing} => {sex = Male}        0.02856148  0.9362416   1.4005486
# {occupation = Farming-fishing} => {race = White}      0.02831579  0.9281879   1.0855456
# {occupation = Farming-fishing} => {native-country     0.02671881  0.8758389   0.9759474
                                       = United-States} 

Аналитика больших данных — деревья решений

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

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

Деревья решений, используемые в интеллектуальном анализе данных, делятся на два основных типа:

  • Классификационное дерево — когда ответ является номинальной переменной, например, является ли электронная почта спамом или нет.

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

Классификационное дерево — когда ответ является номинальной переменной, например, является ли электронная почта спамом или нет.

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

Деревья решений являются простым методом, и как таковые имеют некоторые проблемы. Одна из этих проблем — высокая дисперсия в результирующих моделях, которые создают деревья решений. Чтобы решить эту проблему, были разработаны ансамблевые методы деревьев решений. В настоящее время широко используются две группы методов ансамбля:

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

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

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

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

# Install the party package
# install.packages('party') 
library(party) 
library(ggplot2)  

head(diamonds) 
# We will predict the cut of diamonds using the features available in the 
diamonds dataset. 
ct = ctree(cut ~ ., data = diamonds) 

# plot(ct, main="Conditional Inference Tree") 
# Example output 
# Response:  cut  
# Inputs:  carat, color, clarity, depth, table, price, x, y, z  

# Number of observations:  53940  
#  
# 1) table <= 57; criterion = 1, statistic = 10131.878 
#   2) depth <= 63; criterion = 1, statistic = 8377.279 
#     3) table <= 56.4; criterion = 1, statistic = 226.423 
#       4) z <= 2.64; criterion = 1, statistic = 70.393 
#         5) clarity <= VS1; criterion = 0.989, statistic = 10.48 
#           6) color <= E; criterion = 0.997, statistic = 12.829 
#             7)*  weights = 82  
#           6) color > E  

#Table of prediction errors 
table(predict(ct), diamonds$cut) 
#            Fair  Good Very Good Premium Ideal 
# Fair       1388   171        17       0    14 
# Good        102  2912       499      26    27 
# Very Good    54   998      3334     249   355 
# Premium      44   711      5054   11915  1167 
# Ideal        22   114      3178    1601 19988 
# Estimated class probabilities 
probs = predict(ct, newdata = diamonds, type = "prob") 
probs = do.call(rbind, probs) 
head(probs)

Аналитика больших данных — логистическая регрессия

Логистическая регрессия — это классификационная модель, в которой переменная ответа является категориальной. Этот алгоритм основан на статистике и используется для контролируемых задач классификации. В логистической регрессии мы стремимся найти вектор β параметров в следующем уравнении, которое минимизирует функцию стоимости.

logit(pi)=ln left( fracpi1pi right)= beta0+ beta1x1,i+...+ betakxk,i

Следующий код демонстрирует, как вписать модель логистической регрессии в R. Мы будем использовать здесь набор данных спама, чтобы продемонстрировать логистическую регрессию, ту же, что была использована для Наивного Байеса.

Исходя из результатов прогнозов с точки зрения точности, мы находим, что регрессионная модель достигает 92,5% точности в тестовом наборе по сравнению с 72%, достигнутыми классификатором Наивного Байеса.

library(ElemStatLearn)
head(spam) 

# Split dataset in training and testing 
inx = sample(nrow(spam), round(nrow(spam) * 0.8)) 
train = spam[inx,] 
test = spam[-inx,]  

# Fit regression model 
fit = glm(spam ~ ., data = train, family = binomial()) 
summary(fit)  

# Call: 
#   glm(formula = spam ~ ., family = binomial(), data = train) 
#  

# Deviance Residuals:  
#   Min       1Q   Median       3Q      Max   
# -4.5172  -0.2039   0.0000   0.1111   5.4944
# Coefficients: 
# Estimate Std. Error z value Pr(>|z|)     
# (Intercept) -1.511e+00  1.546e-01  -9.772  < 2e-16 *** 
# A.1         -4.546e-01  2.560e-01  -1.776 0.075720 .   
# A.2         -1.630e-01  7.731e-02  -2.108 0.035043 *   
# A.3          1.487e-01  1.261e-01   1.179 0.238591     
# A.4          2.055e+00  1.467e+00   1.401 0.161153     
# A.5          6.165e-01  1.191e-01   5.177 2.25e-07 *** 
# A.6          7.156e-01  2.768e-01   2.585 0.009747 **  
# A.7          2.606e+00  3.917e-01   6.652 2.88e-11 *** 
# A.8          6.750e-01  2.284e-01   2.955 0.003127 **  
# A.9          1.197e+00  3.362e-01   3.559 0.000373 *** 
# Signif. codes:  0 *** 0.001 ** 0.01 * 0.05 . 0.1  1  

### Make predictions 
preds = predict(fit, test, type = ’response’) 
preds = ifelse(preds > 0.5, 1, 0) 
tbl = table(target = test$spam, preds) 
tbl 

#         preds 
# target    0   1 
# email   535  23 
# spam     46 316 
sum(diag(tbl)) / sum(tbl) 
# 0.925

Аналитика больших данных — анализ временных рядов

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

Отметка Сток — Цена
2015-10-11 09:00:00 100
2015-10-11 10:00:00 110
2015-10-11 11:00:00 105
2015-10-11 12:00:00 90
2015-10-11 13:00:00 120

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

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

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

Наиболее широко используемая модель для анализа временных рядов называется авторегрессионной скользящей средней (ARMA). Модель состоит из двух частей: авторегрессионной (AR) и скользящей средней (MA). Затем модель обычно называют моделью ARMA (p, q), где p — порядок авторегрессионной части, а q — порядок скользящей средней.

Авторегрессионная модель

AR (p) читается как авторегрессионная модель порядка p. Математически это записывается как —

Xt=c+ sumPi=1 phiiXti+ varepsilont

где {φ 1 ,…, φ p } — параметры, подлежащие оценке, c — постоянная величина, а случайная величина ε t представляет белый шум. Некоторые ограничения необходимы для значений параметров, чтобы модель оставалась стационарной.

Скользящая средняя

Обозначение MA (q) относится к модели скользящего среднего порядка q

Xt= mu+ varepsilont+ sumqi=1 thetai varepsilonti

где θ 1 , …, θ q — параметры модели, μ — ожидание X t , а ε t , ε t — 1 , … — члены ошибки белого шума.

Авторегрессивная скользящая средняя

Модель ARMA (p, q) объединяет p членов авторегрессии и q членов скользящего среднего. Математически модель выражается следующей формулой:

Xt=c+ varepsilont+ sumPi=1 phiiXt1+ sumqi=1 thetai varepsilonti

Мы видим, что модель ARMA (p, q) представляет собой комбинацию моделей AR (p) и MA (q) .

Чтобы дать некоторую интуицию модели, рассмотрим, что AR-часть уравнения стремится оценить параметры для наблюдений X t — i , чтобы предсказать значение переменной в X t . В конце концов, это средневзвешенное значение прошлых значений. Раздел MA использует тот же подход, но с ошибкой предыдущих наблюдений, ε t — i . Таким образом, в итоге результат модели является средневзвешенным.

Следующий фрагмент кода демонстрирует, как реализовать ARMA (p, q) в R.

# install.packages("forecast")
library("forecast")  

# Read the data 
data = scan('fancy.dat') 
ts_data <- ts(data, frequency = 12, start = c(1987,1)) 
ts_data  
plot.ts(ts_data)

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

Временной ряд

Следующий код соответствует модели ARMA для данных. Он запускает несколько комбинаций моделей и выбирает ту, в которой меньше ошибок.

# Fit the ARMA model
fit = auto.arima(ts_data) 
summary(fit) 

# Series: ts_data  
# ARIMA(1,1,1)(0,1,1)[12]                     
#    Coefficients: 
#    ar1     ma1    sma1 
# 0.2401  -0.9013  0.7499 
# s.e.  0.1427   0.0709  0.1790 

#  
# sigma^2 estimated as 15464184:  log likelihood = -693.69 
# AIC = 1395.38   AICc = 1395.98   BIC = 1404.43 

# Training set error measures: 
#                 ME        RMSE      MAE        MPE        MAPE      MASE       ACF1 
# Training set   328.301  3615.374  2171.002  -2.481166  15.97302  0.4905797 -0.02521172

Аналитика больших данных — текстовая аналитика

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

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

library(tm)
library(data.table)  

source('text_analytics/text_analytics_functions.R') 
data = fread('text_analytics/data/profiles.txt') 
rate = as.numeric(data$rate) 
keep = !is.na(rate) 
rate = rate[keep]  

### Make bag of words of title and body 
X_all = bag_words(data$user_skills[keep]) 
X_all = removeSparseTerms(X_all, 0.999) 
X_all 

# <<DocumentTermMatrix (documents: 389, terms: 1422)>> 
#   Non-/sparse entries: 4057/549101 
# Sparsity           : 99% 
# Maximal term length: 80 
# Weighting          : term frequency - inverse document frequency (normalized) (tf-idf) 

### Make a sparse matrix with all the data 
X_all <- as_sparseMatrix(X_all)

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

train_inx = 1:200
X_train = X_all[train_inx, ] 
y_train = rate[train_inx]  
X_test = X_all[-train_inx, ] 
y_test = rate[-train_inx]  

# Train a regression model 
library(glmnet) 
fit <- cv.glmnet(x = X_train, y = y_train,  
   family = 'gaussian', alpha = 1,  
   nfolds = 3, type.measure = 'mae') 
plot(fit)  

# Make predictions 
predictions = predict(fit, newx = X_test) 
predictions = as.vector(predictions[,1]) 
head(predictions)  

# 36.23598 36.43046 51.69786 26.06811 35.13185 37.66367 
# We can compute the mean absolute error for the test data 
mean(abs(y_test - predictions)) 
# 15.02175

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

Аналитика больших данных — онлайн-обучение

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

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

J( theta)= frac1m left[ summi=1y(i)log(h theta(x(i)))+(1y(i))log(1h theta(x(i)))) right]

где J (θ) представляет функцию стоимости, а h θ (x) представляет гипотезу. В случае логистической регрессии это определяется по следующей формуле —

h theta(x)= frac11+e thetaTx

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

 thetaj:= thetaj alpha(h theta(x)y)x

Существует несколько реализаций следующего алгоритма, но тот, который реализован в библиотеке wowbit vowpal , безусловно, наиболее развит. Библиотека позволяет обучать крупномасштабные регрессионные модели и использует небольшие объемы оперативной памяти. По словам авторов, это описывается так: «Проект Vowpal Wabbit (VW) — это быстрая система обучения, основанная на ядре, спонсируемая Microsoft Research и (ранее) Yahoo! Research».

Мы будем работать с титановым набором данных из соревнований по борьбе. Исходные данные можно найти в папке bda / part3 / vw . Здесь у нас есть два файла —

  • У нас есть тренировочные данные (train_titanic.csv), и
  • немаркированные данные для новых прогнозов (test_titanic.csv).

Чтобы преобразовать формат csv во входной формат vowpal wabbit, используйте скрипт Python csv_to_vowpal_wabbit.py . Для этого вам, очевидно, потребуется установить python. Перейдите в папку bda / part3 / vw , откройте терминал и выполните следующую команду —

python csv_to_vowpal_wabbit.py

Обратите внимание, что для этого раздела, если вы используете Windows, вам нужно установить командную строку Unix, для этого зайдите на веб-сайт cygwin .

Откройте терминал, а также в папке bda / part3 / vw и выполните следующую команду —

vw train_titanic.vw -f model.vw --binary --passes 20 -c -q ff --sgd --l1 
0.00000001 --l2 0.0000001 --learning_rate 0.5 --loss_function logistic

Давайте разберем, что означает каждый аргумент вызова vw .

  • -f model.vw — означает, что мы сохраняем модель в файле model.vw для последующего прогнозирования

  • —binary — сообщает о потере как двоичная классификация с -1,1 метками

  • —passes 20 — данные используются 20 раз, чтобы узнать вес

  • -c — создать файл кеша

  • -q ff — использовать квадратичные функции в пространстве имен f

  • —sgd — использовать регулярное / классическое / простое обновление стохастического градиентного спуска, т. е. неадаптивное, ненормализованное и неинвариантное.

  • —l1 —l2 — регуляризация нормы L1 и L2

  • —learning_rate 0.5 — Скорость обучения, определенная в формуле правила обновления

-f model.vw — означает, что мы сохраняем модель в файле model.vw для последующего прогнозирования

—binary — сообщает о потере как двоичная классификация с -1,1 метками

—passes 20 — данные используются 20 раз, чтобы узнать вес

-c — создать файл кеша

-q ff — использовать квадратичные функции в пространстве имен f

—sgd — использовать регулярное / классическое / простое обновление стохастического градиентного спуска, т. е. неадаптивное, ненормализованное и неинвариантное.

—l1 —l2 — регуляризация нормы L1 и L2

—learning_rate 0.5 — Скорость обучения, определенная в формуле правила обновления

Следующий код показывает результаты запуска модели регрессии в командной строке. В результате мы получаем среднее значение log-loss и небольшой отчет о производительности алгоритма.

-loss_function logistic
creating quadratic features for pairs: ff  
using l1 regularization = 1e-08 
using l2 regularization = 1e-07 

final_regressor = model.vw 
Num weight bits = 18 
learning rate = 0.5 
initial_t = 1 
power_t = 0.5 
decay_learning_rate = 1 
using cache_file = train_titanic.vw.cache 
ignoring text input in favor of cache input 
num sources = 1 

average    since         example   example  current  current  current 
loss       last          counter   weight    label   predict  features 
0.000000   0.000000          1      1.0    -1.0000   -1.0000       57 
0.500000   1.000000          2      2.0     1.0000   -1.0000       57 
0.250000   0.000000          4      4.0     1.0000    1.0000       57 
0.375000   0.500000          8      8.0    -1.0000   -1.0000       73 
0.625000   0.875000         16     16.0    -1.0000    1.0000       73 
0.468750   0.312500         32     32.0    -1.0000   -1.0000       57 
0.468750   0.468750         64     64.0    -1.0000    1.0000       43 
0.375000   0.281250        128    128.0     1.0000   -1.0000       43 
0.351562   0.328125        256    256.0     1.0000   -1.0000       43 
0.359375   0.367188        512    512.0    -1.0000    1.0000       57 
0.274336   0.274336       1024   1024.0    -1.0000   -1.0000       57 h 
0.281938   0.289474       2048   2048.0    -1.0000   -1.0000       43 h 
0.246696   0.211454       4096   4096.0    -1.0000   -1.0000       43 h 
0.218922   0.191209       8192   8192.0     1.0000    1.0000       43 h 

finished run 
number of examples per pass = 802 
passes used = 11 
weighted example sum = 8822 
weighted label sum = -2288 
average loss = 0.179775 h 
best constant = -0.530826 
best constant’s loss = 0.659128 
total feature number = 427878

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

vw -d test_titanic.vw -t -i model.vw -p predictions.txt 

Прогнозы, сгенерированные в предыдущей команде, не нормализуются для соответствия диапазону [0, 1]. Для этого мы используем сигмовидную трансформацию.