More Related Content
Similar to 初心者講習会資料(Osaka.R#5)
Similar to 初心者講習会資料(Osaka.R#5) (20)
More from Masahiro Hayashi
More from Masahiro Hayashi (6)
初心者講習会資料(Osaka.R#5)
- 1. Osaka.R#5 初心者講習会資料
2011/04/23
林真広
スクリプトの実行
スクリプト(コマンド,プログラム,命令ともいう)をコンソール,またはエディタに書き込む
エディタは,メニューバーから「ファイル>新しいスクリプト」とたどって起動する
エディタ
コンソール
エディタに書いたスクリプトは,保存しておけば,一度 R を閉じても,「ファイル>スクリプトを開
く」で読み込める
コンソールにスクリプトを書き込んだ場合は,エンターキーを押せば実行される
エディタに書き込んだ場合は,Ctrl+R でカーソルのある行が実行される
範囲を選択して Ctrl+R を押せば,選択した範囲すべてが実行される
「編集>カーソル行または選択中の R コードを実行」またはツールバーのボタンでも同じ
大文字小文字,全角半角の区別あり(全角は基本的に使わないほうがいい!)
特に記号の全角半角に注意が必要
"”$$!!++--==(()) 見分けがつきますか…?
変換ではなく IM を On/Off したほうが確実
1
- 2. コンソールの状態
左は何でも入力できる状態。左端に「>」が表示されている
右は続きの入力を待っている状態。左端に「+」が表示されている
この状態の場合,「正しく」続きを入力しなければエラーになる
Esc キーを押すか「その他>現在の計算を中断」で待機状態をキャンセルできる
最初のスクリプト
# print という関数(機能)に"Hello, world!"という文字列を渡す
print("Hello, world!")
# コンソールに"Hello, world!"と表示される
# [1, 2, 5, 4]というベクトルを x という変数に保存
x <- c(1, 2, 5, 4)
# mean という関数に x を入力,出力を y という変数に保存
y <- mean(x) # 平均値が計算される
# y の中身を表示
y
「#」を書くと,それ以降はコメントとして扱われる(処理の上で無視される)
半角のスペースは見やすさのために記号や関数名の前後などに挿入できる
「1 + 1」「print( "Hello, world!" )」「mean (x)」など
「x< -y」「me an(x)」などはだめ
記号の前後(「x <- y」や「1 + 1」),コンマの後ろ(「c(1, 2, 3)」)に入れると読みやす
くなる
改行も適宜挿入できるが,挿入できる場所はコンマや記号の後ろにかぎられる
スペースの使い方などは自分ルールでもいいが,Google's R Style Guide や R
Coding Conventions などの既存のルールに従うと,読みやすいスクリプトが書ける
R の操作には関数を使う
基本的な操作は,「関数(値)」と命令するだけ。数学の f(x)と同じ
さらに f(x)と同様に,入力に対して関数は必ず値を返す(値は数値とは限らない)
関数に入力する値を引数(ひきすう),関数が返す値を返り値または戻り値と呼ぶ
mean の例の場合,x という変数が引数,3 という数値が返り値
複数の引数を関数に入力する場合,区切り文字として「,」を使う
例えば「mean(x, na.rm=TRUE)」,na.rm は欠損値(NA)を省くか否か
2
- 3. 理論編――――――――――――――――――――
関数の使い方
関数は,関数(引数 1, 引数 2, 引数 3, ...)というふうに使う
引数は名前を持っていて,関数(名前=引数)という書き方をする
名前は省略可能だが,省略できない場合もあるので省略しないほうが無難
引数に初期値が設定されている場合,引数を省略できる
ただし,例えば 3 つ引数がある関数で第 2 引数を省略する場合,第 3 引数は名前を省
略できない
でないと,第 2 引数が省略されたのか第 3 引数が省略されたのか R には判断できない
初期値
引数の名前
変数
変数は入れ物のようなもの
変数に入れる実体をオブジェクトと呼ぶ
新たな変数を作るときは,「新たな変数 <- オブジェクト(または変数)」というふうに書く
すべての関数は値(オブジェクト)を返すので,これも変数に入れられる
「新たな変数 <- 関数(引数 1, 引数 2, 引数 3, ...)」とすればいい
オブジェクト
オブジェクトにはクラス(種類)がある
もっとも基本的なクラスは数値(numeric),文字列(character),論理(logical)クラス
他 に 重 要 な ク ラ ス は 因 子 ( factor ) , 行 列 ( matrix ) , リ ス ト ( list ) , デ ー タ フ レ ー ム
(data.frame)クラス
ここでいう因子は因子分析の因子とは関係がなく,カテゴリ変数のこと
行列は二次元の行列
データフレームは,ケース(行)×変数(列)という形の,分析に用いるデータセット
R を使う用途によってクラスの重要度は異なるので最初からすべて理解する必要はない
オブジェクトのクラスによって扱いが異なるので,どのクラスのオブジェクトを操作しているのか
を常に意識しよう
3
- 4. 数値(numeric)クラス
1 + 2
x <- 10 – 5
y <- x + 9
is.numeric(y) # 引数が数値クラスならば TRUE,そうでなければ FALSE を返す
4 * 5 / 10 # 「*」はかけ算,「/」は割り算
(3 + 6) * 2^3 # 「^」は累乗(この場合 2 の 3 乗)。演算の順番は数学と同じで,括弧も使える
c(1, 3) + 2 # [1, 3]というベクトルを作り,1 を足す
z <- 1:5 # [1, 2, 3, 4, 5]というベクトルを作る
z[2] + z[3] # z の 2 番目の要素と 3 番目の要素を足しあわせる
R ではほとんどのクラスのオブジェクトがベクトル
一つの数字でも,長さ 1 のベクトル
数学のベクトルのように難しく考えるのではなく,複数のオブジェクトをひとまとめにして便利に
扱える機能と考えよう
変数[数字]と書けば,その変数の中の,与えた数字の位置にある要素を取り出せる
この数字を,添字またはインデックスと呼ぶ
行列(matrix)クラス
2 次元の行列を扱うためのクラス
行列演算する人は必須
しない人は要素へのアクセスの仕方だけ覚えておけばだいたい大丈夫
関数の返り値が行列のことがよくある
mat <- matrix(1:15, nrow=3, ncol=5, byrow=TRUE)
# nrow で行数,ncol で列数を指定(普通はどちらか一方でいい)
# byrow=TRUE にすると,ベクトルを行方向に並べて行列を作る(デフォルトは byrow=FALSE)
mat
mat <- matrix(1:15, nrow=3, ncol=5, byrow=FALSE)
mat
dim(mat) # 行数,列数を取得
dimnames(mat) <- list(c("r1", "r2", "r3"),
c("c1", "c2", "c3", "c4", "c5")) # 行名,列名を設定
mat[2, 3] # mat[行, 列]の要素を取り出す
mat[2,] # 2 行目全体を取り出す
mat[, 3] # 3 列目全体を取り出す
mat[2, 1:3] # 2 行目の 1~3 列目の要素を取り出す
4
- 5. 文字列(character)クラス
"文字列" # ダブルコーテーションで文字を囲むと,文字列オブジェクトとして扱われる
v1 <- c("名前", "性別", "年齢")
is.character(v1) # 引数が文字列クラスならば TRUE,そうでなければ FALSE を返す
is.numeric(v1)
v2 <- c("1", "2", "3") # 数値もダブルコーテーションで囲めば文字列オブジェクト
is.numeric(v2)
ダブルコーテーションを全角にしないよう注意!
日本語の文字列オブジェクトを作ろうとするときに失敗しやすい
シングルコーテーションでもいい(「'文字列'」)
文字列にダブルコーテーションを含めたい場合はシングルコーテーションを使う
「'文字列の中に"を入れる'」
文字列オブジェクトもベクトル
論理(logical)クラス
条件判断や関数のオプションの ON,OFF に使われる
TRUE,FALSE の 2 種類だけ
TRUE は「真」,FALSE は「偽」
TRUE
“TRUE” # 表示の違いに注目
TRUE <- “真” # TRUE,FALSE は変数名にはできない
x <- 4
x == 5
x < 5
y <- x >= 4 # 変数にも入れられる
y # 論理ベクトル
is.logical(y)
x <- 1:4
x[c(TRUE, TRUE, FALSE, FALSE)] # 添字の代わりに論理ベクトルで要素を選択
x <= 2
x[x <= 2] # 応用的な要素の選択方法。条件によって要素を選択
print(“R”, quote=TRUE) # 関数の引数として論理オブジェクトを使う
print(“R”, quote=F) # 引数の場合,TRUE は T,FALSE は F と省略できる
省略記法は間違いの元なので最初のうちはあまり使わない方がいい
5
- 6. データフレーム(data.frame)クラス
表形式のデータを扱うためのクラス
一列が一つの変数
sex <- c("男性", "男性", "男性", "女性", "女性", "女性")
age <- c(20, 35, 50, 42, 31, 22)
df <- data.frame(sex, age)
df
df$sex # データフレーム内の変数にアクセス
df[["age"]] # 変数にアクセスするもう一つの方法
colnames(df) # 変数名の取得
colnames(df)[1] <- "性別" # 変数名の変更
df$job <- c(1, 0, 1, 0, 1, 0) # 新しい変数の作成
attach(df) # データフレーム内の変数を大局的環境に展開
mean(age) # データフレーム内の変数を直接扱える,が…
age <- c(10, 10, 10, 10, 10, 10)
detach(df) # attach の解除
df$age # attach 中の変数の編集は反映されない
同じ長さのベクトルを引数に取る
引数は主に数値オブジェクトか文字列オブジェクト
ただし,文字列オブジェクトはデフォルトでは因子(factor)オブジェクトに変換される
attach は便利だが,エラーのもとになりやすいので推奨しない
因子(factor)クラス
文字列オブジェクトに,カテゴリの概念を加えたものと考えればいい
各種カテゴリカルデータ分析に必要
sex # 文字列オブジェクト
df$sex # 因子オブジェクト。表示の違いに注目
summary(df$sex) # カテゴリの概念があるので,カテゴリごとに集計できる
リスト(list)クラス
各種クラスのオブジェクトをひとまとめにするためのオブジェクト
データフレームは実はリストの拡張なので,操作方法は似ている
l1 <- list(num=1:5,
char=c("a", "b", "c", "d"),
mat=matrix(1:9, ncol=3)) # 「名前=オブジェクト(または変数)」で要素を設定
6
- 7. # リストにはなんでも入る!
# なんらかの統計解析をおこなう関数は,たいてい返り値がリスト
l1
l1[["num"]]
li$num # 要素へのアクセスの仕方はデータフレームと同じ
実際の分析
data(iris) # R に組み込まれているデータの読み込み
is.data.frame(iris) # データフレームオブジェクト
summary(iris) # データフレームの概要
cor(iris$Sepal.Length, iris$Sepal.Width) # 相関係数の計算
median(iris$Sepal.Length) # 中央値
iris$cat1 <- "high" # 新しい変数
iris$cat1[iris$Sepal.Length < 5.8] <- "low"
# Sepal.Length が 5.8 以下ならば"low"というカテゴリに
table(iris$Species, iris$cat1) # クロス表作成
7
- 8. 実践編――――――――――――――――――――
作業ディレクトリの設定
作業ディレクトリ(ディレクトリはフォルダとだいたい同じ意味)とは,データの入出力の際に基
準となるディレクトリ
作業の前にまず設定しておく
# 現在の作業ディレクトリを返す(Get Working Directory)
getwd()
# 作業ディレクトリの設定(Set Working Directory)
setwd("c:/Users/UserName/Documents")
# R でのディレクトリの区切り文字は"/"もしくは Windows の場合は"¥¥"も可
# ダイアログで対話的にディレクトリを選択し,ディレクトリのパスを返す
choose.dir()
# choose.dir()のファイル版
choose.files()
# 対話的にディレクトリを選択し,作業ディレクトリに設定する
setwd(choose.dir())
パッケージのインストール,読み込み
パッケージの追加により機能を増やせる
メニューバーから”パッケージ>パッケージのインストール”
どこからダウンロードするかを選ぶ。ダウンロードできるものはどこでも同じなので,Japan
の中から好きなものを選ぶ
関数を使ってインストールすることもできる
install.packages("Hmisc")
# 一覧から探す必要がないのでおすすめ
install.packages(c("memisc", "car"))
# 複数まとめてインストールすることもできる
library(Hmisc) # パッケージの読み込み
テキストデータの読み込み
read.csv("sample.csv", header=TRUE)
# 作業ディレクトリから sample.csv を読み込み
# header は一行目を列の名前として読み込むかどうか
read.delim("sample.txt", header=TRUE) # tab 区切りの場合
8
- 9. read.table("sample.txt")
# より柔軟にテキストファイルを読み込む。詳細は help(read.table)
# data.frame という形式で読み込まれる
他のソフトウェアのデータの読み込み
R は様々な形式のデータを読み込むことができる
library(foreign) # 他形式のデータの入出力用パッケージ
d1 <- read.spss("bank.sav", to.data.frame=TRUE, reencode="shift-jis")
# reencode は文字コードの指定。Windows の場合はたいていなくても大丈夫
# 他にも read.xport,read.dta などがある
データの書き込み
write.csv(d1, "sample.csv")
write.table(d1, "sample.txt")
データの操作
summary(d1) # 全データの要約統計量
describe(d1) # Hmisc パッケージの関数(summary より詳しい)
head(d1) # データの先頭数行を表示。末尾は tail(...)
colnames(d1) # データに含まれる変数の名前を取得
d1$SEX # 変数へのアクセス
d1$SEX[5] # 変数の 5 番目のケース
d1[5,3] # [行番号, 列番号]という形式でもアクセスできる
データの閲覧(単純集計表)
# カテゴリ変数の場合
table(d1$JOBCAT)
summary(d1$JOBCAT)
describe(d1$JOBCAT)
# 連続変数の場合
table(d1$AGE) # 実用的ではない
stem(d1$AGE) # 幹葉図
hist(d1$AGE, breaks="FD") # ヒストグラム
# breaks は区切り方の指定。デフォルトの方法は古典的すぎるので変更
9
- 10. データの閲覧(記述統計)
summary(d1$SALNOW)
describe(d1$SALNOW)
mean(d1$SALNOW, na.rm=TRUE)
# na.rm は欠損値を省くかどうか
# このデータには欠損値がないのでどちらでも結果は変わらない
sd(d1$SALNOW, na.rm=TRUE) # 不偏標準偏差
# 他にも var(),max(),min(),range()などがある
# na.rm はこれら記述統計の関数では大概使えるが,常に使えるわけではない
データの閲覧(クロス集計表)
table(d1$MINORITY, d1$JOBCAT) # 行,列の順番
library(memisc) # memisc は社会科学で便利な機能がまとめられている
aggregate(JOBCAT ~ MINORITY, data=d1) # 返り値は data.frame
# 「従属変数 ~ 独立変数」という書き方は頻繁に出てくるので要チェック
aggregate(percent(JOBCAT) ~ MINORITY, data=d1) # パーセントで表示
genTable (percent(JOBCAT) ~ MINORITY, data=d1) # 返り値は table
変数のリコード
リコードの方法はたくさんあるが,memisc の recode()が最も汎用的
Hmisc,car パッケージにも recode()がある。先に読み込んだものが上書きされるので,
memisc を一番最後に読み込むように!
d1$AGE3 <- recode(d1$AGE,
"低" <- range(min , 40),
"中" <- range(40.01, 60),
"高" <- range(60.01, max))
d1$JOB3 <- recode(d1$JOBCAT,
"事務" <- c("事務職", "事務研修員"),
"マニュアル" <- "警備員",
"専門・管理" <- c("専門職研修員", "管理職", "MBA 研修員", "技術職"))
R ではカテゴリ変数と連続変数が明確に区別されることに注意!
10
- 11. ドキュメント編――――――――――――――――――
help 等のドキュメントの使い方
関数を初めて使うとき,使い方がよくわからないとき,エラーが出るとき,必ず help を読む!
特に初めて使う関数の help は,流し読みでもいいから絶対に目を通す!
help(describe)
?describe # help(describe)と同じ。利便性のための省略形。
help の読み方
すべて理解する必要はない
Usage には関数の使い方が書いてある
引数のクラスによって使い方がちがう関数の場合,クラス別の使い方が書いてある(ことも
ある)
最も重要なのは Arguments
引数の説明が書いてある
最も多いエラーは Type Error(数値が必要なところに因子を渡す等,クラスの間違い)
エラーなら実害はないが,期待とはちがう処理が行われていることも…
どの引数にどのクラスのオブジェクトを渡さなければならないかを確認する!
Value には返り値の詳細が書いてあるのでこれも重要
References には参考になる論文や web ページが書いてある
See Also には似た機能を持つ関数や関連する関数が書いてある
Example は二番目に重要
文章を読んで分からなくても,実際に動かしてみたら分かることがよくある
example 関数は,help 内の example をまとめて実行してくれる
example(lm)
新しいパッケージを使うとき(demo,vignette,パッケージの help)
使ってみたいパッケージの情報がウェブや書籍で見つからない場合がある
そうでなくとも新しいパッケージは使い方がよくわからないもの
デモ,ビネット(vignette),パッケージの help を見れば多くの情報を得ることができる
ただし,デモとビニエットは必ずあるわけではない
demo(package="graphics") # graphics パッケージが持っているデモの一覧
demo("graphics")
vignette(package="memisc") # memisc パッケージが持っているビニエットの一覧
vignette("anes48")
help(package="Hmisc") # Hmisc パッケージのヘルプ
11