스크립팅을 시작할 때 알고 싶었던 첫 번째 사항: 다양한 종류의 스크립트가 있습니다.위반에 다시 한 번!
나는 몇 주 전에 아버지와 이야기를 나누었습니다. 그와 데이트를 하려고 하지는 않았지만, 그는 JMP 버전 1.0부터. 마우스 사용법을 처음 배울 때 Mac II-se 옆에 3.5인치 디스크가 놓여 있는 것을 본 기억이 납니다. 같은 기계가 애리조나주 투산에서 열린 2019년 디스커버리 서밋 컨퍼런스에 전시되었습니다. 사진은 다음과 같습니다.

어쨌든 아버지와 나는 의논하고 있었다. 내 첫 번째 Five Things 블로그 시리즈 . 그는 누군가가 JMP에서 스크립팅을 시작하는 방법에 대한 시리즈를 작성했으면 좋겠다고 말했습니다. 그 당시 나는 이미 다른 기사를 쓰는 중이었기 때문에 향후 프로젝트를 위해 치워 두었습니다. 그러나 인생에는 다른 계획이 있었습니다. 일주일 후 고객 프레젠테이션을 도와 달라는 요청을 받았는데 놀랍게도 그들이 원하는 주제 중 하나가 스크립팅 소개였습니다! 우주는 분명히 농담을 좋아합니다.
어쨌든, 다시 시작합니다! 첫 번째 Five Things 시리즈의 형식에 따라 모든 사람이 대본을 시작할 때 알아야 할 다섯 가지가 있습니다. 먼저 개념적 사고입니다.
필요를 보고, 필요를 채우다
스크립팅을 시작하기 전에 필요성을 고려해야 합니다. 확률은 스크립트를 작성하려는 경우 몇 가지 이유가 있습니다. 아마도 당신은 직장에서 자신을 더 효율적으로 만들기 위해 그것을 하고 있을 것입니다. 그룹에 대한 분석 방법을 표준화하려고 할 수도 있습니다. 아니면 사실 당신은 웃음과 웃음을 위해 그것을 선택하기로 결정한 희귀한 사람들 중 하나일 수도 있습니다. 이 중 어느 것도 나쁜 이유는 아니지만 마지막 이유가 상황을 조금 더 어렵게 만들 수 있습니다(이유는 잠시 후에 설명하겠습니다). 요점은 머리 속에 이유가 있어야 하고 첫 대본에 대한 구체적인 목적이 있어야 한다는 것입니다.
스크립트가 있고 스크립트가 있습니다.
어쨌든 제 생각에는 두 가지 유형의 스크립트가 있습니다. 기존 데이터에 작용하는 스크립트와 데이터를 생성하는 스크립트입니다. 기존 데이터에서 작동하는 스크립트는 데이터 테이블 및 JMP의 기존 플랫폼과 상호 작용하여 새로운 사용자 정의 출력을 생성합니다. 이는 여러 보고서 주위에 창을 래핑하는 것처럼 간단할 수도 있고 Application Builder에서 사용자 정의 보고서처럼 복잡할 수도 있습니다. 주요 공통점은 이와 같은 스크립트가 기존 콘텐츠 수정 .
두 번째 그룹은 데이터를 생성하는 스크립트입니다. 데이터를 생성하는 스크립트는 시뮬레이션 도구, 사용자 정의 그래픽, JMP 파일에서 메타데이터를 관리하기 위한 도구 등이 될 수 있습니다. 이 그룹은 좀 더 모호하지만 공통 주제는 스크립트가 기존 데이터 또는 분석을 강화하는 것 이상으로 JMP를 확장한다는 것입니다. 대부분의 경우 이러한 스크립트는 새 콘텐츠 만들기 기스로부터.
기존 콘텐츠를 수정하는 스크립트는 일반적으로 사람들이 JSL(JMP 스크립팅 언어) 학습을 생각할 때 시작하는 곳입니다. 이것은 또한 우리가 토론을 시작할 곳입니다. 이제 한 걸음 물러서서 왜 JSL을 배우는 데 관심이 있는지 생각해 봅시다.
나에게 문장을 줘, 바실리. 한 문장만 부탁드립니다.
잠시 시간을내어 당신에 대해 생각하십시오 필요 . JSL로 해결하고자 하는 문제는 무엇입니까? 웃음과 웃음을 위한 스크립팅(최소한 처음에는)이 까다로울 수 있는 이유를 이제 이해하셨습니까? 정상에 도달할 이유가 있다면 학습 곡선을 극복할 가능성이 훨씬 더 높습니다. 나는 당신이 JSL을 선택할 수 없다는 말이 아니라 추가 동기 없이는 싸움이 더 어렵다는 것입니다.
다음 단계이자 이 에피소드에서 다룰 마지막 단계는 이러한 필요에 따라 무엇을 하느냐입니다. 간단한 대답은 두 가지 일을 할 것이라는 것입니다. 먼저, JSL을 배우도록 유도하는 (어쩌면 애매한) 아이디어를 문제 진술이라는 한 문장으로 적어야 합니다. 그리고 나는 단지 한 문장을 의미합니다. 아이디어를 구축할 수 있는 가시적인 것으로 구체화할 수 있는지 확인하세요. 범위 크립을 억제하는 데에도 도움이 됩니다. 여기 몇 가지 예가 있어요.
- 주간 보고서의 모든 그래프 생성을 하나의 스크립트로 자동화하고 싶습니다.
- 고객이 제공한 데이터 테이블의 서식 지정 작업을 자동화하고 싶습니다.
- 공장 컴퓨터 시스템에서 제공하는 데이터 파일에서 관리도 세트를 생성하고 싶습니다.
구체적인 내용을 말하는 것이 아닙니다. 나는 단순히 내가 JSL을 바라보게 만드는 문제점을 언급하는 것입니다. 그리고 나는 쓰기를 멈췄다.
펀치 목록 만들기
문제 진술이 있습니까? 좋은! 이제 스크립트에 대한 일련의 특정 결과물을 작성할 것입니다. SAS가 JSL 학습을 위해 제공하는 리소스를 찾는 데 도움이 되는 펀치 목록이 될 것입니다. 그래픽 사용자 인터페이스(GUI) 또는 사용자 인터페이스(UI)를 구체적으로 나열하지 마십시오. 스크립트가 수행해야 하는 작업을 나열합니다. 위의 문제 설명에 대한 예는 다음과 같습니다.
문제 설명 1: 주간 보고서의 모든 그래프 생성을 하나의 스크립트로 자동화하고 싶습니다.
펀치 목록:
- 지난 3주간의 데이터가 포함된 프로덕션 데이터베이스에서 데이터 세트를 가져옵니다.
- 내 제품에 대한 시간과 온도의 그래프를 만드십시오.
- 다항식 모델을 사용하여 시간 대 온도 분석을 실행합니다.
- 그래프와 보고서를 PowerPoint 파일로 내보냅니다.
문제 설명 2: 고객이 제공한 데이터 테이블의 서식 지정 작업을 자동화하고 싶습니다.
펀치 목록:
- 내부 표준에 따라 열 이름을 바꿉니다(사양의 표 사용).
- 필요한 열에 단위를 할당합니다(사양의 표 사용).
- 위도 및 경도를 지리적 좌표로 변환합니다.
- 변화 불량품 열 마디 없는 에게 서수 .
문제 설명 3: 공장 컴퓨터 시스템에서 제공하는 데이터 파일에서 관리도 세트를 생성하고 싶습니다.
펀치 목록:
- 네트워크 위치에서 데이터를 가져옵니다.
- 사양 제한을 할당합니다.
- 컨트롤 차트를 작성합니다.
여기에서 내가 너무 많이 박싱하지 않는다는 점에 유의하십시오. 스크립트가 필요한 작업 목록을 작성 중입니다. 나는 당신이 전에 JSL에서 일한 적이 없다고 가정하고 있기 때문에 당신이 이러한 문제를 어떻게 공격할 것인지 모른다고 가정하고 있습니다. 기록해두면 도움말과 리소스에서 무엇을 찾아야 하는지 알 수 있습니다. 이 시리즈의 다음 기사에서 내가 선택할 곳입니다.
이번 주 마무리 생각
이 시리즈는 몇 주에 걸쳐 진행될 것이므로 방금 읽은 것보다 함께 작업하는 시리즈로 만들기로 결정했습니다. 그래서, 내가 숙제로 만든 이 마지막 요점을 가져가라. 책임감이나 피드백을 원하시면 아래 댓글에 남겨주세요. 도움이 될 수 있으면 연락을 드리거나 나중에 문제가 발생할 가능성이 있는 경우 알려드리겠습니다.
보너스 포인트를 얻으려면 JMP에서 스크립트 창을 엽니다( 파일 > 새로 만들기 > 스크립트 ) 문제 설명과 중요 항목을 스크립트 창에 입력합니다. 줄 시작 부분에 이중 슬래시("//")를 사용하여 한 줄에 하나씩 입력합니다. JSL 스크립트 편집기에서 해당 행의 텍스트 색상이 녹색으로 변경되는 것을 볼 수 있습니다. 다음 에피소드에서 방금 수행한 작업을 다룹니다.
아, 그리고 바실리가 누구인지, 왜 그가 당신에게 단수 문장을 주어야 하는지 궁금하다면 한 번 보세요. 여기 .

스크립트에는 기존 데이터에 작용하는 스크립트와 데이터를 생성하는 스크립트의 두 가지 유형이 있습니다.
Re: 스크립팅을 시작할 때 알았으면 하는 첫 번째 사항: 다양한 종류의 스크립트가 있습니다.좋은 생각! 몇 가지 추가 도움말은 시리즈의 2부에서 살펴보세요. 스크립팅을 시작할 때 알고 싶었던 두 번째 사항: 도움 받기
최상의,
중
Re: 스크립팅을 시작할 때 알았으면 하는 첫 번째 사항: 다양한 종류의 스크립트가 있습니다.좋은 생각.JMP 학습을 위한 최신 버전의 JMP 스크립팅 시작 , Murphrey와 Lucas가 저에게 도움이 되었습니다.
Re: 제가 스크립트 작성을 시작했을 때 알았으면 좋았을 첫 번째 것: 스크립트에는 여러 종류가 있다는 것제가 주로 사용하는 프로그래밍 언어는 SAS입니다. 데이터 스텝, 매크로 언어, 프로시저 SQL, 프로시저 IML 등을 사용하므로 특정 언어 하나만을 쓰는 건 아니지만, JMP를 사용하는 짧은 강좌를 보고 바로 흥미를 느꼈습니다. 왜냐하면, 오랜 세월 동안 프로그래밍에서 정말 중요한 것은 단 두 가지뿐이라는 결론을 내렸기 때문입니다.
1. 처음에는 "귀사의 소프트웨어가 정확한 답을 제공합니까?"라고 물었지만, "귀사의 소프트웨어가 이의 제기나 비판에 대해 방어할 수 있는 답을 제공합니까?"로 변경했습니다.
2. 1번 질문에 대한 답을 얼마나 빨리 구할 수 있나요?
처음에는 JMP의 마우스 클릭 기능만 사용했는데, JMP를 더 효율적으로 사용하려면 JSL을 배워야 한다는 것을 알게 되었습니다.
예를 들어, 저는 학생들에게 k-nn을 사용하여 연속형 결과 변수를 예측하는 방법을 보여주고 있습니다. 연속형 결과 변수와 검증 변수가 있고, 예측 변수는 총 12개(연속형과 명목형이 혼합됨)입니다. 예측 변수를 하나씩 제거해 나가면서 R² , RASE, AAE가 어떻게 변하는지 보여주고 싶습니다. 이를 위해서는 예측 변수를 12개로 시작해서 11개, 그리고 마지막으로 2개까지 줄여가며 실행해야 합니다. 이 블로그 시리즈의 세 번째 게시글에서 '새 창'에 대해 알게 되었습니다.
New Window("My Window",
// Launch platform: K Nearest Neighbors 12 Variables
Data Table( "Boston Housing Plus Validation Column" ) <<
K Nearest Neighbors(
Validation( :Validation ),
Y( :MEDV ),
X(:CRIM, :ZN, :INDUS, :CHAS, :NOX, :RM, :AGE, :DIS, :RAD, :TAX, :PTRATIO, :LSTAT),
K( 20 )
);
additional analyses with 10 predictors down to last run with 2. So, a total of 11 analyses.
);
"새 창"을 선택하면 결과가 하나의 창에 출력됩니다. 이전에는 11개의 서로 다른 예측 변수 목록을 사용하여 k-nn을 실행했을 때 11개의 창이 출력되었습니다. 그런 다음 결과 표를 마우스 오른쪽 버튼으로 클릭하고 "결합 데이터 표 만들기"를 선택하면 11개의 분석 결과를 하나의 표에서 볼 수 있습니다.
11개의 서로 다른 분석(예측 변수 12개에서 2개로)을 수행하는 코드를 반복문으로 변환해야 한다는 것은 명백해 보입니다. 이것이 제가 JSL을 배우면서 다음으로 해야 할 일입니다.
JMP JSL 초보자.
게시글 감사합니다. 저는 윈도우 컴퓨터에서 JMP 학생용 버전 19를 사용하고 있습니다.
남자
Re: 제가 스크립트 작성을 시작했을 때 알았으면 좋았을 첫 번째 것: 스크립트에는 여러 종류가 있다는 것@jkeighley 님 , 좋은 말씀 감사합니다! 시리즈가 도움이 되셨다니 기쁩니다. 조금 복잡한 내용일 수도 있지만, 이 예시를 한번 살펴보세요... 새 보고서를 구성하는 데 도움이 될 만한 아이디어를 얻으실 수 있을 겁니다 (스크립팅 색인에서 세부적인 부분을 찾아보실 수 있을 거예요).
Names Default To Here( 1 );
Clear Log();
// data table goes here
dt = Open( "$Sample_Data/penguins.jmp" );
// report names go here (this is what the tabs will be named)
reportNames = {"report 1", "report 2", "report 3", "report 4", "report 5"};
// jsl for each tab's contents go here. One tab per Expr() call. They
// should be in the same order as the report names.
reportScripts = {Expr(
dt << Scatterplot 3D(
Y( :Culmen Length, :Culmen Depth, :Flipper Length ),
Coloring( :Species ),
Normal Contour Ellipsoids( 1, :Species ),
Nonpar Density Contour( 1, :Species ),
Legend( 1 ),
Frame3D(
Set Graph Size( 655, 672 ),
Legend( 1 ),
Set Grab Handles( 0 ),
Set Rotation( -72.1900689453449, -1.75327107936844, 34.4563606108469 )
),
SendToReport( Dispatch( {}, "Density Contour Controls", OutlineBox, {Close( 1 )} ) )
)
), Expr(
dt << Hierarchical Cluster(
Y( :Culmen Length, :Culmen Depth, :Flipper Length, :Body Mass, :Delta 15 N, :Delta 13 C ),
Label( :Species ),
Method( "Centroid" ),
Standardize By( "Columns" ),
Color Clusters( 1 ),
Show Dendrogram( 0 ),
Dendrogram Scale( "Distance Scale" ),
Number of Clusters( 4 ),
Constellation Plot( 1 ),
Cluster Summary( 1 )
)
), Expr(
dt << Graph Builder(
Size( 662, 560 ),
Show Control Panel( 0 ),
Variables( X( :Species ), Y( :Culmen Length ) ),
Elements( Points( X, Y, Legend( 3 ) ) )
)
), Expr(
dt << Graph Builder(
Size( 662, 552 ),
Show Control Panel( 0 ),
Variables( X( :Body Mass ), Y( :Flipper Length ), Overlay( :Species ) ),
Elements( Points( X, Y, Legend( 13 ) ), Contour( X, Y, Legend( 16 ), Contour Type 2D( "HDR" ) ) ),
SendToReport(
Dispatch( {}, "Graph Builder", FrameBox,
{DispatchSeg( Contour Seg( "Contour (Adelie penguin (Pygoscelis adeliae))" ), {Line Color( {230, 159, 0} )} ),
DispatchSeg( Contour Seg( "Contour (Chinstrap penguin (Pygoscelis antarctica))" ), {Line Color( {86, 180, 233} )} ),
DispatchSeg( Contour Seg( "Contour (Gentoo penguin (Pygoscelis papua))" ), {Line Color( {0, 158, 115} )} )}
)
)
)
), Expr(
dt << Fit Group(
Bivariate( Y( :Flipper Length ), X( :Culmen Length ), Nonpar Density( {Contour Fill( 1 ), Color Theme( "Spectral" )} ) ),
Bivariate( Y( :Flipper Length ), X( :Culmen Depth ), Nonpar Density( {Contour Fill( 1 ), Color Theme( "Spectral" )} ) ),
Bivariate( Y( :Body Mass ), X( :Culmen Length ), Nonpar Density( {Contour Fill( 1 ), Color Theme( "Spectral" )} ) ),
Bivariate( Y( :Body Mass ), X( :Culmen Depth ), Nonpar Density( {Contour Fill( 1 ), Color Theme( "Spectral" )} ) ),
<<{Arrange in Rows( 2 )}
)
)};
// I'm creatng an Associative array to manage the looping for me
reports = Associative Array( reportNames, reportScripts );
// build the window wrapper
nw = New Window( "Example Report", tb = Tab Box() );
// loop through the AA and append each tab page box to the tab box in the report
For Each( {{k, v}, i}, reports, tb << Append( Tab Page Box( Title( k ), Eval( v ) ) ) );
// set the view back to the first report.
tb << Set Selected( 1 );