このページは解答編です。
↓ネ
↓タ
↓バ
↓レ
↓防
↓止
答えと解説
設問はこちらでした。
P-083: 商品データ(product.csv)の単価(unit_price)と原価(unit_cost)の欠損値について、各商品のカテゴリ小区分コード(category_small_cd)ごとに算出した中央値で補完した新たな商品データを作成せよ。なお、中央値については1円未満を丸めること(四捨五入または偶数への丸めで良い)。補完実施後、各項目について欠損が生じていないことも確認すること。
※結果はproduct_cdの昇順で並び替えること
解答ワークフローは以下のようになります。
今回は、80問目で確認した欠損値のデータを中央値で補完する問題です。82問目は中央値で補完していますが、今回は各商品のカテゴリ小区分コード(category_small_cd)ごとに中央値を計算してその値で補完する必要があります。なお、補完する値は1円未満を丸めること、ということで四捨五入していきましょう。
インピュテーションツールはこのような複雑な条件には対応していません。マクロ(バッチマクロ)を使うという方法がありますが若干内容が高度になるため、今回は82問目の別解をベースにした方法で進めていきたいと思います。
インピュテーションツールを使わない方法で解く
まず、データ型の変更が必要です。セレクトツールでDouble型に変更しましょう。
ここで、集計ツールを使ってunit_priceとunit_costの中央値を取りましょう。この時に、カテゴリ小区分コード(category_small_cd)でグループ化します。これにより、カテゴリ小区分コード(category_small_cd)ごとの中央値を取ることができます。
結果としては以下のような形になります(先頭5行のみご紹介します)。
この結果を、元のデータに結合していきます。82問目では付加するデータが1行のみだったのでフィールド付加ツールを使っていましたが、今回は結合ツールを使います。以下のように接続します。
設定は以下の通りで、キーフィールドをカテゴリ小区分コード(category_small_cd)にします。
これで準備は整ったので、あとは補完していくだけです。地道にフォーミュラツールで行きましょう。
unit_price:
IF IsNull([unit_price]) THEN
Round([Median_unit_price], 1) ELSE [unit_price] ENDIF
unit_cost:
IF IsNull([unit_cost]) THEN
Round([Median_unit_cost], 1) ELSE [unit_cost] ENDIF
いずれも同じような式で、各フィールドの値がNullであれば、Round関数で小数点をまるめた中央値の値を出力し、Nullでなければ元の値を残すような意味となります。
あとは不要項目を削除して完成です。最終的なワークフローは以下の通りとなります。
さて、念のため結果を確認しましょう。以下のように確認用のワークフローを作成します。
結果は以下のようになります。各小区分コードごとに中央値が計算され、それにより補完されています。
なお、最後はソートツールを使ってproduct_cdの昇順に並び替えてください。
まとめ
今回は80問目で発見した欠損値に対して、補完を行う内容でした。81問目は平均値で補完、82問目は中央値で補完しましたが、今回は中央値をカテゴリ小区分コードごとに補完するものでした。82問目から若干高度な補完方法になっていますが、実際はこれよりもっと複雑な条件で補完したいということも多いかと思います。
解答ワークフローダウンロード
※2022/10/22 結果をproduct_cdで並び替えるように変更しました
コメント