2006/11/01 で取り掛かっていたアクセス解析をより便利なものにするために、そもそもの解析の目的に戻ります: 「ユーザーはどのようにサイトを利用したのか?」
この質問に対して「ユーザーがどのようにページにアクセスし遷移したか」ということを明らかにすることで答えることにします。そのためには
という処理が求められます。
今回は(2)を実現するためにコードを試作しました: /2006/12/17/log-report.scm。以下でこのプログラムがどのように動作するかを説明します。
この例で利用する Gauche-gd というパッケージを今後頻繁に利用します。対象になったログはこのサイトのログの一部から抜粋して作ったものです。
まず毎時のアクセスを数えて棒グラフにしてみましょう。縦軸にアクセス回数、横軸に時刻を割り当てています。
$ ls
access_log log-report.scm
$ gosh -I.
gosh> (load "log-report.scm")
#t
gosh> (receive (accesses start end)
(call-with-input-file "access_log" port->accesses)
(draw-graph accesses start end
(lambda (x y)
(string=? (ref x 'host) (ref y 'host)))
:output "bar.png"))
0
gosh>
次にもっと詳細にアクセスごとの点をプロットします。縦軸に url (下に位置するものほどアクセスが多い)、横軸に時刻を割り当てています。アクセスを表す各点を結ぶ線が同じユーザーの遷移を表します。
gosh> (receive (accesses start end)
(call-with-input-file "access_log" port->accesses)
(draw-graph accesses start end
(lambda (x y)
(string=? (ref x 'host) (ref y 'host)))
:output "plot.png"
:with-bar #f
:with-plot #t
))
0
gosh>
そして両方のグラフをひとつにしてみます。
gosh> (receive (accesses start end)
(call-with-input-file "access_log" port->accesses)
(draw-graph accesses start end
(lambda (x y)
(string=? (ref x 'host) (ref y 'host)))
:output "both.png"
:with-bar #t
:with-plot #t
))
0
gosh>
結果として冒頭のような3つのグラフが得られます。
このコードをいろいろなログで試す際には、
(draw-graph accesses start end
(lambda (x y)
(string=? (ref x 'host) (ref y 'host)))
:font "/usr/share/fonts/truetype/ttf-bitstream-vera/Vera.ttf"
:output "bar.png"
)
(draw-graph accesses start end
(lambda (x y)
(string=? (ref x 'host) (ref y 'host)))
:width 2048
:height 960
:output "bar.png"
)
(draw-graph accesses start end
(lambda (x y)
(let ((referer (ref y 'referer)))
(and (string? referer)
(string-suffix? (request-uri x) referer))))
:output "bar.png"
)
以上の機能は既存の解析ツールにも備わっているものなので、やや退屈した方もいるかもしれません。実際、
という課題も出てきました。
最後に、上に挙げていた処理(1)はより独自な機能となるはずですが、それは次の機会に譲ることにします。