このページは解答編です。
↓ネ
↓タ
↓バ
↓レ
↓防
↓止
答えと解説
設問はこちらでした。
レシート明細データ(receipt.csv)に対し、店舗コード(store_cd)ごとに売上金額(amount)の分散を計算し、降順で5件表示せよ。
※標本分散(与えられたデータを集合全体とした分散、nで割る)をマクロ化して解くこと(標本分散を得るワークフローは記載済み)
※30問目がベースとなります
解答ワークフローは以下のようになります。
マクロ部分は以下のとおりです。
データサイエンス100本ノックを解いてますと、分散や標準偏差がnで割るものがベースになっています。そのため、データサイエンス100本ノックに合わせようとするとワークフローが非常に長くなってしまいます。
今回は、nで割るものをマクロ化することで再利用できるようにし、ワークフローをシンプルにできるようにしてみたいと思います。
マクロ作成
それではマクロ作成に取り掛かってみましょう。
まず、ワークフロー自体はすでに提示されています。
標準マクロは基本的に何かベースとなるワークフローがあることが多いですが、どの部分をマクロ化するかまず考える必要があります。今回でいうと、以下の赤線のような形でしょうか。
頭のセレクトツールの部分をマクロ内にするかどうか悩ましいところですが、基本的にデータ型は外で整えているべきかと思います。
さて、ここからは以下のステップで作成していきましょう。
- 新しいワークフローを作成
- インプットデータをコピーしマクロ入力ツールに変更
- マクロ化したい部分をコピーし1で作成したワークフローに貼り付け
- マクロ出力ツールを追加
- マクロ入力ツールの設定を変更(フィールドマップを表示)
- セレクトツールを追加し、マクロ入力ツールからリバースフィールドマップ機能を追加
- セレクトツールにて不要な項目を削除
- マクロに名前を付けて保存
1.新しいワークフローを作成
ファイルメニューなどから新規ワークフローを作成します。
2.インプットデータをコピーしマクロ入力ツールに変更
インプットデータは、マクロに埋め込んでおいた方がテストや改修が楽かと思います。ただし、大量のデータを埋め込むとフリーズすることが多いので、少量のデータを埋め込むようにしましょう。
今回であれば、セレクトツールの直後にサンプリングツールを配置し、100レコード程度取得するように設定します。
サンプリングツールの出力アンカーを選択し、結果ウィンドウの右端にある「アクション」から「クリップボードにコピー」の「ヘッダーを含むすべてのレコード」をクリックしましょう。
これでデータがクリップボードにコピーされるので、1で作成した新しいワークフローに右クリックで貼り付けましょう。
これにより、テキスト入力ツールが追加されるため、右クリックし、「マクロ入力に変換」しましょう。
3.マクロ化したい部分をコピーし1で作成したワークフローに貼り付け
次に、元のワークフローからほしい部分をコピーし、1のワークフローに貼り付けます。欲しい部分は以下の赤色の部分なので、こちらをコピーし、貼り付けます。
貼り付けて、マクロ入力ツールと接続しましょう。
4.マクロ出力ツールを追加
フォーミュラツールの後ろにマクロ出力ツールを追加します。
5.マクロ入力ツールの設定を変更(フィールドマップを表示)
マクロ入力ツールの設定を「フィールドマップを表示」に変更しましょう。
これにチェックが入っていない場合は、入力データが、マクロ入力ツールのサンプルデータを全く同じ構成(フィールド名)である必要があります。つまり、今回の場合は、マクロ入力ツールのデータは以下のようになっているかと思います。
つまり、マクロ入力ツールに入力すべきデータは、store_cdとamountというフィールド名である必要がある、ということになります。しかしながら、汎用的にマクロを使いたい場合は、グループとなるフィールド名と分散を計算するフィールド名をそれぞれ指定したいです。そのため、フィールドマップを表示、という機能を使うことで、それぞれ自由にフィールドを指定できるようにします。
つまり、「フィールドマップを表示」を使わない場合は、マクロは以下のようにフィールドを選択できません。
このオプションをオンにすると、以下のように選択できるようになります。
設定方法は以下の通りで、マクロ入力ツールの「フィールドマップを表示」にチェックを入れます。
6.セレクトツールを追加し、マクロ入力ツールからリバースフィールドマップ機能を追加
ところで、グループ化フィールドと計算したいフィールドを「フィールドマップを表示」機能で指定できるようになりましたが、例えば今回入力データとして、県名ごとに販売回数の分散を取りたいとします。それぞれフィールド名はprefecture_cdとsales_countとします。しかしながら、このマクロをそのまま実行すると、出力結果はstore_cdとamountというフィールド名になってしまいます。これでは都合が悪いので、リバースフィールドマップという機能を使って、元の名前に戻す必要があります。
これには、まずセレクトツールをマクロ出力ツールの直前に配置し、マクロ入力ツールのQ出力からセレクトツールのアクション入力へ接続します。
これにより、以下のようにアクションツールが追加されます。
アクションツールの設定は、自動的に既定値の「リバースフィールドマップで選択肢を更新」のままでオッケーです。
7.セレクトツールにて不要な項目を削除
さて、マクロ化する前の段階では最後のセレクトツールのところで不要な項目がいくつもあるので、消しましょう。
すなわち、store_cdとamountがあれば十分です。
8.マクロに名前を付けて保存
最後にマクロに名前を付けて保存しましょう。
ワークフローに組み込む
それでは、元のワークフローに組み込んでいきましょう。とはいえ、ベースとなるワークフローがあるので、そこを入れ替えるだけのイメージです。
元のワークフローと同様、amountを数値型(Int16型)にし、不要な項目も削除しておきましょう。
次に、マクロを挿入します。マクロはワークフローの直下などに保存しておき、右クリックメニューから挿入が可能です。設定は、以下のとおりです。
これでほぼ完了です。あとは、問題文の通り、降順で5件出力しましょう。最終的なワークフローは以下の通りとなります。
まとめ
今回は、標準マクロを作成する問題でした。毎回同じフィールド名で良い、という場合はフィールドマップを表示機能や、リバースフィールドマップを使う必要はありませんが、これを使えるようにしておくと、汎用的に使えるマクロが簡単に作れるので覚えておくと便利です。
ちなみに、グループ化しない場合は別マクロを作る必要があります。グループ化する場合、しない場合、どちらでも対応できるようにするにはさらなる工夫が必要になります。
コメント