Septeni Engineer's Blog

セプテーニエンジニアが綴る技術ブログ

R言語をいじってみた

お元気ですか?
明日から弊社テニス部の合宿でウキウキしてる@toshikimiyagawaです。

先のエントリーで紹介したとおり、弊社では開発合宿というものを行っています。
今回私はR言語について調べましたので、簡単に紹介したいと思います。

f:id:taketor:20150722150102j:plain
(C) R Foundation, from http://www.r-project.org

R言語とは

オープンソースフリーソフトウェアの統計解析向けのプログラミング言語及びその開発実行環境です。
特徴等はコピペするのもめんどくさいのでwikipediaをご覧ください。

インストール方法等も割愛します。
R言語を利用するにあたってRstudioなどの統合開発環境を入れると捗ります。
mac版のRstudioでグラフ表示の時に日本語が□で表示される場合は、こちらを参考に.Rprofileを作ってやるとちゃんと表示されるかと思います。

クラスタリングとヒートマップ

今回はRの数ある機能の中でもクラスタリングとヒートマップについて紹介します。
クラスタリングとは似たデータをグルーピングすることで、ヒートマップはデータの大小を可視化したものです。
具体例をもとに紹介したほうがわかりやすいと思うので、早速実例に沿って説明していきましょう。

データのダウンロード

「統計 データセット」等で検索すると、サンプルのデータが色々見つかります。さらにR自身にも多数のデータセットが最初から入っています。
今回は、DoDStat@dというサイトの都道府県別アルコール類の消費量というデータを利用します。
こちらのページからsake_dataJ.txtをダウンロードします。
Shift_JISのデータなので、必要であれば文字コードをOSに合わせて変換します。
私はmacでしたのでターミナルから以下のコマンドでUTF-8に変換しました。

nkf -w sake_dataJ.txt > sake_dataJ_utf8.txt


ヒートマップを描いてみる

ダウンロードしたデータをユークリッド距離とウォード法と呼ばれる手法を用いて、ヒートマップを作成します。

#データの読み込み
sake <- read.table("/Users/t_miyagawa/Downloads/sake_dataJ_utf8.txt", header=T, row.names=1)
names(sake) <- c("日本酒","焼酎","ビール","ワイン","ウイスキー")
#データ間のユークリッド距離を算出
distance <- dist(sake)
#ウォード法を用いてクラスタ間の距離を算出
cluster <- hclust(distance, method="ward")
#ヒートマップを表示
heatmap(as.matrix(sake), Rowv=as.dendrogram(cluster), col=colorRampPalette(c("white", "purple"))(256), margin=c(4,0), cexCol=0.8, cexRow=0.7)

f:id:taketor:20150722150247p:plain
この図で濃い紫が数値の大きい部分、左と上のトーナメント表みたいなのがデンドログラムと呼ばれるクラスタリング結果になります。
デンドログラムは高さが高いほど離れたクラスタということになります。上のデンドログラムで説明するとビールとその他がだいぶ離れていることになります。
このデータだとビールだけ濃くて他は薄くなってます。データを見てみるとわかるのですが、単純にビールの消費量が他のお酒に比べて多すぎなだけですね。
このままじゃまったくもってつまらない解析結果になってしまいます。

標準化する

このデータにはふたつの問題があります。
・人口の多い地域の消費量は多くて当然
・ビールの消費量は多くて当然
というものです。
まずはひとつめを解決するために各地域のお酒の消費量を割合で表すことにします。
例えば、東京なら
日本酒 焼酎 ビール ワイン ウイスキー
127681000 86377000 857873000 42062000 28808000
となっているのを
日本酒 焼酎 ビール ワイン ウイスキー
11.172636 7.558359 75.06758 3.6806058 2.5208238
という風に百分率表示にします。
さらにふたつめを解決するために標準化という操作をします。
標準化することで、ビールも焼酎も全地域の平均が0、分散が1になるのでビールの消費量が全国的に多いという問題を無視することができます。
この操作をした上でヒートマップにするには以下の様なコードを入力します。

#各地域のお酒の消費量を百分率に変換
sake2<-sake/(sake[,1]+sake[,2]+sake[,3]+sake[,4]+sake[,5])*100
#標準化
sake3 <- scale(sake2)
#データ間のユークリッド距離を算出
distance3 <- dist(sake3)
#ウォード法を用いてクラスタ間の距離を算出
cluster3 <- hclust(distance3,method="ward")
#ヒートマップを表示
heatmap(as.matrix(sake3), Rowv=as.dendrogram(cluster3), col=colorRampPalette(c("white", "purple"))(256), margin=c(4,0), cexCol=0.8, cexRow=0.7)

このヒートマップが以下の図になります。
f:id:taketor:20150722150324p:plain
きれいにクラスタリングできていますね。
上の方の東京あたりまではウイスキーの消費の多い地域、下の方の徳島以下はビールの消費の多い地域であることが見て取れます。
山梨はさすがぶどうの産地でワイン推しなのが見て取れますね。ワインの消費が目立って多いです。あまり他の地域と似ていないことからデンドログラムも高くなっています。
お酒ごとの相関はあまりないですね。ヒートマップも似てないですし、デンドログラムも高くなっています。
このように少しデータを加工してやることでヒートマップとデンドログラムを用いて面白い解析結果を得ることができました。

みなさんも是非R言語触ってみてください。
それでは、今回はこのへんで。