2012/08/25

文系のための「数の可視化」(2)

グラフィクスによって統計データを表現することで、
データの見通しを良くさせることができる

しかし、その一方で、
間違った表現は間違ったイメージを植えつけることがある。

では、如何なる点に注意しながらグラフを描くべきであるか?
実は、グラフによって必要とされることが変わるので、
一般論として、グラフの描き方を述べることは難しいが、
相手にとって見易い、解かりやすいグラフを作る気持ちが重要である。

よく、自己満足としか思えないようなグラフを見ることがある。
とりあえず、作って見ました。分析したっぽいでしょ?」みたいなもの。

そういったグラフは、次のような問題が含まれている。
  • 何のグラフなのか、説明が無いから理解できない。
  • グラフの説明が本文に含まれていない。
  • デザインが悪く、とにかく見難い。
  • 具体的な数値示されておらず、値が良く解らない。
  • 数値の単位が示されておらず、何を表しているかが良くわからない。
  • そもそも、表現方法としてグラフの選択が間違っている
特に、最後の問題に関しては、無意識にグラフを使っていて、
そのグラフがどのような表現に適しているかを理解していない人もいる。
そのような理由で、今回は、とりあえず「棒グラフ」について考えてみる。

そもそも、「棒グラフ」とは何か、考えてみる。
実は、棒グラフといっても色々な種類がある。
パレート図ガントチャートなども棒グラフの一種。

とにかく、色々とあるのだが、今回は、最も基本的な「棒グラフ」の説明。
まずは、棒グラフの目的と定義

棒グラフの目的は、ある対象のある属性の数量の大小を視覚的に表現し、
対象間の特徴を際立たせること。原則的には並べる順番は関係無い
昇順に並び替えたものあるが、それは特に、パレート図と呼ぶ。

文字の説明だけでは解りにくい。とにかく、使って慣れる。
まずは、読み込みコマンド。いつもの作業。

# Windows と Linux の人は次のコマンド
X <- read.table("clipboard", sep=",")

# Mac の人は次のコマンド
X <- read.table(pipe("pbpaste") , sep=",")

以下が今回のデータ。平成22年度の「地域別発電電力量」のデータ。
このデータは、総務省統計局からダウンロードしたものを編集したもの。

pnum は、総発電所の数max は、総最大出力水力火力原子力に関しては、
それぞれ、hydrothermalatomic のプレフィックスを付与してある。

pnum,max,hydro_pnum,hydro_max,thermal_pnum,thermal_max,atomic_pnum,atomic_max
Hokkaidou,66,7419,53,1234,11,4065,1,2070
Touhoku,228,17206,209,2423,13,11286,2,3274
Tokyo,192,64988,162,8981,25,38696,3,17308
Chubu,197,32828,183,5219,11,23969,1,3617
Hokuriku,138,8057,127,1904,6,4400,1,1746
Kansai,165,34877,149,8196,12,16907,3,9768
Chugoku,110,11986,97,2906,12,7801,1,1280
Shikoku,65,6963,58,1141,4,3797,1,2022
Kyushu,194,20330,139,3279,45,11577,2,5258
Okinawa,22,1919,0,0,21,1919,0,0

そう言えば、私の住んでいる地域でも、計画停電を行うような通知があったが、
結局、計画停電が実施されることは無かった。

どの家庭も節電に協力的、というよりも、むしろ節電という行為そのものが、
一種のファッショナブルな流行となっているようである。
日本人というのは、極めて、不可解な集団である。と思う。

毎度、余計な話が多いブログであるが、
日本の電力事情というのは、正直な話良くわかっていない。
そこで、今回のデータを使って、電力事情を検討してみる。

さて、とりあえず、発電所数に関して、
何も考えずに可視化をしてみる。
plot(X$pnum, type="h")

色気も何もないグラフである。見ていても、面白くない。
しかし、そんな事も言ってられない。とにかく、先に進む。

数量なので、棒グラフのイメージで、
プロットタイプを「type="h"」で指定してある。

さて、このグラフを見て何が解るか?あるいは、どのような問題があるか?

まず、グラフのタイトルが無いので、何のグラフか解らない。
x軸とy軸のラベルが何を意味しているのかが解りにくい。
根本的な問題として、各々の棒が何を示しているか解らない。

もう少し、ちゃんとしたグラフを作成しよう。

# とりあえず、データをプロット。
plot(X$pnum, type="h", xlab="", ylab="Number of plants", xaxt="n")

# タイトルを追加
title(main="Number of electric plants in Japan")

# y軸に対して水平に、50、100、150、200の補助線を入れる
abline(h=c(50,100,150,200),lty=2, col="gray")

# 各棒の下に、文字を横向けにして対象名を入れる
axis(side=1, at=c(1:nrow(X)), labels=rownames(X), las=2)

今度のグラフは、上記のコマンドによって作成した。
まず、plot()関数で基本的な棒グラフを作成し、
その次に、title()関数で、グラフにタイトルを追加し、
abline()関数で、y軸に対して、水平な補助線を入れて、
そして、最後に、axis()関数で、x軸のラベルを追加した。

パラメータに関しては以下の通り。詳しくは、ヘルプを参照すると良い。
例えば、コンソール上で、「?plot」と入れて実行すれば、詳細が表示される。
  • plot()関数
    • type: 表現方法のタイプ。今回は「棒」なので「h」を指定。
    • xlab: 今回は、x軸方向の値は意味を持たないのでラベルは不要。
    • ylab: y軸方向は発電所数を表すのでそのように。
    • xaxt: 後で、各棒の下に名前を付けたいのでx軸の描画は行わない。
  • title()関数
    • main: グラフにタイトルを付加。plot()関数の中に書いても良い
  • axis()関数
    • plot()関数で、xaxt="n" とした時に使う関数
    • side: ラベルを書き入れる場所。「1」は、グラフの下を意味する。
    • at: ラベルを入れる場所。今回は、対象数(行数)だけ必要。
    • labels: 実際に書き入れる名前。行列Xの対象名(行名)を利用。
    • las: ラベルの方向。軸に対して垂直に入れるので「2」を指定。
  • abline()関数
    • h: 水平線をベクトルで指定。今回は、50、100、150、200に補助線。
    • lty: 線の描画タイプ。今回は、破線なので「2」。実線は「1」
    • col: 今回は、「灰色(gray)」を指定。
ふむ。最初のグラフよりも、かなり見やすくなった。
必要事項も記載されていて、何のグラフであるかもよく解る。

plot()関数だけだと、色々と表現が制限されるが、
title()関数、axis()関数、abline()関数、といった関数を用いることで、
様々な表現ができるようになる。

さて、この状況でも、構わないと言えば、構わないのだが、
Excelに使い慣れている人からは不満が出てくるかもしれない。
Excelで作った方が「格好良い」と

ということで、今度は別の方法を試す。
実は、棒グラフに関しては、barplot()関数というのが用意されている。

barplot(X$pnum, ylab="Number of plants", ylim=c(0,250), names=rownames(X), las=2, col="cyan")
title(main="Number of electric plants in Japan")
abline(h=c(50,100,150,200),lty=2, col="gray")
abline(h=0)

barplot()関数を用いると、パラメータの指定によって各棒の下に名前入れることが可能。
barplot()関数のパラメータに関しては、通常のplot()関数とよく似ているので、
説明しない。それくらいは、自分の頭で想像できるはず。

また、plot()関数と異なり、棒の幅調整や、棒の中塗をすることもできる。
もちろん、以下のように、縦横を入れ替えることも可能。
barplot(X$pnum, xlab="Number of plants", xlim=c(0,250), names=rownames(X), las=1, col="cyan", horiz=TRUE)
title(main="Number of electric plants in Japan")
abline(v=c(50,100,150,200), lty=2, col="gray")
abline(v=0)

今度は、縦軸と横軸を入れ替えた図である。
先程の出力のパラメータとこの出力のパラメータを見比べてみる。
barplot()関数では、パラメータの名前の「y」の部分が「x」に入れ替わり、
新しいパラメータ「horiz=TRUE」が追加されている。これで横棒グラフになる。
また、abline()関数では、パラメータが「h」が「v」に変わっている。

さて、この棒グラフ、実は一つの属性(変数)しか表現できていない。
実は、棒グラフでは、複数の変数を同時に表すこともできる。
ということで、今度は、その方法を検討する。

barplot(t(X[,c(3,5,7)]), ylab="Number of plants", ylim=c(0,250), names=rownames(X), las=2)
title(main="Number of electric plants in Japan")
abline(h=c(50,100,150,200),lty=2, col="gray")
abline(h=0)

今度は、水力、火力、原子力の三種類のプラントを同時に表現している。
ここで気を付けないといけないのがデータの指定方法である。
この例では、以下のように指定している。

t(X[,c(3,5,7)]

まず、プラント毎の属性(変数)が入っているのは、
行列Xの3番目5番目7番目であった。
そこで、その変数の順番を一度ベクトルとして指定する。

Rにおける行列の選択は、X[行,列] となっているので、
カンマの後ろに、列番号を指定したベクトルを入れている。
さらに、指定したデータは、転置を行うためのt()関数の中に入れてある。

実際にどようなデータになっているかと言うと、

> t(X[,c(3,5,7)])
             Hokkaidou Touhoku Tokyo Chubu Hokuriku Kansai Chugoku Shikoku
hydro_pnum          53     209   162   183      127    149      97      58
thermal_pnum        11      13    25    11        6     12      12       4
atomic_pnum          1       2     3     1        1      3       1       1
             Kyushu Okinawa
hydro_pnum      139       0
thermal_pnum     45      21
atomic_pnum       2       0

となっている。横に長いので、自動的に二つに分かれているが、
プラントの種類が対象となり、元データの対象が変数になっている。
これは、Rの仕様上の問題で、分析者の目的にあわせて、
臨機応変に、調整する必要がある。

ちなみに、転置しない場合は、以下のようになる。
barplot(as.matrix(X[,c(3,5,7)],names=colnames(X[c(3,5,7)])))
title(main="Number of electric plants in Japan")
abline(h=0)

このように、各変数ごとの合計となってしまう。
もちろん、このように表現したい場合もあり得るので、間違いではない
重要なことは、分析の目的に適した表現を選ぶことである。

さて、今回の場合はというと、地域別の状況を観察したいので、
この棒グラフではなく、先程の棒グラフを用いることにする。

今度は、一つの棒が、水力、火力、原子力で分かれているので、
何が、何を表しているかを、もう少し解りやすくしたい。
一つの方法は、色を上手く分けること。とりあえず、以下を実行。

col.h <- rgb(50, 100, 255, maxColorValue = 255)  # 水力発電所のイメージ色
col.t <- rgb(255, 100, 50, maxColorValue = 255)  # 火力発電所のイメージ色
col.a <- rgb(200, 255, 100, maxColorValue = 255)  # 原子力発電所のイメージ色??

色の三原色が、赤と緑と青、というのは周知の通り。これ常識。
コンピュータにおいても、この常識は通用していて、
ここでは、rgb()関数によって、新しい色の定義を行ない、
col.h、col.t、col.aの3つの変数に、指定した色を設定している。

コンピュータ上では、RGBの各色を、0〜255で指定することが多く、
この場合も、この階調で表現している。

CGやWebデザインなどに慣れている人は、想像でRGB値を設定できるかもしれないが、
このブログに見に来ている人にそういった人は多くはないだろう。
ネット上には、数値を調整して、色を確認するツールが色々とある。
今回は、以下のページのツールを用いた。参考までに。

Color Schemer Online V2
http://www.colorschemer.com/online.html

うん?ところで、原子力のイメージ色って何だ?悩みどころであるが…
とりあえず、薄いグリーンにでもしておこう。
ちなみに、私は原子力発電の可否については中立である。
ここで、思想的な主張するつもりは無い。

気を取り直してもう一度。

barplot(t(X[,c(3,5,7)]), ylab="Number of plants", ylim=c(0,250), names=rownames(X), las=2, col=c(col.h, col.t, col.a))
title(main="Number of electric plants in Japan")
abline(h=c(50,100,150,200),lty=2, col="gray")
abline(h=0)

さて、これで、かなり解りやすくなってきた。

しかし、イメージ色というのは、人によって異なるかもしれないし、
原子力のように、そもそも、イメージ色を想像しにくいものもある。
この図では、何色が、何を示しているのかが解らない。

では、どのようにするべきか?やはり、「凡例」を加えるのが良いであろう。

凡例というのは、グラフ上の記号や色が何を意味するかを表したもの。
Rでは、legend()関数というのがあって、この関数で指定する。
ちなみに、legendというのは、「凡例」の英語。
具体的には、以下のように設定する。

barplot(t(X[,c(3,5,7)]), ylab="Number of plants", ylim=c(0,250), names=rownames(X), las=2, col=c(col.h, col.t, col.a))
title(main="Number of electric plants in Japan")
abline(h=c(50,100,150,200),lty=2, col="gray")
abline(h=0)
legend("topright", legend=c("Hydro","Thermal","Atomic"), fill=c(col.h, col.t, col.a))

なるほど、これは、かなり見易い。色のバランスに、やや難はあるが。
要するに、最後にlegend()関数を実行しているだけ。

今回の場合、凡例の位置を「topright」で指定しているが、他にも設定方法がある。
  • "top": グラフエリアの上中央
  • "topleft": グラフエリアの左上
  • "topright": グラフエリアの右上
  • "bottom": グラフエリアの下中央
  • "bottomleft": グラフエリアの左下
  • "bottomright": グラフエリアの右下
  • "left": グラフエリアの左中央
  • "right": グラフエリアの右中央
  • "center": グラフエリアの中心
  • locator(1): クリックした位置
また、「x=0, y=0」のように座標で位置を与えることができる
ただし、座標を使う場合、データの実数値を与えることになるので、少々、厄介。

以上のように、結果を見てみると、日本では水力発電の数が多いことが解る。
発電所の数という点では、東北地方に発電所が多く、沖縄と北海道は少ない。
意外に東京や関西も発電所の数は多そう。また、九州は火力発電が多いことも解る。

この表現方法では、特に総数に焦点に当てながら、個別の数量も表現できている。
確かに、読み取れる情報も多く、全体像がよく解る。

しかし、個別の数量に焦点を当てながら総数も考えたいという場合もあり得る。
その場合には、縦に積み上げず、横に並べるという表現方法もある。

barplot(t(X[,c(3,5,7)]), ylab="Number of plants", ylim=c(0,250), names=rownames(X), las=2, col=c(col.h, col.t, col.a), beside=TRUE)
title(main="Number of electric plants in Japan")
abline(h=c(50,100,150,200),lty=2, col="gray")
abline(h=0)
legend("topright", legend=c("Hydro","Thermal","Atomic"), fill=c(col.h, col.t, col.a))

どこが変わったか、barplot()関数のパラメータをよく観察してみる。
すると、「beside=TRUE」というのが最後に追加されていることが解る。
このパラメータによって、棒グラフを横に並べることができる。

先程と異なり、この表現の方が地域的な特性が良く現れている。
この結果から、原子力は東京圏と関西圏の比率が高いことが解る。

さて、ここまで、色々な図を描いてみると、
次は、電力の最大出力の図と比較したくなる。

y軸ラベルが、少し重なっているが、今は無視する。
これを修正する方法はあるが、話が混線するので、別のトピックで。

barplot(t(X[,c(4,6,8)]), ylab="Maxmum output", ylim=c(0, 7e+04), names=rownames(X), las=2, col=c(col.h, col.t, col.a))
title(main="Maximum output of electric plants in Japan")
abline(h=c(1e+04, 2e+04, 3e+04, 4e+04, 5e+04, 6e+04),lty=2, col="gray")
abline(h=0)
legend("topright", legend=c("Hydro","Thermal","Atomic"), fill=c(col.h, col.t, col.a))

なお、このグラフにおけるy軸の単位は1,000kWである。

ふむ。barplot()関数yllimのパラメータの設定で混乱する人がいるかもしれない。
ここでは、y軸の値の下限と上限を0〜70000という値に設定している。
7e+04」というのは、コンピュータの世界での大きな数字の表現方法で、
7 掛ける 10 の 4乗」という意味。詳しい話はいずれ別のところで。

さて、この結果を見てみると、火力発電の出力が非常に高いことが解る。
先程の図と比較すると、水力発電は数の割に、出力は高くはないようである。
全体的に見てみると、東京圏が群を抜いて総出力は群を抜いて高く、
発電所数では、最も高かった東北地方は、総出力ではかなり低い。

折角の機会なので、次のような分析もやってみる。

P <- X[,c(3,5,7)]
M <- X[,c(4,6,8)]
barplot(t(M/P), ylab="Maxmum output", ylim=c(0, 6e+03), names=rownames(X), las=2, col=c(col.h, col.t, col.a), beside=TRUE)
title(main="Maximum output of electric plants in Japan")
abline(h=c(1e+03,2e+03,3e+03,4e+03,5e+03), lty=2, col="gray")
abline(h=0)
legend("topright", legend=c("Hydro","Thermal","Atomic"), fill=c(col.h, col.t, col.a))

今度は、PとMという二つの行列を作り、
Pには、種別発電所数の値を、
Mには、種別最大出力の値を、それぞれ代入している。

なお、barplot()関数に渡されているデータは、「M/P」となっているが、
これは、行列の成分の割り算であって、行列の割り算ではないし、逆行列でも無い。

この意味が解らない人は、今のうちに復習が必要。後々にも出てくる。
文系のための「内積」(1):行列の「掛け算」の方法
文系のための「逆行列」(2):逆行列の性質について

さて、これは一体何を示しているのかを考えてみる。
種別総出力を種別発電所数の単位に合致するように基準化しているので、
発電所一箇所当たりの総出力を水力、火力、原子力別に表している。

この値が高いということは、その地域に大規模な発電所が存在するか、
あるいは、全体的に総発電量が高い発電所が多い、ということになる。
原子力の場合では、東京圏が最も高く、火力で見ると、中部地方が最も高い。
水力に関しては、東京圏か関西圏が高いようである。

今回は、三種類のデータを元に棒グラフを描いたが、
ここで用いたデータをもう一度確認する。
グラフだけではなく、データを視ることも重要

> P
          hydro_pnum thermal_pnum atomic_pnum
Hokkaidou         53           11           1
Touhoku          209           13           2
Tokyo            162           25           3
Chubu            183           11           1
Hokuriku         127            6           1
Kansai           149           12           3
Chugoku           97           12           1
Shikoku           58            4           1
Kyushu           139           45           2
Okinawa            0           21           0

> M
          hydro_max thermal_max atomic_max
Hokkaidou      1234        4065       2070
Touhoku        2423       11286       3274
Tokyo          8981       38696      17308
Chubu          5219       23969       3617
Hokuriku       1904        4400       1746
Kansai         8196       16907       9768
Chugoku        2906        7801       1280
Shikoku        1141        3797       2022
Kyushu         3279       11577       5258
Okinawa           0        1919          0

> M/P
          hydro_max thermal_max atomic_max
Hokkaidou  23.28302   369.54545   2070.000
Touhoku    11.59330   868.15385   1637.000
Tokyo      55.43827  1547.84000   5769.333
Chubu      28.51913  2179.00000   3617.000
Hokuriku   14.99213   733.33333   1746.000
Kansai     55.00671  1408.91667   3256.000
Chugoku    29.95876   650.08333   1280.000
Shikoku    19.67241   949.25000   2022.000
Kyushu     23.58993   257.26667   2629.000
Okinawa         NaN    91.38095        NaN

一つ目は、地域別発電所数
二つ目が、地域別総発電量
三つ目が、1発電所当たりの総発電量

グラフを使わずに、この数値のみを提示して、説明することは可能であるが、
説明する方も、説明される方も、中々大変である。
ましてや、並び替えもできないような、紙面上での表現となると、見るのも苦痛である。

一方、グラフによって可視化すると、重要な事が直感的に解りやすく、
そのグラフを補足的に説明する文章があれば、大体は理解できる。

0 件のコメント:

コメントを投稿