本稿では、ボートレースの公開情報を利用して、着順を予想しつつ、ForePaaSの使い方やできることのイメージをお伝えできればと考えています。
※モデルのスコアを実用性のある精度にすることは本記事の対象としていませんが、ファンとしてできる限り頑張ります。
なぜ公開データか?
なぜボートレースか?
僕はこれまでは単に選手の情報や艇番をもとに頭の中で予想するだけでしたが、前述したとおり予想に使用できうるデータはいくつもあり、また大量のデータが公開されています。これらのデータを使えば、簡単な機械学習モデルでもデータに基づいた勝敗予想ができるのではないかと考え、ForePaaSを使ってモデル実装をしてみることにしました。
また、簡単なレースだけ的中しても、その場合は払戻金が少なくなるため、ファンとしては実入りが良いとは言えません。
もし、モデルの精度が良かった場合は、払戻金と組み合わせて勝率も分析したいと考えています。
全体の記事
■ForePaaSへの (1)データ取り込み、(2)データ加工、(3)データ分析 に関する概要

使用する言語について
筆者が普段使用しているため英語表記となっておりますが、ForePaaSでは日本語表示でご利用いただくことも可能です。
1. 今回のPartの概要
1.1. ForePaaSとは
ForePaaSにはファイルなどのオブジェクトを格納する場所として「バケット」、ForePaaS内で利用するデータとして格納する場所として「テーブル」、アクション内で一時的にローカル利用できる「ディレクトリ」が用意されています。また、それらを加工し分析する処理を作成できる機能として「アクション」、テーブルのデータを画面に表示する「アプリケーション」といった機能が用意されています。今回は、これら機能を駆使して手順を実施していきます。
1.2. 手順概要
アクションは複数のアクションを作成し実行することができ、それぞれ何かのアクションの後に実行したり(トリガー実行)定期的に実行したり(バッチ実行)することができます。
今回は公開データの取得とテーブルへの格納を「データ読み込み用アクション」として1つのアクションに定義し、毎日実行されるようにしてみましょう。
データ読み込み用アクションの処理の流れ
②配置/③読み取り(今回の公開データはLZH形式で圧縮されたファイルであるため、一度バケットにダウンロードして解凍したデータをテーブルに追加していくアクションを定義します。)
④加工
⑤テーブルへ格納
■データ読み込み用アクションの処理の流れ

2. テーブルの定義
今回ダウンロードできる解凍後のデータを見てみます。
ダウンロードするデータ
競争成績データ
日ごとの各レース場のレース結果が記載されています。
レースタイム、着順、組み合わせごとの払戻金などが記載されています。
今回大事な情報は着順と艇番になるため、着順と艇番※がキーとなります。
※艇番は最初のコース取りに出走する順番であり、ほとんどの場合はこの艇番どおりにインコースからコース取りがされていきます。ボートレースはインコースが圧倒的に有利な競技であり、最初のコース取りの順番≒艇番が非常に重要な指標となります。
番組表データ
日ごとの各レース場のレース情報が記載されています。
こちらには選手の情報が細かく記載されていますが、着順は記載されていません。
今回大事な情報は選手の詳細情報と使用するボート/モーターになるため、年齢や体重などの選手情報や全国勝率などの選手の勝率およびボート/モーターの番号とそれらの勝率がキーとなります。
2.1. 競争成績
■ForePaaSに取り込んでデータ化する対象情報1

今回は競争成績のデータを格納するテーブルを以下のように定義します。
■ForaPaaSに格納する際の形式(テーブル表)に情報を落とし込んだ状態1

2.2. 番組表
■ForePaaSに取り込んでデータ化する対象情報2

今回は番組表のデータを格納するテーブルを以下のように定義します。
■ForaPaaSに格納する際の形式(テーブル表)に情報を落とし込んだ状態2

3. 手順
目次
- ・テーブルを定義する
- ・データを収集しテーブルに格納するアクションを定義する
- ・アクションのトリガーを定義する
3.1. テーブルを定義する
今回は[ANALYZER]を使ってテーブルを定義してみましょう。
(1)競争成績と番組表それぞれのテーブル定義に合わせてサンプルCSVデータをUTF-8で作成するか、以下リンクからダウンロードします。
■競争成績

■番組表

ここではバケットの操作やテーブル定義などデータ定義に関連する機能がそろっています。
■ForePaaS操作画面(Data Manager)

■ForePaaS操作画面(Sources)

■ForePaaS操作画面(New Source)取り込みデータのアップロード

■ForePaaS操作画面(Sources)データ登録

データソースとして今回は[File Upload]を使用してCSVファイルをアップロードしていますが、APIやDBなどさまざまなコネクタが用意されています。
参照:Sources
(6)[ANALZER]にアクセスします。
■ForePaaS操作画面(Data Manager)分析1

■ForePaaS操作画面(Data Manager)分析2

■ForePaaS操作画面(Data Manager)分析3

■ForePaaS操作画面(Data Manager)データ表示

競争成績:boat_result_table
番組表:boat_race_table

■ForePaaS操作画面(Data Manager)テーブル作成1


(12)画面左にある[Build all tables]をクリックし、テーブルをビルドします。
ビルドすることで、定義したテーブル情報に従って実際にForePaaSのテーブルが作成されます。
■ForePaaS操作画面(Data Manager)テーブル作成2

3.2. データを収集しテーブルに格納するアクションを定義する
外部公開されているデータを取得してテーブルに追加していく必要があります。
ForePaaSにはユーザーが作成しなくても標準でロードアクションが用意されており、ファイルを読み込んでテーブルに展開することができます。
しかし、今回は元データがLZHで圧縮されたファイルなので、そのままファイルを読む事ができません。そういう場合は、Pythonコードを用いたカスタムアクションでデータ追加の一連の作業を行う必要があります。
まずはデータをCSVファイルオブジェクトとして格納する場所、バケットを用意します。
(1)[DATA MANAGER]にアクセスし[BUCKETS]をクリックします。
■ForePaaS操作画面(Data Manager)オブジェクト格納場所

■ForePaaS操作画面(Data Manager)オブジェクト格納場所の作成

競争成績:boat-result-bucket
番組表:boat-player-bucket

ここではアクションの作成やアクションを組み合わせたワークフローの定義などForePaaSのジョブ関連を定義することができます。
■ForePaaS操作画面(Data Processing Engine)表示

■ForePaaS操作画面(Data Processing Engine)調整対象選択

■ForePaaS操作画面(Data Processing Engine)加工

参照:Actions
(7) [start with a boilerplate]をクリックして、空のテンプレートを開きます。
■ForePaaS操作画面(Data Processing Engine)新規テンプレート選択

■ForePaaS操作画面(Data Processing Engine)設定とコード記載

②Pythonコードを入力
今回は以下の処理をPythonコードで書いていきます。
前処理や解凍処理などのForePaaSに関連しないpython処理については説明を割愛しますが、元のテキストがテキストとして美しいものでしたのでCSVファイルへの変換に苦労しました。


■ForePaaS操作画面(Data Processing Engine)コード入力

■ForePaaS操作画面(Data Processing Engine)作成

■ForePaaS操作画面(Data Processing Engine)動作確認

■ForePaaS操作画面(Data Manager)テーブル表示



■ForePaaS操作画面(Analytics Manager)クエリ確認

■ForePaaS操作画面(Analytics Manager)実装確認

3.2.1. ソースコードの解説
データのダウンロード
ForePaaSアクション用のライブラリがすでに組み込まれているのでインポートして使用します。
バケットに接続し、バケットに用意されているput_request関数を実行するだけです。
■ForePaaSソースコード解説_データダウンロード

参照:ForePaaS Buckets connector
データの解凍・CSVへの変換
そんなとき何度もバケットに保存するのはバケットが散らかっていくので、アクション内で利用できる一時ディレクトリ(tmp)を使用します。ここに置いたファイルはアクションが終了したタイミングで削除されるため、処理の途中で利用したいファイルがある場合に利用できます。
■ForePaaSソースコード解説_csvファイルの仮置き

テーブルへの追加
先ほどバケットにコネクタで接続したように、今度はテーブルに接続します。
■ForePaaSソースコード解説_テーブルに追加

ForePaaSのドキュメントにはカスタムアクションのサンプルが用意されていますので、とても参考になりました。
参照:Custom Actions SDK
では、Pythonコードが書けたら[CREATE]をクリックし、[RUN]をクリックします。
■ForePaaS操作画面(Data Processing Engine)作成と実装

3.3. アクションのトリガーを定義する
(1)[DATA PROCESSING ENGINE]にアクセスし、[ACTIONS]にアクセスします。
■ForePaaS操作画面(Data Processing Engine)アクショントリガー設定

■ForePaaS操作画面(Data Processing Engine)編集





Cron式
Cron式は「* * * * *」の5カ所に値を指定することで、処理の起動タイミングを設定することができます。
それぞれ左から「分」「時」「日」「月」「曜日」となります。
今回の場合、「0分」、「14時」、「毎日」、「毎月」、「すべての曜日」となり、毎日14時0分に実行するという意味になります。
ForePaaSでCron式を設定する際にはタイムゾーンがUTC(協定世界時)となっているため、日本時間との時差を考慮する必要があります。日本時間で設定したいイベント日時の9時間前で設定します。
今回は日本時間の23時に実行したいので、14時に設定しましょう。
(7)(1)~(6) の手順を競争成績データと番組表データそれぞれで行います。
本手順を実施した以降の毎日23時に、テーブルの中身に新しいデータが追加されていることを確認できます。
これでPart1の記事は終了となります。
次回Part2では、2つのテーブルを加工して1つの機械学習モデル用のデータテーブルを作成します。
ForePaaSを活用できるか悩んでいて導入を検討している、ForePaaSを導入したが継続的な機能実装に人手が足りないといった場合にぜひご検討ください。よろしくお願いいたします。
こちらの関連記事も
合わせてお読みください