2017年3月版
データ・マエショリスト入門
データの読み込みから{dplyr}の基本まで
@y__mattu
12017/3/18 Tokyo.R #59
自己紹介
• 松村優哉 @y__mattu
• ブログ:http://y-mattu.hatenablog.com/
• 大学4年生
• 分野:計量経済学、統計学(因果推論)、マーケティング
• 言語:R, SAS
• R歴:2年くらい
• 近況:もうすぐ卒業&進学
22017/3/18 Tokyo.R #59
この発表について
• 2016/6/19 Tokyo.R #54 初心者セッションの加筆修正版
2017/3/18 Tokyo.R #59 3
アジェンダ
• データの読み込み
{readr}, {data.table}, {readxl}…
• データの前処理
• {dplyr}
• select, filter, mutate, group_by, arrange, 各種join
• おまけ: {tidyverse}
2017/3/18 Tokyo.R #59 4
データ分析の流れ
2017/3/18 Tokyo.R #59 5
データ取得
前処理
可視化・モデリング
データ分析の流れ
2017/3/18 Tokyo.R #59 6
データ取得
前処理
可視化・モデリング
Webから取得
(スクレイピング)
外部ファイル
(csv, tsv, Excel,…)
データベース
(SQL)
データ分析の流れ
2017/3/18 Tokyo.R #59 7
データ取得
前処理
可視化・モデリング
集計
マージ
型変換
絞り込み
データ分析の流れ
2017/3/18 Tokyo.R #59
データ取得
前処理
可視化・モデリング
散布図
ヒストグラム
箱ひげ図
回帰分析
(重回帰、ロジスティック、…)
ランダムフォレスト
サポートベクトルマシン
8
今日扱うのはここ
2017/3/18 Tokyo.R #59 9
前処理
可視化・モデリング
集計
マージ
型変換
絞り込み
データ取得
外部ファイル
(csv, tsv, Excel,…)
はじめに
• ワーキングディレクトリの設定
• ライブラリに入っている関数の使い方
2017/3/18 Tokyo.R #59 10
setwd(“./TokyoR/59”) #ディレクトリの指定
#方法1
library(readr)
dat <- read_csv(“hoge.csv”)
方法2
readr::read_csv (“hoge.csv”)
データの読み込み(CSV)
• パッケージを使わない場合
• 高速な読み込み1
• 高速な読み込み2
2017/3/18 Tokyo.R #59 11
dat <- read.csv(“sample.csv”, stringAsFactors = FALSE)
library(readr)
dat <- read_csv(“sample.csv”)
library(data.table)
dat <- fread(“sample.csv”, data.table = FALSE)
data.tableではなくdata.frameとして扱いたい場合は追加
おまじない
データの読み込み速度比較
2017/3/18 Tokyo.R #59 12
csvファイル(log.csv)
約500MB
約350万行×5列の簡単なログデータ
検証環境
Mac OS 10.11.5
Corei7 メモリ16GB
R 3.3.3
データの読み込み速度比較
2017/3/18 Tokyo.R #59 13
> system.time(csv1 <- read.csv(“log.csv"))
# ユーザ システム 経過
# 59.801 1.337 63.681
実行時間を計測
> system.time(csv2 <- readr::read_csv(“log.csv"))
# ユーザ システム 経過
# 5.005 0.527 7.732
> system.time(csv3 <- data.table::fread(“log.csv"))
# ユーザ システム 経過
# 3.502 0.425 6.965
データの読み込み(TSV)
• パッケージを使わない場合
• {readr}
• {data.table}
2017/3/18 Tokyo.R #59 14
dat <- read.delim(“sample.tsv”,
stringAsFactors = FALSE)
dat <- readr::read_tsv(“sample.tsv”)
dat <- data.table::fread(“sample.tsv”, data.table = FALSE)
データの読み込み(その他の区切り値)
• パッケージを使わない場合
• {readr}
• {data.table}
2017/3/18 Tokyo.R #59 15
dat <- read.table(“sample.tsv”,
stringAsFactors = FALSE, sep = “|”)
dat <- readr::read_delim(“sample.tsv”, “|”)
dat <- data.table::fread(“sample.tsv”)
データの読み込み(Excel)
• Excelを読み込めるパッケージ
{xlsx}, {gdata}, {XLConnect}, {openxlsx}, {redxl}
爆速、かつ文字コードや日付の処理も完璧にやってくれる
2017/3/18 Tokyo.R #59 16
dat <- readxl::read_excel(“sample.xlsx”,
sheet = “シート名”) #シート名は番号でもOK
データの読み込み(その他拡張子)
• SAS(sas7bdat)、STATA()、SPSS(sav)形式のファイル
→{haven}パッケージで読み込み
2017/3/18 Tokyo.R #59 17
dat <- haven::read_sas(“sample.sas7bda”)
コマンドとかオプションとかメンドイ…
• RStudioのGUI読み込み
2017/3/18 Tokyo.R #59 18
Import Dataset
で形式を選択
2017/3/18 Tokyo.R #59 19
読み込みのコマンドもわかる
読み込んだときの様子がプレビューできる
区切り値や欠損値の設定も可能
クリックでファイル選択
エンコーディングを指定したい
• Windowsの文字コードはShift-JIS(CP932)
• Macの文字コードはUTF8
• Windowsで作られた(日本語を含む)ファイルをMacで読む
ときはEncoding=“CP932”
• Macで作られた(日本語を含む)ファイルをWindowsで読む
ときはEncoding=“UTF8”
2017/3/18 Tokyo.R #59 20
エンコーディング(例:CSVをCP932で)
• パッケージを使わない場合
• {readr}
• {data.table}
2017/3/18 Tokyo.R #59 21
dat <- read.csv(“sample.csv”, strringAsFactors = FALSE,
fileEncoding = “cp932”)
dat <- readr::read_csv(“sample.csv”,
locale=locale(encoding=“cp932"))
dat <- data.table::fread(“sample.csv”, data.table = FALSE) %>%
dplyr::mutate(VAR1 = iconv(VAR1, from = “UTF8", to =
“CP932"))
いよいよデータの前処理
• みんな大好きirisデータ
• アヤメの3種(setosa, vrisicolor, verginica)についてsepal
(がく片)とpetal(花弁)の長さ(length)と幅(width)を
測ったデータセット
2017/3/18 Tokyo.R #59 22
Setosa Versicolor Verginica
d <- iris
データの構造を確認
• Rの標準関数
• {dplyr}
2017/3/18 Tokyo.R #59 23
> str(d)
#'data.frame': 150 obs. of 5 variables:
# $ Sepal.Length: num 5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ...
# $ Sepal.Width : num 3.5 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 ...
# $ Petal.Length: num 1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5 ...
# $ Petal.Width : num 0.2 0.2 0.2 0.2 0.2 0.4 0.3 0.2 0.2 0.1 ...
# $ Species : Factor w/ 3 levels "setosa","versicolor",..: 1 1 1 1 1 1 1 1 1 1 ...
> dplyr::glimpse(d)
# Observations: 150
# Variables: 5
# $ Sepal.Length (dbl) 5.1, 4.9, 4.7, 4.6, 5.0, 5.4, 4.6, 5.0, 4.4, 4.9, 5.4, 4.8, 4.8, 4.3...
# $ Sepal.Width (dbl) 3.5, 3.0, 3.2, 3.1, 3.6, 3.9, 3.4, 3.4, 2.9, 3.1, 3.7, 3.4, 3.0, 3.0...
# $ Petal.Length (dbl) 1.4, 1.4, 1.3, 1.5, 1.4, 1.7, 1.4, 1.5, 1.4, 1.5, 1.5, 1.6, 1.4, 1.1...
# $ Petal.Width (dbl) 0.2, 0.2, 0.2, 0.2, 0.2, 0.4, 0.3, 0.2, 0.2, 0.1, 0.2, 0.2, 0.1, 0.1...
# $ Species (fctr) setosa, setosa, setosa, setosa, setosa, setosa, setosa, setosa, set...
データの構造を確認
• Rstudioだと
2017/3/18 Tokyo.R #59 24
データの構造を確認
• Rstudioだとstr()の中身が表示される
2017/3/18 Tokyo.R #59 25
データの構造を確認
• summary関数で要約統計量
2017/3/18 Tokyo.R #59 26
> summary(iris)
# Sepal.Length Sepal.Width Petal.Length Petal.Width Species
# Min. :4.300 Min. :2.000 Min. :1.000 Min. :0.100 setosa :50
# 1st Qu.:5.100 1st Qu.:2.800 1st Qu.:1.600 1st Qu.:0.300 versicolor:50
# Median :5.800 Median :3.000 Median :4.350 Median :1.300 virginica :50
# Mean :5.843 Mean :3.057 Mean :3.758 Mean :1.199
# 3rd Qu.:6.400 3rd Qu.:3.300 3rd Qu.:5.100 3rd Qu.:1.800
# Max. :7.900 Max. :4.400 Max. :6.900 Max. :2.500
集計してみる
• Rの標準関数
2017/3/18 Tokyo.R #59 27
> table(d$Species)
# setosa versicolor virginica
# 50 50 50
集計してみる
• {dplyr}
2017/3/18 Tokyo.R #59 28
> group_by(d, Species) %>%
+ summarise(number = n())
#Source: local data frame [3 x 2]
# Species number
# (chr) (int)
#1 setosa 50
#2 versicolor 50
#3 virginica 50
数えたい変数でグルーピング
summarise関数
の中でカウント
変数を追加したい1(例:花弁の縦横比)
• Rの標準関数
または
2017/3/18 Tokyo.R #59 29
transform(d, petal.w.l = d$Petal.Length / d$Petal.Width)
d$petal.w.l = d$Petal.Length / d$Petal.Width
変数を追加したい1(例:花弁の縦横比)
• {dplyr}
2017/3/18 Tokyo.R #59 30
dplyr::mutate(d, petal.w.l = Petal.Length / Petal.Width)
ダミー変数も作れる
2017/3/18 Tokyo.R #59 31
species_dummy <- d %>%
mutate(category = factor(Species,
levels=c(“setosa”, “virginica”, “versicolor”),
labels=LETTERS[1:3]))
特定の列だけを取り出したい
例:Lengthにしか興味がないとき
• パッケージを使わない
2017/3/18 Tokyo.R #59 32
iris_length <- d[,c(1,3)] #列番号で直接指定
特定の列だけを取り出したい
例:Lengthにしか興味がないとき
• {dplyr}
• 他にも、特定の変数を抜いたりもできる
• dplyr の select() の引数に指定可能なバリエーションまとめ
2017/3/18 Tokyo.R #59 33
iris_length <- select(d, Sepal.Length, Petal.Length) #列名を指
定
iris_length <- select(d, row_number(c(1,3))) #列番号を指定
iris_length <- select(d, contains(“length”, ignore.case = TRUE))
#”length”が含まれる列を選択
大文字、小文字を区別しない
特定の行を取り出したい
setosaのみ, 長さx以上, etc…
• Rの標準関数
2017/3/18 Tokyo.R #59 34
iris_setosa <- subset(d, Species == “setosa”) #条件を指定
iris5 <- iris5 <- subset(d, Sepal.Length > 5.0) #条件を指定
特定の行を取り出したい
setosaのみ, 長さx以上, etc…
• {dplyr}
• 複数条件も可能
(参考文献「dplyrを使いこなす!基礎編」を参照)
2017/3/18 Tokyo.R #59 35
iris_setosa <- filter(d, Species == “setosa”) #条件を指定
iris5 <- filter(d, Sepal.Length > 5.0) #条件を指定
ソートしたい
• パッケージを使わない
2017/3/18 Tokyo.R #59 36
length_asc <- d[order(d[, 2]), ] #2列目(Sepal.Width)基準に昇順
length_desc <- d[order(d[, 2], decreasing = T), ] #降順
ソートしたい
• {dplyr}
2017/3/18 Tokyo.R #59 37
length_asc <- arrange(d, Sepal.Width) #Sepal.Width基準に昇順
length_desc <- arrange(d, descending(Sepal.Width)) #降順
2017/3/18 Tokyo.R #59 38
いったんIrisから離れて…
テーブルをマージしたい
• 複数のテーブルの組み合わせ
2017/3/18 Tokyo.R #59 39
引用:「dplyrを使いこなす!JOIN編」
テーブルをマージしたい(inner_join)
2017/3/18 Tokyo.R #59 40
ab_inner<- inner_join(a, b, by = “x1”)
引用:「dplyrを使いこなす!JOIN編」
テーブルをマージしたい(left_join)
2017/3/18 Tokyo.R #59 41
ab_left <- left_join(a, b, by = “x1”)
引用:「dplyrを使いこなす!JOIN編」
テーブルをマージしたい(full_join)
2017/3/18 Tokyo.R #59 42
ab_full <- full_join(a, b, by = “x1”)
引用:「dplyrを使いこなす!JOIN編」
テーブルをマージしたい(anti_join)
2017/3/18 Tokyo.R #59 43
ab_anti <- anti_join(a, b, by = “x1”) 引用:「dplyrを使いこなす!JOIN編」
なぜ{dplyr}なのか
• 速い
• 依存パッケージ{magrittr}により%>%が使える
• %>%を使わないと
2017/3/18 Tokyo.R #59 44
d <- iris
sepal_length <- select(d, contains(“Sepal”), Speceis)
sepal_group <- group_by(sepal_length, Speceis)
sepal_mean <- summarise(d_length,
s.w.mean = mean(Sepal.Width),
s.l.mean = mean(Sepal.Length))
sepal_mean
なぜ{dplyr}なのか
• 出力(種類ごとにがく片の平均値を算出)
2017/3/18 Tokyo.R #59 45
> d
# Source: local data frame [3 x 3]
#
# Species s.w.mean s.l.mean
# (fctr) (dbl) (dbl)
# 1 setosa 3.428 5.006
# 2 versicolor 2.770 5.936
# 3 virginica 2.974 6.588
なぜ{dplyr}なのか
• %>%を使うと
2017/3/18 Tokyo.R #59 46
d <- iris %>%
select(contains("Sepal"), Species) %>%
group_by(Species)%>%
summarise(s.w.mean = mean(Sepal.Width),
s.l.mean = mean(Sepal.Length))
d
データの前処理は他にも…
• {dplyr}
do, 各種Window関数
• {tidyr}
gather, spreadなど縦型と横型の変換について
• {lubridate}
日付データの扱い
• {purrr}
リストデータの処理
2017/3/18 Tokyo.R #59 47
もっと深く知りたい人は
• Kazutan.R
• データハンドリング、可視化、Rmarkdownを中心にコ
マンドと用例で解説
2017/3/18 Tokyo.R #59 48
おまけ:{tidyverse}
• dplyr、tidyr、ggplot2など便利なパッケージが一気ににインス
トールできる
• そのうちのメインになるもの(readrやdplyrなどが一気に読み込
める)
• 詳しくは俺たちのtidyverseはこれからだ!などを参照
2017/3/18 Tokyo.R #59 49
install.packages(“tidyverse”)
library(tidyverse)
結論
パッケージを使って
柔軟かつ高速な前処理を!!
2017/3/18 Tokyo.R #59 50
その他参考文献
• データの読み込みについて
表形式ファイルの読み込み関数あれこれ: readrパッケージの導入を兼ねて
文字化けこわい、こわくない?
readr,haven,readxl
R:read.csv / read.tableで型と列名を指定して読み込む。
R で tsv ファイルの読み込み
RでExcelのデータを読む方法
2017/3/18 Tokyo.R #59 51
その他参考文献
• データの処理に関して
dplyrを使いこなす!基礎編
dplyrを使いこなす!Window関数編
dplyrを使いこなす!JOIN編
Rの data.table と data.frame を dplyr で区別なく扱う
R dplyr, tidyr でのグルーピング/集約/変換処理まとめ
{tidyr}でよく使う関数のメモ
Hadley Ecosystem 2016
• その他
irisの正体
2017/3/18 Tokyo.R #59 52
Enjoy !
532017/3/18 Tokyo.R #59

2017年3月版データマエショリスト入門(誤植修正版)