このページは解答編です。
↓ネ
↓タ
↓バ
↓レ
↓防
↓止
答えと解説
設問はこちらでした。
P-052: レシート明細データ(receipt.csv)の売上金額(amount)を顧客ID(customer_id)ごとに合計の上、売上金額合計に対して2,000円以下を0、2,000円より大きい金額を1に二値化し、顧客ID、売上金額合計とともに10件表示せよ。ただし、顧客IDが”Z”から始まるのものは非会員を表すため、除外して計算すること。
※出力データはcustomer_id順に並べること
※2値化フィールド名はsales_flgとする
解答ワークフローは以下のようになります。
今回は複合的な問題となります。まずは、今までやってきた内容までさくっと進めたいと思います。
最初にすべきは、「顧客IDが”Z”から始まるのものは除外」ということなので、フィルターツールで不要なデータを取り除いて行きたいと思います。
「Z」から始まるということで、StartsWith関数が利用可能です。それを除外ということなので、Zから始まらない、ということになるので、「!」もしくはNOTをStartsWith関数の前につければOKです。計算式は以下のとおりです。
!StartsWith([customer_id], "Z")
次に、集計を行うために、先に型の変換を行いましょう。売上金額(amount)の合計を取っていくため、数値型に変換する必要があります。
次に、集計ツールで集計していきます。
顧客ID(customer_id)ごとに売上金額(amount)の合計をとる、ということなので、customer_idでグループ化し、amountの合計を取ります。集計ツールの設定は以下のとおりです。
ここまでは今までの内容の積み重ねかと思います。
次に、「売上金額合計に対して2,000円以下を0、2,000円より大きい金額を1に二値化」していきたいと思います。2値化といっても単にしきい値を決めてしきい値より大きければ1、小さければ0と、1もしくは0の2つの値で表現するのが2値化であり、決して特別なことではありません。
しきい値を決めて1もしくは0とするには、フォーミュラツールでIF文を使うことで簡単に達成可能です。
IF文
IF文は条件を指定し、条件によって出力を分岐させる関数(論理式)です。フォーミュラツールの関数メニューから挿入すると以下のように入力されます。
IF c THEN t ELSE f ENDIF
c | condition(条件) | 条件を記載する。結果はBoolean(True/False)で得られること |
t | trueの場合 | 条件がTrueであった場合はここに記載されているものが出力される |
f | falseの場合 | 条件がFalseであった場合はここに記載されているものが出力される |
今回の場合に照らし合わせてみましょう。
2000円がしきい値で2000を含むのは小さいときなので、以下のように場合分けされます。
0 | [amount]<=0 |
1 | [amount]>0 |
これをIF文で表現すると、[amount]<=0の場合は0となるので、「t」のところに「0」、「f」のところに「1」を記載します。つまり、
IF [amount]<= 2000 THEN 0 ELSE 1 ENDIF
となります。実際のフォーミュラツールの設定は以下のとおりです。
結果は0か1とのことなので、Byte型で出力しましょう(Bool型だとTrue/Falseという表記になってしまいます)。
その後、customer_idで並べ替え、最初から10レコードをサンプリングツールで取れば完了です。
まとめ
今回は、これまで行ったことの復習とIF文の使い方がメインでした。IF文は非常によく使うので慣れておきましょう。
コメント