このページで扱う主要キーワード(クリックで該当セクションへ):
「積分」 (Integration) は、 SSDSE-B-2026 などの公的統計データを使った教材・分析で頻出するキーワードです。 本ページでは、 まず直感、 次に数式、 そして 47 都道府県の実値で確かめる、 という流れで体系的に整理します。 加えて、 ケーススタディ・FAQ・歴史的経緯・参考文献までを 1 ページに集約し、 用語の「地図」として使えるようにしました。
関連用語(前提・並列・発展)と関連グループ教材も末尾にまとめてあるので、 用語の地図として活用してください。
積分は関数 $f(x)$ の「曲線下の面積」「総量」「平均」を求める操作で、 微分の逆演算でもあります。 統計・確率・物理・経済のいずれも、 連続変数の「足し合わせ」は積分で表されます。
データサイエンス文脈で積分が登場する代表場面:
多くの場合、 解析解は得られないため、 数値積分や モンテカルロ積分でアプローチします。
標準正規分布の累積分布関数:
$$\Phi(z) = \int_{-\infty}^{z} \frac{1}{\sqrt{2\pi}} e^{-t^2/2}\,dt$$| 概念 | 意味 | 例 |
|---|---|---|
| 被積分関数 $f$ | 足し合わせる対象の関数 | 確率密度・損失 |
| 積分区間 $[a,b]$ | 足し合わせの範囲 | $[-\infty, z]$ の CDF |
| 不定積分 $F$ | $F'=f$ となる原始関数 | $\int 2x\,dx = x^2 + C$ |
| 台形則 | 各小区間を線で結ぶ近似 | 低精度・実装が単純 |
| シンプソン則 | 各小区間を 2 次曲線で近似 | 滑らかな関数で高精度 |
| ガウス求積 | 節点を最適化した重み付き和 | 少ない点数で高精度 |
| モンテカルロ | サンプル平均で近似 | 高次元・複雑領域で有利 |
| 特異点 | $f$ が発散する点 | 変数変換で除去 |
47 都道府県の総人口を 1 次元データとみなし、 カーネル密度推定(KDE)で連続密度 $\hat f(x)$ を構成。 その密度を数値積分すれば次が分かります。
このように、 ヒストグラムを「面積」として扱うと、 確率・分位点・期待値が すべて積分の問題に統一されます。
from scipy.integrate import quad import numpy as np # 標準正規分布の Pr(-1 <= Z <= 1) val, err = quad(lambda x: np.exp(-x**2/2)/np.sqrt(2*np.pi), -1, 1) print(val, '±', err) # 約 0.6827
import pandas as pd, numpy as np
from scipy.stats import gaussian_kde
from scipy.integrate import quad
df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='shift_jis')
df.columns = df.iloc[0]
df = df.iloc[1:].reset_index(drop=True)
df = df[df['年度']=='2023'].reset_index(drop=True)
pop = df['総人口'].astype(float).to_numpy()
kde = gaussian_kde(pop, bw_method=0.4)
# 規格化確認
total, _ = quad(lambda x: kde(x).item(), pop.min()*0.5, pop.max()*1.5)
print('規格化:', total)
# 100 万人未満の割合
p_small, _ = quad(lambda x: kde(x).item(), 0, 1_000_000)
print('Pr(<100万人):', p_small)
# 500 万人以上の割合
p_big, _ = quad(lambda x: kde(x).item(), 5_000_000, pop.max()*1.5)
print('Pr(>=500万人):', p_big)
import numpy as np
xs = np.linspace(-3, 3, 1000)
fs = np.exp(-xs**2/2) / np.sqrt(2*np.pi)
h = xs[1] - xs[0]
trap = h * (fs[0]/2 + fs[1:-1].sum() + fs[-1]/2)
print('Pr(-3<=Z<=3) ≒', trap) # 約 0.9973
import numpy as np
# 円内ランダム点で π を推定(実乱数は外部実データに置換可だが、 ここでは原理確認)
N = 1_000_000
pts = np.random.default_rng(0).uniform(-1, 1, size=(N, 2))
inside = (pts**2).sum(axis=1) <= 1
pi_est = 4 * inside.mean()
print('π ≒', pi_est)
from scipy.integrate import dblquad
import numpy as np
# 二次元正規分布の Pr(0<=X<=1, 0<=Y<=1)
def f(y, x):
return np.exp(-(x**2+y**2)/2) / (2*np.pi)
val, _ = dblquad(f, 0, 1, lambda x: 0, lambda x: 1)
print(val)
from scipy.special import erf
import numpy as np
def Phi(z):
return 0.5 * (1 + erf(z / np.sqrt(2)))
print(Phi(1.96)) # 約 0.975
ROC 曲線下面積:
$$\text{AUC} = \int_0^1 \text{TPR}(\text{FPR}^{-1}(t))\,dt$$実装は sklearn.metrics.roc_auc_score が台形則で計算。
解析的に解けないので、 ラプラス近似・変分推論・MCMC で近似する。
from scipy.integrate import fixed_quad
import numpy as np
val, _ = fixed_quad(lambda x: np.exp(-x**2/2)/np.sqrt(2*np.pi), -3, 3, n=20)
print('Pr(-3<=Z<=3):', val)
import pandas as pd, numpy as np
from scipy.integrate import quad
from scipy.stats import gaussian_kde
df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='shift_jis')
df.columns = df.iloc[0]
df = df.iloc[1:].reset_index(drop=True)
df = df[df['年度']=='2023'].reset_index(drop=True)
x = df['総人口'].astype(float).to_numpy()
kde = gaussian_kde(x)
mean_int, _ = quad(lambda t: t * kde(t).item(), 0, x.max()*1.5)
var_int, _ = quad(lambda t: (t - mean_int)**2 * kde(t).item(), 0, x.max()*1.5)
print('密度から計算した平均:', mean_int)
print('密度から計算した分散:', var_int)
import numpy as np
xs = np.linspace(-3, 3, 1001) # 奇数点で偶数区間
fs = np.exp(-xs**2/2)/np.sqrt(2*np.pi)
h = xs[1]-xs[0]
simpson = h/3 * (fs[0] + fs[-1] + 4*fs[1:-1:2].sum() + 2*fs[2:-2:2].sum())
print('Simpson:', simpson)
ステップ 1:データ準備
import pandas as pd, numpy as np
from scipy.stats import gaussian_kde
from scipy.integrate import quad
df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='shift_jis')
df.columns = df.iloc[0]
df = df.iloc[1:].reset_index(drop=True)
df = df[df['年度']=='2023'].reset_index(drop=True)
pop = df['総人口'].astype(float).to_numpy()
x = np.log(pop) # 対数化して扱いやすく
ステップ 2:密度推定
kde = gaussian_kde(x, bw_method=0.3)
xs = np.linspace(x.min()-1, x.max()+1, 1000)
density = kde(xs)
print('peak at log pop =', xs[density.argmax()])
print('対応する人口 =', np.exp(xs[density.argmax()]))
ステップ 3:規格化確認
total, _ = quad(lambda t: kde(t).item(), x.min()-2, x.max()+2)
print('密度の総和(積分):', total) # ≈ 1.0 になるはず
ステップ 4:分位点を積分で求める
from scipy.optimize import brentq
def F(t):
val, _ = quad(lambda u: kde(u).item(), -np.inf, t)
return val
median_log = brentq(lambda t: F(t)-0.5, x.min(), x.max())
print('中央値(対数):', median_log)
print('中央値(人口):', np.exp(median_log))
ステップ 5:期待値と分散を積分から計算
mean_int, _ = quad(lambda t: t*kde(t).item(), x.min()-2, x.max()+2)
var_int, _ = quad(lambda t: (t-mean_int)**2 * kde(t).item(), x.min()-2, x.max()+2)
print('E[log pop]:', mean_int)
print('Var[log pop]:', var_int)
print('参考: 標本平均:', x.mean(), ' 標本分散:', x.var())
ステップ 6:シンプソン則と比較
def simpson(f, a, b, n=1000):
if n % 2: n += 1
h = (b-a)/n
xs = np.linspace(a, b, n+1)
ys = np.array([f(x) for x in xs])
return h/3 * (ys[0] + ys[-1] + 4*ys[1:-1:2].sum() + 2*ys[2:-2:2].sum())
print('Simpson:', simpson(lambda t: kde(t).item(), x.min()-2, x.max()+2))
$\Pr(a\le X\le b) = \int_a^b f(x)dx$。 株価が一定値を下回る確率、 試験得点が合格点を上回る確率。
$E[X] = \int x f(x) dx$。 「期待損失」「期待利益」を理論モデルから計算。
事後分布の正規化定数 $\int p(D|\theta)p(\theta)d\theta$ は積分。 MCMC・変分推論で近似。
Black-Scholes 式は実は積分(標準正規分布の CDF)。 オプション価格を解析的に出す。
運動エネルギー、 位置エネルギー、 電位、 磁束 — すべて積分。
ROC-AUC、 PR-AUC は積分。 不均衡データの評価で重要。
$\mu_k = \int (x-\mu)^k f(x) dx$ で高次モーメントを計算。 確率分布の形を定量化。
フーリエ変換 $\hat f(\xi) = \int f(t) e^{-2\pi i \xi t} dt$ は積分の代表例。 周波数解析。
| 手法 | 精度(滑らかな関数) | 計算量 | 適用 |
|---|---|---|---|
| 左/右矩形 | O(h) | 低 | 教育用 |
| 台形則 | O(h²) | 低 | 標準 |
| Simpson 則 | O(h⁴) | 中 | 滑らか関数 |
| Romberg | O(h^{2k}) | 中 | 非常に滑らか |
| Gauss-Legendre | O(h^{2n}) | 中 | 節点最適化 |
| 適応 Gauss-Kronrod (quad) | 誤差制御 | 中 | 1 次元万能 |
| モンテカルロ | O(1/√N) | 高 | 高次元 |
| 準モンテカルロ | O((log N)^d/N) | 高 | 中次元 |
| 用語 | 意味 |
|---|---|
| 原始関数 | 微分すると f になる関数 F |
| 定積分 | 区間上の面積 |
| 不定積分 | 原始関数の総称 F + C |
| 被積分関数 | 積分される関数 f |
| リーマン積分 | 区間分割と上下和 |
| ルベーグ積分 | 測度に基づく一般化 |
| 台形則 | 線形補間で近似 |
| Simpson 則 | 2 次補間で近似 |
| ガウス求積 | 節点最適化の高精度求積 |
| モンテカルロ積分 | サンプル平均で近似 |
| 特異点 | 関数が発散する点 |
| 適応求積 | 誤差に応じて区間分割を変える |
| レシピ | コード |
|---|---|
| scipy quad | from scipy.integrate import quad val, err = quad(f, a, b) |
| dblquad | from scipy.integrate import dblquad val, _ = dblquad(f, 0, 1, lambda x: 0, lambda x: 1) |
| tplquad | from scipy.integrate import tplquad |
| nquad | from scipy.integrate import nquad nquad(f, [[0,1],[0,1],[0,1]]) |
| 固定 Gauss | from scipy.integrate import fixed_quad fixed_quad(f, a, b, n=10) |
| 台形則 | from scipy.integrate import trapezoid trapezoid(y, x) |
| シンプソン則 | from scipy.integrate import simpson simpson(y, x=x) |
| Romberg | from scipy.integrate import romberg romberg(f, a, b) |
| ODE 解法 | from scipy.integrate import solve_ivp res = solve_ivp(rhs, [0,10], y0) |
| 累積積分 | from scipy.integrate import cumulative_trapezoid F = cumulative_trapezoid(y, x, initial=0) |
| 正規 CDF | from scipy.stats import norm norm.cdf(1.96) |
| KDE 積分 | from scipy.stats import gaussian_kde; kde = gaussian_kde(x); quad(lambda t: kde(t).item(), -np.inf, x_thr) |
| ROC AUC (積分) | from sklearn.metrics import roc_auc_score; roc_auc_score(y_true, y_score) |
| モンテカルロ | pts = rng.uniform(0,1,size=(N,2)); val = ((pts**2).sum(axis=1)<1).mean()*4 |
| 重要サンプリング (擬似) | weights = p(x)/q(x); estimate = (f(x)*weights).mean() |
quad の weight 引数を使う。scipy.integrate.quad はどの方法?dblquad, tplquad, nquad。 3 次元以上はモンテカルロが現実的。歴史と位置づけ:積分の概念は古代ギリシャ(エウドクソス、 アルキメデス)の「取り尽くし法」にまで遡ります。 アルキメデスは円周率や球の体積を、 多角形・多面体の極限として求めていました。
機械学習で積分が現れる場面は多く、 特にベイズ推論では事後分布 $p(\theta|D)=\frac{p(D|\theta)p(\theta)}{\int p(D|\theta)p(\theta)d\theta}$ の分母(証拠)が解析的に計算できないため、 MCMC・変分推論・ラプラス近似などの手法が発達しました。
積分の用途マップ:
【積分】
│
┌──────────┼──────────┬──────────┐
解析解 数値解 確率的解 応用
│ │ │ │
公式 台形/Simpson モンテカルロ 確率(CDF)
部分積分 ガウス求積 重要サンプリング 期待値
置換積分 Romberg MCMC 周辺尤度
AUC