前回Rubyでどちらのメソッドが良く使われているかについて集計結果を見てみましたが、今回はその続き、ここで取れた結果を別の見方で集計してみてみましょう。
まずは前回のおさらいで集計方法の簡単な説明です。
集計は以下の基準でコードを収集して行いました。
- bestgems.orgでランキングされている人気のgemで、ダウンロード数Top 500のコードをサンプルにする
- 各々のgemの中の
lib
ディレクトリ以下を調査の対象とした。つまりはテストのコードは集計から排除した - 動的な言語なのでどのクラスに属しているかの推論は諦めて、あくまでメソッド名の集計結果とした。
そして、集計のためのコードはgithub上に、公開してあります。
これまでの段階で、メソッドとその呼ばれた回数は既に分かっているので、あとはこれをpythonで集計して表示するだけです。このコードも同じgithubリポジトリ上に置いておいたので興味があったら確認してください。
さて、まずはメソッドとその使用回数を単純に、使用回数の多い順で棒グラフで表示して並べてみた結果が下の図です。
数が多いので、見やすい様に、上位100位までをプロットしています。
ふむふむ、きれいに並んでいますね。
こういうふうに何かしたらの曲線が出てくると、ここには何か法則がある様に見てきます。
ですので、もう少しグラフを整理してみましょう。
見た所、値が急激に下降しているので、これでは変化の具合が見えずらいです。
そこで定番ですが、対数を利用するという事で、表示は、両対数グラフの上にプロットをし直してみようとしたところ、表示された結果は、なかなかおもしろい結果になりました。
なんとなく、直線になっているのがわかるでしょうか?
…実はこの結果は、あらかじめ予想をしていて、これはジップの法則という、そもそも自然言語の研究の世界で見つかっている法則と同じものなんですね。
log(rank)が2だとeの2乗は7.39なので、上位7位までの数値。
log(rank)が8以上から、グラフがジグザグに変わって来ているのは、呼ばれた回数が10回以下の値がここに現れているので、呼び出し回数の1回の変化に敏感になっているからですね。
分かりやすい例として、Wikipediaから取ってきた、英語やスペイン語等30の言語で同じようにグラフを作成した結果を取ってきて、下に図としてまとめました。
どの言語も、おおよそ直線性を持って近い範囲に値が集約しているのが見て取れるでしょうか。
今回は、プログラミング言語でもこの法則が適応可能か確認してみるのを目的の一つとして、統計を取りました。
Rubyでもこの法則が通用出来る、というか思った以上に綺麗な結果が出てきて驚いています。
プログラミング言語も、人の使う道具として自然言語と同じような法則が隠れている可能性を感じたので
誰か他のプログラミング言語でも試してみると面白いのではないでしょうか。