俺の報告

RoomClipを運営するエンジニアの日報(多分)です。

今更聞けない、べき則、ロングテール、ジップ則について - 日報 #137

日々是勉強でございます。
RoomClipに対するアカデミックな側面からのアプローチも、
少しずつ形になりつつあります。
ということで今日はそんな話。

これ以降このブログでも乱発されるワードがあるので、
まずそいつについて少し。

べき則とかいうワードがあります。
本当はべき乗則とか言って、もっと本当は累乗とか言うらしいんだけど、まぁそのへんの話です。

やれロングテールだ、
やれパレートだとかいう言葉はとても便利ですが、
改めて厳密に、と言われると大概難しくなるのがこの界隈のよくないところです。
ロングテールをぼんやりと「超売れてるのは一部だけ、ほとんどあんまり売れてない、けど売れてない奴すごい量」みたいなイメージで、 そのままべき則だのジップ則だのを理解しておけばいいだけの話だとも思うので、
それを目指します。

べき則というのはそもそも、累乗の話です。
xの4乗、とかいったらもうそれべき則の話です。
これを本質的に言うならば、4乗とか5乗とかはどうでもよくて、
とにかく「自分と同じものをかける操作」というものを「べき乗する」と呼ぶんですね。
だから、べき乗関数といったら、もうすごい簡単で、

f(x) = x^k

これで終わりです。
Wikipediaにいったらランダウの記号Oとか比例定数aとかが記載されてますが、
早い話が「この関数を超支配している部分」は x^k だけです。
細かいことはいいので、こいつだけみてりゃいいんです、という式ですね。
どうしてもランダウが気になる方は、この式を見ればなんとなくランダウが「どの程度適当なやつか」がわかると思います。

(x + 1)^2 = x^2 + 2x +1 => x^2 + O(x)

2x + 1 とかゴミなんでまとめときますね、ランダウで。
大事なのはx^2なんで、それ以外はほぼ大勢に影響及ぼさないんで、
くらいのノリで理解してOKです。

話が脱線した。

とにかく「自分と同じものをかける操作」というものを「べき乗する」と呼ぶんですね。

さて、
べき乗とやらがたんに「自分をかける操作」ということがわかった上で、
なぜこの関数がこうももてはやされるのかという話に移ります。
有名なジップ則の話です。

いろんな説明の方法があると思いますが、
すげーーーーー簡単に、でも概ね間違わないように説明してみます。

じゃぁ皆しってるロングテール的な状況を想定してみます。
さらに分かりやすいようにアイスクリーム売り場を想定してみます。

あるアイスクリーム屋の味毎の売上をみてみると、「バニラ味一強」状態でした。
続いてチョコ味、ストロベリー味、と中々の強豪が続きますが、
まぁ大体4位くらいから雑魚化していき、
店長の気まぐれで作ったシリーズ100種(春の七草味、タバコ味などのゴミ)に至っては1件売れればいい程度のクソっぷりだったとします。
でも10位から100位までの売上を足し上げると、まぁそこそこあるなぁくらいだったとします。

ようはロングテールだったわけですね。

さて、この時バイトの平山君はこう思ったんです。
「順位の値が小さいやつだと、売上数は大きい。順位の値が大きいと、売上数は小さい。」
当たり前です。
「じゃぁ、なんとなーく、(順位の値)と(売上数)を掛けあわせたら、大体全部同じくらいの値になるんじゃないの?」
小さい奴は大きくて、
大きい奴は小さい、
と聞いたらなんとなく「かけたら一緒くらいじゃね?」とか思うのは人の性です。
つまり、順位の値rと売上数nをかけたらaになる!という予想をしたんですね。
これって要は、

順位の値:r, 売上の値:n, なんか適当な定数:a としたら、
r * n = a
n = a / r

っていうことです。
ですが、勿論そんな簡単じゃないんですね。
全然そんな風にならない。
でもバイトの平山君は粘着質だったので、
「でもさ、順位が小さくなれば売上が大きくなるわけでしょ、なんか関係があるわけでしょ。」
ってことで、横軸に順位、縦軸に売上をとってプロットしてみるんですよ。

するとこれはもう皆知っての通り、
ロングテール」のグラフの形になるわけです。
もうさっき触れてるから当たり前です。

「あぁーロングテールってやつかぁ。。。すごいy=1/xの形には似てるけどなぁ。。。」

確かに最初の予想である、 n = a / r の形には凄い似ています。
でもそうじゃない。
困ったところに神の声です。

「これこれ、そこの能なし。いいから黙って対数をとってみるのじゃ。。。

信託を受けて、横軸にlog(順位)、縦軸にlog(売上)をとってみることにすると。

な、なんと、
見事に直線になるではないか!
ってことは式が簡単に導ける!
中学でやった比例のグラフや!簡単や!
確かy=ax+b的な話のはず!

y: log(売上), x: log(順位) としたら、
log(売上) = k * log(順位) + b
log(n) = k * log(r) + b

bは適当だから、b = log(B)とかおいてもええやんな。

log(n) = k * log(r) + log(B)
log(n) = log( r^k * B)
n = r^k * B
ごちゃごちゃしたが、最終形は、
r^(-k) * n = B

おぉ!なんか当初目指していた形、

r * n = a

これにめっちゃ近い!
ただ r が r^(-k) とかいうワケワカランものになってる!
これどういうことかわからないけど、
冒頭の「べき乗」の議論に戻ると、たしかべき乗は「自分自身をかける操作」をいうのであって、
^(-k)とかどうでもいいんだったよね。
じゃぁこれは「rのべき乗」ってことだよね。

つまりこれは、「rのべき乗とnの積は一定!」っていうことだ!
最初の予想「順位と売上の積は一定」は間違っていたけど、
「順位のべき乗と売上の積は一定」というのが正解だったんだね!

神「そうじゃったのだよ、、、この能なし、、、」

ってことになります。
んで恐らく、これがジップ則です。
具体的に言うと、

1位 バニラ味:売上 1,000個

4位 バナナ味:売上 ?個

となっていたら、単純に「順位と売上の積は一定」なら、バナナ味は250個なんだけど、
これは間違っていて、
「順位のべき乗と売上の積は一定」なのだから、 もしべき乗の指数kが2とかなら、62個までさがっちゃうんです。
逆に指数kの値が1/2なら、まだ500個なんですね。

さて、
長ったらしくジップ則を説明してきましたが、
そもそもなぜこんなにべき則が面白がられるかというと、
スケール不変という性質があるからなんですね。

今までの議論でわかったこととしては、
大事なのは a とか B の値じゃなくて、
「べき乗の指数はいくつなの?」ということに尽きるということです。
売上の話で言うと、指数kが猛烈に重要な値で、
グラフの形を決めているのはこの変数です。
よってこれを一般にスケーリング指数とかと呼ぶわけですね。
え、じゃぁBとかその、一定の値は?
これは本当に全く重要じゃないんです。
例えば、スケーリング指数が2で同じなら、1位のバニラの売上が1,000であろうと1億であろうと、
バナナ味までの落ち込み方は一緒で、
要は1位が1000の時のグラフを書いて、
その縦軸の値の1000のところを1億に書き直せば、
そのまま1億の時のパターンになっちゃうわけです。

これはフラクタルなどによく見られる性質で、
すごい面白い性質ですよね。
だからというわけではないですが、
この「べき則」というものはやけに面白がられます。

あぁHeaps則も勉強しようと思ったが、もう書くのが面倒なので、今日はここまで。