今回は統計やデータ処理で使われるR言語を使ってデータの可視化を行います。R 言語は特定のライブラリをインストールしなくてもデフォルトの機能で様々なグラフを書くことができます。そこで最初に R に最初から備わっている機能を使ってグラフを描画して可視化を行います。これをR言語と区別してR baseと呼ぶことにします。次に R の可視化でよく使われるライブラリである ggplot2 を使って可視化を行います。元々ある R でも多くのグラフを書けますが ggplot2 を使うことでより様々な機能が使えグラフの書き方も変えることができます。
Contents
1. R base でグラフの描画
最初に R に元々備わっている機能を使ってグラフの描画を行います。R のデフォルトでかけるグラフはデータを分析する際、に瞬時に可視化をしたいときに使うと良いと思います。この後紹介する ggplot2 よりも早く動くという利点があります。
1.1 ヒストグラム
まずは統計などでよく使われるヒストグラムの描画をしていきます。今回ヒストグラムでの可視化で使うデータはデータ分析でよく使われる iris データを使います。まずデータの中身を確認してみます。
ヒストグラムでは setosa の Sepal.Length を使ってグラフを書いてみます。
データを入力しただけでこのようにグラフの描画ができます。とても簡単に書けますね。これだけでも自分が理解する分には十分です。ヒストグラムは階級を変えたり度数表現を密度で表すこともできます。デフォルトの設定で階級はスタージェスの公式で設定されています。スタージェスの公式は次のように書かれます。
nはデータの数です。
hist() 関数の中身を見てみるとこのようになっています。
#ヒストグラム
hist(
x=data, #表示するデータ
breaks=breaks, #階級
freq = TRUE #TRUEで度数
probability=FALSE #TUREで密度
labels = FALSE, #度数や密度の表示
axes = TRUE, #軸の表示
density = density
angle = deg
main="グラフ名前",
xlab="xラベル",
ylab="yラベル",
col='色',
border='色',
)
階級を増やして度数表現を密度表現にし斜線を引いてみます。
最後にグラフに色をつけ、ラベルを入れていきます。
このグラフは機能を適当に使っているだけなので見やすいグラフになるように工夫してみるといいです。基本的に他のグラフも同じように書くことができるので他のグラフも書いていきます。
1.2 棒グラフ
棒グラフを書いていきます。まずはただの数値ベクトルをグラフで表します。
barplot()の中身で先ほど紹介してないものをまとめてみました。hist()で書いた色などは省いてありますがヒストグラムの時と同様に書くことでできます。
#棒グラフ
barplot(data='行列で指定',
space='barの幅(数字指定)',
main = "グラフの名前",
sub = '下にグラフの名前'
legend='はん例',
beside=FALSE #TRUEで重ねず横並びに表示
)
次に複数あるデータを描画してみます。データは死亡率のデータを使います。まずデータを見てみましょう。
このデータを棒グラフで表します。
複数のデータもこのように自動的に色を変えて表示してくれます。デフォルトでは複数のデータを積み重ねて表示することができます。
1.3 折れ線グラフ
折れ線グラフを書いてみます。データは適当に作ったデータを用います。
plot() 関数を使うことで描くことができます。デフォルトの状態だと線ではなく点で表されるため散布図になります。type を変えることでグラフを変えることができます。
type | グラフの形 |
“p” | 散布図 |
“l” | 折れ線図 |
“b” | 点と線(繋がっていない) |
“c” | 折れ線図(繋がっていない) |
“o” | 点と線 |
“h” | 棒グラフのような線(細い線) |
“s” | 棒グラフのようなステップグラフ |
他の引数は hist() や barplot() と同いじようにmain, sub, ylab, xlab などで軸ラベルを設定したりグラフの名前をつけたり色をつけたりすることができます。
1.4 円グラフ
円グラフを書いてみます。データは私が作成した分数の合計が1となるデータを使います。
円グラフも非常に簡単に書けます。勝手に色分けや大きい順のラベルを入れてくれます。
色やラベルを変えてグラフに名前をつけます。clockwise をTRUEとすることで元々のデータの順に時計回りで表示します。FALSE で反時計回りに表示します。
おまけですが面白い表示を見つけたので紹介します。edges を指定することで多角形表示できます。また radius を変えることで不思議な図も書けます。
1.5 散布図
最初のヒストグラムでも扱った iris のデータを使って描画してみます。最初に setosa の Sepal.LengthとSepal.Width の関係を散布図で見てみます。
これで描画できました。pchは散布図の点の表し方を示していて数を変えることでいろんな表示の仕方があります。丸や三角、四角など変えられます。bg で塗りつぶしができるようになっています。
他の種類の特徴と比べてみたいのでグラフを重ねて表示してみます。この際軸を同じにする必要があるのでそれぞれ合わせています。
三つのグラフを重ねて書きました。par(new=T) と書くことで新しいグラフを上に重ねることができます。軸を全ての図で同揃えないとずれた意味のないグラフになってしまうので xlim=c(4.0,8.0), ylim=c(1.5,5.0)として軸を揃えてあります。ann=Fとすることで2枚目以降のグラフの軸を書かない設定にしてあります。凡例やタイトルはグラフの外部からlegend, title で入れることができます。
下のようにfor 文を使ってデータを順番に書く方法もあります。
2. R の描画ライブラリ ggplot2 を用いてグラフの描画
R のグラフの可視化としてよく使われる ggplot2 を用いて可視化を行っていきます。R に元々ある関数でのグラフの描画は一回描画するために全ての形を揃えて一度に描画する感覚であったのに対して ggplot2 はグラフの要素を一つずつレイヤーを重ねて描いていく感覚であるととが特徴だと言われます。R の方が少し速く描画できるようですがあまり変わりません。R 言語でグラフを描画する際は ggplot2 が使われることが多いようです。また、R に元々ある関数では特殊な指定が必要になるのに対して ggplot2 が全てのグラフで統一したインターフェースとオプションのセットがあります。 よって一つの知識でいろんなグラフを書くことができます。
2.0 ggplot の 基本的構造と文法
グラフの描画の前に基本的な構造と文法を説明します。下の図のように ggplot2 は層を重ねていくように作ります。
ggplot(data, aes(x="x軸の選択", y="y軸の選択", ......))+ geom_○○○()+
グラフの基本的な準備は ggplot() を用いて行います。データを描画するグラフを用意するイメージです。ggplotの最初の引数はデータでプロットするデータを入れます。軸だけなどの設定の場合はNULLを入れればデータは選択されません。aes()でデータをどのようにグラフで使うかを選択します。軸にどのデータを用いるか、グループ化による色の選択などができます。その後 geom_○○○()のように棒グラフ、散布図などグラフの形を変えて表示します。ちなみに棒グラフは geom_col()、散布図は geom_point() です。基本的にこの二つがあればグラフを書くことができます。層を重ねる場合は “+” で追加していきます。その上の層ではグラフの軸を変えたり、凡例を入れたり、色を変えたりなど見え方を変えたりなど工夫をしていきます。
また途中まで書いたグラフなどを変数に代入することでオブジェクトとして使うことができます。
基本的な ggplot2 でのグラフの描画のイメージはつかめたでしょうか。では以下でさまざまなグラフを描画していきます。
2.1 棒グラフ
ggplot2で棒グラフを描いてみます。アメリカの2000年から2010年までの人口の変動率を表したデータを用いて可視化をおこなってみます。使うデータは人口変動の大きい上位10州のデータを用います。
Stateが州の名前、Abbが略名、Regionが州の地域、Changeが人口変動率を表しています。これを用いてグラフを書きます。
グラフを書くことができました。
少し要素を加えてみやすくしてみます。
地域でグループ化して色をかえました。棒グラフに限らず ggplot2 のグラフ全てで共通しているのが fillが塗りつぶしの指定、colourが縁の色の指定ができます。今回色を書いてませんが勝手に Region でグループ化して色をデフォルトで設定してくれます。
色を変えたり他の要素を加えたい場合などは先ほど説明したように + を使って指定して要素を追加することができます。基本的にコードはグラフによらず全く変わらないので一度覚えてしまうと非常に簡単にグラフを書くことができると思うのでいろんな方法を試すといいかと思います。
先ほどのグラフに scaale_fill_manual で色を変更し、さらに geom_text でデータの値を上から書いて表示しました。このように簡単に好きなように色を変更したり要素を追加したりできます。かなり多くの機能があるのでよりみやすく伝わりやすいグラフにすることができます。
2.2 折れ線グラフ
まず適当に作ったデータを描画してみます。
geom_line()でグラフ描画します。geom_point()は散布図を描くとに用いりますが、要素として追加すると点をプロットしてくれます。
次に、今回は紀元前からの世界人口の数位のデータを使います。データの確認です。
これを描画してみます。今回は線の種類を変えてみます。
linetype で種類を変更、size で線の大きさを変更し、colour で線の色を変えてみました。y軸にスケールが違いすぎるので少し変えてみます。
scale_y_log10() で y軸のスケールを変えてみました。これで少しみやすくなりました。近代から一気に人口が増加し増加の加速が加速していることがわかります。また、geom_point()でデータの点を示しました。しっかりデータとして取れているのは紀元後だとわかります。
2.3 散布図
ggplot2 で散布図を書いてみます。データはirisデータを使います。
ではグラフを書きます。
Speciesでグループ化し色、形を変えて表示しています。scale_shape_manual、scale_colour_manualと scale_fill_manual で形、色を変えました。形の番号はRで定められている番号と同じで上のR base を使って散文図を書いたときと同じ形にしました。これでR baseで描画した時と同じような図になりました。こちらの方が非常に簡単に書くことができると思います。
今回は size を Petal.Length で、fill を Petal.Widthマッピングしグループ化しました。連続的な数値データでマッピングすると自動的に大きさを連続的に変えて表示してくれます。同様に fill を連続データでマッピングをすると色のこさを変えて表示しれくれます。少しみにくいですが全ての特徴のデータをこの数行の code で表現することができました。このグラフからSepal.Length、Sepal.Width で setosa が分類でき、Petal.Width で versicolor、virginicaの分類がある程度できると思います。
おまけですが散布図のデータに回帰モデルの直線をフィットすることもできます。
2.4 ヒストグラム
ggplot2 でヒストグラムを書いてみます。これまでのグラフはグラフの描画として必要なデータが x軸とy軸で二つありましたが、ヒストグラムでは一つのデータののみなので他のグラフと少し違います。
データは iris のデータを用いて描画してみます。
ヒストグラムは geom_hist() で表示することができます。
R base の時は特に指定しなくてもデフォルトのスタージェスの公式での分割により描画できましたが ggplot では デフォルトは30分割されます。今回は iris の Sepal.Length の値から0.5 ずつで表示してみました。またデフォルトの色は黒で表示されます。
おまけですが密度曲線を書いてみたいと思います。
ヒストグラムの y軸をaes()の中で “..density..” と指定することで密度で表しています。密度関数の描画は geom_density() で描くことができます。
2.5 ggplot の使い方まとめ
最後に軸の範囲の指定やラベルなどよく使いそうな関数をまとめました。基本的な ggplot() + geom_○○○ の後ろに+で要素を追加してグラフを変えてよりみやすい意味のあるグラフを作るといいでしょう。これは私が使おうと思った一部なので他にもggplot2 には多くの機能があるので調べてみるといいでしょう。
#### グラフの軸やラベルの設定 ####
#軸の範囲
xlim(min, max)
ylim(min, max)
#軸名前の変更
labs(x="name", y="name")
xlab("name")
ylab("name")
#グラフのタイトル
ggtitle("name")
#########################
##### 色や形の指定 #######
#色の設定はベクトルでデータの色分けの要素を指定します(カラー番号でも指定できる)。
scale_shape_manual(values=c("要素"))
scale_colour_manual(values=c("要素"))
scale_fill_manual(values=c("要素"))
#色の指定はggplotで元々決まっているpaletteから選んでも変えられます。
scale_colour_brewer(palette = "パレットの種類の名前")
scale_fill_brewer(palette = "パレットの種類の名前")
#########################
####注釈 #################
annotate("text", x="グラフのx座標", y ="グラフのy座標", label = "入れる文字")
#数式も入れられる
annotate("text", x="グラフのx座標", y ="グラフのy座標",
parse=TRUE, label = "frac(1,sqrt(2 * pi)) * e ^ {-x^2 / 2}")
まとめ
R言語でのデータの可視化としてR base 、ggplot2 を用いてさまざまなグラフを書いてみました。個人的には ggplot2 の方が code をかくときに統一された記述方法で指定できるため使いやすくまた、より見やすい綺麗なグラフを作ってくれるため使いやすいと感じました。また、これは今回は簡単なグラフしか描画しませんでしたが他にもグラフや表示方法でもっと見やすいグラフを書くことができるため、プレゼン資料など人に見せるグラフを作る場合に使えると思いました。
データ整理やグラフではPythonのPandasやseaborn、Matplotlib 他にはエクセル、matlab、gnuplot などさまざまな言語やライブラリがありますが R を使う方法もあります。他の言語より比較的簡単だと思うので試しに使ってみるのもいいかもしれません。