集計とピボット ― グループ化・ピボット・ピボット解除
このページのゴール
Power Queryの3大データ形状変換機能 ―「グループ化」「ピボット列」「ピボット列の解除」― を理解し、縦持ちデータ(トランザクション形式)と横持ちデータ(クロス集計形式)を自在に変換できるようになることです。
グループ化 ― カテゴリ別に集計する
ExcelのSUMIFS / COUNTIFS関数をテーブル全体に適用するイメージです。ピボットテーブルの「行ラベル+値」と同じ結果を、Power Query内で作れます。
サンプルデータ
| 部署 | 商品 | 売上 |
|---|---|---|
| 営業部 | A | 100000 |
| 営業部 | B | 50000 |
| 経理部 | A | 30000 |
| 営業部 | A | 80000 |
| 経理部 | B | 20000 |
基本グループ化(1列でグループ化・1列を集計)
操作手順
1. 変換 タブ → グループ化 をクリックします。
2. 「基本」タブのまま設定します:
・グループ化の列:部署
・新しい列名:売上合計
・操作:合計
・列:売上
3. 「OK」をクリック。
結果
| 部署 | 売上合計 |
|---|---|
| 営業部 | 230000 |
| 経理部 | 50000 |
詳細グループ化(複数列でグループ化・複数の集計)
操作手順
1. グループ化ダイアログで「詳細」タブに切り替えます。
2. 「グループ化の追加」ボタンで列を増やします:部署、商品
3. 「集計の追加」ボタンで集計を増やします:
・売上合計(操作:合計、列:売上)
・件数(操作:行のカウント)
4. 「OK」をクリック。
結果
| 部署 | 商品 | 売上合計 | 件数 |
|---|---|---|---|
| 営業部 | A | 180000 | 2 |
| 営業部 | B | 50000 | 1 |
| 経理部 | A | 30000 | 1 |
| 経理部 | B | 20000 | 1 |
選べる集計操作
| 操作 | Excel関数相当 |
|---|---|
| 合計 | SUM |
| 平均 | AVERAGE |
| 中央値 | MEDIAN |
| 最小 | MIN |
| 最大 | MAX |
| 行のカウント | COUNTA |
| 個別の値のカウント | (ユニークカウント) |
| すべての行 | ―(グループごとにテーブルをネストする高度な操作) |
集計操作で「すべての行」を選ぶと、グループごとの全行がテーブルとして1セルに格納されます。これを展開したり、M関数で加工したりすることで「グループ内の最大値の行だけ取り出す」「グループ内で連番を振る」などの高度な処理が可能です。M言語編で詳しく扱います。
ピボット列 ― 縦持ちデータを横持ちに変換する
グループ化で得た縦持ちの集計結果を、クロス集計表(横持ち)の形に変えたいときに使います。
サンプル(Before)
| 部署 | 月 | 売上 |
|---|---|---|
| 営業部 | 1月 | 500000 |
| 営業部 | 2月 | 600000 |
| 経理部 | 1月 | 200000 |
| 経理部 | 2月 | 250000 |
操作手順
1. 横に展開したい列(「月」列)のヘッダーをクリックして選択します。
2. 変換 タブ → ピボット列 をクリックします。
3. 「値列」で集計する数値の列(「売上」)を選択します。
4. 「詳細オプション」で集計関数を選びます(合計、カウント、最小、最大、平均、集計しない)。通常は「合計」。
5. 「OK」をクリック。
結果(After)
| 部署 | 1月 | 2月 |
|---|---|---|
| 営業部 | 500000 | 600000 |
| 経理部 | 200000 | 250000 |
同じキーの組み合わせに対して値が1つだけの場合(たとえばアンケートの回答を縦→横に変えるとき)は、「詳細オプション → 値の集計関数 → 集計しない」を選択します。複数値があるのに「集計しない」を選ぶとエラーになります。
ピボット解除 ― 横持ちデータを縦持ちに変換する
これはピボット列の逆操作です。実務では横に月が並んだクロス集計表を受け取ることが多く、これを分析しやすい縦持ちデータに変換する場面で活躍します。Excelの関数だけでこれをやろうとすると INDEX + INT + MOD の難解な式が必要でしたが、Power Queryなら数クリックです。
サンプル(Before ― よくある月別クロス集計)
| 商品 | 1月 | 2月 | 3月 |
|---|---|---|---|
| 商品A | 100 | 150 | 120 |
| 商品B | 80 | 90 | 110 |
操作手順(方法1:列を選んで「列のピボット解除」)
1. ピボット解除したい列(「1月」「2月」「3月」)をCtrl+クリックで選択します。
2. 変換 タブ → 列のピボット解除 をクリックします。
3. 選択した列が2つの列「属性」(元の列名)と「値」(元のデータ)に変換されます。
操作手順(方法2:固定列を選んで「その他の列のピボット解除」)★おすすめ
1. ピボット解除しない列(「商品」列)をクリックして選択します。
2. 変換 タブ → 列のピボット解除 → その他の列のピボット解除 をクリックします。
3. 「商品」以外のすべての列がピボット解除されます。
結果(After)
| 商品 | 属性 | 値 |
|---|---|---|
| 商品A | 1月 | 100 |
| 商品A | 2月 | 150 |
| 商品A | 3月 | 120 |
| 商品B | 1月 | 80 |
| 商品B | 2月 | 90 |
| 商品B | 3月 | 110 |
あとは「属性」を「月」、「値」を「売上」に列名変更するだけで、きれいな縦持ちデータの完成です。
方法2のほうが将来の変更に強いです。たとえば元データに「4月」列が追加されても、固定列(商品)以外をすべてピボット解除するため、クエリの修正が不要です。方法1だと「4月」を手動で選び直す必要があります。
Excelの関数だけでクロス集計を縦持ちに変換する場合、
=INDEX($B$2:$D$3, INT((ROW()-2)/3)+1, MOD(ROW()-2,3)+1) のような式が必要です。列が増えるたびに式の修正が必要で、行数の計算も煩雑です。Power Queryの「ピボット解除」なら、列が増減しても「更新」するだけで自動対応します。
実践例 ― 月別クロス表を受け取ってピボットテーブル用に整形
Step 1:ピボット解除
「商品」列を選択 → 変換 → その他の列のピボット解除
Step 2:列名変更
「属性」→「月」、「値」→「売上」
Step 3:グループ化で商品別合計を確認
変換 → グループ化 → グループ列「商品」→ 集計「売上合計(合計、売上)」
たった3ステップで、横持ちのクロス表を縦持ちに変換し、さらに商品別の合計まで出せました。
まとめ
グループ化はSUMIFS的な集計をテーブル全体に適用する操作で、「詳細」モードなら複数キー×複数集計も可能です。ピボット列は縦持ちデータを横持ちに変換し、ピボット解除は横持ちを縦持ちに戻します。特にピボット解除では「その他の列のピボット解除」を使うことで、列の増減に自動対応できます。これら3機能を組み合わせれば、Excel上でのデータ形状変換の悩みはほぼ解消されます。