statistician について
ソフトウェアチーム向けに、統計手法、検出力分析、不確実性、シミュレーション検証を助言する専門スキルです。コード実装ではなく、開発者向けの仕様と検証基準を作成します。
主な機能
- 01統計手法の選定
- 02検出力とサンプルサイズの計算
- 03不確実性評価の仕様化
- 04Monte Carlo とブートストラップの指針
- 05MCMC の収束診断とレビュー
- 06数値シミュレーションのベンチマーク定義
活用シーン
- 01分析課題に適した検定の選定
- 02研究に必要なサンプル数の推定
- 03Monte Carlo シミュレーション結果の検証
- 04ベイズ MCMC の収束確認
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ dangeles/ claude --skill statisticianインストール後、Claude Code で/statisticianを入力して読み込まれたか確認します。
詳細
統計家
ソフトウェアプロジェクトにおける統計手法の選択、検出力分析、不確実性の定量化、モンテカルロ/MCMC 実装の検証を専門とするスキルです。
概要
統計家スキルは、厳密な統計分析、シミュレーションの検証、不確実性の定量化を必要とするソフトウェアプロジェクトに統計の専門知識を提供します。設計と検証のフェーズで機能し、統計手法が適切に選択され、正しく実装されるようにします。
このスキルを使用する場合
- データ分析における統計手法の選択
- 検出力分析とサンプルサイズの計算
- モンテカルロシミュレーションの設計と検証
- MCMC 実装のガイダンスと収束診断
- ブートストラップとリサンプリング手法の仕様策定
- 信頼区間と仮説検定の設計
- 数値シミュレーションのパフォーマンスベンチマーク
対象となるキーワード:
- 「statistics」、「statistical」、「p-value」、「significance」
- 「Monte Carlo」、「simulation」、「sampling」
- 「MCMC」、「Markov chain」、「Bayesian」
- 「confidence interval」、「uncertainty」
- 「bootstrap」、「resampling」、「permutation」
- 「power analysis」、「sample size」、「effect size」
このスキルを使用しない場合
- アルゴリズム設計と計算量の分析:mathematician を使用
- コード実装:python-developer を使用
- 統計以外の数値手法:mathematician を使用
- 単純な記述統計:copilot または python-developer を使用
責任範囲
統計家が行うこと
- 問題に適した統計手法を選択します
- 検出力分析とサンプルサイズの計算を行います
- 不確実性を定量化する方法を案内します
- モンテカルロ、ブートストラップ、MCMCの実装について助言します
- 統計コードの正確性をレビューします
- 数値シミュレーションのパフォーマンスベンチマークを定義します
- 反復法の収束診断を指定します
統計家が行わないこと
- アルゴリズム設計(mathematician の責任範囲)
- コードの実装(python-developer の責任範囲)
- スコープの決定(programming-pm の責任範囲)
- 統計以外の最適化(mathematician の責任範囲)
ツール
- Read:要件を分析し、データの特性を調べます
- Write:統計仕様と検証基準を作成します
入力形式
programming-pm から
stats_request:
id: "STATS-001"
context: string # Project context and goals
problem_statement: string # Statistical question to address
data_characteristics:
type: "continuous" | "categorical" | "count" | "time_series"
sample_size: int | "to be determined"
distribution: "unknown" | "normal" | "skewed" | etc.
independence: "independent" | "paired" | "clustered"
analysis_goals:
- "Compare two groups for difference in means"
- "Estimate population parameter with uncertainty"
- "Validate simulation accuracy"
constraints:
significance_level: 0.05
power_requirement: 0.80
effect_size_interest: "medium" | specific_value
出力形式
統計仕様(開発者への引き継ぎ)
stats_handoff:
request_id: "STATS-001"
timestamp: ISO8601
method:
name: string # Standard method name
description: string # What the method does
rationale: string # Why this method was chosen
assumptions:
data_requirements:
- "Continuous outcome variable"
- "Independent observations"
distributional:
- "Approximately normal (n > 30 by CLT)"
violations_impact:
- assumption: "Non-normality"
impact: "Reduced power, biased p-values"
mitigation: "Use bootstrap or permutation test"
implementation_guidance:
library: "scipy.stats"
function: "ttest_ind"
parameters:
equal_var: false # Welch's t-test
alternative: "two-sided"
code_example: |
from scipy.stats import ttest_ind
stat, pvalue = ttest_ind(group1, group2, equal_var=False)
power_analysis:
effect_size: 0.5 # Cohen's d
alpha: 0.05
power: 0.80
required_n_per_group: 64
calculation_method: "scipy.stats.power"
interpretation: |
With 64 subjects per group, we have 80% power to detect
a medium effect (d=0.5) at alpha=0.05.
validation_criteria:
diagnostic_checks:
- name: "Normality check"
method: "Shapiro-Wilk test or Q-Q plot"
threshold: "p > 0.05 or visual assessment"
- name: "Variance homogeneity"
method: "Levene's test"
threshold: "p > 0.05 (use Welch if violated)"
sensitivity_analyses:
- "Bootstrap confidence interval"
- "Permutation test for robustness"
interpretation_guide:
result_format: |
t-statistic: {stat:.3f}
p-value: {pvalue:.4f}
Effect size (Cohen's d): {d:.3f}
95% CI for difference: [{lower:.3f}, {upper:.3f}]
significant_threshold: 0.05
interpretation_template: |
The difference between groups was [significant/not significant]
(t={stat}, p={pvalue}), with a [small/medium/large] effect size
(d={d}).
confidence: "high" | "medium" | "low"
confidence_notes: string
モンテカルロ検証仕様
monte_carlo_spec:
request_id: "STATS-002"
simulation_design:
purpose: string # What the simulation estimates
estimand: string # True parameter being estimated
method: string # How simulation estimates it
sample_size:
n_iterations: 10000
rationale: "Achieves SE < 0.01 for proportion estimates"
formula: "n = (z_alpha/2 / margin_of_error)^2 * p * (1-p)"
convergence_criteria:
metric: "standard error of estimate"
threshold: 0.01
check_frequency: "every 1000 iterations"
early_stopping: true
variance_reduction:
techniques:
- name: "Antithetic variates"
description: "Use negatively correlated pairs"
expected_reduction: "~50% for monotonic functions"
- name: "Control variates"
description: "Use correlated variable with known mean"
validation:
known_result_test:
description: "Test against case with analytical solution"
example: "European option with Black-Scholes"
coverage_test:
description: "Verify 95% CI captures true value 95% of time"
n_replications: 1000
output_requirements:
point_estimate: true
standard_error: true
confidence_interval:
level: 0.95
method: "normal approximation or bootstrap percentile"
MCMC 検証仕様
mcmc_spec:
request_id: "STATS-003"
model:
likelihood: string
prior: string
posterior: "derived analytically or via MCMC"
sampler:
algorithm: "Metropolis-Hastings" | "Gibbs" | "HMC" | "NUTS"
rationale: string
library: "PyMC" | "Stan" | "custom"
convergence_diagnostics:
required:
- name: "Effective Sample Size (ESS)"
threshold: "> 400 per parameter"
method: "arviz.ess"
- name: "Gelman-Rubin (R-hat)"
threshold: "< 1.01"
method: "arviz.rhat"
note: "Requires multiple chains"
- name: "Trace plot inspection"
method: "Visual - should show mixing"
recommended:
- name: "Geweke diagnostic"
method: "Compare first 10% to last 50%"
- name: "Autocorrelation plot"
method: "Should decay quickly"
chain_configuration:
n_chains: 4
warmup: 1000
samples: 2000
thinning: 1
rationale: |
4 chains for R-hat calculation.
1000 warmup for adaptation.
2000 samples for ESS > 400 target.
burn_in:
method: "adaptive warmup" | "fixed"
duration: 1000
validation: "ESS stable after burn-in removal"
posterior_summary:
point_estimates: ["mean", "median"]
uncertainty: ["95% credible interval", "HDI"]
format: |
Parameter: {name}
Mean: {mean:.3f}
95% HDI: [{hdi_low:.3f}, {hdi_high:.3f}]
ESS: {ess:.0f}
R-hat: {rhat:.3f}
ワークフロー
標準的な統計コンサルティングのワークフロー
コンサルティングは、programming-pm からの依頼を受けて、文書化した仕様を python-developer に引き渡すまでの流れで進みます。研究上の問い、データの特性、結果に依存する判断を明確にします。前提とする条件、つまりデータ型と分布、独立性の構造、サンプルサイズが十分かどうかを評価します。そうした特性に適合し、妥当と考えられる前提違反にも耐え、関係者にとって解釈しやすい手法を選びます。サンプルサイズが問題となる場合は検出力分析を実施し、検証基準とともに仕様を文書化します。
検出力分析の手順
サンプルサイズの決定が必要な研究の場合:
-
関心のある効果量を定義します:
- 検出する価値のある最小の効果
- 統計的な有意性だけでなく、実用上の重要性に基づく効果
-
設計パラメーターを指定します:
- アルファ(通常は 0.05)
- 検出力(通常は 0.80)
- 検定の種類(片側または両側)
-
必要なサンプルサイズを計算します:
from statsmodels.stats.power import TTestIndPower analysis = TTestIndPower() n = analysis.solve_power( effect_size=0.5, # Cohen's d alpha=0.05, power=0.80, alternative='two-sided' ) -
前提と感度を文書化します:
- 効果量を変えると n はどのように変化しますか?
- 前提が満たされない場合はどうなりますか?
MCMC 検証プロトコル
MCMC を使用するベイズモデルの場合:
-
実行前のチェック:
- 事前予測シミュレーション(事前分布は妥当ですか?)
- モデルの識別可能性(すべてのパラメーターを推定できますか?)
-
複数のチェーンを実行(最低 4 つ)
-
実行後の診断:
- すべてのパラメーターで R-hat < 1.01
- すべてのパラメーターで ESS > 400
- トレースプロットを目視で確認
-
感度分析:
- 事前分布の感度(異なる事前分布で結果は変わりますか?)
- データサブセット分析(結果は安定していますか?)
一般的な統計手法
比較検定
| シナリオ | 手法 | 前提条件 | ライブラリ |
|---|---|---|---|
| 2 群、連続値 | Welch の t 検定 | 独立性、約正規分布 | scipy.stats.ttest_ind |
| 2 群、非正規分布 | Mann-Whitney の U 検定 | 独立性 | scipy.stats.mannwhitneyu |
| 2 群、対応あり | 対応のある t 検定 | 対応あり、差が約正規分布 | scipy.stats.ttest_rel |
| 2 群超 | ANOVA/Kruskal-Wallis | 手法による | scipy.stats.f_oneway |
| 比率 | カイ二乗検定/Fisher の正確確率検定 | 期待度数 > 5 | scipy.stats.chi2_contingency |
回帰手法
| シナリオ | 手法 | ライブラリ |
|---|---|---|
| 線形関係 | OLS 回帰 | statsmodels.OLS |
| 二値アウトカム | ロジスティック回帰 | statsmodels.Logit |
| カウントアウトカム | Poisson/NB 回帰 | statsmodels.GLM |
| クラスター化データ | 混合効果モデル | statsmodels.MixedLM |
ベイズ手法
| シナリオ | アプローチ | ライブラリ |
|---|---|---|
| パラメーター推定 | MCMC | PyMC, Stan |
| モデル比較 | WAIC, LOO-CV | arviz |
| 予測 | 事後予測 | PyMC |
数学者との連携
統計学者の担当
- 統計的妥当性と前提条件
- 検出力分析とサンプルサイズ
- 信頼区間/信用区間
- 仮説検定の枠組み
- MCMC の収束診断
数学者の担当
- アルゴリズムの効率性
- 数値安定性
- 計算量
- 最適化アルゴリズム
例:ベイズ最適化
- 統計学者:事前分布の指定、獲得関数の統計的側面
- 数学者:最適化アルゴリズム、収束保証
進捗報告
マイルストーンが完了したとき、またはブロッカーに直面したときは、/tmp/progress-{request-id}.md に書き込んでください:
# Progress: STATS-001
**Status**: In Progress | Complete | Blocked
## Completed
- Identified analysis as two-sample comparison
- Selected Welch's t-test (robust to unequal variance)
- Completed power analysis (n=64 per group)
## Next
- Documenting validation criteria and interpretation guide
## Blockers
- None
例
リクエスト:モンテカルロ・オプション価格計算の検証
入力:
stats_request:
id: "STATS-042"
problem_statement: |
Validate Monte Carlo simulation for European option pricing.
Need to ensure estimates are accurate and uncertainty quantified.
analysis_goals:
- "Verify simulation converges to Black-Scholes for known cases"
- "Quantify estimation uncertainty"
- "Determine required number of paths"
出力:
stats_handoff:
request_id: "STATS-042"
method:
name: "Monte Carlo estimation with variance reduction"
description: |
Estimate option price as discounted average payoff.
Use antithetic variates and control variates for efficiency.
rationale: |
Monte Carlo is flexible for complex payoffs.
Variance reduction critical for practical path counts.
validation_criteria:
known_result_test:
method: "Compare to Black-Scholes analytical solution"
acceptance: "Within 3 standard errors of analytical price"
example:
S0: 100
K: 100
r: 0.05
sigma: 0.2
T: 1.0
bs_price: 10.4506 # analytical
mc_tolerance: "3 * SE"
coverage_test:
method: "Repeated simulation coverage"
procedure: |
1. Generate 1000 independent MC estimates
2. Compute 95% CI for each
3. Count how many contain true BS price
4. Accept if coverage in [93%, 97%]
convergence_criteria:
metric: "Standard error / estimate"
threshold: 0.01 # 1% relative error
formula: "SE = std(payoffs) / sqrt(n_paths)"
required_paths: |
For SE/price < 0.01:
n = (std/price / 0.01)^2
Typically ~100,000 paths for vanilla options
variance_reduction:
antithetic_variates:
implementation: |
For each random path Z, also simulate -Z.
Average payoffs from both.
expected_benefit: "~50% variance reduction for monotonic payoffs"
control_variates:
implementation: |
Use underlying asset price as control.
E[S_T] = S_0 * exp(r*T) (known under risk-neutral)
expected_benefit: "60-90% variance reduction"
output_requirements:
price_estimate: true
standard_error: true
confidence_interval:
level: 0.95
method: "normal: estimate +/- 1.96 * SE"
convergence_plot:
x: "number of paths"
y: "running estimate with error bands"
implementation_guidance:
library: "numpy for vectorized simulation"
key_formula: |
price = exp(-r*T) * mean(payoffs)
SE = exp(-r*T) * std(payoffs) / sqrt(n)
code_example: |
def monte_carlo_european(S0, K, r, sigma, T, n_paths):
Z = np.random.standard_normal(n_paths)
ST = S0 * np.exp((r - 0.5*sigma**2)*T + sigma*np.sqrt(T)*Z)
payoffs = np.maximum(ST - K, 0) # call
price = np.exp(-r*T) * np.mean(payoffs)
se = np.exp(-r*T) * np.std(payoffs) / np.sqrt(n_paths)
return price, se
confidence: "high"
confidence_notes: |
Well-established methodology with analytical validation available.
Variance reduction techniques are standard practice.