このページは解答編です。
↓ネ
↓タ
↓バ
↓レ
↓防
↓止
答えと解説
設問はこちらでした。
P-041: レシート明細データ(receipt.csv)の売上金額(amount)を日付(sales_ymd)ごとに集計し、前回売上があった日からの売上金額増減を計算せよ。そして結果を10件表示せよ。
解答ワークフローは以下のようになります。
今回は、前回売り上げがあった日からの売上金額増減ということで、一つ上の行と引き算をする問題です。SQLなどでは行を一つずらしたテーブルを作成し、データ結合することで引き算を行う、といった方法を取りますが、Alteryxの場合はレコード間の計算というのを複数行フォーミュラツールを使うことでできます。レコード間の計算を行うことで非常に直感的にデータの処理が行え、Alteryxを使う上で、複数行フォーミュラツールは非常に重要なツールです。
今回複数行フォーミュラツールは、新規フィールドを作るため、今回の場合に準じて解説します。
まず、新規フィールドを作成したい場合は「新しいフィールドを作成する」を選択します。その際、フィールド名とデータ型を決める必要があります。
次に、「存在しない行の値」ですが、先頭行の一つ前の行、最終行の一つ後ろの行、などは「存在しない行」ですので、そのデータの取り扱いを決める必要があります。デフォルト値は「0または空白」となるので、そのままですと勝手に0として計算されてしまいます。今回の場合は計算させないようにしたいので「NULL」を選択します。それ以外にも「最も近い有効な行の値に設定」というのもあります。今回のようなケースですと、最初の行の一つ前の行にも最初の行と同じ値がセットされるので、差分を取ると0となってしまいます。
なお、グループ化なども可能ですが今回は行っていません。
計算式については、今回は現在の行の[amount]に対して一つ前の行の[amount]を引き算して差分を取るため、以下のような計算式となります。
[amount]-[Row-1:amount]
一つ前の行を示すのが、フィールド名の前についている「Row-1」です。一つ先の行を示す場合は「Row+1」と記載します。ちなみに、2行先、3行前なども数値を変えれば可能ですが、その場合はまず「行数」のオプションをデフォルト値の1から異なる値に変える必要があります。
実際のワークフロー作成
実際のワークフロー作成に戻りましょう。
まず、集計を行うために数値型にする必要があります。今回はamountのみInt16型にします。
次に、集計です。日付(sales_ymd)ごとに売上金額(amount)を集計とのことなので、sales_ymdでグループ化し、amountの合計します。
次に、旧エンジン(E1 Engine)の場合はsales_ymd順に勝手に並び変わるのですが、AMP Engineを使う場合は並び替えが必要です。
次に、先ほど解説した複数行フォーミュラを使います。設定は以下の通りです。
その後は10レコード抽出して完成です。
別解のワークフローについて
参考に、SQLなどで処理する際のやり方をAlteryxでやってみました。ワークフローとしては以下のようになります。先ほどの複数行フォーミュラを使った方法と比べると手数が非常に多いです。ですので、今回のように行をまたぐ計算を行う場合は複数行フォーミュラを使うのが定番の方法です。
ちなみに、このように行をずらして結合する場合は、結合ツールのオプションを変えることで可能です。普段使わない「レコードポジションで結合」が利用可能です。
簡単な解説を入れると以下のようになります。
まとめ
今回は、レコード間の計算を行いました。Alteryxでは直接レコード間の計算が可能ですが、若干慣れも必要です。直感的にはできますが、各オプションをどれに設定し計算式をどのように組むのか、がポイントです。
コメント