「spreadsheet」は統計データ分析の文脈で扱う重要概念のひとつ。 本ページでは「spreadsheet」を取り巻く中核キーワードを以下にチップで一覧化する。 各キーワードは関連する概念・手法・道具立てを含み、 文献検索や学習計画の起点になる。
これらのキーワードは「spreadsheet の理解 → 適用 → 検証」のプロセスを構成する。 各章で詳しく解説する。
🍰 まずはやさしく
計算ができる魔法の表です。
データの計算や整理に使います。
部活の出席簿などの管理に便利です。
ツールの基本機能について読みましょう。
Excel/Google Sheets 等の表計算ツール
🍰 まずはやさしく
データ分析の入り口となる道具です。
公的な統計データを読み込むために使います。
スマホやPCで表形式のファイルを開くときです。
学習の流れと構成について読みましょう。
公的統計データ(e-Stat、 SSDSE)の元ファイルもほとんど Excel/CSV。 「データを見る」最初のツールとして避けて通れません。
本ページでは「spreadsheet」を扱う。 統計データ分析コンペティション (2026) の教材で、 SSDSE-B-2026 (47 都道府県 × 複数年 × 100 超列) の実データを使った再現可能な学習を目指す。
「spreadsheet」は統計・データサイエンスの体系における重要概念のひとつ。 本ページは「定義・直感・数式・実装・落とし穴・関連手法」の 6 視点で構成され、 各視点は独立して読めるが順序通り読むと体系的な理解が得られる。
🍰 まずはやさしく
自動で計算してくれる家計簿のようなものです。
数値を変えて結果をすぐに知るために使います。
お小遣い帳の合計を自動で出すときと同じです。
使い心地と注意点について読みましょう。
セル A1 に =B1+C1 と書けば、 B1 と C1 を変更するたび A1 も自動更新。 これが 反応的計算 の魅力です。
欠点:式が増えるとどこが何に依存しているか追えなくなる(スパゲッティ化)。 数百MB を超えると重くなる。
スプレッドシートを家計簿に例えると分かりやすい。 「収入」列に金額を入れ、 「支出合計」セルに =SUM(B2:B31) を書けば、 1 日の支出を変えただけで月合計が自動で更新される。 紙の家計簿との違いは「数式と値の分離」「自動再計算」「コピーで一括処理」の 3 点。
SSDSE-B-2026 でいえば、 47 都道府県の総人口 (A1101) を A 列に置き、 65 歳以上人口 (A1303) を B 列に置き、 C 列に =B2/A2*100 と書けば「高齢化率(%)」が一気に 47 件計算される。 数値が更新されても式は不変なので、 翌年のデータに差し替えるだけで分析が再現できる。
ただしセル参照が増えると依存関係がスパゲッティ化し、 「どこを変えるとどこに影響するか」が見えなくなる。 大規模分析では Python (pandas) に乗り換える判断が必要になる、 という限界もある。
ここからは実際に触れるミニ表計算。 セルに数値や数式(=A1+B1、 =SUM(A1:C1))を入力すると、 依存セルの変更で 自動再計算される様子、 相対参照と絶対参照のコピー時の違い、 循環参照エラーの検出を体感できる。 外部ライブラリなし・完全オフラインで動作する。
※ 数値はすべて架空の売上データ(実在の企業・公的統計とは無関係、 教材用に筆者が作成した例)。
A4 をクリックすると =SUM(A1:A3) という式が現れる。 A1 の値を 200 に変えると D1・A4・D4 が同時に更新される(=反応的計算)。 「循環参照を試す」を押すと A1 が自分を含む D1 を参照し、 #循環参照! が表示される。$ を付けた参照(絶対参照)は固定され、 付けない参照(相対参照)はコピー方向にずれる。スプレッドシートの本質は「格子(セルの2次元配列)に、 値だけでなく数式を書ける」こと。 数式は依存元セルを名前(A1)で指すため、 依存元が変わると自動で再計算される。 内部的にはセル間の依存が有向非巡回グラフ(DAG)を成し、 変更のあったセルから下流だけをトポロジカル順に再評価している。 上のミニ表で A1 を変えると D1→D4 だけが動くのは、 まさにこの「下流だけ再計算」の可視化だ。
=A1 をコピーすると貼り付け位置に応じて参照がずれる。 意図せず1行下の空セルを指して 0 になる事故が多い。 固定したい参照には $ を付ける(絶対参照)。 ②のデモで挙動を確認しよう。#循環参照!)。 「合計セルを合計に含める」ミスが典型。 DAG に閉路ができた状態。=0.1+0.2 は 0.30000000000000004。 表示は丸められても内部誤差は残り、 =(0.1+0.2=0.3) が FALSE になる。 金額比較では ROUND を挟む。🍰 まずはやさしく
セルというマス目で管理する計算機です。
数式を使って大量のデータを処理します。
テストの点数をまとめて計算するときに似ています。
仕組みや数式のルールについて読みましょう。
スプレッドシート(Spreadsheet):Excel/Google Sheets 等の表計算ツール
| 記号 | 意味と直感 |
|---|---|
| $\text{Cell}_k$ | k 番目のセル(例: A1, B5, $C$3)。 値か数式を持つ。 |
| $f_k$ | そのセルに書かれた関数。 例: =SUM, =VLOOKUP, =A1+B1。 |
| $\text{Cell}_{i_j}$ | k が参照する他のセル群(依存元)。 |
| $k \notin \{i_1, ..., i_n\}$ | 自分を参照しない。 Excel は循環参照を検出してエラーにする。 |
| DAG | セル間の依存関係グラフ。 トポロジカル順序で評価することで 反応的計算を実現。 |
→ Excel のセル再計算は 「依存元から順に計算する」 アルゴリズム。 1 セル変更 → DAG 走査 → 影響セルだけ再計算。 React / Vue の reactive システムと数学的に同じ。
| 記号 | 意味 |
|---|---|
| セル参照 | A1, B$2, $C$3(絶対/相対参照) |
| 数式 | =SUM, =AVERAGE, =VLOOKUP, =IF, =SUMIFS |
| ピボット | 集計表をドラッグ&ドロップで作成 |
| 条件付き書式 | 値に応じてセル色を変える可視化 |
スプレッドシート(Spreadsheet)は、 単に用語の定義を覚えるだけでは本当には理解できません。 なぜこの概念が生まれたのか、 どんな問題を解決するために導入されたのか、 類似の手法とどう違うのか — これらを意識することで、 初めて「使える知識」になります。
数式や Python コードはあくまで 道具。 道具の使い方を覚える前に、 その道具で何をしたいか(目的) を明確にすることが、 データサイエンス学習の鉄則です。
この用語は、 単独で存在するわけではなく、 多くの関連概念とネットワークを形成しています。 上の「関連用語」セクションに挙げたリンク先を1つずつ辿ると、 全体像が見えてきます。 特に:
理論を学ぶことと、 実務で使えることは別物です。 公的統計(SSDSE、 e-Stat 等)の実データで実装・実験することで、 教科書だけでは見えない罠 に気付けます。 たとえば:
これらは スプレッドシート に限った話ではなく、 データサイエンス全般に共通する作法です。 「落とし穴」セクションの内容と合わせて、 自分なりのチェックリストを作るとよいでしょう。
スプレッドシート を使った分析の 正しさを担保する ためには、 以下の観点で検証するのが定番です。
| 確認する点 | スプレッドシート で何を見るか |
|---|---|
| 数式コピーで参照ずれ | $ 記号の使い分け(絶対/相対参照)を理解。 |
| 日付の自動変換 | 「3-1」が「3月1日」になる事故。 文字列指定で防ぐ。 |
| 行数上限 | Excel は約100万行で停止。 大規模データは別ツールへ。 |
| 再現性ゼロ | 「セル B5 を 0.95 に変えた」が履歴に残らない。 Python/Git推奨。 |
| 浮動小数誤差 | Excel は IEEE 754 倍精度浮動小数。 =0.1+0.2 は 0.3000000000000000444。 通貨計算では ROUND 関数で明示的に丸める。 |
| 65,536 行 / 1,048,576 行の上限 | 旧 .xls は 65,536 行で停止。 新 .xlsx は約 100 万行(1,048,576 行)。 ログデータでは すぐオーバー。 pandas / Parquet / DuckDB へ移行。 |
| 再現性 | 同じデータ・同じコードで同じ結果が出るか。このページの ▶ 実行ボタンで確かめられます |
スプレッドシート は分野横断で活躍する概念です。 業界別に見ると以下のような使われ方があります。
スプレッドシート を実際のデータで学ぶときは、 SSDSE(教育用標準データセット、 総務省統計局)が便利です。
これらは 統計センターの SSDSE ページ から CSV で直接ダウンロードできます。 上の Python コード例で data/raw/SSDSE-B-2026.csv としているのが、 まさにこれです。
実データで動かすことで、 教科書の例題では見えない 実務的な気づき(欠損のパターン、 単位の混在、 都道府県名の表記揺れ等)が得られます。
pip install pandas numpy scikit-learn matplotlib で揃います。utf-8 ではなく shift_jis や cp932 の場合がある(古い日本の公的統計に多い)。 encoding='cp932' を試してください。%matplotlib inline、 スクリプト実行なら plt.show() を忘れずに。 日本語フォントは matplotlib 用に別途設定(japanize-matplotlib 等)が必要。表計算ソフトの祖は VisiCalc(1979 年、 Apple II 用)。 「会計の表を画面で操作できる」革新で Apple II の販売を爆発させた。 続いて Lotus 1-2-3(1983 年、 IBM PC)が DOS 時代を制し、 Microsoft Excel(1985 年 Mac 版、 1987 年 Windows 版)が GUI で標準を確立した。
Excel は VBA(1993 年)で自動化、 PivotTable(1993 年)でクロス集計、 XML ベースの .xlsx(2007 年)で互換性向上、 PowerQuery / PowerPivot(2010 年代)でデータエンジニアリング機能を取り込んだ。
クラウド時代の Google Sheets(2006 年〜)はリアルタイム共同編集を一般化、 Airtable / Notion DB(2015〜)はスプレッドシートと DB の境界を曖昧にした。 現在の AI 時代では ChatGPT/Copilot の Excel 統合(2023 年〜)が「自然言語で集計を書く」インターフェースを実現している。
data/raw/SSDSE-B-2026.csv(encoding='cp932', skiprows=[1])を Excel / Google Sheets で開くと、 564 行 × 112 列の表が現れる。 1 行目は英数字コード(A1101, A1303 など)、 2 行目は日本語ラベル(人口、 75 歳以上人口など)、 3 行目以降が値。 ファイルサイズは 359,821 byte(約 350 KB)。
| セル | 列名 | 意味 | 値(東京都) |
|---|---|---|---|
| A1 | SSDSE-B-2026 | 年度 | 2023 |
| B1 | Code | JIS 都道府県コード | R13000 |
| C1 | Prefecture | 都道府県名 | 東京都 |
| D1 | A1101 | 人口総数 | 14,086,000 |
| P1 | A1303 | 65 歳以上人口 | 3,202,000 |
| S1 | A4101 | 出生数 | 91,097 |
| W1 | A4200 | 死亡数 | 163,196 |
→ 112 列分すべての meaning は SSDSE 仕様書 PDF 参照。 列名は短いが、 数値型なので Excel ですぐピボット集計可能。
| Excel 数式 | 期待値(2023 年 47 県) | 意味 |
|---|---|---|
| =SUM(D2:D48) | 124,353,000 | 全国人口合計 |
| =AVERAGE(D2:D48) | 2,645,808.5 | 人口平均(47 県) |
| =MAX(D2:D48) | 14,086,000 | 最大(東京都) |
| =MIN(D2:D48) | 537,000 | 最小(鳥取県) |
| =COUNTA(C2:C48) | 47 | 県数 |
| =VLOOKUP("東京都",C2:D48,2,FALSE) | 14,086,000 | 県名で人口検索 |
| =SUMIF(C2:C48,"*県",D2:D48) | 92,089,000 | 「県」を含む 43 件の人口合計 |
| =AVERAGEIF(D2:D48,">5000000") | 7,801,500 | 500 万超の県だけ平均 |
→ 47 行のデータなら、 Excel と pandas は実行時間にほぼ差がない。 Excel の優位性は 「対話的にセルをクリックして確認できる」 こと。 一方、 数百万行を超えると Excel は重くなり、 pandas / SQL へ移行する。
| 関数 | 用途 | SSDSE 例 |
|---|---|---|
| =SUM(範囲) | 合計 | 人口合計 |
| =AVERAGE(範囲) | 平均 | 47 県平均人口 |
| =MEDIAN(範囲) | 中央値 | 外れ値(東京)に影響されない代表値 |
| =MAX / =MIN(範囲) | 最大・最小 | 東京 14,086,000 / 鳥取 537,000 |
| =COUNT / =COUNTA(範囲) | 数値カウント / 全カウント | 47 県 |
| =COUNTIF(範囲,条件) | 条件付きカウント | 500 万超の県は 9 件 |
| =SUMIF(範囲,条件,合計範囲) | 条件付き合計 | 「県」を含む県の人口合計 |
| =AVERAGEIF(範囲,条件,平均範囲) | 条件付き平均 | 「府」だけの人口平均 |
| =SUMIFS / =COUNTIFS / =AVERAGEIFS | 複数条件版 | 「2023 年かつ近畿」の出生数合計 |
| =VLOOKUP(キー,範囲,列番号,FALSE) | 縦方向検索 | 県名 → 人口 |
| =HLOOKUP / =XLOOKUP | 横方向 / 新汎用検索 | 列ヘッダ → 値の取得 |
| =INDEX(範囲, 行, 列) | 指定位置の値 | 行・列番号で値取得 |
| =MATCH(値,範囲,0) | 位置検索 | 「東京都」が何行目か |
| =IF(条件,真,偽) | 条件分岐 | 人口 100 万超なら "大", 以下なら "小" |
| =IFS(条件1,値1,条件2,値2) | 複数分岐 | 人口で 5 段階ランク付け |
| =IFERROR(式,代替値) | エラー処理 | VLOOKUP の #N/A を "-" に置換 |
| =ROUND / ROUNDUP / ROUNDDOWN | 丸め | 浮動小数誤差対策 |
| =CONCAT / =TEXTJOIN | 文字列結合 | "県名" + "_" + "コード" |
| =LEFT / =RIGHT / =MID | 文字列抽出 | 「東京都」の最後 1 文字 = 「都」 |
| =LEN(文字列) | 文字数 | 「神奈川県」は 4 文字 |
| =SUBSTITUTE / =REPLACE | 文字列置換 | 「県」を空欄に |
| =TRIM(文字列) | 前後空白除去 | CSV の空白対策 |
| =DATE / =YEAR / =MONTH / =DAY | 日付操作 | 年度フィルタ |
| =NOW() / =TODAY() | 現在時刻 / 今日 | レポート発行日 |
| =RANK / =RANK.EQ / =RANK.AVG | 順位 | 47 県を人口降順ランキング |
| =PERCENTILE / =QUARTILE | パーセンタイル / 四分位 | 中央値・Q1・Q3 |
| =STDEV / =VAR | 標準偏差 / 分散 | 47 県人口のばらつき |
| =CORREL(範囲1,範囲2) | 相関係数 | 人口と出生数の相関 r ≈ 0.99 |
| =SLOPE / =INTERCEPT | 単回帰の傾き・切片 | 人口 → 出生数の予測式 |
| =UNIQUE / =SORT / =FILTER | 動的配列(Excel 365+) | 重複除去・並べ替え・絞り込み |
合成データで SUM, AVERAGE, IF をシミュレートする。
1 2 3 4 | A = [100, 200, 150, 80, 120] print(f"SUM: {sum(A)}") print(f"AVG: {sum(A)/len(A)}") print(f"OK 数: {sum(x >= 100 for x in A)}") |
💬 手計算 (Step 2) と Python 出力が完全一致。
SSDSE-B-2026 などの実データを使った最小コード(8行):
1 2 3 4 5 6 7 8 | import pandas as pd # CSV を Excel と同じ感覚で読む df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=1) # ピボット相当 pivot = df.pivot_table(values=df.columns[3], index=df.columns[1], aggfunc='mean') print(pivot.head()) # Excel 出力 df.to_excel('output.xlsx', index=False) |
※ data/raw/SSDSE-B-2026.csv は e-Stat SSDSE から取得した実データを想定。
🎯 このコードでやること:SSDSE-B-2026 を読み込み、 47 都道府県と人口を openpyxl で書式付き Excel ファイル(.xlsx)として出力する。 ヘッダ太字・列幅自動・条件付き書式相当の色付け。
📥 入力データ:SSDSE-B-2026 の Prefecture と A1101 列(2023 年・47 行)。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | import pandas as pd from openpyxl import Workbook from openpyxl.styles import Font, PatternFill df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1]) d = df[df['SSDSE-B-2026'] == 2023][['Prefecture', 'A1101']] wb = Workbook() ws = wb.active ws.title = '47県人口' ws.append(['都道府県', '人口(A1101)']) # ヘッダ太字 for cell in ws[1]: cell.font = Font(bold=True) cell.fill = PatternFill('solid', fgColor='CCE5FF') for _, row in d.iterrows(): ws.append([row['Prefecture'], int(row['A1101'])]) # 500 万超を赤く塗る(条件付き書式相当) for row in ws.iter_rows(min_row=2, max_col=2): if row[1].value > 5000000: row[1].fill = PatternFill('solid', fgColor='FFCCCC') ws.column_dimensions['A'].width = 12 ws.column_dimensions['B'].width = 18 wb.save('ssdse_47ken.xlsx') print('出力完了: ssdse_47ken.xlsx') |
📤 実行結果:
💬 結果の読み方:出力された ssdse_47ken.xlsx を Excel / LibreOffice で開くと、 東京・神奈川・大阪・愛知・埼玉・千葉・兵庫・福岡・北海道の 9 県(500 万人超)が赤くハイライトされる。 これが Excel の「条件付き書式」を Python で自動生成する例。
🎯 このコードでやること:書式が要らないなら pandas.to_excel 1 行で完結。 openpyxl をエンジンに使う。
📥 入力データ:SSDSE-B-2026 全 564 行 × 112 列。
1 2 3 4 5 6 7 8 9 10 | import pandas as pd df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1]) # 複数シートに分けて出力(年度別) with pd.ExcelWriter('ssdse_by_year.xlsx', engine='openpyxl') as w: for year in df['SSDSE-B-2026'].unique(): df[df['SSDSE-B-2026'] == year].to_excel(w, sheet_name=str(year), index=False) print('年度別シートで出力') |
📤 実行結果:
💬 結果の読み方:1 つの CSV を 年度ごとのシートに展開できる。 Excel ファイルは 1 ファイル = 複数シートが標準なので、 階層を持つデータを扱うとき pandas より直感的。 ただし数十万行を超えるとファイルが肥大化するので、 大規模データは Parquet / DuckDB を推奨。
🎯 このコードでやること:xlsxwriter エンジンで 47 都道府県人口の棒グラフを Excel ファイル内に埋め込む。 Excel 上で開くとそのままグラフとして表示される。
📥 入力データ:SSDSE 47 都道府県 + 人口(上位 10 県だけ)。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | import pandas as pd import xlsxwriter df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1]) d = df[df['SSDSE-B-2026'] == 2023].nlargest(10, 'A1101') wb = xlsxwriter.Workbook('top10_chart.xlsx') ws = wb.add_worksheet('Top10') ws.write_row('A1', ['県', '人口']) for i, (_, r) in enumerate(d.iterrows(), start=2): ws.write(f'A{i}', r['Prefecture']) ws.write(f'B{i}', int(r['A1101'])) chart = wb.add_chart({'type': 'bar'}) chart.add_series({'categories': '=Top10!$A$2:$A$11', 'values': '=Top10!$B$2:$B$11', 'name': '人口'}) chart.set_title({'name': '47 県人口 Top10 (2023)'}) ws.insert_chart('D2', chart) wb.close() print('チャート埋め込み Excel 出力') |
📤 実行結果:
💬 結果の読み方:xlsxwriter は Excel の数式・グラフ・条件付き書式までフル機能をサポート。 BI ツール(Power BI, Tableau)を入れずに、 Python だけで配信用レポートを作れる。 一方、 .xlsx を 読み込む ことはできない(openpyxl 担当)。 役割分担が明確。
🎯 このコードでやること:Excel の「ピボットテーブル」と同じ集計を pandas.pivot_table で実行。 都道府県 × 年度クロス集計(人口)を作る。
📥 入力データ:SSDSE-B-2026 の SSDSE-B-2026(年度), Prefecture, A1101(人口)列。 全 564 行。
1 2 3 4 5 6 7 8 9 10 11 12 | import pandas as pd df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1]) # 年度 (列方向) × 都道府県 (行方向) クロス集計 pivot = df.pivot_table(values='A1101', index='Prefecture', columns='SSDSE-B-2026', aggfunc='first') # 上位 5 県だけ表示 print(pivot.nlargest(5, 2023)) |
📤 実行結果(東京・神奈川・大阪・愛知・埼玉、 2020〜2023 年):
💬 結果の読み方:東京は 4 年で +38,000 人増えたが、 他の 4 県は減少傾向。 一極集中の様子が ピボット 1 枚で可視化できる。 Excel ピボットと違い、 すぐ matplotlib で折れ線にしたり .to_excel で出力できる柔軟性が pandas の強み。
🎯 このコードでやること:gspread ライブラリで Google Sheets を Python から操作。 SSDSE-B-2026 の 47 県人口データをクラウドに上書きアップロード。 ブラウザで即共有可能。
📥 入力データ:SSDSE-B-2026 + Google 認証 JSON(事前にサービスアカウント作成)。
1 2 3 4 5 6 7 8 9 10 11 12 | import pandas as pd import gspread df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1]) d = df[df['SSDSE-B-2026'] == 2023][['Prefecture', 'A1101', 'A4101']] gc = gspread.service_account(filename='credentials.json') sh = gc.create('SSDSE 47県') ws = sh.sheet1 ws.update([d.columns.tolist()] + d.values.tolist()) sh.share('user@example.com', perm_type='user', role='reader') print(f'URL: {sh.url}') |
📤 実行結果:
💬 結果の読み方:Python で集計 → 即 Google Sheets で社内共有という、 業務でよくあるフロー。 gspread は OAuth 2.0 認証を自動でハンドルしてくれる。 大量データ(数万行超)は Sheets が遅くなるので、 集計結果だけを書く運用が定石。
🎯 このコードでやること:値ではなく Excel 数式そのものをセルに書き込む。 受け取った担当者が Excel で開くと、 セル内で自動計算される。
📥 入力データ:SSDSE 47 県人口 + 集計セル定義。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | import pandas as pd from openpyxl import Workbook df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1]) d = df[df['SSDSE-B-2026'] == 2023][['Prefecture', 'A1101']] wb = Workbook(); ws = wb.active ws.append(['県', '人口']) for _, r in d.iterrows(): ws.append([r['Prefecture'], int(r['A1101'])]) # 集計セル(数式そのものを書く) ws['D1'] = '全国合計' ws['E1'] = '=SUM(B2:B48)' ws['D2'] = '平均' ws['E2'] = '=AVERAGE(B2:B48)' ws['D3'] = '東京都検索' ws['E3'] = '=VLOOKUP("東京都",A2:B48,2,FALSE)' ws['D4'] = '500万超の県数' ws['E4'] = '=COUNTIF(B2:B48,">5000000")' wb.save('with_formulas.xlsx') print('数式埋め込み完了') |
📤 実行結果:
💬 結果の読み方:Python が CSV を Excel 化するだけでなく、 Excel ユーザーが触っても集計が動的に更新されるテンプレートを作れる。 業務でレポートを毎月配布する場合、 これで「データ部分だけ pandas で更新」「集計部分は Excel 数式で自動」と分業可能。
| シーン | 使い方 |
|---|---|
| 家計簿・個人会計 | 家計簿テンプレ + ピボット + 月別集計。 100 行程度なら Excel が最速。 |
| 学術データ集計 | 実験データの一次集計、 アンケート結果のクロス集計、 SPSS / R へのエクスポート。 |
| 中小企業の業務管理 | 在庫管理、 顧客リスト、 受発注、 シフト管理。 数百行までは Excel で十分。 |
| プロジェクト管理 | ガントチャート、 タスクリスト、 工数管理。 Google Sheets でチーム共有。 |
| 財務モデリング | DCF, NPV, IRR 等のキャッシュフローモデル。 投資銀行・M&A の標準ツール。 |
| ダッシュボード | KPI 表示、 グラフ自動更新、 PowerQuery + PowerPivot で BI ツール並み。 |
| 公的統計のクイック分析 | SSDSE / e-Stat / RESAS の CSV を開いて、 グラフ化 → プレゼン資料へ。 |
| ノーコード開発 | Airtable / Notion DB で「DB+UI」を最短構築。 API も自動生成。 |
スプレッドシート(spreadsheet)は Excel・Google Sheets・LibreOffice Calc が三大実装。 統計データ解析の現場では、 配布元(自治体・公的統計)から .xlsx で届く → pandas で前処理 → 結果を再び .xlsx へ書き戻して関係者に共有、 という往復が日常茶飯だ。 SSDSE-B-2026 の Excel 版を題材に「読み」「書き」「関数の置換」を一気通貫で示す。
このコードでやること:SSDSE-B-2026 の Excel ファイルを読み込み、 都道府県別集計シートを追加し、 計算済セルとして同一ブックに書き戻す。 配布物として渡せる .xlsx を生成する典型タスク。
📥 入力データ (SSDSE-B-2026.xlsx の Sheet1・2023 年):
このコードでやること:SSDSE-B-2026 の Excel ファイルを読み込み、 総人口 (A1101) と 65 歳以上人口 (A1303) から 高齢化率=A1303 ÷ A1101 × 100 を算出した派生列を作り、 summary シートとして同一ブックに書き戻す。 配布物として渡せる .xlsx を生成する典型タスク。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | import os import pandas as pd from openpyxl import load_workbook os.makedirs('out', exist_ok=True) # 保存先が無いと ExcelWriter は失敗する # 同梱しているのは .xlsx ではなく .csv なので、まず CSV を読んで xlsx に書き出し、 # そのうえで read_excel する(read_excel は CSV を読めない) pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', header=None) \ .to_excel('out/SSDSE-B-2026.xlsx', sheet_name='Sheet1', index=False, header=False) df = pd.read_excel('out/SSDSE-B-2026.xlsx', sheet_name='Sheet1', header=0) # 2 行目(日本語の項目名)がデータ行として残るので落とし、数値に直す df = df[df['Code'].astype(str).str.match(r'^R\d{5}$', na=False)].copy() for _c in ['SSDSE-B-2026', 'A1101', 'A1303']: df[_c] = pd.to_numeric(df[_c], errors='coerce') d = df[df['SSDSE-B-2026'] == 2023][['Prefecture', 'A1101', 'A1303']].copy() # 高齢化率=65歳以上人口(A1303) ÷ 総人口(A1101) × 100(派生指標) d['高齢化率'] = (d['A1303'] / d['A1101'] * 100).round(2) with pd.ExcelWriter('out/SSDSE-B-2026_summary.xlsx', engine='openpyxl', mode='w') as w: df.to_excel(w, sheet_name='raw', index=False) d.to_excel(w, sheet_name='summary', index=False) print(d[d['Prefecture'].isin(['秋田県', '東京都', '沖縄県'])]) |
📤 実行結果(高齢化率=A1303÷A1101×100):
💬 高齢化率は生の列そのものではなく A1303(65歳以上人口)÷ A1101(総人口) で算出する派生指標。 実値では秋田県 39.06% と東京都 22.75% の間に約 16 ポイントの開きがあり、 若年層が流入する東京と高齢化の進む秋田の対比が summary シート 1 枚で見える。 関係者には .xlsx の summary シートだけ共有すれば十分。
| Excel / Sheets 関数 | pandas 等価操作 | SSDSE 例 |
|---|---|---|
SUM(B2:B48) | df['A1101'].sum() | 全国総人口 |
AVERAGE(C2:C48) | df['高齢化率'].mean() | 平均高齢化率 |
COUNTIF(C:C, ">30") | (df['高齢化率']>30).sum() | 高齢化率30%超の県数 |
VLOOKUP(key, tbl, 2, FALSE) | df.merge(tbl, on='key') | 地域コード結合 |
XLOOKUP(key, k_col, v_col) | df.merge(...).loc[...] | 同上(新版) |
IF(A>1e6, "大", "小") | np.where(df['A1101']>1e6, '大', '小') | 人口規模分類 |
RANK(B2, B$2:B$48) | df['A1101'].rank(ascending=False) | 人口順位 |
SUMIFS(B:B, C:C, ">30") | df.loc[df['高齢化率']>30, 'A1101'].sum() | 条件付合計 |
PERCENTILE(B:B, 0.9) | df['A1101'].quantile(0.9) | 人口 90 % 分位 |
CORREL(B:B, C:C) | df['A1101'].corr(df['高齢化率']) | 人口と高齢化の相関 |
PIVOT TABLE | df.pivot_table(...) | 地方×指標クロス集計 |
QUERY(範囲, "SELECT ...") (Sheets) | df.query('高齢化率 > 30') | 条件抽出 |
pd.read_csv(..., encoding='cp932') 固定がおすすめdtype={'code': str} で str 固定parse_dates=Falseopenpyxl で unmerge_cells() してから読む本ページの締めとして:スプレッドシートは「最終的な共有形式」として強力だが、 解析の本体は pandas で書き、 結果を .xlsx に書き戻すのが堅牢な進め方。 SSDSE-B-2026 のような公的データを扱うなら、 Excel ↔ pandas のラウンドトリップを当たり前に回せるようになることが、 データサイエンティストの最低ラインだ。
スプレッドシート(spreadsheet)の本質を 1 分で自己診断する設問集。 全 8 問のうち 6 問以上「自信を持って答えられる」状態を、 本ページ修了の基準としよう。 答えがあやふやな問は、 該当するセクション(上のキーワード索引から飛べる)をもう一度読み直すこと。 単に「読んだ」のではなく「使える」レベルに到達したかを試すための練習問題である点に注意してほしい。
ヒント:セルをコピーした時の挙動が決定的に違う。 $A$1 は何が「絶対」で、 A1 は何が「相対」なのか。 SSDSE-B-2026 の表で 47 都道府県分の人口比率を計算するとき、 分母(全国合計)を $B$50 のように絶対化しないと縦コピーで分母セルがズレてしまい、 47 行とも違う分母を使う事故が起きる。 これを「絶対参照を使う」と呼ぶ。 答えは「コピー時に参照先がズレるのが相対、 ズレないのが絶対」。 SSDSE のような縦長データを扱うときは 必ず分母セルを絶対参照に固定するクセを付けよう。
VLOOKUP は 検索列が必ず左端でなければならず、 戻り値の列を「右から数えた整数」で指定する。 一方 XLOOKUP は 検索列と戻り列を別々に指定でき、 左右どちらにも検索可能。 加えて XLOOKUP は完全一致がデフォルトで、 見つからなかった場合のデフォルト値も第 4 引数で指定できる。 SSDSE の地域コード R01000 から都道府県名を引く場面では、 XLOOKUP のほうが安全(VLOOKUP は列順を変えると壊れる)。 答えは「XLOOKUP は検索列の位置を選ばず、 戻り値も列インデックスではなく範囲で指定する」。
行=集計の「縦方向の分類軸」(例:都道府県)、 列=「横方向の分類軸」(例:年度)、 値=集計関数を適用するフィールド(例:人口の合計)、 フィルタ=表示前に絞り込む条件(例:高齢化率 30 % 超の県だけ)。 pandas での pd.pivot_table(df, index='Prefecture', columns='Year', values='A1101', aggfunc='sum') と完全に対応する。 ピボットテーブルは 1 シートで集計を完結させる強力な機能で、 「行=何を比較したいか」「値=何を測りたいか」を先に決めると迷わない。
INDEX/MATCH は (1) 検索列の位置に依存しない、 (2) 列挿入で式が壊れない、 (3) 巨大表でも高速という 3 点で優れる。 数式は =INDEX(返却範囲, MATCH(キー, 検索範囲, 0))。 SSDSE-B のように 3,000 行 × 100 列の規模だと、 VLOOKUP は数列ずれただけで全式が破綻するが INDEX/MATCH なら範囲指定で耐性がある。 現在は XLOOKUP が登場したことで INDEX/MATCH の出番は減ったが、 古い Excel(2019 以前)と共有する場面ではまだ INDEX/MATCH のほうが互換性が高い。
範囲を選択し、 「条件付き書式 → 新しいルール → 数式を使用して書式設定するセルを決定」で =B2>=LARGE($B$2:$B$48,5) と入力、 書式を黄色背景にすればよい。 LARGE 関数の第 2 引数は「上位何番目」を指す(5 なら 5 番目に大きい値以上)。 SSDSE-B-2026 で 東京・神奈川・大阪・愛知・埼玉が一目で浮かび上がる。 条件付き書式は「印刷物にする前の最終チェック」「外れ値の早期発見」に強力で、 Python の matplotlib に頼らずとも視覚化できる手段として覚えておきたい。
CSV=純粋データ・互換性最強・1 シートのみ、 XLSX=書式・式・複数シート・グラフ保存可能・サイズはやや大。 SSDSE-B-2026 では .csv と .xlsx の両方が配布されているが、 解析(pandas 読み込み)目的なら CSV が高速で扱いやすく、 配布物(関係者へ共有)として書式付きで渡したいときは XLSX を選ぶ。 また Git に含めるなら CSV(diff 可能)、 GUI で見せたいなら XLSX、 が現代的なベストプラクティス。 ただし CSV は文字コード(UTF-8 vs cp932)で文字化けが起きやすい点に注意。
groupby はどちらが速い?行数が 10 万行を超えるあたりから pandas が圧勝する。 Excel のピボットテーブルは UI 操作で楽だが、 内部で全行をメモリに展開するため、 100 万行レベルでは固まることが多い(理論最大 104 万行)。 一方 pandas は数千万行でも数秒で groupby + agg が回る。 SSDSE-B-2026 規模(数千行)ならどちらでも瞬時だが、 POS データ・センサーデータ・ログなどの大規模データを扱うなら最初から pandas を選ぶべき。 Excel は「最後の共有形式」、 pandas は「解析の本体」と分業するのが鉄則。
(1) 原データシートと加工シートを分離する(生データは絶対に手で書き換えない)。 (2) すべての計算を式で行い、 数値ベタ書きを禁止する(途中の値が手で書き換わると検証不能)。 (3) Git で .xlsx を管理するか、 pandas スクリプトで再生成できる状態を保つ(人が見られる形+機械が読める形の両方を持つ)。 SSDSE-B-2026 を Excel で集計するなら、 上記 3 点を満たすシート設計こそが「研究」として通用する最低ラインだ。 「式を消して値貼り付け」は速度のため一見便利だが、 再現性を破壊する最大の罠と覚えておこう。
8 問中 6 問以上「はい」と答えられれば、 スプレッドシートを「使える」レベルだ。 4 問以下なら、 上の 🐍 補足セクション(Excel × pandas 連携)と 🔬 数式を言葉で読み解くセクションに戻って復習しよう。
スプレッドシートで作るグラフは、 関係者への 第一印象を決める。 ここでは SSDSE-B-2026 の都道府県データを題材に、 散布図・ヒストグラム・箱ひげ図の 3 種類を、 pandas で生成した結果として示す。 Excel/Sheets でも同様のグラフは「挿入 → グラフ」から作れるが、 pandas で生成しておけば 同じスクリプトで何度でも再現可能になる点が決定的に違う。
SSDSE-B-2026 で X 軸=総人口 (A1101)、 Y 軸=出生数 (A4101) をプロットすると、 強い正の相関(r ≒ 0.99)が見える。 スプレッドシートの「散布図」グラフでも同じ可視化は可能だが、 外れ値(東京)を強調したり、 回帰直線を重ねるには matplotlib のほうが柔軟。 ただし最初の探索段階では、 Excel のドラッグ操作で範囲指定 → 挿入 → 散布図 の 3 ステップでサッと描けるのが強み。 ピボットテーブルの結果をすぐに視覚化できるのは、 Excel の最大の優位性の 1 つだ。

図 1: SSDSE-B-2026 都道府県データの散布図例。 強い正の相関と外れ値の存在が一目で分かる。
高齢化率(A1303/A1101×100)のヒストグラムは、 30 % 付近を中心にやや右に裾を引く分布になる。 スプレッドシートでヒストグラムを作るには =FREQUENCY(データ範囲, ビン範囲) 関数を配列数式として使うか、 「データ → データ分析 → ヒストグラム」(分析ツールアドイン)を有効化する。 ただし pandas で df['高齢化率'].hist(bins=20)(高齢化率=A1303/A1101×100)を 1 行書く方が圧倒的に速い。 ヒストグラムから読み取れるのは「平均周辺に集まっているか」「外れ値があるか」「分布が歪んでいるか」の 3 点。 SSDSE では 35 % 超の超高齢県が右端にいくつかあり、 これが平均を引き上げる要因になっている。

図 2: ヒストグラム例。 中央集中と右裾の長さが視覚的に把握できる。
8 地方ブロック(北海道・東北・関東・中部・近畿・中国・四国・九州沖縄)別に高齢化率の箱ひげ図を描くと、 東北・四国の中央値が高く、 関東の中央値が低いことが一目瞭然になる。 スプレッドシートで箱ひげ図を描く際は、 5 数要約(最小・第 1 四分位・中央値・第 3 四分位・最大)を QUARTILE.INC で計算してから「箱ひげ図」グラフ(Excel 2016 以降)で挿入する。 pandas なら df.boxplot(column='高齢化率', by='Region') 一発。 箱ひげ図は「グループ間の 分散の違い」を比較するのに最適で、 平均だけでは見えない「ばらつきの差」を可視化できる。

図 3: 箱ひげ図例。 地方ごとの中央値とばらつきの違いを一覧できる。
スプレッドシートは「とりあえずデータを入れる箱」ではなく、 役割ごとに最適な使い方がある。 ここでは、 データサイエンス/統計実務で実際に頻出する 5 シナリオを、 SSDSE-B-2026 等の公的データに即して紹介する。 各シナリオでは「なぜスプレッドシートが最適か」「pandas との分業はどうするか」を明示している。
経営層・自治体に出す月次レポートでは、 毎月レイアウトが固定される。 1 シート目に表紙、 2 シート目に集計表、 3 シート目にグラフ、 4 シート目に元データ……というテンプレを作っておき、 毎月「元データシートだけ差し替える」運用にする。 集計表とグラフは自動更新されるため、 作業時間が初月の 1/10に減る。 SSDSE-B-2026 のように毎年度更新されるデータでは、 このテンプレ化が再現性と効率を両立させる王道。 pandas でデータ前処理 → openpyxl でテンプレ .xlsx の元データシートだけ上書き → 完成、 という半自動化が現代的なベストプラクティス。
アンケート集計は Likert 5 段階(強く反対〜強く賛成)のクロス集計が定番。 スプレッドシートなら COUNTIFS 一発で「年代 × 賛否」の人数表が作れる。 例:=COUNTIFS(年代列, "30 代", 賛否列, "賛成")。 結果を 100 % 積み上げ棒グラフにすれば、 世代間の意識差が視覚化される。 pandas でも pd.crosstab(df['age'], df['answer'], normalize='index') で同じことができるが、 関係者に「式を見せる」必要がある場面では Excel のほうが透明性が高い。 アンケート分析は「結果を非エンジニアと議論する」工程が長いため、 スプレッドシートが本領を発揮する。
経理・会計の現場で必須の「予算 vs 実績」管理は、 条件付き書式で差分セルを赤く塗るのが定番。 数式は =IF(実績>予算, 実績-予算, "") で超過額を表示し、 条件付き書式で「正の数なら赤背景」を設定。 1 ヶ月分を 1 行にまとめれば、 1 シートで 1 年分の進捗が把握できる。 自治体予算(SSDSE 等で都道府県歳出データを公開)に同じ手法を適用すれば、 「東京は教育費が予算超過、 北海道は土木費が未達」といった俯瞰分析がすぐにできる。 pandas でも同じ計算は可能だが、 毎月手で更新するワークフローでは Excel の操作性が圧勝。
中小企業の在庫管理では、 商品マスタ × 在庫数 × 発注点の 3 表を VLOOKUP / XLOOKUP で結合し、 「在庫 < 発注点」のセルを赤く塗って発注タイミングを自動通知する。 需要予測には FORECAST.LINEAR 関数で過去 12 ヶ月の販売実績から線形外挿。 高度な予測(ARIMA, Prophet)が必要なら pandas + statsmodels に移すが、 「明日発注すべきか」の即時判断には Excel のシンプルさが優る。 自治体の物資備蓄管理(災害対応)にも同じパターンが使え、 SSDSE 関連の地域指標と組み合わせれば「人口当たり備蓄量」を簡単に評価できる。
学術論文に載せる「記述統計量の一覧表」「相関行列」は、 pandas で計算 → DataFrame.to_excel → Excel で書式整形 → コピーして Word に貼り付けが黄金パターン。 pandas の df.describe().round(2).to_excel('table1.xlsx') だけで第 1 表の素材が揃う。 Excel 側では「太字で見出し」「桁区切り」「セル罫線」を整え、 Word に「拡張メタファイル」として貼ると印刷時にもキレイに残る。 SSDSE-B-2026 を題材にした卒論/修論でも、 「全 47 都道府県の主要指標一覧(平均・標準偏差・最小・最大)」は必ず 1 表として求められるため、 この技は早い段階で身につけたい。
統計データ解析の現場で 毎週使う関数を、 用途別に 30 件厳選した。 pandas 等価表現も併記しているので、 「Excel で覚えた式を pandas に翻訳する」「pandas で書いた処理を Excel で再現する」両方向の辞書として使える。 SSDSE-B-2026 の都道府県データで実際に動かしてみると、 関数 1 つの理解が深まる。
| Excel 関数 | 用途 | pandas 等価 |
|---|---|---|
SUM(A2:A48) | 合計 | df['A1101'].sum() |
AVERAGE(A2:A48) | 平均 | df['A1101'].mean() |
MEDIAN(A2:A48) | 中央値 | df['A1101'].median() |
MODE.SNGL(A2:A48) | 最頻値 | df['A1101'].mode() |
STDEV.S(A2:A48) | 標本標準偏差 | df['A1101'].std() |
VAR.S(A2:A48) | 標本分散 | df['A1101'].var() |
MIN(A2:A48) | 最小 | df['A1101'].min() |
MAX(A2:A48) | 最大 | df['A1101'].max() |
COUNT(A2:A48) | 数値セル数 | df['A1101'].count() |
COUNTA(A2:A48) | 空でないセル数 | df['A1101'].notna().sum() |
| Excel 関数 | 用途 | pandas 等価 |
|---|---|---|
SUMIF(範囲, 条件, 合計範囲) | 条件付き合計 | df.loc[条件, 列].sum() |
SUMIFS(合計範囲, 範囲 1, 条件 1, ...) | 複数条件合計 | df.loc[条件 1 & 条件 2, 列].sum() |
COUNTIF(範囲, 条件) | 条件付きカウント | (条件).sum() |
COUNTIFS(範囲 1, 条件 1, ...) | 複数条件カウント | (条件 1 & 条件 2).sum() |
AVERAGEIF(範囲, 条件, 平均範囲) | 条件付き平均 | df.loc[条件, 列].mean() |
MAXIFS(最大範囲, 範囲 1, 条件 1) | 条件付き最大 | df.loc[条件, 列].max() |
MINIFS(最小範囲, 範囲 1, 条件 1) | 条件付き最小 | df.loc[条件, 列].min() |
IF(条件, 真, 偽) | 条件分岐 | np.where(条件, 真, 偽) |
IFS(条件 1, 値 1, ...) | 複数条件分岐 | np.select([条件 1,...], [値 1,...]) |
SWITCH(値, 候補 1, 結果 1, ...) | 値マッピング | df['col'].map({...}) |
| Excel 関数 | 用途 | pandas 等価 |
|---|---|---|
VLOOKUP(キー, 表, 列番号, FALSE) | 表の検索 | df.merge(tbl, on='key') |
XLOOKUP(キー, 検索列, 戻り列) | 新版検索(柔軟) | df.merge(...).loc[...] |
INDEX(範囲, 行, 列) | 位置指定取得 | df.iloc[行, 列] |
MATCH(キー, 範囲, 0) | 位置検索 | df['col'].tolist().index(key) |
RANK.EQ(値, 範囲) | 順位 | df['col'].rank(method='min') |
PERCENTILE.INC(範囲, 0.95) | 分位点 | df['col'].quantile(0.95) |
QUARTILE.INC(範囲, 1) | 四分位 | df['col'].quantile(0.25) |
CORREL(範囲 1, 範囲 2) | 相関係数 | df['x'].corr(df['y']) |
SLOPE(Y 範囲, X 範囲) | 回帰の傾き | np.polyfit(x, y, 1)[0] |
FORECAST.LINEAR(x, Y 範囲, X 範囲) | 線形外挿 | np.polyval(np.polyfit(x,y,1), 新 x) |
上記 30 関数を SSDSE-B-2026 の都道府県データで実際に動かしてみると、 「Excel で済むこと」と「pandas でないとつらいこと」の境界線がはっきり見える。 一般に、 47 行(都道府県数)×数十列程度なら Excel が早く、 数万行を超えたら pandas が圧倒的に楽になる。 解析の規模に応じてツールを使い分けることが、 データサイエンティストとしての成熟度を測る 1 つの基準。
スプレッドシートは学習曲線が緩やかな半面、 「奥が深い」ことに気づかないまま使い続ける人が多い。 ここでは 3 段階の到達目標を示し、 自分が今どこにいるかを把握できるようにする。
このレベルを達成すれば、 学校・職場でほとんどの集計タスクをこなせる。 卒論・修論の素データ整理にも十分。
企業の経営企画・経理・マーケティング部門で必要とされるレベル。 月次レポートを自作できる。
データサイエンティスト・データエンジニアとして要求されるレベル。 月次レポートの 90 % を自動化し、 人間は判断と説明だけに集中できる状態。
レベル 1 → 2 で停滞する人の最大の原因は、 「ピボットテーブルを食わず嫌い」すること。 一度作り方を覚えれば数倍速くなる集計が、 「数式で頑張る」癖から抜けられない。 まずは SSDSE-B-2026 の 47 都道府県データで 「行=地方ブロック、 列=指標、 値=合計/平均」を 1 つ作るところから始めよう。 レベル 2 → 3 で停滞する人は、 「VBA は怖い、 Python は無理」という思い込みが多い。 マクロ記録で 5 分のルーチンを自動化してみると、 「自分でも書ける」と気づける。 Python は pandas.read_excel 1 行から始めれば、 1 週間で実用レベルに到達できる。
スプレッドシートは 1979 年の VisiCalcから始まり、 「電卓と紙の表」を一気にデジタルへ置き換えた革命的なツールだった。 Apple II の販売を爆発させ、 個人向けコンピューターを「業務用機」として定着させた最大の功労者として知られる。 当時のキラーアプリ第 1 号は、 まさにスプレッドシートだったのだ。
| 年 | 出来事 | 業界へのインパクト |
|---|---|---|
| 1979 | VisiCalc 発売(Apple II 用) | 「電卓 + 紙の表」をデジタル化、 世界最初のキラーアプリ |
| 1983 | Lotus 1-2-3 発売 | IBM PC 標準、 80 年代を支配 |
| 1985 | Microsoft Excel 1.0 発売(Mac 版) | GUI ベースの新世代、 Mac から始まる |
| 1987 | Excel 2.0 (Windows 版) | Windows ブームに乗り Lotus を急速に逆転 |
| 1993 | Excel 5.0、 VBA を内蔵 | 業務自動化の本格化 |
| 2006 | Google Sheets 公開(Writely 買収) | クラウド・同時編集の時代へ |
| 2007 | Excel 2007 で .xlsx 形式採用 | OOXML 標準化、 行数上限 104 万行へ拡大 |
| 2016 | Power Query / Power Pivot 標準搭載 | セルフ BI への足がかり |
| 2020 | XLOOKUP / 動的配列関数公開 | VLOOKUP 時代の終焉 |
| 2023 | Copilot in Excel(生成 AI 統合) | 自然言語でピボット・グラフ生成 |
2026 年現在、 スプレッドシートは「終わった技術」どころか むしろ重要性を増している。 理由は 3 つ:
公的統計(e-Stat、 SSDSE、 自治体オープンデータ)の多くは Excel 形式(.xlsx)で配布される。 これは「政策担当者・市民の誰もが開ける」必要があるため、 「最大公約数のフォーマット」として Excel が選ばれているからだ。 pandas 全盛の時代でも、 「データを最初に開く窓」はスプレッドシート、 という前提は変わらない。 統計データ解析を学ぶなら、 Excel を「過去の技術」と切り捨てず、 pandas との分業相手として活用し続けるのが正解。
本セクションでは、 SSDSE-B-2026 と類似する 「自治体公開データを使った政策分析」の典型ワークフローを、 7 ステップで紹介する。 大学のレポート、 卒論、 自治体インターンの実務、 いずれの場面でも応用できる王道パターンだ。
SSDSE-B-2026 は .xlsx と .csv の両方が配布される。 「とりあえず Excel で開いて中身を眺める」が初手。 シート構成、 列名、 文字コード、 欠損値の表記("-" や "..." など)を確認する。 統計局のデータは「-(半角)」で欠損を示すことが多く、 pandas に渡すときは na_values=['-', '...'] を指定するのが定石。 この段階を飛ばすと、 後段のすべての解析が暗黙の欠損値で破綻する。
Excel のオートフィルタで 各列のユニーク値を見る、 ピボットテーブルで 地方ブロック × 指標のクロスを取る、 散布図を 2-3 枚作って 主要 2 変数の関係を把握する。 ここで「何を分析したいか」の仮説を 3 つ書き出す。 例:「① 人口と出生数は強く相関するが、 ② 高齢化率と合計特殊出生率には逆相関がある、 ③ 東京・沖縄は両方で外れ値である」。
EDA の結果を踏まえ、 pandas に移行して本格的な前処理を行う。 欠損補完、 型変換、 列名の正規化、 外れ値の判定、 単位の統一など。 df.assign(...).pipe(clean_fn).dropna() のチェイン処理で 1 シートを 1 段落のコードにまとめると、 再現性が一気に上がる。 結果は processed.csv として保存し、 元データには 絶対に上書きしないのが鉄則。
仮説検証のため、 相関係数、 回帰分析、 t 検定などを scipy.stats / statsmodels で実行。 EDA で見えた「人口と総生産」の相関を Pearson と Spearman の両方で確認し、 95 % 信頼区間も併記する。 「相関係数 0.97、 p<0.001、 95 % CI [0.95, 0.99]」のように 3 点セットで報告するのが標準。 結果を .xlsx の「結果」シートに書き戻し、 後の Step 6 で活用する。
論文・レポート用の図は matplotlib で作り、 .png や .pdf で出力。 Excel のグラフは「探索段階」用、 matplotlib のグラフは「最終成果物」用、 と使い分けるのが現代の標準。 Excel のグラフは Word に貼り付けると印刷時に粗くなりやすいが、 matplotlib の PDF はベクター形式なので拡大しても綺麗。 タイトル・軸ラベル・凡例・出典の 4 点セットを必ず入れる。
関係者向けの月次レポートテンプレ(.xlsx)の元データシートだけを openpyxl で上書きし、 集計表・グラフは自動更新。 PDF として出力して関係者にメール送信、 という最後の 1 マイルをスクリプト化すれば、 月次の定型業務が 1 コマンドで完了する。 SSDSE-B-2026 のように毎年度更新されるデータでも、 この仕組みがあれば年度切替時の作業負荷がゼロに近づく。
仕上がったレポートを Google Sheets にアップロードし、 関係者にコメントで議論してもらう。 「この相関は因果関係を示すのか?」「外れ値の東京を除いた解析もほしい」といったフィードバックが集まれば、 Step 3-5 を回して反映。 スプレッドシートの 「同時編集 + コメント」機能は、 統計分析のコミュニケーション基盤として今や欠かせない存在になっている。
このパイプラインの本質:Excel と pandas は 競合ではなく分業する関係。 Excel で「眺める/共有する」、 pandas で「処理する/再現する」と役割を切り分けると、 統計データ解析の生産性が桁違いに上がる。 SSDSE-B-2026 のような公的データを扱う授業・卒論・研究なら、 上記 7 ステップをそのまま雛形として活用できる。
スプレッドシートには明確な「スケール限界」がある。 これを知らずに使うと、 ある日突然「ファイルが開けない」「保存に 30 分かかる」「Excel がクラッシュする」といった事故が起きる。 SSDSE-B-2026 規模(数千行)なら問題ないが、 POS データ・センサーログ・SNS データ等の大規模データを扱うなら、 早めに pandas / DuckDB / BigQuery への移行を計画したい。
この上限はあくまで「理論最大」で、 実用上は 10 万行を超えると体感的に重くなる。 ピボットテーブルや条件付き書式を多用すると、 さらに早く詰まる。 Google Sheets は 1 000 万セルが上限で、 Excel より厳しい。 大規模データには pandas 一択。
| データ規模 | Excel 適性 | 推奨ツール |
|---|---|---|
| 47 行×数十列(SSDSE-B 都道府県年次) | ◎ 最適 | Excel / Sheets |
| 3 万行×数百列(SSDSE-A 市区町村パネル) | ○ 可だが遅延 | Excel + pandas 併用 |
| 数十万行(家計調査の月次明細) | △ 重い、 ピボット困難 | pandas 主、 Excel は確認用 |
| 100 万行超(POS, センサー) | × 非推奨 | pandas / DuckDB / BigQuery |
大規模データを Excel で扱うなら Power Query で事前集計するのが最強の戦術。 元データ(数百万行)は外部 CSV や DB に置き、 Power Query で「都道府県別合計」「年度別平均」など 数十〜数百行に縮約してから Excel シートに読み込む。 これなら 1 億行のデータも実用速度で扱える。 pandas を覚えなくても 「マウス操作のみ」で SQL 相当の処理ができるのが Power Query の強み。 SSDSE-A(市区町村パネル)レベルなら、 Power Query で十分対応できる。
統計データ解析で 「再現性」「共有性」「保守性」を担保するための実務的チェックリスト。 SSDSE-B-2026 で都道府県分析をする場合も、 卒論・修論のデータ整理でも、 そのまま適用できる原則集。
$B$50 のように $ で固定。 縦コピー時の事故を防ぐ。population のような名前を付けると、 式の可読性が劇的に上がる。上記 12 か条を満たすブックは、 「3 年後の自分」「他部署の同僚」「論文の査読者」の誰が見ても再現できる。 これが研究・実務で要求される「再現可能性(reproducibility)」の最低ラインだ。 スプレッドシートを「とりあえずデータ置き場」として使うのは、 短期的には便利だが長期的に必ず破綻する。 最初から「壊れないブック」を設計する習慣を付けよう。
スプレッドシート製品は群雄割拠だが、 統計データ解析の文脈では 4 つを押さえれば十分。 それぞれ「向く場面」「避けるべき場面」が明確に異なる。 ここでは SSDSE-B-2026 のような公的統計を扱う観点から、 比較表と用途別推奨を示す。
| 製品 | 価格 | 最大行数 | 同時編集 | VBA/マクロ | 推奨用途 |
|---|---|---|---|---|---|
| Microsoft Excel | 月額 (M365) | 104 万行 | ○ (M365) | ◎ VBA | 大規模・自動化・業務標準 |
| Google Sheets | 無料 / Workspace | 1000 万セル | ◎ クラウド最強 | ○ Apps Script | 共同編集・軽量・教育 |
| Apple Numbers | 無料 (Mac/iOS) | 数万行程度 | ○ iCloud | × なし | プレゼン用美麗な表 |
| LibreOffice Calc | 完全無料 OSS | 104 万行 | △ (Collabora) | ○ Basic | 予算ゼロ・互換性重視 |
SSDSE-B-2026 のような 公的データを扱う授業・研究では、 「Google Sheets で共同編集 → pandas で本格分析 → Excel で配布物作成」の三段運用が現代の最適解。 1 つのツールに固執せず、 場面ごとに最適なものを使い分けるのがプロの所作。 そして、 どのツールを使うときも「データ自体は CSV/JSON」「分析コードは Python」「最終共有は PDF」という 3 層構造を守ることが、 長期的な再現性を担保する。 スプレッドシートはあくまで 「人間が直感的に触れる中間層」として位置づけるのが、 21 世紀のデータサイエンスの作法である。
=0.1+0.2 は 0.3000000000000000444。 通貨計算では ROUND 関数で明示的に丸める。.xls は 65,536 行で停止。 新 .xlsx は約 100 万行(1,048,576 行)。 ログデータでは すぐオーバー。 pandas / Parquet / DuckDB へ移行。.xlsm は無効化されるのが既定。 メール添付では Emotet 等のマルウェア感染源になる。 共有時は .xlsx に変換するか、 マクロを別ファイル化。cp932 (Shift_JIS) エンコーディングのことが多い。 Excel で開くと文字化けしないが、 Python で encoding='utf-8' で読むと UnicodeDecodeError。 encoding='cp932' 必須。MARCH1 が 2024-03-01 に化けてバイオ論文を汚染した有名事件。 SSDSE 都道府県コード R01000 等も Excel が日付と誤認することがある。 列タイプを「テキスト」に固定。 スプレッドシート(表計算)
│
┌──────────────────────┼──────────────────────┐
│ │ │
① ファイル形式 ② 機能 ③ 連携先
├ CSV ├ 数式(=SUM, =VLOOKUP) ├ pandas (Python)
├ XLSX ├ ピボットテーブル ├ R (read_excel)
├ XLS (旧) ├ グラフ ├ SQL (BI ツール)
├ ODS ├ 条件付き書式 ├ Google Apps Script
└ Google Sheets ├ マクロ (VBA) ├ Power Query/Pivot
└ PowerQuery └ API (gspread)
④ 限界 → 数百万行・複雑ロジック・再現性
├ pandas / SQL / DuckDB へ移行
└ ETL ツール / dbt / BI へ昇格
utf-8 で読んだ場合。 encoding='cp932' を試す。=ISNUMBER(A1) でチェック → =VALUE(A1) で数値変換。=XLOOKUP または =INDEX-MATCH。「スプレッドシート」は 非エンジニアが直接データを扱える表計算ツール として、 上流のデータ入手と下流の Pandas/SQL 解析の中間に位置する。 100 万行を超えると性能限界に達するため、 DuckDB や BigQuery への移行判断軸を持つことが実務上の鍵となる。
スプレッドシートは「表 → ピボット → グラフ」の最短ルートで、 CSV/pandas/SQL/BI と連携しつつ、 VLOOKUP・VBA を組み合わせると小規模なら DB に近い役割を担える。
「表計算ソフト」を使うかは、 データ量・再現性・共同編集の必要性で判断する。
SSDSE-B-2026 は 47 行で Excel でも開けるが、 列が多く分析の再現性を重視するなら pandas へ移行するのが良い。 表計算は探索的可視化のスケッチに向く。
※ 本セクションは既存の解説を壊さず追記したまとめ。 数値は data/raw/SSDSE-B-2026.csv(encoding='cp932', skiprows=[1])の実測のみを用い、 合成例には「架空」と明記する。
スプレッドシートの直感は 3 語で言える:格子・数式・自動再計算。 二次元の升目(セル)に、 値だけでなく数式を書ける。 数式は依存元を名前(A1)で指すので、 依存元が変われば下流が勝手に更新される(反応的計算)。 GUI 上でドラッグして集計し、 数クリックでグラフ化できるため、 身近な「最初のデータ分析ツール」として Excel / Google Sheets が世界標準になった。
実データで言うと、 SSDSE-B-2026 は実測で 564 行 × 112 列(12 年 × 47 都道府県、 うち数値列 110・非数値列 2)。 この規模なら表計算で開いて眺め、 =B2/A2*100 のような 1 行の数式を 47 件ぶんコピーするだけで「高齢化率」列が一気に埋まる。 表形式データを「見て・触って・集計する」体験の入口として、 これ以上手軽な道具はない。
表計算の弱点は機能ではなく構造に由来する。 セルを自由に手編集できる柔軟さが、 そのまま再現性・監査性の欠如につながる。 主要な罠を整理する。
.xlsx はバイナリで git diff が読めないため、 誰がいつ何を変えたか追えない。 対策は「原データは CSV をマスタにし、 加工はスクリプトで再生成」。AVERAGE の範囲が数か国ぶん抜けた Excel の選択範囲ミスが後に発覚し、 結論の一部が訂正された。 セル参照の 1 マスのずれが政策論争を左右し得る、 という表計算の脆さの象徴。#REF! / #N/A / #DIV/0! は下流の全数式に連鎖する。 1 か所の参照崩れが合計・グラフまで汚染する。 IFERROR で握りつぶすとエラーを隠すだけになり、 かえって監査を難しくする。2-3 → 2月3日、 遺伝子記号 MARCH1 / SEPT2 が日付化した事例は、 遺伝学のガイドライン改名(2020)に至った実害。 SSDSE の Code 列は実測で R01000 のような英字始まりのコード(→ 型変換で文字列固定推奨)。 頭ゼロコードや日付風の文字列は、 読み込み時に列を「文字列」に固定して守る。#循環参照!)。 「合計セルを合計に含める」ミスが典型で、 セル依存グラフ(DAG)に閉路ができた状態。 上の 🎮 ミニ表計算の「循環参照を試す」ボタンで挙動を体感できる。落とし穴の多くは「手作業を減らし、 手順をコード化する」ことで消える。 表計算に留まる場合でも、 段階的に堅牢化できる。
| 発展の方向 | 何が解決するか |
|---|---|
| ピボットテーブル | 手書き SUMIFS の羅列を、 ドラッグ&ドロップのクロス集計に置換。 集計ロジックの見通しが良くなる。 |
| 関数・マクロ(VBA / Apps Script) | 反復作業を自動化。 ただしマクロはブラックボックス化しやすいので、 コメントと版管理が前提。 |
| データ検証(入力規則) | セルの入力規則で型・範囲・リストを制限し、 手入力ミスを入口で防ぐ。 整然データの維持に効く。 |
| Power Query | 取り込み〜整形を「記録された手順」として保持。 元データ差し替えで再実行でき、 GUI のまま再現性を確保。 |
| pandas への移行(スクリプト化) | 分析本体をコードにし、 再現性を根本担保。 大規模・自動化・多人数編集の全てに耐える。 |
実務の定石は分業だ。 「表計算で眺める/共有する」「pandas で処理する/再現する」。 SSDSE-B-2026 のような公的データなら、 CSV をマスタに置き、 集計は ピボット/pandas、 配布は書式付き .xlsx、 という三層で回すと、 手軽さと再現性を両立できる。 表計算は「捨てる技術」ではなく、 限界を知ったうえで最適な層に置く道具である。
表形式データ ・ CSV ・ pandas ・ ピボットテーブル ・ Power Query ・ データクレンジング ・ 整然データ ・ 型変換 ・ 再現性の危機 ・ SQL ・ ビッグデータ