米国のどの保健当局もレストランの検査結果を公開しており、店を選ぶその瞬間にそれを見せようとするアプリが次々と作られてきた。前提にあるのは、違反件数が厨房について何かを語っているという考えだ。

私はいくつかの自治体を比較し、基準が郡ごとにどれだけ違うのかを確かめたかった。分かったのは、そもそもその比較が成立しないということ、そしてその理由は比較結果よりも面白かった。

以下のすべては公開されているライブAPIに基づく。コードはこちらにあり、標準ライブラリのみ、APIキーなしであらゆる数字を再生成できる。

2つの郡、同じ検査票、2.65倍の差

Boulder CountyとTri-County(Adams、Arapahoe、Douglas)はどちらもコロラド州のオープンデータポータルに公開しており、どちらも同じ56項目のFDA食品規範チェックリストを使っている。同じ検査票、同じ違反コードFC01からFC56、同じ州だ。

データセットが重なる2019年から2022年10月までの通常検査を見ると、

  検査1回あたりの違反件数 n
Boulder County 2.10 1,984
Tri-County 5.57 7,886

最初に思ったのは、Tri-Countyのほうが厳しいのだろうということだ。データもそう見えた。Tri-Countyは3つの郡を管轄する単一の機関であり、地理と規制主体を切り離せる。その内部で3郡はそれぞれ5.83、5.36、5.54だ。同一機関のもとでは、2本の郡境をまたいでもばらつきは約9%。機関が違うと165%になる。

そこで店舗を固定してみた。Subwayはどこでも Subwayだ。同じ社内手順、同じ設備、同じ監査体制である。

チェーン Boulder Tri-County
Subway 2.42 4.41
Starbucks 0.65 2.18
Chipotle 0.69 1.94
McDonald’s 1.47 3.11
Taco Bell 1.00 3.36
Wendy’s 0.11 4.47
全体 1.15 3.16

9つのチェーン、すべてが同じ方向を向き、全体で2.76倍。この時点で私は、コロラド州の隣接する2つの保健当局のあいだに執行の実質的な差があると確信していた。

この数字は分数であり、私は分子しか持っていなかった

Boulderはチェックリスト項目1つにつき1行を公開し、それぞれにステータスが付く。Tri-Countyは検査1回につき1行を公開し、56個の二値フラグを持つ。

違いは、それぞれの形式が何を表現できるかにある。

検査員が記録した内容 Boulder Tri-County
指摘あり Out, Out-High, Out-Medium, Out-Low flag = 1
確認して問題なし In 区別できない
確認していない Not Observed 区別できない
該当しない Not Applicable 区別できない

Boulderは「確認したが問題なかった」と「確認していない」を言い分けられる。Tri-Countyの形式は両方をゼロにまとめてしまう。

そこで、Boulderの検査員が実際に評価している検査票の割合を数えた。

  検査票の項目数 評価された項目数 違反件数 評価項目あたりの発生率
Boulder 56.8 24.1 2.10 8.7%
Tri-County 56 不明 5.57 56項目すべてとすれば9.9%

Boulderの検査員は検査票の58%に手を付けていない。実際に確認された項目で割ると、2.65倍は約1.14倍になる。

それでも残差を過大に見積もっている。Tri-Countyの分母は復元できないからだ。もし彼らの検査員も24項目前後を評価しているなら、真の発生率はおよそ23%で、Boulderの2倍以上になり、効果の符号が反転する。Boulderの発生率には上限がある。Tri-Countyにはない。

メリーランド州のMontgomery Countyは同じ3区分の語彙を持つ15項目の検査票を使っており、Boulderが58%を「Not Observed」とするところで2%から6%しかそう記録しない。正規化の基準となる全国的な慣行は存在せず、だからこそ公開件数を比較する人にはこの問題が見えない。

同じ問題は時系列でも現れる

記録の慣行が動くと数字が動くのなら、ある自治体が記録方法を変えたときには、その自治体の内部でも数字が動くはずだ。

カリフォルニア州のMarin Countyは12年分の検査を公開している。年別の通常検査1回あたりの違反件数は次のとおり。

Marin Countyの年別の通常検査1回あたり違反件数と、2019年の前後を通して働いた同じ8人の検査員 左:系列は2019年で断絶し、元に戻らない。右:断絶の両側で働いたすべての検査員で数字が下がっている。

2014 2015 2016 2017 2018 2019 2020 2021 2022 2023 2024 2025
4.08 3.73 4.97 5.02 3.63 1.42 1.21 0.74 0.95 0.93 1.01 1.07

単一の年境をまたいで4.30から1.11へ。 同じ期間に検査件数は増えており、2018年の通常検査1,351件から2019年は1,514件になっている。違反コードの語彙は変わっていない。掲示プログラムは2015年から既に運用されていた。

Marinはどの行にも検査員名を載せており、これはほぼどの自治体もやっていない。だから職員が入れ替わったのかを確認できた。断絶の両側でそれぞれ通常検査40件以上を担当した検査員は次のとおり。

検査員 2019年以前 2019+ 変化
A 7.90 1.42 −6.48
B 5.17 1.27 −3.90
C 4.32 1.10 −3.22
D 3.89 2.09 −1.79
E 3.60 0.91 −2.68
F 2.65 0.90 −1.75
G 1.43 0.81 −0.62
H 1.02 0.93 −0.09

8人中8人が下がっている。全体では−69%。検査員Aは1人の人間が1つの仕事をしているだけで、検査1回あたり7.90件から1.42件になった。

店舗を固定しても同じだ。断絶の両側で検査された1,059事業者は4.58から1.11へ下がった。

同じ人、同じ店、同じコード。違反件数は4分の1。

実際に変わったものは、検査の分類の仕方に現れている。何も見つからなかった検査の割合はほとんど動かず、11〜16%から13〜26%になった。重大と分類された割合は23〜39%から8〜15%に落ち、その差を軽微が吸収した。そして違反のあった検査1回あたりに列挙された違反件数は約4.1〜5.8から1.1〜2.1へ下がった。検査で問題が見つかる確率はほぼ変わっていない。崩れたのは検査1回あたりに書き留められる問題の数だ。

データ移行を見ているだけではないかを確認する

これを覆しうる説明は出自だ。2019年以前の行が別のシステムから移行されたものなら、この断絶は実務ではなくデータセットの産物になる。

3つの検証を行い、すべて否定的だった。

レコードIDは連続している。 13年分すべてを通じて単調増加する1本の連番で、境界では範囲が重なっている。2018年は25,039から37,081、2019年は24,518から42,338。リセットも欠落もない。

スキーマは動いていない。 inspectorplacardcorrect_by_datecorrected_on_siteinspector_commentsinspection_frequencylicense_number はいずれも2014年から2026年までのすべての年で充填率100%だ。変化する唯一のフィールドは違反コードで、96〜97%から67〜90%になるが、これはスキーマ変更ではなく今回の発見そのものである。

抽出処理の指紋は別の場所で変わっている。 このデータセットの一部の文字列値は、引用符の文字そのもので囲まれている。この痕跡は2024年までは0%の行に現れ、2025年は83%、2026年は100%だ。

最後のものがここで最も強い証拠だ。パイプラインが変わったことは明白だが、それは2019年ではなく2025年である。74%の下落が移行によるものなら、書式の特徴もそれと一緒に動いていたはずだ。

これは私が最初に踏んだバグの原因でもあった。引用符を取り除かずに検査員でグループ化すると46人になる。実際は40人だ。うち6人は同一人物が引用符付きと無しで2回現れているだけだった。

Marinのような断絶はどれくらい一般的か

ここでの妥当な反論は、私が断絶を探しに行って見つけただけであり、保健当局は書類様式を絶えず改訂しているというものだ。そこで他の長期系列3つを同じやり方で確認した。

自治体 指標 期間 単年の最大変動
コロラド州Boulder County 通常検査1回あたりの違反件数 2013-2025 13年間で1.60から2.35、断絶なし
シカゴ 検査の不合格割合 2010-2026 16.0%から24.9%、緩やかな推移、断絶なし
ニューヨーク市 重大と分類された違反の割合 2022-2026 52.4%から56.7%、断絶なし

Marinが外れ値だ。Boulderは同じ指標をより長い期間で見られるため、きれいな比較対象になる。そして年ごとの変動が約20%を超えることはない。

この表には2つの留保がある。シカゴの合否とニューヨーク市の重大割合は違反件数より粗い指標であり、当局が列挙の細かさを変えてもどちらも動かないことがある。またニューヨーク市の公開系列は2022年までしか遡れず、検証としては心もとない。

まとめると、Marinのような断絶はこのデータの通常の状態ではないが、無視できるほど稀でもない。長期系列を持つ4自治体のうち1つに存在し、公開データのどこにもその事実は示されていない。

これはコロラドの比較の信頼性も高める。Boulderが13年間横ばいだということは、2.65倍の差のBoulder側が、私がたまたま選んだ年の産物ではないことを意味する。

誰が来るかは、どの店かとほぼ同じくらい予測力を持つ

シカゴは検査優先度モデルをオープンソース化しており、独立したレビューでは影響の最大の単一要因が「どの衛生官が検査したか」だと判明した。それは内部データだった。Marinの検査員の列は、それを公開データで検証可能にする。

15,888件の通常検査、1,645事業者、40人の検査員で見ると、検査員ごとの生の平均は0.74から5.99まで広がる。その大部分は時期によるものだ。検査員はそれぞれ異なる期間に働いており、2019年の断絶がその真ん中にある。

そこで、2人以上の異なる検査員に検査された1,453事業者を使って事業者平均を差し引き、さらに年平均を差し引いた。

統制 検査員間のばらつき 標準偏差
生データ 8.1倍 1.41
事業者平均を差し引き 5.18件 1.27
事業者と年を差し引き 3.81件、平均2.22の172% 0.86

年を統制すると順位が入れ替わり、これが純粋な時期の話を排除する。統制後に最も厳しい検査員は2025年に始めており、断絶の緩い側にいる。最も緩い検査員は2018〜2019年に働いており、厳しい側にいた。

生の系列における粗い分散の寄与は、事業者の同一性が約24%、検査員の同一性が約21%だ。

これは当てはめたモデルではなく算術的な平均除去なので、標準誤差ではなく方向と大きさとして受け取ってほしい。検査員と年は部分的に共線であり、断絶をまたぐ8人の検査員が識別を担っている。他の2つの発見にはその問題はない。厳密な統制のもとでの生の平均だからだ。

結局のところ

3つの軸があり、件数はそのすべてで破綻する。自治体をまたぐと記録の慣行だけで2.65倍動く。時間をまたぐと、同じ人が同じ店を検査しながら74%動く。検査員をまたぐと、統制後でも平均の172%動く。

これらは検査が機能しているかを測るものではない。検査員は本当の問題を見つけ、本当に厨房を閉鎖している。ここで述べたことはそれについて何も語らない。私が測ったのは数字であり、その数字はまさに一方と他方を比較したときに壊れる。そしてそれこそが、下流の誰もがこの数字で行っている唯一のことだ。

本当のリスクは検索アプリの下流にある。違反の結果で訓練された都市の予測モデル、そして地域間や政策の実施日をまたいで評価制度を比較する研究だ。シカゴのモデルはこうした結果で訓練され、自前の監査では検査員が最大の予測因子だと分かった。目的変数の一部が事務処理であるなら、それは予想される結果だ。ある自治体の記録方法の変更をまたぐ研究は、Marinの問題に真正面からぶつかる。世界が動いていないのに系列が動くのだから。

実用的な結論はこうだ。違反件数は、1つの自治体の中で、1つの時期において、誰が訪問したかを調整したうえでなら解釈できる。それ以外では解釈できない。このデータの上に何かを作るなら、最初に確認すべきは数字ではなく、あなたのデータ元が「未確認」を表現できるか、そしてその慣行が対象期間を通じて動かなかったかどうかだ。

これはレストランに限った話ではない。公開された件数は、ある組織が何を書き留めたかを記録しているだけであり、私が見た4つの当局のうち1つは、何も告げずに書き留め方を変えていた。

2019年にMarin Countyで何が変わったかをご存じなら教えてほしい。分かれば本稿を更新する。ここにあるすべての数字はコードからライブAPIに対して再生成できるので、私の作業を検証してみてほしい。