アクセスログの解析

標準的な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)

続きはそのうち書くかも。