はじめに
番外編2では、loto6のデータをPandasを使ってより分析に適した形状に整理した手順をご紹介します。
手順は以下になります。
- 当選数字のベクトル表現
- キャリーオーバー額の1行ずらし
- 販売実績額の追加
当選数字のベクトル表現
まずは必要なライブラリをインポートします。
In [1]:
import pandas as pd
データを読み込みます。
In [2]:
df = pd.read_csv('loto6.csv', encoding="cp932")
#データ確認
df.head()
Out[2]:
入手できるデータのフォーマットでは、「本数字1〜ボーナス数字」、という項目名で数字が入っています。このままだと、「1が出た時はどうなっていたか?」等の分析がしにくいため、ベクトル表現版を作成します。ベクトル表現の意味が分からない方は、具体的に以下を見ていただけば意味が分かると思います。まずは入れ物のデータフレームを作ります。
In [3]:
adf = pd.DataFrame(index=df.index, columns=range(1, 44), data=0)
#データ確認
adf.head()
Out[3]:
ベクトル表現とは、要するに、ロト6の出目である1〜43の項目をつくり、出ていれば1、出ていなければ0とする、ということです。for文を使って値を埋めていきましょう。ここではもう少し工夫して、「本数字1ならば1、2ならば2・・・ボーナスならば7を入れる」という作業を行います。
In [4]:
#1行ごとに実施
for i in range(len(df.index)):
#本数字1〜ボーナス数字」の部分だけを取り出し
tdf = df.iloc[i, 3:10]
#tdfの1要素ごとに実施
for j in range(len(tdf.index)):
#adfの該当の場所に数値(本数字1ならば1、2ならば2・・・ボーナスならば7を入れる)
adf.loc[df.index[i], tdf.iloc[j]] = j+1
#データ確認
adf.head()
Out[4]:
dfと比較してみると、第1回は2が本数字1なので1、39がボーナス数字なので7、等々、正しく入っていることが確認できました。
キャリーオーバー額の1行ずらし
dfを見ると分かるように、現状のデータでは「次回のキャリーオーバー額」が入っています。ただ、実際に購入口数や当選数と影響があるのは「今回のキャリーオーバー額」ですよね。そこで1行ずらしてこのデータを作りましょう。
In [5]:
df['キャリーオーバー_今回'] = df['キャリーオーバー'].shift(1).fillna(0).astype(int)
#データ確認
df.iloc[:, 10:].head(10)
Out[5]:
1行ずれたギャリーオーバー額が出来ています。
販売実績額の追加
上記のデータに、さらにスクレイピングで取得した販売実績額を加えましょう。
In [6]:
sdf = pd.read_csv("salesData.csv", usecols=['販売実績額'])
#データ確認
sdf.head()
Out[6]:
ここまで作ったすべてのデータを結合します。
In [7]:
df = pd.concat([df, sdf, adf], axis=1)
#データ確認
df.head()
Out[7]:
In [8]:
#項目名の確認
df.columns
Out[8]:
最後に保存して終了です。
In [9]:
df.to_csv("loto6_allData.csv")
やはりPandasは便利ですね。