рекомендации

суббота, 25 мая 2019 г.

Создание интерактивной визуализации данных в R с помощью Shiny App

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

Существует несколько инструментов для визуализации данных, таких как Tableau, Qlik, Dygraphs, Kibana и т. д. Если  говорить конкретно об R, он предоставляет три системы построения графиков:

    The Base Plotting System.
    The Lattice System.
    The ggplot2 System.
Но писать код для построения графиков в R снова и снова может быть очень утомительно. Кроме того, очень сложно создать интерактивную визуализацию с использованием вышеуказанных пакетов. Эти проблемы могут быть решены путем динамического создания интерактивных графиков в R с использованием Shiny.

Если вы используете R, скорее всего, вы столкнетесь с Shiny. Это открытый пакет от RStudio, используемый для создания интерактивных веб-страниц в R. Он обеспечивает очень эффективный способ совместного использования ваших разработок в интерактивном режиме с сообществом. Лучшая часть Shiny заключается в том, что вам не нужны какие-либо знания HTML, CSS или JavaScript для начала работы.

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

1. Shiny: обзор

Shiny - это открытый пакет от RStudio, который предоставляет платформу для создания интерактивных веб-приложений (визуализаций) под названием «Shiny apps». Легкость работы с Shiny сделала его популярным среди пользователей R. Эти веб-приложения легко отображают объекты R (например, графики, таблицы и т. д.).

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

Любое приложение Shiny построено с использованием двух компонентов:

1.UI.R: Этот файл создает пользовательский интерфейс в приложении shiny. Он обеспечивает интерактивность для приложения shiny, принимая данные от пользователя и динамически отображая сгенерированный вывод на экране.


2. Server.R: Этот файл содержит последовательность шагов для преобразования введенного пользователем ввода в желаемый вывод для отображения.



2. Настройка shiny

Прежде чем двигаться дальше, вам нужно настроить Shiny в системе. Для начала выполните следующие действия.

1. Создайте новый проект в R Studio



2. Выберите тип как Shiny web application.



3. Будет создано два скрипта в R Studio с именами ui.R и server.R.



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

5. Написание «ui.R»

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


Пользовательский интерфейс можно разделить на три категории:

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

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

Основная панель (Main Panel): это часть экрана, на которой вывод генерируется в результате выполнения набора операций на вводе на server.R.

Давайте рассмотрим UI.R и Server.R на примере:

#UI.R
#загружаем библиотеку shiny
library(shiny)

shinyUI(fluidPage(

#"жидкая" страница для динамической адаптации к разрешению экрана
  titlePanel("Iris Dataset"),
  sidebarLayout(
    sidebarPanel(
      #вставляем радио кнопки
      radioButtons("p", "Select column of iris dataset:",
                   list("Sepal.Length"='a', "Sepal.Width"='b', "Petal.Length"='c', "Petal.Width"='d')),

# ползунок для столбцов гистограммы
      sliderInput("bins",
                  "Number of bins:",
                  min = 1,
                  max = 50,
                  value = 30)

# Выводим график сгенерированного распределения
    ),
    mainPanel(
      plotOutput("distPlot")
     )
  )
))

4. Написание SERVER.R

Это мозг веб-приложения. server.R записывается в виде функции, которая отображает входные данные на выходные с помощью некоторого набора логических операций. Входы, полученные в файле ui.R, доступны с помощью оператора $ (input$InputName). Выходы также передаются с использованием оператора $ (output$OutputName). Мы обсудим несколько примеров server.R в следующих разделах статьи для лучшего его понимания.

#SERVER.R
library(shiny)

#пишем функцию сервера
shinyServer(function(input, output) {

#ссылаемся на вывод distPlot в ui.r как output$distPlot
  output$distPlot <- p="" renderplot="">

#ссылаемся на вывод p в ui.r как input$p
    if(input$p=='a'){
      i<-1 p="">
    }

    if(input$p=='b'){
      i<-2 p="">
    }

    if(input$p=='c'){
      i<-3 p="">
    }

    if(input$p=='d'){
      i<-4 p="">
    }

    x    <- i="" iris="" p="">

#ссылаемся на ввод bins в ui.r как input$bins
    bins <- 1="" length.out="input$bins" max="" min="" p="" seq="" x="">

#создаем гистограмму в качестве вывода
    hist(x, breaks = bins, col = 'darkgray', border = 'white')
  })
})

5. Размещение Shiny app в сети

К приложениям shiny, которые вы создали, можно получить доступ и использовать их только в том случае, если они размещены в интернете. Вы можете разместить свое приложение shiny на «Shinyapps.io». Он предоставляет бесплатную платформу как услугу [PaaS] для развертывания приложений shiny с некоторыми ограничениями, такими как только 25 часов использования в месяц, ограниченное количество памяти и т. д. Вы также можете использовать свой собственный сервер для развертывания приложений.

Шаг 1: Зарегистрируйтесь на shinyapps.io



Шаг 2: Перейдите в Tools в R Studio.

Шаг 3: Откройте глобальные параметры.

Шаг 4. Откройте вкладку publishing.



Шаг 5: Работайте со своей учетной записью.

Это все! Использование Shiny Cloud - это просто!

6. Создание интерактивной визуализации для наборов данных

Основной макет для написания ui.R:

library(shiny)
shinyUI(fluidPage(
titlePanel("#Title"),
sidebarLayout(
sidebarPanel(
),

mainPanel(
#write output
)
)
))

Аналогично, базовый макет для написания server.R:

library(shiny)
shinyServer(function(input, output) {
#write server function
})

Давайте рассмотрим несколько примеров:

Пример 1: Рисование гистограмм для набора данных iris в R с использованием Shiny

   Пишем ui.R :

#UI.R
library(shiny)
shinyUI(fluidPage(
  titlePanel("Iris Dataset"),
  sidebarLayout(
    sidebarPanel(
      radioButtons("p", "Select column of iris dataset:",
                   list("Sepal.Length"='a', "Sepal.Width"='b', "Petal.Length"='c', "Petal.Width"='d')),
      sliderInput("bins",
                  "Number of bins:",
                  min = 1,
                  max = 50,
                  value = 30)
    ),
    mainPanel(
      plotOutput("distPlot")
    )
  )
))


    Пишем server.R :

#SERVER.R
library(shiny)
shinyServer(function(input, output) {
  output$distPlot <- p="" renderplot="">
    if(input$p=='a'){
      i<-1 p="">
    }

    if(input$p=='b'){
      i<-2 p="">
    }

    if(input$p=='c'){
      i<-3 p="">
    }

    if(input$p=='d'){
      i<-4 p="">
    }

    x    <- i="" iris="" p="">

    bins <- 1="" length.out="input$bins" max="" min="" p="" seq="" x="">
    hist(x, breaks = bins, col = 'darkgray', border = 'white')
  })
})

    Вывод :

    
Пример 2: Рисуем графики рассеивания для набора данных iris в R с использованием Shiny

    Пишем ui.R :

#UI.R
library(shiny)
shinyUI(fluidPage(
  titlePanel("Iris Dataset"),
  sidebarLayout(
    sidebarPanel(
      radioButtons("x", "Select X-axis:",
                   list("Sepal.Length"='a', "Sepal.Width"='b', "Petal.Length"='c', "Petal.Width"='d')),
      radioButtons("y", "Select Y-axis:",
                   list("Sepal.Length"='e', "Sepal.Width"='f', "Petal.Length"='g', "Petal.Width"='h'))
    ),
    mainPanel(
      plotOutput("distPlot")
    )
  )
))

    Пишем server.R :

#SERVER.R
library(shiny)
shinyServer(function(input, output) {
  output$distPlot <- p="" renderplot="">
    if(input$x=='a'){
      i<-1 p="">
    }

    if(input$x=='b'){
      i<-2 p="">
    }

    if(input$x=='c'){
      i<-3 p="">
    }

    if(input$x=='d'){
      i<-4 p="">
    }

    if(input$y=='e'){
      j<-1 p="">
    }

    if(input$y=='f'){
      j<-2 p="">
    }

    if(input$y=='g'){
      j<-3 p="">
    }

    if(input$y=='h'){
      j<-4 p="">
    }

    s    <- i="" iris="" p="">
    k    <- iris="" j="" p="">
    plot(s,k)
  })
})

    Вывод:


Пример 3: проблема выдачи кредитов (Loan Prediction problem).

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

Набор данных, который мы будем использовать, представляет собой набор Loan Prediction problem, в котором Dream Housing Finance Company предоставляет кредиты клиентам на основе их потребностей. Они хотят автоматизировать процесс утверждения кредита на основе личных данных, предоставляемых клиентами, таких как «Пол» (Gender), «Семейный статус» (Marital Status), «Образование» (Education), «Число иждивенцев" (Number of Dependents), «Доход» (Income), «Сумма кредита» (Loan Amount), «Кредитная история» (Credit History) и другие.

1. Мы будем выполнять исследовательский анализ отдельных переменных.

    Пишем ui.R :

#UI.R
#loading shiny
library(shiny)

shinyUI(fluidPage(
  titlePanel("Loan Prediction III"),
  sidebarLayout(
    sidebarPanel(
      #input using radiobuttons
      radioButtons("s", "Select X-axis:",
                   list("Loan_ID"='a', "Gender"='b', "Married"='c', "Dependents"='d',"Education"='e', "Self_Employed"='f', "ApplicantIncome"='g', "CoapplicantIncome"='h', "LoanAmount"='i', "Loan_Amount_Term"='j', "Credit_History"='k', "Property_Area"='l', "Loan_Status"='m'))
    ),   

# Show a plot of the generated distribution
      mainPanel(
        plotOutput("distPlot")
    )
    )
  ))

    Пишем server.R :

#SERVER.R
library(shiny)

#loading shiny
shinyServer(function(input, output) {

#writing server function
  output$distPlot <- p="" renderplot="">

#creating distPlot
    if(input$s=='a') { i<-1 p="">
    if(input$s=='b') { i<-2 p="">
    if(input$s=='c') { i<-3 p="">
    if(input$s=='d') { i<-4 p="">
    if(input$s=='e') { i<-5 p="">
    if(input$s=='f') { i<-6 p="">
    if(input$s=='g') { i<-7 p="">
    if(input$s=='h') { i<-8 p="">
    if(input$s=='i') { i<-9 p="">
    if(input$s=='j') { i<-10 p="">
    if(input$s=='k') { i<-11 p="">
    if(input$s=='l') { i<-12 p="">
    if(input$s=='m') { i<-13 p="">
  
    #читаем обучающий набор данных
    train<-read .csv="" p="" train_u6lujux_cvtuz9i.csv="">
    X    <- i="" p="" train="">
    plot(X)
  })
})

    Вывод:


2. Исследовательский анализ нескольких переменных проблемы выдачи кредитов.

Пишем ui.R :

#UI.R
library(shiny)

shinyUI(fluidPage(
  #пишем заголовок
  titlePanel("Loan Prediction III"),

  sidebarLayout(
    sidebarPanel(
      #ввод s с помощью переключателей
      radioButtons("s", "Select X-axis:",
                   list("Loan_ID"='a1', "Gender"='b1', "Married"='c1', "Dependents"='d1',"Education"='e1', "Self_Employed"='f1', "ApplicantIncome"='g1', "CoapplicantIncome"='h1', "LoanAmount"='i1', "Loan_Amount_Term"='j1', "Credit_History"='k1', "Property_Area"='l1', "Loan_Status"='m1')),
      #ввод k с помощью переключателей
      radioButtons("k", "Select Y-axis:",
                   list("Loan_ID"='a2', "Gender"='b2', "Married"='c2', "Dependents"='d2',"Education"='e2', "Self_Employed"='f2', "ApplicantIncome"='g2', "CoapplicantIncome"='h2', "LoanAmount"='i2', "Loan_Amount_Term"='j2', "Credit_History"='k2', "Property_Area"='l2', "Loan_Status"='m2'))     
    ),

  #вывод графика
    mainPanel(
      plotOutput("distPlot")
     )
  )
))

Пишем Server.R

#SERVER.R
library(shiny)

#пишем функцию Server
shinyServer(function(input, output) {

  output$distPlot <- p="" renderplot="">
    if(input$s=='a1') { i<-1 p="">
    if(input$s=='b1') { i<-2 p="">
    if(input$s=='c1') { i<-3 p="">
    if(input$s=='d1') { i<-4 p="">
    if(input$s=='e1') { i<-5 p="">
    if(input$s=='f1') { i<-6 p="">
    if(input$s=='g1') { i<-7 p="">
    if(input$s=='h1') { i<-8 p="">
    if(input$s=='i1') { i<-9 p="">
    if(input$s=='j1') { i<-10 p="">
    if(input$s=='k1') { i<-11 p="">
    if(input$s=='l1') { i<-12 p="">
    if(input$s=='m1') { i<-13 p="">
    if(input$k=='a2') { j<-1 p="">
    if(input$k=='b2') { j<-2 p="">
    if(input$k=='c2') { j<-3 p="">
    if(input$k=='d2') { j<-4 p="">
    if(input$k=='e2') { j<-5 p="">
    if(input$k=='f2') { j<-6 p="">
    if(input$k=='g2') { j<-7 p="">
    if(input$k=='h2') { j<-8 p="">
    if(input$k=='i2') { j<-9 p="">
    if(input$k=='j2') { j<-10 p="">
    if(input$k=='k2') { j<-11 p="">
    if(input$k=='l2') { j<-12 p="">
    if(input$k=='m2') { j<-13 p="">
    
    #читаем данные
    train<-read .csv="" p="" train_u6lujux_cvtuz9i.csv="">
    X    <- i="" p="" train="">
    Y    <- j="" p="" train="">
    plot(X,Y)
  })
})

    Вывод:




7. Дополнительные пакеты для приложения  Shiny

Для добавления фунциональности вашему приложению Shiny, в вашем распоряжении есть несколько дополнительных пакетов. Вот несколько примеров от RStudio.

1. http://rstudio.github.io/shinythemes/
2. http://rstudio.github.io/leaflet/
3. https://rstudio.github.io/shinydashboard/
4. http://shiny.rstudio.com/reference/shiny/latest/

8. Преимущества и недостатки Shiny

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

Преимущества:

Эффективное время отклика: время отклика приложения shiny очень мало, что позволяет получать выходные данные в режиме реального времени.
Полная автоматизация приложения: приложение shiny может быть автоматизировано для выполнения набора операций для создания выходного сигнала на основе ввода.
Знание HTML, CSS или JavaScript не требуется: для создания полнофункционального приложения абсолютно не требуется знания HTML, CSS или JavaScript.
Продвинутая аналитика: приложения shiny очень мощные и могут быть использованы для визуализации самых сложных данных, таких как 3D-графики, карты и т. д.
Экономичность. Платные версии shinyapps.io и серверов shiny обеспечивают экономичное масштабируемое решение для развертывания приложений в Интернете.
Open Source: создание и получение онлайн-приложения shiny бесплатны, если вы хотите развернуть свое приложение на бесплатной версии shinyapps.io

Недостатки:

Требует своевременных обновлений: поскольку функции, используемые в приложении, иногда устаревают и конфликтуют с более новыми версиями пакетов, необходимо время от времени обновлять ваше приложение.
Нет выборочного доступа и разрешений: нет никаких ограничений на блокирование доступа кого-либо к вашему приложению или подтверждение избирательного доступа. Когда приложение работает в интернете, оно доступно всем пользователям.
Ограничение трафика в бесплатной версии: в бесплатной версии shinyapps.io вы получаете 25 активных часов вашего приложения в месяц на одну учетную запись.

Источник: Creating Interactive data visualization using Shiny App in R (with examples)

Комментариев нет:

Отправить комментарий