Power Query 実務テンプレ | クレンジング(前処理)系:クレンジング結果ログ出力

Excel VBA Power Query M Formula Language
スポンサーリンク

ゴールのイメージをそろえる

今回のテーマは「Power Query で クレンジング結果を“ログとして見える化”する実務テンプレ」です。

やりたいことは、ざっくり言うとこうです。
「何件エラーがあったのか」
「どのチェックで何件引っかかったのか」
「前処理の結果、データがどう変わったのかを、数字で説明できるようにしたい」

つまり、
“クレンジングをやった”ではなく
“クレンジングの結果を説明できる”状態にする——
これが「クレンジング結果ログ出力」です。


まず「ログとして残したい情報」を整理する

典型的にほしいログ項目

前処理ラインをちゃんと設計すると、だいたいこんな情報をログにしたくなります。

総件数(元データの行数)
正常件数(本体に残った行数)
エラー件数(別テーブルに分離した行数)
チェック別のエラー件数(必須NG、桁数NG、範囲NG、マスタ未存在…)

これを1行の「サマリテーブル」として出してもいいし、
複数行の「エラー種別別の明細ログ」として出してもいい。
Power Query なら、どちらも簡単に作れます。


例題:エラーフラグを持ったテーブルからログを作る

前提となる「フラグ付きテーブル」をイメージする

まず、こんなテーブルを用意している前提で話を進めます。

受注番号受注日顧客コード金額必須NG桁数NG範囲NGマスタ未存在エラー行
10012024/01/05C0011200falsefalsefalsefalsefalse
1002C002800truefalsefalsefalsetrue
10032024/01/10500truefalsefalsefalsetrue
10042024/01/15C004-100falsefalsetruefalsetrue
10052024/01/20X999200000falsefalsetruetruetrue

ここまでが、前回までのテンプレ(必須チェック・範囲チェック・マスタ未存在・エラー行フラグ)です。
このテーブルを元に、「ログ用の小さなテーブル」を作っていきます。


パターン1:1行サマリのログテーブルを作る

総件数・正常件数・エラー件数を1行にまとめる

まずは一番シンプルな「サマリログ」です。
行数を数えて、1行だけのテーブルにします。

let
    Source = フラグ付きテーブル,  // 上のテーブル

    TotalCount =
        Table.RowCount(Source),

    ErrorCount =
        Table.RowCount(
            Table.SelectRows(
                Source,
                each [エラー行] = true
            )
        ),

    ValidCount = TotalCount - ErrorCount,

    LogTable =
        #table(
            {"項目", "値"},
            {
                {"総件数", TotalCount},
                {"正常件数", ValidCount},
                {"エラー件数", ErrorCount}
            }
        )
in
    LogTable
Power Query

結果はこんな感じの小さなテーブルになります。

項目
総件数5
正常件数1
エラー件数4

これを「クレンジング結果ログ」として別シートに出しておけば、
「このデータ、5件中4件が何かしらのエラーでした」と一言で説明できます。


パターン2:エラー種別ごとの件数をログにする

必須NG・範囲NG・マスタ未存在を分けてカウントする

もう少し踏み込んで、「どのチェックで何件引っかかったか」もログにしてみます。

let
    Source = フラグ付きテーブル,

    TotalCount = Table.RowCount(Source),

    ErrorCount = Table.RowCount(Table.SelectRows(Source, each [エラー行] = true)),
    ValidCount = TotalCount - ErrorCount,

    RequiredErrorCount =
        Table.RowCount(
            Table.SelectRows(
                Source,
                each [必須NG] = true
            )
        ),

    RangeErrorCount =
        Table.RowCount(
            Table.SelectRows(
                Source,
                each [範囲NG] = true
            )
        ),

    MasterErrorCount =
        Table.RowCount(
            Table.SelectRows(
                Source,
                each [マスタ未存在] = true
            )
        ),

    LogTable =
        #table(
            {"項目", "値"},
            {
                {"総件数", TotalCount},
                {"正常件数", ValidCount},
                {"エラー件数", ErrorCount},
                {"必須NG件数", RequiredErrorCount},
                {"範囲NG件数", RangeErrorCount},
                {"マスタ未存在件数", MasterErrorCount}
            }
        )
in
    LogTable
Power Query

結果イメージはこんな感じです。

項目
総件数5
正常件数1
エラー件数4
必須NG件数2
範囲NG件数2
マスタ未存在件数1

これがあると、
「エラーの多くは必須項目未入力です」
「マスタ未存在は1件だけです」
といった会話ができるようになります。


パターン3:エラー種別を行として持つ“縦型ログ”

後でピボットしやすい形にする

さっきは「項目+値」の2列テーブルでしたが、
エラー種別を行として持つ“縦型ログ”にしておくと、
後でピボットやグラフにしやすくなります。

例えば、こんな形です。

種別件数
総件数5
正常件数1
エラー件数4
必須NG2
範囲NG2
マスタ未存在1

さっきの #table の第2引数(行のリスト)を、
この「種別+件数」の形で作っているだけです。
Excel 側でグラフ化したり、複数ファイル分のログを縦に積んで分析したりするなら、
この“縦型ログ”の方が扱いやすいです。


パターン4:ファイル単位・日付単位のログにする

「いつ・どのファイルを処理したか」も一緒に残す

もう一歩実務寄りにすると、
「どのファイルを処理したログなのか」「いつの処理なのか」も一緒に残したくなります。

例えば、こういう列を追加します。

処理日(DateTime.LocalNow などで付与)
ファイル名(取り込み元から渡してくる)

let
    Source = フラグ付きテーブル,
    FileName = "売上_2024-01.xlsx",  // 取り込みクエリから渡してくる想定

    TotalCount = Table.RowCount(Source),
    ErrorCount = Table.RowCount(Table.SelectRows(Source, each [エラー行] = true)),
    ValidCount = TotalCount - ErrorCount,

    LogTable =
        #table(
            {"処理日", "ファイル名", "総件数", "正常件数", "エラー件数"},
            {
                {DateTime.LocalNow(), FileName, TotalCount, ValidCount, ErrorCount}
            }
        )
in
    LogTable
Power Query

こうしておくと、
複数ファイル分のログを縦に積んで「月ごとのエラー率」を見る、
「どのファイルが特にエラーが多いか」を分析する、
といったことができるようになります。


重要ポイントの深掘り

ログは「前処理の品質を説明するための武器」

クレンジング結果ログの一番大事な役割は、
「前処理の品質を、数字で説明できるようにすること」です。

“ちゃんとクレンジングしてます”では弱いけれど、
“このファイルは 1,000 件中 120 件がエラーで、そのうち 80 件は必須項目未入力です”
と言えると、一気に説得力が増します。

ログがあると、こんなことができます。

エラー率の推移を見る(改善しているか?悪化しているか?)
どの種別のエラーが多いかを把握する(教育・システム改修の優先度付け)
「このデータは信頼できる」と胸を張って言える根拠になる

前処理は“裏方”の仕事になりがちですが、
ログを出すことで“見える成果”に変えられます。

ログ生成は「フラグを作った後に、集計するだけ」

技術的には、クレンジング結果ログは難しくありません。

行ごとにフラグ(必須NG・範囲NG・マスタ未存在・エラー行)を付ける
そのフラグを Table.RowCount+Table.SelectRows で数える
#table で小さなログテーブルを組み立てる

やっていることは、ただの「集計」です。
だからこそ、前処理テンプレの“最後の仕上げ”として、ぜひセットで持っておいてほしい部分です。


実務テンプレとしてのまとめ

「クレンジング結果ログ出力」の本質は、次の2つです。

行レベルで付けた各種フラグ(必須NG・範囲NG・マスタ未存在・エラー行)を、件数に集計する。
その集計結果を、小さなテーブル(サマリログ/種別別ログ/ファイル別ログ)として出力する。

そして、実務で効かせるためには、

元データ+フラグ付きテーブル
正常テーブル
エラーテーブル
ログテーブル

という“4本立て”を意識してクエリを設計すると、
「前処理ライン」としての完成度が一気に上がります。

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