このページは解答編です。
↓ネ
↓タ
↓バ
↓レ
↓防
↓止
答えと解説
設問はこちらでした。
P-065: 商品データ(product.csv)の各商品について、利益率が30%となる新たな単価を求めよ。ただし、1円未満は切り捨てること。そして結果を10件表示させ、利益率がおよそ30%付近であることを確認せよ。ただし、単価(unit_price)と原価(unit_cost)には欠損が生じていることに注意せよ。
※新しい価格はnew_price、新しい単価での利益率はnew_profit_rateというフィールド名とすること
解答ワークフローは以下のようになります。
今回も、算数の問題となります。
利益率から新しい価格を決めるには?
まず、単価(unit_price)と原価(unit_cost)から利益率(unit_profit)を求める計算式は以下のとおりです。
この式を変形すると、以下のようになります。
つまり、新しい価格は、原価を(1-0.3)で割ったものになります。
実際のワークフロー
それでは、実際のワークフローを作っていきましょう。
まず、単価(unit_price)と原価(unit_cost)については計算を行って行くので、セレクトツールで型変換を行っていきましょう。オートフィールドツールで調べるとInt16型がベストマッチのようですので、Int16型にしていきます。また、不要なフィールドも削除します。
次にフォーミュラツールで計算していきます。新しい価格(new_price)は、原価(unit_cost)÷(1-利益率)から求められます。つまり、以下のような計算式となります。1円未満は切り捨てとなるので、FLOOR関数で小数点を切り捨てましょう。
FLOOR([unit_cost]/(1-0.3))
データ型はInt16で問題ないと思います。
次に、確かめ算が必要なので、新しい価格で利益率を計算してみましょう。
同じフォーミュラツールに計算式を追加しましょう。
([new_price]-[unit_cost])/[new_price]
新しい利益率は、フィールド名をnew_profit_rateとし、データ型はDouble型とします。念のため、結果を見てみると以下のように30%くらいの利益率になっています。
あとは、サンプリングツールなどで先頭から10件取得すれば完了です。
参考
フォーミュラツールに直接小数点を含む数値を入力すると、微妙に誤差が発生するケースがあります。これは特定の数値(例えば、0.0225)で起こるようなので、基本的にはそれほど大きな問題ではないのですが、計算上ほぼ気にならない範囲だったとしても数値比較時にどうしても一致しない、と悩む可能性があるので、念のためワークアラウンドを紹介したいと思います。
この現象はフォーミュラツールに直接値を入れなければ良いので、テキスト入力ツールにあらかじめ値を入れておくか、ユーザー定数を使うことで回避できます。ワークフロー的にはユーザー定数を使った方がすっきりするかと思います。
ワークアラウンド1:テキスト入力ツールを使った方法
テキスト入力ツールに今回のような利益率0.3をあらかじめ入れておき、それをフィールド付加ツールで結合して計算する方法です。
あらかじめ上のように入れておくことで、以下のようなワークフローを構築できます。
フォーミュラツールの中身は以下のようになります。0.3と入力していたところが、[目標利益率]というフィールドになっています。
ワークアラウンド2:ユーザー定数を使った方法
ワークフローにはプログラムでいうところのグローバル定数的なものを設定可能です。
これは、ワークフロー設定の「ワークフロー」タブで設定可能です。
上の図のように、+ボタンをクリックすることでレコードが追加されます。ユーザー定数の名前と値、数値型であれば「#」という項目にチェックを入れればオッケーです。
これにより、フォーミュラツールでは以下のような表現が可能です。
ユーザー定数は、Userの後につけた名前のフィールド名が続きます。今回であれば、[User.TargetProfitRate]という名前になっています。
ワークフローとしては元々のワークフローとほぼ同じような形なので、運用しやすいと思います。
まとめ
今回も、算数の問題でした。欠損値はNullとなっていますが、Alteryxではもちろん省いた方がいいのですが、計算、集計を行うだけであれば大きな問題にはなりません。ただし、機械学習を行う際にはNull値は受け入れることができないので、補完もしくは除去する必要があります(また別途出てきます)。
コメント