Challenge #48: Calculating Distribution Priority ~最寄りの倉庫から店舗への商品の分配~ – Alteryx Weekly Challenge

こんにちは。Alteryxサポートエンジニアとして勉強中のスズです。

当エントリは『Alteryx Weekly Challenge:Intermediate Level Advent Calendar 2018』の14日目です。

『Alteryx Weekly Challenge:Intermediate Level Advent Calendar 2018』では、Alteryx Communityで公開されているWeekly ChallengeのIntermediate Levelにひたすら1人で挑戦していきます。

今回は最寄りの倉庫から店舗への商品の分配に挑戦します。

動作環境

当エントリの執筆には、以下の環境を利用しています。

  • Windows 10 Pro
  • Alteryx Designer 2018.4.3.54046 英語版

Challenge #48: Calculating Distribution Priority

お題

今回挑戦するお題はこちら。

お題の説明に今回作成するワークフローの条件が記載されています。

  • 店舗の最寄りの倉庫から商品を分配する
  • 要求する数が多い店舗を優先して商品を分配する

また、ワークフローを作成して以下の質問に解答します。

  1. 店舗と商品のうち分配されなかった数が多いものを求める
  2. 各店舗に最も分配された商品を求める
  3. 各店舗に分配された商品の合計移動距離のうち、400,000マイル未満の商品を求める

解答の概要

今回作成するワーフクローは以下の通りです。

  1. 各データを結合
  2. 店舗と商品のうち分配されなかった数が多いものを出力
  3. 各店舗に最も分配された商品を出力
  4. 各店舗に分配された商品の合計移動距離のうち、400,000マイル未満の商品を出力

ワークフローが長いので、簡単に処理の全体と一部要点をご紹介していきます。

各データを結合

用意されたデータのうち、「Retail Location」と「Warehouse Locations」には緯度経度の情報が含まれています。Create Pointsツール(Spatial -> Create Points)を使用して、Pointデータを作成します。

Joinツール(Join -> Join)を使用して、「Retail Demand」と「Retail Location」のデータ(店舗側のデータ)を「Store」列で、「Warehouse Supply」と「Warehouse Locations」のデータ(倉庫側のデータ)を「Warehouse」列で結合します。

Find Nearestツール(Spatial -> Find Nearest)を使用して、各店舗の最寄りの倉庫を出力します。データを確認すると、「DistanceMiles」列が作成され、倉庫と店舗の距離がマイルで出力されます。また、各店舗の1つの商品に対して、倉庫側の商品がそれぞれ結合しています。

Filterツール(Preparation -> Filter)を使用して、データを「Item」列と「Universe_Item」列の値が一致するものに絞り込みます。

各データの結合が完了しました。

店舗と商品のうち分配されなかった数が多いものを出力

Sortツール(Preparation -> Sort)を使用して、以下の優先順位でデータを並べ替えます。

  1. 「Item」列: Ascending
  2. 「Warehouse」列: Ascending
  3. 「Required」列: Descending

Multi-Row Formulaツール(Preparation -> Multi-Row Formula)を使用して新しく「Remain」列を作成し、倉庫にある商品の数から要求された数を差し引いた数を出力します。「Item」列でグループ化し、以下の条件で出力します。

if [Warehouse] == [Row-1:Warehouse] then [Row-1:Remain] - [Required]
else [Count] - [Required]
endif
  • 「Warehouse」列が1つ上と同じ場合は、1つ上の「Remain」列から「Required」を引いた数を出力
  • それ以外の場合は「Count」列から「Required」列を引いた数を出力

さらにMulti-Row Formulaツールを使用して新しく「Unmet」列を作成し、商品を要求した数に対して供給されなかった数を出力します。

if [Row-1:Warehouse] != [Warehouse] and [Remain] < 0 then [Required] - [Count]
elseif [Remain] < 0 and [Row-1:Remain] > 0 then [Row-1:Remain]
elseif [Remain] < 0 then [Required]
else 0
endif
  • 「Warehouse」列が1つ上と異なり、「Remain」列が0より少ない場合は、「Required」列から「Count」列を引いた数を出力
  • 「Remain」列が0より少なく、1つ上の「Remain」列が0より大きい場合は、1つ上の「Remain」列を出力
  • 「Remain」列が0より少ない場合は、「Required」列を出力
  • それ以外は0を出力

「Unmet」列が作成されました。

Sortツールで「Unmet」列を降順に並べ替え、Selectツール(Preparation -> Select)で「Item」「Unmet」列のみを残し、Sampleツール(Preparation -> Sample)で上位1件のみ出力します。

結果を確認して完成です。

各店舗に最も分配された商品を出力

Multi-Row Formulaツールを追加し、前項で「Remain」列を作成したMulti-Row Formulaツールと接続します。「Item」列でグループ化し、以下の条件で出力します。

if [Row-1:Warehouse] != [Warehouse] and [Required] >= [Count] then [Count]
elseif [Row-1:Warehouse] == [Warehouse] and [Row-1:Remain] > 0 and [Required] >= [Row-1:Remain] then [Row-1:Remain]
elseif [Row-1:Remain] < 0 then 0
else [Required]
endif
  • 「Warehouse」列が1つ上と異なり、「Count」列より「Required」列が大きい場合は「Count」列を出力
  • 「Warehouse」列が1つ上と同じで、1つ上の「Remain」列が0より大きく、「Required」列が1つ上の「Remain」列の数値以上の場合、1つ上の「Remain」列を出力
  • 1つ上の「Remain」列が0より小さい場合は0を出力
  • それ以外の場合は「Required」列を出力

Summarizeツール(Transform -> Summarize)を使用して、「Item」列でグループ化し、「fulfilled」列の合計を出力します。続いてSortツールで「Sum_fulfilled」列を降順で出力し、Sampleツールで上位1件を出力します。

結果を確認して完成です。

合計移動距離が400000マイル未満の商品を出力

Formulaツール(Preparation -> Formula)を追加し、前項のMulti-Row Formulaツールと接続します。新しく「Total Miles」列を作成し、「DistanceMiles」列に「fulfilled」列を乗算した結果を出力します。なお、用意されている答えに出力結果を合わせるため、データ型は以下の通り設定してます。

  • Data type: FixedDecimal
  • Precision: 19
  • Scale: 1

Summarizeツールで「Item」列でグループ化し、「Total Miles」列の合計を出力します。また、Filterツールで「Sum_Total Miles」列が400000未満のデータのみ抽出します。

結果を確認して完成です。

最後に

今回はWeekly ChallengeのChallenge #48: Calculating Distribution Priorityに挑戦しました。

明日もお楽しみに!

サンプルワークフローのご案内

クラスメソッドでご契約のユーザー様向けに、当ブログでご紹介したワークフローを専用ポータルにて公開しております。当エントリでご紹介したワークフローも公開予定ですので、ご参考にしていただきますと幸いです。

Alteryxの導入なら、クラスメソッドにおまかせください

日本初のAlteryxビジネスパートナーであるクラスメソッドが、Alteryxの導入から活用方法までサポートします。14日間の無料トライアルも実施中ですので、お気軽にご相談ください。

alteryx_960x400