標準的なApacheのアクセスログをRで読み込んで解析する方法が Access log data analysis — part1 — Understanding your customer interactions で解説されていた。これを古いRの記法で書き換えてやってみる。
まずアクセスログを用意する。ここではたった4行の access_log を使う(ありえないIPアドレスを使っているので注意)。まずログを読むにはHadley Wickham作の readr パッケージが便利である。
install.packages("readr") # 必要に応じて
library(readr)
x = read_log("access_log")
不要な列2・3・7・9を削除する。このようなデータの操作にはやはりHadley Wickham作の dplyr が便利である。
install.packages("dplyr") # 必要に応じて
library(dplyr)
x = select(x, -X2, -X3, -X7, -X9)
残った列を意味のある名前に変える。やはり dplyr の rename()
を使う。
x = rename(x, ip_address=X1, date_time=X4, to_url=X5, http_status=X6, from_url=X8)
次はIPアドレスから国名を求める。ここでは rgeolocate パッケージの ip_api()
関数と dplyr の mutate()
関数を使う。ip_api()
は IP-API.com に問い合わせを行うので,無駄な問い合わせは避けたい。たくさんの場合は休止を入れるなどの工夫が必要である。詳しくは ip_api()
のヘルプ参照。
install.packages("rgeolocate") # 必要に応じて
library(rgeolocate)
x = mutate(x, country=ip_api(ip_address)$country_name)
日時をRの内部表現に変換するには lubridate パッケージが便利である。今の場合,月名に Jun のような英語が出てくるので,Macの日本語環境ではロケール設定の locale
オプションが必要であった。また,結果をUTCでなくJSTにするために tz
オプションも使った。この部分は非常に遅いので,大量のデータの場合には,月名を数値に自前で変換して fast_strptime()
関数を使うのが実用的であろう。
install.packages("lubridate") # 必要に応じて
library(lubridate)
x = mutate(x, date_time = dmy_hms(date_time, tz="Asia/Tokyo", locale="en_US.UTF-8"))
ここまでで次のようになる。
x
Source: local data frame [4 x 6]
ip_address date_time to_url
(chr) (time) (chr)
1 133.67.999.999 2016-06-02 10:32:12 GET /~okumura/ HTTP/1.1
2 133.67.999.999 2016-06-02 10:32:13 GET /~okumura/style.css HTTP/1.1
3 133.67.999.999 2016-06-02 10:32:13 GET /~okumura/img/okumura130506.jpg HTTP/1.1
4 133.67.999.999 2016-06-02 10:32:13 GET /~okumura/img/88x31.png HTTP/1.1
Variables not shown: http_status (int), from_url (chr), country (chr)
続きはそのうち書くかも。