データサイエンス100本ノックをAlteryxで。26日目(解答)

100本ノック

このページは解答編です。

↓ネ

↓タ

↓バ

↓レ

↓防

↓止

答えと解説

設問はこちらでした。

P-026: レシート明細データ(receipt.csv)に対し、顧客ID(customer_id)ごとに最も新しい売上年月日(sales_ymd)と古い売上年月日を求め、両者が異なるデータを10件表示せよ。

※出力結果は、顧客ID(customer_id)の昇順で並び替えて出力してください(Alteryxオリジナル条件)
※最も新しい売上年月日をsales_ymd_max、最も古い売上年月日をsales_ymd_minとする

解答ワークフローは以下のようになります。

24問目、25問目の複合問題ともいえる問題です。

今回は、売上年月日の最大と最小を求める問題です。その上で、両者が異なるデータを抽出します。

一番スタンダードな方法としては、集計ツールを使う方法です。そのほか、前回にやったようなソート&サンプリングでもできますが、若干冗長ですので、基本的に集計ツールを使う方法をお勧めします。

  1. 集計ツールを使う
  2. ソート&サンプリング

いずれの方法でも、まずは型の変更が必要です。セレクトツールで、売上年月日(sales_ymd)はInt32型にしましょう(不要な項目も消してしまって問題ありません)。

1. 集計ツールを使う

集計ツールでは最大、最小を一度に取得することができます。

つまり、以下の設定のように、sales_ymdにて最大、最小をそれぞれ1回ずつ選択する形になります。もちろん、customer_idごとに最大、最小を取得したいので、customer_idでグループ化してください。

この時、出力フィールド名はそれぞれほしい形である「sales_ymd_min/sales_ymd_max」にしておきます。これでほぼできたようなものです。

次に、フィルターツールで取得した最大値、最小値が異なるかどうかを判定します。

つまり上のように、カスタムフィルターで以下の計算式を設定します。

[sales_ymd_min]!=[sales_ymd_max]

あとは、customer_idで昇順に並べ替え、10件抽出して完了です。ワークフローは以下の通りとなります。

2. ソート&サンプリング

次に、ソート&サンプリングでやってみましょう。

まずは、customer_idの昇順、sales_ymdの昇順で並び替えましょう。

ここで、customer_idごとに最初の値を取ると、sales_ymdの最小値が得られます。また、同じようにcustomer_idごとに最後の値を取ると、sales_ymdの最大値が得られます。つまり、以下のようなことになります。ポイントとしては、ソートツールは一回だけ使用し、最小値、最大値はサンプリングツールの設定でそれぞれ取得しているところでしょうか。

上側のサンプリングツールの設定は以下の通りで、「最初のN行」を選択します。Nはもちろん「1」です。また、customer_idでグループ化する必要があります(チェックをつけます)。

次に下側のサンプリングツールの設定です。こちらは、「最後のN行」を選択し、Nは「1」とします。また、customer_idでグループ化する必要があります(チェックをつけます)。

ここで、得られた最小値、最大値を結合しましょう。結合ツールを使います。

今回は、「特定のフィールドで結合」を選択し、いずれも「customer_id」を選択します。フィールド名については結合ツールのセレクト機能を使ってきれいにしてしまいましょう。

重複する項目であるRight側のcustomer_idはチェックをはずします。また、Left側のsales_ymdは最小値なので「sales_ymd_min」に名前を変更します。また、Right側は最大値なので「sales_ymd_max」に変更します。

ここからは、フィルターツールで最大値と最小値が異なるものを抽出します(集計ツールで行う方法と同様です)。

さらにcustomer_idでソートし、10件抽出して完了です。ワークフローとしては以下の通りとなります。

まとめ

今回は、ほぼ集計の問題と考えて良いかと思います。集計ツールは一度に様々な統計量を取得することが可能です。こういう問題であれば基本的に集計ツールで行えば問題ないのですが、最も新しい日付、最も古い日付の他のフィールドも残しておきたい、といった場合は、ソート&サンプリングがマッチするかと思います。

ソート&サンプリングは応用編ということでとらえていただければと思います。

解答ワークフローダウンロード

コメント

タイトルとURLをコピーしました