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

100本ノック

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

↓ネ

↓タ

↓バ

↓レ

↓防

↓止

答えと解説

設問はこちらでした。

P-070: レシート明細データ(receipt.csv)の売上日(sales_ymd)に対し、顧客データ(customer.csv)の会員申込日(application_date)からの経過日数を計算し、顧客ID(customer_id)、売上日、会員申込日とともに10件表示せよ(sales_ymdは数値、application_dateは文字列でデータを保持している点に注意)。

※経過日数をelapsed_daysというフィールド名とすること
※結果は、customer_idの昇順、elapsed_daysの昇順で出力すること
※sales_ymd、application_dateは日付型で出力すること
※レシート明細データ上、重複する日付のデータは削除すること

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

今回も複合的な問題となりますが地道にワークフローを構築しましょう。

ポイントは、以下の点になるかと思います。

  • 数値型はそのまま日付型にできないため、一度文字列型にしてから日付型に変更する必要があります
  • 日付の差分を取るときは、DateTimeDiff関数を使います
  • receipt.csv側のデータは、同じcustomer_idに対して同じ売上日(sales_ymd)のレコードが複数あるため、重複するデータは捨てる必要があります

まず、receipt.csvから加工していきましょう。

最初にセレクトツールで数値型となっているsales_ymdを文字列型に戻す必要があります(厳密には、String型で十分ですが、その他の文字列型でも問題ありません)。ついでに不要な項目も削除します。

次に、ユニークツールでcustomer_idとsales_ymdのユニークレコードを取得します。この時点ではcustomer_idとsales_ymdしか項目がないため、両方にチェックを入れます。

さらに、日時ツールで、sales_ymdを文字列型から日時型に変換します。ここでのフォーマットはプリセットの「yyyyMMdd」が使えます。

このデータを①としておきましょう。

次に、customer.csvを加工していきます。

こちらは、日付型に変換していきたいフィールドである「application_date」は文字列型で提供されているため、いきなり日時ツールで日付型に変換していくことができます。こちらもプリセットの「yyyyMMdd」がそのまま利用できます。

さらにセレクトツールで不要な項目を削除しておきましょう。

このデータを②とします。

次に、この2つのデータ①②を結合していきます。以下のように接続します。

キーフィールドは「customer_id」です。もちろん不要なフィールドは削除します。

次に、J出力にフォーミュラツールを接続し、会員申込日からの経過日数を計算していきます。この場合、DateTimeDiff関数を使います。

DateTimeDiff関数

2つの日時型の間の差を指定した単位で計算します。最初の引数から2番目の引数を引き算します。つまり、dt1-dt2となります。

DateTimeDiff(dt1,dt2,u)
引数データ型詳細
dt1(date 1)日時型/日付型日時/日付型の値もしくはフィールド
dt2(date 2)日時型/日付型日時/日付型の値もしくはフィールド
u(unit)文字列型単位。years、months、days、hours、minutes、secondsを指定

実際の設定は以下のようになります。日付の差分が知りたいので、大きい日をdt1、小さい日をdt2とします。つまり、購入日は登録日よりも後なので、dt1は購入日のsales_ymd_Date、dt2は登録日のapplication_date_Dateとします。

DateTimeDiff([sales_ymd_Date],[application_date_Date],"days")

フィールド名は「elapsed_days」とし、型は数値型(Int16)とします。

最後に、フィールド名を整えたいと思います。セレクトツールで整えても良いですが、今回は動的リネームツールを使ってみましょう。このツールは、接尾辞(フィールド名の最後の部分)から特定のワードを消すような処理が可能です。今回であれば元々のフィールド名に「_Date」とつけていたので、接尾辞の「_Date」を消すことで元の名前が得られます。

実際の設定としては以下のような感じです。

名前の変更モードは、「接頭辞/接尾辞の削除」とし、処理を行いたいフィールドにチェック。プロパティとして、削除するに「_Date」を記載し、接尾辞を選択します。

動的リネームツールは、名前の変更モードによってオプションや動きが全然異なるので気をつけましょう。

あとは、ソートツールでcustomer_idの昇順、elapsed_daysの昇順に並び替え、サンプリングツールなどを使って先頭から10件を取得すれば完了です。

まとめ

今回は複合的な問題でしたが、ほぼ日付に関する問題でした。日付操作は少々慣れが必要かもしれません。今回のケースはかなり単純なケースにあたるかと思います。

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

コメント

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