• このエントリーをはてなブックマークに追加
[番外編]ニコニコデータセットに感謝。真の「規模別合計」問題をねじ伏せれた。
閉じる
閉じる

新しい記事を投稿しました。シェアして読者に伝えましょう

×

[番外編]ニコニコデータセットに感謝。真の「規模別合計」問題をねじ伏せれた。

2014-01-31 19:15

     この記事は通常のものではなく変態的に技術的なものです。こういうのは普段ひっそりとブロマガの前身本家に書いているのですが、この件はニコニコ動画が一昨年公開したニコニコデータセットのおかげなので、こちらに載せておきます。

     ロングテール解析について、強力な解析手段になる「規模別合計」というのをいつも使っているのですが、それは正確には「順位視点の規模別合計」というものです。それに対して「値視点の規模別合計」と言えるものがあるとはるかに分かりやすいのですが、いままで計算できずにいたところ、膨大なデータ量のあるニコニコデータセットのおかげで一応目処が立ちました。たぶん10年くらいの懸案です。感無量。

     以下、概要書いておきます。いま連載している「ゼロから学ぶロングテール」の方でいずれ詳しく書こうと思います。

     「規模別合計」というのは、本家のこちらに詳しく書きました。

     ロングテールを調べるのに便利な「規模別合計」の数学的解説 

     これは、y = f(x) という「順位分布関数」があるとき、xy が「規模別合計」を表す関数になっているというものです。

     この場合の規模別合計は、順位視点で、ニコ動の動画再生数でいうと「何位あたりの動画の再生数の合計」というのを計算することができます。

     でも、そうではなくて、たとえば 「10万回くらい再生されている動画の再生数は合計どれくらい?」ということの方が気になります。100回くらいのとか、1万回くらいのとかそれぞれ分かると楽しいですよね。

     そこで、上の規模別合計では横軸を x, 縦軸を xyとしてグラフにしていたのを、 横軸を y, 縦軸を xy でグラフを作ってみます。

     こんな感じです。
    1e81c04b7cd31c6182efe077d1e36dad869e0c96

     これは、2012-09-29 07:58:15 から 2012-11-01 07:07:23 の間にニコニコ動画にアップロードされた 39386 本の動画のデータを元に作成しました。データ全体では 800万本分以上あるのですが、処理にとても時間がかかるので、まず一部を使って検討しました。縦軸は相対的な値です。

     さてこのグラフが目的のものになっていればいいのですが、実はそうなっていません。このグラフは、「ある再生数近辺の動画『順位』の合計」というとても奇妙な統計値を表しています。欲しいのは「ある再生数近辺の動画『再生数』の合計」です。

     「なにを云っているのかわからない」ので、例です。
    70c1351eec92690f9658eba2d54801ea42703133
     このグラフでは、例えば、左から2番目は再生数が10回から99回つまり2ケタの動画の再生数を合計して示しています。言葉を代えれば、「50回くらい再生されてる動画の『再生数』の合計」で、その「50回くらい」の幅が10回から99回なわけです(それは50回ではなく31.6回ではないかと思った人は分かっている人なので適当に汲み取ってください)。

     このグラフの区切りの幅をどんどん狭くしていったものが、今欲しい、「ある再生数近辺の動画『再生数』の合計」のグラフです。最初のグラフと見比べると形似てるのがわかると思います。最初のグラフでもだいたいはあっているのです。

     そこで、本来なら数式をいじってしかるべき結果を導き出せればいいのですが、いかんせん数学屋ではないので、式をいじってもそれが正しいのか分かりません。こうかな?と思ったら、実際のデータで検証しないと全く信じられないのですが、いろんな意味でそれには莫大なレコードを持つデータが必要だったのです。ニコニコデータセットを使うことでようやく確認することができました。

     さて、欲しい「ある再生数近辺の動画『再生数』の合計」をどうやって求めるかですが、冒頭の「だいたいあってる」グラフを順位から再生数への変換係数を使って変換するとよいのではないかと考えました。これがその変換係数です。どうやって求めたかは後述します。
    1d98ea4d2dba763220dbd57f42adac36499ff5fc

     これを使って変換をするとこうなります。
    a28b6f19ae5962888f1df424bbde88e8847c4a43 
     ということで、この変換後の関数と、実際のデータを集計したものを比べます。上で出した例の区切りの幅をなるべく狭くしたものです。
    c060cc67b284bc5849ad3e9bfdf4a0e315b3086b
     かなり一致しています。縦軸を対数にしたものでも比較します。
    ce9d51c569fb1db3c8389a7f4924f8eac1657979
     全域にわたって程よく一致しており、この変換係数を使った方法がうまくいっているように見えます。

     ついに、「ある再生数近辺の動画『再生数』の合計」のグラフを得ることができました。10年近く欲しかったものです。

     このグラフの見方ですが、再生数のケタごとに再生数を合計すると次のようになります。先ほども例に出したものです。
    70c1351eec92690f9658eba2d54801ea42703133

     このデータは当時直近2ヶ月くらいに公開された動画のものです。
     このグラフの意味するところは、もしあなたが100本直近2ヶ月のニコ動の動画を見ると、そのうちの32本は再生数1万回台、1000回台は28本、10万回台が23本、100回台が14本、10回台が2本、一ケタ台が 0.05本あるということです。(この期間中は100万回以上再生された新着動画はなかったようです)

     再生数100回以上の動画は多少デコボコあってもどれも同じようにありますが、100回より少ない動画はかなり少なく、10回未満の動画にいたっては200本見て1本あるかどうかというレアさです。実際そこまで再生数の少ない動画はほとんど存在しません。大抵誰かが(あるいは投稿した本人が?)何回か見てしまうのです。

     この例では全体を6つに分割していますが、今回導いた「ある再生数近辺の動画『再生数』の合計」のグラフはその分割を可能な限り細かくしたもので、より各規模の勢いを詳細に見ることができます。

     さて、グラフ中の緑の曲線、「実データの集計」の方はデータがたくさんないとノイズがひどく、今回の4万件程度でのデータではこれ以上点を増やしてもばたつくだけで、これ以上両者が一致してるかを調べることはできませんでした。今後800万件以上あるデータでさらに検証すればもっと詳しく調べられそうです。

     肝心の変換係数は、元の順位分布関数を対数軸で描いたときの傾きから求めています。傾きの符号を変えて逆数にしたものです。だいたいそれであっているのだろうとは思いますが、ちょっとすぐには証明できてないです。完全には一致しなくて、1次近似で一致するのかもしれません。

     また「順位分布関数を対数軸で描いたときの傾き」と簡単に書いていますが、これを安定的に求めるのは簡単ではなく、とりあえず、今回は対数の空間で求めやすい向きに回してから4次関数で近似とかあまりに無理クリな方法で近似してから傾きを求めています。

     以前から使っている規模別合計関数は、この傾きや集計という不安定な操作をする必要がまったくないのが最大の利点です。今回、「値視点の規模別合計」はおそらくこの形で求まっていて、ということは傾きが必要になりそうです。このような場合は、何らかのモデルで近似してそのモデルから計算することになると思います。

     ロングテールを近似するモデルとしては、日本では全く知られていませんが DPLN 分布(The Double Pareto-Lognormal Distribution)が便利です。ということで、次のステップはこれを使って計算してみるということになりますが、それは明日かもしれないし、10年後かもしれません……。

     ロングテールであれば、順位から再生数への変換係数は、滑らかになりますから、「順位視点の規模別合計」でもロングテールの傾向をつかむには充分です。その後より詳しく検討したければその時始めて「値視点の規模別合計」を求めるのでも良さそうです。

     以上とても技術的な内容でしたが、ニコニコデータセットのおかげで積年の問題が進んだ瞬間でした。


    コメントを書く
    コメントをするにはログインして下さい。