アクセス解析:「ユニークアクセス」の判別
January 9, 2009 – 1:46 pm前回のエントリーで「Webアクセス解析ツールの作成を検討」していることを書いた。こうしたツールを作成しようとすると、いろいろなことを考えなければならないことに気づく。Webサイトを公開するとサイトへのアクセス回数がどの程度なのか気になりアクセスカウンターなるものを取り付けたりする。しかし、ここでカウントしているのは何かと考えると、結構、複雑だ。「訪問者(visit)数」をカウントしているのか?読まれた「ページ(page view)数」をカウントしているのか?その区別をどうしているのか?などなどである。このあたりを明確にしておかなければ何を計測しているのかわからなくなる。
ユニーク・ユーザー: 情報処理学会誌の特集記事「eラーニングの広がりと連携」の「オープン・コース・ウェアの現状と展望」(宮川茂:情報処,Vol.49, No.9 pp.1029-1038(Sep.2008)にアクセス回数の計測法についての記述がある。やはり、きちんと定義しておかないと、まともなアクセス回数の計測はできないということだろう。この記事では、次のように計測するようだ:
・・・・今後の参考のためにアクセス回数を計る方式を標準化する方式を標準化する必要があると考えて、「訪問者数」を月別にとることにした。「訪問者数」は、30分単位でその間にユニーク・ユーザーを数えるというスタイルで計測される。これで数えると、ある訪問者がそのあいだに何度ページビューを行っても、1回の訪問として登録される。・・・・
この方式、「30分単位でユニーク・ユーザーを数える」というのは、例えば、12時から12時30分の間の30分間にアクセスしたユニーク・ユーザーを数え、計測すると理解すると、例えば12時29分にアクセスし、13時31分にサイト内の別のページにアクセスした場合には「訪問者数」は2と数えられることになってしまう。より合理的な計測法ということで、我がサイトへの「訪問者数」は、これを少し変え、以下のように標準化することにした:
サイトへの訪問者数は、あるユーザーのサイトへのアクセスが、それに先立つ任意の時間(例えば30分)前からその時点までない場合、これをユニークアクセスとしてカウントする
訪問者数計測の実装: 「訪問者数」を上記のように標準化した場合、どのようにこれが実装されるのか、今回採用した方式についてみる。前回のエントリーで、サイトへのアクセスをDB上に記録する関数get-access()のソースを示している。ここでは、サイトへのアクセスを記録する際、このアクセスが、上記の定義でユニークであるかどうか判定し、他のアクセス情報と合わせて記録している。該当部分を抜書きする:
// In the case where the same visitor exists within 20 minutes, NON_UNIQUE otherwise UNIQUE $visitor = mysql_escape_string($host_name); $interval= ‘20′; $accessdao = New AccessDao(); $access_array = $accessdao->getLastAccess($visitor, $interval); // Get number of records of $access_array $no = sizeof( $access_array ); if ( $no > 0 ) $uniqueness = ‘NON_UNIQUE’; else $uniqueness = ‘UNIQUE’;
ここでは、同一の「訪問者」(ホストネーム(ない場合はIPアドレス)で識別)の過去20分間のアクセスレコードを求め、そのレコード数がゼロの場合、uniqueそれ以外をnon-uniqueのフラッグを記録している。解析時には、このフラッグ($unique)を参照し、訪問者数の計測を割り出すことになる。
(注意)前回のエントリーで示しているphpのソースは検討用に作成したものであるため、この判定にさきだって、REFERERが我がサイト名memorandum.yamasnet.comのもの(アクセスする直前のページが我がサイトのもの)についてこれをnon-uniqueとする判定法を、そのまま残したものになっている。また、過去20分内の同一訪問者の数を求める際にも、sizeofを用いることなくなくSQL文で直接これを求めることが合理的と考えられる。あくまで、検討時に使用したソースとして理解していただきたい。
参考:AccessDaoのメソッドgetLastAccess()のソース(再掲)
public function getLastAccess($visitor, $interval) { is_null($this->mysqli) and $this->connect(); // Get last data record for the visitor($visitor, $inteval) $sql = “SELECT access.id, time, visitor, ip_address, uniqueness, reff_uri, refferer,” . “search_engine, keywords, page_visited, title, user_agent ” . “FROM access, mypage ” . “WHERE visitor= ‘” . $visitor . “‘ AND ” . “ access.page_id = mypage.id AND ” . “ time > SUBDATE( NOW(), INTERVAL ” . $interval . ” MINUTE ) ” . “ORDER BY time DESC”; // $result = $this->mysqli->query($sql); $access_array = array(); while($row = $result->fetch_array(MYSQLI_ASSOC)) { $access = new Access(); $access->setId($row["id"]); $access->setTime($row["time"]); $access->setVisitor($row["visitor"]); $access->setIpAddress($row["ip_address"]); $access->setUniqueness($row["uniqueness"]); $access->setReffUri($row["reff_uri"]); $access->setRefferer($row["refferer"]); $access->setSearchEngine($row["search_engine"]); $access->setKeyWords($row["keywords"]); $access->setPageVisited($row["page_visited"]); $access->setPageTitle($row["title"]); $access->setUserAgent($row["user_agent"]); $access_array[] = $access; } $result->close(); return $access_array; }
1 Trackback(s)