Diese Präsentation wurde erfolgreich gemeldet.
Wir verwenden Ihre LinkedIn Profilangaben und Informationen zu Ihren Aktivitäten, um Anzeigen zu personalisieren und Ihnen relevantere Inhalte anzuzeigen. Sie können Ihre Anzeigeneinstellungen jederzeit ändern.
2016年上半期版
データ・マエショリスト入門
データの読み込みから{dplyr}の基本まで
@y__mattu
12016/6/19 Tokyo.R #54
自己紹介
• 松村優哉 @y__mattu
• ブログ:http://y-mattu.hatenablog.com/
• 大学4年生
• 勉強している分野:統計学、マーケティング
• 言語:SAS, R
• R歴:1年半くらい
22016/6/...
データ分析の流れ
2016/6/19 Tokyo.R #54 3
データ取得
前処理
可視化・モデリング
データ分析の流れ
2016/6/19 Tokyo.R #54 4
データ取得
前処理
可視化・モデリング
Webから取得
(スクレイピング)
外部ファイル
(csv, tsv, Excel,…)
データベース
(SQL)
データ分析の流れ
2016/6/19 Tokyo.R #54 5
データ取得
前処理
可視化・モデリング
集計
マージ
型変換
絞り込み
データ分析の流れ
2016/6/19 Tokyo.R #54
データ取得
前処理
可視化・モデリング
散布図
ヒストグラム
箱ひげ図
回帰分析
(重回帰、ロジスティック、…)
ランダムフォレスト
サポートベクトルマシン
今日扱うのはここ
2016/6/19 Tokyo.R #54 7
前処理
可視化・モデリング
集計
マージ
型変換
絞り込み
データ取得
外部ファイル
(csv, tsv, Excel,…)
データの読み込みの前に
2016/6/19 Tokyo.R #54 8
setwd(“/Volumes/YUYA_USB/TokyoR/54”) #ディレクトリの指定
データの読み込み(CSV)
• パッケージを使わない場合
• 高速な読み込み1
• 高速な読み込み2
2016/6/19 Tokyo.R #54 9
dat <- read.csv(“sample.csv”, stringAsFactors =...
データの読み込み速度比較
2016/6/19 Tokyo.R #54 10
csvファイル(log.csv)
約500MB
約350万行×5列の簡単なログデータ
検証環境
Mac OS 10.11.5
Corei7 メモリ16GB
R 3.3.0
データの読み込み速度比較
2016/6/19 Tokyo.R #54 11
> system.time(csv1 <- read.csv(“log.csv"))
# ユーザ システム 経過
# 59.801 1.337 63.681
実行時間を...
データの読み込み(TSV)
• パッケージを使わない場合
• {readr}
• {data.table}
2016/6/19 Tokyo.R #54 12
dat <- read.delim(“sample.tsv”, strringAsFa...
データの読み込み(その他の区切り値)
• パッケージを使わない場合
• {readr}
• {data.table}
2016/6/19 Tokyo.R #54 13
dat <- read.table(“sample.tsv”, strrin...
データの読み込み(Excel)
• Excelを読み込めるパッケージ
{xlsx}, {gdata}, {XLConnect}, {openxlsx}, {redxl}
爆速、かつ文字コードや日付の処理も完璧にやってくれる
2016/6/19 ...
エンコーディングを指定したい
• Windowsの文字コードはShift-JIS(CP932)
• Macの文字コードはUTF8
• Windowsで作られた(日本語を含む)ファイルをMacで読む
ときはEncoding=“CP932”
• M...
エンコーディング(例:CSVをCP932で)
• パッケージを使わない場合
• {readr}
• {data.table}
2016/6/19 Tokyo.R #54 16
dat <- read.csv(“sample.csv”, strr...
いよいよデータの前処理
• みんな大好きirisデータ
• アヤメの3種(setosa, vrisicolor, verginica)についてsepal
(がく片)とpetal(花弁)の長さ(length)と幅(width)を
測ったデータセッ...
データの構造を確認
• Rの標準関数
• {dplyr}
2016/6/19 Tokyo.R #54 18
> str(d)
#'data.frame': 150 obs. of 5 variables:
# $ Sepal.Length: n...
データの構造を確認
• Rstudioだと
2016/6/19 Tokyo.R #54 19
データの構造を確認
• Rstudioだとstr()の中身が表示される
2016/6/19 Tokyo.R #54 20
データの構造を確認
• summary関数で要約統計量
2016/6/19 Tokyo.R #54 21
> summary(iris)
# Sepal.Length Sepal.Width Petal.Length Petal.Width S...
集計してみる
• Rの標準関数
2016/6/19 Tokyo.R #54 22
> table(d$Species)
# setosa versicolor virginica
# 50 50 50
集計してみる
• {dplyr}
2016/6/19 Tokyo.R #54 23
> group_by(d, Species) %>%
+ summarise(number = n())
#Source: local data frame [...
変数を追加したい1(例:花弁の縦横比)
• Rの標準関数
または
2016/6/19 Tokyo.R #54 24
transform(d, petal.w.l = d$Petal.Length / d$Petal.Width)
d$petal...
変数を追加したい1(例:花弁の縦横比)
• {dplyr}
2016/6/19 Tokyo.R #54 25
dplyr::mutate(d, petal.w.l = Petal.Length / Petal.Width)
ダミー変数も作れる
2016/6/19 Tokyo.R #54 26
species_dummy <- d %>%
mutate(category = factor(Species,
levels=c(“setosa”, “virginica”...
特定の列だけを取り出したい
例:Lengthにしか興味がないとき
• パッケージを使わない
2016/6/19 Tokyo.R #54 27
iris_length <- d[,c(1,3)] #列番号で直接指定
特定の列だけを取り出したい
例:Lengthにしか興味がないとき
• {dplyr}
• 他にも、特定の変数を抜いたりもできる
2016/6/19 Tokyo.R #54 28
iris_length <- select(d, Sepal.Le...
特定の行を取り出したい
setosaのみ, 長さx以上, etc…
• Rの標準関数
2016/6/19 Tokyo.R #54 29
iris_setosa <- subset(d, Species == “setosa”) #条件を指定
i...
特定の行を取り出したい
setosaのみ, 長さx以上, etc…
• {dplyr}
• 複数条件も可能
(参考文献「dplyrを使いこなす!基礎編」を参照)
2016/6/19 Tokyo.R #54 30
iris_setosa <- f...
ソートしたい
• パッケージを使わない
2016/6/19 Tokyo.R #54 31
length_asc <- d[order(d[, 2]), ] #2列目(Sepal.Width)基準に昇順
length_desc <- d[orde...
ソートしたい
• {dplyr}
2016/6/19 Tokyo.R #54 32
length_asc <- arrange(d, Sepal.Width) #Sepal.Width基準に昇順
length_desc <- arrange(d...
2016/6/19 Tokyo.R #54 33
いったんIrisから離れて…
テーブルをマージしたい
• 複数のテーブルの組み合わせ
2016/6/19 Tokyo.R #54 34
引用:「dplyrを使いこなす!JOIN編」
テーブルをマージしたい(inner_join)
2016/6/19 Tokyo.R #54 35
ab_inner<- inner_join(a, b, by = “x1”)
引用:「dplyrを使いこなす!JOIN編」
テーブルをマージしたい(left_join)
2016/6/19 Tokyo.R #54 36
ab_left <- left_join(a, b, by = “x1”)
引用:「dplyrを使いこなす!JOIN編」
テーブルをマージしたい(full_join)
2016/6/19 Tokyo.R #54 37
ab_full <- full_join(a, b, by = “x1”)
引用:「dplyrを使いこなす!JOIN編」
テーブルをマージしたい(anti_join)
2016/6/19 Tokyo.R #54 38
ab_anti <- anti_join(a, b, by = “x1”)
引用:「dplyrを使いこなす!JOIN編」
なぜ{dplyr}なのか
• 速い
• 依存パッケージ{magrittr}により%>%が使える
• %>%を使わないと
2016/6/19 Tokyo.R #54 39
d <- iris
sepal_length <- select(d, c...
なぜ{dplyr}なのか
• 出力(種類ごとにがく片の平均値を算出)
2016/6/19 Tokyo.R #54 40
> d
# Source: local data frame [3 x 3]
#
# Species s.w.mean s....
なぜ{dplyr}なのか
• %>%を使うと
2016/6/19 Tokyo.R #54 41
d <- iris %>%
select(contains("Sepal"), Species) %>%
group_by(Species)%>%
...
データの前処理は他にも…
• {dplyr}
do, 各種Window関数
• {tidyr}
gather, spreadなど縦型と横型の変換について
• {lubridate}
日付データの扱い
• {purrr}
リストデータの処理
20...
結論
パッケージを使って
柔軟かつ高速な前処理を!!
2016/6/19 Tokyo.R #54 43
参考文献
• データの読み込みについて
表形式ファイルの読み込み関数あれこれ: readrパッケージの導入を兼ねて
文字化けこわい、こわくない?
readr,haven,readxl
R:read.csv / read.tableで型と列名を指...
参考文献
• データの処理に関して
dplyrを使いこなす!基礎編
dplyrを使いこなす!Window関数編
dplyrを使いこなす!JOIN編
Rの data.table と data.frame を dplyr で区別なく扱う
R dpl...
Enjoy !
46
Nächste SlideShare
Wird geladen in …5
×

2016年6月版データマエショリスト入門

Tokyo.R #54
データの読み込みからdplyrの基本まで

  • Loggen Sie sich ein, um Kommentare anzuzeigen.

2016年6月版データマエショリスト入門

  1. 1. 2016年上半期版 データ・マエショリスト入門 データの読み込みから{dplyr}の基本まで @y__mattu 12016/6/19 Tokyo.R #54
  2. 2. 自己紹介 • 松村優哉 @y__mattu • ブログ:http://y-mattu.hatenablog.com/ • 大学4年生 • 勉強している分野:統計学、マーケティング • 言語:SAS, R • R歴:1年半くらい 22016/6/19 Tokyo.R #54
  3. 3. データ分析の流れ 2016/6/19 Tokyo.R #54 3 データ取得 前処理 可視化・モデリング
  4. 4. データ分析の流れ 2016/6/19 Tokyo.R #54 4 データ取得 前処理 可視化・モデリング Webから取得 (スクレイピング) 外部ファイル (csv, tsv, Excel,…) データベース (SQL)
  5. 5. データ分析の流れ 2016/6/19 Tokyo.R #54 5 データ取得 前処理 可視化・モデリング 集計 マージ 型変換 絞り込み
  6. 6. データ分析の流れ 2016/6/19 Tokyo.R #54 データ取得 前処理 可視化・モデリング 散布図 ヒストグラム 箱ひげ図 回帰分析 (重回帰、ロジスティック、…) ランダムフォレスト サポートベクトルマシン
  7. 7. 今日扱うのはここ 2016/6/19 Tokyo.R #54 7 前処理 可視化・モデリング 集計 マージ 型変換 絞り込み データ取得 外部ファイル (csv, tsv, Excel,…)
  8. 8. データの読み込みの前に 2016/6/19 Tokyo.R #54 8 setwd(“/Volumes/YUYA_USB/TokyoR/54”) #ディレクトリの指定
  9. 9. データの読み込み(CSV) • パッケージを使わない場合 • 高速な読み込み1 • 高速な読み込み2 2016/6/19 Tokyo.R #54 9 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として扱いたい場合は追加 おまじない
  10. 10. データの読み込み速度比較 2016/6/19 Tokyo.R #54 10 csvファイル(log.csv) 約500MB 約350万行×5列の簡単なログデータ 検証環境 Mac OS 10.11.5 Corei7 メモリ16GB R 3.3.0
  11. 11. データの読み込み速度比較 2016/6/19 Tokyo.R #54 11 > 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
  12. 12. データの読み込み(TSV) • パッケージを使わない場合 • {readr} • {data.table} 2016/6/19 Tokyo.R #54 12 dat <- read.delim(“sample.tsv”, strringAsFactors=FALSE, sep = “¥t”) dat <- readr::read_tsv(“sample.tsv”) dat <- data.table::fread(“sample.tsv”, data.table = FALSE)
  13. 13. データの読み込み(その他の区切り値) • パッケージを使わない場合 • {readr} • {data.table} 2016/6/19 Tokyo.R #54 13 dat <- read.table(“sample.tsv”, strringAsFactors=FALSE, sep = “|”) dat <- readr::read_delim(“sample”, “|”) dat <- data.table::fread(“sample”)
  14. 14. データの読み込み(Excel) • Excelを読み込めるパッケージ {xlsx}, {gdata}, {XLConnect}, {openxlsx}, {redxl} 爆速、かつ文字コードや日付の処理も完璧にやってくれる 2016/6/19 Tokyo.R #54 14 dat <- readxl::read_excel(“sample.xlsx”, sheet = “シート名”) #シート名は番号でもOK
  15. 15. エンコーディングを指定したい • Windowsの文字コードはShift-JIS(CP932) • Macの文字コードはUTF8 • Windowsで作られた(日本語を含む)ファイルをMacで読む ときはEncoding=“CP932” • Macで作られた(日本語を含む)ファイルをWindowsで読む ときはEncoding=“UTF8” 2016/6/19 Tokyo.R #54 15
  16. 16. エンコーディング(例:CSVをCP932で) • パッケージを使わない場合 • {readr} • {data.table} 2016/6/19 Tokyo.R #54 16 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"))
  17. 17. いよいよデータの前処理 • みんな大好きirisデータ • アヤメの3種(setosa, vrisicolor, verginica)についてsepal (がく片)とpetal(花弁)の長さ(length)と幅(width)を 測ったデータセット 2016/6/19 Tokyo.R #54 17 Setosa Versicolor Verginica d <- iris
  18. 18. データの構造を確認 • Rの標準関数 • {dplyr} 2016/6/19 Tokyo.R #54 18 > 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...
  19. 19. データの構造を確認 • Rstudioだと 2016/6/19 Tokyo.R #54 19
  20. 20. データの構造を確認 • Rstudioだとstr()の中身が表示される 2016/6/19 Tokyo.R #54 20
  21. 21. データの構造を確認 • summary関数で要約統計量 2016/6/19 Tokyo.R #54 21 > 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
  22. 22. 集計してみる • Rの標準関数 2016/6/19 Tokyo.R #54 22 > table(d$Species) # setosa versicolor virginica # 50 50 50
  23. 23. 集計してみる • {dplyr} 2016/6/19 Tokyo.R #54 23 > 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関数 の中でカウント
  24. 24. 変数を追加したい1(例:花弁の縦横比) • Rの標準関数 または 2016/6/19 Tokyo.R #54 24 transform(d, petal.w.l = d$Petal.Length / d$Petal.Width) d$petal.w.l = d$Petal.Length / d$Petal.Width
  25. 25. 変数を追加したい1(例:花弁の縦横比) • {dplyr} 2016/6/19 Tokyo.R #54 25 dplyr::mutate(d, petal.w.l = Petal.Length / Petal.Width)
  26. 26. ダミー変数も作れる 2016/6/19 Tokyo.R #54 26 species_dummy <- d %>% mutate(category = factor(Species, levels=c(“setosa”, “virginica”, “versicolor”), labels=LETTERS[1:3]))
  27. 27. 特定の列だけを取り出したい 例:Lengthにしか興味がないとき • パッケージを使わない 2016/6/19 Tokyo.R #54 27 iris_length <- d[,c(1,3)] #列番号で直接指定
  28. 28. 特定の列だけを取り出したい 例:Lengthにしか興味がないとき • {dplyr} • 他にも、特定の変数を抜いたりもできる 2016/6/19 Tokyo.R #54 28 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”が含まれる列を選択 大文字、小文字を区別しない
  29. 29. 特定の行を取り出したい setosaのみ, 長さx以上, etc… • Rの標準関数 2016/6/19 Tokyo.R #54 29 iris_setosa <- subset(d, Species == “setosa”) #条件を指定 iris5 <- iris5 <- subset(d, Sepal.Length > 5.0) #条件を指定
  30. 30. 特定の行を取り出したい setosaのみ, 長さx以上, etc… • {dplyr} • 複数条件も可能 (参考文献「dplyrを使いこなす!基礎編」を参照) 2016/6/19 Tokyo.R #54 30 iris_setosa <- filter(d, Species == “setosa”) #条件を指定 iris5 <- filter(d, Sepal.Length > 5.0) #条件を指定
  31. 31. ソートしたい • パッケージを使わない 2016/6/19 Tokyo.R #54 31 length_asc <- d[order(d[, 2]), ] #2列目(Sepal.Width)基準に昇順 length_desc <- d[order(d[, 2], decreasing = T), ] #降順
  32. 32. ソートしたい • {dplyr} 2016/6/19 Tokyo.R #54 32 length_asc <- arrange(d, Sepal.Width) #Sepal.Width基準に昇順 length_desc <- arrange(d, descending(Sepal.Width)) #降順
  33. 33. 2016/6/19 Tokyo.R #54 33 いったんIrisから離れて…
  34. 34. テーブルをマージしたい • 複数のテーブルの組み合わせ 2016/6/19 Tokyo.R #54 34 引用:「dplyrを使いこなす!JOIN編」
  35. 35. テーブルをマージしたい(inner_join) 2016/6/19 Tokyo.R #54 35 ab_inner<- inner_join(a, b, by = “x1”) 引用:「dplyrを使いこなす!JOIN編」
  36. 36. テーブルをマージしたい(left_join) 2016/6/19 Tokyo.R #54 36 ab_left <- left_join(a, b, by = “x1”) 引用:「dplyrを使いこなす!JOIN編」
  37. 37. テーブルをマージしたい(full_join) 2016/6/19 Tokyo.R #54 37 ab_full <- full_join(a, b, by = “x1”) 引用:「dplyrを使いこなす!JOIN編」
  38. 38. テーブルをマージしたい(anti_join) 2016/6/19 Tokyo.R #54 38 ab_anti <- anti_join(a, b, by = “x1”) 引用:「dplyrを使いこなす!JOIN編」
  39. 39. なぜ{dplyr}なのか • 速い • 依存パッケージ{magrittr}により%>%が使える • %>%を使わないと 2016/6/19 Tokyo.R #54 39 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
  40. 40. なぜ{dplyr}なのか • 出力(種類ごとにがく片の平均値を算出) 2016/6/19 Tokyo.R #54 40 > 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
  41. 41. なぜ{dplyr}なのか • %>%を使うと 2016/6/19 Tokyo.R #54 41 d <- iris %>% select(contains("Sepal"), Species) %>% group_by(Species)%>% summarise(s.w.mean = mean(Sepal.Width), s.l.mean = mean(Sepal.Length)) d
  42. 42. データの前処理は他にも… • {dplyr} do, 各種Window関数 • {tidyr} gather, spreadなど縦型と横型の変換について • {lubridate} 日付データの扱い • {purrr} リストデータの処理 2016/6/19 Tokyo.R #54 42
  43. 43. 結論 パッケージを使って 柔軟かつ高速な前処理を!! 2016/6/19 Tokyo.R #54 43
  44. 44. 参考文献 • データの読み込みについて 表形式ファイルの読み込み関数あれこれ: readrパッケージの導入を兼ねて 文字化けこわい、こわくない? readr,haven,readxl R:read.csv / read.tableで型と列名を指定して読み込む。 R で tsv ファイルの読み込み RでExcelのデータを読む方法 2016/6/19 Tokyo.R #54 44
  45. 45. 参考文献 • データの処理に関して dplyrを使いこなす!基礎編 dplyrを使いこなす!Window関数編 dplyrを使いこなす!JOIN編 Rの data.table と data.frame を dplyr で区別なく扱う R dplyr, tidyr でのグルーピング/集約/変換処理まとめ {tidyr}でよく使う関数のメモ Hadley Ecosystem 2016 • その他 irisの正体 2016/6/19 Tokyo.R #54 45
  46. 46. Enjoy ! 46

×