論文一覧に戻る 📚 用語集トップ 🗺 概念マップ
📚 用語解説
📚 用語解説
集計
Aggregation
データ処理

🔖 キーワード索引

本ページのトピックを 1 タップで移動できます。 「集計」を学ぶうえで押さえたい論点はすべてここに集約しました。

30秒で結論文脈ボックス直感で掴む数式・定義記号の意味実値で計算Python実装落とし穴関連手法関連用語グループ教材概念マップチェックリスト

💡 30秒で分かる結論

複数行のデータを groupby などのキーで束ね、 合計・平均・件数などの要約統計量に変換する操作。

📍 あなたが今見ているもの

分野:データエンジニアリング(前処理 → 集計 → 可視化 → モデル化のうち、 集計フェーズ)。 SSDSE-B-2026 のような 個票形式の都道府県データ を分析する第一歩。

位置づけ:個票(個別観測)レベルから 分析単位(地方ブロック・年齢階級・職業大分類など)への変換。 探索的データ分析(EDA)の最初の山場。

典型的なワークフロー:CSV 読み込み → 列名整理 → 型変換 → 集計 → 可視化 / モデル化。 集計の出力が、 後続のすべての作業の入力になる。

関連groupby / ピボットテーブル / 結合(join) と組み合わせて使う。

🎨 直感で掴む

「集計」とは、 たくさんある行を意味のあるまとまりに束ねて、 数値を 1 行に要約すること。 たとえば SSDSE-B-2026 には 47 都道府県 × 約 110 列(人口・出生・労働力 等)が並んでいる。 これを「地方ブロックごとの合計人口は?」「東日本 vs 西日本で大学数の平均はどちらが大きい?」と問うとき、 私たちは 都道府県 47 行 → 地方ブロック 8 行行数を圧縮している。 これが集計の本質。

日常生活の比喩でいえば、 集計は 「家計簿の月締め」 に近い。 1 日ごとのレシート(個票)を、 「食費」「交通費」のカテゴリで縦に積み上げて月別合計に変換する。 元のレシート 1 枚 1 枚は残らないが、 全体傾向が見える。 同じように、 SSDSE では「47 都道府県の個別値」を 1 枚 1 枚のレシートに見立て、 「地方ブロック」というカテゴリで束ねる。

集計には主に 3 タイプある:

大事なのは、 「合計」と「平均」と「件数」で見える物語がまったく違う ということ。 たとえば「関東は人口合計で日本一」だが「平均年収」では東京単独が突出していて、 神奈川・千葉・埼玉と平均すると東京単独より下がる。 だから集計関数の選び方が分析の質を決める。

SSDSE-B-2026 を使った具体的な集計例は、 後段「🧮 実値で計算してみる」で扱う。 そこでは 47 都道府県を 8 つの地方ブロックに分けて合計人口・平均出生率を計算 する。

歴史的背景:集計は統計学の起源そのもの。 17 世紀のジョン・グラントが「ロンドン死亡記録」を週次集計したのが近代統計の出発点とされ、 19 世紀のフローレンス・ナイチンゲールも野戦病院の死因を集計してインフォグラフィックを発明した。 つまり集計は 「データを意思決定可能な情報に変える」 最古かつ最強の技法。

📐 数式・定義

グループ \(g\) に属する観測値の集合を \(S_g = \{x_i : i \in g\}\)、 その要素数を \(n_g\) とする。 代表的な集計関数は次の通り。

$$ \text{sum}(g) = \sum_{i \in g} x_i, \qquad \text{mean}(g) = \frac{1}{n_g}\sum_{i \in g} x_i $$ $$ \text{count}(g) = n_g, \qquad \text{var}(g) = \frac{1}{n_g - 1}\sum_{i \in g}(x_i - \text{mean}(g))^2 $$ $$ \text{min}(g) = \min_{i \in g} x_i, \qquad \text{max}(g) = \max_{i \in g} x_i $$

複数キーでの集計(多段 groupby)は、 集合の 分割を入れ子にする操作と等しい。 たとえば「地方ブロック × 性別」で人口を集計する場合:

$$ A_{b,s} = \sum_{i : \text{block}(i)=b,\ \text{sex}(i)=s} \text{pop}_i $$

割合(シェア)の計算は集計値を全体合計で割る正規化操作:

$$ \text{share}(g) = \frac{\text{sum}(g)}{\sum_{g'} \text{sum}(g')} \times 100\ [\%] $$

「集計」と双対の概念に 結合(join)がある。 集計が 「縦方向の圧縮」 なら、 結合は 「横方向の拡張」。 多くの分析パイプラインは read → join → groupby → agg の順で組まれる。

🔬 数式を言葉で読み解く

記号意味
gグループ(地方ブロック・年齢階級など)の識別子。 SSDSE では「地方ブロック」が典型。
S_gグループ g に属する観測(行)の集合。 例:S_関東 = {埼玉, 千葉, 東京, 神奈川, 茨城, 栃木, 群馬} の 7 行。
n_gグループ g のサンプル数(行数)。 SSDSE で都道府県を集計するなら例えば n_関東 = 7。
x_i個別観測値(県別の人口・出生数など)。
sum(g)グループ g の合計。 SSDSE で「関東の総人口 = sum(g=関東)」のように使う。
mean(g)グループ g の平均。 「関東の平均出生率」など、 県数で正規化された指標。
var(g)グループ内分散。 ばらつきの大きさ。 集計値だけ見ると失われがちな情報。
min/max(g)グループ内最小・最大。 関東なら東京(最大)と栃木(中位)の差で が見える。
block(i)行 i がどの地方ブロックに属するかを返す写像。 集計キーの本体。
share(g)グループ g のシェア(%)。 集計値を全体合計で割って 100 倍。
A_{b,s}2 キー集計(地方ブロック b × 性別 s)の結果。 ピボット表の各セル。

🧮 実値で計算してみる(SSDSE-B-2026)

SSDSE-B-2026.csv の 47 都道府県を、 8 つの地方ブロック(北海道・東北・関東・中部・近畿・中国・四国・九州沖縄)にグループ化し、 総人口 A1101 を合計 する例を見てみる。 ここでは概数(万人)で示す。

地方ブロック 含まれる都道府県(数) 総人口(万人) 平均人口(万人) 全国シェア(%)
北海道1509509.24.1
東北6837139.56.7
関東74357622.434.8
中部92095232.816.7
近畿72237319.617.9
中国5713142.65.7
四国435989.82.9
九州沖縄81404175.511.2
全国合計4712511266.2100.0

表から:関東ブロック単独で全国人口の約 35% を占める(4357/12511)。 これは個別の 47 行を眺めるだけでは見えにくい構造。 集計が「視点を変える」ことが分かる典型例。

同様に 出生数 A4101 を集計すれば「東日本 vs 西日本での子ども数の偏り」、 大学数 E4501 を集計すれば「高等教育インフラの地域偏在」が浮かび上がる。

補助計算:65 歳以上人口比(高齢化率)の地方ブロック平均

SSDSE-B-2026 の列 A1303(65 歳以上人口)/A1101(総人口)から県別高齢化率を計算し、 地方ブロックごとに平均をとると下表のようになる(概数)。

地方ブロック 高齢化率の平均 (%) 最小県 (%) 最大県 (%)
北海道33.033.033.0
東北34.532.038.5
関東28.623.531.5
中部31.025.535.0
近畿30.527.034.0
中国34.030.537.5
四国35.033.037.0
九州沖縄31.523.035.0

同じ集計でも 「合計」 なら関東が日本一だが、 「平均高齢化率」 なら四国・東北・中国が上位に来る。 集計関数を変えると見える社会構造が反転する のがよく分かる。

🐍 Python 実装

SSDSE-B-2026 を読み込んで、 47 都道府県を地方ブロックで集計する完全コード。

import pandas as pd

# 1) SSDSE-B-2026 読み込み (1行目が英語コード、2行目が日本語ラベル、3行目以降データ)
df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1])

# 2) 都道府県を地方ブロックにマッピング
block_map = {
    '北海道': '北海道',
    '青森県': '東北', '岩手県': '東北', '宮城県': '東北', '秋田県': '東北', '山形県': '東北', '福島県': '東北',
    '茨城県': '関東', '栃木県': '関東', '群馬県': '関東', '埼玉県': '関東', '千葉県': '関東', '東京都': '関東', '神奈川県': '関東',
    '新潟県': '中部', '富山県': '中部', '石川県': '中部', '福井県': '中部', '山梨県': '中部',
    '長野県': '中部', '岐阜県': '中部', '静岡県': '中部', '愛知県': '中部',
    '三重県': '近畿', '滋賀県': '近畿', '京都府': '近畿', '大阪府': '近畿', '兵庫県': '近畿', '奈良県': '近畿', '和歌山県': '近畿',
    '鳥取県': '中国', '島根県': '中国', '岡山県': '中国', '広島県': '中国', '山口県': '中国',
    '徳島県': '四国', '香川県': '四国', '愛媛県': '四国', '高知県': '四国',
    '福岡県': '九州沖縄', '佐賀県': '九州沖縄', '長崎県': '九州沖縄', '熊本県': '九州沖縄',
    '大分県': '九州沖縄', '宮崎県': '九州沖縄', '鹿児島県': '九州沖縄', '沖縄県': '九州沖縄',
}
df['Block'] = df['Prefecture'].map(block_map)

# 3) groupby で集計(複数の集計関数を同時適用)
agg = df.groupby('Block').agg(
    都道府県数=('Prefecture', 'count'),
    総人口=('A1101', 'sum'),
    平均人口=('A1101', 'mean'),
    出生数合計=('A4101', 'sum'),
    大学数合計=('E4501', 'sum'),
)
print(agg.sort_values('総人口', ascending=False))

# 4) 全国シェアを追加
agg['人口シェア(%)'] = agg['総人口'] / agg['総人口'].sum() * 100
print(agg)

2 軸集計とピボットテーブル

# 仮の年齢区分列を追加(65歳以上人口 A1303 / 総人口 A1101 で高齢化率)
df['高齢化率'] = df['A1303'] / df['A1101']
df['高齢区分'] = pd.cut(df['高齢化率'], bins=[0, 0.25, 0.30, 1.0], labels=['若い', '標準', '高い'])

# 2軸の集計
two_way = df.groupby(['Block', '高齢区分'], observed=True).size().unstack(fill_value=0)
print(two_way)

# ピボットテーブル形式
pv = df.pivot_table(
    index='Block',
    values=['A1101', 'A4101', 'E4501'],
    aggfunc=['sum', 'mean'],
)
print(pv)

# Excel/CSV に書き出し
pv.to_csv('outputs/region_pivot.csv', encoding='utf-8-sig')

カスタム集計関数(lambda・apply)

# 各地方ブロックで「人口最大の県」を取り出す
def top_pref(group):
    idx = group['A1101'].idxmax()
    return group.loc[idx, 'Prefecture']

top_by_block = df.groupby('Block').apply(top_pref)
print(top_by_block)
# 北海道 -> 北海道、関東 -> 東京都、近畿 -> 大阪府、九州沖縄 -> 福岡県 …

# 加重平均:人口で重み付けした高齢化率(県を単純平均しない)
def weighted_aging(group):
    return (group['A1303'].sum() / group['A1101'].sum()) * 100

w_aging = df.groupby('Block').apply(weighted_aging)
print(w_aging.round(2))

transform:集計結果を元の行に戻す

# 各県の人口を「自県が所属する地方ブロック総人口」で割って、 ブロック内シェアを計算
df['ブロック内人口シェア(%)'] = df.groupby('Block')['A1101'].transform(lambda x: x / x.sum() * 100)
print(df[['Prefecture', 'Block', 'A1101', 'ブロック内人口シェア(%)']].head(10))

# 関東ブロックでは東京都が約 32%、 神奈川県が約 21% を占めることがわかる

補足:df.groupby(...).transform(...) は集計結果を 元の行数のまま 返すので、 「県の値をブロック平均と比較したい」「ブロック内偏差を計算したい」ようなケースに最適。

⚠️ 落とし穴

❌ 集計後は元データに戻れない
都道府県別の値を地方ブロックに合計してしまうと、 ブロック内の県間ばらつき(分散)は失われる。 必要なら std/var/min/max も同時に取って 付帯情報 として残しておくこと。 集計の前に df.copy() でバックアップを取る癖もつけたい。
❌ 合計と平均で見える物語が逆転する
関東は 総人口では圧倒的トップだが、 平均人口でも他ブロックより大きい一方、 1 県あたりの面積・密度では別の順序になる。 「合計」「平均」「中央値」を取り違えないこと。 報告書では必ず 使用した集計関数の種類 を明記。
❌ 欠損値の暗黙の扱い
pandas の sum() はデフォルトで NaN を 0 として無視する。 SSDSE で欠損のある列を集計すると 暗黙のうちに観測数が変わるdf.groupby(...).agg('count') で件数も同時に確認するのが鉄則。
❌ groupby のキー型
カテゴリ列は astype('category') にしておかないと 順序が辞書順になり、 地方ブロックを北海道→東北→…で並べたいのに北海道→九州→…になることがある。 表示順を明示する pd.Categorical([...], categories=[...], ordered=True) が便利。
❌ 単純平均と加重平均の混同
各県の「高齢化率」をブロック内で単純平均すると、 鳥取(小県)も東京(大県)も同じ重みになる。 人口比に応じた 加重平均 をしたい場合は (group['A1303'].sum() / group['A1101'].sum()) のように分子分母を別々に sum する。

📜 歴史・背景

集計(aggregation)は統計学の起源そのものといっても過言ではない。 1662 年、 ジョン・グラント(John Graunt)はロンドン市の死亡記録を週次・年次で 集計 し『死亡表に関する自然的および政治的観察』を出版。 これが 近代統計学の最古の著作とされる。 個別の死亡情報を「年齢階級」「死因」というキーで束ねたことが、 都市衛生政策の意思決定を可能にした。

19 世紀には、 フローレンス・ナイチンゲール(Florence Nightingale)がクリミア戦争の野戦病院死因を月別・原因別に集計し、 ローズダイアグラム(polar area chart) で可視化した。 「戦闘での死より、 衛生環境の不備による感染症死のほうが圧倒的に多い」という事実が、 集計と可視化の組み合わせで初めて社会に伝わった。

計算機時代に入ってからの集計の主役は SQL(1970 年代、 IBM)であり、 そこで GROUP BY 句が標準化された。 2000 年代以降の R の dplyr、 Python の pandas は SQL の集計セマンティクスを継承しつつ、 data frame という形でメモリ上の柔軟な集計を可能にした。 SSDSE のような中規模公的統計(数十 MB クラス)は、 pandas の groupby で十分快適に扱える時代に入った。

🚀 応用例・実務での使われ方

「集計」が実務でどう使われるか、 SSDSE-B-2026 を題材にした具体的なシナリオで見てみる。

シナリオ 1:地方創生レポートの作成

SSDSE-B-2026 の人口・出生数・転入転出から「地方ブロック別の人口流動表」を作る。 集計列:A1101(総人口)、 A4101(出生数)、 A5101(転入)、 A5102(転出)。 集計後の表をベースに、 「自然増減=出生数−死亡数」「社会増減=転入−転出」を算出し、 地方創生戦略の優先順位付けに使える。

シナリオ 2:高等教育インフラの偏在分析

列 E4501(大学数)・E4601(大学学生数)・A1101(人口)を地方ブロックで集計。 「人口あたり大学学生数」を比較し、 東京一極集中の度合いを定量化。 集計値だけでなく シェア(%)人口比 の 2 つの観点で見るのがコツ。

シナリオ 3:医療資源の地域差

SSDSE の I 列(医療施設・診療所・保育所)を集計対象に、 ブロック別の「人口千人あたり医療施設数」を算出。 単純合計だけでは「人口の多い関東が圧倒的」になるが、 正規化(人口で割る) をすると四国・中国が上位に来ることがある。

シナリオ 4:消費パターンの地域クラスタリング

SSDSE の L322 系列(家計の消費支出内訳:食料・住居・光熱・被服など)を地方ブロックで集計し、 ブロックごとの消費構成比を計算。 ここから k-means クラスタリング で「消費パターンが似たブロック群」を発見できる。 集計が機械学習の入力データを作るパイプラインの起点になる例。

🔄 似た概念との比較

「集計」と混同しやすい用語との比較表。 違いを明確にすることで使い分けの判断が早くなる。

観点集計似た用語違い
行数の変化行が 減る(圧縮)結合(join)は行が 増えることもある集計は縦方向の圧縮、 結合は横方向の拡張
キーの役割グループを定義する列結合キーは「同じ ID を持つ行をくっつける」集計キーは「同じ値の行を束ねる」
典型関数sum / mean / count / medianmerge / join集計は集約関数、 結合はキーマッチ
SQL 対応GROUP BY + 集約関数JOIN ... ONSQL でも別概念だが、 1 つのクエリで併用される
SSDSE での例47 県を 8 地方ブロックに圧縮都道府県別 GDP と人口を ID で merge集計は要約、 結合は変数追加
情報損失あり(個票情報は失われる)なし(行数増・列数増のみ)集計後は元データに戻れない

❓ よくある質問(FAQ)

Q. groupby と pivot_table の使い分けは?
A. groupby縦持ちの結果(MultiIndex も可)、 pivot_table横持ちのクロス表を作る。 行と列を両方カテゴリで切りたい(例:地方 × 高齢区分)ときは pivot_table が読みやすい。 縦持ちで後続処理(merge / plot)したいときは groupby が便利。
Q. 集計とリサンプリング(resample)の関係は?
A. resample時系列の時間軸を集計キーにする groupby の特殊版。 SSDSE-B-2026 は年次の都道府県データなので resample は不要だが、 もし「2018-2026 の都道府県別年次パネル」を扱うなら resample('Y') が便利。
Q. NaN を含むキーで groupby するとどうなる?
A. pandas のデフォルト dropna=True では NaN を持つ行は 集計から除外される。 「NaN もひとつのグループとして集計したい」なら groupby(key, dropna=False) を指定。 集計対象列の NaN とキー列の NaN を区別すること。
Q. 集計値を元データの各行に戻したい場合は?
A. transform を使う。 例:df['block_mean'] = df.groupby('Block')['A1101'].transform('mean') で「自県が所属するブロックの平均人口」を各行に展開できる。 偏差や標準化に必須。
Q. 巨大データで遅いときは?
A. 集計対象列を事前に astype('category') に変換、 不要列を drop、 groupby(observed=True) でメモリ削減。 さらに大規模なら Polars / DuckDB を検討。

✅ 実施前チェックリスト

📝 本ページまとめ — 「集計」を一言で

「集計(aggregation)」とは 個票レベルの観測値を、 グループ単位の要約統計量に変換する操作。 SSDSE-B-2026 のような 47 都道府県データを「地方ブロック 8 つ」「年齢階級」「性別」などのキーで束ね、 sum / mean / count / median といった集約関数で 1 行に要約する。 pandas では df.groupby(key).agg(...) が中心ツールであり、 SQL の GROUP BY と 1 対 1 対応。

覚えるべきは 3 点:① 集計後は 行が減る/元に戻れない。 ② 集計関数の選び方(sum vs mean vs median)で 見える物語が変わる。 ③ 加重平均が必要かどうかの判断。