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

100本ノック

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

↓ネ

↓タ

↓バ

↓レ

↓防

↓止

答えと解説

設問はこちらでした。

P-059: レシート明細データ(receipt.csv)の売上金額(amount)を顧客ID(customer_id)ごとに合計し、売上金額合計を平均0、標準偏差1に標準化して顧客ID、売上金額合計とともに10件表示せよ。標準化に使用する標準偏差は、分散の平方根、もしくは不偏分散の平方根のどちらでも良いものとする。ただし、顧客IDが”Z”から始まるのものは非会員を表すため、除外して計算すること。

※分散の平方根の標準偏差=母集団の標準偏差(nで割る)
※不偏分散の平方根=不偏標準偏差(n-1で割る)
※出力は、フィールド名をstd_amountとし、customer_idの昇順とすること

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

今回は、標準化を行う問題です。

データのばらつきを確認するための指標になりますが、標準化は、平均値を0とし、分散を1とするスケーリング方法となります。似たようなものとして、正規化というものがあり、こちらは最小値を0、最大値を1とするスケーリング方法です。いずれも機械学習のデータの前処理等でよく使われます。正規化ははずれ値に弱いという弱点があるので、場合によって使い分ける必要があります。

標準化の計算方法

標準化の計算方法ですが、定義として「平均値を0、分散が1になるようにスケーリングする」ということになります。つまり、標準化したいフィールドの各値に対して平均値を引き、標準偏差で割れば良い、ということになります。定義としては以下の通りとなります。

ということなので、平均値と標準偏差を求める必要があるわけです。

実際のワークフロー

それでは、実際のワークフローを作っていきましょう。

まず、顧客ID(customer_id)がZで始まるレコードをフィルターツールで取り除きます。カスタムフィルターで、「!StartsWith([customer_id], “Z”)」で取り除けます。

!StartsWith([customer_id], "Z")

次に、amountについて型変更を行います。セレクトツールを使い数値型(Int16)に変更します。ついでに不要なフィールドも削除しておきましょう。

その後、customer_idごとにamountを合計します。もちろん集計ツールを使いますが、customer_idでグループ化し、amountの合計を取ります。

ここからはこのデータを使っていく形になります。2つのタイプの標準偏差(nで割る場合とn-1で割る場合)の元データとなるのはここなので、いずれの場合もここまではやり方は同じです。このデータを①としましょう。

ここまででできたデータを①とします

不偏標準偏差の場合(n-1で割る標準偏差)

不偏標準偏差については集計ツールで簡単に計算できます。

まず、集計ツールを使い、amountに対して平均と標準偏差を取ります。

ここで、平均はAvg_amount、標準偏差はStdDev_amountとしておきます。これらの値を①に付与します。フィールド付加ツールを使います。接続自体は以下のようになります。

その後、標準化の計算をしていきます。フォーミュラツールを使います。

([amount]-[Avg_amount])/[StdDev_amount]

あとは、customer_idの昇順に並べ、不要な項目を削除し、先頭から10レコードを取得します。最終的なワークフローは以下の通りとなります。

母集団の標準偏差の場合(nで割る標準偏差)

母集団の標準偏差を使う場合は、定義通り行う必要があります。標準偏差については31問目で一度解説済みですので、そちらを御覧ください。式としては以下のようになります。

使うパラメータとしては、カウントと平均になります。若干面倒ではありますが、やってみましょう。こちらも出発点は①になります。

まず、amountの平均を集計ツールで取得します。

これは、あとで標準化でも使います。フィールド名としては「Avg_amount」とします。

これをフィールド付加ツールで①のデータに付与します。以下のようなワークフローです。

次に、Xi-Xを計算します。フォーミュラツールを使います。

POW([amount]-[Avg_amount], 2)

フィールド名は「xi-x」とし、データ型は「Double」としています。

次に、定義に従ってこれの合計を取ります。その他、カウント数を取り、さらに後で使うので「Avg_amount」(amountの平均値)でグループ化(もしくは平均でも構いません)します。

この結果に対して、いよいよ標準偏差を取ります。フォーミュラツールを使います。

SQRT([Sum_xi-x]/[Count])

フィールド名は、「StdDev_amount」とし、データ型は「Double」としておきます。

さらにこの値をフィールド付加ツールで①に付与します。

ここまで行けばあとは不偏標準偏差のときと同じやり方になります。

標準化の計算は。フォーミュラツールを使います。

※注:プレビュー結果は不偏標準偏差のものとなっています
([amount]-[Avg_amount])/[StdDev_amount]

あとは、customer_idの昇順に並べ、不要な項目を削除し、先頭から10レコードを取得します。最終的なワークフローは以下の通りとなります。

まとめ

今回は、標準化を行う問題でした。定義がわかっていればそれほど難しい問題ではありません。ただ、標準偏差にどちらを使うか(nで割ったものか、n-1で割ったものを使うか)で計算量が変わるのでご注意ください。

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

コメント

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