グラフによるデータ解析: ExcelとR †
第8回授業の獲得目標: †
- 0. 千葉大学 Skipwiseプログラムによる海外留学の紹介
- 1. Rの基本操作を習得する(復習)
- 2.Rで「沢山のデータを一まとめにして扱う方法」を理解しよう(復習)
- 3.Rでグラフを描いてみよう
- 4. Rで簡単な統計処理をやってみよう
Skipwiseプログラムによる海外留学 †
まずは、授業Moodleページから、演習1のグループワークをやってみよう。
千葉大学のSkipwiseプログラムでは、留学をカリキュラムの一環として位置づけ、平成28年までの5年間に学部学生の30%が留学を経験することを目標としている。そこで海外留学について考えてみよう。なお、今年度の短期留学プログラムの説明会が、今週の金曜に行われるので、興味のある人は参加してみよう。
- H26年度 スキップワイズ短期留学プログラム
- 【説明会】
- 日 時 : 6月 2日(月)・6日(金) 12:10~12:50
※13日(金) 留学フェアの後半に説明を行います
- 開催場所 : イングリッシュ・ハウス
また、海外留学については、以前に紹介したトビタテ!留学 JAPAN 日本代表プログラムプログラムページというものもある。こちらについても、授業moodleページで、もう少し詳しく説明する。
Rの基本操作を理解しよう: †
さて、先週は最後の方で簡単にしか説明しなかったR。
今週は、自分で操作して、好きなグラフを描けるところまでやってみよう。今後の研究やレポートでもかならず役に立つので、全員ができるようになることを目指したい。。
男子学生へのお願い! †
- 今日の演習4で使うので、moodleページの「演習4のためのデータ(男子学生のみ)」から、身長と体重を入力しておいて下さい。
Rのインストール(大学では不要) †
数年前から大学の教育用端末に、Rがインスト−ルされているので、授業ではインストール作業は不要になった。
おうちの自分のパソコンでRを使いたい場合、
のいずれかにアクセスして、ダウンロードしてインストールする。Windows , Mac, Linuxのどの環境でも使える。
Rを起動する †
では、スタートメニューから、Rを起動しよう。
R起動すると~、画面が切り替わり、小さいウィンドウの中にいくつかのメッセージと、一番最後に、
>
が表示される。この">"をプロンプトと言う。プロンプトの右側には通常、カーソルがあり、「このマークの後に何かコマンド(命令)を打ち込んでくださいよ」とあなたに促している。式を入力して、最後にenter(or returnキー)を押せば計算される。
Rによる簡単な数値計算演習: Rは関数電卓代わりに使える! †
以下、Rを使った簡単な計算。プロンプト(>)から右の部分をコピーペーストすれば、計算できる。
- 1035を27で割ったときの余りを求めなさい
> 1035 %% 27
- 足し算・引き算のまとめ
演算子 | 意味 | 使用例 |
+ | 足し算 | > 4+3 [1] 7 |
- | 引き算 | > 4-3 [1] 1 |
* | 掛け算 | > 4*3 [1] 12 |
/ | 割り算 | > 4/3 [1] 1.333333 |
^ | 累乗 | > 4^3 [1] 64 |
%/% | 整数商 | > 7%/%3 [1] 2 |
%% | 剰余 | > 7%%3 [1] 1 |
授業で解説するRのコマンドを別ページにまとめておきます。 → Rコマンド一覧
オブジェクトへの数値の代入 †
Rでは、好きな名前をつけたオブジェクト("もの")に、数値や文字列などのデータを代入できます。オブジェクトには大文字小文字の区別があります。
> x = 3 #xに3という数字を代入した
> X = 4 #Xに4という数字を代入した
> x + X #xとXの足し算 (なお、#の後はコメント文と呼ばれ、処理には関係の無い説明を書いておける)
なお、上では"="を使って数値を代入しましたが、 "<-"を使っても同じことができます。
> x <- 3
> X <- 4
> x+X
(Rの代入はもともと "<- " だけだったが、比較的最近、 " = " も使えるようになった。この授業では=を使う)
Rで「沢山のデータを一まとめにして扱う方法」を理解しよう †
みなさんは、沢山のデータを1まとめにして扱う方法をすでに知っている。
例えばエクセルを使った計算では、
という表を使ってデータを一まとめにし、sum()関数をつかったり、1つのセルに5を足すという計算結果を全部のセルにコピペして、全ての値に5ずつ0足した結果を得たりした。
でも、Rのように、命令文を1行ずつ入力して計算するソフトウェアの場合、データをまとめて扱うにはどうすればいいだろうか?
もちろん、下のように1行ずつ計算式を打ち込んでも答えはでるが、データの数が多くなると、面倒すぎる。
(こんなやり方だと面倒くさい)
> 10.4+5.6+3.1+6.4+21.7
> 10.4+5
> 5.6+5
Rでは、データを横1行に並べて扱う(これをベクトルという) †
そこで、Rでは、たくさんのデータを一まとめにして扱うときには、カンマで区切って横1行に並べて使う。このようなデータの構造をベクトルと呼ぶ。ベクトルとうと、高校の数学でやった「大きさと方向をもった量」を思い出すと思うが、
Rで使うベクトルは、同じ種類のデータに順番をつけて並べたもの
と定義しておこう。これは、Rが沢山のデータをまとめて処理するために用いる、データの構造だ。例えば、
(10.4, 5.6, 3.1, 6.4, 21.7)
というデータの集まりは、同じタイプのデータに順番をつけてひとまとめにしたものであり、Rでいうところのベクトルだ。
そして、Rでデータを一まとめにして使うときに必要なのが、c()という関数。
Rを使う上で、これだけは絶対に覚えておこう |
Rでデータを一まとめにして扱うときには、 c( ) という関数を使う |
例えば、上のデータを、x というオブジェクトに代入したいときには、
x=c(10.4, 5.6, 3.1, 6.4, 21.7)
という命令を使う。上の命令を入力した後、「 x 」とだけ入力すると、xの内容が表示される。
> x
[1] 10.4 5.6 3.1 6.4 21.7
上の結果に表示された[1]は何だろうか?これは、表示された行の最初の数字が、ベクトルの1番目の要素だということを意味している。では、次のようなベクトルをyに代入して、内容を表示させてみよう。
> y=c(1984,1985,1986,1987,1988,1989,1990,1991,1992,1993,
1994,1995,1996,1997,1998,1999,2000,2001)
ウィンドウの大きさによって表示のされ方は異なるが、もし1行に収まらなければ、
> y
[1] 1984 1985 1986 1987 1988 1989 1990 1991 1992 1993 1994 1995 1996 1997
[15] 1998 1999 2000 2001
というように、2行目の始まりに[15]というような数字が表示される。これは、2行目が15番目の要素から始まっていることを示している。
「ベクトル」とは、同じタイプのデータに順番をつけて一まとめにしたものだった。では、一まとめの中から、例えば、「5番目の要素」だけを取り出すにはどうすればいいだろうか?勘のいい人はもう気づいているかもしれないが、
> y[5]
[1] 1988
と、オブジェクトの名前に順番を[]に入れたものをくっつける事で、目的の要素を取り出すことができる。
オブジェクトへのベクトルの代入 †
では、Rで、沢山のデータを一まとめにして、いろいろ計算してみよう。
まずはおさらい。上で出てきた、 c() という関数を使って、オブジェクトにデータを代入でする。
> x=c(1,2,3,4,5,6,7)
>
entterキーを押しても何もおこらない?いえいえ。エラーメッセージが何も表示されず、新しいプロンプトが表示されたら大成功。
(もし、上のようにならなかった人は、半角・全角の文字の違いとコンマやカッコに注意してもう一度やってみよう。)
では、プロンプトの後に"x"と入力して、結果を見てみよう。
>x
[1] 1 2 3 4 5 6 7
上の様に表示されれば「xというオブジェクトに(1,2,3,4,5,6,7)が代入されたことになる。では、このデータを対象に、統計解析の基本である平均値の計算を計算してみよう。
mean()という関数(meanは英語で平均値の意味)で一まとめにしたデータ(ベクトル)の平均値が計算できる。
命令の入力に自信の無い人は、下の囲みの中をコピー・ペースト。
>mean(x)
[1] 4
平均値"4"が表示されれば大成功(これで、あなたがRを使って行う、初めての統計解析は、無事に成功した)
では、数値をもう少し変えて、自分の好きな値で計算してみよう。。。
上で説明したように、キーボードの"↑"記号を何回か押してみると、
> x=c(1,2,3,4,5,6,7)
と表示された。そしたら"←"と"Back space"などを使って、数値を好きに変更して、最後に"Enter"キーを押そう。
> x=c(1232,223.33,3 ,4 , 5666)
半角文字であるかぎり、別にスペースがいくつ入っていても大丈夫。入力したら、上と同じことをしてみると、
> x
[1] 1232.00 223.33 3.00 4.00 5666.00
> mean(x)
[1] 1425.666
これで、自分の好きな値を入力して、平均を計算することができた。
Rでグラフを描いてみよう †
では、いよいよ、Rで簡単なグラフを描いてみよう。まずやらなければならないのは、
オブジェクトにデータを代入
演習2. 用いるデータ †
データは、前回授業で用いた死亡率の表を使う。扱いやすいように、エクセルファイルにしたものを、ここに添付しておくので、ダウンロードして開いてみよう。
- 演習2資料.xlsx
- dataシートでは、「データ メニュー / フィルター」を使って、項目見出しにフィルターコントロールが表示されている。何度も並び替えたり、特定のデータを抽出したりするときに便利。
- ratioシートには、死亡者総数に対する割合が計算されている。列のみ絶対参照を使って、「$S2」などで割り算をしていることに注意
- 前回課題では、例えば、次のようなグラフが提出された。
たしかに、このグラフからは、両者の相関は無さそうに見える。でも、実は、どの種類のグラフを選ぶかというのは、大変重要。相関関係を議論する場合は、散布図を使うのが最も一般的。また、男女それぞれで傾向に違いがある場合は、合計値を使ってしまうと、うまく相関が現れないばあいがある。そこで、男女にわけて、散布図を作ってみよう。
- 解答例:
- (クリックすると拡大されます)
- 疑似相関に注意!: こうやって散布図を作って見ると、いろんな病気で死亡率に相関関係がありそうなのが見えてくる。しかし、本当に、それほど相関関係があるのだろうか?
- 疑似相関をチェックするのに使うデータ: practice3.csv
- 疑似相関を見るために、上のcsvファイル中のデータ全ての間で、散布図を作って見る
方法
#data1にデータを入力
data1 = read.table("<ファイルへのパス>practice3.csv", header = TRUE, sep=",")
##ファイルへのパスを知るには、ダウンロードしたpractice3.csvを、Rのファイルメニューから
「ソースを開く」で開いてみる。コンソールに、パス(ファイルの場所を示す文字列)が表示される
pairs(data1)
オブジェクトへのデータの入力 †
まず、年、結核、心疾患のそれぞれの男女別のデータを、それぞれ
年 を year に
結核・男 を m_k
結核・女 を f_k
心疾患・男 を m_h
心疾患・女 を f_h
に代入しよう。
scan()によるデータの入力 †
このとき、上でつかったc()という関数を使うのではなく、scan()という関数を使うと、エクセルからのコピーペーストで値をオブジェクトに代入できる。
まず、1986-2006の年のデータをyearに入れるには、
> year = scan() #ここでEnterを押す
1:
すると、「1:」という表示になるので、、エクセルのシートから1986から2006までのデータをペーストすると
1: 1986
2: 1987
3: 1988
4: 1989
5: 1990
6: 1991
7: 1992
8: 1993
9: 1994
10: 1995
11: 1996
12: 1997
13: 1998
14: 1999
15: 2000
16: 2001
17: 2002
18: 2003
19: 2004
20: 2005
21: 2006
22: #最後にEnterを押す
これで21年分の年のデータが、yearに入った。試しに
>year
と入力してみよう。下のようになるはずだ。
[1] 1986 1987 1988 1989 1990 1991 1992 1993 1994 1995 1996 1997 1998 1999 2000
[16] 2001 2002 2003 2004 2005 2006
- 演習: 同様にして、m_k, f_k, m_h, f_hについても値を入力しておこう。
男性の結核のデータをm_kというオブジェクトに入力する場合、
> m_k = scan()
1: #ここで、男性の結核のデータをペースト
.
.
22: #最後にEnterを押す
- 注意: 今回はscan()という関数で、コピー・ペーストで簡単にデータを入力しているが、この場合、それぞれのデータの対応順は一致している必要があるので、注意しよう''
昇順で並び替えた結核のデータと、降順で並び替えた心疾患のデータの対応関係をグラフにしても、正しい関係は得られない。
- 演習の確認: うまくできていれば、それぞれのオブジェクトの名称を入力すると、下のようなデータが表示されるはずだ。
> year
[1] 1986 1987 1988 1989 1990 1991 1992 1993 1994 1995 1996 1997 1998 1999 2000
[16] 2001 2002 2003 2004 2005 2006
> m_k
[1] 3112 2959 2954 2676 2745 2449 2514 2424 2290 2267 2064 1955 1977 2114 1876
[16] 1715 1584 1615 1555 1579 1517
> f_k
[1] 1058 1063 918 851 919 876 833 825 804 911 794 787 818 821 780
[16] 776 733 722 775 717 752
> m_h
[1] 72072 72566 78640 77901 81774 83646 86384 88309 78868 69718 68977 69776 71134
[14] 73979 72156 72727 74986 77989 77465 83979 82811
> f_h
[1] 70509 71343 79280 78930 83704 85232 89162 91988 80711 69488 69252 70398 71986
[14] 77100 74585 75565 77532 81556 82160 89146 90213
グラフの作成 : plot †
それでは最も基本的なグラフ作成関数であるplot()を使ってみよう。操作は、以下のように入力するだけ。
>plot(year,m_k)
下のようなグラフが表示されただろうか?
&ref(): File not found: "#6_2.gif" at page "授業/H26/情報処理/07";
折れ線グラフにしたければ、こうやってみるといい。
> plot(year,m_k, type="l")
- 演習: 心疾患の死亡者数の推移についても、折れ線グラフを描いてみよう
グラフの重ね合わせ: par(new=T) †
それでは、男女の結核による死亡者数の推移を、1つのグラフ上に表示させたい。
Rでは、2つのグラフを重ねる という操作をして、2つの異なるデータを1つのグラフ上に表示させる。
- 操作1: m_kとf_kのグラフを単純に重ねる: 失敗例
- すでに上でやったように、m_kとf_kのそれぞれの折れ線グラフは、
> plot(year,m_k, type="l")
> plot(year,f_k, type="l")
で描くことができる。
- この2つを単純に重ねるには、1つめのグラフを描いたあとに、par(new=T)という、グラフの重ね描きを指定するコマンドを入れて、2つめのグラフを描く。例えば、
> plot(year,m_k, type="l")
> par(new=T)
> plot(year,f_k, type="l")
しかし、いくつかおかしいところがある。
- 1. Y軸の数値の範囲がそろっていないし、読めない
2つのグラフの示している値が異なる
- 2. Y軸のラベルが重なってしまって読めない
- 3. グラフの線が同じだから、男女が区別できない。
'par(new=T) でグラフを重ね描きする場合の注意点 †
- 1. 'グラフの座標の範囲を揃える:
重ね描きするグラフが全て同じ座標範囲となるように、 ''xlim = c(a, b),ylim = c(c, c) を指定すること.このとき、a, b, c, dはそれぞれ、値(数値)。
- 操作: 上の結核の死亡者数の場合、男性の最大値は3112、女性の最大値は1063。そこで、0から4000ぐらいの範囲を指定して、グラフにしてみよう。x軸の方は同じ値を使っているので指定する必要は無いが、練習のため、明示的に1986年から2006年の範囲を指定してみよう。
また、lty=2というオプションを指定すると、グラフの線が点線になる。
> plot(year,m_k, xlim=c(1986, 2006), ylim=c(0,4000), type="l", lty=2)
- 演習: 表示させる範囲を変えたり、ltyの値を変えたりして、グラフがどう変化するかみてみよう。
- 2. グラフの軸ラベルをキレイに表示させる:
Rではグラフを重ね描きするため、軸のラベルも重なってしまう。例え同じ文字であっても重ねが気されるので、時には、どんどん文字が太くなってしまったりする。そこで、軸ラベルの重ね書きを避けるために、
- 1回目のプロットには、軸ラベルをわざと書かさない
ann=F, axes=F
##それぞれ、annは軸ラベル(xlabやylabで後ほど指定)、axesは軸目盛り
- par(new=T)で重ね書きを指定
- 2回目のプロットで、軸ラベルを指定する
- 操作: 先ほどの結核の死亡者数で男女のデータを1つのグラフに表示させてみよう
> plot(year,m_k, xlim=c(1986, 2006), ylim=c(0,4000), type="l", lty=1, ann=F, axes=F)
> par(new=T)
> plot(year,f_k, xlim=c(1986, 2006), ylim=c(0,4000), type="l", lty=2, xlab="Year", ylab="No. of death")
- こんなグラフが表示されるはず
- 演習: 結核による死亡者数、心疾患による死亡者数の、男女それぞれの推移を、グラフで表してみよう。
- ヒント
- 上で作成した4つのデータのそれぞれについて描いたグラフを全て重ねる。
値の範囲は全て同じものを使う: 結核は0-4000、心疾患は0-100000。大きい方の心疾患に合わせる。
軸と軸ラベルは、一番最後に追加すれば良い
- 見やすいように、男女のグラフで色を変えてみよう(男性のデータは黒で、女性のデータは赤で)
線を赤くしたいときは、
col="red"
というオプションを追加
- 答え例1: x軸が0-100000の例
> plot(year,m_k, xlim=c(1986, 2006), ylim=c(0,100000), type="l", lty=1, ann=F, axes=F)
> par(new=T)
> plot(year,f_k, xlim=c(1986, 2006), ylim=c(0,100000), type="l", lty=1, ann=F, axes=F, col="red")
> par(new=T)
> plot(year,m_h, xlim=c(1986, 2006), ylim=c(0,100000), type="l", lty=2, ann=F, axes=F)
> par(new=T)
> plot(year,f_h, xlim=c(1986, 2006), ylim=c(0,100000), type="l", lty=2, xlab="Year",
ylab="No. of Death", col="red")
- 答え例1: 左側x軸が0-4000、右側x軸が0-100000の例
plot(year,m_k, xlim=c(1986, 2006), ylim=c(0,4000), type="l", lty=1, ann=F, axes=F)
par(new=T)
plot(year,f_k, xlim=c(1986, 2006), ylim=c(0,4000), type="l", lty=1, col="red", xlab="Year", ylab="No. of Death")
par(new=T)
plot(year,m_h, xlim=c(1986, 2006), ylim=c(0,100000), type="l", lty=2, ann=F, axes=F)
par(new=T)
plot(year,f_h, xlim=c(1986, 2006), ylim=c(0,100000), type="l", lty=2, ann=F, axes=F, col="red")
axis(4)
- 発展演習:三代疾病による男女の死亡者数の合計の推移を1986年から2006年までRでグラフにしなさい。x軸は左側の1つの軸だけにすること。
- Tips: 上の演習のように、いくつものグラフを重ねて描くときは、Rエディタ(あるいは、K2エディタのようなテキストエディタでもいい)でコマンドを編集してから、コピーペーストして、一度にグラフを描かせる方が良い場合がある。
- 注意:上の表のような複数項目にわたるデータを扱うときには、実際には、データフレームとして値を取り込んで計算することが多い。
Rでグラフを描くことをもっと勉強したいときに見るサイト †
- 今回は簡単なグラフを点で作成しただけだが、線で結んだり、色をかえたり、いろんなことができる。下の参考資料を見て、いろいろと試してみよう。
Rを一人で使う場合: 参考になる情報 †
まず最初に参考書の紹介だが、Rには様々な参考書が出版されているので、どれか一冊を選んで買ってきて、随時参照しながら操作をするといいだろう。フリーのオンライン情報だけを使って使いたい人は、次のようにするといい。
1. Rの命令一覧が載っている説明書のPDF(上記)を画面に表示させる
2. Adobe Readerの検索機能を使って、行いたい処理を検索
3. 説明を読んで入力すべき命令文をコピー
4. Rにペーストして、値を編集して実行
こうやって、常に説明書を参照しながら操作すれば、命令を覚える必要は無い。