このページは解答編です。
↓ネ
↓タ
↓バ
↓レ
↓防
↓止
答えと解説
設問はこちらでした。
P-043: レシート明細データ(receipt.csv)と顧客データ(customer.csv)を結合し、性別コード(gender_cd)と年代(ageから計算)ごとに売上金額(amount)を合計した売上サマリデータを作成せよ。性別コードは0が男性、1が女性、9が不明を表すものとする。
ただし、項目構成は年代、女性の売上金額、男性の売上金額、性別不明の売上金額の4項目とすること(縦に年代、横に性別のクロス集計)。また、年代は10歳ごとの階級とすること。
解答ワークフローは以下のようになります。
今回は複合的な問題ですが、より実践的なシチュエーションかと思います。
ポイントとしては、年代を階級(10、20、30・・・)として新しいフィールドを作成することと、集計結果として項目名(フィールド名)として性別を持つようにデータの持ち方を変えるところです。
それでは実際にワークフローを作っていきましょう。
まず、receipt.csv、customer.csvで必要項目に絞りつつ、データ型の変更をセレクトツールで処理していきましょう。
計算に使うのは、receipt.csvのamount、customer.csvのageですが、それぞれInt16、Byte型で対応可能です。
この後、結合ツールで結合していきます。customer_idがキーフィールドです。ちなみに、customer_idはこのあと使わないためチェックを外しても構いません。
次に、年代を計算していきます。フォーミュラツールを使いましょう。
計算式は以下の通りで、日付未入力を10で割った後、FLOOR関数で小数点を切り捨て、10をかけることで1の位を削除します。これで10ごとの階級値を取得可能です。
FLOOR([age]/10)*10
ちなみに、出力のデータ型もByteで十分です。
次に集計を行いましょう。年代ごと、性別ごとに売上を集計する必要があります。
ここではgenderとgender_cdどちらもグループ化していますが、genderがあれば十分です。
次がポイントで、データの持ち方を変えていきます。クロスタブツールが利用可能です。
設定は以下のようになります。縦持ちのフィールドを横持ちにピボットするツールです。
縦軸を年代としたいので、グループ化は「年代」となります。横軸は性別なので、「gender」を選択します。集計する値は、売上なので「amount」。値の集計方法は、すでに合計していますが「合計」とします。
クロスタブツールを使う場合は、縦軸が「グループ化」、横軸が「列ヘッダー」と覚えてください。設定する際のオプション名だとなかなかピン来にくいかと思います。
最後に、年代で並び替えましょう。
これで完了です。
別解のワークフローについて(最適化ワークフロー)
今回、いくつか使わなくても良いツールがあるので、ツールの数を減らしてみたいと思います(英語のコミュニティではこれをツールゴルフと呼んでいます)。今回は赤い部分が対象となります。
今回、わかりやすくするためにセレクトツールで不要なフィールドを削除し、データ型も変えています。しかしながら、結合ツールにもセレクトツールと同等の機能があるため、わざわざ事前にセレクトツールを使う必要はありません。ただ、わかりやすくするためには事前にセレクトツールを使っておくのは有効です。
セレクトツールを使わない場合の結合ツールの設定は以下の通りとなります。
次に、クロスタブツールには集計機能があります。そのため、事前に集計ツールで集計する必要はありません。設定は元のワークフローと同じです。
最終的に最適化すると以下のようなワークフローになります。
まとめ
今回は、年齢を10歳ごとの階級値にするという計算と縦持ちのデータを横持ちにするという2つポイントがある問題でした。最終的なレポートを作成する段階ではこのようなデータの持ち方の変更というのはよく行うことですので、クロスタブツールに慣れておくと良いと思います。
コメント