Osaka.R#6 初心者講習会資料
                            2011/07/02
                             林真広


インストール
 インストーラのダウンロード
http://www.r-project.org/




                                         どちらかを選ぶ
                                         (どちらでも同じ)




                                1
※ Windows の場合




※ インストーラの実行時の注意点(windows)
 「インストール中に利用する言語」として Japanese が選択されているが,文字化けが発生する
  ので,English を選択しておく
 あくまで「インストール中に利用する言語」なので,インストール後は日本語化された R を使える




                            2
スクリプトの実行
     スクリプト(コマンド,プログラム,命令ともいう)をコンソール,またはエディタに書き込む
     エディタは,メニューバーから「ファイル>新しいスクリプト」とたどって起動する




                                         エディタ
     コンソール



     エディタに書いたスクリプトは,保存しておけば,一度 R を閉じても,「ファイル>スクリプト
      を開く」で読み込める
     コンソールにスクリプトを書き込んだ場合は,エンターキーを押せば実行される
     エディタに書き込んだ場合は,Ctrl+R でカーソルのある行のスクリプトが実行される
         範囲を選択して Ctrl+R を押せば,選択した範囲すべてが実行される
         「編集>カーソル行または選択中の R コードを実行」またはツールバーのボタンでも
          同じ




               TIPS & CAUTIONS!
☆ 大文字小文字,全角半角の区別あり(全角は基本的に使わないほうがいい!)
     特に記号の全角半角に注意が必要
     "”$$!!++--==(()) 見分けがつきますか…?
     変換ではなく IM を On/Off したほうが確実(日本語を使う機会は少ない)




                           3
コンソールの状態




    左は何でも入力できる状態。左端に「>」が表示されている
    右は続きの入力を待っている待機状態。左端に「+」が表示されている




                 TIPS & CAUTIONS!
    ☆ 待機状態の場合,「正しく」続きを入力しなければエラーになる
        「STOP」ボタン,「その他>現在の計算を中断」,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
        R の操作には関数を使う
            基本的な操作は,「関数(値)」と命令するだけ。数学の f(x)と同じ
            さらに f(x)と同様に,入力に対して関数は必ず値を返す(値は数値とは限らない)


                                4
       関数に入力する値を引数(ひきすう)またはオプション,関数が返す値を返り値または戻り
            値と呼ぶ
                mean の例の場合,x という変数が引数,3 という数値が返り値
           複数の引数を関数に入力する場合,区切り文字として「,」を使う
                例えば「mean(x, na.rm=TRUE)」,na.rm は欠損値(NA)を省くか否か




                       TIPS & CAUTIONS!
☆ 「#」を書くと,それ以降はコメントとして扱われる(処理の上で無視される)
☆ 半角のスペースは見やすさのために記号や関数名の前後などに挿入できる
           「1 + 1」「print( "Hello, world!" )」「mean (x)」など
           「x<     -y」「me   an(x)」などはだめ
☆ 改行も適宜挿入できるが,挿入できる場所はコンマや記号の後ろにかぎられる


☆ スペースの使い方などは自分ルールでもいいが,Google's R Style Guide や R
    Coding Conventions などの既存のルールに従うと,読みやすいスクリプトが書け
    る(以下は例)
               一行は 80 文字程度(横スクロールバーが出ない程度の長さ)
               一行が長くなる場合は,コンマの後ろで適宜改行
               2 項演算子(=,+,-,<-など)の前後に半角スペース(「x <- y」や「1 + 1」)
               コンマの後ろに半角スペース(「c(1, 2, 3)」)




関数の使い方
   関数は,関数(引数 1, 引数 2, 引数 3, ...)というふうに使う
   引数は名前を持っていて,関数(名前=引数)という書き方をする

                                       初期値




                    引数の名前




                                       5
TIPS & CAUTIONS!
☆ 引数に初期値が設定されている場合,引数を省略できる
☆ 引数の名前は省略可能だが,省略できない場合もあるので省略しないほうが無難
         例えば 3 つ引数がある関数で第 2 引数を省略する場合,第 3 引数は名前を省
          略できない
         省略すると第 3 引数ではなく第 2 引数とみなされる




変数
   変数は入れ物のようなもの
   変数に入れる実体をオブジェクトと呼ぶ
   新たな変数を作るときは,「新たな変数 <- オブジェクト(または変数)」というふうに書く
   すべての関数は値(オブジェクト)を返すので,これも変数に入れられる
        「新たな変数 <- 関数(引数 1, 引数 2, 引数 3, ...)」とすればいい


オブジェクト
   オブジェクトにはクラス(種類)がある
   もっとも基本的なクラスは数値(numeric),文字列(character),論理(logical)クラス
   他 に 重 要 な ク ラ ス は 因 子 ( factor ) , 行 列 ( matrix ) , リ ス ト ( list ) , デ ー タ フ レ ー ム
    (data.frame)クラス
        ここでいう因子は因子分析の因子とは関係がなく,カテゴリ変数のこと
        行列は二次元の行列
        データフレームは,ケース(行)×変数(列)という形の,分析に用いるデータセット
        R を使う用途によってクラスの重要度は異なるので最初からすべて理解する必要はない
   オブジェクトのクラスによって扱いが異なるので,どのクラスのオブジェクトを操作しているのか
    を常に意識しよう




                                          6
理論編――――――――――――――――――――
数値(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 列目の要素を取り出す


                                    7
文字列(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 と省略できる
   省略記法は間違いの元なので最初のうちはあまり使わない方がいい




                                   8
データフレーム(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)   # カテゴリの概念があるので,カテゴリごとに集計できる




                                   9
リスト(list)クラス
    各種クラスのオブジェクトをひとまとめにするためのオブジェクト
    データフレームは実はリストの拡張なので,操作方法は似ている
l1 <- list(num=1:5,
         char=c("a", "b", "c", "d"),
         mat=matrix(1:9, ncol=3))   # 「名前=オブジェクト(または変数)」で要素を設定
# リストにはなんでも入る!
# なんらかの統計解析をおこなう関数は,たいてい返り値がリスト
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)      # クロス表作成




                                       10
実践編――――――――――――――――――――
作業ディレクトリの設定
   作業ディレクトリ(ディレクトリはフォルダとだいたい同じ意味)とは,データの入出力の際に基
    準となるディレクトリ
   作業の前にまず設定しておく
# 現在の作業ディレクトリを返す(Get Working Directory)
getwd()
# 作業ディレクトリの設定(Set Working Directory)
setwd("c:/Users/UserName/Documents")
# R でのディレクトリの区切り文字は"/"もしくは Windows の場合は"¥¥"も可
# ダイアログで対話的にディレクトリを選択し,ディレクトリのパスを返す(Windows 限定?)
choose.dir()
# choose.dir()のファイル版(Mac にもある)
file.choose()
# 対話的にディレクトリを選択し,作業ディレクトリに設定する
setwd(choose.dir())




                TIPS & CAUTIONS!
 ☆ 作業ディレクトリは GUI からも設定できる
         ただし,スクリプトに setwd(…)を書いて保存しておけば,繰り返し作業する場
          合に設定が楽




                                   11
パッケージのインストール,読み込み
   パッケージの追加により機能を増やせる(最初から入っているパッケージもある)
       メニューバーから”パッケージ>パッケージのインストール”
       どのミラーからダウンロードするかを選ぶ。ダウンロードできるものはどこでも同じなので,
        Japan の中から好きなものを選ぶ
   関数を使ってインストールすることもできる
install.packages("Hmisc")
# 一覧から探す必要がないのでおすすめ
install.packages(c("memisc", "car"))
# 複数まとめてインストールすることもできる


library(memisc)     # パッケージの読み込み


分析例
 サンプルデータは http://www.spss.co.jp/support/sample.html からダウンロード
 作業ディレクトリに保存しておく




library(foreign)
d1 <- read.spss("bank.sav", to.data.frame=TRUE, reencode="shift-jis")


t.test(SALNOW ~ SEX, data=d1)   # t 検定(ウェルチ)
t.test(d1$SALNOW, d1$SALBEG, paired=TRUE)    # 対応のある t 検定
aov1 <- aov(SALNOW ~ SEXRACE, data=d1)      # 分散分析
summary(aov1)      # 結果の概要


lm1 <- lm(SALNOW ~ AGE + SEX*MINORITY + JOBCAT, data=d1)   # 重回帰分析
summary(lm1)      # 結果の概要




                                   12
テキストデータの読み込み
read.csv(file.choose(), header=TRUE)
# 対話的にデータを読み込み
read.csv("sample.csv", header=TRUE)
# 作業ディレクトリから sample.csv を読み込み
# header オプションは一行目を列の名前(変数名)として読み込むかどうか
read.delim("sample.txt", header=TRUE) # tab 区切りの場合
# data.frame 形式で読み込まれる




                   TIPS & CAUTIONS!
 ☆ データがうまく読み込めない場合
       文字化け…文字コードが合っていない。fileEncoding オプションに文字コー
        ドを指定する。日本語の場合,文字コードは shift-jis か UTF-8
           read.csv("sample.csv", fileEncoding="UTF-8")
       欠 損 値 の 処 理 … 欠損 値が 含 まれ る 場 合 は,欠 損値 に あ ててい る 文 字 を
        na.strings オプションに設定する
           read.csv("sample.csv", na.strings="NA")
       変数がおかしい…変数が数値の場合,変数の中に全角数字がないか,文字が
        含まれていないかを確認する



他のソフトウェアのデータの読み込み
   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", row.names=FALSE)
# 作業ディレクトリに d1 を csv で保存
write.table(d1, "sample.dat", row.names=FALSE, sep="¥t")
# 作業ディレクトリに d1 を tab 区切りテキストで保存



                                      13
データの操作
summary(d1)     # 全データの要約統計量
head(d1)        # データの先頭数行を表示。末尾は tail(...)
colnames(d1)    # データに含まれる変数の名前を取得


d1$SEX          # 変数へのアクセス
d1$SEX[5]       # 変数の 5 番目のケース


データの閲覧(単純集計表)
# カテゴリ変数の場合
table(d1$JOBCAT)
summary(d1$JOBCAT)


# 連続変数の場合
table(d1$AGE)      # 実用的ではない
stem(d1$AGE)       # 幹葉図
boxplot(d1$AGE) # 箱ひげ図
hist(d1$AGE, breaks="FD")       # ヒストグラム
# breaks は区切り方の指定。デフォルトの方法は古典的すぎるので変更


データの閲覧(記述統計)
summary(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)     # パーセントで表示



                                    14
変数のリコード
   リコードの方法はたくさんあるが,memisc パッケージの recode 関数が最も汎用的
   Hmisc,car パッケージにも recode 関数がある。先に読み込んだものが上書きされるので,
    memisc を最後に読み込むように!
d1$AGE3 <- recode(d1$AGE,
                 "低" <- range(min , 40),
                 "中" <- range(40.01, 60),
                 "高" <- range(60.01, max))
# 「d1$新しい変数名 <- 新しい変数」でデータフレームに変数を追加
d1$JOB3 <- recode(d1$JOBCAT,
            "事務"        <- c("事務職", "事務研修員"),
            "マニュアル" <- "警備員",
            "専門・管理" <- c("専門職研修員", "管理職", "MBA 研修員", "技術職"))
   R ではカテゴリ変数と連続変数が明確に区別されることに注意!




                TIPS & CAUTIONS!
 ☆ recode 関数のバグ
       memisc の現在のバージョンでは,recode 関数にバグがある
       欠損値の含まれている量的変数(数値ベクトル)をリコードしようとすると,エラー
        が出る
       その場合は一時的に欠損値を別の値に置き換えてリコードするとよい
           d1$AGE[is.na(d1$AGE)] <- 999 # 欠損値を 999 に置き換え
       詳細は http://d.hatena.ne.jp/phosphor_m/20110629/1309339215




                                  15
ドキュメント編――――――――――――――――――
help 等のドキュメントの使い方
   関数を初めて使うとき,使い方がよくわからないとき,エラーが出るとき,必ず help を読む!
   特に初めて使う関数の help は,流し読みでもいいから絶対に目を通す!
help(var)
?var    # help(var)と同じ。利便性のための省略形。


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 パッケージのヘルプ

                                   16

初心者講習会資料(Osaka.r#6)

  • 1.
    Osaka.R#6 初心者講習会資料 2011/07/02 林真広 インストール  インストーラのダウンロード http://www.r-project.org/ どちらかを選ぶ (どちらでも同じ) 1
  • 2.
    ※ Windows の場合 ※インストーラの実行時の注意点(windows)  「インストール中に利用する言語」として Japanese が選択されているが,文字化けが発生する ので,English を選択しておく  あくまで「インストール中に利用する言語」なので,インストール後は日本語化された R を使える 2
  • 3.
    スクリプトの実行  スクリプト(コマンド,プログラム,命令ともいう)をコンソール,またはエディタに書き込む  エディタは,メニューバーから「ファイル>新しいスクリプト」とたどって起動する エディタ コンソール  エディタに書いたスクリプトは,保存しておけば,一度 R を閉じても,「ファイル>スクリプト を開く」で読み込める  コンソールにスクリプトを書き込んだ場合は,エンターキーを押せば実行される  エディタに書き込んだ場合は,Ctrl+R でカーソルのある行のスクリプトが実行される  範囲を選択して Ctrl+R を押せば,選択した範囲すべてが実行される  「編集>カーソル行または選択中の R コードを実行」またはツールバーのボタンでも 同じ TIPS & CAUTIONS! ☆ 大文字小文字,全角半角の区別あり(全角は基本的に使わないほうがいい!)  特に記号の全角半角に注意が必要  "”$$!!++--==(()) 見分けがつきますか…?  変換ではなく IM を On/Off したほうが確実(日本語を使う機会は少ない) 3
  • 4.
    コンソールの状態  左は何でも入力できる状態。左端に「>」が表示されている  右は続きの入力を待っている待機状態。左端に「+」が表示されている TIPS & CAUTIONS! ☆ 待機状態の場合,「正しく」続きを入力しなければエラーになる  「STOP」ボタン,「その他>現在の計算を中断」,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  R の操作には関数を使う  基本的な操作は,「関数(値)」と命令するだけ。数学の f(x)と同じ  さらに f(x)と同様に,入力に対して関数は必ず値を返す(値は数値とは限らない) 4
  • 5.
    関数に入力する値を引数(ひきすう)またはオプション,関数が返す値を返り値または戻り 値と呼ぶ  mean の例の場合,x という変数が引数,3 という数値が返り値  複数の引数を関数に入力する場合,区切り文字として「,」を使う  例えば「mean(x, na.rm=TRUE)」,na.rm は欠損値(NA)を省くか否か TIPS & CAUTIONS! ☆ 「#」を書くと,それ以降はコメントとして扱われる(処理の上で無視される) ☆ 半角のスペースは見やすさのために記号や関数名の前後などに挿入できる  「1 + 1」「print( "Hello, world!" )」「mean (x)」など  「x< -y」「me an(x)」などはだめ ☆ 改行も適宜挿入できるが,挿入できる場所はコンマや記号の後ろにかぎられる ☆ スペースの使い方などは自分ルールでもいいが,Google's R Style Guide や R Coding Conventions などの既存のルールに従うと,読みやすいスクリプトが書け る(以下は例)  一行は 80 文字程度(横スクロールバーが出ない程度の長さ)  一行が長くなる場合は,コンマの後ろで適宜改行  2 項演算子(=,+,-,<-など)の前後に半角スペース(「x <- y」や「1 + 1」)  コンマの後ろに半角スペース(「c(1, 2, 3)」) 関数の使い方  関数は,関数(引数 1, 引数 2, 引数 3, ...)というふうに使う  引数は名前を持っていて,関数(名前=引数)という書き方をする 初期値 引数の名前 5
  • 6.
    TIPS & CAUTIONS! ☆引数に初期値が設定されている場合,引数を省略できる ☆ 引数の名前は省略可能だが,省略できない場合もあるので省略しないほうが無難  例えば 3 つ引数がある関数で第 2 引数を省略する場合,第 3 引数は名前を省 略できない  省略すると第 3 引数ではなく第 2 引数とみなされる 変数  変数は入れ物のようなもの  変数に入れる実体をオブジェクトと呼ぶ  新たな変数を作るときは,「新たな変数 <- オブジェクト(または変数)」というふうに書く  すべての関数は値(オブジェクト)を返すので,これも変数に入れられる  「新たな変数 <- 関数(引数 1, 引数 2, 引数 3, ...)」とすればいい オブジェクト  オブジェクトにはクラス(種類)がある  もっとも基本的なクラスは数値(numeric),文字列(character),論理(logical)クラス  他 に 重 要 な ク ラ ス は 因 子 ( factor ) , 行 列 ( matrix ) , リ ス ト ( list ) , デ ー タ フ レ ー ム (data.frame)クラス  ここでいう因子は因子分析の因子とは関係がなく,カテゴリ変数のこと  行列は二次元の行列  データフレームは,ケース(行)×変数(列)という形の,分析に用いるデータセット  R を使う用途によってクラスの重要度は異なるので最初からすべて理解する必要はない  オブジェクトのクラスによって扱いが異なるので,どのクラスのオブジェクトを操作しているのか を常に意識しよう 6
  • 7.
    理論編―――――――――――――――――――― 数値(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 列目の要素を取り出す 7
  • 8.
    文字列(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 と省略できる  省略記法は間違いの元なので最初のうちはあまり使わない方がいい 8
  • 9.
    データフレーム(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) # カテゴリの概念があるので,カテゴリごとに集計できる 9
  • 10.
    リスト(list)クラス  各種クラスのオブジェクトをひとまとめにするためのオブジェクト  データフレームは実はリストの拡張なので,操作方法は似ている l1 <- list(num=1:5, char=c("a", "b", "c", "d"), mat=matrix(1:9, ncol=3)) # 「名前=オブジェクト(または変数)」で要素を設定 # リストにはなんでも入る! # なんらかの統計解析をおこなう関数は,たいてい返り値がリスト 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) # クロス表作成 10
  • 11.
    実践編―――――――――――――――――――― 作業ディレクトリの設定  作業ディレクトリ(ディレクトリはフォルダとだいたい同じ意味)とは,データの入出力の際に基 準となるディレクトリ  作業の前にまず設定しておく # 現在の作業ディレクトリを返す(Get Working Directory) getwd() # 作業ディレクトリの設定(Set Working Directory) setwd("c:/Users/UserName/Documents") # R でのディレクトリの区切り文字は"/"もしくは Windows の場合は"¥¥"も可 # ダイアログで対話的にディレクトリを選択し,ディレクトリのパスを返す(Windows 限定?) choose.dir() # choose.dir()のファイル版(Mac にもある) file.choose() # 対話的にディレクトリを選択し,作業ディレクトリに設定する setwd(choose.dir()) TIPS & CAUTIONS! ☆ 作業ディレクトリは GUI からも設定できる  ただし,スクリプトに setwd(…)を書いて保存しておけば,繰り返し作業する場 合に設定が楽 11
  • 12.
    パッケージのインストール,読み込み  パッケージの追加により機能を増やせる(最初から入っているパッケージもある)  メニューバーから”パッケージ>パッケージのインストール”  どのミラーからダウンロードするかを選ぶ。ダウンロードできるものはどこでも同じなので, Japan の中から好きなものを選ぶ  関数を使ってインストールすることもできる install.packages("Hmisc") # 一覧から探す必要がないのでおすすめ install.packages(c("memisc", "car")) # 複数まとめてインストールすることもできる library(memisc) # パッケージの読み込み 分析例  サンプルデータは http://www.spss.co.jp/support/sample.html からダウンロード  作業ディレクトリに保存しておく library(foreign) d1 <- read.spss("bank.sav", to.data.frame=TRUE, reencode="shift-jis") t.test(SALNOW ~ SEX, data=d1) # t 検定(ウェルチ) t.test(d1$SALNOW, d1$SALBEG, paired=TRUE) # 対応のある t 検定 aov1 <- aov(SALNOW ~ SEXRACE, data=d1) # 分散分析 summary(aov1) # 結果の概要 lm1 <- lm(SALNOW ~ AGE + SEX*MINORITY + JOBCAT, data=d1) # 重回帰分析 summary(lm1) # 結果の概要 12
  • 13.
    テキストデータの読み込み read.csv(file.choose(), header=TRUE) # 対話的にデータを読み込み read.csv("sample.csv",header=TRUE) # 作業ディレクトリから sample.csv を読み込み # header オプションは一行目を列の名前(変数名)として読み込むかどうか read.delim("sample.txt", header=TRUE) # tab 区切りの場合 # data.frame 形式で読み込まれる TIPS & CAUTIONS! ☆ データがうまく読み込めない場合  文字化け…文字コードが合っていない。fileEncoding オプションに文字コー ドを指定する。日本語の場合,文字コードは shift-jis か UTF-8  read.csv("sample.csv", fileEncoding="UTF-8")  欠 損 値 の 処 理 … 欠損 値が 含 まれ る 場 合 は,欠 損値 に あ ててい る 文 字 を na.strings オプションに設定する  read.csv("sample.csv", na.strings="NA")  変数がおかしい…変数が数値の場合,変数の中に全角数字がないか,文字が 含まれていないかを確認する 他のソフトウェアのデータの読み込み  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", row.names=FALSE) # 作業ディレクトリに d1 を csv で保存 write.table(d1, "sample.dat", row.names=FALSE, sep="¥t") # 作業ディレクトリに d1 を tab 区切りテキストで保存 13
  • 14.
    データの操作 summary(d1) # 全データの要約統計量 head(d1) # データの先頭数行を表示。末尾は tail(...) colnames(d1) # データに含まれる変数の名前を取得 d1$SEX # 変数へのアクセス d1$SEX[5] # 変数の 5 番目のケース データの閲覧(単純集計表) # カテゴリ変数の場合 table(d1$JOBCAT) summary(d1$JOBCAT) # 連続変数の場合 table(d1$AGE) # 実用的ではない stem(d1$AGE) # 幹葉図 boxplot(d1$AGE) # 箱ひげ図 hist(d1$AGE, breaks="FD") # ヒストグラム # breaks は区切り方の指定。デフォルトの方法は古典的すぎるので変更 データの閲覧(記述統計) summary(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) # パーセントで表示 14
  • 15.
    変数のリコード  リコードの方法はたくさんあるが,memisc パッケージの recode 関数が最も汎用的  Hmisc,car パッケージにも recode 関数がある。先に読み込んだものが上書きされるので, memisc を最後に読み込むように! d1$AGE3 <- recode(d1$AGE, "低" <- range(min , 40), "中" <- range(40.01, 60), "高" <- range(60.01, max)) # 「d1$新しい変数名 <- 新しい変数」でデータフレームに変数を追加 d1$JOB3 <- recode(d1$JOBCAT, "事務" <- c("事務職", "事務研修員"), "マニュアル" <- "警備員", "専門・管理" <- c("専門職研修員", "管理職", "MBA 研修員", "技術職"))  R ではカテゴリ変数と連続変数が明確に区別されることに注意! TIPS & CAUTIONS! ☆ recode 関数のバグ  memisc の現在のバージョンでは,recode 関数にバグがある  欠損値の含まれている量的変数(数値ベクトル)をリコードしようとすると,エラー が出る  その場合は一時的に欠損値を別の値に置き換えてリコードするとよい  d1$AGE[is.na(d1$AGE)] <- 999 # 欠損値を 999 に置き換え  詳細は http://d.hatena.ne.jp/phosphor_m/20110629/1309339215 15
  • 16.
    ドキュメント編―――――――――――――――――― help 等のドキュメントの使い方  関数を初めて使うとき,使い方がよくわからないとき,エラーが出るとき,必ず help を読む!  特に初めて使う関数の help は,流し読みでもいいから絶対に目を通す! help(var) ?var # help(var)と同じ。利便性のための省略形。 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 パッケージのヘルプ 16