本資料はデータ分析勉強会 で使用した「RStudioのすゝめ」の講義資料を再整理したものです。
R の基本は他の言語と同じですが、R特有の部分もあります。「Rの一番良いところは統計学者が作っているところだ。 Rの一番悪いところは統計学者が作っているところだ。(出典)」と言われることが多いようですが、その特徴はなんといっても統計処理に特化している点です。この特徴によりデータ構造の変換や特定の分析に対する数々のパッケージが用意され、さらにコマンド一つでグラフが描ける高度なグラフィクス、更には分析結果をレポーティングするための仕組みも用意されています。このような点が他の言語と大きく異る点だと思います。
R を学ぶ際には統計知識は最低限必要ですが基本的なプログラミングのマスターにはどちらかというと統計の知識よりは R が得意とするベクトル処理を理解するのが一番のポイントだと思います。 R 単体ではエディタが貧弱ですが RStudio という統合開発環境(IDE)を用いればコーディング自体をサポートしてくれますし、より便利に使うための様々なパッケージが用意されていますので恐れる必要はありません。気軽に R の世界に触れて見ましょう。
追加パッケージなしでも使える R の基本的な関数を R Commander のメニューを元に見ていきましょう。
統計量や主な数学関数はBase Rと呼ばれるbaseパッケージやstatsパッケージに用意されています。
baseパッケージ
| 関数名 | 説明 | 備考 |
|---|---|---|
| abs | 絶対値 | |
| cos | 三角関数(コサイン) | 余弦 |
| exp | 指数関数 | ネイピア数 \(e^x=\exp(x)\) |
| log | 対数関数(自然対数) | ネイピア数 \(e=\exp(1)\) を底とする |
| log10 | 対数関数(常用対数) | 整数\(10\)を底とする |
| log1p | 対数関数 | \(log(1+x)\), |\(x\)| \(\ll 1\) |
| log2 | 対数関数(二進対数) | 整数\(2\)を底とする |
| mean | 平均値(\(\bar{x}\)) | 算術平均 |
| max | 最大値 | |
| min | 最小値 | |
| pi | 円周率(\(\pi\)) | |
| range | 範囲(最小値、最大値) | |
| sin | 三角関数(サイン) | 正弦 |
| sqrt | ルート(\(\sqrt[2]{x}\)) | |
| sum | 合計値 | |
| summary | データフレームのサマリー | |
| tan | 三角関数(タンジェント) | 正接 |
statsパッケージ
| 関数名 | 説明 | 備考 |
|---|---|---|
| fivenum | 五数要約 | 四分位数とは異なる場合もあるので注意 |
| IQR | 四分位範囲 | |
| median | 中央値 | |
| quantile | 四分位数 | 計算方法は9種類から指定可能 |
| sd | 標準偏差 | 不変分散から計算される標準偏差 |
| var | 分散 | 不偏分散(標本分散の関数はない) |
基本的なグラフィック関数はgraphicsパッケージで提供されています。特にgraphics::plot関数は引数を変えることで様々なグラフを描画することができます。
| 関数名 | 説明 | 備考 |
|---|---|---|
| boxplot | 箱ひげ図の描画 | |
| plot | 様々なグラフの描画 | データに応じたグラフを描く |
基本的な分析モデルはstatsパッケージで提供されています。その他、様々な分析モデル用の関数はパッケージとして提供されていますので、必要に応じてパッケージをインストールして下さい。
statsパッケージ
| 関数名 | 説明 | 備考 |
|---|---|---|
| glm | 一般化線形モデル | |
| lm | 線形モデル | 線形回帰 |
その他、便利な関数としてはbaseパッケージやutilパッケージで提供される以下のような関数があります。
| 関数名 | 説明 | 備考 |
|---|---|---|
| cut | 階級の作成 | |
| floor | 切り捨て | |
| length | データの長さを知る | |
| levels | 因子の水準を知る | |
| pretty | 階級幅の計算 | |
| rep | 値の複製 | |
| round | 数値の丸め | 四捨五入ではなくIEC 60559による丸め |
| seq | 規則的な数列の作成 |
utilsパッケージ
| 関数名 | 説明 | 備考 |
|---|---|---|
| head | データの先頭から任意の行だけ表示する | 行数は指定可 |
| tail | データの末尾から任意の行だけ表示する | 同上 |
R ではパッケージを追加することで様々な関数が使えるようになります。正規パッケージとも言える CRAN から提供されているパッケージ数は2017年7月の時点で1万を超えています。これらのパッケージを利用する場合は目的のパッケージをインストールする必要があります。インストール方法については パッケージのインストール をご覧下さい。提供されているパッケージの一覧は CRAN Packages で検索できます。一部日本語に翻訳された CRANパッケージ一覧 も公開されています。
パッケージの開発分野については CRAN Task Views で確認することができます。こちらも一部日本語に翻訳された CRANタスクビュー も公開されています。代表的なタスクには以下のようなものがあります。
| Task | 内容 |
|---|---|
| Bayesian | ベイズ推論 |
| Cluster | クラスター分析 |
| ExperimentalDesign | 実験計画法 |
| Finance | ファイナンス |
| Graphics | グラフィクス、可視化 |
| HighPerformanceComputing | 高性能並列処理 |
| MachineLearning | 機械学習 |
| Multivariate | 多変量統計 |
| NaturalLanguageProcessing | 自然言語処理 |
| ReproducibleResearch | 再現性のある分析 |
| Spatial | 空間データ |
| SpatioTemporal | 時空間データ |
| Survival | 生存時間解析 |
| TimeSeries | 時系列分析 |
インストールしたパッケージを利用するには以下の二つの方法があります。
基本的には前者を使うのが何かと便利です。
パッケージを読み込むにはbase::library関数を使います。パッケージの検索順もオプションで明示的に指定することが可能です。
library(tidyverse)
パッケージを読み込む関数にはbase::requireという関数もあります。この関数はパッケージを読み込む動作自体は同じですが指定したパッケージが既に読み込まれていた場合にはパッケージの読み込み動作を行いません。なので、自作関数内でのパッケージ呼び出しやR Notebook, R Markdownを利用する場合には便利な関数です。なお、base::library関数は常にパッケージの読み込みを行います。
require(tidyverse)
libraryとrequireの違いlibraryとrequireは厳密には以下のような違いがあります。
http://justdoit.hatenablog.jp/entry/2015/01/11/231208 https://mumu.jpn.ph/forest/computer/2016/05/04/3895/
if (!require('openxlsx')){
install.packages('openxlsx')
}
## Loading required package: openxlsx
library('openxlsx')
パッケージを読み込まなくてもパッケージで定義されている関数を利用するには以下のように記述します。関数が定義されているパッケージ名を明示的に指定することで直接パッケージから関数を呼び出します。
tidyverse::tidyverse_conflicts()
R では明示的に読み込み位置を指定しない限り最後に読み込んだパッケージからオブジェクト(関数や変数)を検索しますので、この呼び出し方法は複数のパッケージを読み込んだことにより関数がマスクされてしまっている場合で使えます。
例えばモダンなプログラミングで必須ともいえるdplyrパッケージにあるfilter関数は、基本パッケージstatsにある時系列フィルタリングを行うfilter関数をマスクしてしまいますので、stats:filter関数を使う場合は以下のように明示的にパッケージ名を指定して記述します。
library(dplyr)
filter(mtcars, cyl == 6) # dplyrパッケージのfilter関数が呼び出される
stats::filter(c(1:100), rep(1, 3)) # statsパッケージのfilter関数を呼び出している
## Time Series:
## Start = 1
## End = 100
## Frequency = 1
## [1] NA 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51
## [18] 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102
## [35] 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153
## [52] 156 159 162 165 168 171 174 177 180 183 186 189 192 195 198 201 204
## [69] 207 210 213 216 219 222 225 228 231 234 237 240 243 246 249 252 255
## [86] 258 261 264 267 270 273 276 279 282 285 288 291 294 297 NA
また、あまり一般的でないパッケージで定義されているオブジェクト(関数や変数)を利用する場合、あえてこのような記述をすることにでコードの可読性向上につなげることも可能です。
追加でパッケージをインストールした場合は以下のコマンドを用いて定期的にパッケージを更新しておくことをおすゝめします。
update.packages()
CC BY-NC-SA 4.0 , Sampo Suzuki [2019-05-10(JST)]