ニコニコ動画再生数は対数正規分布に従う

公開されている約830万件のデータから、ニコニコ動画再生数の度数分布は、対数正規分布に従うと判明。

ニコニコ動画の再生数を幾つかのキーワード検索結果から調べたところ、どうやらベキ乗則に従うのではないか、
といったことを前回の記事に書きました >> [id:rikunora:20140311]
ところが、このデータを詳しく調べて、「対数正規分布に基づいているのではないか」とコメントしてくれた方がいました。
『な ば せ  』さんという方です >> http://t.co/tPfSqyO7wS
そこで、公開されているニコニコ動画の全動画データを調べたところ、
動画再生数の分布は確かに対数正規分布によく一致することが確認されました。
* ニコニコデータセット >> http://www.nii.ac.jp/cscenter/idr/nico/nico.html

ニコニコ動画に2012年11月初旬までに投稿された約830万件の動画のメタデータと,それに対するコメントデータです。

元データは 8,305,696件、最終投稿日は 2012-11-01 07:09:22 となっていました。

まず、全動画の順位と再生数をグラフにしました。

軸にへばり付いているような紫色の線がデータです。ほとんど"直角"ですね!
円の中心は(順位,再生数)、半径は同順位にある動画数を示しています。
・一部の上位動画が大きく突出している、
・下位に同順位がひしめいている、
様子が見てとれることと思います。

このままだと"へばり付いている部分"の詳細がよくわからないので、同じデータを両対数プロットし直したものが、次のグラフです。

このように、滑らかなカーブを描くことが分かりました。
前回の記事では、一部のデータから「だいたい直線になるんじゃね?」と考えたのですが、
改めて全データを見直すと、直線に比べて、下位の落ち込みと、上位の"しなり"がはっきりします。
※ 両対数プロットで直線となるのが「ベキ乗則」です.

同じプロットですが、同順位にある動画数を円の大きさで示したのがこのグラフです。
対数表示なので、ますます下位に動画がひしめいているように見えます。

この滑らかなカーブの正体が気になるところなので、とりあえず思い付いた、以下4つのモデルを試してみました。

 ・エントリーNo.1、べき分布
 ・エントリーNo.2、指数分布
 ・エントリーNo.3、正規分布
 ・エントリーNo.4、対数正規分布

モデルの当てはまりには、R言語の非線形回帰を用いました。
830万件ものデータを直に計算するのは大きな負荷がかかります。
そこで、モデルの比較にはランダムにサンプリングした 1000件のデータを用いました。
また、順位、再生数とも大きな数だったので、モデル比較には(順位÷10),(再生数÷10000)の整数値を用いてあたりを付けました。

■ エントリーNo.1、べき分布

黒が実データ、赤があてはめ結果です。
このグラフは、横軸が再生数、縦軸が順位(1位が一番下)となっています。
つまり、上に挙げたグラフと縦横が逆になっています。
下位の密集地に分布をあてはめた結果として、上位にズレが生じています。

# R言語非線形回帰を実行
> result_pow <- nls( ord ~ A * (cnt+1) ^ (-B), start=c(A=830, B=1), data=nico_samp, control=nls.control(warnOnly=TRUE) )
> summary( result_pow )

Formula: ord ~ A * (cnt + 1)^(-B)

Parameters:
Estimate Std. Error t value Pr(>|t|)
A 1.121e+03 1.138e+01 98.50 <2e-16 ***
B 2.687e-01 3.417e-03 78.63 <2e-16 ***

    • -

Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 79.24 on 998 degrees of freedom

Number of iterations to convergence: 9
Achieved convergence tolerance: 8.973e-06

> AIC( result_pow )
[1] 11586.84


■ エントリーNo.2、指数分布

べき分布よりは良くあてはまっているようです。
でも、コーナーの曲り具合がいま一つです。

> result_exp <- nls( ord ~ A * exp( - B * cnt ), start=c(A=830, B=0.01), data=nico_samp, control=nls.control(warnOnly=TRUE) )
> summary(result_exp)

Formula: ord ~ A * exp(-B * cnt)

Parameters:
Estimate Std. Error t value Pr(>|t|)
A 7.198e+02 3.365e+00 213.94 <2e-16 ***
B 8.283e-03 1.153e-04 71.86 <2e-16 ***

    • -

Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 54.34 on 998 degrees of freedom

Number of iterations to convergence: 9
Achieved convergence tolerance: 3.507e-06

> AIC( result_exp )
[1] 10832.53


■ エントリーNo.3、正規分布

微妙な当てはまり具合です。
当てはめた正規分布の平均値が -846.6 であることから、これは正規分布の"裾野の部分"をあてはめた結果だと知れます。
ちょっと無理矢理な感じです。

> result_norm <- nls( ord ~ A * (1 - pnorm( cnt, mean=M, sd=D )), start=c(A=830, M=0, D=500), data=nico_samp, control=nls.control(warnOnly=TRUE) )
> summary( result_norm )

Formula: ord ~ A * (1 - pnorm(cnt, mean = M, sd = D))

Parameters:
Estimate Std. Error t value Pr(>|t|)
A 3029.2 9044.6 0.335 0.738
M -846.6 2109.1 -0.401 0.688
D 778.6 607.1 1.282 0.200

Residual standard error: 170.9 on 997 degrees of freedom

Number of iterations till stop: 26
Achieved convergence tolerance: 2.783
Reason stopped: step 因子 0.000488281 は 0.000976563 の 'minFactor' 以下に縮小しました

> AIC(result_norm)
[1] 13125.55


■ エントリーNo.4、対数正規分布

おおっ、正にピッタリ!

> result_lgnorm <- nls( ord ~ A * (1 - plnorm( (cnt+1), meanlog=M, sdlog=D )), start=c(A=800, M=10, D=1), data=nico_samp, control=nls.control(warnOnly=TRUE) )
> summary( result_lgnorm)

Formula: ord ~ A * (1 - plnorm((cnt + 1), meanlog = M, sdlog = D))

Parameters:
Estimate Std. Error t value Pr(>|t|)
A 8.519e+02 4.843e-01 1759 <2e-16 ***
M 3.920e+00 1.780e-03 2202 <2e-16 ***
D 1.940e+00 1.919e-03 1011 <2e-16 ***

    • -

Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 2.693 on 997 degrees of freedom

Number of iterations to convergence: 14
Achieved convergence tolerance: 3.209e-06

> AIC(result_lgnorm)
[1] 4824.285


ということで、対数正規分布が最も良く当てはまっていることが分かりました。
モデルの当てはまりは、AICという指標によっても確認できます。
AICが小さいほど良いモデルだと言われています。
確かに、対数正規分布の4824.285が、ダントツで小さくなっています。

上の比較はサンプリングデータで行ったので、元の830万データで改めて対数正規分布の当てはまりを確認します。

文句なしにピッタリですね!
※ グラフは1000点だけサンプリングして表示しています。830万件を直接表示するのは無理。

> result_real_lgnorm <- nls( dl_order ~ A * (1 - plnorm( (dl_count+1), meanlog=M, sdlog=D )), start=c(A=8.519e+06, M=4, D=2), data=nico, control=nls.control(warnOnly=TRUE) )
> summary( result_real_lgnorm )

Formula: dl_order ~ A * (1 - plnorm((dl_count + 1), meanlog = M, sdlog = D))

Parameters:
Estimate Std. Error t value Pr(>|t|)
A 8.419e+06 2.510e+01 335419 <2e-16 ***
M 6.245e+00 9.577e-06 652126 <2e-16 ***
D 1.936e+00 1.071e-05 180721 <2e-16 ***

    • -

Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 14290 on 8305693 degrees of freedom

Number of iterations to convergence: 7
Achieved convergence tolerance: 2.913e-07

このグラフを両対数プロットしてみましょう。

当初の実データに見られたカーブの様子が、よく再現されています。
※ グラフの縦横が逆になっていることに注意、横軸がカウント、縦軸が順位です。

以上の結果からして、動画再生数の分布は対数正規分布で間違いないように思われます。
それでは、対数正規分布とは、どういった性質を持つのでしょうか?
1つの解釈として「動画再生数は、順位の小ささに比例して上がりやすくなる」のだと言えるでしょう。
つまり、100位の動画が再生数を1だけ上げる努力と、10位の動画が再生数を10だけ上げる努力は同じだということです。
詳しくは以下の記事をどうぞ。
* 対数正規分布の仕組み >> [id:rikunora:20100418]

※ 3/28追記.
* ニコニコ動画と日本の都市人口の意外な関係 >> [id:rikunora:20140328]