ブログのトップページを変え、一週間後に「トップページから記事をクリックした訪問の割合」が上がったとします。改修は成功だと思い、流入元別に見ると、メールからの訪問も検索からの訪問も悪化していました。各群が下がっているのに、全体はなぜ良くなるのでしょう。どちらの表を信じればよいのでしょうか。

こうした逆転は、一般にシンプソンのパラドックスと呼ばれます。集計したデータと群に分けたデータで、関連の向きが逆になることがあります。算術の規則は破られていません。異なる問いへの答えを、同じ結論だと扱うと解釈を誤ります。Judea Pearl:Understanding Simpson’s Paradox

以下はすべて、私が作った教材用のデータです。谷米の実際のアクセス解析でも、実際の改修結果でもありません。 まず計数を確かめ、ダウンロードできる Python スクリプトで流入元の重みを固定します。その後、この計算で説明できることと証明できないことを整理します。「平均は信用できない」という一言ではなく、レポートを点検する方法を得るのが目的です。

1. 分子、分母、群を先に定義する

この記事の観察単位は、トップページへの一回の訪問です。その訪問が少なくとも一つの記事をクリックしたら成功と数えます。三記事をクリックしても、一回の成功です。分子は「記事をクリックした訪問数」、分母は「トップページの訪問数」です。クリックイベント総数を訪問者数で割った値でも、個別の読者を単位とする割合でもありません。

重みの問題に集中するため、例では互いに重ならず、すべての訪問を含む二つの流入元だけを使います。メールニュースレター newsletter と検索 search です。両期間で分類と成功の定義を揃え、観察期間の長さも同じにします。実際には直接流入、SNS、流入元不明などもあり、その場合は全分類を残す必要があります。説明しづらいアクセスを消してはいけません。ここでの流入元は単なる名前で、メール読者が必ず積極的という意味ではありません。

期間流入元トップページ訪問記事をクリックした訪問群内の割合当期訪問に占める重み
前期ニュースレター1005050%20%
前期検索4004010%80%
後期ニュースレター40016040%80%
後期検索10055%20%

ニュースレターの群内割合は 10 パーセントポイント、検索は 5 パーセントポイント下がりました。しかし前期の 500 訪問に対する成功は 90 で、全体は 90 / 500 = 18% です。後期も 500 訪問ですが成功は 165 で、全体は 165 / 500 = 33% です。両群の割合が下がっても、集計した割合は 15 パーセントポイント上がりました。

クリックした訪問数と割合も、別の情報を示します。ニュースレターの成功数が 50 から 160 に増えても、一回の訪問がクリックしやすくなったとは限りません。この群の訪問数は四倍になっています。規模の変化と訪問行動の変化を判断するには、分子と分母を両方見せる必要があります。

2. 全体の割合は訪問数による加重平均

群内の割合を r、訪問構成比を w とすると、全体の割合は各群の w × r の和です。ある群の「訪問数 / 総訪問数」と「成功数 / その群の訪問数」を掛けると、群の訪問数が消え、その群の成功数が総訪問数に占める割合になります。全群を足せば、総成功数を総訪問数で割った値です。

前期は 0.2 × 0.5 + 0.8 × 0.1 = 0.18、後期は 0.8 × 0.4 + 0.2 × 0.05 = 0.33 です。前期には低い割合の群から大半の訪問が入り、後期には高い割合の群から大半が入っています。この構成変化が十分大きいため、群内の低下を上回りました。

二つの百分率を単純に平均すると、前期は 30%、後期は 22.5% です。この方法は各流入元を同じ大きさの単位として扱い、「二つの流入元の割合を等しく重み付けした平均」を答えます。実際の訪問数を反映しないため、サイト全体の割合ではありません。十回しか訪問がない流入元と一万回ある流入元を、全訪問を代表する指標で自動的に同じ重みにすべきではありません。

つまり両方の表が正しい場合があります。33% は後期に実際に生じた全訪問を記述し、群内割合は特定の流入元の訪問を記述します。問題は推論です。「実際の全体が上がった」から「どの種類の訪問もクリックしやすくなった」へは、そのまま進めません。

3. 群内の変化を比べるなら、参考となる構成を固定する

「元の流入構成を保ったら、両期間の割合をどう比較できるか」を知りたいなら、両期間に前期の重みを使います。ニュースレター 20%、検索 80% です。前期は 18% のままで、後期を同じ重みで計算すると 0.2 × 0.4 + 0.8 × 0.05 = 0.12、つまり 12% です。

これは「両期間に観測した群内割合を、同じ参考構成で重み付けするとどうなるか」という明確な記述上の問いに答えます。この比較では流入構成の変化を固定しています。レポートには「実際の全体:18% → 33%」と「前期の流入構成による加重割合:18% → 12%」を並べられます。定義を明示し、二行目を後期に実際に発生した全体割合と書かないことが大切です。

参考の重みは比較前に説明します。ここで前期を使う理由は、改修前の構成を基準とするためです。次の四半期の目標流入を議論するなら、事前に定めた目標構成も使えます。異なる重みは異なる集団を表し、結果は同じとは限りません。いくつもの重みを試して望ましいものだけ見せたり、毎期更新しながら固定構成の比較と呼んだりしてはいけません。

有用な境界条件もあります。同じ非負の重みを使い、すべての群の割合が下がれば、加重割合は上がりません。「重み掛ける変化」が各群でゼロ以下なら、和もゼロ以下です。この例の逆転に必要なのは、前後で実際の重みが変わったことです。

4. 15 パーセントポイントを分けて説明する

添字 0 を前期、1 を後期とすると、全体の変化は次のように書けます。

全体の変化 = Σ w0 × (r1 − r0) + Σ (w1 − w0) × r1

第一項は前期の重みを固定し、群内割合の変化を集計します。ニュースレターは 0.2 × (0.4 − 0.5) = −0.02、検索は 0.8 × (0.05 − 0.1) = −0.04 で、合計は 6 パーセントポイントの低下です。固定構成での 18% → 12% と一致します。

第二項は後期の群内割合を固定して、構成変化を集計します。ニュースレターの重みは 0.6 増え、寄与は 0.6 × 0.4 = 0.24。検索の重みは 0.6 減り、寄与は −0.6 × 0.05 = −0.03 です。合計は 21 パーセントポイントの上昇です。二項の和は −6 + 21 = 15 で、元の全体変化と一致します。

これは変化を記述するための算術分解であり、「流入の調整が因果的に 21 パーセントポイントの利益を生んだ」と測定したものではありません。配分は基準の置き方に依存します。前期の群内割合で先に構成を変え、後期の重みで群内割合を変える順序なら、二項の数値は違っても和は同じです。分解を報告する際は、使用した重みと割合の基準も書きます。

百分率とパーセントポイントも区別します。18% から 33% は 15 パーセントポイントの増加で、前期に対する相対的な増加は約 83.3% です。「15% 増」と書くと、読者が理解する変化の大きさが変わります。

5. スクリプトで再計算し、成立しない入力を拒否する

2026 年 10 月 2 日、macOS、Python 3.9.6 で、完全なスクリプトと教材用 CSVを実行しました。両ファイルを同じディレクトリへ保存し、次のコマンドで実行できます。標準ライブラリだけを使い、同形式の別の CSV パスを引数に渡すこともできます。

python3 traffic-mix-lab.py traffic-mix-example.csv --self-test

スクリプトは列名と整数の計数を検査し、「期間/流入元」が重複した行を拒否します。両期間の流入元の集合が同一かつ空でないことも確認します。中間計算では整数から Fraction を作り、正確な有理数を保ちます。表示の段階だけ百分率を小数点以下二桁にします。そのため、分解が全体変化を再現するかを、丸められた値ではなく厳密な等値で検査できます。Python 3.9:fractions

実行結果の集計部分は次のとおりです。

overall: 18.00% -> 33.00%
fixed before mix: 18.00% -> 12.00%
within at before weights: -6.00 pp
composition at after rates: +21.00 pp
total change: +15.00 pp

境界の検査も通過しました。流入構成が変わらない場合、構成項はゼロで、後期の実際の割合と固定構成の割合はどちらも 12% です。群内割合が同じまま構成だけ変わる場合、群内項はゼロで、全体は 42% に上がり得ますが、固定構成では 18% のままです。全計数を十倍にしても、割合と分解結果は変わりません。

ゼロの分母、負の計数、成功数が訪問数を超える行、片方にない流入元、重複行、整数でない計数も実際に拒否しました。分母がゼロのときは、割合をゼロに置き換えません。訪問がない群の割合は未定義です。その群が参考構成で重みを持つなら、計算に必要な情報が不足します。新たな流入元や消えた流入元を扱うには、分類と比較の定義を別途決める必要があります。この小さなスクリプトは計算を止め、データの問題を処理するよう求めます。

6. 重みを固定しても、改修の効果を直ちに判断できない

今回の計算は季節、入口ページ、読者の意図、記事のテーマ、計測漏れを統制していません。同じ流入元の割合が下がっても、二期間のレポートだけで改修が原因だとは言えません。全体の上昇も、改修の効果を証明しません。Pearl の研究が扱う重要な限界は、因果的な判断に集計と分群のどちらを使うかはデータ生成の過程に依存し、好ましく見える表を選ぶだけでは決められないことです。Understanding Simpson’s Paradox

群の定義そのものが実験で変わる場合もあります。Microsoft の研究チームは 2017 年の論文 §5.8 で、ユーザーを「ある種類のリンクを見たか」で分けた例を報告しています。新アルゴリズムが各群に入る人を変え、群内指標の改善を誤解しやすくしました。実験に影響される結果で分類するときは慎重さが必要です。また、良い結果が見つかるまで分類を細かくし続ければ、多重比較の問題も生じます。A Dirty Dozen:Segment Interpretation

計測の定義も問題になります。訪問者数と訪問回数は混ぜられません。流入元の再分類、ボットの除外方針、タイムゾーン、イベントの記録漏れは分母を変え得ます。この記事は定義が安定していると仮定します。スクリプトは計数の形式を検査しますが、計測が実際に何を記録したかは確認しません。一訪問が複数の流入元に数えられれば、群の計数の和も同じ全体を表しません。

標本の不確実性はさらに別の問題です。後期の検索群は成功が五回しかなく、観測割合が安定した真の確率とは限りません。この記事は信頼区間、統計的有意性、繰り返し訪問者による相関を計算せず、A/B テストも実施していません。有理数の計算が正確であることは、与えられた計数に対する算術が正しいという意味です。標本や測定の不確実性は消えません。

7. 数字の隣に、答えたい問いを書く

その期間にサイトが実際にどれだけ次のクリックを得たかを説明するなら、総訪問数、成功訪問数、実際の全体割合を示します。流入構成の改善自体が目的の一部である場合もあり、逆転を見つけただけで全体の数値を無効とはできません。同じ流入構成での実績を比較するなら、流入元の計数、群内割合、事前に説明した固定の重みによる結果を並べます。改修の因果効果を評価するなら、適切な実験や因果分析の設計が必要です。

この例は、範囲を明示して次のように報告できます。「全体は 18% から 33% へ上がったが、両流入元の群内割合は低下した。前期の構成で再計算すると後期は 12%。前期の重みを使った群内変化項は −6 パーセントポイント、後期の割合を使った構成変化項は +21 パーセントポイントである。集計の逆転は説明できるが、改修の因果効果はまだ判断できない。」

冒頭の二つの表は、互いを否定する必要がありません。全体の割合は「どのような訪問が入ったか」と「各種類の訪問がどう行動したか」の両方で変わります。分子、分母、群内割合、重みを並べれば、見栄えの良い上昇が、本来知りたかったどの問いに答えているのかを確かめられます。

資料とリンクの確認日:2026 年 10 月 2 日。表はオリジナルの教材用仮定です。実験結果は添付スクリプトから得たもので、谷米の統計や実際の実験データには接続していません。