Alteryxの処方的分析カテゴリの最適化ツールのサンプルワークフローを読み解いていきたいと思います。
今回は、ヘルプの「サンプルワークフロー」の「Predictive tool samples」の「Prescriptive Analytics」にある「3 Optimization Fantasy Sports Lineup」を読み解いていきます。
3 Optimization Fantasy Sports Lineup
まず、ワークフローの説明文を見ていきましょう。
設問
このサンプルワークフローでは、「一定の予算とフィールドポジションがある時、予想得点、給料、フィールドポジションにもとづいて、どのように選手をドラフトすればいいのか」という問題に対して、これを簡単な最適化問題として理解しています。
以下のような条件です。
9名の選手の給料の合計は予算内に抑えたい。
ポジションは、
- 投手(P)1名
- 一塁手(1B)1名
- 二塁手(2B)1名
- 遊撃手(SS)1名
- 三塁手(3B)1名
- キャッチャー(C)1名
- 外野手(OF)3名
の9名です。
ビジネス上の問題:ドラフトされた選手の予想得点の合計を最大化したい。
入力データ:
予算をどうするか?
今回の問題では予算は与えられていません。これも入力データから計算しています。
結論としては、$25,200としています。
この想定は、選手の給料の中央値が2,800ドルであるため、9名を雇うと、$2,800 * 9 = $25,200という結果になっています。
方程式への落とし込み
1. 変数を選ぶ
変数は、各選手名となります。つまり、どの選手を選ぶか、という問題としています。今回のデータには383レコード存在するのでテキスト入力ツールでの手入力は難しいです。
2. ビジネス上の目的(Objective)を確認する
Objectiveは、得点の最大化です。これは、各選手 * 得点(Pts)で得ることができます。
これをO入力に入れる場合は、lb、ubは、lbは0、ubは1。今回は選択するしないを指定するので、Bとなります。
variable | coefficient | lb | ub | type |
---|---|---|---|---|
Name | Pts | 0 | 1 | B |
これ、各選手ごとに作る必要があります。
3. 制約条件を確認する
制約条件は、ポジションの数になります。
- 投手(P)1名
- 一塁手(1B)1名
- 二塁手(2B)1名
- 遊撃手(SS)1名
- 三塁手(3B)1名
- キャッチャー(C)1名
- 外野手(OF)3名
とのことなので、これを表現していきます。計算式にすると、
P == 1
1B == 1
2B == 1
SS == 1
3B == 1
C = 1
OF== 3
となります。
左辺については、各選手×1、となりますが、対応したポジションの選手をすべて左辺に入れる必要があります。Pであれば、ポジションがPの人だけを、
選手A * 1 + 選手B *1 +…
といった形にする必要があります。
また、給料にも制限がありました。選択した選手の合計給料が25,200以下にする必要があるので、
各選手 * 給料(Salary) <= 25,200
という形になります。
これをそれぞれA入力、B入力で表現しましょう。ちなみに、今回は入力アンカーAの制約モードは、「密行列、行の変数」とします。理由としては、項目が非常に多いため項目方向に変数をもってくることが大変だからです。今回のようなケースは縦方向に各変数をもたせるほうが楽です。
A入力
variable | Salary | P | 1B | 2B | SS | 3B | C | OF |
---|---|---|---|---|---|---|---|---|
Name | Sarary | 1 | 0 | 0 | 0 | 0 | 0 | 0 |
各行は、各選手になります。Pより右の列はポジションに応じて1または0を入れる必要があります。
B入力
constraint | dir | rhs |
---|---|---|
Salary | <= | 25200 |
P | == | 1 |
1B | == | 1 |
2B | == | 1 |
SS | == | 1 |
3B | == | 1 |
C | == | 1 |
OF | == | 3 |
今回気をつけるのは、Calsiumの条件が最小、最大とあるので、A入力には同じ内容が2段入ります。
4. ワークフローの構築
各パラメータは計算式等で作成しています。B入力のみテキスト入力ツールで入力しました。
設定
入力アンカーAの制約モードは、「密行列、行の変数」としています。
O入力
先頭から10行表示しています。フォーミュラツールで、「lb」「ub」「type」を作成しています。coefficientはセレクトツールで項目のptsの名称を変えています。variableもnameをセレクトツールで名称変更しています。
A入力
先頭から10行表示しています。Pより右の列はフォーミュラツールで各列を作っています。以下のような形です。
かなり原始的な手法ではありますが、あまり細かいことを気にする必要がない方法です。フォーミュラをなるべく書かない方法をサンプルワークフローに記載しておきます(フィールドとレコードの並びは合わせておく必要があるため、なるべくそれらが変わらないようなワークフローにしようとすると、今回のように面倒でもフォーミュラを書くほうが楽です)。
B入力
S出力
D出力
I出力
まとめ
- スポーツ選手のドラフトについて、簡単な最適化問題を最適化ツールを使って解きました。
- 変数が多い場合、入力アンカーAの制約モードは、「密行列、行の変数」としてデータを作る方法を行いました。
サンプルワークフロー
Designer に付属のワークフローで問題ないですが、念のためにアップロードしておきます。
コメント