二項分布 (Binomial Distribution)
n回の試行で「成功確率 p」の出来事が起きる回数。
数式:
P(X = k) = C(n, k) p^k (1−p)^(n−k)
期待値:
E[X] = n p
分散:
Var(X) = n p (1−p)
フェミニスト的読み替え:
「女性が会議で発言できるか」を成功とすると、発言回数は二項分布に従う。
ただし「成功確率 p」は男女で非対称であり、この偏りが構造的差別を数値化する。
ポアソン分布 (Poisson Distribution)
一定時間・空間での稀な事象の発生回数。
数式:
P(X = k) = (λ^k e^(−λ)) / k!
E[X] = Var(X) = λ
フェミニスト的読み替え:
「セクハラ発言」や「差別的行為」は突発的で稀に見えても、長期的に観察すると λ(平均率)としてモデル化できる。
可視化することで「偶然ではなく構造的に繰り返されている」ことを示せる。
幾何分布 (Geometric Distribution)
最初の成功までに要する試行回数。
数式:
P(X = k) = (1−p)^(k−1) p
期待値:
E[X] = 1/p
分散:
Var(X) = (1−p)/p²
フェミニスト的読み替え:
「女性の声が認められるまでに何回無視されるか」を測る分布。
p が小さい=「認められる確率が低い」=差別的環境を反映。
超幾何分布 (Hypergeometric Distribution)
有限集団から無作為抽出する場合の成功数。
数式:
P(X = k) = [ C(K, k) C(N−K, n−k) ] / C(N, n)
期待値:
E[X] = n (K/N)
分散:
Var(X) = n (K/N)(1−K/N)(N−n)/(N−1)
フェミニスト的読み替え:
「役員会に女性が何人含まれるか」は超幾何分布に従う。
母集団Nに占める女性割合K/Nが小さいと、抽出された役員会でも女性が少なくなる=ガラスの天井の再生産。
負の二項分布 (Negative Binomial Distribution)
r回成功するまでの試行回数。
数式:
P(X = k) = C(k−1, r−1) p^r (1−p)^(k−r)
期待値:
E[X] = r/p
分散:
Var(X) = r(1−p)/p²
フェミニスト的読み替え:
「女性が昇進を複数回(r回)勝ち取るまでに、何回の挑戦が必要か」を表す。
p が低ければ、女性は男性より何倍も努力を強いられる構造が数式で見える。
- いろいろな確率分布2 × フェミニスト的読み替え
正規分布 (Normal Distribution)
社会現象の多くは平均 μ と分散 σ² をもつ正規分布に近似できる。
数式:
f(x) = (1 / √(2πσ²)) exp( − (x−μ)² / (2σ²) )
E[X] = μ
Var(X) = σ²
フェミニスト的読み替え:
「男女の賃金分布」は正規に近いが、平均 μ に差がある。
単なる「平均値の違い」ではなく、分布全体の重なりや乖離が差別を可視化する。
正規分布の再生性
独立な正規分布の和も正規分布。
X ~ N(μ₁, σ₁²), Y ~ N(μ₂, σ₂²) → X+Y ~ N(μ₁+μ₂, σ₁²+σ₂²)
フェミニスト的読み替え:
「職場での差別」と「家庭での負担」が加わると、女性のキャリアへの影響は正規分布として積み重なる。
社会的抑圧は単一要因ではなく、累積的に女性を制約する。
標準正規分布 (Standard Normal)
平均 0, 分散 1 の分布。
Z = (X − μ) / σ
Z ~ N(0,1)
フェミニスト的読み替え:
「標準化」は、異なる状況にある女性を比較可能にする方法。
例えば「昇進年齢」や「賃金」を標準化すれば、地域・業界を越えて格差の大きさを比較できる。
標準正規分布表の活用
Z値に対する累積分布 F(Z) を表形式で確認できる。
フェミニスト的読み替え:
「どの水準を超えると女性がほとんど到達できないか」をZスコアで示すと、ガラスの天井の厚みを定量化できる。
# Program Name: feminist_probability_distributions.py
# Creation Date: 20250906
# Overview: Demonstration of probability distributions (Binomial, Poisson, Geometric, Hypergeometric,
# Negative Binomial, Normal, Standard Normal) with feminist interpretations.
# Usage: Run the script to compute probabilities, expectations, variances, and visualize distributions.
!pip install numpy scipy matplotlib
import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import binom, poisson, geom, hypergeom, nbinom, norm
# --------------------------
# Parameters (統一管理)
# --------------------------
n = 10 # trials
p = 0.3 # success probability (例: 女性が会議で発言できる確率)
lam = 2 # Poisson mean rate (例: 差別的発言の平均発生率)
r = 3 # target successes for Negative Binomial
N = 50 # population size
K = 10 # number of "success states" in population (例: 女性役員数)
sample_n = 5 # sample size
mu = 50 # Normal mean (例: 男性賃金)
sigma = 10 # Normal std deviation
mu_f = 45 # 女性平均賃金
sigma_f = 8 # 女性標準偏差
# --------------------------
# Binomial Distribution
# --------------------------
x = np.arange(0, n+1)
pmf_binom = binom.pmf(x, n, p)
print("Binomial E[X] =", n*p)
print("Binomial Var[X] =", n*p*(1-p))
plt.bar(x, pmf_binom)
plt.title("Binomial Distribution (Feminist view: Women's speech count in meetings)")
plt.xlabel("Number of successes (women's speeches)")
plt.ylabel("Probability")
plt.show()
# --------------------------
# Poisson Distribution
# --------------------------
x = np.arange(0, 10)
pmf_poisson = poisson.pmf(x, lam)
print("Poisson E[X] = Var[X] =", lam)
plt.bar(x, pmf_poisson)
plt.title("Poisson Distribution (Feminist view: Harassing acts per unit time)")
plt.xlabel("Number of acts")
plt.ylabel("Probability")
plt.show()
# --------------------------
# Geometric Distribution
# --------------------------
x = np.arange(1, 11)
pmf_geom = geom.pmf(x, p)
print("Geometric E[X] =", 1/p)
print("Geometric Var[X] =", (1-p)/p**2)
plt.bar(x, pmf_geom)
plt.title("Geometric Distribution (Feminist view: Attempts before women's voices recognized)")
plt.xlabel("Trial count until recognition")
plt.ylabel("Probability")
plt.show()
# --------------------------
# Hypergeometric Distribution
# --------------------------
x = np.arange(0, sample_n+1)
pmf_hyper = hypergeom.pmf(x, N, K, sample_n)
print("Hypergeometric E[X] =", sample_n * (K/N))
plt.bar(x, pmf_hyper)
plt.title("Hypergeometric Distribution (Feminist view: Women included in a board)")
plt.xlabel("Number of women selected")
plt.ylabel("Probability")
plt.show()
# --------------------------
# Negative Binomial Distribution
# --------------------------
x = np.arange(r, r+15)
pmf_nbinom = nbinom.pmf(x-r, r, p)
print("Negative Binomial E[X] =", r/p)
print("Negative Binomial Var[X] =", r*(1-p)/p**2)
plt.bar(x, pmf_nbinom)
plt.title("Negative Binomial Distribution (Feminist view: Efforts until multiple promotions)")
plt.xlabel("Trial count until r promotions")
plt.ylabel("Probability")
plt.show()
# --------------------------
# Normal Distribution
# --------------------------
x = np.linspace(20, 80, 200)
pdf_men = norm.pdf(x, mu, sigma)
pdf_women = norm.pdf(x, mu_f, sigma_f)
plt.plot(x, pdf_men, label="Men")
plt.plot(x, pdf_women, label="Women")
plt.title("Normal Distribution (Feminist view: Wage distribution)")
plt.xlabel("Income")
plt.ylabel("Density")
plt.legend()
plt.show()
# --------------------------
# Standard Normal Distribution
# --------------------------
z = np.linspace(-3, 3, 200)
pdf_standard = norm.pdf(z, 0, 1)
cdf_standard = norm.cdf(z, 0, 1)
plt.plot(z, pdf_standard, label="PDF")
plt.plot(z, cdf_standard, label="CDF")
plt.title("Standard Normal (Feminist view: Z-scores of glass ceiling)")
plt.xlabel("Z-score")
plt.ylabel("Value")
plt.legend()
plt.show()
指数分布 (Exponential Distribution)
数式:
f(x) = λ e^(−λx), x ≥ 0
E[X] = 1/λ
Var(X) = 1/λ²
社会的読み替え:
「セクハラ発言や差別的行為の発生間隔」をモデル化できる。
λ が大きい(平均間隔が短い)=繰り返し起きる差別が日常化している社会。
λ が小さい(平均間隔が長い)=一見減っているように見えても、根本的には構造が残っている。
離散一様分布 (Discrete Uniform Distribution)
数式:
P(X=k) = 1/n
E[X] = (n+1)/2
Var(X) = (n²−1)/12
社会的読み替え:
「男女が同じ確率で発言機会を得る」と仮定するモデル。
しかし実際には「男性発言の確率が偏って高い」ことが多く、真の分布は一様ではない。
→ 一様分布との乖離を測ることで「形式上の平等」と「実質的な不平等」の差が数値化できる。
連続一様分布 (Continuous Uniform Distribution)
数式:
f(x) = 1/(b−a), a ≤ x ≤ b
E[X] = (a+b)/2
Var(X) = (b−a)²/12
社会的読み替え:
「賃金が一定の幅 [a,b] に均等に分布する」とした理想モデル。
実際には低賃金に女性が集中しているため、均等性は崩れている。
→ “均等なはずなのに偏りがある” という現実を数理的に検証するベースラインになる。
区間確率の応用
数式:
P(c ≤ X ≤ d) = (d−c) / (b−a)
社会的読み替え:
「女性の賃金が一定水準 [c,d] にある割合」を測れる。
賃金分布を可視化すると、低所得帯に女性が集中している偏りが表れる。
2変数の確率分布 (Joint Distribution)
定義:
f(x,y) で X, Y が同時にどの値をとるかを表す。
∬ f(x,y) dxdy = 1
社会的読み替え:
「X=家庭内労働時間, Y=職場での昇進率」などの同時分布。
→ 家庭の負担が重いほど昇進が少ない、という依存関係が分布全体に表れる。
2変数の期待値・分散・共分散
数式:
E[X] = ∬ x f(x,y) dxdy
E[Y] = ∬ y f(x,y) dxdy
Cov(X,Y) = E[(X−E[X])(Y−E[Y])]
ρ(X,Y) = Cov(X,Y)/(σ_X σ_Y)
社会的読み替え:
共分散 Cov(X,Y) が負 → 「家庭負担が増えると賃金が下がる」など抑圧関係を示す。
相関係数 ρ の大きさ → 構造的差別の強さを定量化できる。
→ これにより「ジェンダー役割とキャリア格差が独立ではない」ことが可視化される。
フェミニスト的まとめ
指数分布 → 差別や暴力の「発生間隔」を数理的に捉える
一様分布 → 形式上の平等と実質的格差の差を浮き彫りにする
2変数分布 → 家庭と職場など「複数要因が交差して女性を制約する」構造を分析する
共分散・相関 → 不平等がどの程度「構造的に結びついているか」を測る
!pip install numpy matplotlib
import numpy as np
import matplotlib.pyplot as plt
# ------------------------------
# Parameters / パラメータ管理
# ------------------------------
lam = 1.0 # λ for exponential distribution
n = 6 # range for discrete uniform distribution (1,...,n)
a, b = 0, 10 # interval for continuous uniform distribution
c, d = 3, 7 # interval probability [c,d]
N = 10000 # sample size for simulations
# ------------------------------
# Exponential Distribution / 指数分布
# ------------------------------
# PDF: f(x) = λ e^(−λx), x >= 0
exp_samples = np.random.exponential(1/lam, N)
exp_mean = np.mean(exp_samples)
exp_var = np.var(exp_samples)
# ------------------------------
# Discrete Uniform Distribution / 離散一様分布
# ------------------------------
# Values: 1,...,n each with prob 1/n
disc_samples = np.random.randint(1, n+1, N)
disc_mean = np.mean(disc_samples)
disc_var = np.var(disc_samples)
# ------------------------------
# Continuous Uniform Distribution / 連続一様分布
# ------------------------------
cont_samples = np.random.uniform(a, b, N)
cont_mean = np.mean(cont_samples)
cont_var = np.var(cont_samples)
interval_prob = np.sum((cont_samples >= c) & (cont_samples <= d)) / N
# ------------------------------
# Joint Distribution Example / 2変数分布の例
# ------------------------------
# Feminist analogy: X = domestic labor hours, Y = promotion rate
X = np.random.normal(5, 2, N) # 家事労働時間 (平均5, 分散2)
Y = np.random.normal(50, 10, N) # 昇進率 (平均50, 分散10)
cov_xy = np.cov(X, Y, bias=True)[0,1]
corr_xy = np.corrcoef(X, Y)[0,1]
# ------------------------------
# Display Results / 計算結果表示
# ------------------------------
print("=== Exponential Distribution (指数分布) ===")
print(f"Mean ≈ {exp_mean:.3f}, Var ≈ {exp_var:.3f}, Theory: E[X]=1/λ={1/lam}, Var=1/λ²={1/lam**2}")
print("\n=== Discrete Uniform Distribution (離散一様分布) ===")
print(f"Mean ≈ {disc_mean:.3f}, Var ≈ {disc_var:.3f}, Theory: E[X]=(n+1)/2={(n+1)/2}, Var=(n²−1)/12={(n**2-1)/12}")
print("\n=== Continuous Uniform Distribution (連続一様分布) ===")
print(f"Mean ≈ {cont_mean:.3f}, Var ≈ {cont_var:.3f}, Theory: E[X]=(a+b)/2={(a+b)/2}, Var=(b−a)²/12={(b-a)**2/12}")
print(f"P({c} ≤ X ≤ {d}) ≈ {interval_prob:.3f}, Theory={(d-c)/(b-a):.3f}")
print("\n=== Joint Distribution (2変数分布) ===")
print(f"Cov(X,Y) ≈ {cov_xy:.3f}, Corr(X,Y) ≈ {corr_xy:.3f}")
# ------------------------------
# Visualization / 可視化
# ------------------------------
# Exponential Distribution
plt.hist(exp_samples, bins=50, density=True, alpha=0.7)
x_vals = np.linspace(0, 8, 100)
plt.plot(x_vals, lam*np.exp(-lam*x_vals), 'r-', lw=2, label="Theoretical PDF")
plt.title("Exponential Distribution (差別発生間隔)")
plt.xlabel("x")
plt.ylabel("Density")
plt.legend()
plt.show()
# Continuous Uniform Distribution
plt.hist(cont_samples, bins=50, density=True, alpha=0.7)
plt.axvline(c, color='r', linestyle='--', label="Interval [c,d]")
plt.axvline(d, color='r', linestyle='--')
plt.title("Continuous Uniform Distribution (賃金分布モデル)")
plt.xlabel("x")
plt.ylabel("Density")
plt.legend()
plt.show()
# Joint Distribution Scatter
plt.scatter(X, Y, alpha=0.3)
plt.title("Joint Distribution (家庭負担 vs 昇進率)")
plt.xlabel("Domestic Labor Hours (X)")
plt.ylabel("Promotion Rate (Y)")
plt.show()
■ 同時確率分布 (Joint Probability Distribution)
離散型:
P(X = xᵢ, Y = yⱼ) = f(xᵢ, yⱼ)
Σᵢ Σⱼ f(xᵢ, yⱼ) = 1
連続型:
P(a ≤ X ≤ b, c ≤ Y ≤ d) = ∬[a→b, c→d] f(x, y) dx dy
∬ f(x, y) dx dy = 1
フェミニスト解釈:
X=「家庭内労働時間」、Y=「職場での昇進率」などを同時に扱うと、家庭と職場が相互依存して女性のキャリアを制約している様子を可視化できる。
■ 周辺確率分布 (Marginal Distribution)
P(X = xᵢ) = Σⱼ f(xᵢ, yⱼ)
P(Y = yⱼ) = Σᵢ f(xᵢ, yⱼ)
フェミニスト解釈:
「家庭だけ」「職場だけ」を切り出すと、片側の要素しか見えない。
→ 差別が「場ごとに切り分けられて不可視化」される危険がある。
■ 期待値 (Expectation)
E[X] = Σᵢ Σⱼ xᵢ f(xᵢ, yⱼ)
E[Y] = Σᵢ Σⱼ yⱼ f(xᵢ, yⱼ)
性質:E[X+Y] = E[X] + E[Y]
フェミニスト解釈:
「平均的な家庭負担」「平均的な昇進率」を出しても、それが公平を意味するわけではない。
→ 平均の背後に「特定集団の過重な負担」が隠れる。
■ 分散 (Variance)
Var(X) = E[(X − E[X])²]
Var(Y) = E[(Y − E[Y])²]
フェミニスト解釈:
女性同士の格差を表す。都市と農村、既婚と未婚、子ありと子なしなど、同じ「女性」でも不平等が多様に存在する=インターセクショナリティ。
■ 共分散 (Covariance)
Cov(X, Y) = E[(X − E[X])(Y − E[Y])]
= E[XY] − E[X]E[Y]
フェミニスト解釈:
家庭負担Xと職場昇進Yの共分散が負なら、家庭労働が増えるほど昇進が減るという「抑圧関係」を数値化できる。
■ 相関係数 (Correlation Coefficient)
ρ(X, Y) = Cov(X, Y) / (σ_X σ_Y)
フェミニスト解釈:
相関の強さは「構造的差別の結びつきの強さ」を示す。
ρ ≈ −1 → 家庭と職場の負担が完全に逆方向に働き、女性を二重に縛っている。
■ 和と差の分散
Var(X+Y) = Var(X) + Var(Y) + 2Cov(X,Y)
Var(X−Y) = Var(X) + Var(Y) − 2Cov(X,Y)
フェミニスト解釈:
「家庭+職場」の二重負担は、分散の和として拡大しやすい。
差をとると「負担格差」と「成果格差」がどれほど噛み合っているかを見られる。
フェミニスト的まとめ
同時分布:差別は単独の要因ではなく、複数領域の「掛け算」で現れる。
周辺分布:片方だけを切り取ると「構造的なつながり」が隠れる。
分散:女性の間の格差を定量化 → インターセクショナリティ。
共分散・相関:家庭と職場、差別要因どうしの「抑圧の結合度」を測れる。
import numpy as np
import pandas as pd
# ==== Parameters ====
# Two discrete random variables:
# X = Household labor time (hours per day: 2, 4, 6)
# Y = Promotion chance (0=low, 1=medium, 2=high)
X_values = [2, 4, 6]
Y_values = [0, 1, 2]
# Joint probability distribution table (rows=X, cols=Y)
# Feminist example: More household work → less promotion probability
joint_probs = np.array([
[0.05, 0.10, 0.05], # X=2
[0.10, 0.15, 0.05], # X=4
[0.20, 0.20, 0.10] # X=6
])
# ==== Joint Probability Distribution ====
df_joint = pd.DataFrame(joint_probs, index=X_values, columns=Y_values)
print("Joint Probability Distribution (X=Housework, Y=Promotion):")
print(df_joint, "\n")
print("Check sum =", df_joint.values.sum()) # Must be 1
# ==== Marginal Distributions ====
P_X = df_joint.sum(axis=1) # Sum over Y
P_Y = df_joint.sum(axis=0) # Sum over X
print("Marginal P(X):\n", P_X, "\n")
print("Marginal P(Y):\n", P_Y, "\n")
# ==== Expectations ====
E_X = sum(x * P_X[x] for x in X_values)
E_Y = sum(y * P_Y[y] for y in Y_values)
print("E[X] =", E_X)
print("E[Y] =", E_Y, "\n")
# ==== Variances ====
Var_X = sum(((x - E_X) ** 2) * P_X[x] for x in X_values)
Var_Y = sum(((y - E_Y) ** 2) * P_Y[y] for y in Y_values)
print("Var(X) =", Var_X)
print("Var(Y) =", Var_Y, "\n")
# ==== Covariance ====
E_XY = sum(x * y * joint_probs[i, j]
for i, x in enumerate(X_values)
for j, y in enumerate(Y_values))
Cov_XY = E_XY - E_X * E_Y
print("E[XY] =", E_XY)
print("Cov(X,Y) =", Cov_XY, "\n")
# ==== Correlation ====
rho = Cov_XY / (np.sqrt(Var_X) * np.sqrt(Var_Y))
print("Correlation coefficient ρ(X,Y) =", rho, "\n")
# ==== Feminist interpretation (textual) ====
print("Feminist interpretation:")
print("- Higher household labor (X↑) correlates with lower promotion (Y↓).")
print("- Negative covariance shows the structural oppression link.")
print("- Correlation coefficient indicates the strength of this connection.")