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

100本ノック

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

↓ネ

↓タ

↓バ

↓レ

↓防

↓止

答えと解説

設問はこちらでした。

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

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

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

70問目とほぼ同様の問題で、違いはフォーミュラツールの設定のみです。

時短のために70問目との違いのみ解説

70問目との違いは、日数の差分を出すために使っていたフォーミュラツールの設定を変えて月数で出すようにするだけです。もちろん、フィールド名は「elapsed_days」から「elapsed_months」に変更する必要があります。

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

フォーミュラツールで利用している計算式のDateTimeDiff関数の三番目の引数は70問目では「days」でしたが、この問題では月数を求めるため「months」となります。

フル解説

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

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

  • 数値型はそのまま日付型にできないため、一度文字列型にしてから日付型に変更する必要があります
  • 日付の差分を取るときは、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],"months")

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

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

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

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

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

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

まとめ

今回は70問目とほぼ同様の問題でした。70問目は2つの日付の差で日数を計算する問題でしたが、この問題は月数を計算する問題でした。違いはわずかですので、DateTimeDiff関数に与えれるパラメータの違いを認識いただければと思います。

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

コメント

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