論文一覧に戻る 📚 用語集トップ 🗺 概念マップ
📚 用語解説
📚 用語解説
ETL
Extract-Transform-Load
データエンジニアリング

💡 30秒で分かる結論

抽出→変換→ロードのデータ統合プロセス

🎨 直感で掴む

データを「分析・モデリングに使える形に整える」工程。 分析の質はここで 8 割決まります。

本ページでは ETL を、 定義・前提条件・使い方・落とし穴の順に整理して解説します。 厳密な定義より、 まず何を、 いつ、 どう使うかを理解することを優先してください。

📐 定義

抽出→変換→ロードのデータ統合プロセス

英語名 Extract-Transform-Load

🎯 いつ・どこで使うか

📋 前提条件・適用範囲

この用語を理解・使用するときは、 次のような前提を意識してください:

⚠️ よくある落とし穴

❌ テスト時の未知カテゴリ
OneHotEncoder(handle_unknown="ignore") 等で対応。
❌ リーク防止
前処理は CV の各 fold 内で fit。 Pipeline を使う。
❌ 文字コード
日本語 CSV は utf-8 / cp932 を試す。

🐍 Python での扱い

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())

# 「ETL」の文脈で扱う場合の例:
# 分野: データエンジニアリング
# 関連手法は同カテゴリの他用語を参照してください。

具体的なコードは データエンジニアリング を参照してください。

📝 レポートでの報告

分析結果を報告するときに含めるべき情報:

✅ チェックリスト

🧮 SSDSE-B-2026 を ETL する完全な例

SSDSE-B-2026 はcp932 エンコード・1 行目に英字列名・2 行目に日本語見出しという独特の構造。 これをそのまま BI ツールに渡せないため、 ETL の流れを必ず通す必要がある。

Extract → Transform → Load の 3 工程

工程SSDSE-B での具体作業典型ツール
Extract(抽出)data/raw/SSDSE-B-2026.csv を cp932 で読み込み、 1 行目を skippandas, requests, e-Stat API
Transform(変換)年度フィルタ、 都道府県コード正規化、 人口比率の計算、 欠損除去pandas, Spark, dbt
Load(格納)SQLite/PostgreSQL/BigQuery にテーブル作成して挿入SQLAlchemy, gcloud, AWS CLI
 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
30
31
32
# SSDSE-B-2026 を ETL する完全例
import pandas as pd
import sqlite3

# === Extract ===
df_raw = pd.read_csv('data/raw/SSDSE-B-2026.csv',
                     encoding='cp932', skiprows=1)
print('Extract done:', df_raw.shape)

# === Transform ===
# 1. 年度を最新のみに絞る
df = df_raw[df_raw['年度']==2023].copy()

# 2. 派生指標を計算 (高齢化率)
df['高齢化率'] = df['65歳以上人口'] / df['総人口'] * 100

# 3. 列名を英字に統一
df = df.rename(columns={
    '都道府県':'prefecture', '総人口':'population',
    '65歳以上人口':'aged_pop','高齢化率':'aged_ratio',
})

# 4. 欠損行を除去
df = df.dropna(subset=['population','aged_pop'])

# === Load ===
con = sqlite3.connect('ssdse_b.db')
df[['prefecture','population','aged_pop','aged_ratio']
   ].to_sql('ssdse_b_2023', con, if_exists='replace', index=False)
con.close()
print('Loaded', len(df), 'rows into ssdse_b.db')

🔬 ETL vs ELT、 そしてバッチ vs ストリーミング

かつては Transform を専用サーバで行う ETL が主流だったが、 DWH の計算能力向上で ELT(生データを先に Load し、 DWH 内で Transform)が増えてきた。

観点ETL(古典的)ELT(クラウドDWH時代)
変換場所ETL専用サーバDWH(BigQuery/Snowflake)
生データ保管捨てる残す(再計算可)
代表ツールInformatica, Talenddbt, Fivetran, Airbyte
拡張性スケールアウト難DWH依存で容易
コストオンプレ固定従量課金

バッチ vs ストリーミング

冪等性(idempotency)が重要

同じ ETL ジョブを 2 回実行しても結果が変わらないこと。 SSDSE-B-2026 の場合、 Load 時に if_exists='replace' や upsert(MERGE)を使うと冪等になる。

⚠️ ETL の典型的な落とし穴

❌ 1. エンコード判定の失敗
SSDSE は cp932(Shift_JIS)。 utf-8 で読むと文字化け・パース失敗。 encoding を明示的に指定する。
❌ 2. 列の型が暗黙変換で崩れる
pd.read_csv は欠損が混じると数値列を object 型にする。 後で int として処理しようとして例外。 dtype を明示するかastype で固定。
❌ 3. 重複データの蓄積
差分 ETL で primary key 制約が無いと、 同じ行が何度も追加される。 LOAD 前に DELETE か MERGE で重複排除。
❌ 4. タイムゾーン取り違え
「2023-12-31 23:00 UTC」と「2024-01-01 08:00 JST」は同一時刻。 暗黙の TZ で集計が日付を跨ぐ。
❌ 5. リーク(テストデータが訓練に混入)
Transform で全データの平均で標準化 → クロスバリデーションで未来情報がリーク。 fold ごとに fit が原則。