LOTO6のデータ分析 その1(各数字の出現頻度)
機械学習を勉強する上で定番のプログラム言語「Python」を勉強中です。
でも、手近なデータがなかなかないし、参考書に乗っているものを写経するのも写してるだけなので、自分で考えて打ってみる題材としてLOTO6のデータを使ってみました。初心者がプログラムの勉強のためにデータをこねくり回して遊ぶにはいいんじゃないでしょうか。
まずは、過去300回のデータで、それぞれの数字がどのくらいの頻度で出現しているかの頻度分布を出してみようと思います。
(初心者の勉強用なので、変な書き方してあるところもあること、統計解析、機械学習ではなく、あくまでデータを扱うのに慣れることも目的としてますので了承ください。)
補足 LOTO6とは
①1~43の数字の中から異なる6個の本数字と1個のボーナス数字を選ぶ数字選択式宝くじ。
②抽せんされた数字が、自分が選んだ数字といくつ一致しているかで、1等~5等までの当せんが決定。
③当せん金額は、各回の発売総額と、当せん口数によって変動します。
ではいってみましょう。
初めは各種モジュールのインポート
import numpy as np import pandas as pd import matplotlib.pyplot as plt %matplotlib inline import seaborn as sns
このような開催回数と、1~6までのナンバーの入ったエクセルファイルを読み込んでみました。エクセルファイルは適当なホームページからコピペしただけです。
ここでは簡単のため、ボーナスナンバーは排除しています。開催回は1189回~1488回。
# エクセルデータの読み込み xlsx = pd.ExcelFile('Data2020_.xlsx') df_xlsx = pd.read_excel(xlsx,'Sheet1') df_xlsx.head()
そこから、ナンバーだけを抽出。
# 番号の抽出 df = df_xlsx.iloc[:,1:] df.head()
頻度をカウント
数値を一列に並べ替えてベクトルにします。
# dfのベクトル化 Narray = df.values m = df.shape[0] n = df.shape[1] Narray = Narray.reshape(m*n,1) print(Narray)
[[17]
[10]
[34]
...
[30]
[24]
[38]]
固有の値「u」と、その値のそれぞれの頻度「counts」を返してくれる「np.unique」を使用。
# 各ナンバーの頻度を算出 u, counts = np.unique(Narray, return_counts=True)
グラフ化
# グラフ化 sns.set_style("whitegrid", {'grid.linestyle': '--'}) fig = plt.figure(figsize=(14,5)) plt.bar(u,counts) plt.title('Frquency of Number',size=15) plt.xlabel('Number',size=15) plt.ylabel('Frquency',size=15) plt.ylim([0,70]) plt.xticks(u, fontsize= 12, rotation=90)
barグラフを表示するだけだと、詳しく頻度が見れないためデータラベルも追記します。ラベルを貼るだけなのに、forループを回さないといけないというめんどくささ、、エクセルの方が簡単ですね。
# barグラフにデータラベルを追記 for i in range(43): plt.text(i+1, counts[i]+0.5, counts[i], horizontalalignment='center',size=12)
まとめ
見えてきました。最も出現頻度が高いのは「24」、低いのは「13」でした。とくに「24」は突出していますね。なにか理由があるんでしょうか?その差はなんと33回!300回もやったら、なんだかもっと均等になるかと思ったんですが、結構ばらつきがあるんですね。これって本当にランダムな数字なの?
ちょっと気になってしまいましたので、次はそこらへんを検証してみたいです。