読者です 読者をやめる 読者になる 読者になる

山羊の午後

研究関係の備忘録。

Rのはじめ方 1:インストールから立ち上げ

とりあえずのR

はじめに

 Rは無償でつかえて、多様な統計解析ができる上に、グラフも描けちゃうフリーソフトです。慣れればエクセルより簡単に、綺麗に、高度なことができます。ただし、インターフェイスがとっつきにくい。とくに、プログラミング初心者にとっては「難しそう」でしかないのが難点。。。でも大丈夫です! すでにネット上にはたくさんのテキスト、ドキュメントがあり、独習するには資料に事欠きません。
yaginogogo.hatenablog.jp


 こんなに良くまとまったサイトがたくさんあるなら、もう新しくエントリを書く必要もないよね? と思いながら、ここではプログラミング経験ゼロ、統計知識ゼロ、パソコンスキル低、でもどうにか始められる、をモットーに進めていきたいと思います。
 読み終わったころには、エクセルのほうが簡単だし、だなんて言わせない、そんな意気込みでいきたいです。

インストール


 まずはRを自分のパソコンにインストールしましょう。このブログではWindows版のベーシックなRを使って説明していきます*1。が、他にも、Rにはもともとのソフトを使いやすく改良したバージョンが存在します。これらは入力インターフェイス(見た目)が違うだけで、どのソフトを使っても、得られる統計解析、グラフには差がありません。
 それぞれの解説ページを見て、使いやすそうなものを選びましょう。

R studio
複数ウィンドウですっきりした見た目。最近人気。日本語版もあります→RStudio 解説スライド

Rstudio事始め


R コマンダー
Rをインストールした後にインターフェイスを変更する。参考サイトR on Windows

R言語で統計解析入門: Rコマンダー「Rcmdr パッケージ」の追加インストール 梶山 喜一郎

 

ベーシックなRをWindowsにインストールする

 Rの公式ページからダウンロードできるサイト一覧にとべます(左欄 CRAN)。


日本のダウンロードサイト
https://cran.ism.ac.jp/ The Institute of Statistical Mathematics, Tokyo
http://cran.ism.ac.jp/ The Institute of Statistical Mathematics, Tokyo
http://ftp.yz.yamagata-u.ac.jp/pub/cran/ Yamagata University


 ミラーサイトなので、どこでも同じです。


f:id:yk_uminami:20160423184455p:plain


 ↑Downroad for Windowsを選択して、↓一覧から「base」を選択します。


f:id:yk_uminami:20160423192513p:plain



 ↓Downroad R 3.xxx for Windows をクリックします。


f:id:yk_uminami:20160423192734p:plain


 ダウンロードしたファイルを実行すると、インストールが始まります。

 使用言語で「日本語」を選択します。

 インストール先のフォルダ、コンポーネント、カスタムしない、とデフォルトの設定のまま「次へ」で進めていきます。


 完了、を押したらおわりです。


 デスクトップには「R x64」と「R i386」のふたつのアイコンができてると思います。


 自分のパソコンが64ビット版であれば「R x64」を選択してRを起動します。パソコンが32ビット版であれば「R i386」を起動します。


 
f:id:yk_uminami:20160423194039p:plain



 これで準備は万端です。

*1:もっとも情報量が多く、バージョンアップによる更新ストップの心配が少ないため、これを使ってます。

Rの独習に役立つリンク集

とりあえずのR

Rの使い方について

R による統計処理
Rの使い方の基礎から統計手法まで。下記書籍のサポートページ。

Rによる統計解析

Rによる統計解析


とある弁当屋の統計技師(データサイエンティスト)
インストールから使い方まで。物語風書籍のサポートサイト。


プログラマーのためのR言語入門 - Qiita
プログラミング言語としてのRの特徴まとめ。つぼがわかる。プログラミングの初歩が分かってる人向け。
biostatistics | バイオスタティスティクス | 生物統計学
サンプルコードいろいろ。使いたい手法が分かってる人むけ。

関数の使い方を調べる

  • help(関数名)で関数のマニュアルがブラウザで呼び出される。(英語。ネット経由)
R: The R Project for Statistical Computing
Rの開発チームHP。マニュアルとF&Qとリリース状況をチェック。
RjpWiki - RjpWiki
サイト内を検索すればたいていの疑問は解決されている。
R-tips
細かい指定の方法まで具体的なTipsが沢山。書籍化されており、逆引きレファレンスが充実している。

The R Tips―データ解析環境Rの基本技・グラフィックス活用集

The R Tips―データ解析環境Rの基本技・グラフィックス活用集

統計について調べる

ハンバーガー統計学にようこそ!
初歩から分散分析までを具体例で学ぶ。統計の入門用。
私のための統計処理
自分が持っているデータをどう統計解析するか。二群の検定~分散分析。
統計学自習ノート
統計手法が網羅的に解説されている。全文検索から質問の過去ログにあたれる。
租界〈R〉の門前にて
統計学の講義資料などが公開されている。

より深く理解して使うときに

生態学データ解析 - FrontPage
GLM、ベイズ統計について。
JIN'S PAGE
Rの基礎から統計手法それぞれの解説。自然言語処理テキストマイニングについて。

Rで描く、二要因の棒グラフ

とりあえずのR グラフ

barplot(x, beside=T)

  • 行列データxを縦列ごとにグループに分けて棒グラフを描く。

f:id:yk_uminami:20160422012354p:plain

#データ入力
group<-c(10,20,30) #例 投与量
m.Con<-c(0.079,0.102,0.146) #対照群 平均値
sd.Con<-c(0.022,0.051,0.026) #対照群 標準偏差

m.Test<-c(0.12,0.25,0.34) #テスト群 平均値
sd.Test<-c(0.055,0.031,0.026) #テスト群 標準偏差


#y軸の最大値を指定
yRoof=round(max(m.Con+sd.Con, m.Test+sd.Test)*1.2, 1) 


#棒グラフ
graph1<-barplot(cbind(m.Con, m.Test),beside=T, 
        names=c("Con","Test"), ylim=c(0,yRoof), col=c(0,8,1))

#上向きのエラーバー
arrows(graph1,cbind(m.Con,m.Test),
       graph1, cbind(m.Con+sd.Con,m.Test+sd.Test),
       angle=90, length=0.1,lwd=2, col=1)

#下向きのエラーバー
arrows(graph1,cbind(m.Con,m.Test),
       graph1,cbind(m.Con-sd.Con, m.Test-sd.Test),
       angle=90,length=0.1,lwd=2,col=c(1,1,"white"))

# x軸を描く
axis(side=1, c(mean(graph1[,1]),mean(graph1[,2])), labels=F) 

legend("topleft", paste(group, "mg"), fill=c(0,8,1)) #凡例
title("Bar graph with two factors")

データ

  • cbind(m.Con,m.Test)#ベクトルを列方向に連結。
m.Con m.Test
[1,] 0.079 0.079 #10mg
[2,] 0.102 0.102 #20mg
[3,] 0.146 0.146 #30mg
  • Conの平均値(m.Con)1、2、3行目がグラフ1グループ目に隣接して表示される。

barplot(beside=T)

  • 入力されたベクトルを列ごとに隣接して描画。
  • besides=Fにすると列ごとの積み上げグラフになるので注意。
  • barplot()を代入したgraph1は、各棒のx軸上の位置を値として返す。入力した表と同じ形式が出力される。

エラーバー

  • arrows()も同様に列ごとに1、2、3行目とデータが読み込まれるので、同じ形式でx0,y0.x1,y1のそれぞれにデータ表を指定する。(値の混同がないように注意すること)

そのほかの修飾

  • 各郡の真ん中に目盛りをつけるため、axis()には、graph1の列ごとに平均値をとった。(各棒それぞれに目盛りをつける場合、graph1をそのまま入力する)
  • legend(位置、ラベル名、凡例の書式)を指定する。すべてに同じ単位をつける場合、paste()が便利。

行列を入れ替えた表

f:id:yk_uminami:20160422013553p:plain

データ表の行列を入れ替えて入力する

rbind(m.Con, m.Test) #ベクトルを行方向に連結

[,1] [,2] [,3]
m.Con 0.079 0.102 0.146
m.Test 0.120 0.250 0.340
group 10 20 30
#棒グラフ
graph1<-barplot(rbind(m.Con, m.Test),beside=T, 
        names=group, ylim=c(0,yRoof), col=c(0,8))

#上向きのエラーバー
arrows(graph1,rbind(m.Con,m.Test),
       graph1, rbind(m.Con+sd.Con,m.Test+sd.Test),
       angle=90, length=0.1,lwd=2)

#下向きのエラーバー
arrows(graph1,rbind(m.Con,m.Test),
       graph1,rbind(m.Con-sd.Con, m.Test-sd.Test),
       angle=90,length=0.1,lwd=2)

# x軸を描く
axis(side=1, c(mean(graph1[,1]),mean(graph1[,2]),mean(graph1[,3])), labels=F) 

#凡例とタイトル
legend("topleft", c("Con","Test"), fill=c(0,8)) 
title("Bar graph with two factors")
  • barplot()に入力するデータ表にあわせてarrows(),axis()の入力データの形式をそろえる。

Rむけのデータ表を作る

とりあえずのR

Rが理解しやすい表

  • スタック形式でつくると利用しやすい
  • 人間向けの表とはちがうんだなー、と覚えておく。

ヒト向けの表

クラス1
生徒 数学 化学 国語 英語
A 85 70 55 61
B 46 83 60 77
C 58 94 84 61
D 90 79 51 63
E 76 56 66 61
F 59 32 49 52
G 73 79 78 83
H 65 86 71 95
I 88 90 63 42
J 61 67 59 71

f:id:yk_uminami:20160415175302p:plain

  • クラス1のAさんが受けた教科のうち数学の点数は85点
  • 点数85の情報ラベルは分散して表現されている
  • 人間にわかりやすいけどRは不得意
  • Rではwideと表現される

Rむけの表:スタック形式

クラス 生徒 教科 得点
1 A 数学 85
1 A 化学 70
1 A 国語 55
1 A 英語 61
1 B 数学 46
1 B 化学 83
1 B 国語 60
1 B 英語 77
1 C 数学 58
... ... ... ...
  • 縦方向は常に同じカテゴリ、同じ単位の値
  • 横方向は常に同じデータポイント(ここでは生徒)
  • クラス1のAさんが受けた教科のうち数学の点数は85点、が一列に並んでいる
  • 人間には見にくいけど、Rには分かりやすい
  • Rではlongと表現される

ヒト向きの表からR向きの表への変換

  • うっかり人間用の表で集計してしまったとき。
  • stack()をつかう。
student<-LETTERS[1:10]
math.test<-c(85,46,58,90,76,59,73,65,88,61)#数学
chem.test<-c(70,83,94,79,56,32,79,86,90,67)#化学
dat<-data.frame(student,math=math.test,chem=chem.test)
dat

dat.stack<-stack(dat,select=c(math,chem))
dat.stack

dat2<-data.frame(student=rep(dat$student,2), 
                 subject=dat.stack$ind, 
                 score=dat.stack$values)
dat2
  • エクセルで集計した表は、CSV形式で保存して、read.csv()で読み込む。

Rむきの表をヒト向きの表に変換する

  • reshape()を使う
  • directionにwideを、idvarに縦方向に並べたいベクトル名、timevarに横方向に並べたいベクトル名を指定する。残りのベクトルがtimevarに応じて分割される。
  • データ表に3変数以上がある場合、指定がわかりづらい。いろいろ試行錯誤するしかない。
student<-LETTERS[1:10]
math.test<-c(85,46,58,90,76,59,73,65,88,61)#数学
chem.test<-c(70,83,94,79,56,32,79,86,90,67)#化学
dat<-data.frame(student,math=math.test,chem=chem.test)
dat.stack<-stack(dat,select=c(math,chem))
dat2<-data.frame(student=rep(dat$student,2), 
                 subject=dat.stack$ind, 
                 score=dat.stack$values)
dat2

dat3<-reshape(dat2, idvar="student", timevar="subject", 
              direction="wide")
dat3

Rの色指定いろいろ

とりあえずのR グラフ

例:棒グラフ barplot(col=色指定)

f:id:yk_uminami:20160422005431p:plain

#データ入力
group<-c(10,20,30) #群
m.data<-c(0.079,0.102,0.146) #平均値
sd.data<-c(0.022,0.031,0.026) #標準偏差

#y軸の最大値を指定
yRoof=round(max(m.data+sd.data)*1.3, 1)   

#棒グラフを描く
graph1<-barplot(m.data, names=group, ylim=c(0,yRoof),
        col=c("royalblue3","brown3",8)) #色の指定

#上向きのエラーバー
arrows(graph1,m.data,graph1,m.data+sd.data,angle=90,length=0.1,lwd=2)

#下向きのエラーバー
arrows(graph1,m.data,graph1,m.data-sd.data,angle=90, length=0.1,lwd=2)

#x軸を描く
axis(1, graph1, labels=F) 

#タイトルをつける
title("Color samples")

色の指定法: 単色 col=X、 複数色 col=c(X,X,X)

  • 複数に色分けするときは、ベクトルc(x,x,x)を指定する。
  • ベクトルの指定は前から順番に使われる。指定数がデータ数に足りないときは、先頭に戻って繰り返される。

col=数字:基本色のセット。

0 1 2 3 4 5 6 7 8
シアン マゼンダ
white black red green blue cyan magenta yellow grey

col="色名"

  • 基本的な色名はそのまま指定すれば使える。
    • 例)pink, orange, violet, skyblue
  • エクセルっぽい青 col="royalblue3"
  • エクセルっぽい赤 col="brown3"
使える色名をみる
  • colors() # 657色ある
demo(colors) #色名をその色で表示。
  • いろいろ見比べたいとき
x=c(1:5) #1から5番目の色
barplot(rep(1,length(x)),names=colors()[x],col=colors()[x])
#colorsを色名とともに表示する。xに任意の数をいれる。

col=HEX(16進数のカラーコード)

透過色をつかう

  • col=HEX(16進数色コード)+透過度(00~FF)
  • 例 col="#FF00007F" #赤の透過色、約50パーセント
透過度% 30 50 60 70
≒16進数 4C 7F 99 B2
  • 図を重ねたりするときに便利。
注意
透過色をつかうと、図をファイルへ保存する時、印刷する時にエラーが起きることがある。

グレースケールを使う

  • gray()に0-1の間を指定する。小さいほど黒い。
barplot(rep(1,11),names=seq(0,1,0.1),col=grey(seq(0,1,0.1)))

f:id:yk_uminami:20160407021534p:plain

カラーチャートを使う

  • 連続した変化を色で表現するときなどに。
  • barplot(rep(1,4),names=rainbow(4),col=rainbow(4))
    • チャートrainbow()から4つの色が抜き出される。

f:id:yk_uminami:20160407020236p:plain

カラーチャート見本

  • rainbow()
    • barplot(matrix(rep(1,50),50),horiz=T,col=rainbow(50))

f:id:yk_uminami:20160407015156p:plain

  • heat.colors()
    • barplot(matrix(rep(1,50),50),horiz=T,col=heat.colors(50))

f:id:yk_uminami:20160407015423p:plain

  • terrain.colors()
    • barplot(matrix(rep(1,50),50),horiz=T,col=terrain.colors(50))

f:id:yk_uminami:20160407015543p:plain

  • topo.colors()
    • barplot(matrix(rep(1,50),50),horiz=T,col=topo.colors(50))

f:id:yk_uminami:20160407015624p:plain

  • cm.colors()
    • barplot(matrix(rep(1,50),50),horiz=T,col=cm.colors(50))

f:id:yk_uminami:20160407015707p:plain

Rで描く、棒グラフ

とりあえずのR グラフ

barplot()で平均値+標準偏差のエラーバーを描く

図の例

f:id:yk_uminami:20160422002515p:plain


コード

#データ入力
group<-c(10,20,30) #群
m.data<-c(0.079,0.102,0.146) #平均値
sd.data<-c(0.022,0.031,0.026) #標準偏差

#y軸の最大値を指定
yRoof=round(max(m.data+sd.data)*1.2, 1)

#棒グラフ
graph1<-barplot(m.data,names=group, ylim=c(0,yRoof), 
        xlab="Amount of drug (mg/kg)", ylab="Responses (/sec)",
        col="royalblue3", space=0.5)

#上向きのエラーバー
arrows(graph1,m.data,graph1,m.data+sd.data,angle=90,length=0.1,lwd=2) 
#下向きのエラーバー
arrows(graph1,m.data,graph1,m.data-sd.data,angle=90, length=0.1,lwd=2) 

# x軸を描く
axis(side=1, graph1, labels=F) 

#タイトルをつける
title("Bar graph with error bars", cex =2)

#有意差のマークをつける
segments(graph1[1], yRoof*0.8, graph1[2], yRoof*0.8,lwd=2)
points((graph1[1]+graph1[2])/2,yRoof*0.83, pch="*", cex=2)

segments(graph1[1], yRoof*0.9, graph1[3], yRoof*0.9,lwd=2)
points((graph1[1]+graph1[3])/2,yRoof*0.93, pch="*", cex=2)

コードの説明

データ入力
  • 群は数でも文字でもかまわない。
  • 表として表示するには、
group<-c(10,20,30) #群
m.data<-c(0.079,0.102,0.146) #平均値
sd.data<-c(0.022,0.031,0.026) #標準偏差

d.table<-data.frame(Group=group, Mean=m.data, SD=sd.data)
d.table

  Group  Mean   SD
1   10  0.079  0.022
2   20  0.102  0.031
3   30  0.146  0.026

棒グラフの準備
  • エラーバーを描くために、先にy軸の最大値を設定すると便利。
    • yRoof=round(max(m.data+sd.data)*1.2, 1)
    • 各群ごとに平均値に標準偏差を足し、その中から最大値をmax()で探して、1.2倍してround()で少数一桁を四捨五入。
    • 小数点一桁で四捨五入する round(x, 1)
  • 最小値が固定(=0)でない場合、同様に最初に指定すると便利。
    • 例)yFloor=round(min(m.data-sd.data)*1.3,1)
  • エラーバーをあえてy軸枠外に突き抜けて描きたい場合、par(xpd=T) をarrows()の前に入力し、枠外への書き込みを許可する。
棒グラフ bargraph()
  • graph1<-barplot(height=m.data, names=group, ylim=c(0,yRoof))
    • graph1に代入することで、x軸上の各棒の真ん中の値が得られる。これをエラーバーの作図に利用する。
  • barplot()で設定できるプロパティ
height 第一引数。各棒の高さを指定する。一番目に指定したベクトルが自動的に使われる。
names 各棒のラベルを指定する。数字でも文字でも可。
ylim 縦軸を c(最小値, 最大値)で指定する。指定しないとheightから適宜計算される。
xlab, ylab 軸名を指定。サイズはcexで指定。*1
col 棒の色を指定。エクセルっぽい青 col="royalblue3"、エクセルっぽい赤 col="brown3"
weight 第二引数。各棒の幅を指定する。指定しない場合、等分幅になる
space 棒の間隔を指定。space=c(0.5, 0.8)とすると間隔の1番目から順番に幅を指定。*2
注意
graph1<-barplot(m.data, group, ylim=c(0,yRoof))とnamesを指定しないで二番目にベクトルを指定すると、weightとして認識され、幅の異なるグラフになる。


yaginogogo.hatenablog.jp


エラーバーを描く
  • arrows(x0, y0, x1, y1)は指定された点A(x0,y0)から点B(x1,y1)へ矢印を描く。
arrowsの例
#描画領域を作る
plot(3,3, xlim=c(0,5),ylim=c(0,5))
#点(0,0)から点(3,3)に矢印を引く
arrows(0,0,3,3)
  • arrows()のプロパティ
angle 矢印先端の角度。90でフラットになる。初期値は30
length 矢印先端の長さ。単位はインチ、初期値は0.25
lwd 矢印の線の太さ。初期値は1
lty 線の種類。初期値は1(実線)、2~6が点線、0は線なし
  • これを使って、棒の端・中央を点Aとし、そこから上に標準偏差だけ離れた点Bに矢印を描き、矢印の先端を90度に指定するとエラーバーになる。
#上向きのエラーバー
arrows(graph1, m.data, graph1, m.data + sd.data, angle=90,length=0.1,lwd=2) 
  • barplot()を代入したgraph1は、各棒の中央にあたるx座標を返してくれる。(Rがグラフを描くために設定した値)
  • この値を矢印のx座標とし、y座標には棒の高さであるm.dataと、m.dataにエラーバーの長さであるsd.dataを加えた値を指定する。
  • 指定しているデータの表
点A x0 = 点B x1 点A y0 点B y1
group graph1 m.data m.data+sd.data
10 1.0 0.079 0.101
20 2.5 0.102 0.133
30 4.0 0.146 0.172
  • 下向きの矢印は同様に平均値m.dataから標準偏差sd.dataを引いた点Bにむかって矢印を引く。
#下向きのエラーバー
arrows(graph1, m.data, graph1, m.data - sd.data, angle=90,length=0.1,lwd=2) 
目盛り付きx軸を描く
  • axis(side=1, graph1, labels=F)
  • side=1がグラフ底辺をさす。
  • 目盛りの値にbargraph()を代入したgraph1を指定することで、棒の中央に目盛りがつく 
注意
labels=Tにするとgraph1の数値が表示される。
タイトルを書く
  • title(main="title")
    • 文字サイズは cex = 1 がデフォルト。2にすると2倍に拡大される。subで下にサブタイトル。
有意差のマークをつける
#有意差のマークをつける
segments(graph1[1], yRoof*0.8, graph1[2], yRoof*0.8,lwd=2)
points((graph1[1]+graph1[2])/2,yRoof*0.83, pch="*", cex=2)
  • segment()は点A(x0,y0)から点B(x1,y1)に線を引く。
  • point()は点(x,y)に記号(pch)を描く。
    • xの値はgraph1に代入された各棒の中央の値をつかう。
    • yの値はグラフ天井からの相対値 yRoof*0.8 で出すか、エラーバーの最大値との相対値でだす。
    • 例)max(m.data+sd.data)*1.2 


yaginogogo.hatenablog.jp

*1:x,y軸をちがう文字サイズにするときはどちらかを xlab="" として描かずにおいて、あとから title(xlab="xxxx", cex=2) で描く。

*2:左端x軸との間隔、右端の領域は別の指定が必要

とりあえずのR 目次

とりあえずのR

データハンドリング



グラフを描く

そのほかの装飾パラメータ

yaginogogo.hatenablog.jp

  • マーカーと線
  • 文字の書き込み
  • 斜線で塗る

折れ線グラフ

  • 1群の折れ線グラフ
    • 折れ線グラフでx軸に日付(文字)を使う
  • 2~n群の折れ線グラフ

箱ひげ図

円グラフ

とりあえずの統計解析

  • 一元配置の分散分析

yaginogogo.hatenablog.jp

  • 分散分析と下位検定