53
「ビジネス活用事例で学ぶ データサイエンス入門」輪読会 #5 53 PAGES Shintaro Nomura R 2016.03.25 @ Akiba Code

「ビジネス活用事例で学ぶ データサイエンス入門」輪読会#5資料

Embed Size (px)

Citation preview

Page 1: 「ビジネス活用事例で学ぶ データサイエンス入門」輪読会#5資料

「ビジネス活用事例で学ぶデータサイエンス入門」輪読会 #5

53 PAGES

Shintaro Nomura

R で 学 ぶ

2016.03.25 @ Akiba Code

Page 2: 「ビジネス活用事例で学ぶ データサイエンス入門」輪読会#5資料

Rのダウンロード

「r download」で検索

(3/25時点での最新版は 3.2.3 です。)

または

http://j.mp/downloadr を参照

すでにインストールしていた方は3.2.3へ

の更新をオススメします

2

Page 3: 「ビジネス活用事例で学ぶ データサイエンス入門」輪読会#5資料

本書で用いるデータ

「DL76333.zip」が以下にあります

http://www.sbcr.jp/support/11915.html

zipファイルを解凍したファイルは、

作業ディレクトリに入れるとラクですよ

3

Page 4: 「ビジネス活用事例で学ぶ データサイエンス入門」輪読会#5資料

作業ディレクトリって?

データが入ったテキストファイル等から、データや

プログラムを読みこんだり、画像を書き出したりし

ます。これらのファイルのある場所を「作業ディレ

クトリ」といいます。

データは作業ディレクトリに入っていると便利!

作業ディレクトリを変えたいときは、

「File > Change dir…(ディレクトリの変更)」

またはコマンド: setwd(“C:/指定先”)

4

Page 5: 「ビジネス活用事例で学ぶ データサイエンス入門」輪読会#5資料

データ分析の模範フロー(復習)

現状と

あるべ

き姿

問題

発見

データ

収集と

加工

データ

分析

アク

ション

5

ギャップから問題の構造を把握

Page 6: 「ビジネス活用事例で学ぶ データサイエンス入門」輪読会#5資料

現状とあるべき姿(1)

現状と

あるべ

き姿

問題

発見

データ

収集と

加工

データ

分析

アク

ション

6

ギャップから問題の構造を把握

Page 7: 「ビジネス活用事例で学ぶ データサイエンス入門」輪読会#5資料

現状とあるべき姿(2)

現状

携帯電話(FP)のユーザ減

少量と比較して、スマホ

(SP)ユーザの増加量が少

ないように感じる

もしかしたら、ID移行に

失敗しているのでは…?

あるべき姿

携帯電話(FP)のユーザ減

少を、スマホ(SP)ユーザ

の増加量で補う状態

FP→SPへのユーザの移行

に成功している

7

今回の「仮説」

Page 8: 「ビジネス活用事例で学ぶ データサイエンス入門」輪読会#5資料

分析結果によるアクション決定

現状と

あるべ

き姿

問題

発見

データ

収集と

加工

データ

分析

アク

ション

8

ギャップから問題の構造を把握

Page 9: 「ビジネス活用事例で学ぶ データサイエンス入門」輪読会#5資料

把握した問題と、分析による対応

ID移行失敗の影響=大

他の開発案件を中止し、

ID移行システムの改修や

UIの改善に注力

ID移行失敗の影響=小

ID移行システムの改修よ

りも、スマホ(SP)向けプ

ロモーション施策を見直

す(広告予算増など)

9

Page 10: 「ビジネス活用事例で学ぶ データサイエンス入門」輪読会#5資料

では、分析ロジックは?

現状と

あるべ

き姿

問題

発見

データ

収集と

加工

データ

分析

アク

ション

10

ギャップから問題の構造を把握

Page 11: 「ビジネス活用事例で学ぶ データサイエンス入門」輪読会#5資料

今回の分析ロジック

ID移行失敗の影響=大

ID移行の失敗による「離

脱」ユーザが、自然離脱に

比べて非常に多くなる

離脱ユーザと移行失敗ユー

ザとの間の1月アクセス状

況に差異がなくなる

ID移行失敗の影響=小

ID移行の失敗による「離

脱」ユーザが、自然離脱

に比べて少ない

両者のアクセス数の差異

がはっきり出る!

11

Page 12: 「ビジネス活用事例で学ぶ データサイエンス入門」輪読会#5資料

今回の分析ロジック(2)

ID移行失敗の影響=大 ID移行失敗の影響=小

12

Page 13: 「ビジネス活用事例で学ぶ データサイエンス入門」輪読会#5資料

そんなの無理筋じゃない?

ID移行失敗の影響=大 ID移行失敗の影響=小

13

・「アクセス数が多い離脱」が増えたら「モデルを作れない」…?・モデルが作れたら「ID移行失敗による離脱が大きい可能性…?

Page 14: 「ビジネス活用事例で学ぶ データサイエンス入門」輪読会#5資料

ちょっと言ってる意味分からないです

そもそもその「モデル」の構築手法を誤って

いたら、結論だって誤りますよね

仕方ないので以下では、引き続きテキストを使

用して、

データ加工の手法

「ロジスティック回帰」とは何か

について進めていきます

14

Page 15: 「ビジネス活用事例で学ぶ データサイエンス入門」輪読会#5資料

CSVファイルを読み込む(復習)

dau <- ***

xという入れ物に数値や文字列、ベクトルや

関数、データなどを入れます

dau <- read.csv(“***.csv”)

dauにcsvファイルのデータを取り込みます

head(***)

***データの先頭数行を表示します

15

Page 16: 「ビジネス活用事例で学ぶ データサイエンス入門」輪読会#5資料

移行した人かどうかデータの整理

unique(AA[ , c(“XX”, “YY”, “ZZ”))

ベクトルc( )の内容にダブりがある場合、そ

れらの重複を排除して1行にまとめる

mau <- unique (dau[, c(“region_month”,

“device”, “user_id”)])

※31日分のユーザデータの重複を排除し、整

理された「mau」というデータに加工する

16

Page 17: 「ビジネス活用事例で学ぶ データサイエンス入門」輪読会#5資料

データの整理(2)

fp.mau <- unique (dau[dau$device=="FP",

c("region_month", "device", "user_id")])

・dauの「device」列が

”FP”のデータだけ

集める

(“SP”も同様に行う)

17

Page 18: 「ビジネス活用事例で学ぶ データサイエンス入門」輪読会#5資料

1月と2月にデータを分ける

fp.mau1 <- fp.mau[fp.mau$region_month

== “2013-01”, ]

・前ページ踏まえればなんとなく分かる気

がする

このデータをFP・SP、1月・2月で計4

種類作成します

18

Page 19: 「ビジネス活用事例で学ぶ データサイエンス入門」輪読会#5資料

1月と2月に分ける(2)

fp.mau1 <- fp.mau[fp.mau$region_month

== “2013-01”, ]

fp.mau2 <- fp.mau[fp.mau$region_month

== "2013-02", ]

sp.mau1 <- sp.mau[sp.mau$region_month

== "2013-01", ]

sp.mau2 <- sp.mau[sp.mau$region_month

== "2013-02", ]

19

Page 20: 「ビジネス活用事例で学ぶ データサイエンス入門」輪読会#5資料

1月FP利用→2月にアクセスがあるか

mauの「is_access」列に「1」を挿入する

新「mau」に加工

20

Page 21: 「ビジネス活用事例で学ぶ データサイエンス入門」輪読会#5資料

1月FP→翌月アクセスあるか(2)

fp.mau1 <- merge(fp.mau1,

mau[mau$region_month == “2013-02”,

c(“user_id”, “is_access”)], by = “user_id”, all.x =

T)

◎新「mau」のregion_monthが2013-02であ

るデータと、旧fp.mau1(ガラケー・1月ア

クセス)とをuser_idに紐付けてマージする

21

Page 22: 「ビジネス活用事例で学ぶ データサイエンス入門」輪読会#5資料

1月FP→翌月アクセスあるか(3)

is_access=1の user_id→2月アクセスあり

is_accessが欠損値(N/A)→2月アクセスなし

22

Page 23: 「ビジネス活用事例で学ぶ データサイエンス入門」輪読会#5資料

1月FP→翌月アクセスあるか(4)

fp.mau1$is_access[is.na(fp.mau1$is_access)

] <- 0

◎欠損値だと不都合があるので、新

「fp.mau1」のis_accessが空白(na)である

データに「0」を代入する

23

Page 24: 「ビジネス活用事例で学ぶ データサイエンス入門」輪読会#5資料

1月携帯利用→2月携帯利用かどうか

fp.mau2$is_fp <- 1

fp.mau1 <- merge(fp.mau1, fp.mau2[,

c("user_id", "is_fp")], by = "user_id", all.x = T)

◎旧「fp.mau2(携帯・2月アクセスあり)」

データに「is_fp」列を加え、そこに1を代入

◎新「fp.mau1」と新「fp.mau2」を先程と同

様にマージさせる

◎その後、欠損値に「0」を代入(上では省略)

24

Page 25: 「ビジネス活用事例で学ぶ データサイエンス入門」輪読会#5資料

1月携帯利用→2月SP利用かどうか

sp.mau2$is_sp <- 1

fp.mau1 <- merge(fp.mau1, sp.mau2[,

c(“user_id”, “is_sp”)], by = "user_id", all.x = T)

◎「sp.mau2(スマホ・2月アクセスあり)」

データに「is_sp」列を加え、そこに1を代入

◎新「fp.mau1」と新「sp.mau2」を先程と同

様にマージさせる

◎その後、欠損値に「0」を代入(上では省略)

25

Page 26: 「ビジネス活用事例で学ぶ データサイエンス入門」輪読会#5資料

「1月携帯利用」データの加工状況

is_fp (携帯・2月アクセスあり)

is_sp(スマホ・2月アクセスあり)

26

Page 27: 「ビジネス活用事例で学ぶ データサイエンス入門」輪読会#5資料

1月携帯利用→翌月ナシorSP利用

fp.mau1 <-

fp.mau1[fp.mau1$is_access == 0 |

fp.mau1$is_sp == 1, ]

◎2月アクセス=「なし」

◎“|”は「または(OR)」

◎スマホ・2月アクセス=「あり」

のみのデータに「fp.mau1」を再加工

27

Page 28: 「ビジネス活用事例で学ぶ データサイエンス入門」輪読会#5資料

月次データの前処理が完了

1月携帯電話利用で2月は利用なし、ある

いはスマートフォン利用があったユーザ

28

Page 29: 「ビジネス活用事例で学ぶ データサイエンス入門」輪読会#5資料

次に、日次アクセスデータを整える

fp.dau1 <- dau[dau$device == "FP" &

dau$region_month == "2013-01", ]

fp.dau1$is_access <- 1

◎”dau”の中で「1月携帯アクセスあり」

データを取り出し、その「is_access」に

“1”フラグを立てる

29

Page 30: 「ビジネス活用事例で学ぶ データサイエンス入門」輪読会#5資料

日次アクセスデータを整える(2)

「fp.dau1」:”region_day”にアクセス日

データがYYYY-MM-DD形式で入っている

分析には使いづらいのでさらに加工

30

Page 31: 「ビジネス活用事例で学ぶ データサイエンス入門」輪読会#5資料

dcast関数:復習(p.81)

dcast(AAA, XX ~ YY + ZZ, value.var=”CCC”,

length)

◎AAAデータから縦軸をXX、横軸をYY×ZZ

のクロス集計を算出

◎集計値は“CCC”の値

※reshape2の読み込みが必須です

31

Page 32: 「ビジネス活用事例で学ぶ データサイエンス入門」輪読会#5資料

dcast関数(説明は省略)

dcast(data, formula, fun.aggregate=NULL, ..., margins=NULL, subset=NULL,

fill=NULL, drop=TRUE, value.var=guess_value(data))

◎data:melt() されたような形でカテゴリ変数を含む data.frame

◎formula:x_var ~ y_var ~ z_var ~ ... のような形で出力形式を指定

◎fun.aggregate=NULL:mean や sum など、整形後に同じマスに来る複数の

値に適用する関数。デフォルトでは length が働いて要素数が得られる。

◎...:aggregate関数への引数を渡せる

◎margins=NULL:列全体の平均や行全体の和などを追加するかどうか

◎subset=NULL:適用範囲を限定する e.g., subset=.(variable=="length")

◎fill=NULL

◎drop=TRUE

◎value.var=guess_value(data)

http://meme.biology.tohoku.ac.jp/students/iwasaki/rstats/reshape2.html

32

Page 33: 「ビジネス活用事例で学ぶ データサイエンス入門」輪読会#5資料

日次アクセスデータを整える(3)

library(reshape2)

fp.dau1.cast <- dcast(fp.dau1, user_id ~

region_day, value.var = "is_access",

function(x) as.character(length(x)))

◎今回、function(x)以降は省略できそうです

33

Page 34: 「ビジネス活用事例で学ぶ データサイエンス入門」輪読会#5資料

日次アクセスデータを整える(4)

「fp.dau1.cast」の整理が完了しました

34

Page 35: 「ビジネス活用事例で学ぶ データサイエンス入門」輪読会#5資料

日次アクセスデータを整える(5)

names(fp.dau1.cast)[-1] <- paste0("X", 1:31,

"day")

◎”fp.dau1.cast”の1列目を除くラベル(項

目名)を、「X1day」から「X31day」に変

更します

◎「paste0」は文字列を結合する関数です

35

Page 36: 「ビジネス活用事例で学ぶ データサイエンス入門」輪読会#5資料

日次データの前処理が完了

日次データ最終版

36

Page 37: 「ビジネス活用事例で学ぶ データサイエンス入門」輪読会#5資料

最後に日次データと月次データの結合

fp.dau1.cast <- merge(fp.dau1.cast,

fp.mau1[, c(“user_id”, “is_sp”)], by =

"user_id")

◎”fp.dau1.cast”データと”fp.mau1”内の

「is_sp(2月スマホアクセスあり)」データ

とを、user_idに紐付けて結合します

37

Page 38: 「ビジネス活用事例で学ぶ データサイエンス入門」輪読会#5資料

分析のための収集データ加工が完了

「 fp.dau1.cast」最終版(最右列に注目)

38

Page 39: 「ビジネス活用事例で学ぶ データサイエンス入門」輪読会#5資料

table関数による要素の個数集計

table(fp.dau1.cast$is_sp)

◎”fp.dau1.cast”の「is_sp」には「0」が190

名分、「1」が62名分のデータが入ってい

ることが確認できます

39

0 1

190 62

Page 40: 「ビジネス活用事例で学ぶ データサイエンス入門」輪読会#5資料

ここまで完了したことになります

現状と

あるべ

き姿

問題

発見

データ

収集と

加工

データ

分析

アク

ション

40

ギャップから問題の構造を把握

Page 41: 「ビジネス活用事例で学ぶ データサイエンス入門」輪読会#5資料

ようやく前処理から分析へ

現状と

あるべ

き姿

問題

発見

データ

収集と

加工

データ

分析

アク

ション

41

ギャップから問題の構造を把握

Page 42: 「ビジネス活用事例で学ぶ データサイエンス入門」輪読会#5資料

今回用いる分析

ロジスティック回帰分析(画像出典)

42

Page 43: 「ビジネス活用事例で学ぶ データサイエンス入門」輪読会#5資料

こないだの回帰分析と何が違うの?

ロジスティック回帰分析

𝑦 =1

1+𝑒−( 𝑎𝑖𝑥𝑖+𝑏)に回帰

質的データに用いる

yのとる値はxがなんで

あっても0~1

任意のxに対するyが0か

1かの予測に利用できる

重回帰分析

𝑦 = 𝑎𝑖𝑥𝑖 + 𝑏に回帰

量的データに用いる

左記のような0~1の間に

yが入らないことも多々あ

るため、基本的に質的

データの予測には用いな

43

Page 44: 「ビジネス活用事例で学ぶ データサイエンス入門」輪読会#5資料

ロジスティック回帰分析

ロジスティック回帰分析

𝑦 =1

1+𝑒−( 𝑎𝑖𝑥𝑖+𝑏)に回帰

質的データに用いる

yのとる値はxがなんで

あっても0~1

任意のxに対するyが0か

1かの予測に利用できる

重回帰分析

𝑦 = 𝑎𝑖𝑥𝑖 + 𝑏に回帰

量的データに用いる

左記のような0~1の間に

yが入らないことも多々あ

るため、基本的に質的

データの予測には用いな

44

Page 45: 「ビジネス活用事例で学ぶ データサイエンス入門」輪読会#5資料

ロジスティック回帰分析(2)

任意のxに対するyが0か1かの予測に利用

できる

移行:y = 1 / 離脱:y = 0

今回作成したモデルにより、1月携帯ア

クセスのある各IDが、スマートフォンに

移行しているであろう確率を推定する

y > 0.5 なら移行IDと判定!

45

Page 46: 「ビジネス活用事例で学ぶ データサイエンス入門」輪読会#5資料

ロジスティック回帰分析(3)

理論面を学習するには、「尤度(ゆう

ど)」などの概念を理解する必要があり

ます。

テキストはRの計算を利用できれば良いと

いう程度のスタンスなので、スライドで

も深入りはしません。

46

Page 47: 「ビジネス活用事例で学ぶ データサイエンス入門」輪読会#5資料

分析用データをロジ回帰させる

fit.logit <- step(glm(is_sp ~ ., data =

fp.dau1.cast[, -1], family = binomial))

重回帰分析の考え方を思い出しながら、

以下の回帰を行う

47

説明変数(x) 被説明変数(y)

X1day~X31day is_sp

「ロジスティック回帰を行う」

Page 48: 「ビジネス活用事例で学ぶ データサイエンス入門」輪読会#5資料

step()について

前ページの内容で、ロジスティック回帰自体

は glm( … , family = binominal ) で出来ている

step()を用いることで、 AIC(赤池情報量規

準)の値を利用して、説明変数が多すぎる問

題を緩和(変数選択)させながらロジス

ティック回帰分析を行える

テキストでもAICは名前くらいしか教えてい

ないので、ここでも説明しません

48

※AICの理解にも尤度の理解が必須です

Page 49: 「ビジネス活用事例で学ぶ データサイエンス入門」輪読会#5資料

モデルの作成

summary(fit.logit)

分析結果のサマリーを表示

step()は以下のモデルを選びました

glm(formula = is_sp ~ X1day + X4day + X5day +

X7day + X10day + X13day + X22day + X29day +

X31day, family = binomial, data = fp.dau1.cast[, -

1])

説明変数にはX1day~X31dayすべてを用いるので

はなく、上記緑色部分を選択しました

49

※各回帰係数の推定量はサマリを参照

Page 50: 「ビジネス活用事例で学ぶ データサイエンス入門」輪読会#5資料

作成したモデルによる予測

fp.dau1.cast$prob <- round(fitted(fit.logit), 2)

“fp.dau1.cast”に「prob」項目を作成し、

fit.logitの予測値(fitted)を返します

fp.dau1.cast$pred <- ifelse(fp.dau1.cast$prob

> 0.5, 1, 0)

“fp.dau1.cast”の「prob」項目が0.5を超える

IDの「pred」項目には1を返します(スマホ

移行(予測)と判定)

50

Page 51: 「ビジネス活用事例で学ぶ データサイエンス入門」輪読会#5資料

予測結果の表示

head(fp.dau1.cast)

prob > 0.5 に「1」、それ以外に「0」が

振られているのを確認できます

51

Page 52: 「ビジネス活用事例で学ぶ データサイエンス入門」輪読会#5資料

モデル予測の正解率

table(fp.dau1.cast[, c(“is_sp”, “pred”)])

モデル予測の正解率(青いとこ)

=(180+42) / (180+10+20+42)

= 0.8809524

より正確には(将来)予測ではなく、実測データのみからの

回帰なので、正解率が高いのは当たり前

52

実測\予測 移行 離脱

移行 180 10

離脱 20 42

Page 53: 「ビジネス活用事例で学ぶ データサイエンス入門」輪読会#5資料

さいごに

テキストでは前ページでの高い正解率により、

「信頼のできるモデル構築ができた」

→なので「移行失敗の影響は小さい」

というロジックでの仮説検証を行っていますが、

序盤でも述べましたように、この分析ルーティ

ン自体は見なかったことにした方が良いのでは

と思います

53