目的に応じてデータを集めるプロセス
データを「分析・モデリングに使える形に整える」工程。 分析の質はここで 8 割決まります。
本ページでは データ収集 を、 定義・前提条件・使い方・落とし穴の順に整理して解説します。 厳密な定義より、 まず何を、 いつ、 どう使うかを理解することを優先してください。
目的に応じてデータを集めるプロセス
英語名 Data Collection。
この用語を理解・使用するときは、 次のような前提を意識してください:
SSDSE-B-2026 のような公的統計データを Python で扱う際の基本パターン:
1 2 3 4 5 6 7 8 9 10 11 12 | import pandas as pd import numpy as np # データ読み込み df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='utf-8', skiprows=1) print(df.shape) print(df.dtypes) print(df.describe()) # 「データ収集」の文脈で扱う場合の例: # 分野: データエンジニアリング # 関連手法は同カテゴリの他用語を参照してください。 |
具体的なコードは データエンジニアリング を参照してください。
分析結果を報告するときに含めるべき情報:
データ収集 ── 分析・予測・意思決定のために、 目的に応じてデータを系統的に取得するプロセスの総称。 「どのデータを、 どこから、 どう、 どれだけ集めるか」を設計する活動。
データ収集はデータ分析パイプラインの最上流。 ここでの選択が、 下流すべて(前処理、モデリング、結論)の品質を決定づけます。 「Garbage In, Garbage Out」── 入口に何を入れるかが、 出口の質を支配します。
統計学では 標本理論 として、 計算機科学では ETL/ELT として、 ビジネスでは 市場調査 として、 異なる伝統で発展してきました。 本ページは横断的に概観します。
「日本人の平均的な朝食」を調べる、 という課題を例に:
違いは「母集団を代表するか」「欠落しがちな声をどう拾うか」の意識。 これがデータ収集設計のすべてです。
| 分類 | 代表例 | コスト | 代表性 | 速報性 |
|---|---|---|---|---|
| 公的統計 | e-Stat, SSDSE, 国勢調査 | 無料 | 高(悉皆/確率標本) | 低(年次) |
| 商用パネル | マクロミル, Nielsen | 高 | 中(自社の標本) | 中 |
| IoT/センサー | スマートメーター, ウェアラブル | 機器コスト+通信 | 中(設置箇所依存) | 高(リアルタイム) |
| Web/API | REST API, GraphQL | 無料〜中 | 提供者次第 | 高 |
| スクレイピング | requests + BeautifulSoup | 無料(規約遵守) | 低〜中 | 中 |
| アンケート | Google Forms, Qualtrics | 中 | 設計次第 | 中 |
| SNS | X, Reddit API | 無料〜高 | 低 | 高 |
| トランザクション | POS、 ECサイト | 自社なら無料 | 顧客のみ | 高 |
| 行政オープン | 政府CIO, RESAS | 無料 | 高 | 低〜中 |
「何件集めれば足りるか?」を決める基本式(比率推定の場合):
$$ n = \frac{z^2 \cdot p (1-p)}{e^2} $$
$z$=信頼水準に対応する標準正規分位(95% なら 1.96)、 $p$=母比率の事前推定値(不明なら 0.5)、 $e$=許容誤差。 例えば「±3% で 95% 信頼」なら $n = 1.96^2 \cdot 0.25 / 0.03^2 \approx 1067$ 件。 全国意識調査の標本数 1000〜2000 件はこの式で説明できます。
層別抽出・多段抽出ならさらに少なくて済むこともあるし、 小集団分析(部分集合のみで結論)なら逆に多く必要。 平均推定の場合は分散 $\sigma^2$ を使った別式:$n = z^2 \sigma^2 / e^2$。
| 手法 | 説明 | 向く場面 |
|---|---|---|
| 単純無作為抽出 | 名簿から完全ランダム | 母集団リストがある |
| 層別抽出 | グループ別の比率を保つ | 分散が大きく異なる層 |
| 系統抽出 | k 件おきに抽出 | 名簿が並んでいる |
| クラスター抽出 | 地域単位など群で抽出 | 広域調査でコスト削減 |
| 便宜抽出 | 取りやすい人を抽出 | 予備調査のみ |
(1) e-Stat API から都道府県別人口を取得:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | import requests import pandas as pd # e-Stat の API キー(無料登録) APP_ID = 'YOUR_APP_ID' # 人口推計の統計表 ID params = { 'appId': APP_ID, 'statsDataId': '0003448237', # 例: 都道府県別人口 'limit': 100 } res = requests.get('https://api.e-stat.go.jp/rest/3.0/app/json/getStatsData', params=params).json() # 整形して DataFrame に values = res['GET_STATS_DATA']['STATISTICAL_DATA']['DATA_INF']['VALUE'] df = pd.DataFrame(values) print(df.head()) |
(2) SSDSE-B のCSVを取得(オフライン):
1 2 3 4 5 6 7 | import pandas as pd df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='utf-8', skiprows=1) print('取得行数:', len(df)) print('期間:', df['年度'].min(), '〜', df['年度'].max()) print('変数数:', df.shape[1]) print('欠損のある変数:', df.columns[df.isna().any()].tolist()) |
(3) サンプルサイズ計算:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | import math from scipy.stats import norm def sample_size_proportion(confidence=0.95, margin=0.03, p=0.5): z = norm.ppf(1 - (1 - confidence) / 2) return math.ceil(z**2 * p * (1 - p) / margin**2) # 95% 信頼、 ±3% 誤差 print(sample_size_proportion()) # 1068 # 有限母集団補正 def fpc(n, N): return math.ceil(n * N / (n + N - 1)) print(fpc(1068, 10000)) # 母集団1万人なら 906 で十分 |
(4) 倫理的な Web スクレイピング:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | import requests import time from urllib.robotparser import RobotFileParser url = 'https://example.com' rp = RobotFileParser() rp.set_url(url + '/robots.txt') rp.read() if not rp.can_fetch('*', url): raise PermissionError('robots.txt で禁止') # レート制限を必ず守る for page in range(1, 11): res = requests.get(f'{url}?page={page}', headers={'User-Agent': 'research-bot v0.1 (mailto:me@example.com)'}) # ... パース処理 time.sleep(2.0) # 1 秒/req より遅く |
研究や本番運用では、 取得を毎回手動で行うとミスや再現性問題が起きます。 「同じ手順で 1 年後も実行できる」ことが品質の条件であり、 主要なワークフローツールを使うのが定番:
どれを選んでも、 「コードで取得手順を表現」「失敗時のリトライ」「ログ・メトリクス」「依存関係の可視化」が満たせれば OK。 学術研究では Snakemake / Nextflow が研究室で標準化されており、 解析全体を 1 コマンドで再実行できる構成が理想です。
国際比較や、 日本データだけでは不足する分野で活用:
| 名称 | 提供元 | 内容 |
|---|---|---|
| World Bank Open Data | 世界銀行 | 経済・社会指標、 全 200 余ヶ国 |
| OECD Data | OECD | 教育・医療・労働等比較指標 |
| UN Data | 国連 | 人口・SDG 関連 |
| Eurostat | EU 統計局 | EU 加盟国データ |
| WHO GHO | WHO | 世界保健統計 |
| Kaggle Datasets | Kaggle | 研究・コンペ用 |
| HuggingFace Datasets | HuggingFace | ML 用、 主にテキスト・画像 |
| Google Dataset Search | 公開データセット検索 |
国際機関のデータは 定義(例えば「失業」の基準)が国により異なることがあり、 比較分析では必ず定義を確認します。 OECD は加盟国共通定義に整えているため、 国際比較に向いています。
| 名称 | 提供元 | 内容 | 取得方法 |
|---|---|---|---|
| e-Stat | 総務省統計局 | 政府統計の総合窓口、 国勢調査・労働力調査等 | Web, API(要登録) |
| SSDSE | 統計数理研究所 | 教育用CSV、 都道府県別、 市区町村別 | CSV ダウンロード |
| RESAS | 経済産業省 | 地域経済分析システム | Web, 一部 API |
| AMeDAS | 気象庁 | 10分間の気象観測値 | CSV, JSON |
| DATA.GO.JP | 政府CIO | オープンデータカタログ | CKAN API |
| 国保データベース | 国保中央会 | 医療レセプト集計 | 研究利用申請 |
| 統計でみる日本 | 総務省 | 統計ハンドブック | PDF / CSV |
| 国会図書館 | NDL | 書誌・全文検索 | SRU API |
仮想例:「全国 47 都道府県の高齢化と社会保障費の関係を 10 年スパンで分析」したい。
Q1. スクレイピングと API、どちらを使うべき?
API がある場合は必ず API を使う。 公式に許可された経路で、 構造化されたデータが安定して取れます。 API がない場合のみ、 規約を確認したうえでスクレイピング。
Q2. 1000 件は十分?
全国の比率推定なら±3% 程度の精度で十分。 ただし「20 代女性」など細分化集計をするなら、 部分集合のサイズで判定すべき。
Q3. オンライン調査の代表性は?
ネット利用者バイアスを必ず認識する。 シニア層・低所得層は過小代表になりがち。 重要なら郵送+オンライン併用、 ウェイト補正の検討。
Q4. 公的統計と独自取得、どちらを優先?
公的統計(e-Stat、SSDSE 等)を先に確認。 多くの主題が既存統計でカバーされる。 不足分のみ独自取得が効率的かつ品質も担保しやすい。
Q5. データ取得スクリプトはどう保存?
Git で版数管理、 環境は requirements.txt または pyproject.toml で固定、 取得結果はハッシュで指紋採取して別管理。 再現性のために dvc / Pachyderm 等も検討。