コレナニ?


普段はデータを収集してないので、ぶっこ抜いてみた。

最初の質問が 2011/10/24 23:42:55 。それから約四年半。
2016-6-7 10:00 頃の結果。

概略

質問数 4,176
回答数 7,552
UU : Q 1,377
UU : A 1,776

質問数の推移


質問あたりの回答数の分布

ついた回答の数 質問数
0 564
1 1979
2 743
3 374
4 194
5 129
6 69
7 43
8 21
9 23
10 14
11 8
12 4
13 5
14 2
16 1
18 1
25 1
26 1



もうちょっと細かく。

ついた回答の数 放置 BA cancel 終了 総計
0 564 564
1 1860 108 1 10 1979
2 696 40 7 743
3 349 22 1 2 374
4 186 7 1 194
5 125 4 129
6 64 5 69
7 42 1 43
8 21 21
9 21 2 23
10 12 2 14
11 8 8
12 4 4
13 5 5
14 2 2
16 1 1
18 1 1
25 1 1
26 1 1
総計 3963 191 2 20 4176

ベストアンサーがつかないわけじゃない。5% くらいはつく。
アプリでは明示的に終了させられないらしいので、わざわざ PC サイトからベストアンサーをつけている、という人たち。

そういった環境で、わざわざ BA をつけずに終了処理をしたり、キャンセルしたりという人たちも。

はてなID を使ってる方たちは変わり者なふうでさもありなんという感じだけれど、TwitterFacebook ログインでもわざわざ。
使い方が分かってないだけのような気もしなくもないが、わざわざ終了処理をしておいて、という感じもする。


質問数 TOP10

順位 id 質問数
1 12167962@twitter 214
2 150083161@twitter 122
3 guriata 72
4 ageo3941 67
5 107449592@twitter 45
6 Koume811 42
7 112641561@twitter 40
8 yokkun_8888127 35
9 1421400491@facebook 35
10 macotomato373 34



回答数 TOP10

順位 id 回答数
1 fiwa 761
2 akira-tago0704 280
3 kimudon 217
4 xnissy 175
5 285660999@twitter 90
6 chinjuh 77
7 DaisukeHan 73
8 taronpo 70
9 gtore 70
10 chris4403 70



ベストアンサー数 TOP10

順位 id BA 回答数
1 fiwa 29 761
2 kimudon 12 217
3 akira-tago0704 12 280
4 gtore 11 70
5 xnissy 9 175
6 tak86 4 57
7 chinjuh 4 77
8 a-kuma3 3 47
9 konekonekoneko 2 6
10 pyokotan235 2 3



そうそう、「コレナニ?」の件数を調べたのは……

でも、プロフィールのベストアンサー数も実は怪しくって。
例えば、回答の総数。
右側のプロフィール欄では、ぼくの回答数は 4237 回です。
でも、一覧の上に小さい字で表示されているページ数のところでは、4284 回です。

ノーカウントの謎 ~ 消えたベストアンサー ~ あろうこ… - 人力検索はてな

コメントしてから、ちょっと時間が経ってるけれど、

回答一覧のページ位置を表すところの回答数 4,285件 と、プロフィール欄の回答数 4,239 件の差の話からだった。
回答数 TOP10 ではランク外だったぼくの回答数。

順位 id 回答数
19 a-kuma3 47



4,285 - 4,239 = 46

いやいや、終了されていない質問の数だけずれるんだ。

終了されていない質問数は 44 。
やっぱり微妙に違う。

普段、スクレイピングしてるデータでは、回答数が 4,228 。

一覧から番号を取得して、詳細のページからデータを抽出しているので、非公開になったものや、非公開になってなくても一覧から見えなくなったものは抽出できてない。
# 2015年8月くらいから、2回/日の頻度で収集してるので、多少は拾えてる

同じ理由で、「コレナニ?」も含まれてない。
それを加味すると、
4,228 + 47 = 4,275

やっぱり合わない。

プロフィール 4,239
一覧 4,285
コレナニ? 47 内、終了していないのは 44
スクレイピング 4,228


id:meefla さんの場合。

プロフィール 947
一覧 952
コレナニ? 7 内、終了していないのは 6
スクレイピング 944

やっぱり合わない。

でも、一覧とプロフィールの差は、終了処理がされない「コレナニ?」への回答数だ、ということで大体あってる、ということに納得。

番外

普段使ってるデータ収集のスクリプト
「コレナニ?」の一覧も CSS で見た目を変えているだけなので、そのまま使えた。
でも、一件だけ質問者の id を取り損ねている質問があった。

なんとニックネームの末尾に改行コードが入ってる :-O
アプリからだとこういうことができるのか?

Nokogiri のような DOM ベースではなく文字列でデータを処理しているので、こういうことが起きる。
例外的なケースなので、スクリプトを修正するほどではないかな。


おしまい。


非公開になった質問への回答は @追記

カウントされているけど、そのページで非表示になっている。
1ページ当たり 20件の質問一覧で、表示されているのが 19件のページが 10個もあった。

やっつけで作った Bookmarklet

/*
    回答一覧から、非公開になった質問が含まれるページを抽出する。
*/
(function() {
    if (location.hostname != "q.hatena.ne.jp") {
        alert("use @ q.hatena.ne.jp");
        return;
    }


    var BASE_URL = "http://q.hatena.ne.jp/a-kuma3/answerlist?page=";
    var ID = "a-kuma3-result";


    function create(tag, parent) {
        var e = document.createElement(tag);
        parent.appendChild(e);
        return e;
    }


    function check_list(page) {
        var xhr = new XMLHttpRequest();
        xhr.onload = function(ev) {
            if (ev.target.status < 400) {
                var doc = ev.target.response;
                var answers = doc.querySelectorAll(".answer-body > .answer-detail");
                if (answers.length != 20) {
                    console.log(answers.length, ev.target.responseURL);
                    var e = document.getElementById(ID);
                    var a = create("a", e);
                    a.href = ev.target.responseURL;
                    var m = /page=(\d+)/.exec(a.href);
                    a.innerHTML = m[0] + ", N = " + answers.length
                }
                var pager = doc.querySelector('div.pager a[rel="next"]');
                if (pager) {
                    check_list(page + 1);
                }
            }
        };
        var url = BASE_URL + page;
        xhr.open('GET', url, true);
        xhr.responseType = 'document';
        xhr.send(null);
    }

    var e = document.getElementById(ID);
    if (! e) {
        e = create("div", document.body);
        e.id = ID;
        e.style.position = "absolute";
        e.style.top = "2em";
        e.style.right = 0;
        e.style.padding = "1ex";
        e.style.backgroundColor = "white";
    }
    e.innerHTML = "<div>result</div>";

    var page = 1;
//  page = 213;
    check_list(page);
})();