Claudeで実験計画法の直交表を組み、分散分析まで進める手順
因子と水準の洗い出し、L8直交表への割付、割付の検算、コード実行での分散分析までをClaudeと進める手順。誤差列の中身を見る確認点つき。
実験計画法は、試したい条件の組み合わせを全部は回さず、直交表で選んだ少数の実験から各因子の効き方を読み取る方法です。Claudeに任せられるのは、因子と水準の整理、直交表への割付、そしてコード実行による分散分析の計算です。任せてはいけないのは、割付が直交しているかの確認を省くことです。この記事では4因子2水準のL8直交表を例に、割付から分散分析までを順に進め、検算の置きどころを示します。
Claudeに任せる範囲と、人が握る範囲
直交表の実験は「何を振るか」「どう割り付けるか」「出た数字をどう読むか」の3段階です。Claudeが速いのは2段目と3段目の作業で、1段目は現場を知る人にしか決められません。
工程ごとの分担
人が決める
因子の候補、水準の幅、測る特性(強度、歩留まり、所要時間など)と、その良し悪しの向き。
Claudeに任せる
候補の整理と抜け漏れの指摘、直交表への割付、実験順序の並べ替え、分散分析のコード作成と実行。
コードで確かめる
割付の直交性、分散分析の平方和の合計、誤差列の中身。Claudeの文章での説明は検算の代わりになりません。
計算を任せる際は、コード実行が有効な環境で「実行して」と明示します。Claudeが計算や表の処理でコードを走らせるのは、複雑な計算やデータ分析、明示的に「実行して」と頼まれた場面です。簡単な算術は実行せずに答えることもあるため、平方和のような手順の多い計算は実行を指定しておくと取りこぼしがありません。
因子と水準を洗い出す
最初の依頼は、直交表を出させる前に、因子の整理だけを頼みます。ここで条件が曖昧なまま直交表に進むと、割付が正しくても実験そのものが使えません。
接着剤の接着強度を上げる実験を計画します。
目的特性は引張強度(N、大きいほど良い)です。
候補の因子は、硬化温度、圧着時間、圧着圧力、硬化剤の量、
接着面の粗さ、室温です。
実験は8回まで回せます。
1. 制御できる因子とできない因子に分けてください。
2. 8回で調べられる因子の数を、直交表の種類と一緒に答えてください。
3. 因子ごとに、水準の幅を決めるために私に確認すべきことを
質問の形で挙げてください。この例では、室温は制御できない因子として外し、粗さも固定します。残るのは次の4因子です。
| 因子 | 第1水準 | 第2水準 |
|---|---|---|
| 硬化温度 | 第1水準150℃ | 第2水準180℃ |
| 圧着時間 | 第1水準10秒 | 第2水準20秒 |
| 圧着圧力 | 第1水準低 | 第2水準高 |
| 硬化剤の量 | 第1水準少 | 第2水準多 |
水準の値は、実際に作業で振れる幅で決めます。幅を狭くしすぎると差が誤差に埋もれ、広くしすぎると現場で使えない条件で効果を測ることになります。なお以降の測定値は、手順を追うために用意した架空のデータです。
8回で4因子を回すL8への割付
2水準の因子が最大7つまで入るのがL8直交表です。8回の実験で、各因子の第1水準と第2水準が4回ずつ現れます。列は1から7まであり、列の番号によって交互作用が現れる場所が決まっています。
2水準系のL8では、次の関係が成り立ちます。
- 3列目は1列目と2列目の交互作用
- 5列目は1列目と4列目の交互作用
- 6列目は2列目と4列目の交互作用
- 7列目は1・2・4列目の3因子の交互作用
そこで基本列の1・2・4列に主要な因子を置き、3・5・6列は交互作用用に空けておくのが定石です。ただし今回は8回で4因子を調べるので、4つ目の因子を7列目に置きます。7列目は3因子の交互作用と区別がつきませんが、3因子の交互作用は小さいと見なして割り切ります。
| 列 | 割付 |
|---|---|
| 1列 | 割付硬化温度 |
| 2列 | 割付圧着時間 |
| 4列 | 割付圧着圧力 |
| 7列 | 割付硬化剤の量 |
| 3列 | 割付誤差(温度×時間と、圧力×硬化剤の交互作用が混ざる) |
| 5列 | 割付誤差(温度×圧力と、時間×硬化剤の交互作用が混ざる) |
| 6列 | 割付誤差(時間×圧力と、温度×硬化剤の交互作用が混ざる) |
Claudeに頼むときは、列の割付を自分で決めたうえで、直交表そのものを出させます。
L8(2^7)直交表を、水準を1と2で表した8行7列の配列で出してください。
その上で、1列に硬化温度、2列に圧着時間、4列に圧着圧力、
7列に硬化剤の量を割り付けた実験条件表(8行)にしてください。
3・5・6列は誤差として空けます。割付ミスを検算する
Claudeが出した直交表は、そのまま信じず、コードで確かめます。確認する性質は一つで、どの2列を取っても、水準の組み合わせが同じ回数ずつ現れることです。L8なら2列の4通りの組み合わせが、それぞれ2回ずつ現れます。
import numpy as np
import pandas as pd
def orthogonal_check(a):
bad = []
for i in range(a.shape[1]):
for j in range(i + 1, a.shape[1]):
counts = pd.crosstab(a[:, i], a[:, j]).values
if counts.min() != counts.max():
bad.append((i + 1, j + 1))
return bad # 空リストなら全列ペアが直交
# L8(2^7): 列kは、行番号と k のビットごとの積の偶奇で水準を決める
L8 = np.array([[bin(r & k).count("1") % 2 + 1 for k in range(1, 8)]
for r in range(8)])
print(orthogonal_check(L8))正しいL8とL9(3水準4因子の直交表)で試すと、どちらも空リストになります。一方、L9の最終行の最後の2つの値を書き換えて水準を誤ると、列4を含むペアがすべて崩れ、[(1, 4), (2, 4), (3, 4)]が返ります。1か所の書き間違いでも、検査が漏らさず拾います。
落とし穴
Claudeが書いた直交表を検算せずに実験を始める
直交表は規則的な配列なので、一見して正しそうに見えます。1つの水準が入れ替わっただけでも、特定の2因子が分離できなくなり、分散分析の結果が意味を失います。実験の前に、必ず上の検算を実行させます。
もう一つ、列ごとの水準の数も数えます。各列で第1水準と第2水準がそれぞれ4回出ていなければ、列のバランスが崩れています。
実験を回して、結果をコード実行で分散分析する
検算が通ったら実験に進みます。実験の順序は、時間による影響(機器の温まりや材料のロット差)が特定の因子に偏らないよう、ランダムに並べ替えるのが基本です。Claudeには「行の実行順をランダムにし、乱数のシードを記録して」と頼むと、再現できる並べ方になります。
8回の測定値を表に戻したら、次の形で分散分析を依頼します。
添付した表(因子4列と引張強度)を、4因子の主効果で分散分析してください。
コードを実行して、分散分析表(自由度、平方和、平均平方、F値、p値)と、
因子ごとの水準別平均、平方和の合計に対する各因子の寄与率を出してください。内部では、例えば次のようなコードが走ります。
import statsmodels.api as sm
from statsmodels.formula.api import ols
m = ols("y ~ C(temp) + C(time) + C(press) + C(dose)", df).fit()
print(sm.stats.anova_lm(m, typ=1).round(3))用意した架空データで実際に実行すると、次の分散分析表が得られます。
| 因子 | 自由度 | 平方和 | F値 | p値 |
|---|---|---|---|---|
| 硬化温度 | 自由度1 | 平方和317.520 | F値22.463 | p値0.018 |
| 圧着時間 | 自由度1 | 平方和0.005 | F値0.000 | p値0.986 |
| 圧着圧力 | 自由度1 | 平方和190.125 | F値13.451 | p値0.035 |
| 硬化剤の量 | 自由度1 | 平方和0.500 | F値0.035 | p値0.863 |
| 誤差 | 自由度3 | 平方和42.405 | F値 | p値 |
平方和の合計は550.555です。水準別平均を見ると、硬化温度は150℃で44.92、180℃で57.53、圧着圧力は低で46.35、高で56.10になります。この表で寄与率を出すと、温度が約58%、圧力が約35%です。時間と硬化剤は、ほぼ0%です。
statsmodelsのような統計ライブラリが使えるかは、実行環境によります。APIのコード実行ツールのコンテナには、pandas、numpy、scipy、scikit-learn、statsmodelsが入っています。Pythonは3.11で、インターネット接続はなく、追加のパッケージは入れられません。メモリは5GiB、CPUは1つなので、8行の分散分析には十分すぎる環境です。
誤差の中身を確かめてから結論を出す
分散分析で「時間は効かない」と読む前に、誤差の3自由度に何が入っているかを確かめます。L8に4因子を置いた設計では、誤差は3・5・6列です。4因子目を7列に置いたため、各列には2つの2因子交互作用が対になって混ざります。列ごとの平方和を出すと、次のとおりです。
| 列 | 混ざっている交互作用 | 平方和 |
|---|---|---|
| 3列 | 混ざっている交互作用温度×時間 / 圧力×硬化剤 | 平方和0.500 |
| 5列 | 混ざっている交互作用温度×圧力 / 時間×硬化剤 | 平方和0.500 |
| 6列 | 混ざっている交互作用時間×圧力 / 温度×硬化剤 | 平方和41.405 |
誤差の平方和42.405のうち41.405が6列に集中しています。6列には時間×圧力と温度×硬化剤の交互作用が重なっており、この設計の実験だけでは、どちらが効いているかを分けられません。誤差が3つの列に均等に散っていれば、ただのばらつきと読めます。1列に偏っている場合は、ばらつきではなく交互作用が効いている疑いがあります。
この例なら、次の判断になります。
- 圧着時間は主効果が見えないが、圧力との組み合わせでは効いている可能性がある。ただし6列の偏りは、温度×硬化剤の交互作用でもありうる
- 誤差に交互作用が混ざっているので、主効果のp値は、交互作用がないと仮定した値として読む
- 結論は「時間は不要」ではなく、「6列に交絡する2つの交互作用(時間×圧力 / 温度×硬化剤)を分離する追加実験をする」になる
この段階で、Claudeには次のように依頼します。
誤差の3自由度を、3列・5列・6列に分解して平方和を出してください。
1列に偏っているなら、どの交互作用に当たるかを、交絡する相手も含めて指摘してください。確認実験までの流れ
- 1
平方和の合計を照合する
主効果と誤差の平方和を足して、全体の平方和と一致するか見ます。一致しなければ、データの入力ミスか、行と水準の対応のずれです。
- 2
誤差列の偏りを見る
偏りがあれば、交互作用を疑います。
- 3
最適条件を予測する
効いた因子の良い水準を組み合わせて、予測値を計算します。この例なら、温度180℃と圧力を高にした条件です。
- 4
確認実験で予測を検証する
予測した条件で実際に何回か測り、予測値と近いかを見ます。ここが外れるなら、交互作用が残っています。
実験をClaudeに続けて頼むときの設定
分散分析は一度で終わらず、確認実験や追加の割付で往復します。Web版のClaudeでは、コード実行とファイル作成はFree、Pro、Maxの各プランで既定で有効です。切り替えは設定のCapabilitiesからできます。TeamとEnterpriseも組織の既定で有効で、組織のオーナーが無効にできます。TeamとEnterpriseでネットワークアクセスが切られていても、pandasやstatsmodelsのような事前に入っているライブラリだけで、この記事の分析は完結します。
API側では、コンテナIDを次のリクエストに渡すと、前に作ったファイルを引き継げます。コンテナの有効期間は作成から30日です。コード実行の課金は、Web検索やWeb取得ツールと一緒に使わない場合、実行時間で測られ、組織あたり月1,550時間までは無料です。8行の分散分析は、この無料枠に収まります。
Claude Codeを使うなら、手元の環境にstatsmodelsを入れて分析スクリプトをファイルとして残せます。測定値のCSVを渡して集計する基本は、Claude CSV分析の使い方にまとまっています。モデル評価の誤差の読み方は、Claudeの精度差を誤差込みで読む方法が別の角度から扱っています。実験結果を機械学習の実験管理ツールから読み出す手順は、wandb MCPサーバーの手順です。
L9で3水準を扱うときの違い
3水準の因子を含む場合はL9(3水準4因子)が候補になります。9回の実験で、各因子の水準が3回ずつ現れます。2水準のL8と違うのは、交互作用の取り扱いです。L9は4列すべてに因子を置くと誤差の自由度が0になり、F検定ができません。9回の実験の自由度は8で、4因子の主効果が各2自由度、合計8自由度を使い切るためです。
この場合は、平方和が小さい因子を誤差にまとめる(プーリング)か、実験を繰り返して誤差を作ります。Claudeには「F値が小さい因子を誤差にプールした分散分析表を、プール前と並べて出して」と頼めます。プールする因子は、先に基準を決めておきます。結果を見てから都合のいい因子だけ誤差に混ぜると、有意な因子を作ってしまうためです。
まとめ
Claudeは直交表の割付と分散分析の計算を速く進めますが、設計の正しさは人がコードで確かめて初めて保証されます。実験の前に直交性を検算し、実験の後は誤差列の中身を見て、結論の言い方を決めます。「時間は効かない」と言い切る前に、誤差列に平方和が偏っていないか、偏っていれば交絡する相手が誰かを見る、というのがこの記事の例の教訓です。