ログ解析入門withr innovationeggno3

53
ログ解析入門 with R 2014/6/4 Innovation Egg 第三回 かわはら

Upload: hiroki84

Post on 07-Jul-2015

2.036 views

Category:

Technology


8 download

TRANSCRIPT

Page 1: ログ解析入門withR InnovationEggNo3

ログ解析入門 with R

2014/6/4 Innovation Egg 第三回

かわはら

Page 2: ログ解析入門withR InnovationEggNo3

ログ解析とR

解析…

重要なのは解析始めるまで…

Page 3: ログ解析入門withR InnovationEggNo3

ログ解析とR

解析…

http://nexal.jp/blogs/2384.html

重要なのは解析始めるまで…

Page 4: ログ解析入門withR InnovationEggNo3

ログ解析とR

解析…

重要なのは解析始めるまで…

きちんと管理しましょう

Page 5: ログ解析入門withR InnovationEggNo3

ログ解析とR

解析…

重要なのは解析始めるまで…

管理できていたら

Page 6: ログ解析入門withR InnovationEggNo3

ログ解析とR

解析…

重要なのは解析始めるまで…

活用してみる?

Page 7: ログ解析入門withR InnovationEggNo3

ログ解析とR

解析…

重要なのは解析始めるまで…

(ちょっと)見てみる

Page 8: ログ解析入門withR InnovationEggNo3

ログ解析とR

(ちょっと)見てみる

ツール?

かんたんに、でも、くわしく、データを見てみたい

Page 9: ログ解析入門withR InnovationEggNo3

ログ解析とR

かんたんに、でも、くわしく、データを見てみたい

Page 10: ログ解析入門withR InnovationEggNo3

ログ解析とR

• 実際、重要なのは解析始めるまで

きちんと(できれば目的を持って 目的に沿った)管理をする

• R: ログを様々な切り口で見るツール

比較的簡単に、詳しくデータを見られる

Page 11: ログ解析入門withR InnovationEggNo3

R、使ったことありますか?

• 聞いたことある? • 使っている?

R in Google Trend

Page 12: ログ解析入門withR InnovationEggNo3

R、使ったことありますか?

2013 Data Science Salary Survey: From O'Reilly Strata Conference: Making Data Work

Page 13: ログ解析入門withR InnovationEggNo3

R、使ったことありますか?

Githubでの人気度

Stac

k O

verf

lowでの人気度

言語 2012年9月 2013年1月 2013年6月 2014年1月

JavaScript 1位 1位 2位 1位

Java 2位 2位 1位 2位

PHP 3位 3位 3位 3位

… … … … …

R 17位 17位 16位 15位

Page 14: ログ解析入門withR InnovationEggNo3

Rって?

• 統計解析環境 • プログラミング言語

http://www.r-project.org/

What is R? R is a language and environment for statistical computing and graphics.

Page 15: ログ解析入門withR InnovationEggNo3

なぜR?

• 統計解析や付随する • 学びやすい

データ処理、可視化 の環境が充実

http://www.okada.jp.org/RWiki/?R%A4%F2%C1%A6%A4%E1%A4%EB100%2B%A4%CE%CD%FD%CD%B3

Page 16: ログ解析入門withR InnovationEggNo3

統計解析環境??

この辺の分析が手軽に実装できる

tjo.hatenablog.com/entry/2013/06/10/190508

データセット名 タイトル 説明

airmiles 商用航空会社マイレージ

1937年から1960年の各年の、合州国の商用航空会社の課税利用者マイル数。

airquality ニューヨークの大気状態観測値

ニューヨークの大気状態観測値。1973 年の五月から。

anscombe

同じ' 線形単回帰に対する Anscombe の四つ組

同じ通常の統計的性質(平均、分散、相関、回帰直線)を持つが、全く異なる 四つの x-y データセット。

attenu Joyner-Boore の地震波の減衰データ

このデータはカリフォルニア州の 23 の地震のピーク時加速度を、様々な観測基地で測定したデータを与える。このデータは多くの研究者により、基本加速度に対する距離による減衰効果を推定するために用いられてきた。

cars 車の停車距離 車が停車するまでに必要な距離のデータ。 データは 1920 年代に得られたことを注意せよ。

co2 Mauna Loa 火山の大気中の炭酸ガス濃度

大気中の CO2 濃度が百万分の一単位 (ppm) で表され、preliminary 1997 SIO manometric mole fraction scale で報告されている。

discoveries 重要な発見の数 1860年から1959年の各年における ``偉大な'' 発明と科学的発見の数。

http://d.hatena.ne.jp/hoxo_m/20120214/p1

>100のサンプルデータ

Page 17: ログ解析入門withR InnovationEggNo3

Rを使うメリット

• 統計解析や付随する • 学びやすい

分析が楽!

データ処理、可視化 の環境が充実

Page 18: ログ解析入門withR InnovationEggNo3

Rを使うデメリット

• ソフトウェア開発 • 大量データ処理 (?文字列処理)

汎用性が低い・・・

Webアプリ開発

Page 19: ログ解析入門withR InnovationEggNo3

Rを使う?

もし統計解析が必要なら

Page 20: ログ解析入門withR InnovationEggNo3

Rについて

• 文法とデータフレーム • パッケージ • IDE

Page 21: ログ解析入門withR InnovationEggNo3

Rについて: 文法とデータフレーム

a <- 1 + 1 #2 b <- 2:10 #2, 3, ... 10 >b[5:7] 6, 7, 8

Page 22: ログ解析入門withR InnovationEggNo3

データフレーム: 変数毎の計算を容易に

Label1 Label2 Label3 Label4

1 A 2011/4/1 TRUE

10 B 2013/8/9 FALSE

5 C 2017/1/1 FALSE

←変数

観測値

dat$Label1 ... 1, 10, 5

Rについて: 文法とデータフレーム

Page 23: ログ解析入門withR InnovationEggNo3

実際使う上でのポイント 処理速度は遅いかもしれません ★ for文は使わない 時間かかる ☆ apply関数を使う ☆ package活用(dplyr, doSNOW etc)

Rについて: 文法とデータフレーム

Page 24: ログ解析入門withR InnovationEggNo3

Rについて: パッケージ

データ抽出、ログ解析のための おすすめパッケージ

Page 25: ログ解析入門withR InnovationEggNo3

Rについて: パッケージ

DB? SQL? • RODBC • sqldf

RからODBCを使うことで、各種のデータベース上に格納されたテーブルをデータフレームに読み込む

RでデータフレームをSQLで操る

Page 26: ログ解析入門withR InnovationEggNo3

Rについて: パッケージ

GoogleAnalytics • RGoogleAnalytics RでGoogleAnalyticsを扱う

Page 27: ログ解析入門withR InnovationEggNo3

Rについて: IDE

RStudio

Page 28: ログ解析入門withR InnovationEggNo3

Rについて

• 統計解析用プログラミング言語

分析には便利 ⇔ 汎用性は低い

• 基本データ構造: データフレーム

• パッケージを活用

• RStudioから使うと更に便利

Page 29: ログ解析入門withR InnovationEggNo3

ログの取得と解析

• DBからログ取得 ODBCを使って CSV, GA, etc...

• ログ解析と活用

傾向みてみる 予測してみる

Page 30: ログ解析入門withR InnovationEggNo3

ログの取得と解析

Package: RODBC RからODBC(Open Database Connectivity: RDBMSにアクセ

スするための共通インタフェース (API))を利用してDBにアクセス

http://cran.r-project.org/web/packages/RODBC/index.html

インストール&呼び出し CRANからダウンロード RStudioでインストール、呼び出し if(!require(RODBC)){ install.packages(“RODBC”) } library(RODBC)

Page 31: ログ解析入門withR InnovationEggNo3

ログの取得と解析

RからODBC #DB接続を開始 conn <- odbcConnect(DB, user_id, passwd)

#テーブル名の表示 sqlTables(conn)

データソース名

ユーザーID

パスワード

Page 32: ログ解析入門withR InnovationEggNo3

ログの取得と解析

RからODBC

#SQL実行 sqlQuery(conn, query) queryの例: query1 <- “select * from table” #各IPアドレスからのアクセス数を取得 query2 <- “select ip_address as ip, count(*) as n from table” #昨日までの1週間分のデータを取得 day_b0 <- Sys.Date() #今日 day_b8 <- day_b1-8 #8日前 query3 <- paste(“select * from table where time>=”, day_b1, “and time <”, day_b8)

#接続終了 close(conn)

Page 33: ログ解析入門withR InnovationEggNo3

ログの取得と解析

RからODBC #データdatの確認 #head: 上から6行を返す データが多いとき #summary: 各変数の統計量 head(dat)

Page 34: ログ解析入門withR InnovationEggNo3

ログの取得と解析

RからODBC #データdatの確認 #head: 上から6行を返す データが多いとき #summary: 各変数の統計量 summary(dat)

大小がある変数は最大値~最小値、第1、3四分位点を出す

多い順に最大6つ並べる

Page 35: ログ解析入門withR InnovationEggNo3

ログの取得と解析

RからGoogle Analytics #データの集計 library(RCurl); library(rjson) source(“RGoogleAnalytics.R”) ga <- RGoogleAnalytics() ga$SetCredentials("username", "passwd") query <- QueryBuilder() query$Init(start.date = "2014-01-01", end.date = "2014-05-31", dimensions = c("ga:date","ga:hour"), metrics = "ga:visitors", sort = "ga:date", table.id = "ga:xxxxxxxxxx") dat <- ga$GetReportData(query)

Page 36: ログ解析入門withR InnovationEggNo3

ログの取得と解析

CSV, TXT, 固定長etc... #データの集計 dat <- read.table(“xxx.txt”) dat <- read.csv(“yyy.csv”) dat <- read.fwf(“zzz.csv”) 殆どの形式でデータの読み込みは簡単

Page 37: ログ解析入門withR InnovationEggNo3

ログの取得と解析

集計 #SQLに慣れている場合 library(sdldf) ans <- sqldf(query) #queryの例 query1 <- “select ... from dat ... (略)” query2 <- c(“create index idx_ip on dat(ip)”, “select ip, count(*) as n from dat group by ... (略)”)

for文は使わない

Page 38: ログ解析入門withR InnovationEggNo3

ログの取得と解析

集計 #SQL文を使わない library(dplyr) ans <- summarize(group_by(dat, ip, ...), n=n(), funx = fun(x)...) 速度はdplyr≒sqldf

for文は使わない

Page 39: ログ解析入門withR InnovationEggNo3

(例)datasciencetoolkit.orgのAPIを利用してIPアドレスから経度・緯度を取得 IPtoXY <- function(x) { URL_IP <-paste("http://www.datasciencetoolkit.org//ip2coordinates/", x, sep = "") api_return <- readLines(URL_IP, warn = F) lon1 <- api_return[grep("longitude", api_return)] lon <- gsub("[^[:digit:].]", "", lon1) lat1 <- api_return[grep("latitude", api_return)] lat <- gsub("[^[:digit:].]", "", lat1) return(paste(lat, lon, sep = ":")) }

ログの取得と解析

IP address

Page 40: ログ解析入門withR InnovationEggNo3

ログの取得と解析

IP address

(例)Google Map上に表示 map_ip <- function(id, ip) { URL_IP <- data.frame(ip=paste("http://www.datasciencetoolkit.org//ip2coordinates/", ip, sep = "")) y <- unique(URL_IP) api_returnx <- apply(y, 1, readLines, warn=F) api_return <- unlist(api_returnx) lon1 <- api_return[grep("longitude", api_return)] lon <- gsub("[^[:digit:].]", "", lon1) lat1 <- api_return[grep("latitude", api_return)] lat <- gsub("[^[:digit:].]", "", lat1) loc <- data.frame(id=id, lonlat=(paste(lat, lon, sep = ":"))) plot(gvisMap(loc, locationvar="lonlat", tipvar="id", option=list(showTip=F, enableScroll=T, useMapTypeControl=T))) return(data.frame(id, lat, lon)) }

Page 41: ログ解析入門withR InnovationEggNo3

ログの取得と解析

時間の扱い #日付型への変換 dat$time <- as.POSIXct(dat$time, origin=“1970/1/1”) dat$time <- strptime(dat$time, “%Y-%m-%d %H:%M:%S”) #日ごとに分類 dat$day <- as.Date(dat$time) #曜日ごとに分類 dat$weekdays <- weekdays(dat$time)

Page 42: ログ解析入門withR InnovationEggNo3

*時系列分析をする場合 補完するためのapprox関数が役立つ~~~ #間隔を統一する >> 時間軸のテンプレートを作る #ts, tfは開始、終了の時間の整数化 time.t <- seq(ts, tf, by=3600) #dat$yが何か指標の場合 dat$t <- as.integer(dat$time, origin=“1970/1/1”) dat.t <- data.frame(t = time.t, y = approx(x=t, y=y, xout=time.t, method=“linear”))

ログの取得と解析

Page 43: ログ解析入門withR InnovationEggNo3

ログの取得と解析

集計 #reshape関数でクロス集計 #dat: day(曜日), hour, アクセス数の場合 reshape(dat, idvar=“day”, timevar=“hour”, direction=“wide”)

Page 44: ログ解析入門withR InnovationEggNo3

ログの取得と解析

集計 #結果のプロット

Page 45: ログ解析入門withR InnovationEggNo3

ログの取得と解析

傾向を見てみる #決定木を使う

データフォーシーズ:http://www.data4cs.co.jp/service/case_crm04.html

Page 46: ログ解析入門withR InnovationEggNo3

ログの取得と解析

age >= 35.5 age < 35.5

hour < 3 hour >= 3

repeat >= 2 repeat < 2

傾向を見てみる (例)何が購買に結び付いているのか 「dat」 会員ID 年齢 男女(男=1, 女=0) 訪問時間、曜日 etc 誰が(どんな層の会員が) いつ(曜日、時間) 購入する傾向にあるのか

■購入

■非購入

Page 47: ログ解析入門withR InnovationEggNo3

ログの取得と解析

age >= 35.5 age < 35.5

hour < 3 hour >= 3

repeat >= 2 repeat < 2

傾向を見てみる library(mvpart) tree <- rpart(purchase~. data=dat) plot(tree) #これだけ

■購入

■非購入

Page 48: ログ解析入門withR InnovationEggNo3

ログ取得と解析

• データ取得にはSQL文が使える • 分類項目を決めてデータを集計する • 目的変数(購買、アクセス等)と 他の変数の関連性を見つける

⇒ R: 短いコードでサクサクできる

Page 49: ログ解析入門withR InnovationEggNo3

おまけ

レコメンドシステム

Page 50: ログ解析入門withR InnovationEggNo3

http://japan.zdnet.com/web/sp_08ec/20374062/2/

アイテム間の距離: ユーザーの訪問、購買履歴より計算

(例)ピアソン相関係数

おまけ

#アイテムベースの協調フィルタリング #アイテム同士の類似度を測り、ユーザーが好んだアイテムに近いアイテムを提案 #アイテム: 商品、ページ etc

Page 51: ログ解析入門withR InnovationEggNo3

おまけ

a b

c

d

e f

g

a を推薦 空間上に a~gを配置

Page 52: ログ解析入門withR InnovationEggNo3

おまけ

ユーザー×ページ毎の訪問回数

ページ間の距離

Page 53: ログ解析入門withR InnovationEggNo3

http://kobexr.doorkeeper.jp/events/11097