このページは解答編です。
↓ネ
↓タ
↓バ
↓レ
↓防
↓止
答えと解説
設問はこちらでした。
P-061: レシート明細データ(receipt.csv)の売上金額(amount)を顧客ID(customer_id)ごとに合計し、売上金額合計を常用対数化(底10)して顧客ID、売上金額合計とともに10件表示せよ。ただし、顧客IDが”Z”から始まるのものは非会員を表すため、除外して計算すること。
※出力は、フィールド名をlog_amountとし、customer_idの昇順とすること
解答ワークフローは以下のようになります。
今回は、対数化を行う問題です。
対数化とは
例えば以下のようなデータがあるとします。
これを対数化することで、正規分布に近づけることができます。
正規分布化することで、正規分布を前提とした手法が使えるようになるのが対数化のメリットです。例えば、線形回帰の精度を向上させたりできますし、数値自体が小さい範囲に納めることができ、計算が楽になるというメリットもあります。
LOG10関数
対数化するには底を10に取る場合と自然対数を使う場合がありますが、今回の問題では底を10にとる常用対数を使います。これにはLOG10関数を使います。
LOG10関数は以下のような書式となります。
LOG10(x)
x:数値
実際のワークフロー
それでは、実際のワークフローを作っていきましょう。途中までは59問目、60問目などと同じやり方になります。
まず、顧客ID(customer_id)がZで始まるレコードをフィルターツールで取り除きます。カスタムフィルターで、「!StartsWith([customer_id], “Z”)」で取り除けます。
!StartsWith([customer_id], "Z")
次に、amountについて型変更を行います。セレクトツールを使い数値型(Int16)に変更します。ついでに不要なフィールドも削除しておきましょう。
その後、customer_idごとにamountを合計します。もちろん集計ツールを使いますが、customer_idでグループ化し、amountの合計を取ります。
59問目、60問目などとここまではやり方は同じです。
いよいよメインの部分になります。フォーミュラツールでLOG10関数を使っていきます。0値対策のため、0.5で足したいと思います。
LOG10([amount]+0.5)
あとは、customer_idの昇順に並べ、先頭から10レコードを取得します。最終的なワークフローは以下の通りとなります。
まとめ
今回は、対数化を行う問題でした。単に対数の関数を使うのではなく、0.5を足すのがポイントです。
コメント