Snowflakeで地理空間インサイトを活用するための上級ガイド

過去3回の地理空間を中心としたブログ記事では、地理空間データとは何か、そしてこのデータがより広範なデータ世界でどのように機能するか、Snowflakeで具体的にどのように機能するかについて、SnowflakeのGEOGRAPHY、GEOMETRY、H3のネイティブサポートに基づいて学びました。これらの記事は、地理空間データの世界につま先を浸して、水を感じたり、プールの浅瀬を泳いだりするのに最適です。しかし、Snowflakeアカウントでは、地理空間データでできることはもっと多くあります。かといって、「コンセプトが分かった」から「最初のユースケースにどのように取り組めばよいか」に行き着くことは簡単ではありません。
広大で複雑な地理空間データ処理の世界の簡素化を、Snowflakeがお手伝いします。私たちはそのために、地理空間機能のさまざまな例を現実世界のコンテキストで説明するSnowflakeクイックスタートを作成しました。これらの例では、Snowflakeマーケットプレイスの代表的なデータやAmazon S3で自由に公開されているデータを使用しますが、Snowflakeアカウント、データ、ユースケースに適用すれば、ユーザーコミュニティに貴重なインサイトを提供できます。その方法についてはこのブログ記事で説明していますが、実際のコードを見たい場合はクイックスタート自体を参照してください。
位置データから地理空間データ型への変換
まずは、簡単な確認から始めましょう。位置データはどこにでもあります。Snowflakeアカウントには、ほぼ確実に時間ベースのデータがありますが、位置ベースのデータもほぼ確実にあります。ほとんどのトランザクションデータには、誰が、何を、いつ、どこで、という要素が含まれているからです。
最もシンプルな形式の位置データは、一般的に、通り、市、州、郡、郵便番号、国など、私たちが「アドレス」と呼ぶものを含む、さまざまなテキストおよび数値フィールドとして知られています。人間はこれらの文字列を簡単に読み取って理解できますが、テキスト形式では、これらの文字列の大部分は、私たちが知る必要があるときに検索する情報値であり、それ以上のものはありません。場合によっては、これらのテキストフィールドに緯度と経度のフィールドを含めることもできます。これらのフィールドは、位置データを点として地球上に配置することで、より多くのことを行えるようになるため、便利です。これは、そのようなすべてのポイントをBIツールのマッピング機能に統合して、ポイントがどの国または地域に属しているかを示すことができるからです。また、これらのポイントをH3などの空間グリッドに統合することもできます。SnowflakeのBIパートナーは緯度と経度のデータの操作をサポートしていますが、Snowflakeには緯度と経度のデータをH3空間グリッドに変換し、計算と可視化を高速化するサポートが組み込まれています(後述)。
また、さらに一歩進んで、緯度と経度のデータをGEOGRAPHYデータ型またはGEOMETRYデータ型に変換できます。前者は地球の楕円体の「地球儀」表現に、後者はより局地的な位置の平面である「地図」表現に使用できます。これらのデータ型は、さまざまな関数を使用して構築できます。
この2つのデータ型を使って、一連の点をつないで1つの線にし、複数の線を1つのポリゴンにつなぎ、複雑な位置を一連の線やポリゴンとして表現することができます。これらの型のオブジェクト間の複雑な計算や関係の関連付けを実行することで、シンプルな「アドレス」フィールドだけでは得られない、これまで知らなかったインサイトを引き出すことができます。「テキストのアドレスフィールドしかないとしたら?」と思うかもしれません。さて、では旅人の皆さん、ドキドキする冒険の世界、ジオコーディングへようこそ!「ジオ……なんだって?」
ジオコーディングとリバースジオコーディング
ジオコーディングとは、テキスト化されたアドレスデータを地理空間型に変換することで、これまで実現できなかった他のユースケースを可能にすることです。そしてもちろん、その逆も可能です。つまり、可読性の低い地理空間データ型をより人間が読める位置フィールドに変えることができます。これらの変換はどちらも、MapboxやTravelTimeなどのSnowflakeの専門的なパートナーで実行できます。これらはどちらもSnowflakeマーケットプレイスから利用できるSnowflakeネイティブアプリです。最も正確なジオコーディングとリバースジオコーディングを行うには、これらのプロバイダーをお勧めします。しかし、精度とコストのバランスを取る必要がある場合や、ROIを実証しないと費用を獲得できない場合もあります。そのような場合のために、ここでは、ジオコーディングとリバースジオコーディングをSnowflakeで直接始める方法について説明します。
このユースケースでは、Snowflakeマーケットプレイスの2つのデータセットを使用します。無料でオープンなアドレスデータコレクションであるWorldwide Address Dataと、SnowflakeパートナーであるCARTOのチュートリアルデータセットです。これは、単一のstreet_address 列を持つレストランテーブルです。独自のデータを使用する場合は、チュートリアルのレストランテーブルを自分のテーブルに置き換えます。この2つのテーブルに対して、データ準備を行います。このクイックスタートで確認できます。
SnowflakeジオコーディングのDIYは、次の3つのステップで実行します。
1.LLMを使用して、完全なアドレス文字列を、その部分を属性とするJSON配列に変換する。このステップでは、SNOWFLAKE.CORTEX.COMPLETE関数を使用します。この関数は、SnowflakeがホストするMixtral-8x7Bモデルを使用し、関数呼び出しの一部として指定した詳細な命令セットを使用して変換を実行します。これを大規模に実行するための適切なウェアハウスのサイズの選択については、クイックスタートノートを参照してください。
2.Worldwide Address Dataで緯度と経度の簡単な地理空間列を作成する。
- ST_POINTは、緯度と経度から地理空間列を作成するために使用される。
- 無効な緯度および経度値に基づいて、不要なデータが Worldwide Address Dataテーブルから削除される。
3.JAROWINKLER_SIMILARITYを使用してアドレスをマッチングする。2つのテーブルをいくつかの列で結合し、通りの名前をJAROWINKLER_SIMILARITY関数でラップします。通りの名前はソースによって微妙な文字列の違いが生じることが珍しくないため、関数呼び出しの類似しきい値として「95」を使用します。
ここで重要なのは、この方法が完璧な精度ではないということです。クイックスタートでは、到達する精度レベルとこの方法が不完全な理由がより詳しく表示されますが、この方法と専用のジオコーディングサービスとの間のコストの違いに注意する必要があります。この方法は、よりシンプルな要件を達成したい場合や、要件がより複雑な専用のジオコーディングサービスの正当性を実証するためのプロトタイプを作成する場合に最適です。
リバースジオコーディングを実行する、つまり地理空間データ型からアドレスを生成するには、次の3つの処理を行うストアドプロシージャを構築します。その処理とは、結果テーブルの作成、処理されていない行の選択、結果が見つかるまで半径を拡大していくループによる最も近いアドレスの検索です。このプロシージャは、Snowflakeのすべてのプロシージャと同様に呼び出すことができます。プロシージャコードの先頭で定義されている適切な引数を渡します。この手順については、クイックスタートで確認できます。
アドレスデータをジオコーディングすることで、そのアドレスデータをより洞察に満ちた方法で活用できるようになります。ジオコーディングされたデータの活用方法の一つを詳しく見ていきましょう。
地理空間データを利用した予測
予測は、時系列データを活用する一般的なアクティビティです。履歴データを入力し、履歴トレンドに基づいて将来のデータウィンドウを予測するように設計された、安定したMLモデルが存在します。Snowflakeには、このアクティビティに簡単に使用できる、SNOWFLAKE.ML.FORECASTという組み込みのML予測モデルが含まれています。時系列予測はあらゆる時間ベースデータで実行できますが、位置データでエンリッチすることで、予測プロセスに別の価値次元が生まれます。
クイックスタートでは、CARTOによって提供されているニューヨーク市のタクシーの乗車データと、PredictHQによって提供されているイベントデータという、2つのデータセットを使用しています。この2つのデータセットについては、次のように考えることができます。タクシーの乗車データは、特定の時間と場所で起こったことに関する時系列ベースのデータのようなものです。組織内には、そのようなデータが存在する可能性があります。イベントデータは、データ内の時間ベースの要素にコンテキストを追加します。この例では、イベントデータがニューヨーク市でのタクシーの予想される乗車回数の増減を示す可能性があります。その他のコンテキストデータには、オープン期間、クローズド期間、定期的なプロモーション期間、公開イベントなどがあります。いずれにしても、コンテキストデータは、期待値の増減によって特定の曜日や時刻を強めることで、予測の精度を高めるのに役立ちます。
予測アクティビティは、次の4つのステップで実行します。
1.空間グリッドを使用して、グリッド内の各セルのタクシーのピックアップの時系列を計算する。
H3空間グリッドを使用して、ピックアップ位置に基づいてニューヨーク市をセルに分割する。
緯度と経度をH3セルに変換することで、セル内のピックアップ場所を特定できる。
その後、SnowflakeのTIME_SLICE関数とH3_POINT_TO_CELL_STRING関数を使用して、ニューヨーク市の各セル内のピックアップ数を時間帯別に集計する。
最後に、ある位置のすべての空き時間をピックアップレコード0(ゼロ)で「埋める」必要がある。これは、時系列予測では必須である。
2.時間ごとの時系列データをイベントデータでエンリッチする。
加わったイベントデータに基づいて、各行に学校、祝日、スポーツイベントのいずれかのフラグを立てることにより、上記のデータに「特徴量」列が追加される。
イベントデータに適した「特徴量」であれば、何でも追加できる。このシナリオの現実的な例としては、学校の休日、祝日、スポーツイベントなどが挙げられる。
3.モデル、トレーニングデータセット、予測データセットを構築する。
SNOWFLAKE.ML.FORECASTモデルでは、予測を行う前にトレーニングステップが必要なため、ステップ2のデータを、時間によってトレーニング用と予測用の2つのテーブルに分割する必要がある。
このトレーニングデータテーブルをインプットの一つとして使用して、モデルを作成する。また、時間列、予測するメトリック、さらにこの例では予測の基準とする位置データなど、主要な列も特定する必要がある。
4.モデルを実行し、予測の精度を可視化する。
モデルのトレーニングが完了したら、モデルを呼び出して、予測に使用する別のデータセットを参照できる。
予測をテーブルに出力し、実際の結果と比較して精度を評価できる。これにはいくつかの方法があるが、クイックスタートでは対称平均絶対割合誤差(SMAPE)の使用が推奨されている。
以下のグラフは、1つのH3セルに対するこの比較の出力を示しています。予測モデルの精度は非常に高くなっています。

Snowflakeの時系列予測は強力なツールになり得ます。また、位置を個別に予測するよりも、位置を空間グリッド内の特定のセルにグループ化してそのセルを予測することで、さらに強化できます。
H3を使用した、位置別のセンチメントの可視化
上記のジオコーディングの例でLLMを使用したのは、データを別の形式に変換するためですが、LLMを使用して、テキストで使用されている言語の正負に基づいてテキストデータをスコアリングすることもできます。これは、特定の状況にある人々のセンチメント、つまり製品やサービスに対するフィードバックや、ブランドに対する好意的な見方などを評価するために価値があります。ここで重要なのは、生テキストを順序の測定値に変換し、位置要素の測定値になっているかどうかを分析できることです。Snowflakeでの実行方法を詳しく見てみましょう。
データの観点からは、以下の3つが必要となります。
何らかのイベントまたはトランザクション
そのイベントに関する生テキストのコメンタリー
そのイベントの位置
これは、1つのシステム(たとえば、顧客がアプリで注文を行い、注文プロセスに対する満足度をコメントする)で実行される場合もあれば、異なる複数のシステム(たとえば、顧客が商品を注文し、受け取った商品をソーシャルメディアでどれくらい気に入ったかを投稿する)で実行される場合もあります。クイックスタートでは、配送体験に関するお客様のフィードバックを含む、合成された配送データを使用します。
このフィードバックの位置別の可視化を行うには、次の2つのステップを実行します。
1.それぞれのフィードバックのセンチメントをスコアリングする。
まず、これまでと同様にSNOWFLAKE.CORTEXT.COMPLETEを使用する。だだし、今回はLLMに対して、テキストを評価し、「Very Positive」などのテキストカテゴリーラベルを割り当てるよう指示する。
次に、テキストのカテゴリーラベルを、共有エリアの多数のデリバリーで集計できる数値に変換する。
2.H3を使用して、位置別に集計したセンチメントを可視化する。
時系列予測のように位置スコアを事前に計算する代わりに、センチメントスコアをその場でH3セルに集約するアプリを構築する。
Streamlitアプリは、ST.PYDECK_CHARTを使用して、センチメントの分位に基づいてH3セルをプロットし、色付けする。
以下は、店舗位置別のセンチメント分析の可視化例です。

しかし、さらに重要なのは、このアプリではすべてをその場で計算するため、より自由にデータを探索できることです。これはどのような仕組みなのでしょうか。以下の拡大図を見てください。

サンフランシスコ半島をもっと細かく見渡したい場合はどうすればよいでしょうか。アプリのスライダーを使用して、H3の解像度を7から8に変更すると、より鮮明になります。

これにより、ギャップ、強み、懸念事項がより明確に把握できるようになりました。この優れた位置解像度をその場で得られるということは、SDテレビからHDテレビ、4Kテレビ、8Kテレビへと進化するようなものです。
H3は、メトリクスで位置を明確にするための強力かつ迅速な方法です。また、LLMと組み合わせることで、非加算的なテキストを測定可能な出力に変えることができます。これは非常に強力な機能で、組織内でさまざまな方法で応用できます。
ラスターおよびシェープファイルによる最近傍分析
多くの企業は位置データを標準のデータソースから取得していますが、地理空間データについて深く研究している企業は、データも特殊なフォーマットやファイルから取得されていることを知っています。まだ経験の浅い方のために簡単に言うと、これまでこの記事や他のブログ記事で扱ってきた地理空間データの大部分はベクトルデータ、つまり点、線、ポリゴンです。ベクトルデータをファイルに保存する一般的な形式はシェープファイルですが、シェープファイルは一般に専用のGISアプリケーションで開き、データベースでは読み込まれません。ラスターデータは、データがセルのグリッドとして表現される点でベクトルデータとは異なります。ピクセル化された画像を思い浮かべてください。ラスターデータは通常、GeoTIFFファイルに保存されます。この場合も、データベースでは通常読み込まれません。ベクトルとラスターにはそれぞれユースケースがあり、両方にアクセスする必要がある場合があります。クイックスタートでは、これに正面から取り組んでいます。
このシナリオでは、ラスターGeoTIFFとして保存されている標高マップと、シェープファイルとして保存されている気温/降水量データの2つのデータソースを利用し、両方のデータセットを使用して地下水の存在を予測します。これらは、Snowflakeでこれらのタイプのファイルにアクセスし、最終的に特定の分析に使用する方法を示すための代表的なファイルにすぎません。組織にGeoTIFFまたはシェープファイルがある場合は、これらのメソッドを使用してデータをSnowflakeに取り込むことができます。
この2つのデータソースを組み合わせて最近傍分析を行うには、次の3つのステップを実行します。
1.GeoTIFFファイルをロードする。
Rasterio Pythonライブラリを使用して、GeoTIFFメタデータを抽出し、GeoTIFFに存在するバンドを評価し、最終的に各ピクセルのセントロイドを読み取ってベクトルデータ(ポイント)に変換する関数を作成する。
その後、メタデータを評価し、ポイントを適切なSRIDでデータ型に変換する。
最後に、ポイントをH3セルに変換して、ボリュームのあるピクセル数を減らし、扱いやすいサイズにする。
2.シェープファイルをロードする。
Fiona PythonライブラリとSnowflakeの動的ファイルアクセス機能を使用して、シェープファイルのメタデータとデータを読み取る関数を構築する。
その後、シェープファイルデータの性質とその表現方法を評価し、それを適切な列とデータ型のテーブルにロードするクエリを設計する。
ステップ1と同様に、ポイントをH3セルに変換することで、行数を扱いやすいサイズに減らす。
クイックスタートには、このデータを可視化する代替方法も表示されている。ただし、これはオプションの手順である。
3.クイックスタートで説明されている2つの方法のいずれかを使用して、各標高ポイントの最も近い気象ポイントを計算する。
注:それぞれの方法では、クイックスタートで詳しく説明するように、フォーカスする領域まで両方のテーブルをフィルタリングする。
1つめの方法は、Snowflake内の自己完結型メソッドであり、ST_DWITHINとQUALIFYウィンドウ関数を組み合わせたクエリを使用する。ただし、この方法はコンピュートインテンシブな場合がある。
2つめは、ST_VORONOIPOLYGONS関数へのアクセスを可能にするSedonaSnowのSnowflakeネイティブアプリを使用する方法である。ボロノイポリゴンは、別のポイントに最も近いポイントをグループ化するためのより効率的な方法だが、そのような関数にアクセスするには、SedonaSnowアプリをインストールする必要がある。
地理空間データの世界では、従来とは異なるファイルのデータにアクセスしなければならないことが多くあります。そのような場合も、Snowflakeの柔軟性により、これらのファイルを操作しながら貴重なデータにアクセスして分析することが可能になります。
インタラクティブマップ
GISの世界では、位置データ用に設計されたユーザーインターフェイスとの対話も一般的です。これらのアプリケーションは、BIツールで一般的に実行できることを超え、高度なレイヤー機能やその他の位置固有のインタラクションを通じてより多くのデータを提示します。1つのオープンソースツールはKepler.gl.ですが、Kepler.glを自分で実装する必要はありません。SnowflakeマーケットプレイスからDekartをインストールするだけで、Kepler.glやそのより高度な位置可視化機能にほぼ即時にアクセスできます。SnowflakeネイティブアプリでSnowparkコンテナサービスを使用してKepler.glを実行すれば、データがSnowflakeから移動することもなくなります。クイックスタートの例を見てみましょう。
このユースケースでは、EV充電ステーションの密度を表示するインタラクティブなマップを作成し、ステーションを増やしても問題なさそうなエリアを特定します。この例では、国の境界、輸送ルート、位置(この例ではEV充電器)の3つのデータセットを重ねる必要がありますが、輸送ルートとEV充電器の位置は、自社組織内の他の2つの位置データで簡単に置き換えることができます。クイックスタートのセットアップが完了したら、次の3つのことを行います。
クエリを使用して境界レイヤーを定義します。

2つめのクエリを使用して、2つめのレイヤーとして輸送ルートを取得します。

「uk_roads」がKepler.glUIの左側にレイヤーとして追加されていることに注意してください。
次に、3つめのクエリを使用して、EV充電ステーションをさらに別のレイヤーとしてプロットします。

2つめと3つめのクエリでは、1つめのレイヤーの境界に含まれる道路と充電器のみを選択する際に、2つめと3つめのクエリをフィルタリングする手段として、FROM句で最初のレイヤーのクエリを名前で参照していることに注意してください。
最後に、各道路セグメントの半径50キロメートル以内のEV充電器の数をカウントしてEV充電器設置場所の密度を計算する、4つめのクエリを追加できます。

この例では、Kepler.glで実行できるすべてのことをお見せしているわけではありませんが、従来のBIツールで同じことを行うのは難しいということがお分かりいただけたなら幸いです。Snowflakeマーケットプレイスから簡単にインストールできる、位置の可視化のためのより洗練されたインターフェイスを使用すれば、考えていたよりも簡単に高度な位置分析を実現できます。
結論
このブログ記事では、Snowflakeで地理空間データからインサイトを引き出すさまざまな方法について説明しました。以下の6つの主な機能について説明しました。
分析を強化してジオコーディングやリバースジオコーディングなどのユースケースを切り開くための、位置データのGEOMETRYデータ型またはGEOGRAPHYデータ型への変換
時間ベースデータセットのイベントデータセットによるエンリッチメント
機械学習モデルとネイティブの機械学習SQL関数を適用した地理空間データでの予測
位置に基づいたセンチメント分析へのLLMの適用
ネイティブ関数を使用した距離の計算や近傍分析
Snowparkコンテナサービスと広範なパートナーエコシステムによるSnowflakeのネイティブ機能の拡張を使用した、インタラクティブな地図の可視化
このクイックスタートに従って、上述のシナリオをハンズオンで体験してください。より洗練されたユースケースを適用して、Snowflake内の位置データからより多くの価値を引き出す方法を習得するために役立ちます。お探しのポイントが見つかりますように!