지금까지의 블로그에서 알 수 있듯이 JMP에서 Python 연계를 사용하는 이점은 Python 패키지를 이용하여 JMP에 탑재되지 않은 기능이나 분석 기법을 사용할 수 있다는 것입니다.
이번에는 그 예로서 밀도 기반의 클러스터링 기법 HDBSCAN을 JMP의 Python 제휴로 실현하는 방법을 다룹니다. JMP에는 k-means 방법과 같은 클러스터 분석이 있지만 HDBSCAN은 탑재되어 있지 않습니다.
게다가 이전에 소개한 다이얼로그와 조합합니다. 대화 상자에서 변수(열)를 지정할 수도 있습니다. 즉, 클러스터링에 사용하는 변수를 그 자리에서 선택하고, 파라미터의 값도 지정해 실행할 수 있다고 하는 것입니다. JMP의 분석 플랫폼과 거의 같은 조작감으로 HDBSCAN을 사용할 수 있습니다.
ダイアログによるHDBSCANの実行대화상자로 HDBSCAN 실행
HDBSCAN이란?
HDBSCAN은 데이터의 "밀도"에 주목하여 클러스터를 찾는 기술 입니다. 데이터 점이 밀집되어 있는 영역을 하나의 클러스터로 간주하고 밀도가 낮은 영역을 경계로 하여 데이터를 구분해 갑니다.
HDBSCAN은 사전에 클러스터 수를 지정할 필요가 없으며 데이터에서 자동으로 결정됩니다. 또, 이상치를 노이즈로서 분리할 수 있는 곳이 큰 특징입니다. k-means 방법과 같은 클러스터링 기술에서는 지정된 클러스터 수에 대해 이상값도 항상 어딘가의 클러스터로 분류됩니다. 반면 HDBSCAN은 클러스터에 속하지 않는 점을 노이즈로 취급합니다.
클러스터 수를 지정하지 않고 대신 "밀집을 클러스터로 허용하는 방법"을 결정하는 두 가지 매개 변수가 있습니다.
최소 클러스터 크기 : 클러스터로 허용되는 최소 데이터 포인트 수
이보다 작은 작은 모음은 클러스터로 간주되지 않습니다. 값을 늘리면 작은 클러스터가 허용되지 않으므로 클러스터 수가 줄어들 수 있습니다.
최소 샘플 : 밀도를 측정 할 때 참조하는 이웃 점 수
클수록 밀도 판정이 보수적이 되고 노이즈(-1)가 증가합니다 . 이상치라고 판정할 때의 엄격함을 지정한다고 생각해 주세요.
파이썬을 시작으로 한 코드 (.py)
대화 상자를 만들기 전에 먼저 Python을 시작으로 한 방법 (.py)으로 HDBSCAN 부분을 작성해 보겠습니다.
난수를 사용해 의사적으로 작성한 샘플 데이터 「HDBSCAN_sample.jmp」(1,000행, 연속 척도 6열의 데이터, 본 블로그에 첨부)를 연 상태에서 .py(Example2_HDBSCAN.py)를 실행하면, 「X1」~「X6」를 사용한 HDBSCAN이 실행됩니다.
다음은 코드의 주요 부분입니다. JMP의 열 「X1」~「X6」을 pandas의 DataFrame(테이블 형식의 데이터 구조)로 변환해, 데이터의 표준화를 실시하고 나서, HDBSCAN를 실행하고 있습니다.
Pythonを起点としたコード파이썬을 시작으로 한 코드
※이 코드를 실행하려면 사전에 스키트런 과 hdbscan 을 JMP의 Python 환경에 설치해야합니다.
실행하면 데이터 테이블에 세 개의 열이 추가됩니다.
- 무리 : 속한 클러스터의 번호를 저장합니다 (명의 척도). -1은 어디에도 속하지 않는 노이즈(이상치)를 나타냅니다.
- 클러스터_프로브 : 해당 클러스터에 속한 강도(0-1)입니다. "소속 확률"로 번역되지만, 정확하게는 1에 가까울수록 클러스터의 핵심, 0에 가까울수록 경계 부근에 있음을 나타내는 지표입니다.
- 이상치 점수 : 주변 밀도에 대해 얼마나 고립되어 있는지를 나타내는 점수(0~1)입니다. 높을수록 이상값이라고 판단합니다.
データテーブルにクラスタリングの結果を追加데이터 테이블에 클러스터링 결과 추가
JMP로 탐색적으로 분석
여기서부터는 JMP의 기능을 이용합니다. 첫째, 데이터 테이블에서 클러스터별 마커 색 구분(행 > 열 값별 색/마커 구분)을 수행하면 다른 분석에서도 그룹의 차이를 한눈에 알 수 있습니다.
주성분 분석을 수행하고 스코어 플롯을 보면 3개의 클러스터가 깨끗하게 분리되어 적색(-1)의 점이 어느 군에서도 멀리 흩어져 있는 모습을 확인할 수 있습니다.
主成分分析とクラスタリングの結果주성분 분석 및 클러스터링 결과
다변량 > 다변량 상관을 사용하여 다변량 이상치 분석을 수행하면 이 데이터가 시뮬레이션에 의한 의사임을 알 수 있습니다. Mahalanobis 거리의 플롯에서 행 번호의 순서로 깨끗하게 색이 나뉘어져 있는 것은, 그룹별로 정리해 생성된 데이터이기 때문입니다.
Mahalanobisの距離Mahalanobis 거리
대화상자에서 범용 도구로(.jsl)
여기까지의 코드는, 변수가 「X1」~「X6」에 고정되어 파라미터의 값도 코드에 직접 기입해지고 있습니다. 다른 데이터와 함께 사용하려면 항상 다시 작성해야합니다.
따라서 대화 상자를 사용하여 열을 선택하고 최소 클러스터 크기 / 최소 샘플 을 지정할 수 있습니다. 다이얼로그는 JSL로 밖에 만들 수 없기 때문에, 여기에서는 JSL을 기점으로 한 코드(Example2_HDBSCAN.jsl)가 됩니다. 요점은 두 가지입니다.
1. 대화 부분
- 콜 리스트 박스(모두, …) : 대화 상자에 데이터 테이블의 모든 열을 표시합니다(왼쪽 목록).
- Col List Box( 숫자, … ) : 선택된 열을 받는 측의 리스트입니다 (오른쪽의 리스트). Numeric을 지정하면 숫자 열만 허용됩니다.
- Button Box( " > " ) : 왼쪽 목록에서 선택한 열을 오른쪽 목록에 추가합니다.
// ダイアログの起動
nw = New Window( "HDBSCAN Settings",
<
<MODAL>
= 2 ), V List Box( H List Box( Panel Box( "Columns", srcList = Col List Box( All, width( 180 ), nlines( 12 ) ) ), V Center Box( Button Box( " > ", xList << Append( srcList << Get Selected ) ) ), Panel Box( "Variables for HDBSCAN", xList = Col List Box( Numeric, Min Items( 2 ), width( 180 ), nlines( 12 ) ) ) ), Panel Box( "Parameters", H List Box( Text Box( "min_cluster_size " ), mcsBox = Number Edit Box( 30, 5 ), Spacer Box( Size( 24, 0 ) ), Text Box( "min_samples " ), msBox = Number Edit Box( 10, 5 ) ) ), Button Box( "OK", selCols = xList << Get Items; mcsV = mcsBox << Get; msV = msBox << Get; ) ) );
</MODAL>
2. 파이썬 결과를 받고 열로 추가
ダイアログで選択した列やパラメータの情報を、Python Send() を使ってPythonに送付します。Python側では、この変数を使ってhdbscanパッケージによるクラスタリングを実行します。
Python Send( selCols );
Python Send( mcsV );
Python Send( msV );
この後の <EM>Python Get()</EM> は Python Send() の逆で、Python側の変数をJSLに取り込みます。これにより、JMPのデータテーブルに新しい列が作成できます。
// Python結果の受け取り、列の追加
labs = Python Get( labels );
prb = Python Get( probs );
outs = Python Get( outliers );
cCol = dt << New Column( "Cluster", Numeric, Nominal, Set Values( Matrix( labs ) ) );
pCol = dt << New Column( "Cluster_Prob", Numeric, Continuous, Set Values( Matrix( prb ) ) );
oCol = dt << New Column( "Outlier_Score", Numeric, Continuous, Set Values( Matrix( outs ) ) );
"HDBSCAN_sample.jmp"에 대해 이 JSL 코드를 실행하면 대화 상자에서 예를 들어 "X2", "X3", "X4", "X5"의 네 가지 변수만을 대상으로 클러스터링할 수 있습니다.
대화 상자를 사용하면이 데이터 이외에도 동일한 스크립트를 적용 할 수 있습니다. JMP의 샘플 데이터 「Powder Metallurgy.jmp」의 「P1」~「P5」의 5개의 연속 변수를 사용해, 행수에 맞추어 최소 클러스터 크기 를 300, 최소 샘플 을 30으로 변경해 봅니다.
HDBSCANのオプション設定HDBSCAN 옵션 설정
확인 버튼을 클릭하면 주성분 분석 보고서 등이 표시됩니다.
別のデータにおけるレポート다른 데이터의 보고서
이 예와 같이, JMP에는 없는 수법의 계산 처리는 Python의 패키지에 맡기고, 결과의 해석과 탐색은 JMP로 실시한다. 그리고, 그 조작은 다이얼로그에 정리해, 변수를 자유롭게 선택할 수 있도록 한다. 이 방법으로 JMP 사용자가 사용할 수 있는 범용 도구를 만들 수 있습니다.
총 4회 정리
전 4회에 걸쳐, JMP의 Python 통합 기능으로 「결국 무엇을 할 수 있을까」를, World Bank로부터의 데이터 취득과, HDBSCAN에 의한 클러스터링의 2개의 구체예를 따라 설명해 왔습니다.
이 예제에 공통적 인 것은 JMP에 탑재되어 있지 않은 기능이나 분석 기법은 Python의 패키지에 맡기고 그 결과는 JMP의 데이터 테이블과 리포트에서 탐색 및 시각화하는 것입니다.
게다가, 조건이나 변수의 지정을 JSL의 다이얼로그에 정리하면, 코드를 재기입하지 않고, 누구라도 반복 사용할 수 있는 범용적인 툴이 됩니다.Python과 JMP 각각의 특기 분야를 조합하여 분석의 폭을 넓힐 수 있는 것. 이것이 JMP의 Python 연계의 가장 큰 장점입니다.
이제 생성 AI에 하고 싶은 내용을 프롬프트로 전달하면 파이썬 코드를 작성할 수 있습니다. 그렇게 생성된 코드를 JMP의 틀에서 활용하기 위한 힌트로 본 시리즈가 도움이 되면 다행입니다.
마지막으로, 본 블로그 시리즈(전 4회)의 내용을 12분 정도로 정리한 동영상을 공유합니다(일본어).
by 마스카와 나오히로(JMP Japan)
마스카와 나오히로 - JMP 사용자 커뮤니티