データサイエンス100本ノックをAlteryxで。102日目(解答)

100本ノック補足

このページは解答編です。

↓ネ

↓タ

↓バ

↓レ

↓防

↓止

答えと解説

設問はこちらでした。

商品データ(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問目は中身のデータはなにも変化させず、出力するレコードのみ処理を行うものでしたが、今回の問題は、レコードの値自体に処理を行う問題でした。また、複数フィールドを一度に処理ができる形のマクロを作成しました。今回のようにチェックボックスで複数フィールドに対して処理を行うようなツール(インピュテーション、複数フィールドフォーミュラ等)であれば、リストボックスで簡単に複数フィールド処理を行うようなマクロが作れます。

解答ワークフローダウンロード

コメント

タイトルとURLをコピーしました