=== 読者が配色を変更したい場合 ===
◎外側の色を変えるには,次の色をクリック
《体験・入門レベル》
== Rによるヒストグラム,散布図の作成 == R version 4.0.3, 4.0.4Patched ----- 最終更新年月日:2021.3.30
○この教材は,体験・入門のレベルで,30分から1時間ほどで「そこそこ分かる」ことを目指します.
1. ヒストグラム
1.1 棒グラフとヒストグラムの違い
度数分布表と棒グラフ20人の生徒の朝食が,次のようになっていたとする.パン,ご飯,シリアル,なし,シリアル,なし,ご飯,シリアル,
data1<-c(パン,ご飯,シリアル,・・・,パン,ご飯)
これを関数table( )を使って集計すると「度数分布表」になる.
table(data1)
ご飯 シリアル トースト なし 5 6 4 5
barplot(table(data1))
この棒グラフでは,カテゴリ(区分,分類)はデータとして与えられており,与えられたカテゴリごとの「度数」が「棒の高さ」として表示される.※グラフィック・ウィンドウを表示したとき Rでグラフィック・ウィンドウを表示したとき,元のRコンソールが見えなくなることがある.
(1) Rコンソールが見えなくなったら,R上端にあるメニュー画面で「ウィンドウ→1 R Console」を選ぶとよい.
(2) Rのウィンドウ選択画面は,たぶん縦と横の関係が独特の解釈になっていて,通常のWindows画面で使われている縦横の関係が逆になっているように思う. すなわち,「ウィンドウを縦に並べて表示する」とは,通常は「日」の字の形に並ぶと予想するが,Rでは「日」の字の形に並ぶ.同様にして,「ウィンドウを横に並べて表示する」とは,その逆になる. |
階級幅とヒストグラムこれに対して,次のような数値データ(20人の生徒の数学の得点とする)
87,21,27,36,87,48,78,51,40,11,
このデータをベクトルdata1に取り込んで,
45,22,82,68,40,89,23,48,61,73
data1<-c(87,21,27,36,・・・,73)
Rの関数hist( )を使うと
hist(data1)
次のようなグラフが描ける.
また,棒グラフとは異なり,棒の境界線にはすき間を空けない. 次のようなデータフレーム(文字列,数値を含む表)から,数値データの列を指定して,ヒストグラムにすることもできる. data2 番号,男女,芸術,数学,英語 1,女,音楽,52,66 2,男,美術,28,23 3,男,美術,32,30 4,男,書道,94,67 5,女,書道,50,48 6,男,美術,60,90 7,男,書道,34,77 8,女,書道,23,59 9,女,音楽,88,55 10,女,美術,24,54 11,女,音楽,31,21 12,男,美術,89,24 13,女,音楽,62,56 14,女,美術,33,88 15,女,美術,87,31 16,女,書道,40,54 17,女,音楽,89,91 18,男,美術,75,52 19,男,美術,83,32 20,女,書道,46,24
hist(data2$数学)
• $を付けると列を表すことができる.
• 列ラベルには日本語の漢字・カナ・かなも使うことができる. |
1.2 ヒストグラムの色,階級
色グラフの色は,名前付きタグとして col="red","blue" などの名前,"#ffff00"などのRRGGBBの16進表示が使える.例えば,グラフの中塗りを茶色#880000にするには
hist(ベクトル名, col="#880000")
階級数,階級幅一般に,データの個数をNとするとき,分布の傾向を見やすくするための階級数kは,「スタージェスの公式」が目安とされている.
≒
幾つか具体例を挙げると,次の表のようになる.
|
[階級の境界線:ブレークポイントを手動で指定するには] (1) 例えば,階級の境界線を,0,25,50,75,100 のように設定したいときは,ベクトルc(0,25,50,・・・)を使って指定する.
hist(ベクトル名, breaks=c(0,25,50,75,100))
上記の指定の仕方で最小のbreakポイントよりも小さなデータがあったり,最大のbreakポイントよりも大きなデータがあるとエラーになる.
(2) 数列の考えで,初項a,末項l,公差dの等差数列の各項をbreakポイントにするには
ほとんどの場合で,階級幅は等間隔にとられるが,上記のように指定した場合,必ずしも等間隔でない階級幅でも指定できる.
hist(ベクトル名, breaks=seq(a,l,d))
とする.hist(data2$英語, breaks=seq(0,100,20))の場合 |
2. 散布図
2.1 散布図の基本
散布図は,2つの量的変数の関係を視覚的に示すのに適している.r_ex2.csv
氏名,芸術,数学,英語 平清盛,音楽,52,58 源頼朝,美術,28,55 織田信長,美術,32,63 豊臣秀吉,書道,86,68 徳川家康,書道,50,65 今川義元,美術,60,75 毛利元就,書道,34,71 武田信玄,書道,46,54 上杉謙信,音楽,88,74 伊達政宗,音楽,62,71 新井白石,美術,80,65 明智光秀,美術,70,65 吉備真備,書道,40,55 和気清麻呂,音楽,89,79 嵯峨天皇,書道,23,62
• 数学の得点が高い生徒は,英語の得点も高い(正の相関がある)
などの関係を調べる第一歩として,散布図を利用することができる.(架空データ:当然!!)• 数学と英語の得点は無関係(=無関係) • 数学の得点が高いほど英語の得点は低い(=負の相関がある) 右のデータがr_ex2.csvというCSVファイルに保存されているとき,まず,これをdata1というデータフレームに読み出し
data1<-read.csv("r_ex2.csv")
|
次に,数学を横に英語を縦にとった散布図を表示するには
plot(data1$数学, data1$英語)
とする.
• ドルマーク($)に続けて列ラベルを書く.
⇒次の図1のような散布図が得られる.
• 列ラベル(ベクトルの名前)には,日本語漢字・かな・カナも使える. −図1− • マーカーは,既定値が○(pch=1)で,名前タグ付き引数pch= (plotting character)で指定できる.
|
2.2 散布図にラベルを付けるには
データ数が多くなると,散布図のマーカーと(x, y)座標を目で追って行くことは難しくなるので,下図のようにマーカーにラベルを付けたいと思うことは多い.
−図2−
plot(x, y, ...,)
(1) plot(xベクトル, yベクトル, pch=16, col="blue", cex=0.5)のように指定するとtext(x, y, ラベル)
xベクトル:data1$数学 → 順にx座標を表す
yベクトル:data1$英語 → 順にy座標を表す pch=16 : マーカーとして●を使用する col="blue" : マーカーは青色にする cex=0.5 : character expansionにより,標準の文字サイズ(1)との比率を指定する. |
(2) text(xベクトル, yベクトル, ラベルベクトル, adj=0, cex=0.7)のように指定すると
xベクトル:data1$数学 → 順にx座標を表す
yベクトル:data1$英語 → 順にy座標を表す
マーカーの座標と全く同じx,y座標を使う.マーカーの少しだけ右にラベルを表示するにはx座標に+0.5など,少し上にラベルを表示するにはy座標に−0.3など(yは下が小さい)
ラベルベクトル : この欄に氏名や番号を使うところがミソ下記のadj=0により,重ならずに左寄せ表示ができる adj(adjustment)=0で左寄せ,0.5で中央,1で右寄せ. cex=0.7 : ラベルとして読みやすい大きさを加減する
1行で完結するコマンドは,Rのコンソールから入力すればよいが,2行以上になる場合
@) 2行に分けて入力してもよいものは,Rのコンソールに1行ずつ2回に分けて書いてもよい A) プログラム的に2行以上をまとめて書くときは,メニューをたどって「ファイル→新しいスクリプト」と進んで,Rエディタにプログラムを書き込み,「編集→すべて実行」を選ぶとよい. |
2.3 複数系列の散布図を表示するには
−図3−
※図3は,かなり慎重に作ったが,2か所(わざとか結果的にかは別として)ミスがある.data0$数学, data1$数学というタイトルが重なっている.(英語も同じ)これは,以下の重ね書きの方法を読めば分かる.
図3のように,1組の生徒(和気清麻呂〜今川義元)を青●のマーカーで,2組の生徒(毛利元就〜徳川家康)を赤▲のマーカーで区別して散布図に示す方法を考える.ここでは,関数par()を使ってグラフィック画面に上書きしていく方法を紹介する.
描画を上書きする方法として,他にも add=TRUE を引数に追加する方法もあるが,使える場合とそうでない場合の区別がやや難しいので,ここでは扱わない
次の2つのCSVファイルを読み出して使うことにする.
r_ex0.csv
氏名,芸術,数学,英語和気清麻呂,音楽,89,79 上杉謙信,音楽,88,74 豊臣秀吉,書道,86,68 新井白石,美術,80,65 明智光秀,美術,70,65 伊達政宗,音楽,62,71 今川義元,美術,60,75 r_ex1.csv
氏名,芸術,数学,英語毛利元就,書道,34,71 徳川家康,書道,50,65 織田信長,美術,32,63 嵯峨天皇,書道,23,62 平清盛,音楽,52,58 吉備真備,書道,40,55 源頼朝,美術,28,55 武田信玄,書道,46,54 |
RコンソールまたはRエディタに,次の順にコマンドを書き込む.
data0<-read.csv("r_ex0.csv")・・・@ data1<-read.csv("r_ex1.csv")・・・A plot(data0$数学, data0$英語, pch=16, col="blue", data0<-read.csv("r_ex0.csv") data1<-read.csv("r_ex1.csv")Bはグラフィック画面に散布図のマーカーを描画する. plot(data0$数学, data0$英語, pch=16, col="blue",
• plot(ベクトル1, ベクトル2)によりdata0の数学をx座標とし,英語をy座標として,マーカーを順に表示する.
例えば1番目のマーカーは和気清麻呂の(89,79)を点で示す. • ここでは,pch(plotting character)=16で●を使う.また,col(color)="blue"でマーカーは青色とする. • 1つの散布図を表示するときは,必ずしもxlim(X軸の描画範囲),ylim(Y軸の描画範囲)を指定しなくても,データのある範囲を必要十分に絞った範囲が選ばれる. しかし,グラフィック画面に複数のグラフを上書きするとき,各々のグラフのX軸Y軸が揃っていないと,「みじめな重ね書き」ができてしまう.これを避けるため,グラフィック画面の描画コマンド(plot(), hist(), points(), lines()などを上書きするときは,xlim, ylimとして同じ範囲を指定することが重要になる) 例えば,0≦x≦100は,xlim=c(0,100)のようにベクトルで示す. |
Cはテキスト画面への文字列の書き込みを行う
text(data0$数学+0.7,data0$英語,data0$氏名,adj=0,cex=0.7)
• テキスト描画とグラフィック描画は同じ(x,y)座標を使うが,同じ位置なら後から描いた方が勝ちになる.
• text()の引数に adj=0とすると,その座標に対して左揃えで文字列が表示され,adj=1とすると右揃えで表示される.adj=0.5のときは中揃えであるが,上図の緑で示した位置よりも実際には下になり,マーカーと重なる. • adj=0の左揃えでもマーカーと文字列が重なるので,少しだけ空白を入れるために,この例では,text()の座標をdata0$数学+0.7,data0$英語とした.(文字サイズとの関係で,表示した上で微調整するとよい) • 文字列のサイズはcex(character expansion:文字拡大率)=で指定する.cex=1が標準サイズで2は2倍,0.5なら半分の大きさになる.散布図のラベルも「大き過ぎるとそれなりに邪魔」になるので,比率を変えて見やすいサイズにするとよい. |
Dはグラフィック画面への描画を上書きで行うときに書く
par(new=TRUE)
• par( )は,set graphical parametersの略で,グラフィカル・パラメータの設定を行う.
Eはグラフィック画面に散布図のマーカーを描画する.ただし,ここでは上書きするために,前にDのpar( )を置いている.
• new=TRUE または new=T により,グラフィカル画面の描画が「上書き」になる • 上書きする前に,その都度書く ※これに対して,テキスト画面への書き込みは,デフォルトで上書きになっている plot(data1$数学, data1$英語, pch=17, col="red",
• plot(ベクトル1, ベクトル2)によりdata0の数学をx座標とし,英語をy座標として,マーカーを順に表示する.
Fはテキスト画面への文字列の書き込みを行う.テキスト画面の書き込みはデフォルトで上書きだからDのような前置きは不要
例えば1番目のマーカーは毛利元就の(34,71)を点で示す. • ここでは,pch=17で▲を使う.また,col="red"でマーカーは赤色とする. • グラフィック画面に複数のグラフを上書きするとき,各々のグラフのX軸Y軸が揃えるためにxlim=c(20,100),ylim=c(50,80)をBに揃える. text(data1$数学+0.7,data1$英語,data1$氏名,adj=0,cex=0.7) |