Mukku John Blog

取り組んでいること を つらつら と

ggplot2を使って、散布図を作る-6

R グラフィックス クックブック 15回目

ggplot2パッケージを利用して、散布図を作成していきます。
変数の量を点の面積で表現したり、変数組み合わせを表現します。

変数の量を点の面積で表現する

変数の量を点の面積で表現したグラフは、
バブルチャートバルーンプロットと呼ばれています。

点の面積を、比較しやすい様なデータをこしらえます。

exampleData <- data.frame("Bar" = factor(c("a","b","c","d","e","f")),
                          "Hoge" = c(1,2,3,4,5,6),
                          "Piyo" = c(1,2,3,1,2,3),
                          "Foo" = c(10,50,100,20,75,5))

> str(exampleData)
'data.frame':	6 obs. of  4 variables:
 $ Bar : Factor w/ 6 levels "a","b","c","d",..: 1 2 3 4 5 6
 $ Hoge: num  1 2 3 4 5 6
 $ Piyo: num  1 2 3 1 2 3
 $ Foo : num  10 50 100 20 75 5

Foo列点の面積size)に指定して、散布図を作成します。

p <- ggplot(exampleData, aes(x=Hoge,y=Piyo,size=Foo)) +
  geom_point(shape=21, colour="blue",fill="skyblue")

p

f:id:MukkuJohn:20160904105905p:plain

このsizeに指定する方法は、点の半径に、変数の量がマッピングされます。
そのため、変数の量が2倍になると、点の面積が4倍大きくなり、
視覚的に訴えるには、よろしくない状況です。


そこで、scale_size_area()を使って、きちんと面積にマッピングします。

p + scale_size_area(max_size=15)

f:id:MukkuJohn:20160904110435p:plain

これで、変数の量の大小と、点の面積の大小が、正しく捉える事ができます。


ここまでは、x軸/y軸共に、連続値のデータを扱いました。
ここからは、離散値のデータを扱っていきます。
R: Hair and Eye Color of Statistics Studentsのデータを使います。

性別ごとに、髪と目の色が集計されています。

> HairEyeColor
, , Sex = Male

       Eye
Hair    Brown Blue Hazel Green
  Black    32   11    10     3
  Brown    53   50    25    15
  Red      10   10     7     7
  Blond     3   30     5     8

, , Sex = Female

       Eye
Hair    Brown Blue Hazel Green
  Black    36    9     5     2
  Brown    66   34    29    14
  Red      16    7     7     7
  Blond     4   64     5     8

上のデータを、性別ごとの区分けを無くし、フォーマットを変換します。

#性別ごとに分かれているデータを足すことで、1つにする
> hec <- HairEyeColor[,,"Male"] + HairEyeColor[,,"Female"]
> hec
       Eye
Hair    Brown Blue Hazel Green
  Black    68   20    15     5
  Brown   119   84    54    29
  Red      26   17    14    14
  Blond     7   94    10    16

#wideフォーマットを、longフォーマットにする
> library(reshape2)
> hec <- melt(hec,value.name = "count")

> hec
    Hair   Eye count
1  Black Brown    68
2  Brown Brown   119
3    Red Brown    26
4  Blond Brown     7
5  Black  Blue    20
6  Brown  Blue    84
7    Red  Blue    17
8  Blond  Blue    94
9  Black Hazel    15
10 Brown Hazel    54
11   Red Hazel    14
12 Blond Hazel    10
13 Black Green     5
14 Brown Green    29
15   Red Green    14
16 Blond Green    16

散布図を作ります。

ggplot(hec,aes(x=Eye, y=Hair))+
  geom_point(aes(size=count), shape=21, colour="black",fill="cornsilk") +
  scale_size_area(max_size=20, guide=FALSE)

f:id:MukkuJohn:20160904112259p:plain
組み合わせの大小が分かりやすくて、良いですね。

注釈として、countを表示してみます。

上のグラフ + geom_text(aes(label=count))

f:id:MukkuJohn:20160904112659p:plain
逆に分かりづらくなってしまいました。


注釈を表示するには、テキストの位置や、文字色を考慮する必要があります。

#テキストのy軸位置は、試行錯誤です
#y軸のHairの位置と、円の半径と線形である面積の平方根値から、もじょもじょします。
上のグラフ + 
  geom_text(aes(y=as.numeric(Hair)-sqrt(count)/30,label=count),colour="grey60",size=4)

f:id:MukkuJohn:20160904113411p:plain
この様に、点の面積より目立たせない工夫が必要ですね。

変数の組み合わせを表現する

複数の変数を組み合わせて表現するためには、散布図の行列を使います。

こんなデータを使います。
国ごとのGDPや、健康のために費やす費用、乳幼児の死亡率です。

> str(c2009)
'data.frame':	11016 obs. of  5 variables:
 $ Name        : Factor w/ 216 levels "Afghanistan",..: 1 1 1 1 1 1 1 1 1 1 ...
 $ GDP         : num  55.6 55.7 54.4 73.2 76.4 ...
 $ laborrate   : num  NA NA NA NA NA NA NA NA NA NA ...
 $ healthexp   : num  NA NA NA NA NA NA NA NA NA NA ...
 $ infmortality: num  NA NA NA NA NA NA NA NA NA NA ...

散布図の行列を作るには、Rの基本グラフィックスに含まれるpairs()を使います。
ggplot2じゃなくなっちゃった。。。

#Name列を除外するため、2列目~5列目を指定しています。
pairs(c2009[,2:5])

f:id:MukkuJohn:20160904131847p:plain
それぞれの散布図で、x軸とy軸のスケールがどこに記載されているか注意が必要ですね。
変数間の相関が分からない場合は、とりあえずで見ることができますね。
たった1行のコードから、パッ見で変数間の関係性が想像できます。
GDPとhealthexpは関係が強そう や
infmortalityとGDPの関係infmortalityとhealthexpの関係は似ている など。


このpairs()で作られる散布図の行列ですが、
対角線上対角線より上対角線より下を分けてカスタマイズできます。
pairs()のヘルプページのExampleに記載されています。

#事前に、panel.cor()/panel.hist()/panel.lmが作られてること
pairs(c2009[,2:5], pch=".", 
      upper.panel = panel.cor, #対角線より上
      diag.panel = panel.hist, #対角線上
      lower.panel = panel.lm   #対角線より下
      )

f:id:MukkuJohn:20160904132813p:plain

上のグラフは、それぞれのパネルで下記を表現しています。

  • 対角線より上: 相関係数
  • 対角線上: データの分布(ヒストグラム
  • 対角線より下: 線形のモデル


散布図については、この記事が最後になりますが、6回も費やしました。
棒グラフ/折れ線グラフと比較して、散布図は、表現できる変数が多いですね。

次は、今まで作成したきたグラフに着目して、
Power BI と Rで作るグラフを比較していきたいと思います。
powerbi.microsoft.com