抽選数字の出現頻度をグラフで描画する

データ解析っぽいことをやってみたいので、とりあえず抽選数字の出現頻度を棒グラフで表示してみることにします。
Pythonでグラフを描くためには、matplotlibというグラフ描画モジュールをインストールします。

$ pip install matplotlib

現在のソースファイル

これまでに作ってきたソースファイルは以下のようなディレクトリ構造になっています。
lotonumber (パッケージの最上位ディレクトリ)
├── __init__.py
├── algo
│   ├── __init__.py
│   ├── distribution.py
│   └── scanty_number.py
├── all_loto.py
├── analysis.py
├── analysis_basic.py
├── data
│   ├── loto6.csv
│   ├── loto7.csv
│   └── miniloto.csv
├── loto.py
├── loto6.py
├── loto6_analysis.py
├── loto7.py
├── loto7_analysis.py
├── loto_basic.py
├── miniloto.py
├── miniloto_analysis.py
├── read_loto6.py
├── read_loto7.py
└── read_miniloto.py

基本解析クラスに出現回数を求める関数を書く

AnalisysBasicクラスにfrequencyという関数を追加します。

(ファイル名) analysys_basic.py
追加部分のみ。

class AnalysisBasic:
〜省略〜
    def frequency(self):
        """抽選数字の出現頻度をリストで返す
        """

        # 抽選数字データを走査し、数え上げる
        nums_dist = defaultdict(int)
        for loto_basic in self._data:
            for col in range(self.div):
                number = int(loto_basic.nums[col])
                nums_dist[number] += 1

        # 数え上げた数字(辞書)をリストに変換する
        # 数字の昇順に出現回数が並ぶ
        dist_list = list(range(self.max_no))
        for key in nums_dist.keys():
            dist_list[key-1] = nums_dist[key]

        return dist_list
〜 省略 〜

基本解析クラスに出現頻度を求める関数を書く

AnalisysBasicクラスにnumber_ratioという関数を追加します。
出現回数を求める関数(frequency)は既に作ってあるので、全数字の個数で割れば求まります。

    def number_ratio(self):
        """抽選数字の出現確率を返す
        """
        nums_ratio = np.array(self.frequency(), dtype=np.float64)
        return nums_ratio / sum(nums_ratio)

棒グラフの表示

loto.pyのmain()関数からnumber_ratioを呼び出し、取得したデータを棒グラフにして表示します。

(ファイル名) loto.py
– コマンドライン引数部分は省略 –

def main():
    loto_class = [MinilotoAnalysis, Loto6Analysis, Loto7Analysis]

    all_loto = AllLoto()
    loto_data = [all_loto.miniloto, all_loto.loto6, all_loto.loto7]
        
    analysis = loto_class[div-5](loto_data[div-5])

    ratio = analysis.number_ratio()
    plt.bar(list(range(1, len(ratio)+1)), ratio)
    plt.show()

if __name__ == '__main__':
    main()

PyPIにアップロードしておいたので、以下のコマンドでご使用の環境にインストールすることができます。

$ pip install lotonumber==0.0.7

※アーカイブファイルを自力で展開&配置するときは、lotonumber-0.0.7.tar.gzをダウンロードしてください。

(実行結果)
ミニロトのとき。

$ python loto 5

ロト6のとき。

$ python loto 6

ロト7のとき。

$ python loto 7

ロト7は、まだ抽選回数が少ないから数字の出現頻度にバラつきはありますが、ミニロトとロト6は、なんとなく理論値に近付いているように見えます。
まあ、当たり前と言えば当たり前ですが。

今後の対策

ロトくじプログラムは、大きく2つの部分に分けられます。
すなわち、データ解析と抽選数字予想です。

プログラムの設計としては、コマンドライン引数を解析し、機能を振り分ければ良さそうです。
標準ライブラリのargparseを使って、これを実現します。