안녕하세요. 저는 바이런 윙거드이고, JMP 시스템 엔지니어 중 한 명입니다. 저는 주로 미국 동부 해안 지역의 제약 회사들과 협력합니다. 오늘은 작은 변화 감지에 대해 이야기해 보겠습니다. 프로세스 데이터나 분석 데이터를 살펴보고 작은 변화가 언제 발생하는지, 그리고 어떻게 감지하는지 파악하는 것입니다. 데이터를 과거로 되돌려 분석하고, 과거에 변화가 발생했을 가능성이 있는 시점을 파악하는 것도 포함됩니다. 지속적으로 수집되는 데이터의 노이즈 속에서 신호를 찾는 것에 대해 이야기해 보겠습니다.
몇 가지 경고가 있습니다. 당신의 공정은 당신을 좋아하지 않습니다. 당신의 시스템, 어떤 공정이든, 측정 시스템이든 제조 시스템이든, 정제 시스템이든, 그 어떤 공정이든, 들어오는 품질 관리 방법보다 투입량 변화에 더 민감합니다. 무슨 말일까요? 순도처럼 당신이 찾는 것들은 감지할 수 있다면 좋겠지만, 예상치 못한 것들은 감지할 수 없을 것입니다.
게다가, 특히 화학 제품 공급업체의 C of A(품질 보증서)는 로트마다 복제되는 경우가 많습니다. 입고되는 원자재의 사소한 변화에 대해서는, 이를 감지할 수 있는 매우 정밀한 방법이 없다면 별다른 경고가 없습니다. 하지만 대부분의 사람들에게는 그런 방법이 아예 없습니다.
또 경고합니다. 추적 및 추세 분석 프로그램이 마음에 안 드시나요? 저희 탓도 있습니다. 저희가 너무 안일하게 굴었기 때문입니다. 다들 알람이 너무 많으면 사람들이 무시한다고들 하죠. 하지만 그 반대의 경우도 있습니다. 알람이 아예 없는 겁니다. 모든 게 잘 돌아가고 모든 게 잘 통제되고 있으니까요. 아무것도 걱정할 필요가 없습니다. 데이터를 꼼꼼히 살펴보지도 않습니다. 프로세스에 영향을 줄 만한 요소를 감지하지 못하는 문제와, 모든 게 잘 돌아가는 것 같은데 제가 제대로 살펴보지 않으면 문제가 생길 수 있다는 문제 때문에요.
관리도를 사용하는 이유는 무엇일까요? SPC, CPV, 뭐라고 부르든 간에 왜 사용하는 걸까요? 가장 중요한 것은 공통 원인 변동과 특수 원인 변동을 구분하는 것입니다. 이는 감지된 프로세스의 변화에 대응하기 위한 메커니즘입니다. 통계를 활용하면 무엇을 발견하는지 매우 민감하게 파악할 수 있습니다. 또한, 알림을 자동화하여, 잘 모르겠지만 주의를 기울이지 않을 때 문제를 발견할 수 있습니다.
하지만 이 모든 추적 및 추세 분석은 선택 사항이 아닙니다. 제약 업계라면 법적으로 의무 사항입니다. 다른 종류의 제조를 한다면 ISO9000에도 이 내용이 포함되어 있습니다. 선택 사항이 아닙니다. 우리 모두 이를 준수하고 프로세스를 모니터링해야 합니다.
또 다른 경고는, 당신의 프로세스가 나중에 당신을 괴롭힐 일들에 대해 조용히 경고하고 있을 수도 있다는 것입니다. 제 말은 이렇습니다. 우연한 제조 실험들이 있습니다. 아슬아슬한 순간들이 있습니다. 예를 들어, "아, 거의 통제 불능이 됐거나, 배치를 거의 놓칠 뻔했다"와 같은 것들이죠. 통제 불능은 아니지만 데이터에서 작은 변화를 발견할 수 있는 이상한 것들이 있습니다. 문제는 당신이 찾고 있지 않은 것을 볼 수 없다는 것입니다.
반면에 무작위성에 속지 말고 무작위 신호를 추적해야 합니다. 이것이 바로 관리도의 핵심입니다. 우리는 특수 원인 변동에만 대응하고, 공통 원인에는 대응하지 않습니다. 우리는 그 경계선 안에 있으며, 그 사이의 데이터를 살펴보는 것과 같습니다.
제가 말씀드리고 싶은 것은 작은 변화를 감지하기 위해 저희가 제공하는 몇 가지 도구들을 활용하는 방법입니다. CUSUM 차트가 있는데, 정말 훌륭합니다. 이상적으로는 이 차트들을 전향적으로 활용하여 발생한 변화를 찾는 데 활용할 수 있을 것입니다. CUSUM 차트는 특정 과정에서 상승 또는 하락하는 누적 합계를 분석하는 것입니다. 이러한 차트들을 해석하는 데는 여러 가지 방법이 있습니다. 또 다른 유용한 도구는 지수가중이동평균(EWMA) 차트입니다. 이 차트들도 정말 유용합니다.
그러면 변화점 감지라는 개념을 살펴볼까요? 다변량 분석에서 융합 올가미(Fused Lasso)라는 기법에 대해 이야기해 보겠습니다. 그리고 분할, 예측 변수 선별, 부트스트랩 포레스트와 같은 트리 기법을 활용하여 발생하는 작은 변화, 이동, 표류를 찾아낼 수도 있습니다. JMP에는 이러한 변화를 살펴볼 수 있는 훌륭한 도구들이 있는데, 그중에서도 핵심적인 도구 몇 가지에 대해 이야기해 보겠습니다.
CUSUM은 프로세스의 작은 변화, 특히 느리게 발생하다가 점차 가속화되는 드리프트를 감지하는 데 매우 유용한 도구입니다. 차트에서 뚜렷하게 나타나는 패턴을 살펴보면 이러한 변화를 찾을 수 있습니다. 예전에는 V-마스크라는 것이 있었는데, V-마스크를 보고 V-마스크 안에서 데이터가 어디로 이동하는지 확인해야 했기 때문에 뭔가를 해야 하는 것처럼 느껴졌습니다. 하지만 JMP는 몇 년 전에 이 플랫폼을 일반 관리도처럼 보이도록 재구성했습니다. 사용하기 매우 편리합니다.
CUSUM이라는 관리도는 몇 가지 매개변수를 사용합니다. 시그마는 얼마나 큰 차이를 감지하고 싶은지를 나타내는 지표입니다. 빠른 초기 반응과 같은 선행 시점(head start)도 있습니다. H 값과 K 값은 감지할 수 있는 변화의 크기와 우리가 사용하는 시그마, 즉 K-시그마 간격을 정의하는 지표입니다. 이 지표들을 제대로 활용하려면 몇 가지 매개변수를 조정해야 합니다.
자, 앞서 언급했던 또 다른 관리도는 EWMA(European Weekly MA)입니다. 이 관리도는 제한된 메모리를 사용하는 관리도로, CUSUM은 누적 합계를 나타냅니다. EWMA는 메모리를 가지고 있는데, 이전 관측치가 얼마나 영향을 미치는지, 그리고 그 메모리에 기하급수적으로 가중치를 부여할 수 있는지를 나타냅니다. 다시 말하지만, EWMA에도 몇 가지 매개변수가 있습니다. 목표값, 시그마, 그리고 특히 람다입니다. 람다는 이러한 평활화(smoothing)를 나타내는데, 기억에서 얼마나 이전 시점까지 모든 것을 기억하는지, 아니면 아무것도 기억하지 못하는지, 아니면 그 사이의 어떤 것을 기억하는지를 나타냅니다.
이 두 가지 방법 모두, 그리고 이러한 방법들은 변화와 표류를 찾는 데 매우 일반적이지만, 이를 사용하려면 약간의 배경 지식과 전문 지식이 필요합니다. 원하는 것을 정확히 감지하기 위해서는 이 방법들을 어떻게 조정해야 하는지 알아야 합니다. 매개변수를 과도하게 조정하면 정확한 판단을 내리지 못하고, 존재하지 않는 것을 감지하거나 존재하는 것을 놓칠 수 있기 때문입니다.
우리의 배경이나 우리가 이해하는 바에 따라 편향되지 않고, 머신 러닝 같은 도구가 우리를 대신해서 그런 판단을 내릴 수 있다면 얼마나 좋을까요? 정말 멋질 것 같습니다. 그런 판단을 내릴 수 있는 방법이 있는데, 바로 융합 라소(Fused Lasso)입니다. 이 방법은 고급 현대 회귀 분석 도구의 일부입니다. 일반화 회귀를 통해 얻을 수 있는 도구입니다. 일반화 회귀는 JMP Pro의 기능 중 하나로, 페널티 회귀 분석법입니다.
과거에는 사람들이 이것을 변화점을 찾는 방법으로 이야기했습니다. 이 방법은 복잡한 수학과 데이터에서 변화점이 어디에 있는지 찾는 방법에 대한 다소 복잡한 아이디어로 귀결됩니다. 10년 전 Clay Barker가 Genreg, 변화점 감지, 융합 라소(Fused Lasso)에 대한 강연에서 이 아이디어를 제시했다는 점을 언급하고 싶습니다.
결국 각주처럼 쓰이게 된 것 같아요. 정말 중요한 부분이죠. 몇 년 동안 써 봤는데, 이걸 아는 사람이 많지 않다는 걸 알게 됐어요. 클레이 바커가 하는 말 하나하나에 귀 기울여 듣는데, 그는 제 영웅이에요. 하지만 다른 사람들은 아닐 수도 있죠.
이쯤 되면 "바이런, 좀 브레이크 좀 밟아 줘. 고급 현대 회귀 분석법? 장르? JMP Pro 같은 거랑 내가 따라가고 싶지도 않은 정말 복잡한 수학 문제까지 얘기하다니 좀 답답하네."라고 생각하실지도 모릅니다. 알고 보니 이건 아주 조금 복잡한 문제였습니다. 설정도 비교적 쉽고, 간단한 방법보다 더 나은 방식으로 신호를 감지하는 방법을 설정할 수도 있습니다.
배경 지식 좀 드릴게요. 사람들이 오랫동안 사용해 온 JMP의 파티션 플랫폼 같은 기능이 있습니다. X축과 Y축을 시간으로 설정하고, 원하는 응답을 입력하면, 특히 행 번호처럼 정규화된 일정을 사용하는 경우 시간 경과에 따라 평균이 변한 지점을 찾는 데 사용할 수 있습니다. 프로세스 데이터가 어디에서 변했는지, 예를 들어 평균이 변했을 가능성이 있는 지점을 찾는 데 매우 효과적입니다. 일부 중단점도 찾을 수 있고요. 정말 훌륭합니다.
몇 가지 작은 문제가 있습니다. 중단점이 너무 가까이 있으면 찾을 수 없습니다. 노이즈가 너무 크면 찾을 수 없습니다. 중단점이 많으면 첫 번째 중단점만 찾고 나머지 중단점은 찾지 못할 수도 있습니다. 하지만 융합 라소처럼 평균이 비슷한 그룹의 이웃을 찾은 다음, 평균의 차이를 찾는 것이 정말 멋진 아이디어입니다. 분할에서 바로 이런 일이 일어납니다.
고급 회귀 기법으로 돌아가서, 우리가 해야 할 일은 아주 간단한, 아니, 짧고, 사실 간단하지 않은 JSL 구문으로 행렬을 만들어 주는 특별한 데이터 구조를 설정하는 것입니다. 이 행렬은 슬라이드에 나와 있는 것과 같습니다. 첫 번째 열은 모두 1이고, 두 번째 열은 0, 그리고 그 다음 열은 모두 1인 대각 행렬을 상상해 보세요. 다음 열은 0, 0, 그리고 모두 1입니다. 데이터 테이블에서 살펴보고자 하는 모든 행에 대해 열이 하나씩 있습니다.
데이터 행이 100개면 열도 100개입니다. 데이터 행이 1,000개면 이 대각 행렬에 열도 1,000개입니다. 편의상 나중에 '발견 행렬'이라고 부르겠지만, 완전히 잘못 만들어진 용어입니다. 그래도 저는 잘 맞습니다.
이전에 이 설정을 사용했다면, 이 발견 행렬을 사용하고, 파티션 플랫폼을 사용할 수도 있었고, 같은 작업을 할 수도 있었습니다. 이렇게 하면 평균 변화에 해당하는 열을 찾을 수 있었기 때문에 중단점을 감지하는 데 훨씬 더 민감해졌습니다. 이 열은 데이터 세트의 행입니다. 정말 잘 작동했고, 설정도 매우 간단했습니다.
JMP는 지난 몇 년 동안 많은 변화를 겪었습니다. 제가 JMP에서 가장 좋아하는 기능 중 하나는 예측 변수 선별(predictor screening)입니다. 예측 변수 선별은 여러 개의 트리를 구축한 후 평균을 내는 방식입니다.
좋아요, 핵심은 이겁니다. 예측 변수 선별에서, 예를 들어 100개의 나무를 만들고, 그 발견 행렬의 열에서 무작위 표본을 추출하고, 제 데이터의 행에서 무작위 표본을 추출합니다. 제가 설명하려는 Y의 무작위 표본을 살펴보는 거죠. 이렇게 나무를 만드는 겁니다. 이 과정을 반복하고, 또 반복하고, 또 반복할 겁니다.
한 변이가 다른 변이와 가까이 있는 부분이 모든 트리에 나타나지는 않습니다. 서로 가까이 있는 다른 변이를 찾을 수 있습니다. 해당 데이터 세트 전체에서 많은 변이를 찾을 수 있습니다. 이를 통해 분할에서 발생했던 문제 중 일부를 해결할 수 있습니다. 즉, 서로 가까이 있는 변이를 찾지 못하거나, 변이가 발생하더라도 두 개 이상의 변이를 찾지 못하는 문제가 해결됩니다. 이를 통해 훨씬 더 많은 변이를 찾을 수 있습니다.
이것이 실제로 얼마나 잘 작동하는지 테스트하기 위해 샌드박스를 설정했습니다. 얼마나 작은 것이 작은 것일까요? 제 샌드박스는 어떤 모습일까요? 음, 1~2 시그마 수준의 변화를 찾고 싶습니다. 체계적인 변화를 찾고 싶습니다. 이는 제가 의도치 않게 발생한 제조 실험이나 원자재 변경과 같은 맥락입니다. 통제 불능 상태가 된 것은 아니지만, 약간은 증가했을 수 있습니다. 많은 양의 원자재가 소진되면 다시 감소합니다. 이는 공정이 진행되는 동안 발생하는 아주 작은 변화이며, 이를 통해 법의학적으로 과거로 돌아가 일부를 진단할 수 있습니다. 저는 실제로 발생하는 아주 작은 변화들을 원합니다.
제 샌드박스에 약 200개의 행이 있다고 상상해 보세요. 처음 100개의 행에서는 33+1에서 시프트를 적용하고, 66에서 마이너스 1만큼 시프트를 적용합니다. 평균이 3이고, 4까지 시프트를 적용한 후 다시 3으로 돌아오는 것이 평균이라고 가정해 보겠습니다. 여기에는 노이즈가 있습니다. 이게 정말 깔끔하고 아름다운 그림입니다. 이걸 보면 "바이런, 이런 식으로 데이터를 살펴보면 항상 찾을 수 있잖아."라고 생각하게 될 겁니다. 좋아요, 하지만 마지막에 함정을 말씀드리겠습니다.
이 파란색 범위에는 시프트가 없습니다. 처음 100개 행에는 정의된 시프트가 있습니다. 두 번째 시프트에는 아무것도 없습니다. 여기가 노이즈가 있는 곳입니다. 이 섹션에서는 아무것도 찾을 수 없고, 33과 66에서는 항상 시프트가 있어야 합니다.
신호를 쉽게 찾을 수 있을 때 이런 방법을 사용할 수 있다고 말하는 건 꽤 대담한 발상입니다. 하지만 제 데이터가 이런 모습이라고 가정해 봅시다. 수천 개의 데이터 세트가 있다고 가정해 봅시다. 이 데이터들은 모두 서로 겹쳐져 있습니다. 흐릿한 부분이 있는데, 저는 항상 33과 66에서 그 변화를 찾고 싶습니다. 평균적으로 이 데이터를 보고 "그래, 바이런, 확실히 저기 있는 것 같아."라고 말할 수 있을 겁니다. 하지만 이 중 일부는 정말 깔끔하게 변하고, 일부는 변하지 않고, 일부는 저 파란색 부분에 무작위로 노이즈나 걸음걸이만 있을 겁니다. 제가 변화를 감지하는 것과 감지하지 못하는 것은 얼마나 잘하는 걸까요?
좀 더 명확하게 설명해 드릴게요. 33살쯤 되었을 때, 첫 번째 변화는 보기만 해도 뭔가 올라간 것 같아요. 하지만 두 번째 변화는 마치 하락 추세 같아요. 정확히는 잘 모르겠어요. 제가 마지막에 드리프트나 변화가 없는 상황에서, 상승하는 걸까요? 아니면 톱니 모양의 패턴일까요? 잘 모르겠네요. 이런 변화는 보기도, 감지하기도 쉽지 않을 것 같아요.
좋아요, 그럼 잠깐 엉뚱한 얘기를 해볼게요. 실제로 어떻게 보이는지 보여드리고, 그다음에 결과를 평가해 보도록 하죠. 좋아요. 여기 제 도구가 있습니다. 무작위 데이터 표본이 있는데, 여기 이 표본은 위쪽으로 이동하는 부분이 있고, 빨간색 선으로 표시되어 있고, 아래쪽으로 이동하는 부분도 빨간색 선으로 표시되어 있습니다. 이건 데이터에 대한 관리도일 뿐입니다. 이것만 봐서는 "네, 뭔가 있어요."라고 말하기 어려울 것 같습니다.
여기로 내려와서 CUSUM 관리도를 보면 보라색 선이 변화가 발생할 수 있는 지점입니다. 빨간색 선과 나란히 정렬된 것을 보면 CUSUM이 그 변화를 감지하고 있음을 분명히 알 수 있습니다. 여기서 K, H, 시그마 값을 변경하면 민감도를 높일 수 있습니다. 0.15로 설정해 보겠습니다. 이제 K 값을 변경하면 값을 조금 더 작게 할 수 있습니다. 더 작게 변경해 보겠습니다. 66은 찾지 못했지만, 여기서는 뭔가를 찾고 있고, 80~90 범위에 있습니다. 뭔가가 발생하고 있다는 것을 보여줍니다. 하지만 이건 좋은 테스트입니다.
여기로 내려오면 제 EWMA 차트가 있습니다. 좀 더 크게 만들어 볼게요. 람다 슬라이더가 있는데, 이걸 바꿀 수 있습니다. 여기로 가면 전혀 기억이 안 나고, 여기로 가면 모든 기억이 납니다. CUSUM 차트와 거의 똑같습니다. 제가 그렇게 말했는데, 관리도 많이 하시는 분들이 이 말을 들으실 거라는 걸 알고 있습니다. 제가 그렇게 말한다고 해서 저를 쫓아내지는 마세요. 하지만 사실 그런 겁니다. 여기서는 이 값을 줄이거나 람다 값을 늘리면 33 근처에서 변화점을 찾을 수 있지만, 66 근처에서는 아무것도 찾을 수 없습니다.
세 번째 방법을 살펴보겠습니다. 여기서는 예측 변수 선별을 사용하고, 방금 작은 파레토 차트를 만들었습니다. 예측 변수 선별에서 발견 행렬을 설정했습니다. 데이터 세트를 아주 빠르게 살펴보겠습니다. 아니요, 데이터 세트를 살펴보지 않을 겁니다. 믿으세요, 데이터 세트는 거기에 있습니다. 제가 여기 보이는 것은 첫 번째 추측입니다. 33행에서 변화가 있을 수 있다고 나와 있고, 두 번째 추측, 순위 2는 65입니다. 142, 35, 40, 80, 70에서 뭔가가 보입니다. 처음 몇 번의 추측은 정확히 맞았습니다.
제가 한 일은 예측 화면에 표시된 각 행에 대해 이 그래프에 파란색 선을 그린 것입니다. 설명하는 비율은 여기 파란색 선의 두께입니다. 33 근처에서 뭔가를 볼 수 있을 것 같고 65 근처에서 뭔가를 볼 수 있을 것 같다고 말하고 있습니다. 이것은 평균의 이동을 찾는 데 매우 효과적입니다. 왜냐하면 여기에 이 지점이 있고, 이 지점을 완전히 무시한다면 이 지점이 이 지점에 비해 이동한 것처럼 보일 것이기 때문입니다. 하지만 우리의 눈은 그것을 포착하고 다른 방법도 그것을 포착하고 그것을 포함하려고 합니다. 하지만 모든 트리에 포함되지 않았기 때문에 그 이동을 찾을 수 있었고, 그것은 매우 멋진 일입니다.
이게 얼마나 자주 제대로 작동할까요? 저도 알고 싶습니다. 파워포인트로 돌아가서 다시 시작해 보겠습니다. 제가 한 일은 수천 개의 개별 데이터 세트를 시뮬레이션하는 것이었습니다. 각 데이터 세트는 모두 동일하게 노이즈가 있었고, 일부는 감지하기 쉬웠고 일부는 감지하기 어려웠지만, 그 수는 수천 개였습니다. 각 데이터 세트에 대해 예측 프로파일러를 실행하고 처음 10개의 순위를 캡처한 후, 올바른 행을 선택했는지 확인했습니다.
제가 발견한 것은 다음과 같습니다. 대부분의 경우, 우리는 정의한 변화 지점에 아주 가깝거나 바로 그 지점을 선택합니다. 아주 드물게는 100을 넘는 노이즈 속에서 아무 일도 일어나지 않는다는 것을 확실히 알 수 있는 지점을 선택합니다. 꽤 잘 작동하는 것 같습니다.
몇 가지 통계를 살펴보겠습니다. 8,000개의 서로 다른 샌드박스를 대상으로 한 것입니다. 발견 단계에 도달할 때쯤에는 아마 더 많은 숫자가 될 것입니다. 예측 변수 스크리닝으로 점수를 매겼을 때, 100개의 트리만 사용하고 상위 10개 순위를 살펴본 결과, ±3의 범위가 있었습니다. 33개는 ±3, 66개는 ±3이었습니다. 이 범위 내에서 선택했을까요? 두 가지 모두 동시에 상위 10위 안에 들었을 때, 95%의 확률로 네, 그렇습니다. 33개를 찾았고, 33개에서 변화가 발생한 경우는 90%, 66개는 92%의 확률로 발견되었습니다. 이러한 것들을 찾는 데 꽤 잘하고 있는데, 정말 놀랍습니다.
이 그래프에서, 저는 민감도와 특이도에 대한 개념을 표현하고자 합니다. 예측 변수 선별에서, 우리는 처음 10개 순위, 즉 처음 10개 항목을 얻습니다. 제가 묻고 싶은 것은, ±3 윈도우 또는 ±12 윈도우 내에 있는지, 아니면 ±12 윈도우 내에 있는지, 그 확률은 몇 퍼센트입니까? 첫 번째 선택은 거의 항상 선택했습니다. 하지만 노이즈 속에서 첫 번째 선택, 특히 처음 5개는 매우 드물게 나타났습니다. 꽤 좋고 민감한 방법입니다.
결론. 첫째, 작은 변화 탐지는 JMP에서 여러 방법을 통해 쉽게 접근할 수 있지만, 융합 라소(Fused Lasso) 접근법을 사용하는 아이디어는 정말 환상적입니다. JMP 19 Graph Builder에는 라인 개성 중 하나인 작은 이스터 에그가 포함될 예정입니다. 확실히는 모르겠지만, 19가 출시되면 확인해 보세요. 이러한 고급 방법들은 스크립트를 사용하여 발견 행렬을 생성할 수 있기 때문에 매우 쉽습니다. 별도의 튜닝 없이도 이 융합 라소 접근법은 매우 효과적입니다. 약간의 기술과 많은 기회만 있으면 됩니다.
제가 직접 사용할 수 있는 스크립트가 있을까요? 샌드박스 도구 공유해 주실 건가요? 네. Discovery가 출시될 때쯤이면 정말 좋은 추가 기능이 나올 거예요. 데이터를 선택하고 샌드박스 도구와 Explorer 도구를 사용해서 여러 변이 탐지 방법을 사용할 수 있어요. 그리고 Clay가 Discovery 매트릭스를 만드는 데 사용했던 스크립트도 다시 게시할게요. 도움이 되길, 아니면 적어도 재밌게 읽으셨으면 좋겠어요. Discovery에서 뵙기를 바랍니다. 복도에서 저를 보시면 인사해 주세요. 제가 거기 있을 거예요.
나중에 또 만나요. 긴장하세요.