開始日時(insDatetime)について

●GFDBに載せている開始日時(insDatetime)の算出方法・仕様について

①データ収集

まず、ユーザーIDとinsDatetimeのデータをBotを使って収集しています。

特定のユーザーのデータを得ることは難しく、Botが収集するデータの大部分はGFDBのに載っていないユーザーのデータとなってしまいます。

現在14万件くらいのデータが得られていますが、このうちGFDBに載っているユーザーのデータは約4.5万人程です。

GFDBに載っているユーザーは約8.5万人なので残り約4万人のinsDatetimeは算出する必要があります。

http://gfdb.info/sql.php?ctrl=exec&id=827953

②insDatetime考察

得られたユーザーIDとinsDatetimeの対応表をデータベースに格納して中身を調べてみると、

基本的にはuserIdが大きい(若い)ユーザーは開始日時が遅く、userIdが小さい(古い)ユーザーは開始日時が早くなっていますが、

一部ぶれがあり、insDatetimeでソートしても綺麗にuserId順にはなってくれませんでした。

ズレが小さいユーザーと大きいユーザーがいて、これはおそらく以下の2つの理由によるものだと考えました。

(1)ユーザーIDはチュートリアルを開始した時点で付与され、insDatetimeはおそらくチュートリアルを終えた時点の日時となっている所為で、

一部ユーザーは自分よりIDの若いユーザーより開始日時が遅かったり、IDが古いユーザーより開始日時が早かったりする。

(2)長期間ログインせず、再開した時のおかえりログイン時にinsDatetimeがおかえりログイン時の日時で上書きされる。

このままでは、insDatetime情報が得られていないユーザーの開始日時を算出するのは難しいので、このズレのあるデータは削除します。

ただ、予想が正しければ(2)のデータは開始日時ではないが、(1)は正しい開始日時で有用なデータです。

そこで、(2)のデータのみを削除したデータベースAと(1)と(2)の両方のデータを削除したデータベースB(算出用)を作りました。

③GFDBに載っているユーザーのinsDatetimeデータを更新

GFDBに載っているユーザーを1人1人取り出し、insDatetimeを更新していきます。

まず、データベースAからそのユーザーのデータが無いか調べます。

「SELECT i.unixtime FROM insA i WHERE i.userId = ?;」

あれば、そのデータをそのままinsDatetimeとし、誤差は0(無し)とします。

なければデータベースBからユーザーIDが最も近いユーザー2人のデータから算出します。

「SELECT MAX(i.unixtime) FROM insB i WHERE i.userId < ?;」で得た値をa
「SELECT MIN(i.unixtime) FROM insB i WHERE i.userId > ?;」で得た値をbとして

「a + (b – a) / 2」で2人のユーザーの開始日時の中央値を出し、最大誤差を「(b – a) / 2」とします。

④結果

insDatetimeを算出したユーザーの最大誤差の最大値が約2.3万秒(=約6時間半)、最大誤差の平均値が878秒(=14分38秒)となりました。

誤差が最大でも半日未満、ほとんどは1時間未満と、予想より大分正確に算出できました。

http://gfdb.info/sql.php?ctrl=exec&id=2ff2e8

コメントをどうぞ

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です