皆さん、こんにちは。ポイント&クリックと基本的なコードクラッキングスキルを使って、複雑なデータをインポートする方法について解説するプレゼンテーションへようこそ。本日は同僚のウェンディ・ツェンが参加しています。私たちは二人ともJMPのシステムエンジニアです。私の名前はモニーク・ローディンク・ランダーです。
今日は、扱いにくいデータのインポートについてお話します。これは、私が研究開発部門にいた頃に様々な課題に直面したことから生まれたものです。今日は3つの例を挙げて説明しますが、いずれも複数のデータのインポート、複数の画像、ウェブサイトからの複数のデータテーブル、または複数のPDFページのインポートに関するものです。
これらはすべて単純ではないデータソースであり、実験データなど、他の種類のデータを拡張したり、他の種類のデータを補完したりするために使用されている可能性があります。これらの課題に直面した当初、私はスクリプトに精通していませんでした。これらの課題に対処するためにスクリプトを学びましたが、誰もがJSLを学ぶ時間や興味を持っているわけではありません。
つまり、この種のデータを効率的にインポートするのは難しく、時間をかけられないという理由で、結局何もせずに諦めてしまうかもしれません。しかし、JMP 17で導入され、JMP 18ではさらに重要な拡張機能が追加されたJMPワークフロービルダーのおかげで、それほど難しくはなくなりました。
本日は、このようなデータのインポートを自動化する方法をご紹介します。Workflow Builderを使用しますが、コードは使用せず、JSLをそのまま使用します。JSLの解読、いわゆるコードクラッキングを行います。Workflow Builderの基本を理解していることを前提としていますが、そうでない場合は、すぐに深く掘り下げていきます。本日は3つの例題を用意しています。最初の例では、同僚のWendyがデータテーブルへの画像のインポートの自動化について解説します。
これはやらなければならない仕事です。やらなければならないことが山ほどあります。洗剤の配合に携わり、メガネの洗浄テストを行っていました。その過程で、メガネの写真が何百枚も撮れました。これらの写真をデータテーブルに取り込み、画像解析データとリンクさせたいと思ったのです。
当時の私にとって、それはかなり難しかったです。ウェンディが、それを効率的に行う方法をお見せします。その例の後、2つ目の例では、PDFファイルのインポートと必要なクリーンアップ手順をより効率的に行う方法を説明します。最後に、ウェブサイトからのデータのインポート方法についてウェンディが説明します。それでは、ウェンディにバトンタッチしましょう。
ありがとう、モニーク。最初の例では、画像を取り入れることでデータの理解と伝達を向上させる方法を紹介します。では、具体的に何について話しているのか見ていきましょう。メガネの代わりに、犬の写真を見ていきます。
目の前にあるデータセットには、この列に犬の写真が含まれています。28行、28枚の犬の写真があります。これらの写真は、アメリカンケネルクラブが公開しているデータセットと結合されており、グルーミングの頻度や抜け毛など、犬に関する様々な情報が含まれています。
次に注目するのは、犬の性格です。こちらは犬の人気と性格の関係を示すグラフです。特定の点にマウスを合わせると、その犬の写真が表示されます。こちらはアーフェンピンシャーです。これは面白い例ですが、データで見ているものをよりリアルに表現しています。このデータをどのようにまとめたのでしょうか?先ほども申し上げましたが、アメリカンケネルクラブという公開データセットがあり、これらの写真をファイルフォルダに取り込み、それらを結合しました。
これを実際に見ていきましょう。まずはズームアウトして、最初の例で何が起こるかを確認してみましょう。まず、フォルダー内の写真を簡単に取り込む方法として、複数ファイルのインポート機能を紹介します。次に、ワークフロービルダーを使ってこれらの画像を取得し、AKCデータセットと結合して写真を作成する様子をご覧ください。この例が、単純なものから複雑なものへと進化していく様子を見ていきます。
最後のイテレーションでは、カスタムJSLを使用してワークフロービルダーでユーザープロンプトを作成する方法を見ていきます。まずは、複数のファイルをインポートして写真をインポートする方法を見てみましょう。ここに「AKC」というフォルダーがあり、そこには犬の写真が含まれています。このフォルダーには他にもファイルが含まれていますが、ほとんどが犬の写真です。犬の写真には犬種名が付けられているのがわかります。これは重要です。なぜなら、この名前を使って、同じく犬種名を含むAKCデータセットに結合するからです。始める前に、新しいワークフローを開始して記録をクリックします。
では、複数のファイルをインポートして、それらのファイルが存在するフォルダに移動しましょう。ここがAKCフォルダです。画像のみのファイルを選択します。次に、品種名をデータテーブルに入力するため、ファイル名列を追加します。これで、28枚の写真がすべて1つのステップでインポートされたことがわかります。これで、編集に使用できるファイル名列が作成されました。AKCフォルダ内の品種名に結合できるように、.JPGファイルを削除します。
ワークフローを停止します。ここでお見せしたいのは、JMPがこのワークフロー内のステップをJSL形式で記録しているということです。では、完成したワークフローを開いてみましょう。完成したワークフローが表示されています。このワークフローを再生してみましょう。これは、以前に記録したデータを取り込んでステップを作成したものですが、1つ注意したいのは、複数のファイルをインポートする場合、JMPは最初のファイル名をデータテーブルの名前とし、最後のファイル名に下線を付けて名前を付けるということです。
私のAKCフォルダーには、最初の犬がアーフェンピンシャー、最後の犬がオッターハウンドと記載されていました。このワークフローを実際に実行してみましょう。結果はこちらです。ポイントを犬の写真に置き換えた以外は、先ほどご覧いただいたプロットと同じです。
それでは、これらの態度のカテゴリーを見てみましょう。態度には4つのカテゴリーがあり、警戒心が強い、反応が良い、外向的といった具合です。AKCのデータセット全体は277行あります。写真は28枚しかなかったので、グラフに表示されているよりも多くのカテゴリーがあります。よそよそしく警戒心の強い犬は意図的に除外しています。これは、このワークフローの再利用性を示すためです。
AKCフォルダに、人なつこい犬を4匹追加します。そして、このワークフローを再実行して、ワークフローの適応性を確認してみましょう。繰り返しますが、このワークフローは28匹の犬で構築されています。ここでフォルダを開いてください。最後に残ったのはオッターハウンドです。右側に、人なつこい犬4匹を移動し、AKC2フォルダではなくAKCフォルダにドロップします。
これがAKCフォルダです。新しい犬を貼り付けます。これで、よそよそしい犬がAKCフォルダに追加されました。ワークフローを再生してみましょう。グラフによそよそしい犬が追加されているのがわかります。ワークフロービルダーの柔軟性の高さが分かります。写真を取り込み、AKCデータセットと結合し、データクリーニングを行い、グラフを作成するワークフローを記録しました。その後、このフォルダにファイルを追加したら、「実行」をクリックするだけですべてが更新されます。
ワークフローのステップの一つを詳しく見てみましょう。複雑さの進化はこれからですが、少しだけコードを解読する必要がありますが、それほど難しくはありません。この複数ファイルのインポートステップを見て、キャプチャされたJSLを確認してみましょう。JMPは、私の犬の写真が保存されている特定のフォルダパスを参照しています。
参照したい別のフォルダがある場合は、このファイルパスを変更するだけで済みます。ちなみに、AKC2というフォルダにはさらに多くの犬の写真が入っています。ここで少し変更を加えるだけで、ワークフローを再生できます。今度は32匹ではなく53匹の犬が表示され、グラフのデータがはるかに豊富になります。
コードトラッキングを行う簡単な方法は、ステップ設定を確認し、JSLコードに少し調整を加えることです。さて、この最終イテレーションでは、もう1つ変更を加えます。このワークフローを他の人に渡して実行させたい場合、最初のステップを変更して、ユーザーが自分のディレクトリから自分のファイルフォルダを設定するように促すのが理にかなっています。
このステップに戻って、一番下までスクロールします。「データのインポート」ステップの代わりに、「ウィンドウの作成」ステップに置き換えることができます。ここでお勧めするもう1つの変更点は、このフォルダパスを「デスクトップ」や「ドキュメント」などの一般的なパスに置き換えることです。さあ、最初のステップを実行してみましょう。
フォルダがデフォルトで「ドキュメント」になっているのがわかります。ファイル名の追加列など、すべての選択内容が維持され、ユーザーは写真が保存されている場所に移動するように求められます。この例のまとめとして、複数のファイルをインポートして画像を1つのテーブルにまとめる方法と、ワークフロービルダーを使用して柔軟なワークフローを作成する方法を確認しました。これで、2つ目の例はMoniqueにバトンタッチします。
はい。ウェンディ、ありがとう。画面を共有しましょう。できました。会議コントロールを非表示にします。できました。いいですね。メガネの写真よりもずっと可愛いですね。本当に良い例でした。2つ目の例では、PDFのデータを見てみましょう。
その理由です。研究をしていた頃、あるテーマに深く入り込んでいくと、PDFファイルの中に素晴らしい情報を見つけることがあります。それは化学物質の参照表や組成データかもしれません。ベンダーや原材料から得た界面活性剤の情報かもしれません。分析レポートかもしれません。
データ量が多い場合が多く、データテーブルにコピーするだけで手動で取り込むのは面倒でした。では、どうすればJMPにデータを取り込めるのでしょうか?今日はまず、ポイントアンドクリック式のPDFインポートウィザードの使い方をご紹介します。これはExcelインポートウィザードやその他のインポートウィザードと非常によく似ています。
素晴らしい出発点ですね。これをワークフロービルダーと組み合わせて使い、ウェンディがやっていたように、ソースコードを操作してインポートを自動化し、プロセスの一部を少し楽にしていきます。
JMP 18では、ワークフロービルダーにクリーンアップの問題を解決する便利な機能が追加されました。多くのPDFページをインポートした後、クリーンアップする必要がありますが、クリーンアップが必要なテーブルがたくさんあるかもしれません。ワークフロービルダーでは、これらのテーブルを確認できるようになりました。これも紹介します。ここで説明を終えたいと思います。まず、これから作業するPDFファイルを紹介します。開いてみてください。これがそれです。
2ページのPDFファイルで、一般的な脂肪の脂肪酸組成を示した例を見てみましょう。1ページ目は動物由来の脂肪の組成、2ページ目は植物由来の脂肪と油の組成を示しています。
一見、きれいにフォーマットされた表のように見えますが、最初のページを詳しく見てみると、PDFとしては見栄えが良いものの、JMPのデータテーブルとしてはいくつか問題があることがわかります。これは、このデータをインポートした後、使用可能な形式にするために、多くの作業が必要であることを示しています。
例えば、実際には列ヘッダーはありません。最初の列はカテゴリです。次にパーセンテージの列があります。また、パーセンテージの列もあります。脂肪酸の一覧を示す列が2つあります。1つは飽和脂肪酸、もう1つは不飽和脂肪酸です。
ここにもう一つ列があります。もう一つの問題は、ここにサブヘッダーがあることです。例えば、この「牛脂」はサブヘッダーで、ここに小計があります。これは削除したいかもしれませんが、当然ながら、このサブヘッダーも空白で埋める必要があります。
これは別の問題です。先ほども述べたように、これらのサブヘッダーの一部は2行にまたがっており、JMPではこれらが2行にまたがっていることを認識できないため、JMPでも問題が発生します。
また、複数の列にまたがるデータもあります。これらのデータを取り込んだ後には、多くの問題を解決する必要があります。ジャーナルに戻って、まずは最終結果を確認しましょう。私たちが本当にやりたいのは、JMPを使って両方のページを取り込み、できれば片方のページで作業を行い、その後ですべてのクリーンアップ手順を実行することです。
繰り返しになりますが、できれば片方のページだけにして、JMPを両方のページに適用し、そのデータをまとめて使えるようにしておきましょう。これをワークフローに記録しました。これが最終結果で、後でこれを再現します。まずはこのワークフローを再生してみましょう。
2つのページが開いていて、ワークフロービルダーがすべてのクリーンアップ手順を実行しています。手順はたくさんあります。まず最初のデータテーブルで実行し、次に2つ目のデータテーブルをリセットして同じ処理を実行しています。完了すると、2つのデータテーブルを結合し、結合されたデータから出力を生成します。
できました。今回は、飽和脂肪酸と飽和脂肪酸のみを比較しています。では、ワークフローを巻き戻して、つまりリセットして、これらの出力を閉じましょう。実際には、このワークフローを完全に閉じて、空のワークフローを開きます。今日作業しているプロジェクトの右側にドッキングします。
では、最初から始めましょう。PDFを開いてみましょう。PDFのインポートが完璧に動作する例をお見せしたかったのですが、それは割愛します。PDFファイルをJMPで開くと、JMPが必要なデータテーブルを完璧に認識し、たった2回のクリックでデータテーブルが作成されます。まさに完璧な例です。
完璧ではない例を見てみましょう。このPDFを開いてみましょう。ここにあるリンクをダブルクリックすると、PDFインポートウィザードが開きます。左側のプレビューを見ると、JMPがこの表を以前のようには認識していないことがわかります。一部は認識できますが、使用できるものではありません。
まず最初に、「すべてのテーブルを無視」を選択してください。これですべてがリセットされます。これですべてがリセットされたので、マウスを使ってこのテーブルを選択するだけです。
こうすると、JMPは列の位置を推測します。ここで少し拡大してみましょう。これで、すべての列が表示されないことがわかります。これは、ヘッダーが複数の列にまたがっている場合に発生する問題です。
問題ありません。右クリックで手動で追加できます。例えば、体重%の列の右側に移動して右クリックすると、ここに列区切り線を追加できます。次に、2つ目の体重%の列があるこちらでも同じ操作を行い、ここに列区切り線を追加し、こちらにも列区切り線を追加します。
この場合、この表ではこれ以上のことはありません。ちなみに、赤い三角形の下にはいくつかオプションがあります。例えば、ヘッダーとして使用する行数を設定できます。これも非常に便利なツールです。
今回は、最初の表だけをインポートします。もちろん、2ページ目にも同じ選択をすればいいのですが、これは2ページのPDFファイルなので、それほど手間はかかりません。もし10ページや20ページの表があったらどうでしょうか?クリックして列区切り線を追加していく作業が山ほど必要になり、少し面倒かもしれません。
最初のページを開いて、そこから何ができるか見ていきましょう。「OK」をクリックします。ワークフローレコーダーを起動し忘れていたので、ジョンがプロンプトを出しました。「はい、記録してください」と入力します。ここにテーブルが表示され、このステップも記録されています。記録を停止します。記録したステップをダブルクリックして少し移動させ、JSLを確認できるようにします。
これがインポートの最初のステップのコードです。何が起こっているかが分かります。ここがこのファイルの保存場所です。次にPDFテーブル関数、もう一つのテーブル関数、そしてテーブル名があります。これは私のデータテーブルの名前です。行、ヘテロ、そしてページ1が表示されています。次に四角形が表示されています。これは私が描いていた四角形だったはずです。そして列の境界線が表示されています。これらは、私がこれらの区切り線を配置したかった座標のはずです。
これを見ると、2ページ目ができたらちょっといじってみたくなりますね。やってみましょう。2ページ目も表示させたかったので、これを使って2にしましょう。テーブル名も同じです。1を2に変更します。
このコードを実行したいのですが、ここから右クリックして「スクリプトを実行」を選択するだけで直接実行できます。さあ、実行してみましょう。2つ目のテーブルが開きました。これを少し小さくして、もう一度開いて、開いた2つ目のテーブルを見てみましょう。
すぐに成功だと分かります。このデータテーブルには植物由来の油脂が含まれているからです。これは動物性脂肪を含む最初のページテーブルです。ワークフロービルダーがキャプチャしたスクリプトを修正するだけで、2ページ目をインポートできるという非常にシンプルな方法でした。コピー&ペースト、もう一度言いますが、このコードをコピー&ペーストまたは変更する方が、手動でクリックしてすべての列区切りを追加するよりも早いかもしれません。これは時間の節約になるかもしれません。
次に、2つ目の部分、つまりクリーンアップを事前に準備しておきます。まずはクリーンアップを行い、その後、なぜクリーンアップを行うのかを説明します。この2つのデータテーブルを両方とも開くステップを1つ用意したいのです。必要なのは、PDFインポートウィザードを使って2つのテーブルをインポートした際に、JMPがどのように記録するかを知ることです。もし記録方法が分からなければ、記録を再開するのが最も簡単な方法です。まず、ここで出力をリセットし、これを閉じて保存しておきます。
では、記録を再開してPDFをクリックします。今度はすべての表を無視します。これらの表がどのように表示されるかはそれほど重要ではありません。1ページに2つの表がある場合に何が起こるかを確認したいだけです。「OK」をクリックします。このステップコードを見てみましょう。
これがそのステップコードです。最初のステップは、ここで入力されたと思います。2つのテーブルをインポートした際に、JMPがテーブル関数を繰り返しているように見えます。ここに1つのテーブルがあり、その後にカンマがあり、さらに別のテーブルがあります。これが2つのテーブルをインポートするための構造のようです。
これで、このステップは削除できます。不要です。このステップに戻ってください。次に、これをもう少し大きくします。最初の表の括弧の左側にカーソルを置きます。そうすると閉じ括弧が強調表示されます。これで完了です。これをすべてコピーする必要があることが分かりました。Ctrl + C を押します。次に、この前にこれを移動して、Ctrl + P を押し、先ほど説明したようにカンマを追加します。
まず、これを1に戻します。タイトルとページを1に戻します。すると、2番目のページが2ページ目と2ページ目になります。さて、すべて閉じて、うまくいくかどうか確認しましょう。
このステップを実行すると、確かに2つのデータテーブルが表示されます。これで1つのステップにまとめられました。なぜこのようなことをしたのでしょうか?説明しましょう。出力を閉じます。このワークフローを閉じて、別のワークフローを開きます。これを右側にドッキングします。
このワークフローにはこのステップがあります。2つのテーブルをインポートする箇所をダブルクリックしてください。これがテーブル1で、これがページ2のテーブル2です。次に、クリーンアップ手順を記録しました。これはすべてテーブル1に対して実行しました。最初のステップをハイライトすると、これがページ1にあることがわかります。すべてのクリーンアップ手順をグループ化しましたが、たくさんあることがわかります。このプレゼンテーションでは詳細には触れませんが、後で参照できるリソースを用意しています。
重要なのは、データテーブルの一つでこれらのクリーンアップ手順をすべて実行したので、2つ目のテーブルではどのように実行するかということです。JMP 18では、これが非常に簡単になりました。右クリックして、それぞれの「グループ幅」を選択するだけです。少し戻ってみましょう。繰り返したいクリーンアップ手順をすべて選択した状態で、右クリックしてそれぞれの「グループ幅」を選択します。
JMPは各項目ごとにこれらのステップをグループ化、またはバケット化しました。ただし、ソースが選択されていないと表示されます。これは対処が必要です。JMPにこれらのステップをループさせる対象を指定する必要があります。そのためには、「ステップ設定」でソースを確認します。とても簡単です。JMPに指示する必要があるのは、複数の出力を生成するワークフローステップを指定することだけです。
今回は「PDFページへのインポート」ステップを選択します。これは2つの表を作成するステップです。これでJMPは、ここで生成された2つの出力に対して、これらのステップをすべて実行する必要があることを認識します。うまくいくかどうか確認してみましょう。
これを再生してみましょう。出力が2つ開いています。実行中です。いや、まだ実行されていません。最初のテーブルのステップを実行しています。そして、完了したら2番目のテーブルに切り替わるはずです。さあ、2番目のテーブルを実行します。これは本当に便利な機能だと思います。特にテーブルが2つ以上ある場合は便利です。
最近インポートした13ページのPDFファイルがあります。13ページをインポートした後、表の1つをクリーンアップし、13ページすべての手順を確認しました。とても分かりやすかったです。さて、これがお見せしたかったことです。
最後の例を見てみましょう。これはウェブサイトからデータをインポートする例です。これは私が研究開発に携わっていた頃に実際に行っていたことです。水の硬度のデータを取得する必要がありました。水の硬度は、処方箋を作成する際に重要な考慮事項です。あるウェブサイトで素晴らしい情報を見つけました。そして、それを非常に苦労して処方箋を作成しました。ウェンディが、それをよりエレガントに行う方法を説明してくれます。私の説明はここまでにして、ウェンディにバトンタッチします。
いいですね。それでは例3を見てみましょう。For Each、言い換えればループ処理について詳しく見ていきましょう。モニークがこの水の硬度データを見つけたウェブサイトを見てみましょう。私はHydroFlow USAのウェブサイトにいますが、このインタラクティブマップエリアに移動すると、アメリカの地図を見ることができます。
HydroFlow USAは都市レベルの水の硬度データを提供しています。私たち二人が住んでいるミネソタ州へ移動し、リンクをクリックすると、ミネソタ州の情報が掲載されたページが表示されます。そこには都市、対応する郵便番号、そして2つの異なる単位での水の硬度を示す表があります。
このURLを見ると、他の州のURLも同じ構造になっています。州名の後に水の硬度が続きます。モニークの問題は、分析を補強するために、ウェブ上でこのデータにアクセスできることでした。
JMPを使って、全州の水の硬度データをこのようなデータテーブルに取り込むことができました。各州には都市に対応する複数の行が含まれているため、行数は855行あります。このデータのおかげで、モニークは分析を拡張することができました。再生ボタンを押すと、州レベルの水の硬度を非常に簡単に再現できることがわかります。
この例3では、いくつかのツールを紹介します。その一つは、JMPのインターネットオープンを使ってウェブページからデータにアクセスすることです。次に、このインターネットオープンをループ処理します。ループ処理で囲むことで、すべての州のデータを1つの表にまとめることができます。
まずはInternet Openを見てみましょう。まずはウェブサイトのURLを取得します。ミネソタ州の水の硬度が記載されているこのウェブページでCtrl + Cを押してワークフローを開始します。記録ボタンを押し、「ファイル」→「インターネットでウェブページを開く」に進みます。URLを貼り付けて「OK」をクリックします。
JMP がそのページに表を検出しました。「OK」を選択します。これで、単一ページにあるデータをインポートする方法について、ある程度ご理解いただけると思います。
ワークフローに移動して記録を停止します。記録内容を確認すると、JMPがこのJSLを実行している、あるいはこのJSLを記録していることがわかります。これはURL名とHTMLテーブルであることを示す詳細情報を含むオープンステートメントです。将来的に考えると、51ページすべてを個別に確認するのは避けたいところです。
理想的には、すべての州に対してループする単一のインポートステップを用意します。さて、水の硬度の話に戻りますが、まずはJMPのドキュメントに記載されている、それぞれの動作を説明した例を見てみましょう。
資料内のこのリンクをクリックすると、例に直接移動します。スライドで例を説明し、その後一緒に構築してみましょう。おや、そうですね。スライドを表示させてください。
アップロードするバージョンでは修正されていることを確認します。JMPのドキュメントの例では、グラフセットを作成するという目標があり、性別ごとに3つの分布グラフを作成するだけでした。この例で使用されているデータセットは糖尿病で、性別は2つあります。このデータセットの構築方法は、糖尿病データセットから性別1と性別2のサブセットを作成し、性別1専用の分布プロットを作成し、ステップ2をfor eachでラップすることで、性別2のステップを実際に記録することなく、性別1と性別2の両方でワークフローが機能するようにしています。
これをゼロから構築してみましょう。新しいワークフローを開始し、「記録」をクリックします。糖尿病データセットを見つけましょう。これが糖尿病データセットで、性別1と性別2が表示されています。まず性別でサブセット化します。行の選択を解除したいので、もう一度同じ操作を行います。性別でサブセット化します。プレビューでは、性別1と性別2が表示されています。2つのテーブルが作成されるはずです。そして、実際に作成されました。これが性別1と性別2です。
まず性別1から始めて、視覚化を作成します。シンプルにするために、3つの変数を持つ分布を作成します。それではワークフローに進みます。正しいワークフローを見てみましょう。何度かやり直したため、実際には複数のステップを記録していることがわかります。
ソーセージが作られる様子を少しだけお見せします。不要なステップは削除します。再提出したためです。必要なものがすべて揃っていることを確認するために、実際に試してみましょう。データテーブルを開き、データテーブルを性別1と性別2にサブセット化します。すると、性別1の分布だけが表示されます。これで完了です。性別1、性別2、そしてこれは性別1のデータだけです。
次に、For Each のレポートステップを選択し、右クリックして「For Each でグループ化」を選択します。これがループさせたいものです。この For Each のワークフローステップを選択すると、既に選択されているワークフローステップは、サブセット化した前のステップなので、ここでの変更は不要です。ワークフローを再実行すると、性別ごとに1つずつ、2つの分布が実行されているのが確認できます。こちらが性別1、こちらが性別2です。
このようなフレームワークを使って、HydroFlowから必要な水の硬度データを取得するにはどうすればよいでしょうか。ここで少し整理しておきましょう。スライドに戻って、これを水の硬度に適応させてみましょう。州をループ処理したいという前提で、概念的には、糖尿病の例と同じようにテーブルを作成し、そのテーブルをURLを含む州ごとに個別のテーブルに分割することを考えました。ある州のインターネット接続状況を記録し、それをFor Eachでラップして、すべての州のインターネット接続状況を処理します。
完成したワークフローを再生してみましょう。このワークフローを再生すると、状態が少数であることに気付くでしょう。すべての状態を含めると処理に時間がかかりすぎるためです。データクリーニングの直前にワークフローを実行して会話を行い、その後残りの部分を再生します。
Statesテーブルが開かれ、URLを含む個々の州にサブセット化されます。これで、各州でインターネット接続が確立されたことがわかります。ワークスペースを見ると、これら5つの州でインターネット接続が確立されていることがわかります。
ワークフローに戻って残りの手順を有効にすると、このデータすべてが 1 つの州テーブルに結合され、この状況では 5 つの州だけが表示され、水の硬度を示すグラフが表示されます。
ワークフローを見てみましょう。各ステップについてご説明します。ここから、この例に存在する追加の複雑さについて説明します。HTMLのインポートでは、インターネットで開くためにカスタムJSLを追加する必要がありました。これを展開すると、ワークフロービルダーから記録されたこのインポートステップを変更しました。ここでスライドに戻り、具体的な変更内容について説明します。
このステートメントは、アラバマ州でインターネットオープンを実行したときにワークフロービルダーによって記録されるものです。すべての州を参照したいので、これを汎用的な変数、つまり「Webアドレス」に置き換えます。次に、アラバマ州のテーブルだけを考えた場合、Webアドレスとしてこのデータテーブル内の特定のセルを参照できるようにする必要があります。そのセルにはURLが含まれています。
JMP スクリプト言語をステップ実行すると、データ テーブルを操作できるようになります。データ テーブルと言うと、その中にデータ テーブル名が表示されます。
次に、データテーブル内の列を参照する場合は、データテーブル名にコロンを付け、列名を続けます。この場合、「データテーブル 州 = アラバマ」となり、URLが列名となります。最後に、URLを含む特定のセルを参照したいので、括弧を追加します。すべての州について、1行だけを指定します。これは、すべてのテーブルに1行しか含まれておらず、そのセルにURLが含まれているためです。
この例をまとめると、Webページからデータを取り込む方法としてInternet Openを使用する方法を確認できました。次に、JMPドキュメントの例を使って、For Each文についてさらに詳しく見ました。さらに、少しカスタムJSLを使ってInternet Openからデータにアクセスできるように、どのように変更したかを確認しました。最後に、Moniqueに話を戻してまとめます。
はい。ウェンディさん、ありがとうございます。今日は、画像、PDF、Webページなど、あらゆる種類のデータを取り込む方法と、スクリプトを使わずに自動化する方法をご紹介しました。Workflow Builderは素晴らしいツールです。記録されたJSLコードを見て、少し修正を加えることで、さらに活用の幅が広がります。JSLを見て、ぜひ実践してみてください。本日はご参加いただきありがとうございました。この情報がお役に立てば幸いです。