Claude Media
Claudeでサンプルサイズと検出力を計算する — 前提を明記させる手順

Claudeでサンプルサイズと検出力を計算する — 前提を明記させる手順

実験や試験の必要人数を、有意水準・検出力・効果量からClaudeのコード実行で算出する手順です。両側か片側か、標準偏差をどう見積もったかを、答えと一緒に書かせます。

サンプルサイズの計算は、数式よりも前提の置き方で答えが変わります。有意水準5%、検出力80%、差が5点、ばらつきが12点なら、2群のt検定で必要なのは1群あたり92人です。ばらつきを15点と見積もり直すと143人になります。Claudeのコード実行は、この計算を数秒で回せます。ただし「何人必要ですか」とだけ聞くと、どの前提で出した数字なのかが答えに残りません。この記事では、前提を先に固定し、コードと前提を一緒に返させる頼み方を示します。

先に決める前提は7つある

必要人数を求める式は、有意水準、検出力、効果量、検定の種類が決まれば機械的に解けます。人が決めるのは、その入力に何を置くかです。次の表の項目が一つでも抜けると、Claudeは黙って既定値で埋めます。

項目置き方の例抜けたときに起きること
有意水準置き方の例5%抜けたときに起きること慣例の値が使われるが、記録に残らない
検出力置き方の例80%抜けたときに起きること90%を求める分野で人数が足りなくなる
想定する差置き方の例平均で5点抜けたときに起きること効果量が決まらず計算できない
ばらつき置き方の例標準偏差12点抜けたときに起きること効果量が過大になり、人数が少なく出る
両側か片側か置き方の例両側抜けたときに起きること片側の人数が出て、逆向きの差を検出できない
検定の種類置き方の例独立2群のt検定抜けたときに起きること対応あり・3群以上と取り違える
群の比率と脱落置き方の例1対1、脱落10%を見込む抜けたときに起きること解析対象が計算より減る

効果量は「差を標準偏差で割った値」(標準化した効果量、Cohenのd)です。差5点、標準偏差12点なら約0.42になります。差だけ、またはばらつきだけを渡しても効果量は決まりません。

Claudeに渡す依頼文の型

前提を表の形で渡し、回答の形式も指定します。自由記述で「検出力80%くらいで」と書くより、項目名と値を並べるほうが抜けを防げます。

次の条件で、必要サンプルサイズをPythonのコード実行で計算してください。
 
- 検定: 独立2群のt検定(等分散を仮定)
- 有意水準: 0.05、両側
- 検出力: 0.80
- 想定する差: 平均で5点
- 標準偏差: 12点(先行研究の値。出典は私が持っています)
- 群の比率: 1対1
- 脱落: 10%を見込む
 
回答には次を含めてください。
1. 使ったコード全文(statsmodelsのクラス名と引数)
2. 効果量の計算式と値
3. 1群あたりの人数(切り上げ後)と、脱落を見込んだ募集人数
4. 前提のうち、私が指定せずあなたが置いたものがあれば一覧

4番が効きます。Claudeが既定値で補った項目を自己申告させると、渡し忘れが見つかります。標準偏差の出典欄は、後の節で扱う「ばらつきの見積り」を人が持つための置き場所です。

独立2群のt検定で必要数を出す

コード実行ツールのサンドボックスには、Python 3.11と、pandas、numpy、scipy、statsmodelsが最初から入っています。実行環境はインターネットに出られないので、追加のインストールはできません。この計算は標準のライブラリだけで完結します。

返ってくるコードは、次のような形になります(statsmodelsのドキュメントにあるクラスと引数に沿った例です)。

import math
from statsmodels.stats.power import TTestIndPower
 
diff, sd = 5, 12
effect = diff / sd          # 標準化した効果量 = 0.4167
 
n = TTestIndPower().solve_power(
    effect_size=effect,
    alpha=0.05,
    power=0.80,
    ratio=1.0,
    alternative="two-sided",
)
n_per_group = math.ceil(n)  # 91.39 -> 92
recruit = math.ceil(n_per_group / (1 - 0.10))  # 脱落10%を見込む
 
print(f"効果量 d = {effect:.3f}")
print(f"1群あたり {n_per_group} 人(計 {2 * n_per_group} 人)")
print(f"脱落10%を見込む募集: 1群 {recruit} 人")

solve_power は、effect_size、nobs1、alpha、power のうち値を渡さなかった一つを解いて返します。人数を求めたいので nobs1 を省いています。ここで押さえる点が3つあります。

  • 人数は小数で返るので、切り上げます。四捨五入すると検出力が目標を割ることがあります
  • ratio は2群目の人数を1群目の何倍にするかです。既定は1です
  • alternative の既定は両側です。片側にするときは "larger" か "smaller" を明示します

手元でstatsmodels 0.15.0を使って確かめた結果は、91.39人、切り上げて1群92人でした。脱落10%を見込むと、1群あたりの募集は103人です。

設計によって人数はどう変わるか

同じ効果量でも、片側か対応ありかで必要数は大きく動きます。効果量0.5(中程度)、有意水準5%、検出力80%で並べると次のとおりです。手元で同じ条件を実行した値です。

設計使うクラス必要数
独立2群、両側使うクラスTTestIndPower必要数1群64人
独立2群、片側使うクラスTTestIndPower(alternative="larger")必要数1群51人
対応あり(同じ人の前後)使うクラスTTestPower必要数34人
3群の分散分析(f = 0.25)使うクラスFTestAnovaPower(k_groups=3)必要数計158人

片側にすると人数は減りますが、逆向きの差は検出できません。「効果が悪化する可能性は考えない」と実験前に言い切れるときだけの選択肢です。後から人数を減らす目的で片側に切り替えるのは、前提の置き換えです。

対応ありの検定では、効果量の分母が「個人ごとの差の標準偏差」になります。群ごとの標準偏差をそのまま使うと、効果量を取り違えます。依頼文にも「差の標準偏差」と書いておくと安全です。

分散分析の効果量はCohenのfで、statsmodelsのドキュメントはこの引数を「サンプルサイズ、観測数」としか説明していません。手元の実行では、返ってくる nobs は全群の合計でした。157.19を切り上げて158人、1群あたり約53人です。群ごとの人数と取り違えると、募集が3分の1になります。群数で割って切り上げるところまで、Claudeに書かせてください。

実験計画法で因子を組み合わせる場合の分析は、Claudeで実験計画法の直交表を組み、分散分析まで進める手順が扱っています。本記事の分散分析の人数は、1因子の群間比較の目安です。

群の人数比が1対1でないときと、等分散を仮定しないとき

治療群を厚くしたい、対照群は集めにくいといった事情で、群の人数比を変える場合があります。依頼文の「群の比率」を ratio に渡すと、2群目の人数が1群目の何倍かを指定できます。同じ検出力を保つなら、比率を偏らせるほど総数は増えます。正規近似で見積もると、2対1にした場合の総数は1対1のおよそ1.1倍です。この倍率は近似の目安で、手元で実行した値ではありません。正確な人数は、Claudeに ratio=2.0 で実行させて確かめます。

もう一つの前提が、群ごとの標準偏差が等しいかどうかです。TTestIndPower は、2群で共通の標準偏差を置く等分散のt検定を前提にしています。解析でWelchのt検定を使う予定なら、人数の計算も同じ前提に揃えたほうが整合します。群ごとに標準偏差が違うと見込んでいるときは、依頼文に「群Aの標準偏差は◯点、群Bは◯点」と書き、後の「計算結果を別の方法で確かめる」で示す乱数による検算で、Welchの検定を使って検出力を確かめさせます。

ばらつきの見積りが3点ずれると人数は5割増える

入力のうち、最も外れやすいのは標準偏差です。差5点で標準偏差を12点と置くと92人、15点と置くと143人です。見積りが3点ずれただけで、人数は約1.55倍、5割以上増えます。

標準偏差の置き場所は、強い順におおむね次の三つです。

  1. 同じ測定を過去に行った自分たちのデータ
  2. 先行研究や過去の報告書に載っている値
  3. 小規模な予備試験で得た値

予備試験の標準偏差は、人数が少ないほど不安定です。見積りに幅があるなら、標準偏差を複数の値で振って、人数の一覧を出させます。

標準偏差を10、12、15、18点の4通りに振り、差5点・有意水準5%・
検出力80%・両側での1群あたりの必要数を表にしてください。

最悪ケースの人数まで確保できるか、確保できないなら何を諦めるか。判断は人が行い、Claudeは表を作るところまでを受け持ちます。

人数が決まっているときは検出力を逆算する

現実には、募集できる人数が先に決まっていることが多くあります。その場合は人数を固定し、検出力を求めます。power を省くだけです。

from statsmodels.stats.power import TTestIndPower
 
p = TTestIndPower()
for n in [20, 40, 60, 92, 120]:
    pw = p.power(effect_size=5/12, nobs1=n, alpha=0.05)
    print(n, round(pw, 3))

差5点・標準偏差12点で手元の結果を並べると、1群20人で0.25、40人で0.45、60人で0.62、92人で0.80、120人で0.90でした。1群40人で試験を組むと、本当に5点の差があっても、半分以上の確率で有意差が出ません。この表を実験の前に見ておくと、「差が出なかった」の意味が変わります。

計算結果を別の方法で確かめる

解析的な計算は、モンテカルロ・シミュレーションで検算できます。「想定した差のある集団から乱数で2群を作り、検定を2万回繰り返したときに、有意になった割合」が検出力です。

import numpy as np
from scipy import stats
 
rng = np.random.default_rng(1)
n, sd, diff, trials = 92, 12, 5, 20000
hits = 0
for _ in range(trials):
    a = rng.normal(0, sd, n)
    b = rng.normal(diff, sd, n)
    hits += stats.ttest_ind(a, b).pvalue < 0.05
print(hits / trials)

手元では0.79985になり、解析解の0.80と一致しました。この方法は、前提を取り違えたときにも役立ちます。実際の標準偏差が15点だったと仮定して同じ92人で回すと、検出力は0.62まで落ちました。見積りが外れた場合の影響を、人数の表より直感的に示せます。

分布が正規でない、外れ値が多いといった場合は、解析解が使えません。乱数の生成部分を実際のデータに近い分布へ差し替えれば、同じ枠組みで人数を探せます。

研究計画書や審査書類に書く項目

人数の根拠は、計画書や倫理審査の書類に書くことが多い項目です。依頼文の前提一覧から、そのまま転記できる形で返させておくと、後から書き直す手間が減ります。

  • 有意水準と、両側か片側か
  • 検出力
  • 想定する差と標準偏差、およびその出典
  • 効果量(Cohenのd)の値
  • 検定の種類と、使った統計ソフトの名前とバージョン
  • 算出した人数と、脱落率を見込んだ募集人数

最後のバージョンはコード実行の出力に含まれないため、statsmodels.__version__ を出力させる一行を依頼文に足しておきます。

計算を頼むときに踏みやすい落とし穴

落とし穴

結果を見てから効果量を決めてしまう

実験後に出た差を「想定した差」として検出力を計算し直すと、有意でなかった結果は必ず低い検出力になります。事後に計算した検出力は、p値から機械的に決まるだけで、新しい情報を持ちません。効果量は実験の前に、実務上意味のある最小の差として決めます。

  • Claudeが暗算で答える: 簡単な算術や広く知られた数学の事実にはコードを使わず答える、とドキュメントにあります。検出力の計算は非自明な計算ですが、確実に実行させたいなら「コード実行で計算して」と明記します
  • 多重比較を忘れる: 3群以上で全ペアを検定するなら、有意水準を補正した人数が要ります。分散分析の人数をそのまま使うと、ペアごとの検出力は目標を下回ります。補正の方法を依頼文に書いてください
  • 脱落を忘れる: 計算で出る人数は、解析に使えるデータの数です。募集人数は脱落率で割り戻して決めます
  • ばらつきの出典を残さない: 数字だけを覚えていて根拠を失うと、後から人数の妥当性を説明できません。前提の一覧に出典を添えます

割合を比べる検定(クリック率やコンバージョン率)の人数は、標準偏差ではなく基準の割合から決まります。LPや広告の比較は、ClaudeにA/Bテストの有意差を検定させる手順にまとまっています。

APIから呼ぶときの設定と課金

Web版のClaudeではなく、APIで同じ計算を自動化するなら、リクエストにコード実行ツールを加えます。

import anthropic
 
client = anthropic.Anthropic()
response = client.messages.create(
    model="claude-sonnet-5-5",
    max_tokens=4096,
    messages=[{
        "role": "user",
        "content": "コード実行で必要サンプルサイズを計算してください。"
                   "条件: 独立2群のt検定、両側、alpha 0.05、"
                   "検出力0.80、差5、標準偏差12。",
    }],
    tools=[{"type": "code_execution_20260521", "name": "code_execution"}],
)

ツールの種類は code_execution_20250825、code_execution_20260120、code_execution_20260521 の3つがあり、どれも追加のベータヘッダーを必要としません。コード実行はサーバー側で走るので、tool_result を自分で返す処理は要りません。

課金は、Web検索やWeb取得ツールと併用しない場合、実行時間で測られます。最小は5分、組織あたり月1,550時間までは無料で、超過分は1コンテナ1時間あたり0.05ドルです。数秒で終わる検出力の計算は、無料枠に収まります。条件の詳細はコード実行ツールが無料になる条件で整理しています。

コンテナを引き継ぐと、前のリクエストで作ったファイルが残ります。標準偏差を変えて計算し直すときは、コンテナIDを渡して再実行できます。コンテナの有効期間は作成から30日です。

まとめ

Claudeに必要人数を計算させるときは、有意水準、検出力、差、標準偏差、両側か片側か、検定の種類、脱落の7項目を先に決め、コードと前提を一緒に返させます。標準偏差は人数を最も大きく動かすので、1点に決め打ちせず幅で振り、検出力を逆算した表も添えると判断材料が揃います。解析解は乱数の検算で裏を取れます。計算は数秒で終わるため、前提を変えた再計算を惜しまないことが、この作業をClaudeに任せる最大の利点です。

統計値そのものを生データと照合したい場合は、Claudeで論文の統計値を生データと照合して検証するも参考になります。

この記事を共有:XはてブLinkedIn