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

100本ノック

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

↓ネ

↓タ

↓バ

↓レ

↓防

↓止

答えと解説

設問はこちらでした。

P-055: レシート明細(receipt.csv)データの売上金額(amount)を顧客ID(customer_id)ごとに合計し、その合計金額の四分位点を求めよ。その上で、顧客ごとの売上金額合計に対して以下の基準でカテゴリ値を作成し、顧客ID、売上金額合計とともに10件表示せよ。カテゴリ値は順に1〜4とする。

・最小値以上第1四分位未満 ・・・ 1を付与
・第1四分位以上第2四分位未満 ・・・ 2を付与
・第2四分位以上第3四分位未満 ・・・ 3を付与
・第3四分位以上 ・・・ 4を付与

※カテゴリ値を格納するフィールド名はpct_groupとする
※結果は顧客IDの昇順でソートすること

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

今回は、カテゴリ値を作成する問題です。今回は、四分位点というところがポイントでしょうか。

順を追って説明を進めたいと思います。まず、最初に顧客ID(customer_id)ごと合計を取る必要があるので、まず型の変換から行う必要があります。

amountは数値型(Int16)が適切です。

次に、顧客ID(customer_id)ごとにデータの売上金額(amount)を合計します。集計ツールでcustomer_idでグループ化し、amountの合計を取ります。

次に、四分位点を求めます。

四分位点とは?

データを小さい順に並び替えた時にレコード数を四等分に分けるときの区切りの値です。小さい方から第1四分位(25パーセンタイル)、第2四分位(50パーセンタイル)、第3四分位(75パーセンタイル)と呼びます。50パーセンタイルは中央値と同じです。

さて、四分位点を求めるには集計ツールを使います。amountを選択し、パーセンタイルを追加します。

追加後、左下の方に「パーセンタイル」とオプションが表示されます。ここで求めたいパーセンタイルの値を入力する必要があります。デフォルトでは50となっています。

また、名前もわかりやすいようにつけましょう。例えば、「Percentile_amount_25」などが良いかと思います。この理由は、他にも第2四分位、第3四分位を求める必要がありますが、すべて同じ名前になると区別がつきにくくなるためです(Alteryxは同じ名前があると、重複した名前は自動的に数字が後ろにつきますが明示的にわかるようにつけましょう)。

ということで、同じように2回追加し50、75と設定すると、以下のように設定されます。

Percentile_amount_50をクリックすると以下のように設定されています。

同様に、Percentile_amount_75をクリックすると以下のように設定されています。

次に、カテゴリ値を作っていきたいと思います。カテゴリ値を作るには、customer_idごとに合計したレコードとこの四分位値を比較する必要があります。しかしながら、現時点では以下のように別々にできているので、これを結合する必要があります。

結合するには、フィールド付加ツールを使います。「customer_idごとに合計」した集計ツールの出力をフィールド付加ツールのT入力へ、「四分位点」を求めた集計ツールの出力をフィールド付加ツールのS入力に接続します。

これでamountと四分位数を比較できるようになったので、フォーミュラツールでカテゴリ値化していきましょう。条件は以下の通りです。

  • 最小値以上第1四分位未満 ・・・ 1を付与
  • 第1四分位以上第2四分位未満 ・・・ 2を付与
  • 第2四分位以上第3四分位未満 ・・・ 3を付与
  • 第3四分位以上 ・・・ 4を付与

これをIF文で書き起こすと以下のようになります。

IF [amount]<[Percentile_amount_25] THEN 1
ELSEIF [amount]<[Percentile_amount_50] THEN 2
ELSEIF [amount]<[Percentile_amount_75] THEN 3
ELSE 4
ENDIF

厳密に書くともう少し長くなりますが、結果が変わらないようにしつつ一部省略して書いています。厳密に書くと以下のようになりますが、青い部分は省略可能です。基本的にIF文は前から見ていき、最初の条件にヒットした時点で値を返してIF文から抜けるためです。

IF [amount]<[Percentile_amount_25] THEN 1
ELSEIF [amount]>=[Percentile_amount_25] AND [amount]<[Percentile_amount_50] THEN 2
ELSEIF [amount]>=[Percentile_amount_50] AND [amount]<[Percentile_amount_75] THEN 3
ELSEIF [amount]>=[Percentile_amount_75] THEN 4
ELSE Null()
ENDIF

実際のフォーミュラツール設定は以下の通りです。フィールド名は「pct_group」でデータ型はByte型で十分です。

あとは、不要なフィールドを削除し、customer_idの昇順で並べ替えて先頭から10レコードをサンプリングツールなどで抽出してください。

正確には合わないですが別解(参考)

四分位点の定義に戻ると、データを小さい順に並べ替えて、レコード数が四等分されればいいということになります。

これをそのままAlteryxで表現してみましょう。最初に顧客ID(customer_id)ごと合計を取るところまでは同じで、その後小さい順にソートツールで並べ替えます。

レコード数を4等分するには、タイルツールを使うことができます。タイルツールの設定に「等しいレコード」というものがあります。レコードを同じ数で4等分ということなので、タイルの数が4つと考えることできます。つまり、以下のように設定します。

結果はこのような感じです。

このTile_Numがタイルナンバーということでpct_groupに該当するフィールドとなります。

この方法で四分位数を求めなくてもカテゴリ値化できるのですが、今回の問題で「以上」「以下」の微細なところで結果が異なってしまいます(カテゴリの境界の値で差分が発生します)ので、参考という扱いでお願いします。

検証すると、このような形で境界の値が若干異なっています。

ただ、実務的には問題ないかとは思います。実際のワークフローは以下のようになります。

まとめ

今回はカテゴリ値を付与する問題でした。四分位数を求めてからカテゴリ値化するという若干ややこしい問題だったかと思いますが、難しいツールを使う必要はないので、地道に行っていくだけです。

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

コメント

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