こんにちは。バイロン・ウィンガードです。JMPのシステムエンジニアの一人です。普段は東海岸の製薬会社と仕事をしています。今日は、小さな変化の検出についてお話します。これは、プロセスデータやアッセイデータを調べ、小さな変化がいつ起こり、どのように検出するかを理解することです。データを遡って、また遡及的に調べ、過去に変化がいつ起こった可能性があるかを理解しようとします。継続的に収集されるデータのノイズの中から、シグナルを見つける方法についてお話します。
いくつか警告しておきます。あなたのプロセスはあなたを愛していません。あなたのシステム、それが計測システムであれ製造システムであれ、精製システムであれ、どんなプロセスであれ、入力となる物質の変動に対して、入ってくる品質管理方法よりも敏感です。これはどういうことでしょうか?純度など、あなたが求めているものを検出できれば素晴らしいのですが、期待していないものを検出することはできないのです。
さらに、ベンダー、特に化学薬品メーカーから発行される品質証明書(C of A)は、ロットごとにコピーされることがあります。原材料の小さな変化については、非常に高感度な検出方法を用いない限り、ほとんど警告されません。ほとんどの人にとって、そのような情報は存在しません。
もう一つ警告があります。あなたの追跡プログラムと傾向分析プログラムは、あなたを愛していません。その一因は私たちの責任です。私たちは現状に甘んじてしまっています。警告が多すぎると、人々はそれを無視し始めるとよく言います。しかし、その裏返しは、警告がないということです。すべてが順調に見えます。すべてが管理されています。私たちは何も心配する必要がありません。データを注意深く見ることもやめてしまいます。プロセスに影響を与えるものを検出できないという問題と、すべてが順調に見えるにもかかわらず、それほど注意深く見ていないという問題の間で、私たちは問題に直面する可能性があります。
なぜ管理図を使うのでしょうか?SPC、CPV、何と呼ぼうと、なぜ使うのでしょうか?一番大切なのは、共通原因による変動と特殊原因による変動を区別することです。これは、私たちが検知したプロセスの変化に対応するためのメカニズムです。統計を使えば、私たちは発見したものに対して非常に敏感になれます。また、アラートを自動化することで、例えば私たちが注意を払っていない時にも、何かを発見できるようにもなります。
しかし、こうした追跡と傾向把握は、実際には任意ではありません。製薬業界であれば法律で義務付けられています。基本的に他の製造業であれば、ISO9000でも同様の取り組みが求められています。任意ではありません。私たちは皆、これを実行し、プロセスを監視すべきです。
もう一つの警告は、あなたのプロセスが、後々あなたを悩ませるであろう事柄について、静かに警告しているかもしれないということです。つまり、製造実験で偶然に起こる出来事、危うく制御不能になりかけた、あるいはバッチの制御を失うところだった、といった状況です。制御不能ではないものの、データの中に小さな変化が見つかる奇妙な事象もあります。問題は、探していないものは見えないということです。
コインの裏側では、ランダム性に惑わされず、ランダムなシグナルを追いかけるだけにとどまるべきではありません。これが管理図の本質です。私たちは特殊原因による変動にのみ対応し、共通原因による変動には対応しません。私たちはその中間のデータを見ているのです。
私がお話ししたいのは、小さな変化を検知するためのツールボックスにあるいくつかのツールの応用についてです。CUSUMチャートがあります。これは非常に優れたツールです。理想的には、将来的に変化が起こったかどうかを調べるために使用します。これは、プロセスにおける上昇または下降の累積合計を調べるものです。このチャートを解釈するには様々な方法があります。もう一つ非常に優れたツールは、EWMA(指数加重移動平均)チャートです。これは非常に優れています。
次に、変化点検出という考え方について考えてみましょう。多変量解析では、Fused Lassoと呼ばれる手法についてこれからお話しします。さらに、パーティション、予測変数スクリーニング、ブートストラップフォレストといったツリー手法を用いて、小さな変化、シフト、ドリフトなどを探します。JMPには、これらを調べるための優れたツールがいくつか用意されています。その中でも重要なものをいくつかご紹介したいと思います。
CUSUMは、工程における小さな変化、特に最初はゆっくりと発生し、その後加速し始めるドリフトを検出するのに最適なツールです。チャート上で非常に明確に浮かび上がるパターンを見ることで、こうした変化を見つけることができます。以前はVマスクのようなものが主流で、Vマスクを見て、Vマスク内でデータがどこにあるのかを把握する必要がありましたが、少し手抜きのように感じました。今ではちゃんと機能します。非常に堅牢です。しかし、JMPでは数年前にこのプラットフォームを再構築し、より一般的な管理図に近い外観にしました。とても使いやすくなっています。
この管理図、CUSUM(累積和)にはいくつかのパラメータが使われます。シグマは、どの程度の差を検出したいかを表します。ヘッドスタートは、例えば初期応答の速さを表します。H値とK値は、検出できる変化の大きさを表します。そして、ここで使用しているシグマを定義するのはK-シグマ区間です。これらを適切に調整するには、いくつかのパラメータを調整する必要があります。
さて、もう一つご紹介した管理図はEWMAです。これは記憶容量が限られた管理図で、CUSUMは累積和に注目します。EWMAには記憶があり、過去の観測値をどの程度まで考慮するかを決定します。記憶には指数的に重み付けできます。繰り返しますが、EWMAにもいくつかのパラメータがあります。目標値、シグマ、そして特にラムダがあります。ラムダは平滑化の役割を果たしており、待機時間中に記憶のどの程度まで遡って全てを記憶するか、全く記憶しないか、あるいはその中間の何かを覚えているかといったことです。
どちらの方法も、シフトやドリフトの検出に非常によく使用されますが、使用するにはある程度の背景知識と専門知識が必要です。探しているものを正確に検出するには、適切な設定方法を知っておく必要があります。パラメータを過度に調整すると、存在しないものを検出したり、存在するものを見逃したりする可能性があります。また、正確な判定ができなくなる可能性があります。
機械学習っぽいツールを使って、私たちの背景や理解度にあまり左右されない判断を下してくれる方法があったら、素敵だと思いませんか? ええ、それは本当に素晴らしいですね。それを実現するのに役立つ方法があります。Fused Lassoです。これはツールボックスの一部で、高度な最新回帰分析手法です。一般化回帰分析を使って利用できるツールです。一般化回帰分析はJMP Proの機能で、ペナルティ付き回帰分析法です。
過去には、変化点を見つける方法としてこの手法が話題になりました。データ内の変化点がどこにあるのかをどうやって見つけるかという点については、複雑な数学とやや複雑な概念が絡んでくるのです。10年前、Clay Barker氏がGenreg、変化点検出、Fused Lassoに関する講演でこのアイデアを提示したことを改めて認識しなければなりません。
これは脚注みたいになってしまった類のものの一つだと思いますが、本当に重要なことです。私はここ数年この言葉を使っていますが、あまり知られていないことに気づきました。私はクレイ・バーカーの言うことを一言一句聞き逃しません。彼は私のヒーローですから。でも、他の人はそうではないかもしれません。
ここまで読んで、「バイロン、ちょっと待って。高度な最新回帰分析法?Genreg?JMP Proとか、すごく複雑な数学の話ばかりで、ちょっと不安だわ」と思うかもしれません。でも、実はこれは少し複雑なだけで、設定は比較的簡単で、よりシンプルな手法よりも有利なシグナル検出方法を構築できるんです。
背景情報です。JMPのパーティション・プラットフォームのようなものは、長年使われてきました。X軸とY軸に時間(応答値)を入力すると、平均値が時間とともに変化した箇所を見つけることができます。特に、行番号などの規則的なスケジュールを使用している場合は特に効果的です。これは、平均値のシフトなど、工程データがシフトした可能性のある箇所を見つけるのに非常に役立ちます。いくつかのブレークポイントも見つけられます。非常に優れた機能です。
いくつか小さな問題があります。ブレークポイントが近すぎると、見つけることができません。ノイズが大きすぎる場合も見つけることができません。ノイズの数が多い場合は、最初のものしか見つけられず、それ以降のものは見つけられない可能性があります。しかし、これは非常に優れたアイデアです。なぜなら、融合ラッソと同じように、平均値が似ているグループの近傍を見つけ、それから平均値の差を見つけようとしているからです。まさにこれがパーティションで行われていることです。
高度な回帰分析手法に戻りましょう。必要なのは、非常にシンプルな、つまり短い、実際にはシンプルではないJSL文を使って特別なデータ構造を作成することです。このJSL文を使って行列を作成します。この行列は、スライドに示されています。対角行列を想像してみてください。最初の列はすべて1で、次の列は0、そしてその次の列はすべて1です。次の列は0、0、そしてすべて1です。データテーブルで調べたい行ごとに、列が用意されています。
100行のデータがあれば、100列になります。1000行のデータがあれば、この対角行列は1000列になります。後で説明を簡潔にするために、これを「発見行列」と呼ぶことにしますが、これは全く間違った造語です。でも、私にとってはこれで十分です。
以前、この設定をする際に、この発見マトリックスとパーティションプラットフォームを使って同じことをすることができました。これにより、平均値の変化に対応する列を見つけることができるため、ブレークの検出感度が大幅に向上しました。この列はデータセットの行に相当します。これは非常にうまく機能し、設定も非常に簡単でした。
JMPはここ数年で大きく進化しました。JMPで私が気に入っている機能の一つは、予測変数スクリーニングと呼ばれるものです。予測変数スクリーニングでは、多数のツリーを構築し、それらを平均化します。
さて、肝心なのはここです。予測変数スクリーニングでは、例えば100本のツリーを作成し、発見行列の列からランダムにサンプルを取り、データの行からランダムにサンプルを取ります。つまり、私が説明しようとしているYのランダムなサンプルを見るだけです。ツリーを構築します。これを何度も何度も繰り返します。
一つのシフトが別のシフトに近い可能性がある部分は、すべてのツリーに含まれません。互いに近い他のシフトを見つけることができます。データセット全体にわたって多くのシフトを見つけることができます。これにより、パーティション分割では近いものを見つけられなかったり、発生しているシフトが2つ以上しか見つけられなかったりする問題がいくつか解決されます。これにより、より多くのものを見つけられるようになります。
これが実際にどれほどうまく機能するかをテストするために、サンドボックスを設定しました。「小さい」とはどの程度小さいことでしょうか?そして、私のサンドボックスはどのようなものでしょうか?まず、1~2シグマの変化を見つけたいのです。体系的な変化を見つけたいのです。これは、偶発的な製造実験や原材料の変更で私が目指しているものです。それらは制御不能に陥らせるほどではありませんでしたが、わずかに変化が加速した可能性があります。大量の原材料がなくなると、変化は再び減速します。これらはプロセスの実行中に起こる小さな変化であり、これにより、遡って分析し、その一部を特定することができます。本当に小さな変化を見つけたいのです。
こんな感じです。私のサンドボックスには約200行あります。最初の100行は、33+1のシフトがあり、その後66で-1のシフトがあります。平均値が3で、4までシフトアップし、そして再び3に戻ると平均値になります。これにはノイズが絡んでいます。これは実にすっきりとした、美しい図です。これを見て、「バイロン、こういうデータを見れば、いつでも見つかるよ」と思うでしょう。さて、最後に落とし穴をお話ししましょう。
この青い範囲にはシフトがありません。最初の100行には明確なシフトがあります。2番目のシフトには何もありません。ここがノイズです。このセクションでは何も見つからないはずですが、33と66では常にシフトが見つかるはずです。
信号が簡単に見つかる場合にこれを実行できる方法があると言うのはかなり大胆です。しかし、私のデータがこのような状態だとしましょう。数千セットのデータがあり、これらがすべて重ねてプロットされています。かすみがあり、私はいつも33と66の変化を見つけたいと思っています。平均的には、このデータを見て「ああ、バイロン、確かにそこに変化がある」と言えるでしょう。しかし、これらの中には、非常にきれいに変化するものもあれば、変化しないものもあり、また、青い部分にはノイズや偶然の産物だけが含まれているものもあります。変化を検出できる場合と検出できない場合、どれくらい正確に検出できるのでしょうか?
もう少し分かりやすくするために、例を挙げてみましょう。33ドルあたりの最初の変化は、一見すると「何かが上昇した」と分かります。しかし、2番目の変化は下降傾向のようです。はっきりとは分かりません。終盤にかけてはドリフトもシフトも見られませんが、上昇傾向なのでしょうか?それとも鋸歯状のパターンなのでしょうか?よく分かりません。こうした変化は、実際には簡単には見分けられないかもしれません。
さて、ここで少し話が逸れますが、実際にこれがどのように見えるかをお見せし、その後で結果のいくつかを評価します。さて、これが私のツールボックスです。ランダムなデータサンプルがあります。これは上向きのシフトがあり、赤い線でラベル付けされています。下向きのシフトにも赤い線でラベル付けされています。これはデータの管理図です。これだけを見ても、「確かに何かがある」と断言するのは難しいでしょう。
ここまで来て、CUSUM管理図を見てみましょう。紫色の線はシフトが発生している可能性のある箇所です。赤い線とはっきり並んでいるのが分かります。CUSUMがこのシフトを検出しているのが分かります。ここでK、H、シグマの値を変更すれば、より感度を高めることができます。これを0.15にしてみましょう。さて、Kの値を変更することで、もう少し小さくすることができます。さらに小さくしてみましょう。66は見つかりませんが、80~90の範囲で何かが見つかります。何かが起こっていることを示しています。これは良いテストです。
ここまで来ると、EWMAチャートが表示されます。もう少し大きくしてみましょう。ラムダスライダーがあり、調整できます。ここに行くとメモリが全くありません。ここに行くとメモリがすべてあります。CUSUMチャートとほぼ同じです。そう言いましたが、管理図をよく作る人はきっとそう言うでしょう。私がそう言ったからといって私を非難しないでください。でも、これが現状です。ここで、ラムダを下げたり上げたりすると、33付近の変化点を特定できますが、66付近では特に何も見つけることができません。
3つ目の方法を見てみましょう。ここでは予測変数スクリーニングを使っていて、小さなパレート図を作成しました。予測変数スクリーニングでは、発見マトリックスを作成しました。データセットをすぐに見てみましょう。いえ、データセットを見るつもりはありません。信じてください、そこにあります。ここに表示されているのは最初の推測です。行33にシフトがある可能性があると示されています。推測2、順位2は65です。142、そして35、40、80、70にも何かが見られます。最初の2つの推測はまさに的中しています。
私がやったのは、予測画面に表示されている各行に青い線をグラフに引くことです。説明力のある割合は、この青い線の太さで表されます。これは、33付近に何かが見られると思う、そして65付近に何かが見られると思う、ということを示しています。これは、平均値の推移における変化を非常にうまく検出しています。ここにこの点があり、もしこの点を完全に無視すると、この点が他の点に対して変化しているように見えるからです。しかし、私たちの目はそれを捉え、他の手法もそれを捉え、それを含めようとします。しかし、すべてのツリーに含まれているわけではないので、その変化を見つけることができました。これは非常に便利です。
これはどのくらいの頻度で正しく動作するのでしょうか?ぜひ知りたいですね。PowerPointに戻って、もう一度始めましょう。私が行ったのは、これらのデータセットの個々のデータを何千個もシミュレートすることです。それぞれに同程度のノイズがあり、検出しやすいものもあれば、検出が難しいものもありましたが、その数は数千個です。これらのデータセットのそれぞれに対して予測プロファイラーを実行し、上位10位を取得し、正しい行が選択されているかどうかを確認しました。
これが私の発見です。ほとんどの場合、定義したシフトポイントのすぐ近く、あるいはそのすぐ上で選択しています。ごく稀に、100を超えるノイズの中にある、何も起こっていないと確信できるポイントを選択することもあります。かなりうまく機能しているようです。
いくつかの統計を見てみましょう。これは8,000個の異なるサンドボックスを使ったものです。発見段階になると、おそらくこの数字はもっと大きくなるでしょう。予測子スクリーニングでスコアリングしたツリーは100本だけで、上位10位まで調べて、±3の範囲を取りました。33は±3、66は±3でした。この範囲内で抽出できたでしょうか?上位10位に同時に入った2つは、95%の確率で見つかりました。33のシフトは90%、66は92%の確率で見つかりました。これらのシフトを見つけるのはかなりうまくいっており、素晴らしいです。
このグラフでは、感度と特異度という概念を表現しようとしています。これは予測因子スクリーニングにおいて、上位10位、つまり上位10項目を取得します。私が聞きたいのは、それがプラスマイナス3の範囲内、あるいはプラスマイナス12の範囲内にある場合、その割合はどれくらいかということです。最初の選択肢はほぼ常に選択されていました。ノイズの中では、最初の選択肢、特に最初の5項目は非常にまれにしか現れませんでした。これは非常に有効で、非常に感度の高い手法です。
結論です。まず、JMPでは微小シフト検出は複数の手法で可能ですが、Fused Lassoアプローチを用いるというこのアイデアは素晴らしいです。JMP 19のグラフビルダー(ラインパーソナリティの一つ)には、ちょっとしたイースターエッグが隠されている予定です。確かなことは分かりませんが、19がリリースされたらぜひチェックしてみてください。これらの高度な手法は、スクリプトを使って発見行列を生成できるので、非常に簡単です。調整なしでも、このFused Lassoアプローチは非常にうまく機能します。少しのスキルと多くの可能性があれば十分です。
これを自分で実行できるスクリプトはありますか?サンドボックスツールは公開されますか?ええ、あります。ディスカバリーがリリースされる頃には、本当に便利なアドインがリリースされる予定です。データを選択して、サンドボックスツールやエクスプローラーツールを使って複数のシフト検出方法を試すことができます。それと、Clayがディスカバリーのマトリックスを作成するために使用したスクリプトを再公開します。少しでもお役に立てれば、あるいは少なくとも楽しんでいただければ幸いです。ディスカバリーでお会いできるのを楽しみにしています。廊下で見かけたら、声をかけてください。きっと会場にいますよ。
また後で会おうね。緊張したままでいてね。