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

Post on 16-Apr-2017

283 Views

Category:

Data & Analytics

0 Downloads

Preview:

Click to see full reader

Transcript

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

53 PAGES

Shintaro Nomura

R で 学 ぶ

2016.03.25 @ Akiba Code

Rのダウンロード

「r download」で検索

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

または

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

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

の更新をオススメします

2

本書で用いるデータ

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

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

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

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

3

作業ディレクトリって?

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

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

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

クトリ」といいます。

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

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

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

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

4

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

現状と

あるべ

き姿

問題

発見

データ

収集と

加工

データ

分析

アク

ション

5

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

現状とあるべき姿(1)

現状と

あるべ

き姿

問題

発見

データ

収集と

加工

データ

分析

アク

ション

6

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

現状とあるべき姿(2)

現状

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

少量と比較して、スマホ

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

ないように感じる

もしかしたら、ID移行に

失敗しているのでは…?

あるべき姿

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

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

の増加量で補う状態

FP→SPへのユーザの移行

に成功している

7

今回の「仮説」

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

現状と

あるべ

き姿

問題

発見

データ

収集と

加工

データ

分析

アク

ション

8

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

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

ID移行失敗の影響=大

他の開発案件を中止し、

ID移行システムの改修や

UIの改善に注力

ID移行失敗の影響=小

ID移行システムの改修よ

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

ロモーション施策を見直

す(広告予算増など)

9

では、分析ロジックは?

現状と

あるべ

き姿

問題

発見

データ

収集と

加工

データ

分析

アク

ション

10

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

今回の分析ロジック

ID移行失敗の影響=大

ID移行の失敗による「離

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

比べて非常に多くなる

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

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

況に差異がなくなる

ID移行失敗の影響=小

ID移行の失敗による「離

脱」ユーザが、自然離脱

に比べて少ない

両者のアクセス数の差異

がはっきり出る!

11

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

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

12

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

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

13

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

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

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

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

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

用して、

データ加工の手法

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

について進めていきます

14

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

dau <- ***

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

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

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

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

head(***)

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

15

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

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

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

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

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

“device”, “user_id”)])

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

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

16

データの整理(2)

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

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

・dauの「device」列が

”FP”のデータだけ

集める

(“SP”も同様に行う)

17

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

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

== “2013-01”, ]

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

がする

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

種類作成します

18

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

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

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

新「mau」に加工

20

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

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

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

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

22

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

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

] <- 0

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

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

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

23

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

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

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

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

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

26

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

fp.mau1 <-

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

fp.mau1$is_sp == 1, ]

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

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

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

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

27

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

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

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

28

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

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

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

fp.dau1$is_access <- 1

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

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

“1”フラグを立てる

29

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

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

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

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

30

dcast関数:復習(p.81)

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

length)

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

のクロス集計を算出

◎集計値は“CCC”の値

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

31

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

日次アクセスデータを整える(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

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

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

34

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

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

"day")

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

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

更します

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

35

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

日次データ最終版

36

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

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

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

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

38

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

table(fp.dau1.cast$is_sp)

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

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

ることが確認できます

39

0 1

190 62

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

現状と

あるべ

き姿

問題

発見

データ

収集と

加工

データ

分析

アク

ション

40

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

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

現状と

あるべ

き姿

問題

発見

データ

収集と

加工

データ

分析

アク

ション

41

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

今回用いる分析

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

42

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

ロジスティック回帰分析

𝑦 =1

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

質的データに用いる

yのとる値はxがなんで

あっても0~1

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

1かの予測に利用できる

重回帰分析

𝑦 = 𝑎𝑖𝑥𝑖 + 𝑏に回帰

量的データに用いる

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

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

るため、基本的に質的

データの予測には用いな

43

ロジスティック回帰分析

ロジスティック回帰分析

𝑦 =1

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

質的データに用いる

yのとる値はxがなんで

あっても0~1

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

1かの予測に利用できる

重回帰分析

𝑦 = 𝑎𝑖𝑥𝑖 + 𝑏に回帰

量的データに用いる

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

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

るため、基本的に質的

データの予測には用いな

44

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

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

できる

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

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

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

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

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

45

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

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

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

ます。

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

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

も深入りはしません。

46

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

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

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

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

以下の回帰を行う

47

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

X1day~X31day is_sp

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

step()について

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

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

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

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

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

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

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

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

48

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

モデルの作成

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

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

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

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

予測結果の表示

head(fp.dau1.cast)

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

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

51

モデル予測の正解率

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

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

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

= 0.8809524

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

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

52

実測\予測 移行 離脱

移行 180 10

離脱 20 42

さいごに

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

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

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

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

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

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

と思います

53

top related