Извлечение значимых статистических показателей из данных в формате JSON с использованием языка R

Интеграция данных в формате JSON с помощью языка R

В статье описано, как интегрировать данные JavaScript Object Notation (JSON), такие, например, как данные, полученные с помощью InfoSphere® BigInsights™, с языком для статистических вычислений R. Также описаны базовые типы данных, команды, используемые в R, и его графическая среда.

Уильям Харли, библиотекарь, American Irish Historical Society

William HurleyУильям Харли (William Hurley) много лет работал с большими массивами данных для мощных Интернет-приложений для некоммерческих организаций в Нью-Йорке и его окрестностях.



30.06.2014

Язык R - это мощный язык программирования, работающий в режиме вычислений в памяти, который используют для статистических вычислений и графического отображения данных. Он похож на SAS, IBM SPSS® Statistics, MATLAB или FORTRAN во всем, кроме того, что он является языком с открытым кодом. Существуют конверторы, позволяющие легко переносить данные, хранящиеся в форматах SAS, IBM SPSS Statistics или MATLAB в R. Кроме того, R поставляется с широким набором пакетов, доступных через Comprehensive R Archive Network (CRAN) – всеобщую сеть архивов для R. CRAN выполняет ту же самую функцию, что и CPAN для языка Perl или Rubygems.org для языка Ruby. R также интегрируется с InfoSphere BigInsights (см. Ресурсы).

Версия InfoSphere BigInsights Quick Start Edition

Пакет InfoSphere BigInsights Quick Start Edition является бесплатной загружаемой версией InfoSphere BigInsights продукта IBM на основе Hadoop. Используя Quick Start Edition, вы можете протестировать разработанные IBM расширения для платформы с открытым кодом Hadoop, такие как Big SQL, текстовая аналитика и BigSheets. Набор учебных материалов облегчает изучение продукта; в его состав входят пошаговые руководства, самоучители и видеокурсы, позволяющие приступить к использованию Hadoop при решении своих задач. Безо всяких ограничений на время или размер данных вы можете экспериментировать в удобное для себя время с любыми объемами данных. Посмотрите видео, загрузите руководства (PDF) и BigInsights Quick Start Edition прямо сейчас.

InfoSphere BigInsights использует формат JSON для сохранения и отображения данных. В этой статье описано, каким образом использовать JSON с языком R. JSON – это формат хранения данных, построенный по принципу "ключ-значение", который может отображаться непосредственно в объекты JavaScript. В статье в качестве примера рассматривается множество студентов и их предметов и оценок на экзаменах.

Настройка среды разработки

Для начала необходимо настроить среду разработки. Для этого вам нужно иметь R и, возможно, интегрированную среду разработки (IDE) RStudio. Большинство систем управления конфигурациями (apt, yum и другие) по умолчанию содержат R версии 2.15. Если вы хотите иметь более новую версию R (3.0.2 в момент написания статьи), то вам нужно отредактировать ссылки на источники кода.

Чтобы сделать это в Debian, например, откройте файл /etc/apt/sources.list чтобы добавить следующую строку:

deb http://favorite-cran-mirror/bin/linux/debian wheezy-cran3/

Замените favorite-cran-mirror на ближайшее к вам зеркало. В разделе Ресурсы приведен полный список зеркал CRAN. На вашем зеркале CRAN приведены инструкции для других дистрибутивов, таких как Red Hat Enterprise Linux®, SuSE и Ubuntu, а также ссылка на терминальный интерфейс к R.

Далее вам нужно научить R читать данные в формате JSON. Это можно сделать с помощью пакета JSON для R (rjson), который доступен в CRAN. Для начала откройте терминал R. Синтаксис для импорта пакета в локальную инсталляцию R имеет вид:

install.packages("rjson")

Далее делаем его доступным командой:

library("rjson")

Вместо rjson можно подставить имя любого пакета, доступного в CRAN.

Основными командами в rjson являются fromJSON() и toJSON(). В этой статье рассматривается только команда fromJSON(), поскольку она более полезна при взаимодействии с существующими данными, например, с данными, созданными или сформированными с помощью InfoSphere BigInsights.

Если у вас еще нет файла с примером grades.json, загрузите его и сохраните в папке с открытым доступом (см. Загрузки). Далее импортируйте файл в R следующей командой:

grades=fromJSON(file = '/path_to_file/grades.json',  unexpected.escape = "error")

Не забудьте подставить вместо path_to_file реальный путь к вашему файлу.

Флаг unexpected.escape указывает rjson, как обрабатывать неожиданные символы перевода строки. Допустимые значения для этого флага: error, keep и skip.


Базовые команды R

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

help(name_of_command)

В качестве альтернативы можно использовать следующую команду:

?name_of_command

Замените name_of_command на имя команды, информацию о которой вы хотите получить. Например, чтобы прочитать страницу руководства, посвященную команде help(library). Это действие приведет к открытию страницы руководства, описывающей функцию library. Чтобы закрыть страницу руководства и вернуться в командную строку R, введите q.

Перед импортом данных в R часто бывает полезно очистить данные, используя другие языки, такие как Perl или Ruby. Подробное рассмотрение этого вопроса выходит за рамки настоящей статьи, но упомянем, что R предоставляет набор инструментов для очистки данных. Дополнительно отметим, что пакет rjson содержит возможность установки флага, описывающего правила пропуска или обработки специальных символов. R также содержит функции sub() и gsub(), которые преобразуют данные на основе регулярных выражений (regex). Функция gsub имеет следующий синтаксис:

gsub(pattern, replacement, x, ignore.case = FALSE, perl = FALSE,
fixed = FALSE, useBytes = FALSE)

Например, gsub("A", "a", grades) преобразует все символы A верхнего регистра в a нижнего регистра в возвращаемом значении. Флаг perl заставляет R использовать библиотеку Perl-совместимых регулярных выражений вместо стандартных регулярных выражений, что может быть полезно, если у вас уже есть набор правил, которые вы хотите импортировать из Perl.

Поддержка R в IBM SPSS Statistics и SPSS Modeler

Алгоритмы R можно выполнять внутри SPSS Statistics и SPSS Modeler, совмещая их с алгоритмами и статистическими технологиями SPSS Statistics, проверенными и апробированными в течение более чем 40 лет использования и тестирования. SPSS Statistics Programmability Extension позволяет расширить функциональность SPSS Statistics за счет использования внешних языков программирования, таких как Python, R, .NET версией Microsoft® Visual Basic и Java™. Внешние приложения также получают доступ к вычислительному модулю SPSS Statistics всему богатству его функций. Узнайте больше про SPSS Statistics и SPSS Modeler и получите ознакомительную версию SPSS Statistics бесплатно.

Метод sub() меняет первое обнаруженное вхождение шаблона в набор данных. Метод gsub() меняет все вхождения.

Еще одним полезным инструментом, содержащимся в R, является команда edit() или fix(). С его помощью вы можете редактировать массив данных непосредственно в процессе использования. Например, edit(grades) открывает объект grades, ранее созданный, как описано в статье. С помощью этого инструмента можно менять данные "на лету". В R по умолчанию используется редактор vi. Если вы хотите использовать другой редактор, его можно поменять опцией options(editor = "nano"). Подставьте вместо nano в указанной команде выбранный текстовый редактор, например, Pico или gedit.

Кроме того, вы можете вызывать другие языки непосредственно из R, используя команду system(), которая вызывает команду в сеансе командной оболочки операционной системы и затем передает результат в основной сеанс R. Например, system('echo "something"') выходит из основного сеанса сессии и запускает команду echo "something" в дочернем сеансе. Затем происходит перехват возвращаемого значения из стандартного потока вывода stdout — в нашем случае это слово something— и возврат его как результата выполнения функции в сеанс R. В следующей команде флаг intern превращает возвращаемое значение в объект, с которым вы можете работать:

system('echo "something"', intern=TRUE)

Еще один, возможно, более полезный пример, в котором создается из возвращаемого значения произвольного скрипта на любом языке, доступном в сеансе командной оболочки, создается объект R:

system('./my/script/here.pl', intern=true)

Типы JSON-данных в R

Чтобы понять, каким образом R работает с данными JSON, начнем с библиотеки rjson, которая импортирует данные в формате списка. Чтобы узнать подробнее о типах данных R, можно перейти по ссылке в разделе Ресурсы. Тип данных "список" является наиболее гибким, поскольку вы данные из списка можно преобразовать в любой другой тип данных и данные не ограничены требованием одинаковой длины (в отличие от типа "вектор", который это ограничение имеет). Однако многие статистические функции, применимые к массивам данных, недоступны для данных в формате "список". Поэтому вам придется извлечь полезные данные из данных, оформленных в виде списка, и преобразовать их в другие форматы.

Чтобы понять, как R воспринимает некоторый элемент данных, удобно воспользоваться командой str(). Если вы используете объект grades, созданный ранее, выходной поток str(grades) будет иметь вид, приведенный в листинге 1.

Листинг 1. Структура данных JSON в R
str(grades)
List of 4
    $ :List of 4
    ..$ name  : chr "Amy"
    ..$ grade1: num 35
    ..$ grade2: num 41
    ..$ grade3: num 53
$ :List of 4
    ..$ name  : chr "Bob"
    ..$ grade1: num 44
    ..$ grade2: num 37
    ..$ grade3: num 28
$ :List of 4
    ..$ name  : chr "Charles"
    ..$ grade1: num 68
    ..$ grade2: num 65
    ..$ grade3: num 61
$ :List of 4
    ..$ name  : chr "David"
    ..$ grade1: num 72
    ..$ grade2: num 78
    ..$ grade3: num 81

Решите, какие компоненты данных вам необходимо извлечь, и выполните извлечение с помощью команды c() (конкатенация):

grade1.num <- c(grades[[1]]$grade1, grades[[2]]$grade1, grades[[3]]$grade1,
grades[[4]]$grade1)

Эта функция создает новый объект (grade1.num), который содержит оценку студента на первом экзамене. grade1.num представляет собой числовой вектор - наиболее часто используемый тип данных в R. Для удаления объекта R используйте команду rm(). Например, rm(grade1.num) удаляет объект grade1.num, только что созданный в сеансе R. Для создания объекта, содержащего оценки конкретного студента, можно использовать следующую команду:

Amy.grade< - c(grades[[1]]$grade1, grades[[1]]$grade2, grades[[1]]$grade3)

В этой команде используется оператор присваивания, содержащий знак «-» и символ "больше" > или "меньше" <) в зависимости от направления присваивания. Доступ к индивидуальным элементам сущностей, оформленных в виде списка, производится по номеру индекса (например, [[1]] соответствует первому элементу списка) или по имени в сочетании со знаком $ (например, $grade1).

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

Bob.grade <- c(grades[[2]]$grade1, grades[[2]]$grade2, grades[[2]]$grade3)
    Charles.grade <- c(grades[[3]]$grade1, grades[[3]]$grade2, grades[[3]]$grade3)
    David.grade <- c(grades[[4]]$grade1, grades[[4]]$grade2, grades[[4]]$grade3)

Затем объединим все векторы в один массив данных следующей командой:

All.grades <- data.frame(Amy.grade, Bob.grade, Charles.grade, David.grade)

Данные, импортированные в R из формата с разделением запятыми или из электронной таблицы, преобразуются в объект data.frame с использованием обработчиков, встроенных в R.


Статистические функции R

Для получения начального представления о статистической природе grade1.num используйте команду summary:

              summary(Amy.grade)
    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
     35      38      41      43      47      53

Команду summary также можно применить к формату data.frame. Результат выполнения команды summary(All.grades) имеет вид, приведенный в листинге 2.

Листинг 2. Общий обзор массива данных в R
              summary(All.grades)
Amy.grade    Bob.grade     Charles.grade    David.grade  
 Min.   :35   Min.   :28.00   Min.   :61.00   Min.   :72.0  
 1st Qu.:38   1st Qu.:32.50   1st Qu.:63.00   1st Qu.:75.0  
 Median :41   Median :37.00   Median :65.00   Median :78.0  
 Mean   :43   Mean   :36.33   Mean   :64.67   Mean   :77.0  
 3rd Qu.:47   3rd Qu.:40.50   3rd Qu.:66.50   3rd Qu.:79.5  
 Max.   :53   Max.   :44.00   Max.   :68.00   Max.   :81.0

Чтобы проверить, являются ли два вектора статистически коррелированными, используйте удобную функцию R, которая применима к числовым векторам: cor(). Например, можно проверить корреляцию Bob.grade с Amy.grade, используя следующую команду:

cor(Amy.grade, Bob.grade)
[1] -0.9930365

Примечание: Для вычисления дисперсии и ковариации используйте тот же синтаксис, что и для корреляции, применяя функции cov() и var(), как показано в примере:

cov(Amy.grade, Bob.grade)
[1] -73
var(Amy.grade, Bob.grade)
[1] -73

Для расчета среднего абсолютного отклонения используйте функцию mad():

mad(Charles.grade)
[1] 4.4478

Еще одна полезная функция, применимая к числовым векторам sd(), анализирует стандартное отклонение для двух и более векторов.

sd(Amy.grade)
[1] 9.165151

Эта функция показывает, что стандартное отклонение оценок Эми равно 9.165151.

Заметим, что результат имеет индекс [1]. Это означает, что вы можете обрабатывать результат выполнения функции таким же образом, как и любой другой объект, либо присвоить ему имя. Например: x<- sd(Amy.grade). Если вы измените содержимое вектора Amy.grade с помощью команды edit(), значение x тоже поменяется.

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

Листинг 3. Тест Колмогорова – Смирнова
ks.test(Amy.grade, Bob.grade)
Тест Колмогорова–Смирнова для двух 
выборок: Amy.grade и Bob.grade
D = 0.3333, p-value = 1
Альтернативная гипотеза: двусторонняя

Можно видеть, что Amy.grade и Bob.grade имеют одно и то же распределение.


Визуализация в R

Хорошо известно, что R имеет возможности для визуализации данных. Простейшей функцией в этом семействе является plot(). Например, plot(David.grade) строит по точкам график для этого объекта. Чтобы добавить заголовок и метки для осей координат, используйте команду:

plot(David.grade, main = "David's Grades", ylab = "Grade", xlab = "Test Number")

Функция dotchart аналогична функции plot и имеет множество общих с ней аргументов. Отличие заключается в том, что функция dotchart имеет флаг labels=row.names(x), который позволяет использовать имен строк (если таковые имеются) для маркировки диаграммы.

R также может строить гистограммы. Так, например, можно использовать функциюhist(All.grades[[1]]). Эта команда аналогична hist(Amy.grade), но извлекает вектор из фрейма данных, созданного ранее.

R также может строить столбцовые диаграммы с помощью функции barplot(). Например, barplot(Charles.grade). Чтобы изменить ориентацию диаграммы, добавьте флаг horiz=TRUE. Вы можете добавить цвет с помощью флага col, как показано ниже:

barplot(Charles.grade, horiz=TRUE, col="darkblue")

Также полезна графическая функция boxplot (пример использования —boxplot(All.grades)). С помощью функции boxplot можно сравнивать целые фреймы данных. Чтобы добавить метки осей, засечки для сравнения медиан, заголовок, цвета, используйте следующую функцию:

boxplot(All.grades, main = "Class Grades", ylab = "Grade",
xlab = "Test Number", col=(c("gold","darkgreen","blue","red")),
notch=TRUE)

Обратите внимание на использование функции конкатенации внутри функции boxplot.


Выводы

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


Загрузка

ОписаниеИмяРазмер
Образец кодаgrades.json.zip1КБ

Ресурсы

Научиться

Получить продукты и технологии

Обсудить

Комментарии

developerWorks: Войти

Обязательные поля отмечены звездочкой (*).


Нужен IBM ID?
Забыли Ваш IBM ID?


Забыли Ваш пароль?
Изменить пароль

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


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

Вся введенная информация защищена.

Выберите имя, которое будет отображаться на экране



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

Отображаемое имя должно иметь длину от 3 символов до 31 символа. Ваше Имя в системе должно быть уникальным. В качестве имени по соображениям приватности нельзя использовать контактный e-mail.

Обязательные поля отмечены звездочкой (*).

(Отображаемое имя должно иметь длину от 3 символов до 31 символа.)

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Вся введенная информация защищена.


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=40
Zone=Information Management
ArticleID=976127
ArticleTitle=Извлечение значимых статистических показателей из данных в формате JSON с использованием языка R
publish-date=06302014