「ビジネス活用事例で学ぶ
データサイエンス入門」輪読会 #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

More Related Content

PPTX
「ビジネス活用事例で学ぶ データサイエンス入門」輪読会#7資料
PDF
[データマイニング+WEB勉強会][R勉強会] はじめてでもわかる 統計解析・データマイニング R言語入門
PDF
Rユーザのためのspark入門
PDF
20120405 setsunaセミナー
PDF
RedisのBitCountとHyperLogLogを使用した超高速Unique User数集計
PDF
NIPS 2012 読む会
PDF
データベース09 - データベース設計
PDF
データ入力が終わってから分析前にすること
「ビジネス活用事例で学ぶ データサイエンス入門」輪読会#7資料
[データマイニング+WEB勉強会][R勉強会] はじめてでもわかる 統計解析・データマイニング R言語入門
Rユーザのためのspark入門
20120405 setsunaセミナー
RedisのBitCountとHyperLogLogを使用した超高速Unique User数集計
NIPS 2012 読む会
データベース09 - データベース設計
データ入力が終わってから分析前にすること

What's hot (20)

PDF
気象庁XMLのSPARQL APIを利用してデータを俯瞰しよう -SPARQLとRによる可視化-
PDF
データベース11 - データベースとプログラム
PDF
Big Data Bootstrap (ICML読み会)
PPTX
さくっとはじめるテキストマイニング(R言語)  スタートアップ編
PDF
DeltaCubeにおけるユニークユーザー集計高速化(理論編)
PDF
ルールベースから機械学習への道 公開用
PDF
SQLアンチパターン(インデックスショットガン)
PDF
Rあんなときこんなとき(tokyo r#12)
PDF
20140708 オンラインゲームソリューション
PDF
Deep Learningハンズオン勉強会「Caffeで画像分類を試してみようの会」
PPTX
機械学習 / Deep Learning 大全 (2) Deep Learning 基礎編
PDF
最近のRのランダムフォレストパッケージ -ranger/Rborist-
PDF
オンラインゲームソリューション@トレジャーデータ
PDF
Infer.NETを使ってLDAを実装してみた
PDF
使ってみませんか?pg hint_plan
PPTX
エンジニアのための機械学習の基礎
PPTX
データサイエンティスト必見!M-1グランプリ
PDF
MySQL のユーザー定義変数と RDB のココロ
PPTX
Jubatus使ってみた 作ってみたJubatus
PPTX
R超入門機械学習をはじめよう
気象庁XMLのSPARQL APIを利用してデータを俯瞰しよう -SPARQLとRによる可視化-
データベース11 - データベースとプログラム
Big Data Bootstrap (ICML読み会)
さくっとはじめるテキストマイニング(R言語)  スタートアップ編
DeltaCubeにおけるユニークユーザー集計高速化(理論編)
ルールベースから機械学習への道 公開用
SQLアンチパターン(インデックスショットガン)
Rあんなときこんなとき(tokyo r#12)
20140708 オンラインゲームソリューション
Deep Learningハンズオン勉強会「Caffeで画像分類を試してみようの会」
機械学習 / Deep Learning 大全 (2) Deep Learning 基礎編
最近のRのランダムフォレストパッケージ -ranger/Rborist-
オンラインゲームソリューション@トレジャーデータ
Infer.NETを使ってLDAを実装してみた
使ってみませんか?pg hint_plan
エンジニアのための機械学習の基礎
データサイエンティスト必見!M-1グランプリ
MySQL のユーザー定義変数と RDB のココロ
Jubatus使ってみた 作ってみたJubatus
R超入門機械学習をはじめよう
Ad

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

PPTX
TensorFlowをもう少し詳しく入門
PDF
初心者講習会資料(Osaka.R#7)
PDF
DTrace for biginners part(2)
PDF
Tokyor23 doradora09
PDF
初心者講習会資料(Osaka.r#6)
PDF
開発中 3Dプリント API for Flash の 紹介 【as3sculpteo】
PDF
Oracle Cloud Developers Meetup@東京
PDF
初心者講習会資料(Osaka.R#5)
PDF
Inside of Asakusa DSL
PDF
[AI08] 深層学習フレームワーク Chainer × Microsoft で広がる応用
PDF
Flutterを体験してみませんか
PDF
今日からできる!簡単 .NET 高速化 Tips
PDF
Djangoフレームワークの紹介
PDF
R言語勉強会#4.pdf
PDF
20190119 aws-study-pg-extension
PDF
「Grails-1.1を斬る!〜Grails-1.1からのチーム開発〜」
PDF
RのffでGLMしてみたけど...
PDF
[db tech showcase Tokyo 2014] B26: PostgreSQLを拡張してみよう by SRA OSS, Inc. 日本支社 高塚遥
PDF
R言語勉強会#5.pdf
PDF
第2回品川Redmine勉強会(日本語全文検索)
TensorFlowをもう少し詳しく入門
初心者講習会資料(Osaka.R#7)
DTrace for biginners part(2)
Tokyor23 doradora09
初心者講習会資料(Osaka.r#6)
開発中 3Dプリント API for Flash の 紹介 【as3sculpteo】
Oracle Cloud Developers Meetup@東京
初心者講習会資料(Osaka.R#5)
Inside of Asakusa DSL
[AI08] 深層学習フレームワーク Chainer × Microsoft で広がる応用
Flutterを体験してみませんか
今日からできる!簡単 .NET 高速化 Tips
Djangoフレームワークの紹介
R言語勉強会#4.pdf
20190119 aws-study-pg-extension
「Grails-1.1を斬る!〜Grails-1.1からのチーム開発〜」
RのffでGLMしてみたけど...
[db tech showcase Tokyo 2014] B26: PostgreSQLを拡張してみよう by SRA OSS, Inc. 日本支社 高塚遥
R言語勉強会#5.pdf
第2回品川Redmine勉強会(日本語全文検索)
Ad

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