ログ解析入門withr innovationeggno3
TRANSCRIPT
ログ解析入門 with R
2014/6/4 Innovation Egg 第三回
かわはら
ログ解析とR
解析…
重要なのは解析始めるまで…
ログ解析とR
解析…
http://nexal.jp/blogs/2384.html
重要なのは解析始めるまで…
ログ解析とR
解析…
重要なのは解析始めるまで…
きちんと管理しましょう
ログ解析とR
解析…
重要なのは解析始めるまで…
管理できていたら
ログ解析とR
解析…
重要なのは解析始めるまで…
活用してみる?
ログ解析とR
解析…
重要なのは解析始めるまで…
(ちょっと)見てみる
ログ解析とR
(ちょっと)見てみる
ツール?
かんたんに、でも、くわしく、データを見てみたい
ログ解析とR
かんたんに、でも、くわしく、データを見てみたい
ログ解析とR
• 実際、重要なのは解析始めるまで
きちんと(できれば目的を持って 目的に沿った)管理をする
• R: ログを様々な切り口で見るツール
比較的簡単に、詳しくデータを見られる
R、使ったことありますか?
• 聞いたことある? • 使っている?
R in Google Trend
R、使ったことありますか?
2013 Data Science Salary Survey: From O'Reilly Strata Conference: Making Data Work
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位
Rって?
• 統計解析環境 • プログラミング言語
http://www.r-project.org/
What is R? R is a language and environment for statistical computing and graphics.
なぜR?
• 統計解析や付随する • 学びやすい
データ処理、可視化 の環境が充実
http://www.okada.jp.org/RWiki/?R%A4%F2%C1%A6%A4%E1%A4%EB100%2B%A4%CE%CD%FD%CD%B3
統計解析環境??
この辺の分析が手軽に実装できる
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のサンプルデータ
Rを使うメリット
• 統計解析や付随する • 学びやすい
分析が楽!
データ処理、可視化 の環境が充実
Rを使うデメリット
• ソフトウェア開発 • 大量データ処理 (?文字列処理)
汎用性が低い・・・
Webアプリ開発
Rを使う?
もし統計解析が必要なら
Rについて
• 文法とデータフレーム • パッケージ • IDE
Rについて: 文法とデータフレーム
a <- 1 + 1 #2 b <- 2:10 #2, 3, ... 10 >b[5:7] 6, 7, 8
データフレーム: 変数毎の計算を容易に
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について: 文法とデータフレーム
実際使う上でのポイント 処理速度は遅いかもしれません ★ for文は使わない 時間かかる ☆ apply関数を使う ☆ package活用(dplyr, doSNOW etc)
Rについて: 文法とデータフレーム
Rについて: パッケージ
データ抽出、ログ解析のための おすすめパッケージ
Rについて: パッケージ
DB? SQL? • RODBC • sqldf
RからODBCを使うことで、各種のデータベース上に格納されたテーブルをデータフレームに読み込む
RでデータフレームをSQLで操る
Rについて: パッケージ
GoogleAnalytics • RGoogleAnalytics RでGoogleAnalyticsを扱う
Rについて: IDE
RStudio
Rについて
• 統計解析用プログラミング言語
分析には便利 ⇔ 汎用性は低い
• 基本データ構造: データフレーム
• パッケージを活用
• RStudioから使うと更に便利
ログの取得と解析
• DBからログ取得 ODBCを使って CSV, GA, etc...
• ログ解析と活用
傾向みてみる 予測してみる
ログの取得と解析
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)
ログの取得と解析
RからODBC #DB接続を開始 conn <- odbcConnect(DB, user_id, passwd)
#テーブル名の表示 sqlTables(conn)
データソース名
ユーザーID
パスワード
ログの取得と解析
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)
ログの取得と解析
RからODBC #データdatの確認 #head: 上から6行を返す データが多いとき #summary: 各変数の統計量 head(dat)
ログの取得と解析
RからODBC #データdatの確認 #head: 上から6行を返す データが多いとき #summary: 各変数の統計量 summary(dat)
大小がある変数は最大値~最小値、第1、3四分位点を出す
多い順に最大6つ並べる
ログの取得と解析
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)
ログの取得と解析
CSV, TXT, 固定長etc... #データの集計 dat <- read.table(“xxx.txt”) dat <- read.csv(“yyy.csv”) dat <- read.fwf(“zzz.csv”) 殆どの形式でデータの読み込みは簡単
ログの取得と解析
集計 #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文は使わない
ログの取得と解析
集計 #SQL文を使わない library(dplyr) ans <- summarize(group_by(dat, ip, ...), n=n(), funx = fun(x)...) 速度はdplyr≒sqldf
for文は使わない
(例)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
ログの取得と解析
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)) }
ログの取得と解析
時間の扱い #日付型への変換 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)
*時系列分析をする場合 補完するための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”))
ログの取得と解析
ログの取得と解析
集計 #reshape関数でクロス集計 #dat: day(曜日), hour, アクセス数の場合 reshape(dat, idvar=“day”, timevar=“hour”, direction=“wide”)
ログの取得と解析
集計 #結果のプロット
ログの取得と解析
傾向を見てみる #決定木を使う
データフォーシーズ:http://www.data4cs.co.jp/service/case_crm04.html
例
ログの取得と解析
age >= 35.5 age < 35.5
hour < 3 hour >= 3
repeat >= 2 repeat < 2
傾向を見てみる (例)何が購買に結び付いているのか 「dat」 会員ID 年齢 男女(男=1, 女=0) 訪問時間、曜日 etc 誰が(どんな層の会員が) いつ(曜日、時間) 購入する傾向にあるのか
■購入
■非購入
ログの取得と解析
age >= 35.5 age < 35.5
hour < 3 hour >= 3
repeat >= 2 repeat < 2
傾向を見てみる library(mvpart) tree <- rpart(purchase~. data=dat) plot(tree) #これだけ
■購入
■非購入
ログ取得と解析
• データ取得にはSQL文が使える • 分類項目を決めてデータを集計する • 目的変数(購買、アクセス等)と 他の変数の関連性を見つける
⇒ R: 短いコードでサクサクできる
おまけ
レコメンドシステム
http://japan.zdnet.com/web/sp_08ec/20374062/2/
アイテム間の距離: ユーザーの訪問、購買履歴より計算
(例)ピアソン相関係数
おまけ
#アイテムベースの協調フィルタリング #アイテム同士の類似度を測り、ユーザーが好んだアイテムに近いアイテムを提案 #アイテム: 商品、ページ etc
おまけ
a b
c
d
e f
g
a を推薦 空間上に a~gを配置
おまけ
ユーザー×ページ毎の訪問回数
ページ間の距離
http://kobexr.doorkeeper.jp/events/11097