スマホ用は別頁
=== 読者が配色を変更したい場合 ===
◎外側の色を変えるには,次の色をクリック
◎内側の色を変えるには,次の色をクリック
標準文字色を変えるには,次の色をクリック
《体験・入門レベル》
== Rによるヒストグラム,散布図の作成 ==
R version 4.0.3, 4.0.4Patched
----- 最終更新年月日:2021.3.30
○この教材は,体験・入門のレベルで,30分から1時間ほどで「そこそこ分かる」ことを目指します.
1. ヒストグラム
1.1 棒グラフとヒストグラムの違い

度数分布表と棒グラフ

 20人の生徒の朝食が,次のようになっていたとする.
 パン,ご飯,シリアル,なし,シリアル,なし,ご飯,シリアル,
なし,シリアル,なし,パン,ご飯,シリアル,なし,パン,ご飯,
シリアル,パン,ご飯
 これをdata1というベクトルに代入するには
data1<-c(パン,ご飯,シリアル,・・・,パン,ご飯)
 これを関数table( )を使って集計すると「度数分布表」になる.
table(data1)
   ご飯 シリアル トースト     なし 
       5        6        4        5 
度数分布表は,関数barplot( )を使って「棒グラフ」にできる.
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,
45,22,82,68,40,89,23,48,61,73
 このデータをベクトルdata1に取り込んで,
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
 上記のデータフレームdata2数学という列をヒストグラムに表示するには
hist(data2$数学)
• $を付けると列を表すことができる.
• 列ラベルには日本語の漢字・カナ・かなも使うことができる.

1.2 ヒストグラムの色,階級

 グラフの色は,名前付きタグとして col="red","blue" などの名前,"#ffff00"などのRRGGBBの16進表示が使える.
 例えば,グラフの中塗りを茶色#880000にするには
hist(ベクトル名, col="#880000")

階級数,階級幅

 一般に,データの個数をNとするとき,分布の傾向を見やすくするための階級数kは,「スタージェスの公式」が目安とされている.
 幾つか具体例を挙げると,次の表のようになる.
N1248163264128
k12345678
 Rの関数hist()によって表示されるヒストグラムの階級数は,名前タグbreaks=によって指定され,デフォルト(省略された場合)では,breaks="Sturges"・・・すなわち,スタージェスの公式が適用される.ただし,上記の公式が機械的に適用されるのではなく,特に指定がなければ,10,20,50,100,200,500,...分割などになる.
[階級の境界線:ブレークポイントを手動で指定するには]
(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−
• 1つの○が1人分のデータで,そのx座標が数学の得点,y座標が英語の得点を表す.
• マーカーは,既定値が○(pch=1)で,名前タグ付き引数pch= (plotting character)で指定できる.
pch=012345615161721・・・
マーカー×・・・

2.2 散布図にラベルを付けるには
 データ数が多くなると,散布図のマーカーと(x, y)座標を目で追って行くことは難しくなるので,下図のようにマーカーにラベルを付けたいと思うことは多い.

−図2−
 ここではtext()関数でラベルを上書きする方法を紹介する.
plot(x, y, ...,)
text(x, y, ラベル)
(1) plot(xベクトル, yベクトル, pch=16, col="blue", cex=0.5)のように指定すると
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",
xlim=c(20,100),ylim=c(50,80))・・・B text(data0$数学+0.7,data0$英語,data0$氏名,adj=0,cex=0.7)・・・C par(new=TRUE)・・・D plot(data1$数学, data1$英語, pch=17, col="red",
xlim=c(20,100),ylim=c(50,80))
・・・E text(data1$数学+0.7,data1$英語,data1$氏名,adj=0,cex=0.7)・・・F
@Aは上記のようなCSVファイルr_ex0.csv,r_ex1.csvをデータフレーム(数値・文字列混じりの表)data0, data1に読み込む
data0<-read.csv("r_ex0.csv")
data1<-read.csv("r_ex1.csv")
Bはグラフィック画面に散布図のマーカーを描画する.
plot(data0$数学, data0$英語, pch=16, col="blue",
xlim=c(20,100), ylim=c(50,80))
• 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の略で,グラフィカル・パラメータの設定を行う.
• new=TRUE または new=T により,グラフィカル画面の描画が「上書き」になる
• 上書きする前に,その都度書く
※これに対して,テキスト画面への書き込みは,デフォルトで上書きになっている
Eはグラフィック画面に散布図のマーカーを描画する.ただし,ここでは上書きするために,前にDのpar( )を置いている.
plot(data1$数学, data1$英語, pch=17, col="red",
xlim=c(20,100),ylim=c(50,80))
• plot(ベクトル1, ベクトル2)によりdata0の数学をx座標とし,英語をy座標として,マーカーを順に表示する.
 例えば1番目のマーカーは毛利元就の(34,71)を点で示す.
• ここでは,pch=17で▲を使う.また,col="red"でマーカーは赤色とする.
• グラフィック画面に複数のグラフを上書きするとき,各々のグラフのX軸Y軸が揃えるためにxlim=c(20,100),ylim=c(50,80)をBに揃える.
Fはテキスト画面への文字列の書き込みを行う.テキスト画面の書き込みはデフォルトで上書きだからDのような前置きは不要
text(data1$数学+0.7,data1$英語,data1$氏名,adj=0,cex=0.7)
...(PC版)メニューに戻る