안녕하세요 여러분. 이번 프레젠테이션에서는 포인트 앤 클릭 방식과 기본적인 코드 해독 기술을 활용하여 까다로운 데이터를 가져오는 방법을 소개합니다. 오늘은 제 동료인 웬디 쳉과 함께합니다. 저희 둘 다 JMP에서 시스템 엔지니어로 일하고 있습니다. 저는 모니크 로어딩크 랜더입니다.
오늘은 까다로운 데이터 가져오기에 대해 이야기해 보겠습니다. 이 주제는 제가 연구 개발(R&D) 분야에서 일할 때 겪었던 여러 어려움에서 비롯되었습니다. 세 가지 사례를 살펴볼 텐데, 모두 여러 이미지, 웹사이트에서 가져온 여러 데이터 테이블 또는 여러 PDF 페이지를 가져오는 것과 관련이 있습니다.
이러한 데이터 소스들은 모두 직관적이지 않으며, 실험 데이터와 같은 다른 유형의 데이터를 보완하거나 대체하기 위한 것일 수 있습니다. 제가 이러한 문제에 직면했을 당시에는 스크립팅에 능숙하지 않았습니다. 이러한 문제들을 해결하기 위해 스크립팅을 배우긴 했지만, 모든 사람이 JSL을 배울 시간이나 관심이 있는 것은 아닙니다.
즉, 이러한 유형의 데이터를 효율적으로 가져오기가 어려울 수 있으며, 시간 부족으로 아예 포기할 수도 있다는 의미입니다. 하지만 JMP 17에서 도입되고 JMP 18에서 더욱 중요한 확장 기능이 추가된 JMP 워크플로 빌더 덕분에 이제는 어렵지 않습니다.
오늘은 이러한 유형의 데이터를 자동으로 가져오는 방법을 보여드리겠습니다. 워크플로 빌더(Workflow Builder)를 사용할 것이며, 코드는 전혀 사용하지 않고 JSL을 직접 활용할 것입니다. JSL 코드를 해독하거나 분석하는 과정을 거치겠지만요. 워크플로 빌더에 대한 기본적인 이해는 있다고 가정하고 진행하며, 만약 모르신다면 바로 심층 분석으로 넘어가겠습니다. 오늘은 세 가지 예제를 준비했습니다. 첫 번째 예제에서는 제 동료 웬디가 데이터 테이블로 사진을 자동으로 가져오는 방법을 보여드리겠습니다.
이건 제가 꼭 해야 하는 일이에요. 해야 할 일이 정말 많았죠. 저는 세제 배합 분야에서 일하면서 안경의 마모 및 세척 테스트를 진행했는데, 그 결과 수백 장의 안경 사진을 얻게 됐어요. 이 사진들을 데이터 테이블에 넣어 이미지 분석 데이터와 연결하고 싶었죠.
제게는 당시 그 부분이 꽤 까다로웠습니다. 웬디가 그 과정을 효율적으로 하는 방법을 보여줄 겁니다. 첫 번째 예시에 이어 두 번째 예시에서는 PDF 파일에서 데이터를 가져오고 필요한 정리 작업을 더 효율적으로 수행하는 방법을 설명하겠습니다. 마지막으로 웬디가 웹사이트에서 데이터를 가져오는 방법을 설명해 줄 것입니다. 그럼 웬디에게 마이크를 넘기겠습니다.
감사합니다, 모니크. 첫 번째 예시에서는 이미지를 활용하여 데이터 이해도와 소통을 향상시키는 방법을 보여드리겠습니다. 어떤 이미지인지 살펴볼까요? 안경 대신 강아지 사진을 사용해 보겠습니다.
지금 보시는 이 데이터 세트에는 이 열에 강아지 사진이 있습니다. 총 28개의 행이 있고, 28장의 강아지 사진이 있습니다. 이 사진들은 미국켄넬클럽(AKC)에서 공개한 데이터 세트와 결합된 것으로, 이 데이터 세트에는 미용 빈도, 털갈이 등 강아지에 대한 다양한 정보가 포함되어 있습니다.
다음으로 살펴볼 것은 개의 태도입니다. 여기 개의 인기도와 태도 사이의 관계를 보여주는 그래프가 있습니다. 특정 지점에 마우스를 올리면 해당 개의 사진을 볼 수 있습니다. 여기 아펜핀셔가 있습니다. 재미있는 예시이지만, 이 그래프를 통해 데이터에서 보이는 내용을 생생하게 이해할 수 있습니다. 이 데이터는 어떻게 모았을까요? 앞서 말씀드린 것처럼, 미국켄넬클럽(AKC)에서 공개적으로 제공하는 데이터 세트를 활용했습니다. 사진들을 파일 폴더에 저장해 두었다가 하나로 합쳤습니다.
자, 이제 이 내용을 살펴보겠습니다. 먼저 전체적인 내용을 보여드리기 위해 첫 번째 예시를 간략하게 설명해 드리겠습니다. 먼저 폴더에 있는 사진들을 쉽게 가져오는 방법으로 여러 파일 가져오기 기능을 소개하겠습니다. 그런 다음 워크플로 빌더를 사용하여 가져온 이미지들을 AKC 데이터 세트와 결합하여 하나의 사진을 만드는 과정을 보여드리겠습니다. 이 예시를 통해 간단한 것부터 복잡한 것까지 단계적으로 살펴보겠습니다.
마지막 단계에서는 워크플로 빌더에서 사용자 지정 JSL을 사용하여 사용자 프롬프트를 생성하는 방법을 살펴보겠습니다. 먼저 여러 파일 가져오기 기능을 사용하여 사진을 불러오는 방법을 알아보겠습니다. 여기에 AKC라는 폴더가 있는데, 이 폴더에는 강아지 사진이 들어 있습니다. 다른 파일들도 있지만 대부분 강아지 사진이고, 강아지 사진 파일들은 품종 이름으로 저장되어 있습니다. 이는 AKC 데이터 세트와 조인할 때 중요한데, AKC 데이터 세트에도 품종 이름이 포함되어 있기 때문입니다. 시작하기 전에 새 워크플로를 시작하고 녹화 버튼을 누르겠습니다.
이제 여러 파일을 가져오려면 해당 파일이 있는 폴더로 이동하세요. 여기 AKC 폴더가 있고, 사진 파일만 선택해야 합니다. 그런 다음 견종 이름을 데이터 테이블에 포함시키기 위해 파일 이름 열을 추가합니다. 이제 한 번에 28개의 사진이 모두 가져와진 것을 볼 수 있습니다. 이제 편집할 수 있는 파일 이름 열이 생겼습니다. AKC 폴더의 견종 이름과 연결하려면 .JPG 확장자를 제거해야 합니다.
워크플로를 중지하겠습니다. 제가 보여드리고 싶은 것은 JMP가 이 워크플로에서 이러한 단계를 JSL 형식으로 캡처한다는 것입니다. 이제 완료된 워크플로를 열어보겠습니다. 여기에서 완료된 워크플로를 보실 수 있으며, 제가 이 워크플로를 재생해 드리겠습니다. 이전에 데이터를 가져오고 이러한 단계를 생성하는 과정을 녹화해 둔 것인데, 한 가지 말씀드리고 싶은 점은 여러 파일을 가져올 때 JMP가 가져온 데이터 테이블의 이름을 첫 번째 파일 이름으로 지정하고 마지막 파일 이름에는 밑줄을 긋는다는 것입니다.
제 AKC 폴더에는 첫 번째 강아지는 아펜핀셔였고 마지막 강아지는 오터하운드였습니다. 이 워크플로우를 실행해 보면 결과는 다음과 같습니다. 이전에 보셨던 그래프와 동일하지만, 점 대신 강아지 사진을 넣었을 뿐입니다.
자, 이제 이러한 행동 유형들을 살펴보겠습니다. 저는 경계심, 반응성, 외향성 이렇게 네 가지 유형으로 행동 유형을 분류했습니다. 전체 AKC 데이터 세트에는 277개의 행이 있는데, 제가 사용한 사진이 28장밖에 없어서 그래프에 나온 것보다 더 많은 유형이 있습니다. 일부러 냉담하고 경계심이 많은 개들은 제외했습니다. 이렇게 하면 이 워크플로우가 얼마나 재사용 가능한지 보여줄 수 있습니다.
이제 AKC 폴더에 성격이 냉담한 개 네 마리를 추가하고, 이 워크플로우를 다시 실행하여 얼마나 다양한 상황에 적용할 수 있는지 보여드리겠습니다. 이 워크플로우는 원래 28마리의 개를 기준으로 만들어졌습니다. 여기 폴더를 불러오겠습니다. 마지막 개는 오터하운드였죠. 이제 오른쪽에 성격이 냉담한 개 네 마리를 불러와서 AKC2 폴더가 아닌 AKC 폴더에 넣겠습니다.
여기 AKC 폴더가 있습니다. 새 강아지 사진을 붙여넣겠습니다. 이제 AKC 폴더에 차분한 성격의 강아지들을 추가했으니 워크플로를 다시 실행해 보겠습니다. 이제 그래프에 차분한 성격의 강아지들이 추가된 것을 확인할 수 있습니다. 워크플로 빌더는 이렇게 유연합니다. 사진을 가져와 AKC 데이터 세트와 결합하고, 데이터 정리를 거쳐 그래프를 생성하는 워크플로를 기록했습니다. 그런 다음 해당 폴더에 파일을 더 추가하면 실행 버튼만 누르면 모든 것이 자동으로 업데이트됩니다.
워크플로 단계 중 하나를 자세히 살펴보겠습니다. 다음 단계의 복잡성, 약간의 코드 분석이 필요하지만 그리 어렵지는 않습니다. 여러 파일을 가져오는 단계를 살펴보고 캡처된 JSL 코드를 확인해 보겠습니다. JMP는 제 강아지 사진이 있는 특정 폴더 경로를 참조하고 있습니다.
만약 참조하고 싶은 다른 폴더가 있다면, 이 파일 경로를 수정하기만 하면 됩니다. 저는 AKC2라는 폴더가 있는데, 거기에 더 많은 강아지 사진이 있습니다. 여기서 이 작은 변경만 하면 워크플로우를 다시 실행할 수 있고, 이번에는 32마리가 아닌 53마리의 강아지가 표시되어 그래프가 훨씬 더 풍성해질 것입니다.
코드 추적을 위한 간단한 방법 중 하나는 단계 설정을 살펴보고 JSL 코드에 약간의 수정을 가하는 것입니다. 이제 마지막 단계에서 한 가지 더 변경 사항을 적용해 보겠습니다. 만약 이 워크플로를 다른 사람들과 공유하여 실행하게 하려면, 첫 번째 단계를 수정하여 사용자가 자신의 디렉터리에서 파일 폴더를 직접 설정하도록 하는 것이 좋을 것입니다.
이 단계로 다시 돌아와서 맨 아래로 스크롤합니다. '데이터 가져오기' 단계 대신 '창 만들기' 단계를 추가할 수 있습니다. 여기서 제가 추천하는 또 다른 변경 사항은 폴더 경로를 '바탕 화면'이나 '문서'와 같은 일반적인 이름으로 바꾸는 것입니다. 자, 이제 첫 번째 단계를 진행해 보겠습니다.
이제 폴더가 기본적으로 문서 폴더로 설정된 것을 확인할 수 있습니다. 파일 이름 추가 열과 같은 제가 선택한 모든 사항이 유지되었으며, 사용자는 사진이 있는 위치로 이동하라는 메시지를 받게 됩니다. 이 예제를 마무리하자면, 여러 파일을 가져와 하나의 테이블로 이미지를 불러오는 방법과 워크플로 빌더를 사용하여 유연한 워크플로를 만드는 방법을 살펴보았습니다. 이제 두 번째 예제를 위해 모니크에게 마이크를 넘기겠습니다.
네, 감사합니다, 웬디. 화면 공유할게요. 네, 됐습니다. 회의 제어 화면을 숨길게요. 네, 됐습니다. 좋아요. 안경 사진보다는 훨씬 귀여웠다는 데 모두 동의하실 거예요. 정말 좋은 예시였습니다. 두 번째 예시에서는 PDF에서 데이터를 살펴보겠습니다.
이유는 다음과 같습니다. 연구를 하다 보면 어떤 주제에 깊이 파고들 때 PDF 파일에서 아주 유용한 정보를 발견하곤 했습니다. 화학 참조표일 수도 있고, 성분 데이터일 수도 있었죠. 공급업체나 원자재에서 제공하는 계면활성제 정보일 수도 있었고, 분석 보고서일 수도 있었습니다.
데이터 양이 많은 경우가 많았는데, 그 데이터를 수동으로 데이터 테이블에 복사하는 방식으로 가져오고 싶지 않았습니다. 어떻게 하면 그 데이터를 JMP로 가져올 수 있을까요? 오늘 제가 보여드릴 것은, 우선 엑셀 가져오기 마법사나 다른 가져오기 마법사와 매우 유사한 포인트 앤 클릭 방식의 PDF 가져오기 마법사를 사용하는 방법입니다.
훌륭한 시작점입니다. 워크플로 빌더와 함께 사용하고, 웬디가 했던 것처럼 소스 코드를 조금씩 수정하여 가져오기 프로세스를 자동화하고 일부 과정을 좀 더 간편하게 만들겠습니다.
JMP 18에서는 워크플로 빌더에 정리 작업을 훨씬 수월하게 해주는 유용한 기능이 추가되었습니다. PDF 페이지를 많이 가져온 후에는 정리 작업을 해야 하는데, 특히 정리해야 할 표가 많을 경우 더욱 그렇습니다. 이제 워크플로 빌더를 사용하면 이러한 표들을 한눈에 살펴볼 수 있습니다. 이 기능도 보여드리겠습니다. 여기서 마무리하겠습니다. 먼저, 작업에 사용할 PDF 파일을 소개하겠습니다. 열어보겠습니다. 여기 있습니다.
이 예시를 살펴보겠습니다. 이 예시는 두 페이지짜리 PDF 파일로, 일반적인 지방의 지방산 구성이 나와 있습니다. 1페이지에는 동물성 지방의 구성이, 2페이지에는 식물성 지방과 오일의 구성이 나와 있습니다.
겉보기에는 깔끔하게 정리된 표처럼 보이지만, 첫 페이지를 자세히 살펴보면 PDF 형식으로는 보기 좋지만 JMP 데이터 표로서는 몇 가지 문제가 있음을 알 수 있습니다. 이는 데이터를 가져온 후 사용 가능한 형식으로 만들기 위해 추가 작업이 많이 필요하다는 것을 의미합니다.
예를 들어, 저희는 사실상 열 머리글이 없습니다. 첫 번째 열은 카테고리입니다. 그다음에는 백분율을 나타내는 열이 있고, 여기에도 백분율을 나타내는 열이 하나 더 있습니다. 여기에는 지방산을 나열하는 두 개의 열이 있는데, 하나는 포화지방이고 다른 하나는 불포화지방입니다.
그리고 여기에도 다른 열이 있습니다. 또 다른 문제는 여기에 하위 제목이 있다는 것입니다. 예를 들어, 이 소고기 지방은 하위 제목입니다. 여기에 소계가 있습니다. 이 부분을 삭제하는 것이 좋을 수도 있지만, 동시에 이 하위 제목을 그대로 유지하고 빈 공간에 채워 넣어야 합니다.
이것도 또 다른 문제입니다. 앞서 말씀드렸듯이, 이러한 하위 제목 중 일부는 두 줄에 걸쳐 있는데, 이는 JMP에서 문제를 일으킬 수 있습니다. JMP는 이러한 하위 제목들이 서로 관련되어 있다고 인식하지 못하기 때문입니다.
그리고 이렇게 여러 열에 걸쳐 있는 데이터도 있습니다. 이 데이터를 가져온 후에는 정리해야 할 문제가 많습니다. 다시 저널로 돌아와서 최종 결과를 먼저 살펴보겠습니다. 우리가 원하는 것은 JMP를 사용하여 두 페이지 모두를 가져오는 것입니다. 가능하면 한 페이지에서만 작업을 수행한 다음 모든 정리 단계를 진행하는 것이 좋습니다.
다시 말씀드리지만, 가급적 한 페이지에만 작업한 다음 JMP를 사용하여 두 페이지 모두에 적용하고 데이터를 통합하여 사용할 수 있도록 하겠습니다. 이 과정을 워크플로에 기록했습니다. 이것이 최종 결과이며, 나중에 다시 재현해 보겠습니다. 먼저 워크플로를 재생해 보겠습니다.
여기 두 페이지가 열리고 있고, 워크플로 빌더가 모든 정리 단계를 진행하고 있습니다. 단계가 꽤 많은데요. 먼저 첫 번째 데이터 테이블에서 작업을 완료하고, 이제 두 번째 데이터 테이블에서 동일한 작업을 재설정하고 수행합니다. 모든 작업이 완료되면 두 데이터 테이블을 하나로 합쳐서 통합된 데이터를 기반으로 결과를 출력합니다.
자, 됐습니다. 이 경우에는 포화지방과 포화지방 함량을 비교하는 겁니다. 좋습니다, 이제 워크플로우를 되감거나 재설정해서 이 출력들을 닫겠습니다. 이 워크플로우를 완전히 닫고 빈 워크플로우를 새로 열겠습니다. 그리고 오늘 작업 중인 프로젝트의 오른쪽에 도킹하겠습니다.
자, 그럼 처음부터 시작해서 PDF 파일을 열어보죠. 사실 PDF 가져오기가 완벽하게 작동하는 예시를 보여드리고 싶었지만, 굳이 그럴 필요는 없을 것 같네요. 그냥 믿으셔도 됩니다. JMP로 PDF 파일을 열면 JMP가 원하는 데이터 테이블을 완벽하게 인식해서 단 두 번의 클릭만으로 데이터 테이블에 불러올 수 있는 경우가 있거든요. 이게 바로 완벽한 예시입니다.
완벽하지 않은 예시를 들어보겠습니다. 이 PDF 파일을 열어보죠. 여기 링크를 더블 클릭하면 PDF 가져오기 마법사가 열립니다. 왼쪽 미리보기에서 바로 확인할 수 있듯이, JMP는 이 표를 예전처럼 제대로 인식하지 못합니다. 표의 일부는 인식하지만, 사용할 수 있는 부분은 아닙니다.
먼저 '모든 테이블 무시'를 선택해야 합니다. 그러면 모든 설정이 초기화됩니다. 이제 모든 설정이 초기화되었으므로 마우스를 사용하여 이 테이블을 선택할 수 있습니다.
이렇게 하면 JMP가 열의 위치를 추측합니다. 여기를 조금 확대해 보겠습니다. 그러면 JMP가 모든 열을 인식하지 못했다는 것을 알 수 있습니다. 이는 헤더가 여러 열에 걸쳐 있는 경우가 있기 때문입니다.
그건 문제가 안 돼요. 마우스 오른쪽 버튼을 클릭해서 수동으로 추가할 수 있거든요. 예를 들어, 여기 체중 비율(%) 열 오른쪽에 마우스 오른쪽 버튼을 클릭하고 열 구분선을 추가할 수 있어요. 그리고 두 번째 체중 비율(%) 열이 있던 이쪽에도 똑같이 해서 여기에도 열 구분선을, 여기에도 열 구분선을 추가하면 돼요.
이 경우에는 이 표에 대해 이 정도가 최선입니다. 참고로 빨간색 삼각형 아래에 몇 가지 옵션이 있습니다. 예를 들어 헤더로 사용할 행 수를 설정할 수 있는데, 이는 매우 유용한 기능입니다.
이 경우에는 첫 번째 표만 가져오겠습니다. 물론 2페이지에서도 같은 작업을 할 수 있는데, 이 PDF 파일이 2페이지밖에 안 되기 때문에 그렇게 하는 데 큰 어려움은 없을 겁니다. 하지만 표가 10페이지나 20페이지짜리라면 어떨까요? 그러면 여기저기 클릭하고 열 구분선을 추가해야 해서 꽤 번거로울 겁니다.
첫 페이지를 불러와서 그 다음 단계를 살펴볼까요? 확인을 클릭하겠습니다. 워크플로 레코더를 시작하는 걸 깜빡해서 존이 알려주네요. 네, 녹화해 주세요. 여기 표가 있고 이 단계도 녹화되었습니다. 녹화를 중지하겠습니다. 녹화된 단계를 더블 클릭해서 조금 더 가져와서 JSL을 볼 수 있도록 하겠습니다.
다음은 가져오기 첫 단계 코드입니다. 어떤 일이 일어나는지 볼 수 있습니다. 이 부분이 파일이 저장될 위치입니다. 그다음에는 PDF 테이블 함수, 또 다른 테이블 함수, 그리고 테이블 이름이라는 것이 있습니다. 바로 제 데이터 테이블의 이름입니다. 행, 행 구분 기호, 그리고 1페이지가 보입니다. 그다음에는 사각형이 있습니다. 제가 그린 사각형인 것 같습니다. 그리고 열 테두리가 있습니다. 이것들은 제가 구분선을 배치하고 싶었던 좌표인 것 같습니다.
저걸 보면 두 번째 페이지를 가지고 이것저것 만져보고 싶은 유혹이 정말 강해져요. 그렇게 해 봅시다. 두 번째 페이지를 가져오고 싶었잖아요. 이 부분을 가져다가 두 번째 페이지로 바꿔 볼게요. 테이블 이름도 마찬가지로 1을 2로 바꿔 볼게요.
이제 이 코드를 실행하고 싶은데, 여기서 바로 마우스 오른쪽 버튼을 클릭하고 '스크립트 실행'을 선택하면 됩니다. 한번 해볼게요. 두 번째 표가 열렸습니다. 좀 더 작게 만들어 볼게요. 다시 한번 두 번째 표를 살펴보겠습니다.
바로 성공 여부를 확인할 수 있었습니다. 이 데이터 테이블에는 식물성 오일과 지방이 포함되어 있기 때문입니다. 이전에는 동물성 지방이 포함된 첫 번째 페이지 테이블이었습니다. 워크플로 빌더가 생성해 준 스크립트를 수정하여 두 번째 페이지를 가져오는 아주 간단한 방법이었습니다. 복사 붙여넣기, 다시 한번 말씀드리지만, 이 코드를 복사해서 붙여넣거나 수정하는 것이 제가 수동으로 클릭해서 열 구분선을 추가하는 것보다 훨씬 빠를 수 있습니다. 시간을 절약할 수 있는 좋은 방법이 될 수 있겠네요.
다음으로 제가 하려는 작업은 두 번째 단계인 정리 작업입니다. 먼저 정리 작업을 진행한 다음, 왜 그렇게 하는지 설명해 드리겠습니다. 두 데이터 테이블을 한 번에 열 수 있는 단계를 만들고 싶습니다. PDF 가져오기 마법사를 사용하여 두 테이블을 가져올 때 JMP가 이를 어떻게 기록하는지 알아야 합니다. 만약 모른다면, 가장 간단한 방법은 기록을 다시 시작하는 것입니다. 먼저, 이 출력을 초기화하고 이 창을 닫아 두겠습니다.
이제 다시 녹화를 시작하고 PDF 파일을 클릭하겠습니다. 표는 모두 무시할게요. 표가 정확히 어떤 모양이어야 하는지는 별로 중요하지 않아요. 한 페이지에 표가 두 개씩 있으면 어떻게 되는지 보고 싶을 뿐입니다. 확인을 클릭하세요. 이제 이 단계 코드를 살펴보겠습니다.
이게 바로 그 단계 코드입니다. 첫 번째 경우에는 이 단계로 진입했던 것 같습니다. 두 테이블을 불러왔을 때 JMP가 테이블 기능을 반복하는 것 같습니다. 여기에 테이블 하나가 있고, 그 다음에 쉼표가 있고, 그 다음에 또 다른 테이블이 있습니다. 두 테이블을 불러오는 구조가 이런 것 같습니다.
이제 알았으니 이 단계를 삭제해도 됩니다. 필요 없어요. 나중에 다시 이 단계로 돌아올 수 있습니다. 이제 제가 하고 싶은 건, 이 부분을 좀 더 크게 만들기 위해 첫 번째 표의 괄호 왼쪽에 커서를 가져다 대는 겁니다. 그러면 닫는 괄호가 강조 표시되겠죠. 여기 있습니다. 이제 이 전체를 복사해야 한다는 걸 알았으니 Ctrl + C를 누르겠습니다. 그다음, 이 부분을 아래로 가져와서 Ctrl + Pace를 누르고 쉼표를 추가하겠습니다. 방금 알아낸 대로요.
자, 이제 이걸 바꿔볼게요. 먼저 제목과 페이지를 1로 다시 바꾸고, 두 번째 항목에는 2페이지와 2페이지를 입력할게요. 좋아요, 이제 다 닫고 제대로 되는지 확인해 볼게요.
이 단계를 실행하면 실제로 두 개의 데이터 테이블을 얻게 됩니다. 이렇게 해서 이제 한 단계로 모든 것을 처리할 수 있게 되었습니다. 왜 이 모든 작업을 했는지 설명해 드리겠습니다. 출력을 닫고, 이 워크플로를 닫은 다음, 새 워크플로를 열겠습니다. 그리고 다시 오른쪽에 도킹하겠습니다.
이 워크플로에는 다음과 같은 단계가 있습니다. 두 개의 테이블을 가져오는 부분을 더블 클릭해 보겠습니다. 여기 테이블 1이 있고, 여기 페이지 2에 사용할 테이블 2가 있습니다. 그런 다음 정리 단계를 기록했는데, 이 모든 작업을 테이블 1에서 수행했습니다. 첫 번째 단계를 선택하면 페이지 1에 있는 것을 확인할 수 있습니다. 모든 정리 단계를 그룹화했는데, 보시다시피 단계가 많습니다. 이 프레젠테이션에서는 자세히 다루지 않겠지만, 나중에 관련 자료를 참고하실 수 있도록 하겠습니다.
이제 중요한 것은 하나의 데이터 테이블에서 이러한 정리 단계를 모두 완료했으니, 두 번째 테이블에서는 어떻게 동일한 작업을 수행하느냐입니다. JMP 18에서는 이 작업이 매우 쉬워졌습니다. 마우스 오른쪽 버튼을 클릭하고 "각 항목의 그룹 너비"를 선택하기만 하면 됩니다. 다시 설명드리겠습니다. 반복할 정리 단계를 모두 선택한 다음 마우스 오른쪽 버튼을 클릭하고 "각 항목의 그룹 너비"를 선택합니다.
JMP는 각 항목에 대해 이러한 단계를 그룹화하거나 묶었습니다. 하지만 소스가 선택되지 않았다고 표시됩니다. 이 부분을 수정해야 합니다. JMP에게 어떤 기준으로 이러한 단계를 반복 실행할지 알려줘야 합니다. 이를 위해 단계 설정에서 소스를 확인하겠습니다. 아주 간단합니다. JMP에 여러 출력을 생성하는 워크플로 단계를 지정해 주기만 하면 됩니다.
이 경우, 저는 'PDF 페이지로 가져오기' 단계를 선택하겠습니다. 이 단계에서 두 개의 테이블이 생성됩니다. 이제 JMP는 여기서 생성된 두 출력물 모두에 대해 이러한 모든 단계를 수행해야 한다는 것을 알게 됩니다. 제대로 작동하는지 확인해 보겠습니다.
제가 이걸 실행해 볼게요. 출력 포트가 두 개 열려 있네요. 실행 중입니다. 아니, 실행 중인 건 아니고요. 첫 번째 테이블에서 단계별로 진행되는 중입니다. 어느 시점에 완료되면 두 번째 테이블로 전환될 겁니다. 자, 이제 두 번째 테이블을 실행하네요. 특히 테이블이 두 개 이상일 때 정말 유용한 기능인 것 같아요.
최근에 13페이지짜리 PDF 파일을 가져왔습니다. 13페이지를 모두 가져온 후, 표 하나를 정리하고 나서 13페이지 전체에 대한 모든 단계를 살펴봤습니다. 아주 만족스러웠습니다. 네, 제가 보여드리고 싶었던 게 바로 이겁니다.
이제 마지막 예제를 살펴보겠습니다. 웹사이트에서 데이터를 가져오는 예제인데요. 제가 연구 개발 부서에 있을 때 실제로 했던 작업입니다. 물의 경도 데이터가 필요했는데, 물의 경도는 제품 배합에 중요한 요소입니다. 웹사이트에서 유용한 정보를 찾았고, 그 정보를 바탕으로 매우 공들여 배합을 만들었습니다. 웬디가 이 과정을 훨씬 더 효율적으로 하는 방법을 설명해 줄 테니, 이제 저는 설명을 마치고 웬디에게 넘기겠습니다.
좋아요, 괜찮네요. 그럼 예제 3을 살펴볼까요? 여기서는 For Each 루프, 또는 다른 말로 하면 반복문에 대해 자세히 알아보겠습니다. 모니크가 이 물 경도 데이터를 찾은 웹사이트로 가보죠. 저는 HydroFlow USA에 접속했고, 이 인터랙티브 지도 영역에서 미국 지도를 볼 수 있습니다.
HydroFlow USA는 도시별 수질 경도 데이터를 제공합니다. 저희 둘 다 거주하는 미네소타주로 이동해서 이 링크를 클릭하면 미네소타주 관련 정보를 보여주는 페이지를 보실 수 있습니다. 이 페이지에는 도시와 해당 우편번호, 그리고 두 가지 단위로 표시된 수질 경도가 표로 나와 있습니다.
이 URL을 살펴보면 다른 주들의 URL도 같은 구조를 따르고 있습니다. 주 이름 뒤에 물의 경도가 오는 형식이죠. 모니크의 문제는 분석을 보완하기 위해 웹에서 이 데이터에 접근하는 것이었습니다.
JMP를 사용하여 모든 주의 수질 경도 데이터를 다음과 같은 데이터 테이블로 가져올 수 있었습니다. 보시다시피 각 주에는 여러 도시에 해당하는 행이 여러 개 있기 때문에 총 855개의 행이 있습니다. 이 데이터를 통해 모니크는 분석을 더욱 풍부하게 할 수 있었습니다. 이 영상을 재생해 보시면, 아주 간단하게 주 단위의 수질 경도를 재구성할 수 있다는 것을 알 수 있습니다.
이 예제 3에서는 몇 가지 도구를 보여드리겠습니다. 그중 하나는 JMP의 인터넷 열기 기능을 사용하여 웹 페이지에서 데이터에 접근하는 것입니다. 그런 다음, 인터넷 열기 기능을 사용하여 데이터를 가져와 루프를 돌릴 것입니다. 이렇게 하면 모든 주에서 가져온 데이터를 하나의 표로 통합할 수 있습니다.
먼저 인터넷 열기 기능을 살펴보겠습니다. 먼저 웹사이트 URL을 가져오겠습니다. 미네소타 수질 경도 정보가 있는 웹페이지에서 Ctrl + C를 눌러 복사한 후 워크플로를 시작합니다. 녹화 버튼을 누르고, 파일 > 인터넷 열기 > 웹페이지를 선택합니다. 복사한 URL을 붙여넣고 확인을 클릭합니다.
JMP가 해당 페이지에서 테이블을 감지했습니다. 확인을 누르겠습니다. 이렇게 하면 단일 페이지에 있는 데이터를 가져오는 것이 얼마나 가능한지 알 수 있을 것입니다.
워크플로로 이동해서 녹화를 중지해 보겠습니다. 녹화된 내용을 살펴보면 JMP가 이 JSL을 실행하고 있거나, 이 JSL을 녹화하고 있습니다. 단순히 URL 이름과 HTML 테이블이라는 추가 정보가 포함된 열기 구문입니다. 앞으로 51개의 페이지 각각에 개별적으로 이동하는 것은 바람직하지 않습니다.
이상적으로는 모든 상태에 대해 반복 처리할 수 있는 단일 가져오기 단계가 있으면 좋겠습니다. 이제 다시 물 경도에 대해 이야기해 보겠지만, 먼저 JMP 문서에 나와 있는 각 항목별 작동 방식을 설명하는 예제를 살펴보겠습니다.
자료에 있는 이 링크를 따라가시면 예제 페이지로 바로 이동합니다. 슬라이드에 있는 예제를 하나씩 설명드린 다음, 함께 만들어 보겠습니다. 아, 어디 보자. 슬라이드를 띄워볼게요.
업로드될 버전에서 해당 부분이 수정되도록 하겠습니다. JMP 문서 예제에서는 그래프 세트를 생성하는 것이 목표였는데, 각 성별에 대한 분포 그래프 세 개를 만드는 것이었습니다. 예제에 사용된 데이터 세트는 당뇨병 데이터 세트로, 두 가지 성별이 있습니다. 이 예제는 당뇨병 데이터 세트에서 성별 1과 성별 2로 부분집합을 만들고, 성별 1에 대한 분포 그래프만 생성한 다음, 이 두 번째 단계를 for each 루프로 감싸서 성별 2에 대한 단계를 따로 기록하지 않고도 성별 1과 성별 모두에 대해 워크플로가 작동하도록 구성했습니다.
처음부터 구축하는 과정을 살펴보겠습니다. 새 워크플로를 시작하고 '기록'을 누르겠습니다. 당뇨병 데이터셋을 찾아보겠습니다. 여기 당뇨병 데이터셋이 있고, 성별 1, 성별 2가 표시되어 있습니다. 먼저 성별로 부분집합을 추출해 보겠습니다. 행을 선택 해제해야 하므로 다시 한번 추출하겠습니다. 성별로 부분집합을 추출합니다. 미리보기에서 성별 1, 성별 2를 볼 수 있습니다. 두 개의 테이블이 생성되어야 하는데, 실제로 생성되었습니다. 여기 성별 1, 성별 2가 있습니다.
성별 1부터 시작해서 시각화를 만들어 보겠습니다. 간단하게 세 개의 변수를 가진 분포를 만들 거예요. 이제 워크플로로 이동해 보겠습니다. 올바른 워크플로로 들어가 볼게요. 보시다시피, 이 작업을 몇 번 반복해야 했기 때문에 여러 단계를 기록해 두었습니다.
이제 과정이 좀 더 자세히 보여드리겠습니다. 재제출했기 때문에 필요 없는 단계는 삭제하겠습니다. 필요한 데이터가 모두 있는지 확인하기 위해 재생해 보겠습니다. 데이터 테이블을 열고, 성별 1과 성별 2로 부분집합을 선택하면 성별 1에 대한 분포 데이터만 남게 됩니다. 네, 맞습니다. 성별 1, 성별 2, 그리고 이건 성별 1에 대한 데이터입니다.
이제 각 항목별로, 이 보고서 단계를 선택하고 마우스 오른쪽 버튼을 클릭한 다음 '각 항목별로 그룹화'를 선택합니다. 이것이 제가 반복하고 싶은 부분입니다. 이제 '각 항목별로' 부분을 보면, 이미 선택된 워크플로 단계는 이전에 부분집합을 추출했던 단계이므로 여기서는 변경할 필요가 없습니다. 이제 워크플로를 다시 실행하면 성별에 따라 두 개의 분포가 실행되는 것을 볼 수 있습니다. 여기가 성별 1이고, 여기가 성별 2입니다.
HydroFlow에서 원하는 수질 경도 데이터를 얻기 위해 이러한 프레임워크를 어떻게 사용할 수 있을까요? 여기서 몇 가지 정리를 해 보겠습니다. 슬라이드로 돌아가서 수질 경도에 맞게 적용해 보겠습니다. 각 주를 순회하고 싶다는 것을 알고 있었기 때문에, 개념적으로 당뇨병 예시처럼 테이블을 만들고, 그 테이블을 URL이 포함된 각 주별로 개별 테이블로 나누기로 했습니다. 한 주의 인터넷 접속 시간을 기록하고, 그 인터넷 접속 시간을 for each 루프로 묶어 모든 주의 인터넷 접속 시간을 기록하도록 하겠습니다.
제가 완성한 워크플로우를 재생해 보겠습니다. 이 워크플로우를 재생해 보시면 아시겠지만, 모든 단계를 포함하면 재생 시간이 너무 오래 걸리기 때문에 몇 가지 단계만 표시됩니다. 데이터 정리 단계 바로 직전 단계만 실행해서 대화를 나누고, 그 후에 나머지 단계를 재생해 보겠습니다.
States 테이블이 열리고, 그 테이블에서 URL이 포함된 개별 주들만 추출됩니다. 이제 각 주에 대해 인터넷 연결이 이루어지는 것을 볼 수 있습니다. 작업 공간을 보시면, 저는 이 다섯 개 주에 대해 인터넷 연결을 완료했습니다.
워크플로로 돌아가서 나머지 단계를 활성화하면 이 모든 데이터가 단일 상태 테이블로 통합되는 것을 볼 수 있습니다. 이 경우처럼 상태는 5개뿐이지만, 그 다음에는 물 경도를 보여주는 그래프가 표시됩니다.
워크플로를 살펴보면 각 단계별 내용은 다음과 같습니다. 여기서 이 예시에 존재하는 추가적인 복잡성에 대해 설명하겠습니다. HTML 가져오기 단계에서 인터넷 열기를 위해 사용자 지정 JSL을 추가해야 했습니다. 좀 더 자세히 설명하자면, 워크플로 빌더에서 기록된 이 가져오기 단계를 수정했습니다. 이제 슬라이드로 돌아가서 어떤 특정 변경 사항이었는지 살펴보겠습니다.
여기 있는 문장은 제가 앨라배마 주에 대한 인터넷 연결을 시도할 때 워크플로 빌더에 기록되는 내용입니다. 모든 주를 참조하고 싶기 때문에 이 부분을 일반적인 변수, 즉 '웹 주소'로 바꾸겠습니다. 그러면 앨라배마 주 테이블만 생각해 볼 때, 이 데이터 테이블의 특정 셀에 있는 URL을 참조할 수 있어야 합니다.
JMP 스크립팅 언어를 단계별로 살펴보면, 데이터 테이블과 상호 작용할 수 있습니다. 데이터 테이블이라고 말하면 그 안에 데이터 테이블 이름이 들어갑니다.
그런 다음 데이터 테이블의 열을 참조할 때는 데이터 테이블 이름 뒤에 콜론(:)을 붙이고 열 이름을 입력합니다. 이 경우 `data table state equals Alabama`가 되고, `URL`은 열 이름입니다. 마지막으로 URL이 포함된 특정 셀을 참조하려면 대괄호(`)를 추가합니다. 모든 주에 대해 대괄호 안에는 숫자 1만 들어갑니다. 모든 테이블에는 URL이 포함된 행이 하나만 있기 때문입니다.
이 예제를 정리하자면, 웹 페이지에서 데이터를 가져오는 방법으로 인터넷 오픈을 사용하는 것을 살펴보았습니다. 그리고 JMP 문서 예제를 활용하여 for each 루프에 대해 더 자세히 알아보았습니다. 마지막으로, 제가 약간의 사용자 정의 JSL을 사용하여 인터넷 오픈에서 데이터에 접근하는 방법을 보여드렸습니다. 이제 마무리를 위해 모니크에게 마이크를 넘기겠습니다.
네, 감사합니다, 웬디. 오늘 저희는 스크립팅 없이 다양한 데이터, 이미지, PDF 파일, 웹 페이지 등의 데이터를 가져와 자동화하는 방법을 보여드렸습니다. 워크플로 빌더는 정말 훌륭한 도구입니다. 워크플로 빌더가 기록하는 JSL 코드를 살펴보고 약간 수정하면 더욱 발전된 기능을 활용할 수 있습니다. JSL 코드를 살펴보고 직접 시도해 보는 것을 두려워하지 마세요. 오늘 함께해 주셔서 감사하며, 이 내용이 여러분께 도움이 되었기를 바랍니다.