初心者セッション 2
データハンドリング編

2019/06/29 Tokyo.R #79

はじめに

誰?

icon

著書(共著)

R ユーザのための RStudio[実践]入門
− tidyverse によるモダンな分析フローの世界−

rstudiobook

通称: 「宇宙本

  1. RStudio 入門(@y__mattu)
  2. スクレイピングによるデータ取得(@y__mattu)
  3. dplyr を中心としたデータハンドリング(@yutannihilation)
  4. ggplot2 による可視化(@kyn02666)
  5. R Markdown によるレポーティング(@kazutan)

データハンドリング

データ分析の流れ

やること

  • 絞り込み(列・行)
  • 新しい変数の作成
  • 集計
  • テーブルのマージ
  • 縦横変換
  • etc…

今日のおはなし

  1. tidyverse
  2. tidy data
  3. dplyr
  4. FAQ

初心者(Rを使い始めた、ちょっと触ったことがある方)向けの内容です

本題のまえに

R とパッケージ

ざっくり

  • R はパッケージで機能を拡張することができる
  • パッケージには機能特化の関数が詰まっている
  • install.packages() でインストール

パッケージ内の関数の表記

readr パッケージの read_csv() 関数を使いたいとき

tidyverse について

tidyverse(概念)

ざっくり:

  • R でやるいろんな操作(データハンドリング、可視化、スクレイピング、分析、etc)を直感的で統一的なインターフェースでできるようになったら嬉しくない?

tidyverse パッケージ

  • 上記の概念を実現するためのコアパッケージ群
  • install.packages("tidyverse")でインストール

tidyverse を読み込み

── Attaching packages ───────────────────────────────── tidyverse 1.2.1 ──
✔ ggplot2 3.1.0     ✔ purrr   0.3.2
✔ tibble  2.1.3     ✔ dplyr   0.8.1
✔ tidyr   0.8.3     ✔ stringr 1.4.0
✔ readr   1.3.1     ✔ forcats 0.4.0
── Conflicts ──────────────────────────────────── tidyverse_conflicts() ──
✖ dplyr::filter() masks stats::filter()
✖ dplyr::lag()    masks stats::lag()

読み込まれるパッケージ

  • ggplot2: 可視化
  • dplyr: データの操作
  • tidyr: データを tidy に
  • readr: データの読み書き
  • purrr: 関数型プログラミング
  • stringr: 文字列の操作
  • forcats: 因子型データの操作
  • tibble: tibble というモダンなデータフレーム

本日の主役は

dplyr

特徴

パッケージを使わないやり方より

  • (大きいデータだと特に)
    速い
  • 簡単
    ≒ わかりやすい
  • 他の tidyverse のパッケージと相性がいい

この発表のゴール

  • tidy data についてざっくり理解する
  • R の dplyr パッケージで簡単な集計ができるようになること
  • dplyr や他のパッケージで何ができるのかをなんとなく把握して、「ググり力」を身につける
  • パッケージ名だけでも覚えて帰ってくださいね m(__)m

tidy data

データの形式

2つのデータ形式(例: カテゴリごとの購買金額(千円))

Wide 型

Long 型

tidy data

  • 2016 年に Hadley Wickham 氏が提唱
  • 定義
    • 1つの列が1つの変数を表す
    • 1つの行が1つの観測を表す
    • 1つのテーブルが1つのデータセットを含む

tidyr (これまで)

gather_spread

これだけではなくなるよ、
という話は応用セッションにて…

dplyr {nowdplyr}

本日のデータ

EC サイトのログデータ

データの読み込み方

  1. RStudio のプロジェクトを作成
  2. Terminal ペインで以下を実行
    git clone https://github.com/ymattu/sampledata_small
  3. readr パッケージの関数で読み込み

データ読み込みについて詳しくはこちらも参照

dplyr

列選択

%>%

パイプ演算子

  • “これまでの処理を次の関数の第 1 引数として渡す」という働き”
[1] 6

なんでパイプ演算子が必要なのか?

Tokyo.R#76 BeginneRSession-data pipeline

どう書くのか問題

思考の流れと書く流れ

パイプ演算子を使うときのポイント

結果 <- スタート地点 を書いて、やりたい処理をパイプでつないでいく

列選択のやりかたいろいろ

列選択のやりかたいろいろ 2

列追加

  • 税込み価格を計算

行の絞り込み

集計

  • グルーピング + 集計

ここまでやったところで

パッケージを使わないでできないの?

  • できるものもあります。
  • select, filter あたりはできます。
  • でもめんどくさい
  • しかもデータが大きいと遅い
  • このあたり、私の過去資料もみてね
  • でも$はお手軽だしよく使います。

$で 1 列だけ取り出す

[1] "雑貨・日用品"           "花・グリーン"          
[3] "食品"                   "衣料品"                
[5] "ヘルス&ビューティー"   "家具・インテリア・家電"

日付の操作

lubridate パッケージ

lubridate

  • 日付の操作をよしなにやってくれるパッケージ
[1] "2011-06-04"
[1] "2013-01-01"

詳しくはこちらこちらを参照

データハンドリングでの使い所

たくさんあるけど例えば

ここから集計につなげる

ユーザー、年ごとに集計

その他、代表的な
(面倒くさい)型たち

文字列型

因子型(factor 型)

テーブルのマージ

複数のテーブルを考える

a

b

  • 基本は SQL と同じ

inner_join()

a

### b

left_join()

a

### b

full_join()

a

### b

anti_join()

a

### b

FAQ

dplyr とかだと何で
R の標準関数より速いの?

Answer : C++を使っているから

  • dplyrreadrでは、メインの処理を C++でやり、結果を R で受け取る、という構造になっています。
  • Rcpp パッケージが活躍!

たくさんのテーブルを join したい!

例えばこんな感じ(a, b, c 3 つのデータ)

  x1 x2
1  A  1
2  B  2
3  C  3
  x1    x3
1  A  TRUE
2  B FALSE
3  D  TRUE
  x1 x4
1  B 10
2  C 11
3  D 12

こうする…?

数が増えると大変!

たくさんのテーブルを join したい!

Answer : 初心者セッションの範囲をこえますが、
purrrパッケージを使うと簡単です。

purrr パッケージの参考資料→そろそろ手を出す purrr

まとめ

言いたいこと

  • (イマドキな)R でのデータハンドリングでは tidyverse は必須
  • 基礎的なことは Tokyo.R 初心者セッションや、宇宙本で!
  • 応用は、まずパッケージ名を知ることから(purrr, broom, etc…)
  • ぜひ使いこなせるようになりましょう。

本資料について

Enjoy!