どこかで必要そうだったので結果だけ.以前に取得した 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
-
-
-
- -
-
-
平均 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
- result_20081027.tar.gz ..... 上記のプログラムおよび結果のアーカイブ.
- Hatena@Cielquis.Net ..... 上記の Ruby スクリプトを実行させるのに必要なライブラリ.
- CLX C++ Libraries ..... 上記の統計値を求めるプログラムをコンパイルするのに必要なライブラリ.
*1:x パーセンタイルは,データを昇順に並べたときに x% に位置する値を表します.50 パーセンタイルは中央値と等価です.