Rによるデータサイエンス 読書メモ

[Rによるデータサイエンス 読書メモ その1 \- 駄文型](http://koheikimura.hatenablog.com/entry/2017/04/18/183000)より。

> ――進化を続ける「R」を使い倒す！
R言語によるデータ解析の入門書．データサイエンスブームに先駆けた初版の発行以来，網羅性と実用性の高さから，多くのRユーザーに支持を得てきたロングセラー．Rのバージョンアップへの対応に加え，深層学習やネットワーク分析など，ますます充実するパッケージの解説を加えた第2版．

> ～こんな方に～
・因子分析・ネットワーク分析・深層学習などの分析手法をすぐに試したい
・Rを使うとどんなデータ解析ができるのか，一通り知っておきたい
・幅広いデータ解析手法・機械学習法を，Rで動かしながら体感的に学びたい

> [Rによるデータサイエンス(第2版) データ解析の基礎から最新手法まで | 森北出版株式会社](https://www.morikita.co.jp/books/book/3063)


# 全体の感想
網羅的に手法をカバーしているので課題に対してどの手法を使うべきか？の検討に使うことができる。網羅的な分，説明が短いので入門書として使うのは厳しい。Rについても統計についても，すでにある程度知っている，あるいは昔学習したが忘れているくらいの知識レベルだとちょうどいい印象。Rの関数の使い方だけでなく，結果データの見方や手法の選び方も解説しているので実用性は高い。一度目を通しておけばリファレンスとして使えそう。さらに深く知りたければ参考文献に載っている各手法の専門書を読むとよさそう。

# 第I部 Rとデータマイニングの基礎
構文や基本的な関数など，基本のおさらい。統計の用語も軽く説明がある。Rを使ったことがあるが体系的に勉強してない or Rを久しぶりに使う など再入門にちょうどいい。初学者向けではない。

## 1章 データマイニングとR言語
- オブジェクト、関数、制御文、RStudio、パッケージ

## 2章 データの入出力と編集
- ベクトル、行列、データフレーム、配列、リスト
- 入力 `read.csv`, `scan`
- 出力 `write`, `write.table`, `sink`
- 結合 `rbind`, `cbind`
- 並び替え `sort`, `rev`, `sort.list`
- よく使う関数一覧 p28
- データの尺度
  - 量的データ: 間隔尺度、比例尺度
  - 質的データ: 名目尺度、順序尺度
- `summary`

## 3章 データの演算と固有値，基本統計量
- 算術演算，比較演算，論理演算，行列の演算
- 行列の内積 `%*%`
- 逆行列 `solve`
- 固有値，特異値分解
- 基本統計量関数 p37
- 行･列ごとに統計量をとる `apply`
- 相関係数行列 `cor`
- 分散共分散行列 `var`, `cov`

## 4章 データの可視化
- 棒グラフ，円グラフ，ヒストグラム，折れ線グラフ，箱ひげ図，散布図
- 作図環境とグラフの利用
  - ここは無視してRStudio使った方がいいと思う

# 第II部 Rによるデータ解析･データマイニング
ここからが本題。

## 5章 主成分分析
- 多変数データを少ない変数に縮約する
- `princomp`

## 6章 因子分析
- 変数間の相関関係から共通因子を求める
- 例: 教科（算数，理科，国語など）別の成績データから2つの因子（理系，文系）にまとめる
- `factanal` シンプルだがカスタマイズ性が低い，最尤法のみ
- `psych` パッケージ `fa` 因子の推定法を指定可能
- 因子の推定方法や回転方法によって結果が変わることがある
  - 探索的に方法を変えて結果を見る必要がある

## 7章 対応分析
- わからん

## 8章 多次元尺度法
- MDS: Multi-Dimensional Scaling
- データの個体間の類似度or距離を2〜3次元に射影
  - 個体 = 散布図の1点のイメージ
- データの構造やパターンを考察可能
- パッケージ `stats` 関数 `dist`, `cmdscale`

## 9章 クラスター分析
- 個体や変数を分類する方法は教師ありと教師なしに大別される
- この章では教師なしの場合

### 階層的クラスター分析
- 樹形図（dendrogram）ができる
- クラスタリング法，凝縮型階層手法とも
- プロセス
  1. データから距離（あるいは類似度）を求める `dist`
  1. クラスター分析の手法を選択 `hclust`
  1. コーフェン行列を求める
  1. 樹形図を作成 `plot`
  1. 結果について検討 `heatmap`
- 近い個体から順にペアにしてクラスタを作っていくようなイメージ
- クラスタ間の距離を求める必要がある
  - クラスタ間の距離を求める手法（P110）

### その他
- k平均法 `kmeans`
- モデルに基づいたクラスター分析 `hclass`

## 10章 自己組織化マップ
- わからん

## 11章 線形回帰分析
- 回帰分析とは: 説明変数をから目的変数を求めることができる統計モデルをつくる
  - 例: BMI
- 線形回帰分析: 目的変数と説明変数を1次関数の関係としてモデル化
- 非線形回帰分析: 2次関数以上
- 線形単回帰分析 `lm`
  - 最小二乗法
  - 説明変数が1つ
- 線形重回帰分析 `lm`
  - 単に `重回帰分析` と言った場合，線形重回帰分析を指す
  - 説明変数が複数

## 12章 非線形回帰分析
- ロジスティック回帰 `nls`
  - ロジスティック関数 `y = a / (1 + b * e^cx)` を用いる
- 多項式回帰 `nls`
  - 例えば3次多項式の場合 `y = a + b * x + c * x^2 + d * x^3`
- 一般線形モデル `glm`
- 平滑化回帰
  - わからん

## 13章 線形判別分析
- 判別分析: 学習データを用いて判別モデルを構築，所属不明の個体の識別に使う
- 線形判別分析は散布図にプロットされた個体を直線で分割するイメージ（p162 図13.1）
- `library(MASS)` `lda`
- 学習データとテストデータを分ける手法として `交差確認` がある
  - `lda` に引数 `CV=TRUE` を渡す
- 線形判別分析は等分散の制約条件があることと，大量の変数には向いていないため非線形判別分析に押され気味らしい

## 14章 非線形判別分析
- `library(MASS)`
- 二次式による判別分析 `qda` 使い方は `lda` とほぼおなじ
- k 最近傍法が最も多く用いられる
- 近年では機械学習のアプローチによる判別分析が提案（15〜19章）

### 距離による判別分析
- 学習データからグループの中心を求め，未知の個体は中心との距離が一番小さいグループに属すると判別
- グループ数が3以上でも使える
- データの確率分布かの条件もない
- マハラノビス距離が多く用いられる `mahalanobis`

### k 最近傍法（k最近隣法，k-NN法） `knn`
- `library(klaR)`
- 判別する個体の周辺 k 個の多数決でグループを決定
- 距離の測度としては `ユークリッド距離` が一般的
- k の値は何がいいか明確な基準はなく，データに依存
- 九工大の実証実験で使用
  - センサーデータのクラスタリング

### ベイズ判別法
- 個体がグループに属する確率を `ベイズ定理` で求め，最大のグループに属すると判別
- 分布条件あり
- `library(klaR)` `NaitiveBayes`

## 15章 ツリーモデル
- 回帰分析，判別分析の1つ
- 回帰木，分類木，決定木とも
- 説明変数の値を何らかの基準で分岐させ，判別･予測のモデルを構築
- `rpart`
- ツリーのグラフ `rpart.plot` `plot.party` `fancyRpartPlot`
- `rpart` のほかに `tree` , `ctree` パッケージもある
  - `ctree` は回帰木は作れない

## 16章 集団学習
- 複数のモデルを組合せて精度の高いモデルを構築する手法
- バギング `libraly(adabag)` `bagging`
  - ブートストラップというリサンプリング法で複数の学習データセットを作成
- ブースティング `boosting`
  - 逐次重みの調整を繰り返す
- ランダムフォレスト `libraly(randomForest)` `randamForest`
  - ランダムサンプリングしたデータに対してバギングを適用
  - 精度および計算リソースの節約の面でバギングとブースティングより ◯

## 17章 カーネル法とサポートベクターマシン
- カーネル法: `カーネル関数` にりデータを別空間に射影
  - 別空間に射影すれば非線形データを線形モデルで分類できる可能性がある
- カーネル主成分分析 `libraly(kernlab)` `kpca`
  - 非線形成分分析とも
- サポートベクタマシン `ksvm`

## 18章 ニューラルネットワーク
- 神経細胞（ニューロン）が多数並列に接続されたシステムを数理的にモデル化したもの
- 出力結果が目標値に近づくように重みを変える計算を繰り返す
- パターン認識，分類，ノイズが混在しているデータの処理が得意
- モデルの分類
  - 教師あり ⇔ 教師なし
  - 階層型ネットワーク ⇔ 非階層型ネットワーク
      - 深層学習（ディープラーニング）は階層型
      - コンピューターの性能向上とアルゴリズムの工夫により多層構造で計算できるように
- 中間層ありの NN パッケージ `nnet`

### 深層学習
- 階層型ネットワークに属す
- 中間層を多く用いるため計算量が多い
- 画像認識，音声認識 → 畳み込みNN （CNN）
- 時系列データ → 再帰型 NN （RNN）
- パッケージ `ho2` `darch` `mxnet` `deepnet` など
  - この本では `ho2` を例に
- アルゴリズム，隠れ層の数，各層のユニット数，学習の回数をデータ構造に基いて決める必要がある
  - 関連知識と経験が必要

## 19章 ネットワーク分析
- 何らかの関係の有無や度合いを分析
- グラフ理論に基礎をおいていいるためグラフ分析とも
- 隣接行列の作成 `libraly(igraph)` `graph.adjacency`
- データフレームからグラフオブジェクトに変換 `graph.data.frame`
- ネットワークの統計量
  - ノード数 `vcount`
  - エッジ数 `ecount`
  - 隣接ノード `neighbors`
  - 次数（自由度） `degree`
  - 密度 `graph.density`
  - 中心性 定義によっていろいろ（次数中心性，接近中心性など）
  - クラスターの係数 `transitivity` 隣り合うノードの間に三角形グループがいくつあるか
  - ニューマンの次数の相関係数 `assortativity.degree` 2つのノード間の次数の関連性
  - 最短パス値 `shortest.paths`
  - 平均パス `average.path.length`
- 次数の平均，密度，中心性，クラスター係数などから複雑さを比較可能
- グラフ間の差分 `graph.difference`
- コミュニティ抽出 p244 表19.6
- オーバーラッピングを許すコミュニティ抽出 `linkcomm`
- ベイジアンネットワーク: 因果関係を推測

## 20章 アソシエーション分析
- マーケット･バスケット･トランザクションデータの分析
- `libraly(arules)`
- 相関ルール `apriori` 商品の組合せの規則を抽出
- 頻出アイテムの抽出 `eclat`
- 抽出結果の補助分析 `dissimilarity`

## 21章 時系列分析
- 時系列データ: 一定の時間間隔で測定･観測したデータ
- `libraly(stats)`
- 時系列データの図示 `ts.plot`
- 自己共分散と自己相関
- スペクトル分析 `spec.pgram` 周期性を解析（トレンドやノイズを除去するようなイメージ）
- 単位今検定 `libraly(tseris)` `adf.text` データがランダムウォークかどうか
- AR（自己回帰）モデル `ar`
- ARMA/ARIMAモデル `arima` ARモデルに誤差の移動平均を加えたモデル
- 成分の分解 `stl` トレンド，周期変動，残差に分解

## 22章 生存分析
- イベントが起きるまでの時間とイベントとの関係に焦点
- 機械システムの故障や患者の疾患，死亡を対象
- `libraly(survival)`
- ノンパラメトリックモデル `survfit`
- セミパラメトリックモデル `coxph`
- パラメトリックモデル `survreg`
- 共変量（時間以外の説明変数）の有無，分布を仮定するか否かに違い