読者です 読者をやめる 読者になる 読者になる

次元の海で溺れる

Rとデータ解析と統計手法たちとわたし

【ggplot2,formattable,DiagrammeR】新年なので大豆と向き合ってみた(1)

明けまして、おめでとうございます。

気付いたら年が明けていました。恐ろしい話です。

さて、正月なので実家では煮豆が食卓に並ぶなどしているのですが、
そこでそういえば大豆について真剣に考えたこと無いな、と箸が止まりました。

大豆からの加工食品ってやたらたくさんあるよね?
大豆たくさん作ってるとこと加工品たくさん作ってるとこって一致する?の?

もう煮豆をつまんでいる場合ではありません。
気になったことはすぐ調べろってえらい人も言ってた。

大豆のデータ集を発見

普通にググって終わろうと思ってたらなんか大豆データが芋づる式に出てきた。
農林水産省/大豆関連データ集

PDFだけど謎の充実度である。何か色々できそう。

今回のテーマ

・取り急ぎ大豆加工品についてのデータ集めつつ、今まであまりやってなかった系の可視化の操作をしてみる。

次回以降は地図と組み合わせて色々見てみたい。今回はその前段階として。

大豆加工品いろいろ

大豆から派生する加工品について、フロー図で見てみる。
Windowsでは日本語の文字化けがツラかったのでUbuntuで動かしてみた。

>library(DiagrammeR)
>DiagrammeR("
   graph LR
     大豆-->醤油
     大豆-->味噌
     大豆-->納豆
     大豆-->豆腐
     豆腐-->油揚げ
     豆腐-->豆乳
")

f:id:WAFkw:20160101033941p:plain

graph LRで横方向(左から右)に流れる図が生成される。

大豆さん、液体にもなるわ固形にもなるわ有能である。

大豆の加工品消費量についてデータ外観をテーブルで把握してみる

ここからは↓の「食品用大豆の用途別使用量の推移」を取得して使う。
農林水産省/大豆関連データ集

何はともあれまずデータの概要を把握したい。

>mameused<-read.csv("1231mameused.csv",header = T)

> str(mameused)
'data.frame':	18 obs. of  11 variables:
 $: int  9 10 11 12 13 14 15 16 17 18 ...
 $: chr  1,019 1,046 1,017 1,010 1,015 ...
 $ みそ     : int  165 162 166 166 149 149 138 139 141 140 ...
 $ しょうゆ : int  26 26 30 30 32 35 38 37 40 40 ...
 $ 豆腐.油揚: int  494 495 492 492 492 494 494 496 494 492 ...
 $ 納豆     : int  122 128 127 122 129 141 137 139 131 130 ...
 $ 凍豆腐   : int  30 30 29 29 29 29 30 33 33 33 ...
 $ 豆乳     : int  3 4 6 7 9 11 19 29 32 30 ...
 $ 煮豆.惣菜: int  33 33 33 33 33 33 33 33 33 33 ...
 $ きな粉   : int  14 16 17 17 17 17 17 18 18 18 ...
 $ その他   : int  132 152 117 114 125 126 128 129 130 130 ...

#カンマ区切りが気になったので数値へ
>mameused$<-as.numeric(as.character(gsub(",","",mameused$)))

#見やすいテーブルの形に整形する
#文字化けするのでここではcolnameから日本語を外して対応
>mameused.t<-mameused
>colnames(mameused.t)<-c("year","total","miso","syoyu","tofu","natto","kori","tonyu","nimame","kinako","other")

#formattableはきれいなtableをviewerに表示してくれる。color_barやcolor_tileのような視覚効果も追加可能
>library(formattable)
>formattable::formattable(mameused.t,list(tofu=color_bar("tomato"),miso=color_bar("steelblue"),syoyu=color_bar("olivedrab"),natto=color_bar("orange")))

f:id:WAFkw:20160101035603p:plain

Viewerでは上記のように表示される。
カラーバーの感じはExcelとかと同じよう使い方ができそうだけど、なんとなくバーの動きが極端だな~調整できたりするかしら

そもそもYearが和暦(平成)ですね。
バーの動きは極端だけど、全体的に消費量は微減傾向のようです。ほう。

こうなると年別とか比率でも見てみたくなってくる。

大豆加工品使用料で積み上げグラフ

掲題の通り。積み上げグラフを作る。
個人的に和暦がピンと来ないので、西暦にこっそり変換もする。

>mameused_xts<- mameused
>mameused_xts$<- mameused$+1988 #西暦変換

#積み上げたいのでmelt関数でデータの形を変換。
>mameused_xts<-reshape2::melt(mameused_xts,id="年",value.name = "t") 
>mameused_xts<-subset(mameused_xts,mameused_xts$variable!="計")

#こんな感じに。
> knitr::kable(head(mameused_xts,20))

|   ||variable |   t|
|:--|----:|:--------|---:|
|19 | 1997|みそ     | 165|
|20 | 1998|みそ     | 162|
|21 | 1999|みそ     | 166|
|22 | 2000|みそ     | 166|
|23 | 2001|みそ     | 149|
|24 | 2002|みそ     | 149|
|25 | 2003|みそ     | 138|
|26 | 2004|みそ     | 139|
|27 | 2005|みそ     | 141|
|28 | 2006|みそ     | 140|
|29 | 2007|みそ     | 139|
|30 | 2008|みそ     | 137|
|31 | 2009|みそ     | 131|
|32 | 2010|みそ     | 127|
|33 | 2011|みそ     | 126|
|34 | 2012|みそ     | 124|
|35 | 2013|みそ     | 123|
|36 | 2014|みそ     | 133|
|37 | 1997|しょうゆ |  26|
|38 | 1998|しょうゆ |  26|


#経年積み上げグラフ
>ggplot(mameused_xts,aes(x=factor(),y=t,fill=factor(variable)))+
  geom_bar(stat="identity")+
  scale_fill_hue(h=c(20, 260))+labs(x="年",y="消費量(t)")

f:id:WAFkw:20160101040839p:plain

年分をきっちりfactorするとX軸が綺麗に表示されるって今更気が付いた。

こうして見るとテーブル状態では分からなかった状態が見えて、
醤油の割合が多いと思ってたのに豆腐か!豆腐なのか!!みたいな気持ちになれたりする。

全体消費量の微減も、豆腐消費が微減したことによって起きていそう。


ここで今回目標のデータ俯瞰は出来たのでいったん満足した。が、
せっかく18年分あるし、積み上げもあるし、
円グラフ的なやつを年別でfacet_wrap()とかgrid.arrange()とかで並べたり出来ないかな?となった。

おまけ(グラフを年別で並べてみたい)

イメージ

>ggplot(tmp,aes(x=factor(variable),y=t,fill=factor(variable)))+
   geom_bar(stat="identity")+
   coord_polar(theta="x")

f:id:WAFkw:20160101042127p:plain

こうすると「パイのでかさ」がそれぞれの加工品カテゴリの消費量を現したちょっと見辛いグラフが出来る。
これを年別で18個並べたい。

方針は2つ。
①グラフオブジェクトをp1~p18まで作って、並べる
②ggplot2はオブジェクトに格納するとListになるので、一つ一つのグラフをリストの要素として呼び出して並べる

両方やってみた。

for(i in 1:18){
  tmp<-subset(mameused_xts,mameused_xts[,1]==i+1996)
  p<-ggplot(tmp,aes(x=factor(variable),y=t,fill=factor(variable)))+
    geom_bar(stat="identity")+
    coord_polar(theta="x")+labs(x=i+1996,y="")+guides(fill=FALSE)
  assign(paste("p", i, sep=""), p)
}

grid.arrange(p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11,p12,p13,p14,p15,p16,p17,p18,ncol=3,nrow=6)

f:id:WAFkw:20160101042943p:plain

(わかっちゃいたけど見えない)

オブジェクトに連番を振る、というか動的にオブジェクトを増やすやり方、
他にもスマートなやり方があるのかもしれませんが...とりあえず

(pに変数iをくっつけたオブジェクト)<-(グラフ)

みたいな感じでやったらいけました。これアリなのか...な...?


Do.call関数を使えばいけるんじゃない!!たぶん!!って調子乗って始まったらしばらくエラー沼にハマった。

#listにグラフを格納してdo.callで要素を呼び出し
>graph.mame <- lapply(1:18, function(i) {
  tmp<-subset(mameused_xts,mameused_xts[,1]==i+1996)
  ggplot(tmp,aes(x=factor(variable),y=t,fill=factor(variable)))+
    geom_bar(stat="identity")+
    coord_polar(theta="x")+labs(x=i+1996,y="")+guides(fill=FALSE)
})

>px <- c(graph.mame, list(ncol=3, nrow=6))
>do.call(grid.arrange, px)

f:id:WAFkw:20160101045945p:plain

繰り返し処理の中身は①と同じで、それをまとめてlistにぶっこんでいます。
で、do.coll()にそのリストを渡せばリスト各要素を取ってきてfunctionを適用してくれるぜ...のつもりだったんだけど
list(graph.mame,~)で渡したら盛大に怒られた。

ぐるぐる悩んで下記にて解決...grid.Grob()側の最初の引数が可変長....むずかしい...

qiita.com

とりあえず①、②でもいけた。②の方がメジャーなやり方なのかしら...

おわり

次回は大豆収穫量のデータも都道府県データでなんかする。よてい。

正月っぽい話

去年の1月、2月あたりは卒論にのめりこんでみたり、出し終わった直後に知恵熱で倒れてみたり
その後一か月一人旅と称して失踪したりしていた。。気がする。。
今年は取り急ぎ行き倒れないのが目標。

※R関連でお会いした皆さま本当にありがとうございました。FOSS4Gも今年は行けたらいいな
※このまま日々を過ごしていたら平気で数年経ちそうで恐い。人間的成長みたいなものは。どこへ。

なにはともあれ「Rが趣味」というのを勇気を出して言えたのが大きかった1年でありました。
今年はなんとか地面を見つけたいところ。

2016年は何かしらの決断をする、はず