COVID-19の感染拡大が続いている中で、医療機関をはじめ、あらゆる企業がさらなる対策の必要性に迫られています。データによってこうした危機から組織を救うためには、ヘルシーデータが鍵を握っています。

COVID-19により、医療の専門家、データチーム、ロジスティクス部門、およびその他の多くのエキスパートたちが世界規模で協調しており、感染の上昇を抑えるとともに治療方法を改善し、最終的には持続的な救済手段を確立しようとしています。Sisenseはこのグローバル規模の危機を乗り切るため、データベースレスポンスの最前線に立っています。

Sisenseは、COVID-19に関するデータを誰でも手軽に入手できるようにするための取組みとして、プロジェクトSiCoを3月に立ち上げました。プロジェクトSiCoでは、画期的なCOVIDハブを構築するために多くのSisense社員が協力してくれました。本文では、AIリサーチ(AIR)チームの取組み、特に私たちがSEIRアプリと呼んでいるSisense BloX(実用的な組込み型アナリティクス(分析))とQuest(Sisense専用の高度アナリティクス(分析)アドオン)の実験的な組合せについてフォーカスします。

Sisense for Cloud Data Teams

SEIRアプリの開発

SEIRアプリは、SEIRと名付けられたモデルに基づき、ソーシャルディスタンシングがCOVID-19の感染率に及ぼす影響を調べるために設計されました。このモデルでは特定の国の人口、ソーシャルディスタンシング率、そしてソーシャルディスタンシ

このモデルでは時系列的に以下の4つをアウトプットします:

  • S – 感染していない人の数
  • E – 感染者と接触し、感染の疑いがある人の数
  • I – 感染者数
  • R – 回復者数

各項目は、日次の時系列で人数がプロットされたリストも含まれています。

アプリでは、ユーザーが国を選択し、ソーシャルディスタンシングの指標を設定すると、画面上に対応する「接触」および「感染」の曲線が表示されるようになっています。

SEIR

Questにより複雑な計算を容易に処理

パラメータの組合せの数は膨大であり、全てのオプションを事前に計算し、Elasticubeにフィードするのは大変困難でした。そのため、パラメータの組合せが設定された時点でモデルの計算を実行する方法が取られました。こうしたオンザフライ(複数の処理をまとめて行う)のPythonモデル計算は、Sisenseの高度アナリティクス(分析)アドオンのQuestに最適です。

この工程ではPythonファイルをQuestカスタムモデルとしてアップロードし、Lambda(ラムダ)機能を作成するだけでした。この機能により、呼び出されるとSEIRにおける全ての計算が実行されます。Lambdaの各機能はQuestに内蔵されているAPIを通じて参照することができます。

しかしながら、Questを単体で使用する上で2つの大きな課題がありました:

  1. 1.インプット:Questがカスタムモデルに送信するダイナミックパラメータは、ウィジェットの既存データのみであり、ソーシャルディスタンシング率あるいはソーシャルディスタンシング開始後の経過日数など、調節可能なパラメータの送信が困難である。
  2. 2.アウトプット:Questは、モデルから返されたデータをいくつかの方法で処理することができる(例:結果を表で表示する、チャート上で新たなグラフ線としてプロットする、既存ポイントをハイライトするなど)。しかしながら、チャートに系列を追加できるが、シングルレスポンスに対して2つの系列は処理できず、「接触」および「感染」プロットの両方を作成することが非常に難しい。

Sisense BloXでカスタムインターフェースを作成

Quest runModel APIは、SEIRのカスタムモデルスクリプトの実行には理想的でしたが、ユーザーがパラメータを調節し、runModel APIを実行した後で結果をチャートにプロットするためのインターフェースが必要でした。

また、オンデマンドでカスタムJavascript機能を実行できるスライダーとインプットフィールドを備えたウィジェットタイプが必要でした。Sisense BloXのインプットおよびスライダーのコンポーネントは、ユーザーのインプットに最適でした。カスタムアクションでは次にその情報を使用し、さらにAPIと通信してチャートのクエリ結果を処理します。

技術的詳細:SEIRの有効活用

(筆者注:以下のセクションでは高度な専門用語を使用しており、Javascriptに通じている読者向けに書かれています。)

ステップ1:SEIRカスタムモデルの作成

私たちは、運用可能なLambdaファンクションを構築するために、Sisense Questのカスタムモデル機能を充実させることから始めました。

予め用意されているいくつかのネイティブモデルとは別に、ビルダーがPythonファイルを用いてそれぞれ独自のモデルを定義します。

アップロードされると、QuestがPythonスクリプトに基づくAWS Lambdaファンクションを生成し、モデルが呼び出されるたびに要求することができます。この通信は、Sisense Questマイクロサービスで指定された内部のAPIエンドポイント経由で行われます。

このプロジェクトでは、モデルで使用したいアルゴリズムが含まれるPythonファイルを最初に作成しました。このファイルは、Sisenseの優秀なデータサイエンティストによって作成・調節されましたが、コンテンツは非常にシンプルなものです。ファイルではLambdaの「イベント」属性から調節可能なパラメータを抽出し、それに基づいてSEIRの系列を計算します。

Pythonの必要な設定の完了後に、カスタムSisense Questモデルを作成しました。QuestのUIからモデルをアクティベートしていないため、可視化タイプと構造定義は重要ではありませんでした。

アップロード完了前に、ブラウザの開発者ツールの「network(ネットワーク)」タブを開く必要がありました。

「done(完了)」をクリックすると、ブラウザがQuestサービスにモデル作成リクエストを送信します。

リクエストに対するレスポンスには新モデルのIDが含まれています。

Sisense QuestのAPIを通じてモデルを実行する予定でしたので、関連するモデルを稼働させる際にはこのIDを使用しました。

(このプロセスを複製する場合、この時点でコピーして保存します。カスタムモデルの詳細および作成のベストプラクティスについてはSisense Questの関連資料をご覧ください。)

ステップ2:カスタムアクションの作成

このステップでは、作成したモデルをSisense BloXカスタムアクションで活用しました。(カスタムアクションをこれまで利用したことがない場合、基本的な使用方法が書かれているカスタムアクションガイドに目を通すことをお薦めします。)

アクションは3つの主要ステージで構成されています。

ステージ1:アクションインプットの抽出

アクションのロジックを書いている間に、アクションのインプットに提供されるべき情報がSisense BloXウィジェットのクエリのものなのか、それともユーザーインプットのものなのかを特定します。このガイドの以下のステップでは、これらの情報をアクションのインプットペイロードに含めます。

コードでは、ペイロードデータから変数を抽出します。

ステージ2:カスタムモデルの稼働

SEIRモデルは、モデルが必要なデータとともにステージ1で保存したモデルIDを用いて、QuestのrunModel APIエンドポイントで実行されます。

   // Run SEIR custom model via Quest
   let modelResult;
   const myHeaders = new Headers();
   myHeaders.append("Content-Type", "application/json");
 
   const data = JSON.stringify({
       "modelId": modelId,
       "method": "POST",
       "payload": {
           "N": n,
           "p": socialDistanceRate,
           "p_start_day": pStartDay
       },
       "custom": true
   });
 
   const requestOptions = {
       method: 'POST',
       headers: myHeaders,
       body: data,
       redirect: 'follow',
       credentials: 'include'
   };
 
   fetch(`${sisenseUrl}/api/v1/quest/runModel`, requestOptions)

エンドポイントについていくつか注意点があります。

  • modelIdとSinsense urlは、フルアクションファンクション(添付)の始めに指定された定数になります。これらの定数は皆様の環境および前のステップで作成したモデルに適応させる必要があります。
  • リクエストのボディは、モデルID、ペイロードオブジェクト(モデルが受信すべき全てのパラメータが含まれる)、そしてハードコーディングされた2つの値(カスタム:true、メソッド:post)を含む、stringifyされたオブジェクトである必要があります。
  • Sisense JSを用いて自社のWebサイトにSinsnse BloXウィジェットを組込みたい場合、クレデンシャルの「include(含める)」プロパティを用いてリクエストにクレデンシャルを含めるようにします。
  • 外部のURLと通信したい場合CORSを開く必要がありますが、QuestのAPIは内部にあるため、ここでは必要ありません。

ステージ3:ターゲットウィジェットにモデルの結果をプロット

モデルの結果が解決されたら、いつでも利用できるようになります。このケースでは、モデルの結果に基づきダッシュボードにある別のウィジェットを操作し、2つの系列を追加しました。このフローは、結果を利用して自分のニーズに合わせて調整して下さい。

ステップ3:基本的なSisense BloXウィジェットの作成

モデルとアクションを作成した後に、アクティベートするツールとしてSisense BloXウィジェットを開きました。作成したカスタムアクションをアクティベートするには、ユーザーがそれぞれのアクションボタンをクリックする必要があり、これが最初に追加する要素になります。

この例では、ActionSet要素の中にアクションを追加しました。これにより、Sisense BloXカードの中のボタンのスタイルとロケーションのコントロールが非常に楽になります。次に、データオブジェクトのプロパティとしてアクションが要求する全てのパラメータを含めました。我々のモデルはn、socialDistanceRate、pStartDayのパラメータを必要とし、モデルの処理とプロットはウィジェットIDと系列の色を必要とします。

ウィジェットパネルの値を反映する(例:パラメータn)、あるいはハードコーディングされたデフォルト値を反映するか、いずれかにパラメータの値を設定します。

{
   "type": "ActionSet",
   "class": "update-model-button",
   "actions": [
       {
           "type": "SEIR",
           "title": "Apply",
           "data": {
               "widgetId": "5ea16f579e97a3002de5a31d",
               "color": "#000000",
               "n": "{value: Population}",
               "socialDistanceRate": 1,
               "pStartDay": 10
           }
       }
   ],
   "style": {
       "paddingBottom": "0",
       "marginRight": "15px",
       "display": "none"
   }
}

ユーザーのインプットをダイナミックに読み取るようにしたいパラメータには、Textinput要素を作成します。インプットフィールドの値によりアクションをフィードするには、値がアクションのペイロードの各属性のパスを示すIDプロパティを指定するようにします。

{
   "type": "Input.Text",
   "id": "data.socialDistanceRate",
   "placeholder": "0-1",
   "defaultValue": "0"
}

便宜上、各インプットをContainer要素でラップすることをお勧めします。最後に、Sisense BloXウィジェットをダッシュボードに合うようにデザインします。

ステップ4:Sisense BloXの強化

これで運用可能なSisense BloXウィジェットが完成し、カスタムアクションでカスタムクエストモデルをトリガーし、結果をターゲットウィジェットにプロットできるようになりました。この時点でSisense BloXウィジェットを好みに合わせて調整することができます。

しかし、ソーシャルディスタンス率の値を手動で変更したり、入力フィールドにソーシャルディスタンスが適用されるまでの日数をユーザーに求めるのは面倒で、私たちが求めていたスムーズな体験を得ることができませんでした。

これらの2つのパラメータは数値範囲だったため、スライダーの使用が適していました。

しかしSisense BloXではスライダーはインプットとみなされないため、呼び出しアクションでは値が収集されません。この問題を克服し、スライダーの値を適用させるためにAuto Sliderソリューションを導入し、Sisenseアプリのルック&フィールを作成するためにCSSを追加しました。

より高度なアナリティクス(分析)アプリを構築

SEIRアプリは、ソーシャルディスタンシングで人命を救うだけでなく、Sisenseのデータ/アナリティクス(分析)プラットフォームの可能性を押し広げる果敢な実験でした。Sisense BloXはアクションとインサイトを融合し、ビジュアルと機能性の両方において他に類を見ないレベルのカスタマイズを可能にします。Sisense Quest アドオンは、高度なアナリティクス(分析)をさまざまな方法で柔軟に利用できるようにし、洞察力を高め、データをより有効に活用できるようにします。

これらは、Sisenseがデータを活用することで実現できる画期的なことのほんの数例でしかありません。この記事のガイド内容が皆様の想像を掻き立て、果敢にソリューションを構築するための手助けとなれば幸いです。是非私たちの活発なビルダーコミュニティにアクセスし、他のビルダーが取り掛かっている興味深いプロジェクトを見聞し、皆様自身のプロジェクトについてのフィードバックも得られるようにして下さい。COVID-19における曲線の上昇率を抑えることからデータ/アナリティクス(分析)の画期的な新製品の開発まで、皆さんと協業することであらゆることが成し遂げられると信じています。

Sisense for Cloud Data Teams

Adi Lewenstein(アディ・ルーエンシュタイン)はSisenseのCS部門のBIコンサルタント、並びにSisense Labsのグロースハッカーとして、アナリティクス(分析)とBIの分野で10年近く活動してきました。また、数多くの業界イベントで講演し、現在SisenseのAI R&Dチームのフルスタックデベロッパーであり、ユーザーとして一度は使ってみたかったAIを活用した機能の実装に注力しています。

Tags: | | |