はてブにおける1日の平均ブクマ数

どこかで必要そうだったので結果だけ.以前に取得した 8,826 ユーザが 2008/10/01 にブクマした数を取得してみました(どこか 1 日のブクマ数が知りたかっただけで,2008/10/01 に特に意味はありません).スクリプトは以下の通り.ユーザ名が列挙されているファイルのファイル名と日付 (e.g., 20081001) を引数に指定します.

#!/usr/bin/ruby -Ku

require 'hatena'

index = 0
File.new(ARGV[0]).each { |user|
    user.chomp!
    begin
        result = Hatena::Bookmark::URITrace.new("#{user}/#{ARGV[1]}").get
    rescue Exception => e
        next
    end
    printf("%4d %4d %s \n", index, result.length, user);
    index += 1
    sleep(5);
}

結果のグラフは下のようになりました.

平均値と 1/10/25/50/75/90/99 パーセンタイルは以下の通りです*1

$ awk '{print $2}' user_activity.log | ./stats
mean: 3.14083

percentile
        • -
1 %: 0 10 %: 0 25 %: 0 50 %: 1 75 %: 3 90 %: 7 99 %: 31

平均 3.14,中央値 1.ほとんどの人は,日平均で見ると 1 件ブクマするかどうか位の頻度のようです.調べる前はもう少し多いかなと予想していたのですが,まったくブクマしない日も結構あるのでこんなもんでしょうか.各種統計値は,(個人的に)C++ の方が早そうだったので以下のプログラムで求めました.

#include <iostream>
#include <iterator>
#include "clx/stats.h"
#include "clx/quantile.h"

int main(int argc, char* argv[]) {
    std::istream_iterator<int> input(std::cin);
    std::istream_iterator<int> last;
    
    std::vector<int> v;
    std::copy(input, last, std::back_inserter(v));
    
    std::cout << "mean: " << clx::mean(v.begin(), v.end()) << std::endl;
    std::cout << std::endl;
    
    std::cout << "percentile" << std::endl;
    std::cout << "-----" << std::endl;
    
    // 降順に並んでるので,rbegin/rend で渡す.
    std::cout << " 1 %: " << clx::percentile(v.rbegin(), v.rend(), 1) << std::endl;
    std::cout << "10 %: " << clx::percentile(v.rbegin(), v.rend(), 10) << std::endl;
    std::cout << "25 %: " << clx::percentile(v.rbegin(), v.rend(), 25) << std::endl;
    std::cout << "50 %: " << clx::percentile(v.rbegin(), v.rend(), 50) << std::endl;
    std::cout << "75 %: " << clx::percentile(v.rbegin(), v.rend(), 75) << std::endl;
    std::cout << "90 %: " << clx::percentile(v.rbegin(), v.rend(), 90) << std::endl;
    std::cout << "99 %: " << clx::percentile(v.rbegin(), v.rend(), 99) << std::endl;
    
    return 0;
}

Download

*1:x パーセンタイルは,データを昇順に並べたときに x% に位置する値を表します.50 パーセンタイルは中央値と等価です.