研究開発部が分析装置から出る測定データを Python で毎日集め、条件ごとの外れ値と装置の不調の兆しを判定して、測り直しと点検の候補を担当者に返す
研究所の分析装置が書き出す測定データを毎日集め、同じ条件の測定どうしで外れた値と、装置の不調の兆しを判定します。研究者には測り直しの候補を、装置の担当には点検の候補を、根拠の数値付きで返します。
- 連携・自動化
- Python
- 対象業界
- その他/医療/製造
- 対象部門
- 品質管理/研究開発
- 対象業務
- 内容確認・チェック/集計・分析
- 主な課題
- データ分析に時間がかかる/属人化している/確認ミスが多い
- AIで行う処理
- 判定
- 主な効果
- 品質標準化/工数削減/機会損失防止
- 導入難易度
- ★★★★★
- 実装レベル
- 本格構成
- 費用感
- 個別開発(大)
- 人間の確認
- 条件付き
01導入前 / 導入後の業務フロー
- 研究者が装置を予約し、試料を測る。制御ソフトが結果のCSVを装置のフォルダに書き出す
- 研究者が結果を開き、自分の予想と、同じ条件で前に測った値と比べる
- おかしいと思えば、試料と手順を確かめて測り直す
- 結果を電子実験ノートに転記し、測り直したときはその旨を書く
- 装置の担当が毎朝、管理試料を測り、値を管理表に書いて基準の範囲と比べる
- 範囲を外れたら、装置を止めて点検し、研究者に知らせる
- 研究者は、知らせを受けて、影響を受けたかもしれない測定を自分で探す
- 人研究者が測定の予約のときに、試料系・条件の番号を入れる(予約の画面に1項目足す)
- 自動1時間ごとに、Python が装置のフォルダに新しく書き出されたCSVを集め、測定の台帳にまとめる
- 自動欠測・単位・範囲外などの、データそのものの問題を規則で確かめる
- 自動同じ試料系・同じ条件の過去の測定と比べ、外れた値を判定する
- 自動管理試料の値の推移と、装置の記録(圧力・温度・ノイズ)から、装置の不調の兆しを判定する
- 自動判定を「測り直しの候補」「点検の候補」「データの問題」に分け、研究者と装置の担当にそれぞれ返す
- 人研究者が測り直しの候補を見て、試料と手順を確かめ、測り直すか、そのまま使うかを決めて理由を書く
- 人装置の担当が点検の候補を見て、点検するかを決める。点検したら結果を書く
- 自動装置の不調と判定した期間の測定の一覧を、研究者ごとに作る
各工程の詳しい説明を読む
- 研究者が装置を予約し、試料を測る。制御ソフトが結果のCSVを装置のフォルダに書き出す
- 研究者が結果を開き、自分の予想と、同じ条件で前に測った値と比べる
- おかしいと思えば、試料と手順を確かめて測り直す
- 結果を電子実験ノートに転記し、測り直したときはその旨を書く
- 装置の担当が毎朝、管理試料を測り、値を管理表に書いて基準の範囲と比べる
- 範囲を外れたら、装置を止めて点検し、研究者に知らせる
- 研究者は、知らせを受けて、影響を受けたかもしれない測定を自分で探す
(a)外れた値に気づくかが人によって違う。 2番の比べ方は研究者に任されています。同じ条件で前に測った値を探すだけで、共有フォルダの中を何分も探します。 忙しい日は探さずに、予想と合っていれば通します。
(b)ゆっくりした不調に気づけない。 管理試料の値が毎日少しずつずれていくと、1日ごとには範囲内なので、範囲を外れるまで誰も気づきません。 外れた日にさかのぼって調べると、数日前からずれ始めていたことが分かります。
(c)不調に気づいてからの影響の洗い出しが重い。 6番で装置を止めても、7番の「どの測定が影響を受けたか」は研究者が自分の記録から探します。装置の記録(圧力・温度・ノイズ)と測定を結び付けて見る仕組みがありません。
(d)測り直しの理由が残らない。 4番で測り直したことは書いても、なぜおかしいと思ったか、前の値をどう扱ったかは書かれないことが多く、後から説明できません。
- 【人】 研究者が測定の予約のときに、試料系・条件の番号を入れる(予約の画面に1項目足す)
- 【自動】 1時間ごとに、Python が装置のフォルダに新しく書き出されたCSVを集め、測定の台帳にまとめる
- 【自動】 欠測・単位・範囲外などの、データそのものの問題を規則で確かめる
- 【自動】 同じ試料系・同じ条件の過去の測定と比べ、外れた値を判定する
- 【自動】 管理試料の値の推移と、装置の記録(圧力・温度・ノイズ)から、装置の不調の兆しを判定する
- 【自動】 判定を「測り直しの候補」「点検の候補」「データの問題」に分け、研究者と装置の担当にそれぞれ返す
- 【人】 研究者が測り直しの候補を見て、試料と手順を確かめ、測り直すか、そのまま使うかを決めて理由を書く
- 【人】 装置の担当が点検の候補を見て、点検するかを決める。点検したら結果を書く
- 【自動】 装置の不調と判定した期間の測定の一覧を、研究者ごとに作る
6番目で返す相手を分けるのが、この設計の分かれ目です。 研究者に装置の不調の兆しまで返すと、自分の実験と関係のない知らせが増え、肝心の測り直しの候補が埋もれます。 装置のことは装置の担当に、試料のことは研究者に返します。
9番目が、これまでいちばん重かった作業を置き換えます。 不調の兆しが出始めた時点から点検までの測定を、装置の記録の時刻で自動で拾います。
02今回想定するシステム構成
分析装置の制御ソフト(測定値・装置の記録をCSVで書き出し) │ 装置ごとのフォルダ ▼【トリガー】1時間ごとの定時実行 Python(pandas) ├──▶ 測定の台帳にまとめる(装置・日時・試料系・条件・測定値) ├──▶ データの問題の確認(欠測・単位・範囲外) ▼ 判定 ├── 外れ値:条件ごとの中央値と MAD(SciPy) ├── 管理試料の推移:EWMA 管理図 └── 装置の記録:IsolationForest(scikit-learn) ▼ Python ── 返す先ごとに分ける ├──▶ 研究者:測り直しの候補(メール・一覧) └──▶ 装置の担当:点検の候補(一覧) ▼ 【人が判断し、理由を書く】 ── 判断の記録
| 役割 | 想定する製品 | 代替候補 |
|---|---|---|
| 実行環境 | Python(pandas・SciPy の median_abs_deviation・scikit-learn の IsolationForest) | R、MATLAB |
| データの取得元 | 分析装置の制御ソフトのCSV書き出し | 装置メーカーのデータ管理ソフト |
| 保管 | 社内のデータベース(測定の台帳・判定・判断の記録) | ファイルサーバー |
| 通知 | 社内メール | 社内チャット |
装置の制御ソフトにも、電子実験ノートにも書き込みません。 この構成は書き出されたCSVを読むだけで、測定値の元のファイルは一切変えません。 判定と判断の記録は、別の台帳に置きます。
判定は、目的の違う3つの方法を組み合わせます。 外れ値の判定には、SciPy の median_abs_deviation を使います。公式ページでは、標準偏差より外れ値に強い散らばりの尺度とされています。同じ条件の過去の測定に外れ値が混ざっていても、物差し自体が引っ張られにくいのが理由です。 scale="normal" を指定すると、正規分布のときに標準偏差と比べられる大きさに換算されます。
管理試料の推移には、EWMA 管理図を使います。 NIST の統計の手引き(e-Handbook)では、EWMA は過去のデータを重み付けして平均する統計量で、重みの定数 λ を選ぶことで小さな、あるいはゆっくりしたずれに敏感にできるとされています。λ は 0.2〜0.3 がよく使われるとされています。第3章の(b)の「1日ごとには範囲内のずれ」を拾うための方法です。
装置の記録には、scikit-learn の IsolationForest を使います。 公式ページでは、特徴量と分割の値を無作為に選んで観測を「孤立」させ、異常なものほど短い経路で孤立することを使う方法とされています。圧力・温度・ノイズのように、1つずつは範囲内でも組み合わせがいつもと違う、という状態を拾います。
03どうやって実装するのか
処理の起点を決める
1時間ごとの定時実行で、装置のフォルダに新しく書き出されたCSVを集めます。 測定のたびに動かすことも考えましたが、装置ごとに書き出しのタイミングが違い、書き出しの途中のファイルを読む事故が起きやすくなります。 1時間ごとに、更新から5分以上たったファイルだけを読みます。
管理試料の判定は、毎朝の管理試料の測定が書き出された後の回で行います。 装置の担当が朝の点検の結果を見る前に、EWMA の判定が出ているようにします。
IsolationForest の学習し直しは月に1回です。 装置の点検や部品の交換の後は、記録のいつもの状態が変わるので、点検の記録がある装置は、点検後のデータがたまってから学習し直します。
入力データを集める
| データ | 中身 | 取得元 |
|---|---|---|
| 測定の結果 | 装置、測定の日時、試料の番号、測定値(ピークの面積・保持時間・粒径・強度など) | 制御ソフトのCSV |
| 装置の記録 | 測定ごとの圧力、温度、ベースラインのノイズ、ランプの使用時間など | 制御ソフトのCSV(装置による) |
| 試料系と条件 | 試料系の番号、条件の番号(溶媒・温度・前処理の手順) | 予約の画面で研究者が入れる |
| 管理試料の値 | 毎朝の管理試料の測定値と、その装置の基準の値 | 制御ソフトのCSV、分析室の管理表 |
| 点検の記録 | 装置ごとの点検・部品交換の日時と内容 | 分析室の管理表 |
質を決めるのは、3番目の試料系と条件の番号です。 外れ値の判定は「同じ条件の過去の測定」と比べるので、条件の番号が無いと、比べる相手が決まりません。 予約の画面に1項目足し、研究者に選んでもらいます。番号の一覧は分析室が管理します。
装置の記録の項目は、装置によって違います。 液体クロマトグラフは圧力とベースライン、粒度分布計はレーザーの強度と背景の散乱、というように、装置ごとに使う項目を決めて設定ファイルに書きます。
データの取得方法を決める
装置ごとのフォルダを1時間ごとに見て、前回の実行の後に更新され、更新から5分以上たったCSVを読みます。読んだファイルの名前と更新日時を記録し、二度読まないようにします。
| 取るもの | どこから | 何に使うか |
|---|---|---|
| 測定値 | 結果のCSV | 外れ値の判定 |
| 圧力・温度・ノイズ | 装置の記録のCSV(または結果のCSVの付帯情報) | 装置の不調の判定 |
| 試料系・条件の番号 | 予約の記録 | 比べる相手の決定 |
| 管理試料の値 | 毎朝の結果のCSV | EWMA の判定 |
| 点検の日時 | 分析室の管理表 | 学習の期間の区切り |
CSVの形式は、装置のメーカーと制御ソフトの版で違います。 列の名前、日付の書き方、小数点の記号、文字コードが装置ごとに違うので、装置ごとに読み方を設定ファイルに書き、読み込んだ後は共通の形の台帳にそろえます。 制御ソフトの版が上がったら、設定を確かめ直します。
予約の記録と測定の結び付けは、装置と時刻で行います。 予約の時間帯に、その装置で書き出された測定を、その予約の試料系・条件に結び付けます。時間帯から外れた測定は、結び付けずに研究者に問い合わせます。
AIへ渡す前に整形する
- 共通の形にそろえる … 装置ごとの列の名前・日付・単位を、台帳の形にそろえます
- データの問題を規則で確かめる … 欠測、装置の測定範囲の外の値、単位の取り違え(mg と μg など)、同じ試料番号の重複を確かめます
- 管理試料と実試料を分ける … 試料の番号の決まりで管理試料を見分け、別の台帳に入れます
- 比べる相手を決める … 同じ装置・同じ試料系・同じ条件の、過去180日の測定を比べる相手にします
- 点検の前後を分ける … 装置の点検・部品交換の前の測定は、装置の記録の学習から外します
- 相手の数を確かめる … 比べる相手が10件に満たない条件は、外れ値の判定をせず「判定の材料不足」とします
2番目を、判定より前に置きます。 単位の取り違えで千倍になった値は、外れ値の判定に回すまでもなく誤りです。データの問題を先に分けないと、外れ値の一覧が入力の誤りで埋まります。
6番目は、新しい試料系を始めたばかりの研究者に関わります。 過去の測定が少ない条件で無理に判定すると、数件の値のばらつきだけで外れ値と出て、研究者が無駄に測り直します。
AIに処理させる
させるのは、測定ごとに3種類の判定を出し、根拠の数値を添えることだけです。
| 判定 | 方法 | 印を付ける条件 | 返す先 |
|---|---|---|---|
| データの問題 | 規則 | 欠測・範囲外・単位・重複 | 研究者 |
| 条件ごとの外れ値 | 中央値と MAD(scale="normal")からの離れ(ロバストZ) | 絶対値が3.5を超える | 研究者 |
| 管理試料の推移 | EWMA 管理図(λ=0.2) | EWMA が管理限界を外れる | 装置の担当 |
| 装置の記録の異常 | IsolationForest の decision_function | 負の値が、同じ装置で2回以上続く | 装置の担当 |
ロバストZは、(測定値 − 中央値) ÷ MAD で計算します。 中央値と MAD は、比べる相手(同じ条件の過去180日の測定)から計算します。3.5は仮の値で、過去のデータで印の数が研究者の見られる数に収まるように決めます。
EWMA の管理限界は、NIST の手引きの式に従います。 目標の値(過去の管理試料の平均)に、k × s_ewma を足し引きします。s_ewma の2乗は λ/(2−λ) × s² で近似され、k は通常3とされています。s は、装置が正常だった期間の管理試料の標準偏差です。
IsolationForest の判定は、decision_function の負の値で見ます。 公式ページでは、値が低いほど異常で、負の値は外れ値、正の値は正常を表すとされています。1回だけの負の値は、試料による一時的な揺れのことがあるので、同じ装置で2回以上続いたときに印を付けます。
λ を0.2にするのは、管理試料を毎朝1回しか測らないためです。 λ を小さくするほど過去の値の重みが増え、ゆっくりしたずれに敏感になりますが、急な変化への反応は遅くなります。 急な変化は装置の記録の判定と、従来どおりの管理試料の範囲の確認で拾い、EWMA にはゆっくりしたずれを任せる、という分担にします。
3つの判定を重ねて読むと、返す先の判断が確かになります。 ある測定が外れ値と判定され、同じ時間帯にその装置の記録も異常と判定されていれば、原因は試料より装置の側にある可能性が高いと見て、研究者への返し方を変えます。
| 外れ値 | 装置の記録・管理試料 | 研究者への返し方 |
|---|---|---|
| あり | 異常なし | 測り直しの候補として返す |
| あり | 異常あり | 「装置の点検待ち。測り直しは点検後に」と返す |
| なし | 異常あり | 研究者には返さず、装置の担当にだけ返す。点検で不調が分かれば影響の一覧で知らせる |
| させないこと | 理由 |
|---|---|
| 測定値の削除・書き換え | 外れた値の扱いは研究者が理由を記録して決める |
| 測定値の採用・不採用の判断 | 実験の文脈は研究者しか知らない |
| 装置の停止 | 点検するかは装置の担当が決める |
| 外れた原因の断定 | 判定は「いつもと違う」まで。原因は人が調べる |
指示内容を固定する
生成AIは使わないので、プロンプトではなくPython の判定の要点を示します。
import numpy as np
import pandas as pd
from scipy.stats import median_abs_deviation
from sklearn.ensemble import IsolationForest
def robust_z(value, ref):
med = np.median(ref)
mad = median_abs_deviation(ref, scale="normal", nan_policy="omit")
return np.nan if (len(ref) < 10 or mad == 0) else (value - med) / mad
def ewma_flags(x, target, s, lam=0.2, k=3.0):
z, out = target, []
lim = k * s * np.sqrt(lam / (2 - lam))
for v in x:
z = lam * v + (1 - lam) * z
out.append((z, abs(z - target) > lim))
return out
log = pd.read_parquet("device_log_lc02.parquet")
cols = ["pressure_mean", "pressure_sd", "temp_dev", "baseline_noise"]
train = log[log["after_last_service"] & ~log["flagged"]]
iso = IsolationForest(n_estimators=200, contamination="auto",
random_state=0).fit(train[cols])
log["iso_score"] = iso.decision_function(log[cols])
決まりは3つです。 1つ目は、比べる相手が10件未満、または MAD が0のときは判定しないことです。値が全部同じ条件で MAD が0になると、わずかな違いで無限大の離れになります。2つ目は、IsolationForest の学習には、最後の点検の後で、印の付いていない期間のデータだけを使うことです。不調の期間を学習に混ぜると、不調の状態を「いつもの状態」として覚えます。3つ目は、λ・k・3.5 などの値を、装置ごとの設定ファイルに置くことです。
EWMA の目標と s は、装置が正常だった期間から決めます。 点検で部品を替えると管理試料の値の水準が変わることがあるので、点検の後は、装置の担当が目標を決め直します。
出力形式を固定する
判定は、測定1件ごとに次の形で台帳に残します。
{
"measurement_id": "LC02-20261026-0931-07",
"instrument": "LC02",
"sample_system": "SYS-114",
"condition": "C-07",
"data_issue": null,
"outlier": { "flag": true, "robust_z": 4.2, "median": 12.81, "mad": 0.31, "n_ref": 46 },
"device": { "iso_flag": true, "iso_score": -0.08, "ewma_flag": false },
"route": "researcher_wait_service",
"message": "同条件の過去46件の中央値12.81に対し14.11。装置LC02の記録にも異常の兆しあり。点検の結果を待ってから測り直しを検討してください"
}
route で返す先と返し方を決めます。 researcher_remeasure(測り直しの候補)、researcher_wait_service(点検待ち)、service_only(装置の担当だけ)、data_issue(データの問題)の4つです。
JSONで残す理由は、判定の根拠を数値のまま残すためです。 「外れ値」という印だけでは、研究者は自分の値がどれくらい外れているのか分かりません。中央値、MAD、比べた件数を一緒に返すと、研究者は自分で妥当さを判断できます。 n_ref が少ないときは、判定の重みが軽いことも伝わります。
研究者への知らせは、1日1回まとめて送ります。 1時間ごとの判定のたびに送ると、知らせが多すぎて読まれなくなります。 点検待ちのように急ぐものだけ、その回で送ります。
研究者に届く1日分の知らせは、次のような形です。
【本日の測定の判定(10/26)】
■ 測り直しの候補 1件
LC02 SYS-114 C-07 試料07:14.11(同条件46件の中央値12.81、ロバストZ 4.2)
→ 装置LC02に異常の兆しあり。点検の結果を待ってから判断してください
■ データの問題 1件
PSD01 試料03:単位が μm でなく nm の列で書き出されています
■ 判定の材料不足 2件(条件C-21は過去の測定が6件)
■ 問題なし 9件
問題の無い測定も件数で示します。 何も届かない日は、判定が動いていないのか問題が無いのかが分かりません。「問題なし9件」と書くことで、判定が全部の測定に届いたことを研究者が確かめられます。
システムへ連携する
| つなぎ先 | 方式 | 内容 |
|---|---|---|
| 分析装置の制御ソフト | 書き出されたCSVの読み取り | 測定値と装置の記録 |
| 予約の仕組み | 予約の記録の読み取り | 試料系と条件の番号 |
| 分析室の管理表 | 読み取り | 管理試料の基準と点検の記録 |
| 社内のデータベース | 書き込み | 測定の台帳、判定、判断の記録 |
| 社内メール | 送信 | 研究者と装置の担当への知らせ |
電子実験ノートとは、つなぎません。 研究者は判定を見たうえで、自分のノートに測り直しの理由を書きます。判定を自動でノートに書き込むと、研究者が判断した記録と、機械が付けた印の区別が付かなくなります。
人が確認する
- 研究者が測り直しの候補を見る … 中央値・MAD・比べた件数を見て、試料と手順を確かめます
- 研究者が扱いを決めて理由を書く … 測り直す、そのまま使う、条件の番号が違っていた、のどれかを選び、理由を一言書きます
- 装置の担当が点検の候補を見る … EWMA の推移と装置の記録の図を見て、点検するかを決めます
- 点検したら結果を書く … 不調があったか、何を直したかを点検の記録に書きます
- 不調があったら影響の一覧を確かめる … 自動で作られた一覧を研究者ごとに送り、研究者が自分の測定を見直します
2番目で「そのまま使う」を選べることが大事です。 外れた値が新しい現象の手がかりのこともあります。判定は研究者の判断を縛らず、判断の理由を残すことだけを求めます。
判断の記録は、判定の基準を見直す材料になります。 「そのまま使う」が多い条件は基準が厳しすぎ、点検で不調が見つからなかった印が多い装置は、IsolationForest の項目を見直します。
例外に対処する
| 起きること | 対応 |
|---|---|
| CSVの形式が変わり読めない | その装置だけ処理を止め、分析室に知らせる。制御ソフトの版を確かめる |
| 条件の番号が入っていない | 外れ値の判定をせず、研究者に番号の入力を頼む |
| 予約の時間帯の外の測定 | 結び付けずに、装置を使った研究者に問い合わせる |
| 比べる相手が10件未満 | 「判定の材料不足」として返し、外れ値の判定はしない |
| MAD が0 | 判定せず、条件の設定を確かめる |
| 点検・部品交換の直後 | 装置の記録の判定を止め、新しいデータがたまるまで EWMA だけで見る |
| 管理試料を測っていない日 | その日の EWMA を更新せず、装置の担当に知らせる |
| 判定の処理が失敗した | 読んだ記録を残さず、次の回で読み直す |
上の3行が、運用の最初の数か月に多く出ます。 どれも判定の方法ではなく、データの入り口の問題です。 予約の画面と書き出しの設定を整えると、自然に減っていきます。
記録を残す
- 読んだCSVのファイル名・更新日時と、台帳にまとめた測定
- 測定ごとの判定(
outlier・device・route)と根拠の数値 - 研究者と装置の担当の判断と理由
- 装置ごとの設定(λ・k・基準・IsolationForest の項目)と、その変更の履歴
- IsolationForest のモデルの版と、学習に使った期間
- 不調と判定した期間と、影響の一覧を送った記録
判断の記録には、判断した人と日時を必ず付けます。 「そのまま使う」と決めた値が後から問題になったとき、誰がどの根拠を見て決めたかをたどれるようにするためです。
元のCSVは消さず、そのまま残します。 台帳は元のファイルから作り直せる派生物として扱い、判定の誤りが見つかったときに、元のデータからやり直せるようにします。
04実装レベルの3段階
最小構成は、使えるかを確かめる段階です。 毎日の業務には使いません。 半自動化で、1件6分が4分程度になります。 前の値を探す作業はなくなりますが、装置の記録を見る作業と、不調のときの影響の洗い出しが残ります。本格構成で2分になり、この段階が本記事の想定です。 差が出るのは、装置の記録と測定を結び付ける作業です。 段階を飛ばさないでください。 半自動化で、研究者が「そのまま使う」を選ぶ割合を見ると、基準が研究者の感覚と合っているかが分かります。 そこを合わせてから、装置の記録の判定を足します。
05工数削減シミュレーション
導入後 480件 × 2分 ÷ 60 = 16 時間/月
自社条件で導入効果を整理したい方へ
このユースケースを自社に当てはめた場合の前提値と削減見込みを、業務ヒアリングをもとに整理します。
06向いている企業・向いていない企業
- 材料・化学・医薬・食品などの研究所で、液体クロマトグラフ・粒度分布計・引張試験機などの分析装置を複数の研究者で共用し、毎月数百回の測定を行っている研究開発部。測定の結果を研究者が自分で見て、外れた値に気づくかどうかが人によって違う場合。装置の不調に気づくのが、何日分もの測定が無駄になった後になっている場合。装置がCSVなどで測定値と装置の記録を書き出せる場合。
- 測定が月に数十回で、装置の担当者が全部の結果を見られている場合。装置がデータを書き出せず、結果が紙の印字だけの場合。なお、測定値を採用するか捨てるかの判断、実験の結論、装置の修理の要否の判断は、この構成では代替できず、外れ値の印を理由にデータを消すことはしません。
07最小構成で試す方法
- 液体クロマトグラフ1台を選び、過去6か月の結果のCSVと管理試料の値を集める
- よく使われる条件3つについて、試料系と条件の番号を手で付ける
- 条件ごとに中央値と MAD を計算し、ロバストZが3.5を超えた測定を一覧にする
- 管理試料の値に EWMA 管理図を当て、管理限界を外れた日を一覧にする
- 一覧を、その期間の点検の記録と、研究者が測り直した記録と並べる
5番目を必ずやってください。 EWMA が点検の何日前に限界を外れていたか、外れ値と出た測定のうち、研究者が実際に測り直していたものがどれだけあるかを見ます。
| 出てきた内容 | 判断 |
|---|---|
| EWMA が点検より前に限界を外れていた | 装置の記録の判定を足し、毎日の処理に進む |
| 外れ値の印が多すぎる | 基準の3.5を見直すか、条件の番号の付け方が粗くないかを確かめる |
| 条件の番号を後から付けられない測定が多い | 予約の画面の項目追加が先。 判定の問題ではない |
3行目は、ほぼ必ず出ます。 過去の測定に条件の番号を付けるのは手間がかかるので、最小構成では3つの条件に絞り、本番は予約の画面で番号を入れてもらう形にします。
EWMA の比べ方にも注意します。 過去6か月のうち、装置が正常だった期間を装置の担当に選んでもらい、その期間の管理試料の平均と標準偏差を目標と s にします。不調だった期間を含めて計算すると、s が大きくなり、管理限界が広がって何も拾えなくなります。 最小構成で拾えなかったときは、まずこの期間の選び方を疑います。
最小構成は、手元のPCの Python で足ります。 1台・6か月分のCSVなら数分で判定が終わります。研究のデータなので、試し終えたら手元のファイルは消します。
08実装時につまずきやすいポイント
| 問題 | 対策 |
|---|---|
| 平均と標準偏差で外れ値を判定する | 外れ値に物差しが引っ張られる。 中央値と MAD を使う |
| 条件の違う測定どうしを比べる | 試料系と条件の番号で比べる相手を決める |
| 比べる相手が少ない条件で判定する | 10件未満は判定しない |
| 不調の期間を IsolationForest の学習に混ぜる | 点検の後、印の無い期間だけで学習する |
| 管理試料を1点ずつ範囲と比べるだけ | EWMA でゆっくりしたずれを拾う |
| 研究者に装置の知らせまで送る | 返す先を分ける |
| 外れ値を自動で除く | データは消さない。 扱いは研究者が決める |
| 書き出し途中のファイルを読む | 更新から5分以上たったファイルだけ読む |
| 制御ソフトの版が上がって列が変わる | 装置ごとの設定を確かめ直す |
| 点検後に基準の水準が変わる | 装置の担当が目標を決め直す |
判定の基準を研究者だけで決めるのも避けます。 研究者は自分の測定の印が少ないほうを好み、装置の担当は不調を早く拾えるほうを好みます。どちらか一方の都合で基準を決めると、もう一方が判定を見なくなります。 両方が同じ表を見て、月に1回基準を相談する場を作ります。
上の2行が、この構成の判定の質を決めます。 平均と標準偏差は、外れ値そのものに引っ張られます。比べる相手がそろっていなければ、どんな方法でも判定は当たりません。
下から4行目は、運用の決まりとして最初に文書にします。 外れ値の印が付いた値を自動で除く処理を誰かが足すと、後から実験の結果を説明できなくなります。
09セキュリティ・AIガバナンス上の注意点
この構成で扱うデータ: 研究中の試料の測定値、試料系と条件(研究の内容そのもの)、装置の記録、研究者ごとの測定と判断の記録です。
- 研究のデータを社外に出さない … 試料系と条件の組み合わせは、研究の方向そのものです。この構成は社内のサーバーで完結し、外部のサービスにデータを送りません
- 元のデータを変えない … 制御ソフトが書き出したCSVは読むだけです。判定と判断は別の台帳に置き、元のファイルからいつでもやり直せるようにします
- 外れ値の扱いの理由を残す … 測り直した、そのまま使った、のどちらでも理由を書きます。後から結果の説明を求められたときの記録になります
- 判定を研究者の評価に使わない … 外れ値の印が多い研究者は、新しい条件に挑んでいるのかもしれません。研究者ごとの印の数を、評価の材料にしません
- 閲覧の範囲を決める … 測定の台帳には他の研究者の研究も載ります。研究者は自分の測定と、自分が使った装置の不調の知らせだけを見られるようにします
- 装置の停止を自動にしない … 不調の兆しが出ても、装置を止めるかは装置の担当が決めます。別の研究者が測定の途中のことがあります
- 共同研究の測定を分けて扱う … 社外の共同研究先から預かった試料の測定は、契約で扱いが決まっていることがあります。試料系の番号で共同研究の測定を見分け、台帳の閲覧と保存の期間を契約に合わせます
誤りが起きた場合のリスクは、正しい値を外れ値として測り直させることと、装置の不調を見逃して誤った値を使い続けることの2つです。 前者は研究者の判断の記録から基準を見直し、後者は EWMA と装置の記録の2つの判定を重ねることで減らします。
10まず何から始めるか
1週目:1台を選び、過去のデータを集める
測定の多い液体クロマトグラフを1台選び、過去6か月の結果のCSV、管理試料の値、点検の記録を集めます。CSVの形式を確かめ、読み方を作ります。
2週目:過去のデータで判定を当てる
よく使われる3つの条件に番号を付け、外れ値と EWMA の判定を当てます。点検の記録と並べて、EWMA が何日前に限界を外れていたかを見ます。
3週目:条件の番号の一覧と予約の項目を決める
分析室と研究者の代表で、試料系と条件の番号の一覧を作り、予約の画面に1項目足します。 外れ値の扱いの理由を書く欄も決めます。
4週目:毎日の判定を始める
その1台について、毎日CSVを集め、外れ値と管理試料の判定を研究者と装置の担当に返します。この時点では、研究者は従来どおり自分でも結果を見て、判定と比べます。
2か月目: 研究者の判断の記録から基準を合わせ、装置の記録の IsolationForest を足します。3か月目以降: 装置を1台ずつ広げ、影響の一覧を作ります。ゆっくりした不調を点検の前に拾えた例が出て、研究者が判定を見てから扱いを決める習慣ができた時点で、この構成は完成です。
11関連ユースケース
12この仕組みを理解するための記事
13技術仕様の確認日・参考情報
| 確認した内容 | 情報源 | 確認日 |
|---|---|---|
IsolationForest が特徴量と分割の値を無作為に選んで観測を孤立させ、異常なものほど短い経路で孤立することを使うこと。contamination の既定が "auto" であること。decision_function が低いほど異常で、負の値が外れ値・正の値が正常を表すこと。predict が正常に1、外れ値に−1を返すこと | scikit-learn: IsolationForest | 2026-10-26 |
median_abs_deviation が中央絶対偏差を計算し、標準偏差より外れ値に強い散らばりの尺度であること。scale="normal" で正規分布に合わせた換算ができること。nan_policy に propagate・omit・raise があること | SciPy: scipy.stats.median_abs_deviation | 2026-10-26 |
| EWMA が EWMA_t = λY_t + (1−λ)EWMA_{t−1} で計算され、λ が 0.2〜0.3 でよく使われること。管理限界が目標 ± k・s_ewma で、s_ewma² ≈ λ/(2−λ)・s²、k は通常3であること。λ の選び方で小さな、あるいはゆっくりしたずれに敏感にできること | NIST/SEMATECH e-Handbook of Statistical Methods: EWMA Control Charts | 2026-10-26 |
判定の基準と、外れた値の扱いの決まりは、研究開発部と分析室で決めてください。 本記事は上記の公式ページで確認できた範囲だけを扱っています。
実装ステータス:構成例。 公開仕様に基づいて設計した構成であり、当社で実際に構築・検証したものではありません。工数の数値はモデル条件による試算です。
自社の業務に使えるAI活用候補を整理します
このユースケース(UC-1908)についてのご相談はこちらから。
