2016.08.01 Mon |

Rの圧倒的強さ-データの可視化

【Rの圧倒的強さ-データの可視化】

前回までで、Rをダウンロード・インストール完了したので、まずは、Rの可能性を実感してみましょう!

RはPython,Excelなど他のあらゆる環境・言語と比べていまだに圧倒的に優れているのが、そのグラフィクス能力(データ可視化能力)です。今回はその一端をお見せしましょう。

まず初めにデータ可視化とはどういうことでしょうか?

次のデータをご覧ください。

graph6これは、Rにデフォルトで入っている、mtcarsという車の燃費、性能などのデータです。

各行がそれぞれ一つの車種のデータを示しています。

各列はたとえばmpgは燃費、cylはシリンダー数、、のような内容になってます

数の羅列だとよくわからないですね。。どこが多いか少ないか、ぱっと見でわからないです。。

行ごとのデータパターンの違いは特によくわからないです。。

そんな時に可視化が役に立つんですね。

たとえば、こんなふうに可視化してみましょう。

 

graph18

各行が一つの色で表されています。

これならがんばってみればデータの傾向はつかめそうです。

ちなみにコードは以下です。Rのコンソール画面に貼り付けるかご自身で入力してください。

library(MASS)
parcoord(mtcars,col=1:33,lwd=2)

これで大体のデータの傾向はわかったのですが、どの車種がどの線に該当しているかわからないですね。

なので凡例を入れてみましょう。ついでに線種も車種ごとに変えてみましょう!

graph7

使用したコードは以下です。

#MASSパッケージはデフォルトで入っているので、library関数でメモリにロードする。

library(MASS)

#右の余白に凡例(各線の名前(車種の名前))を付けたいので右の余白をあける。

par(mar=c(3,3,3,9))

#枠外への描画を許可

par(xpd=T)

#MASSパッケージの中のparcoord関数を使ってデータmtcarsを可視化。colは線の色。ltyは線種。lwdは線の太さ。

parcoord(mtcars,col=1:33,lty=1:33,lwd=3)

#凡例を付ける。legend関数を使用した後、グラフの中の右上あたりをクリックするとそこに凡例が描かれる。locator(1)はクリックしたところに凡例を載せるという意味。

legend(locator(1),legend=row.names(mtcars),col=1:33,lty=1:33,lwd=3)

 

 

数字のままよりずっとわかりやすいですよね!

コードははじめ長くて、びっくりするかもしれませんが。なれればひたすら便利です。細かい調整がいくらでもできます。Excelを使うのを躊躇するくらいに。。

ちなみに、他にもこんな可視化方法があります。

graph8

もみじみたいできれいですね。

コードは以下2行になります。

#配色指定(虹色40色を用意)

palette(rainbow(40))

#デフォルトで使えるstars関数を使用。key.locは右下の基準円の位置。draw.segment=Tで各扇形の色塗り指示。
stars(mtcars, key.loc = c(12, 1.5),draw.segments = TRUE)

各もみじ型がそれぞれの車種を表し、扇形の面積が各変数の大きさを表します。

もともとの数字のままよりずっと見やすいですね。

 

以上前置きでした!

それでは、Rのグラフィクスの多様性・使用例を見ていきましょう。

今回は、The R Galleryというweb siteの例を使用します。

http://www.r-graph-gallery.com/all-graphs/

基本的にココに書いてあるコードをRのコンソール画面(Rを立ち上げると文字を打ち込むことが出来るところ)にコピー&ペーストしてもらえば実行できます。

ただし、Macの場合はXQuartz(https://www.xquartz.org/)が入っていないと、外部パッケージを実行できない時があります。XQuartzが入っていなければ、ダウンロード、インストールして、ユーティリティのx11をactivateしてください。

それぞれ深い解説は省きますが、たしかにこれはExcelではできなそう。。みたいに感じていただけるといいかなと思います。

 

Rは外から(cranから)パッケージという名の機能拡張ツールをダウンロードすることが出来ます。

ダウンロードのコマンドは、install.packages(“パッケージ名”,dependencies=T)です。

ダブルクオテーションを忘れないでください。

次にメモリにパッケージをロードすると使えるようになるのですが、そのコマンドは、

library(パッケージ名)です。

今度はダブルクオテーションが必要ないことに注意してください。

 

 

それでは参りましょう。

http://www.r-graph-gallery.com/all-graphs/

を訪問してください。

graph1

 

 

下にスクロールしていきましょう!

たくさんのグラフィクスサンプルが出てきます。

それぞれ、どのようなデータに対して、どのような可視化手法がありうるか体系的に理解していないと、ありがたみは感じずらいのですが、雰囲気だけ理解していただければよいかなと思います。

 

 

graph2 graph3

 

graph4

なんかいろんなグラフィクスがありますね。

 

データ解析の手順は、

1、データを目で見る

2、データの意味の理解・背景知識の理解

3、データの集計

4、データの可視化

5、データ解析

の順序で行うのですが、このうち4、データの可視化のところで、上記のグラフィクスを使用します。

 

では実際にRにコマンドを打って、Rでグラフィクスを出力させていきましょう!

#が先頭についている行は僕が書いたコメントで、#が先頭についているものをRにコピペしても実行されないのでエラーは出ません。

安心して、コードをすべてコピペして大丈夫です(エラーが出るなら一行づつ貼り付けるか、ご自分で手打ちしてください)

たとえばゲノム分野でよく使うマンハッタンプロット。

graph5

#データを作成する

data <- data.frame (SNP = 1:20000*5 , CHR=c(rep(1:5, each = 20000)), BP= rep(1:20000, 5), P=rnorm(20000*5, 0.2, 0.3) )

data <- data[data$P>0,]

#パッケージを読み込む(cran mirrorはJapanを選択してください。)

install.packages(“qqman”,dependencies=T)

install.packages(“RColorBrewer”,dependencies=T)

#パッケージをメモリにロードする

library(qqman)

library(RColorBrewer)

#実際にプロットする。

manhattan(data , suggestiveline = F, genomewideline = F , col=brewer.pal(5, “Set2”) , cex=0.7)

どうでしょうか?出力できましたか?

では次に、レーダーチャートを描いてみましょう。Excelでもできることですが、その違いをみてみましょう。

graph9

いい感じに可視化されていますね。とても見やすいです。

Excelみたいに微調整が効かずイライラすることもありません。

#fmsbパッケージのダウンロード

install.packages(“fmsb”,dependencies=T)

#fmsbパッケージのメモリへのロード

library(fmsb)

#データの作成(本来であれば解析するデータがあるのでこの項はいりません)

set.seed(99)
data=as.data.frame(matrix( sample( 0:20 , 15 , replace=F) , ncol=5))
colnames(data)=c(“math” , “english” , “biology” , “music” , “R-coding” )
rownames(data)=paste(“mister” , letters[1:3] , sep=“-“)
data=rbind(rep(20,5) , rep(0,5) , data)
#境界の色指定
colors_border=c( rgb(0.2,0.5,0.5,0.9), rgb(0.8,0.2,0.5,0.9) , rgb(0.7,0.5,0.1,0.9) )
#内側の色指定
colors_in=c( rgb(0.2,0.5,0.5,0.4), rgb(0.8,0.2,0.5,0.4) , rgb(0.7,0.5,0.1,0.4) )

#レーダーチャートの描画

radarchart( data  , axistype=1,pcol=colors_border , pfcol=colors_in , plwd=4 , plty=1,cglcol=“grey”, cglty=1, axislabcol=“grey”, caxislabels=seq(0,20,5), cglwd=0.8,vlcex=0.8)
#凡例の挿入
legend(x=0.7, y=1, legend = rownames(data[c(1,2),]), bty = “n”, pch=20 , col=colors_in , text.col = “grey”, cex=1.2, pt.cex=3)
あんまり考えずに、サンプルコードを使っているので無駄に長いですが、本当はもっと短いです。
ご心配なさらず。
次に物事の相関関係とその強さを可視化するグラフィクスをお見せします。
ゲノム系の人はよく見ると思いますが、それ以外の方には新鮮かもしれません。
graph17
#コードは以下になります。
#データ作成
name=c(3,10,10,3,6,7,8,3,6,1,2,2,6,10,2,3,3,10,4,5,9,10)
feature=paste(“feature “, c(1,1,2,2,2,2,2,3,3,3,3,3,3,3,4,4,4,4,5,5,5,5) , sep=“”)
dat = data.frame(name,feature)
dat = with(dat, table(name, feature))
#circlizeパッケージのロード
install.packages(“circlize”,dependencies=T)
library(circlize)
#circularプロットの出力
chordDiagram(as.data.frame(dat), transparency = 0.5)
leafletパッケージでNASAから衛星写真をとってくることもできます。
graph16
#コードは以下
install.packages(“leaflet”,dependencies=T)
library(leaflet)
# 普通leaflet()から始める。
m=leaflet()
#デフォルトのOpenStreetMapのマップタイトルを加える。
#addTiles関数使用後すぐmを出力することも可能。その場合全世界地図が出力される。
m=addTiles(m)
#場所を選ぶ
m=setView(m, lng = 166.45, lat = 21, zoom = 7)
#出力する
m
#ちなみに
#%>% 演算子を用いても同じこと
m=leaflet() %>% addTiles() %>% setView( lng = 166.45, lat = 22.25, zoom = 8 )
m
夜の衛星写真もとってこれます。
graph10
#コードは以下です。setViewで緯度・経度・倍率を指定しています。
m=leaflet() %>% addTiles() %>% setView( lng = 2.34, lat = 48.85, zoom = 5 ) %>% addProviderTiles(“NASAGIBS.ViirsEarthAtNight2012”)
m
graph11
#コードは以下です。いろいろsetViewの値を変えてみて遊んでみましょう。
m=leaflet() %>% addTiles() %>% setView( lng = 2.34, lat = 48.85, zoom = 3 ) %>% addProviderTiles(“Esri.WorldImagery”)
m
leafletパッケージでは、地図上に目印を配置することも可能です。
graph12
#コードは以下(ランダムに10個目印を配置しましたが、もちろん指定して配置することも可能です)
#データを作る。
data=data.frame(long=sample(seq(150,150),10) ,  lat=sample(seq(50,50),10) , val=round(rnorm(10),2) , name=paste(“point”,letters[1:10],sep=“_”)  )
#目印を地図に配置する
m=leaflet(data = data) %>% addTiles() %>% addMarkers(~long, ~lat, popup = ~as.character(name))
#地図を出力
m
配置するものを〇にしたりもできます。
graph13
#コードは以下。ランダムに20個〇を作成
data=data.frame(long=sample(seq(150,150),20) ,  lat=sample(seq(50,50),20) , val=round(rnorm(20),2) , name=paste(“point”,letters[1:20],sep=“_”)  )
#地図上に丸を配置
m=leaflet(data = data) %>% addTiles() %>% addCircleMarkers(~long, ~lat , popup = ~as.character(name))
#出力
m
各まるの大きさや色を変えたりもできます。
graph14
#コードは以下
#library関数は上で用いているので改めて書きません。データも上のコードで作られているので新たには作りません。
m=leaflet(data = data) %>% addTiles() %>%  addProviderTiles(“Esri.WorldImagery”) %>%
  addCircleMarkers(~long, ~lat,
      radius=~val*14 ,
      color=~ifelse(data$val>0 , “red”, “orange”),
      stroke = TRUE,
      fillOpacity = 0.2,
      popup = ~as.character(name)
      )
#出力
m
世界地図の一部を拡大して、さらに四角で囲ったりもできます。
graph15
#コードは以下
#地図に四角形を描画
m=leaflet() %>% addTiles() %>%
  addRectangles(
    lng1=118.456554, lat1=34.078039,
    lng2=118.436383, lat2=34.062717,
    fillColor = “transparent”
  )
#出力
m
Rの可能性を実感いただけましたでしょうか?
なんかいろいろできそうですよね?
言い忘れましたが、Twitterなど外部との連携が取れるのもRのよさです。
コマンド一つで、Yahoo!Financeから株価情報をとって来たり、Twitterからツイート情報をとって来たりできます。
それでは今日はこの辺で終わりにします。
鈴木瑞人
東京大学大学院 新領域創成科学研究科 メディカル情報生命専攻 博士課程1年
一般社団法人Bizjapan

 

 

 

 

 

 

 

 

2024.1  
給料も教育もガッツリと!メンター制度開始します  詳しく