Rによる統計分析の準備
Rはオープンソースの統計処理ソフトウェアです.
Ross Ihaka氏とRobert Clifford Gentleman氏によって開発されたR言語の実装にあたります.
Rは統計モデルを記述する上での見通しの良さに突出しており,ベクトル・行列の計算,欠損データの取り扱い,多様な確率分布の利用といった点でも優れています.
目次
インストール
CentOS 8
CentOS 8でのインストールは次のようにします.
(CentOS公式のフォーラムでの回答による.)
dnf config-manager --set-enabled PowerTools |
Alpine Linux
iPhoneのアプリであるiShにてインストールする方法です.
iShはAlpine Linux 3を採用しているため,
apk add R |
とします.
セットアップ
以下の環境あたりでの例です.
- CentOS 8, R 3.4 / macOS 11, R 4.1
起動と終了
シェルからはR
コマンドでRが起動し,Rはq()
コマンドで終了します.
作業ディレクトリ
作業ディレクトリの取得・設定は以下のように行います.
getwd() |
作業ディレクトリに含まれるファイルを一覧するには,
dir() |
とします.
作業の保存・読み込み
オブジェクトの保存は,
save(オブジェクト名, file=ファイル名) |
です.
作業全体を保存するには
save.image(ファイル名) |
とします.
読み込みは
load(ファイル名) |
で行います.
パッケージ
パッケージのダウンロード先として適当なミラーサイトを設定するには,
options(repos="ミラーサイトのURL") |
とします.
例えば,国内のoptions(repos="https://cran.ism.ac.jp/")
が指定できます.
インストールはinstall.packages()
によって行います.
install.packages(パッケージ名, dep=T) |
ここで,dep=T
は依存関係にあるものも一緒にインストールするオプションです.
パッケージのアップデートはupdate.packages()
で行えます.
インストールされたパッケージはlibrary()
で読み込んで使用します.
library(パッケージ名) |
読み込んだパッケージの一覧を出力するには,
search() |
とします.
ヘルプ
?
をコマンドの前につけてヘルプを見ることができます.
例えば,summary
というコマンドの使い方を知りたい場合は
?summary |
とします.
使用するコマンドが採用しているデフォルトの分析手法を確認するようにしましょう.
計算
基礎計算
四則演算は通常のもので,特に整数商と剰余の演算子は次の通りです.
- 整数商
%/%
- 剰余
%%
基本的な関数には以下のものがあります.
- 平方根
sqrt(x)
- 小数点以下切り上げ・切り捨て
ceiling(x)
・floor(x)
- 積分
integrate(dnorm, -Inf, Inf)
(正規分布でマイナス無限大からプラス無限大まで積分する例)
代入は=
よりも<-
が推奨されます.
変数x
をクリアするにはrm(x)
と書きます.
ベクトル
ベクトルはc(1,2)
のように書きます.
規則的に生成することも可能です.
1:3
でc(1,2,3)
seq(x, y, by = z)
でx
からy
までz
おきにseq(x, y, length = n)
でx
からy
までn
分割して
x
がベクトルであるとき,その要素を取り出すことができます.
x[-2] # 第2要素を取り除いて作ったベクトル |
全ての要素が文字列であるようなベクトルを作ることもできるので,Rにおけるベクトルは柔軟な概念だと言えます.
さらに,ベクトルは集合とみなして操作することができます.
- ソート
sort(x)
- 結合
append(x,y)
- 要素の一意化
unique(x)
- 和集合
union(x,y)
- 積集合
intersect(x,y)
- 差集合
setdiff(x,y)
- 集合が等しいか
setequal(x,y)
- ベクトルxの要素がベクトルyに含まれるか
is.element(x,y)
行列
行列は次のように記述します.
matrix(ベクトル, nrow=行数 , ncol=列数) |
ベクトルまたは行列mat
の要素に合致するように,後から行数・列数を定めることもできます.
dim(mat) <- c(行数, 列数) |
行列mat
があるとき,行数・列数を調べるにはnrow()
・ncol()
を使います.
nrow(mat) # 行数 |
2つの列ベクトルx
とy
をつなげて行列を作るには,
cbind(x, y) |
とします.
行ベクトルではrbind(x, y)
です.
一部の行や列を取得するのを簡単にするため,行や列に命名することができます.
rownames(mat) <- c(それぞれの行名) |
行列の代表的な計算は次の通りです.
- 行列の積
mat1 %*% mat2
- 転置
t(mat)
- 行列式
det(mat)
- 逆行列
solve(mat)
- 固有値・固有ベクトル
eigen(mat)
- 各列の平均
colMeans(mat)
配列
3次元配列の例です.
array(1:8, dim=c(1,2,4)) |
出力は以下のようになります.
, , 1 |
データ
読み込み
見出し行のあるテキストを変数dat
に読み込むには
dat <- read.table("ファイルパス", header=T) |
とします.
デフォルトはタブ区切りテキストの読み込みです.
オプションでsep=","
とすると,CSVとして読み込みます.
CSVには
read.csv(ファイル名) |
も使用できます.
書き出し
変数dat
を書き込むには
write.table(dat, "ファイルパス", quote=F) |
とします.
オプションをquote=T
とすると,要素にダブルクオーテーションがつきます.
また,append=T
オプションで追記となります.
見出しを消して追記するには,あわせてcol.names=F
オプションが必要です.
CSVは
write.csv(ファイル名) |
で書き出せます.
型
is
とas
を用いて型を判定・変換します.
次は整数型の例です.
is.integer(x)
でx
が整数型であるかどうかの論理値を返す.as.integer(x)
でx
を整数型に変換する.
同様に,文字列についてis.character()
,論理値についてis.logical()
があります.
論理値の型変換では0
ならFALSE
,0
でない数はTRUE
となります.
また,is
とas
はデータ構造にも使われます.
例えば,is.vector(x)
でxがベクトルであるかどうかを判定できます.
数値ベクトルxを因子型にデータを変換したい場合には,
x <- factor(x) |
とします.
リスト
配列と異なり,リストでは異なる型のデータをまとめることができます.
例えば,
list(c(1,2), "test") |
は,次の内容を保持します.
[[1]] |
names
属性を与えると見易くなります.
例えば,
x <- list("apple", 100) |
とすると,
x$item |
で,apple
が返ります.
リスト作成時に命名するなら,
x <- list("item"="apple", "price"=100) |
と書きます.
データフレーム
データフレームは行列のような2次元配列の形をしたリストのことです.
data.frame
で作成します.
例えば,
job <- c("knight", "knight", "wizard") |
であるとき,dat$HP
としてdat
の要素であるところのベクトルhp
を呼ぶことができます.
データフレームの長所はデータの断面を取得するのが容易になることです.
dat$層名
の記法で層を切ることができるので,例えばJob
ごとに断面をとって集計するには,
by(dat, dat$Job, summary) |
とします.
リスト名を省略,すなわち,dat$HP
とせずともHP
のみで参照できるようにしたいなら,
attach(dat) |
とします.
この解除はdettach(dat)
です.
2つのデータフレームdat1
とdat2
をマージするには,
merge(dat1, dat2, all=T) |
とします.
欠損値にはNA
が入ります.
両方のデータフレームに存在する列を参照して,いずれにも存在するデータでマージするには,オプションをall=F
にします.
all=all.x
なら左結合します.
つまり,dat1
を土台とするので,dat2
から結合した部分にNA
が入るかもしれません.
all=all.y
なら右結合します.
dat2
を土台とするので,dat1
から結合した部分にNA
が入るかもしれません.
一部の列のみを参照して紐づけるなら,by.x
またはby.y
オプションを使います.
このオプションは,各データフレームにおける見出しが異なることを許容します.
例えば,by.x="ID", by.y="アイディー"
とすれば,2つのデータフレームの間でこれらが同じことを意味する列であると認識されます.
str(データフレーム)
の形でその構造を調べることができます.
欠損値
欠損値を除去するにはis.na(x)
による型判定を利用するほか,関数
omit.na(x) |
による除去,もしくは,コマンドのオプションを利用する(例えば,
mean(x, na.rm=T) |
とする)という方法があります.
applyによる集計
apply()
はマップによる操作を行えます.
mat
が行列であるとき,
apply(mat, マージン, 関数) |
として,mat
中の指定した部分それぞれについて関数を適用します.
ここで,マージンが1
なら行,2
なら列,c(1,2)
なら要素を対象とします.
例えば,
apply(mat, 1, sum) |
とすると,各行の和をそれぞれ返します.
aggregateによる集計
いくつかの断面をもとにデータを合計する例です.
by
と異なり,aggregate
はデータフレームを返す点が優れています.
aggregate(x, by=list(断面1, 断面2, ... ), sum) |
プログラミング
if文
ifelse(条件式, 真の場合に返す値, 偽の場合に返す値) |
for文
for(i in 1:10){ |
関数
関数名 <- function(x){ |
グローバル変数に代入を行うには<<-
を使います.
ローカル変数とグローバル変数が同じ名前だと,関数内ではそれぞれ別物に扱われるので,代入時に注意が必要です.
function(x=1){}
のようにして,初期値を設定することができます.
ラムダ式
apply(dat, 2, function(x){ xを使った式 }) |
のような書き方ができます.
シェルからRscriptを呼ぶ
Rのダイアログの中で書くまま動かせるという例です.
rscript -e "x <- c(1,2); 2 * x;" |
基本統計量
x
, y
がベクトルであるとき,基本統計量には以下のようなものがあります.
- 合計
sum(x)
- 平均
mean(x)
- 不偏分散
var(x)
- 標準偏差
sd(x)
(不偏分散より導出される) - 不偏共分散
cov(x, y)
- 中央値
median(x)
- 中央絶対偏差
mad(x)
- 最頻値
names(which.max(table(x)))
- データの個数
length(x)
- 最大値
max(x)
- 最小値
min(x)
- 四分位点
quantile(x)
- 四分位範囲
IQR(x)
- 範囲
range(x)
要約統計量は
summary(x) |
で得られます.
psych
パッケージの
describe(x) |
を使うと,データ数やトリム平均,歪度等も得られます.
分布
r
(random:乱数)・d
(distribution:確率密度),p
(probability:p値,累積分布),q
(quantity:pに対する確率点)を接頭辞として,分布の名称を続けます.
例えば,正規分布はnorm
を続けるので,rnorm()
が正規分布における乱数の発生を意味します.
以下は,いくつかの例です.
正規分布
平均mean
,標準偏差sd
とします.
rnorm(n, mean, sd) |
上側確率についてはpnorm(q, lower.tail=FALSE)
で求められます.
ベクトルx
を標準化するには,
scale(x) |
とします.
ベクトルx
を使って,偏差値を作るなら
10 * scale(x) + 50 |
です.
t分布
正規分布と似ており,自由度df
であるとき,
rt(n, df) |
です.
一様分布
最小値min
,最大値max
であるときのn
個の乱数を発生させるには,
runif(n, min, max) |
とします.
二項分布
その回数でオモテが出る確率は次の通りです.
dbinom(オモテが出た回数, コインを投げた回数, オモテが出る確率) |
集計表
集計表は
table(v) |
と書き,クロス集計表であれば
table(v1,v2) |
となります.
グループごとの度数分布
Xという断面でグループ化したデータxの度数分布表
x <- factor(dat$X) |
ここで,factor
関数で要因型ベクトルへの変換を行なっています.
指定された項目についてグループごとの平均をとるには,apply
関数のバリエーションであるtapply
関数を用いて
tapply(項目名, x, mean) |
とします.
標本抽出
ベクトルの要素からの非復元抽出は次の通りです.
sample(ベクトル, 抽出回数) |
復元抽出を行うには,replace=T
のオプションを入れます.
モデルの記述
目的変数y
,説明変数x
であるとき,Rでは(多くの場合)
y ~ x |
のように書きます.
この記法による式をformula式といいます.
説明変数の追加は+
で結合します.
y ~ x1 + x2 |
x1とx2の交差効果は:
で表現します.
y ~ x1 + x2 + x1:x2 |
交差効果を検討する場合は,それぞれの説明変数もモデルに含めるべきです.
このため,上式と同じことを*
で短く書けるようになっています.
y ~ x1 * x2 |
参考文献
Rによる統計学の入門書です.
- 山田剛史ら (2008)「Rによるやさしい統計学」オーム社.
Rの概説書です.
- 舟尾暢男 (2016)「The R Tips ― データ解析環境Rの基本技・グラフィックス活用集」3版,オーム社.