順位を支配する黄金ルール | 科学アラカルト [実践] | 逆ポーランド電卓の実践ウェブ rpn hacks!

逆ポーランド電卓の実践ウェブ rpn hacks!

逆ポーランド電卓rpnの実践ウェブ   
rpn hacks! アールピーエヌ・ハックスサイトマップ

rpn | 実戦 | 科学アラカルト | 科学に関する話題をrpnで探求!調べて実験してみよう。

HOME > 実践 > 科学アラカルト > 順位を支配する黄金ルール

hatena twitter facebook rss ソーシャルブックマーク

順位を支配する黄金ルール

 人はランキングが大好きで、何にでも順位を付けたがります。その特性を利用しようとテレビもラジオもインターネットもランキングだらけです。とにかく、ランキングさえ見ていれば安心とばかりに似たような音楽や似たような書籍、似たような意見が人気を集めます。

その結果、ランキング上位への集中が見られるようになります。書籍やCDで売れるのはベストテンばかりといった現象です。特にランキングで1位の販売数はダントツに多く、順位が下がる度に数が急減していきます。

検索サイトもサジェスチョンが導入されたことで、トラヒックの流れが大きく変わりました。ファットテールも過去の言葉のように聞こえますね。また、論文の参照数から重要度を判定するヒントを得たGoogleの検索システムもウェブサイトの被リンクと異なり、TwitterやFacebook等でリンクしあうソーシャルネットワークの増大により質の高いサイトのランキングに失敗している可能性もあります。
        *


 いずれにしても、順位と販売数(占有率:全体に占める割合)には密接な関係がありそうです。順位が落ちると占有率はどのように減っていくのでしょうか。今から100年近く前、このような関係を調べたジップの法則(Zipf's Law)という興味深い法則があります。

ジップの法則(またはジフの法則)はもともとは言語学の法則なのですが、アメリカの言語学者ジョージ・キングズリー・ジップ(1902~1950)が英単語の使用頻度と順位について調べたことから発見されました。別名、ランクサイズルールとも言います。

ちなみに英単語の使用頻度は1位がtheで10%、2位のofは5%、3位のandで3%だったそうです。後述するジップの法則で逆算すると、約12,000種類の単語での調査だったことにが分かります。

法則の応用範囲は広く、自然現象から社会現象まで適用できます。なお、ジップの法則に従うものをジフ構造とも言うそうですが、この法則を使うとそれぞれの順位の占有率が予め分かってしまうというから驚きです。

情報ジップの法則と似たものにベンフォードの法則があります。突き詰めていくと共に冪乗則の仲間だということが分かります。ベンフォードの法則に関しては実践コーナー(統計アラカルト)のウソの数字を見破る方法に詳しくあります。興味があれば閲覧ください。

ジップの法則

 ジップの法則は経験則です。経験則なので証明はできないのですが、自然現象や社会現象に対してかなりの一致が見られます。法則自体は次の簡単な数式で表されます。

         1
        ---
         k
  z = -------
      m    1
      ∑  ---    ※k番目に多い出現頻度の要素が全体に占める割合は
      n=1  n       1/kに比例する(kは順位、mは全要素数で有限)。


この数式を使って実際に計算してみましょう。例えば、全部の要素が10あるうちで1位が占める割合は、ちょっと複雑ですが次のrpn式で計算できます。

  >rpn @n 1 + #n @n n @s + #s -e 1 n @s / -r 10
  0.341417


占有率が34%あることが分かります。結構な割合ですね。

もし、全体の要素数を増やしたい場合は最後の-rオプションの後の数字を変更します。占有率を知りたい順位は-eオプションの後の数字を変更すればOKです。

10位までをジップの法則で計算

 さて、上記のrpn式を入力してもいいのですが、煩雑なのでrpnプログラムも用意しました。プログラムの名前はzipfです。使い方は簡単で1位の占有率を計算するには以下のrpn式を使います。

  >rpn 1 10 -c zipf


先頭の数字が順位を表します。この例では1位です。1の後の10は要素が全部で10あることを示しています。つまり10位中1位が占める占有率を計算しています。同様に2位なら以下になります。

  >rpn 2 10 -c zipf


この調子で10位まで続ければよいのですが、面倒な場合は次のようにします。tmpファイルに1から10までの数字を先に保存しておきます。

  >type tmp
  1
  2
  :
  (中略)
  :
  9
  10


このテキストファイルを次のようにzipfプログラムに読み込ませれば、1位から10位まで連続して計算できます。

  >rpn 10 -c zipf <tmp


ファイルを先に用意するのが面倒な場合は、以下のように他のプログラムと連携する方法もあります。以下の例では、1から10までの数値をseqプログラムに生成させて、zipfプログラムに引き渡しています。これで10位中1位から10位までの占有率が一気に計算できます。

  >rpn 10 -c seq | rpn 10 -c zipf


あるいはzipfプログラム単体でリピート指定を使用して、次のようにrpn式を書いても同じように計算できます。

  >rpn @n 1 + #n @n 10 -c zipf -r 10


どれでも好きな方法が使えます。以降、seqプログラムを使って説明していきます。では、1位から10位までの占有率を計算させてみましょう。

  >rpn 10 -c seq | rpn 10 -c zipf
  0.341417
  0.170709
  0.113806
  0.0853543
  0.0682834
  0.0569029
  0.0487739
  0.0426771
  0.0379352
  0.0341417


1位で全体の1/3を占めていますね。2位も加えると全体の1/2を超えます。その後は急激に占有率が減っていきます。グラフ化してみましょう。

  >rpn 10 -c seq | rpn 10 -c zipf >tmp
  >rpn 1 -c rownum <tmp | xyp -x,10 -y,.5 -s1,.1 -n
  ^y 0.5
  |
  0.4
  |
  |  *
  0.3
  |
  |
  0.2
  |      *
  |
  0.1        *
  |              *   *
  |                      *   *   *   *   *
  |o                                    10
  +--1---2---3---4---5---6---7---8---9--->


横軸が順位で縦軸が占有率です。急激に値が減っていく様子がよく分かります。では、これらの占有率を累積していくとどうなるでしょう。

  >rpn 10 -c seq | rpn 10 -c zipf | rpn -c rowacc
  0.341417
  0.512126
  0.625932
  0.711286
  0.77957
  0.836473
  0.885247
  0.927924
  0.965859
  1


80%を超えるのが6位の段階なので、パレートの法則とは一致していない気がします。しかし、実際に計算してみると分かりますが、要素数が100になると累積数が80%を超えるのは36位、1000になると累積数が80%を超えるのは224位です。徐々に80対20の法則に近づいていることが分かります。

ちなみに要素数が10000になると占有率の累積が80%を超えるのは1412位のときです。パレートの法則の代表である80対20を超えています。
        *


 次にジップの法則が適用できると言われているいくつかの事例について、rpnを使って実際に検証してみます。

ウェブへのアクセスランキング

 ウェブへのアクセス数はジップの法則に従うらしいのですが、さっそく試してみましょう。集計したデータはファイルの"access.txt"に格納されています。

  >type access.txt
  1    8488
  2    4241
  3    4015
  4    3957
  5    1857
  6    1672
  7    1631
  8    294
  9    97
  10   90


ジップの法則に従っているか判定する簡便法として、順位とアクセス数を掛ける方法があります。1×8488=8488、2×4241=8482、3×4015=12045のように大体同じであれば可能性があります。ただし、機能しないことも多くウェブのアクセス数の事例では大きくズレています。

アクセス数をグラフ化してみましょう(左側が実数グラフ、右側が対数グラフ)。実数グラフを見るとアクセス数が1位のページは高い数値ですが、順位が下がるに従って急激にアクセス数が低下している様子が分かります。一方、片対数グラフではほぼ線形(直線)になるので、冪乗則の可能性が感じられます。

   アクセス数                       アクセス数
   ^y 10000      ウェブページへの   ^y 100000          片対数グラフ
   | *           アクセス数の分布   10000
   7500                             | *
   |                                |    *  *  *  *  *  *
   |                                |
   5000                             |                      *
   |    *  *  *                     100                       *  *
   |                                |
   2500          *                  |
   |                *  *        x   |                            x
   |o                     *  * 1*   |o                          10
   +-1--2--3--4--5--6--7--8--9-->   +-1--2--3--4--5--6--7--8--9-->
                           ページ                           ページ


access.txtファイルのデータは順位とアクセス数を対にして、アクセス数の多い順に並べてあります。さっそくジップの法則で理論値を計算してみます。なお、計算結果は"zipf.txt"ファイルに格納しておくことにします。

  >rpn 10 -c seq | rpn 10 -c zipf >zipf.txt


実際の値と理論値を比べてみましょう。先にアクセス数を構成比(占有率)に変換して、"ele.txt"ファイルに格納しておきます。その後、横結合で一覧表示します。

  >rpn { _ -c rowele <access.txt >ele.txt
  >paste ele.txt zipf.txt
  0.322223        0.341417
  0.160998        0.170709
  0.152418        0.113806
  0.150216        0.0853543
  0.0704958       0.0682834
  0.0634728       0.0569029
  0.0619163       0.0487739
  0.0111609       0.0426771
  0.00368233      0.0379352
  0.0034166       0.0341417


データからは互いに似ている感じがしますね。グラフ化してみると一目瞭然です。

  >paste ele.txt zipf.txt | rpn 1 -c rownum >tmp
  >xyp -x,10 -y,.4 -k2 -s1,.1 -n -m <tmp
  ^y 0.4
  |
  0.3+
  |
  |
  |
  |
  0.2
  |      +
  |          *   *
  |          +
  0.1            +
  |                  +   +   *
  |                          +   +   +   +
  |o                             *   *  1*
  +--1---2---3---4---5---6---7---8---9--->


"*"が実際の値で、"+"が理論値です。1位と2位はドンピシャリです(同じ値の場合は"+"が"*"を上書き)。他は微妙にズレていますが、それでも目視する限りではかなりの一致具合です。

次は…

 ウェブのアクセスでは人気のあるページには、よりアクセスが集まる傾向が色濃く出ます。人為的な作用が強く反映されるわけです。結局、アクセス数にしても、都市の人口にしても集まるところには余計に集まる傾向があるため、ジップの法則が有効に機能するのかもしれません。

では、人間の関与がない世界でもジップの法則は機能するのでしょうか。例えば大陸の面積や割れた破片の重さなどは人為的に操作できない領域です。そんな世界でもジップの法則は成り立つのでしょうか。

続き(part2)はこちらLinkIcon

警告rpnプログラムを実行するには、rpn試用版かrpn標準版が必要です(バージョンの違いはこちら)。

情報pasteは講座サポートで公開されています。seqはユーティリティーパッケージに同梱されています。rownum, rowacc, roweleはカンタン分析パッケージに同梱されています。xypとnpdはrpnの姉妹ソフトウェアです。詳しくはプロダクトを参照ください。

科学アラカルト

調べて実験してみよう

※実践コーナーのTOP

紹介 rpnの利用シーンはこちら…

講座初めての人のrpn基礎もどうぞ
講座しっかり学べるrpn入門もどうぞ
講座すぐに使えるdos入門もどうぞ
物語データを見抜くojt物語もどうぞ

実践他の分野への挑戦は実践TOP

応用rpnアプリケーションは応用TOP

part2

調べて実験してみよう

※実践コーナーのTOP

講座初めての人のrpn基礎もどうぞ
講座しっかり学べるrpn入門もどうぞ
講座すぐに使えるdos入門もどうぞ
物語データを見抜くojt物語もどうぞ

実践他の分野への挑戦は実践TOP

応用rpnアプリケーションは応用TOP

書籍紹介

記事に関連した書籍

本ウェブサイトで扱った話題に関連した書物で、スタッフが実際に読了したものを紹介。

書籍数学の書籍
数の世界は思ったよりもエキサイティング

書籍投資の書籍
失敗しない投資には広範囲で実践的な知識が必要

警告バックスラッシュはエンマークに読み替えて下さい(IE)。
バックスラッシュとエンマーク

警告文字で作られた図表や式が崩れることがあります。ブラウザによっては固定幅フォントをMSゴシックにするときれいに表示されます。それでも崩れる場合は図表や式をメモ帳にコピー後、閲覧下さい。

警告rpn試用版と標準版(2kリビジョン)はダブルクォートで囲って下さい。

rpn 1 2 + ⇒ rpn "1 2 +"
rpn 1 -c foo ⇒ rpn "1" -c "foo"

ダブルクォートは省略できることが多いのですが、慣れない間は囲んだほうが無難です。なお、本ウェブサイトの記事ではrpn標準版(98リビジョン)を使用しているため囲っていません。詳しくは技術サポートの「rpn TIPS参照ください。

注意rpnの障害情報はこちら

警告rpn試用版の場合、複雑なプログラムや処理時間のかかるプログラムの一部には動作しないものがあるかもしれません。あくまで無料提供であることを勘案・了承ください。rpn標準版は、すべてのプログラムが動作します。