このページは解答編です。
↓ネ
↓タ
↓バ
↓レ
↓防
↓止
答えと解説
設問はこちらでした。
商品データ(product.csv)の単価(unit_price)と原価(unit_cost)の欠損値について、各商品のカテゴリ小区分コード(category_small_cd)ごとに算出した中央値で補完した新たな商品データを作成せよ。なお、中央値については1円未満を丸めること(四捨五入または偶数への丸めで良い)。補完実施後、各項目について欠損が生じていないことも確認すること。
※83問目がベースとなります
解答ワークフローは以下のようになります。
マクロ部分は以下のとおりです。
83問目のようなワークフローを作らず、82問目で使ったインピュテーションツールをバッチマクロ化して解く問題です。83問目でも解説しましたが、インピュテーションツールはグループに対して実行することができないため、そのまま使えません。そのため、今回の問題で行うようにバッチマクロ化で簡単にグループ処理が可能になります。
マクロ作成
それではマクロ作成に取り掛かってみましょう
まず、ファイルメニューなどから新規ワークフローを作成します。その後、マクロ入力ツールを配置しますが、入力データなど持ってくるのが面倒であれば、startファイルのデータ入力ツールをコピー&ペーストした後に、右クリックから「マクロ入力へ変換」などでマクロ入力ツールにするのが楽かと思います。
次に、インピュテーションツールをマクロ入力ツールの後段に配置します。
このオプションの中で、インターフェースで書き換えるものは、以下のとおりです。それ以外のオプションについては、ここで決めたもので固定されます。
インピュテーションツールの後段に、マクロ出力ツールを接続します。ここでは特にオプションは不要です。
ここまでで以下のようになっていると思います。
次に、インターフェースカテゴリからリストボックスツールを追加します。このツールにより、処理を行うフィールドを設定することができるようになります。さらに、マクロ入力ツールのQ出力からリストボックススツールの@入力に接続して下さい。また、リストボックスツールからインピュテーションツールのアクション入力に接続しましょう。つまり、以下のようになります。
次に、リストボックスツールの設定を行いましょう。
「表示するテキストまたは質問を入力:」は、インピュテーションツールの記載にあわせて「処理対象フィールド」としています。また、「カスタムリストの生成」を選択します。開始テキスト、区切り記号、終了テキストはデフォルト値で問題ないです。「リストの値」はインピュテーションツールにあわせてBool型を除く数値型のみにチェックを入れています。
次に、アクションツールの設定を行います。アクションタイプは「値を更新」で、更新する値または属性は、「Value[@name=’listbox Select Incoming Fields’] – value = …」を選択します。
インプテーションツールの設定では処理方法として「平均値」「中央値」「最頻値」などから選択することが可能です。せっかくのマクロなので、これらのうちから処理内容を選べるようにしましょう(ユーザー指定値も選択可能ですが、マクロを単純なものにするために選択肢は絞りたいと思います)。
インターフェースツールからラジオボタンを3つ追加してください。そして、インピュテーションツールのアクション入力に接続します。つまり、以下のようになります。
それぞれのラジオボタンの設定を行いましょう。といっても、ラジオボタンのラベルくらいしか設定項目はないので、それぞれ指定したい値の名称「平均値」「中央値」「最頻値」をつけましょう。つまり、以下の設定画面にて、「表示するテキストまたは質問を入力」のところに、「平均値」「中央値」「最頻値」をつけていきます。
これにより、以下のようになります。
次に、ラジオボタンのアクションツールの設定を行います。アクションツールの書き換え項目は、下図の右側の項目がありますが、赤枠で囲った「Value[@name=’radio Mean’] – value = …」の3つの項目と設定の「平均」「中央値」「最頻値」が対応しています。
つまり、以下の通り設定します。
- 平均 ・・・Value[@name=’radio Mean’] – value = …
- 中央値 ・・・Value[@name=’radio Median’] – value = …
- 最頻値 ・・・Value[@name=’radio Mode’] – value = …
を設定します。
つまり、平均値のラジオボタンと接続しているアクションツールの設定は、以下の通り。
中央値のラジオボタンと接続しているアクションツールの設定は、以下の通り。
最頻値のラジオボタンと接続しているアクションツールの設定は、以下の通り。
最後に、バッチマクロでグループ化で実行するためにコントロールパラメータ入力を追加します。
これでも動作はしますが、インターフェースデザイナーにて、ラジオボタンをグループ化しましょう。これには、インターフェースデザイナーにて追加ボタンをクリックし、グループボックスを追加します。
追加しましたら、右の矢印を使って「平均値」「中央値」「最頻値」をグループボックス内に格納します。
これで完成なのでマクロとして保存しましょう。
さて、ここで、このマクロの使い方ですが、「¿」(逆疑問符)にはグループごとに実行したい値をもつフィールドを入力していきます(これをグループ化入力とここでは記載しています)。その際、入力する値をユニーク値にする必要があります。ユニークツールや集計ツールでグループ化しましょう。
ワークフローに組み込む
まず、入力の直後にデータ型を変更するためにセレクトツールを配置します。今回の問題ではunit_priceとunit_costを数値型(Int16)にする必要があります。
また、マクロのコントロールパラメータ入力にグループ化する値を入力しないといけないので、準備として集計ツールを追加します。設定としては、category_small_cdでグループ化しユニークな値を残します。
ようやくマクロの出番です。マクロをワークフローに追加後、以下のように集計ツールの出力からマクロのコントロールパラメータ、セレクトツールの出力からマクロのデータ入力に接続します。
マクロの設定を行いましょう。質問画面は、以下のようになります。コントロールパラメータは「category_small_cd」、処理対象フィールドは「unit_price」「unit_cost」、次の値で置換は「中央値」を選択します。
グループ化設定は、Control GroupByフィールド、input2 GroupByフィールドともに「category_small_cd」となります。これでグループごとに処理が行われます。
ここからは82問目の手法がそのまま使えます。
まず、補完した値を丸めていきます。複数のフィールドを一括で処理したいので複数フィールドフォーミュラツールを使います。「unit_price」「unit_cost」を選択し、「出力フィールドをコピーして追加」などのオプションはオフにし、式は以下の通りとします。
Round([_CurrentField_], 1)
この[_CurrentField_]オプションは、処理対象のフィールドにチェックの付いたフィールドを順次処理していくわけですが、そのフィールドのことを言っています。ですので、今回の場合は、処理対象としている各フィールドに対してRound関数を使っていく、ということになります。
最後にソートツールでproduct_cdの昇順に並び替えましょう。
これで、以下のようなワークフローになります。
欠損数も見ておきましょう。基本データプロファイルツールを複数フィールドフォーミュラの後段に接続し、さらにフィルターツールでNameフィールドのNullsと一致するものを取得できればOKです。
これで完了です。
まとめ
今回も101問目に引き続き、グループごとに実行するためのバッチマクロを作成する問題でした。101問目は中身のデータはなにも変化させず、出力するレコードのみ処理を行うものでしたが、今回の問題は、レコードの値自体に処理を行う問題でした。また、複数フィールドを一度に処理ができる形のマクロを作成しました。今回のようにチェックボックスで複数フィールドに対して処理を行うようなツール(インピュテーション、複数フィールドフォーミュラ等)であれば、リストボックスで簡単に複数フィールド処理を行うようなマクロが作れます。
コメント