SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

近未来の技術トレンドを先取り! 「Tech-Sketch」出張所

R言語のデータ分析レポートをShinyでインタラクティブにしてみる~「アプリケーション作成編」

近未来の技術トレンドを先取り! 「Tech-Sketch」出張所 第17回(後編)


  • X ポスト
  • このエントリーをはてなブックマークに追加

Shinyアプリの実装方法

 続いて、具体的にShinyアプリの実装方法について紹介します。Shinyアプリの概要をつかんでもらうために2パターンのShinyアプリのサンプルコードを取り上げます。

  • iris(アヤメの花)の品種のクラスタリングレポート
  • ブログ記事の日本語ワードクラウドレポート

irisの品種のクラスタリングレポート

 公式ギャラリーにあるクラスタリングレポートのサンプルコードを眺めながら、Shinyアプリの構成を理解していきましょう。

 このサンプルアプリで使われているデータセットはRユーザーにはおなじみのiris(アヤメの花)のデータを使います。irisはRにデフォルトで用意されており、150件のアヤメの花の特徴(花びらなどの幅や長さ)情報と品種名を保持しています。このirisの特徴情報を使ってk-means法(注1)でクラスタリングしてみます。

注1

 k-means法:非階層型クラスタリングの手法の一つ。詳しく知りたい方はWikipediaを参照してください。

 ここで、クラスタリングレポートをインタラクティブにする動機を考えてみます。インタラクティブにするということは、レポート作成者がすべてのパラメータをあらかじめ確定させる必要がないということです。今回アヤメの花の品種が実際に何種類存在するか分からないという前提でクラスタリングを行います(irisデータに含まれる品種情報を伏せてクラスタリングを行う)。今回用いるk-means法では、分割するクラスタ数はユーザーがパラメータとして与える必要があります。静的なレポートの場合、3品種あるか、4品種あるか分からないので、可能性があるだけ、複数の図をレポートに並べるなどして用意する必要があります。しかし、インタラクティブなレポートではクラスタ数はユーザーがブラウザから、レポートを見ながら調整し、簡単に見比べることができるのです。

 さあ、以下のページにアクセスして動作を確認してみてください。

 上記では分割するクラスタリング数だけでなく、特徴(X軸、Y軸)に何を選ぶかをパラメータとして渡すことができます。

 ちなみに、こちらのRのソースコードはサンプルアプリページ右上の「GET CODE」リンク先から完全な形で参照することができます。サンプルプロジェクトのトップページからダウンロードもしくはgit cloneしておくとよいでしょう。ダウンロードしたserver.Rがある場所でRを起動し、library(shiny)runApp()の順に実行すれば、あなたのPCでも同じサンプルアプリが動作します。

サンプルコードの解説

 サンプルコードをui.Rから見ていきましょう。

ui.R
# 基本レイアウト(pageWithSidebar)でUIを定義
shinyUI(pageWithSidebar(

  # ①Header Panel(Shinyアプリタイトル)
  headerPanel('Iris k-means clustering'),

  # ②Sidebar Panel(入力エリア)
  # ここでは3つのパラメータをそれぞれxcol(x軸の説明変数), ycol(y軸の説明変数), clusters(クラスタ分割数)としてserver.Rへ渡している
  sidebarPanel(
    selectInput('xcol', 'X Variable', names(iris)),
    selectInput('ycol', 'Y Variable', names(iris),
                selected=names(iris)[[2]]),
    numericInput('clusters', 'Cluster count', 3,
                 min = 1, max = 9)
  ),

  # ③Main Panel(出力エリア)
  # 入力結果をRで処理した結果plot1(クラスタリング結果のグラフ)を受け取り表示させている
  mainPanel(
    plotOutput('plot1')
  )
))

 まずはレイアウトを確認してみます。

 ui.R中の①Header Panel②Sidebar Panel③Main Panelはそれぞれ以下の図のように対応しています。

クラスタリング結果をShinyでWebアプリ化したイメージ
クラスタリング結果をShinyでWebアプリ化したイメージ

 入出力については、②Sidebar Panelで以下の3つのパラメータを入力変数として定義しています。

  • xcol: X軸の説明変数
  • ycol: Y軸の説明変数
  • clusters: クラスタ分割数

 さらに、③Main Panelで以下の変数で実行結果を受け取って表示できるように出力変数を定義しています。

  • plot1: クラスタリング結果図
server.R

 続いてserver.Rも見ていきます。

 server.Rの動きはui.Rで入力変数として定義していた変数に対して、input$(変数名)をという変数名で受け取り、何らかRでの処理を行い、その結果を同じく出力変数として定義していた変数に対して、output$(変数名)という変数名でui.Rへ戻すという流れになります。

shinyServer(function(input, output, session) {

  # irisデータの全ての列の中から、入力画面でx軸(xcol)とy軸(ycol)として選んだ列だけに絞ったデータをselectDataとして定義する
  selectedData <- reactive({
    iris[, c(input$xcol, input$ycol)]
  })

  # 入力画面から選んだ列のみにしたselectDataに対して、クラスタ分割数(clusters)として入力された数をパラメータとしてk-meansクラスタリングを実施
  clusters <- reactive({
    kmeans(selectedData(), input$clusters)
  })

  # クラスタリング結果のグラフをイメージとして作成
  output$plot1 <- renderPlot({
    par(mar = c(5.1, 4.1, 0, 1))

    # クラスタリング結果をプロット
    plot(selectedData(),
         col = clusters()$cluster,
         pch = 20, cex = 3)
    points(clusters()$centers, pch = 4, cex = 4, lwd = 4)
  })

})

 メイン処理であるクラスタリングは、server.Rの中のkmeans()関数で行っています。この関数の引数をui.Rからパラメータとして受け取り、結果をui.Rへ渡すことでインタラクティブなレポートを実現しているということになります。

次のページ
ブログ記事の日本語ワードクラウドレポート

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
近未来の技術トレンドを先取り! 「Tech-Sketch」出張所連載記事一覧

もっと読む

この記事の著者

白石 康司(TIS株式会社)(シライシ コウジ)

TIS株式会社 コーポレート本部 戦略技術センター所属。現在、機械学習技術の研究、機械学習をベースとしたアプリケーションの企画・開発を、PythonやR言語をベースに行っている。 機械学習その他に関する社内研修やオープンな技術勉強会(Tech-Circle)の企画運営にも従事。 もともと、金融系基幹Webシステム開発でのアプリケーションアーキテクチャ/データモデル設計、データベース(Oracle)担当を経...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/8226 2015/02/06 13:58

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング