あの家のあたたかみ、そして明るさについてのデータをKibana 4で可視化する(ところまでで力尽きました)

前回で、RからElasticsearchが使えることがわかったので、この勢いでKibanaを使って、Rで有名なデータを可視化してみたいと思います。

Kibana?

Elasticsearchに入れた時系列データをいい感じに可視化できるソフトです。

www.elastic.co

Rで有名なデータ?

そう、これです。Tokyo.R界隈ではポストiris最有力候補と噂されるあのデータです。

d.hatena.ne.jp

Kibanaを動かす

Download Kibana Free • Get Started Now | Elastic

からアーカイブをダウンロードして解凍するとすぐ使えます。

wget https://download.elasticsearch.org/kibana/kibana/kibana-4.X.X-linux-x64.tar.gz
tar xf kibana-4.X.X-linux-x64.tar.gz
cd kibana-4.X.X-linux-x64

その前に、Elasticsearchのポートを変えたりしてる場合は設定ファイルを書き換える必要があります。

vi config/kibana.yml

elasticsearch_urlにElasticsearchのIPとホストを指定します。

# The Elasticsearch instance to use for all your queries.
elasticsearch_url: "http://localhost:XXXX"

また、Kibanaのポートを変える場合はportを指定します。

port: YYYY

あと、VPSとかに立てる場合は、ufwの設定とかも忘れずに。

データの読み込み

とりあえずレポジトリからCSVデータを取ってきて読み込みます。

library(httr)
library(readr)

res <- GET("https://github.com/dichika/mydata/raw/master/room.csv")
roomdata <- read_csv(content(res, as = "text"))

データの中身はこんな感じです。

head(roomdata)
#> Source: local data frame [6 x 3]
#> 
#>                  time light temperature
#> 1 2015-02-12 01:45:04 463.0      26.784
#> 2 2015-02-12 02:00:03 473.0      26.630
#> 3 2015-02-12 02:15:04 467.9      25.983
#> 4 2015-02-12 02:30:04   0.0      25.453
#> 5 2015-02-12 02:45:04   0.0      23.650
#> 6 2015-02-12 03:00:04   0.0      22.530

これにあわせてindexをつくります。

Kibanaは時系列データしか扱えません。@timestampというフィールドをつくる必要があるらしく、今回のデータの場合はtimeカラムをタイムスタンプとして使います。

参考:http://www.elastic.co/guide/en/elasticsearch/reference/current/mapping-timestamp-field.html

mappings <- '{
  "mappings" : {
    "room" : {
      "_source" : {"enabled" : true},
      "properties" : {
        "time" : {"type" : "date", "format" : "yyyy-MM-dd HH:mm:ss"},
        "light": {"type" : "float"},
        "temperature" : {"type" : "float"}
      }
    }
  },
  "_timestamp" : {
    "enabled" : true,
    "path" : "time"
  }
}'

index_create(index='room', body=mappings)

bulk importのためのdocs_bulk()を使いたいところですが、この関数は引数にJSONファイルしか摂ることができません。いちどJSONファイルに変換するか、docs_create()を使います。

library(jsonlite)

lapply(1:nrow(roomdata), function(i) {
  docs_create(index = 'room', type = 'room', id = i,
              body = toJSON(unclass(roomdata[i,]), auto_unbox = TRUE))
})

これで準備完了です。

Kibanaを使う

設定したポートにブラウザでアクセスすると、こんな画面が出てるはずです。

f:id:yutannihilation:20150331012206p:plain

で、それからいろいろやるとこんな感じのダッシュボードができます。

f:id:yutannihilation:20150331012221p:plain

へー。って感じですね。やっぱりもうちょい複雑なデータじゃないと、Kibanaの使い甲斐がない感じします。

で、「いろいろやると」って何??というのは、書こうと思ったけど今日のところは力尽きました。。

また気が向けば書きます。すみません。