Microsoft Fabric向けのArcGIS GeoAnalyticsのパブリックプレビュー開始を記念して、GeoAnalytics for Fabricの機能を探る一連のブログ投稿を行います。 本投稿では、大規模なポイントデータセットを探索し、GeoAnalytics for Fabricでトレンドやホットスポットを計算するための分析機能について探ります。

GeoAnalytics for Fabricのインポート
まずはGeoAnalytics for Fabricのインポート方法と使用開始方法のおさらいから始めましょう。GeoAnalytics for Fabricをインポートするには、ノートブックのセルに import geoanalytics_fabric と追加するだけです。ライブラリの有効化について詳しくは、 Getting started documentationをご覧ください。また、入門シリーズの以前のブログ投稿にも例があります。
データ
本投稿では、マサチューセッツ州ボストン市の公共安全データ を Azureオープンデータセットから使用します。 このデータセットには、ボストン市の公共安全サービスリクエストの緯度経度座標が含まれています。
# https://learn.microsoft.com/en-us/azure/open-datasets/dataset-boston-safety?tabs=pyspark
# Azure storage access info
blob_account_name = "azureopendatastorage"
blob_container_name = "citydatacontainer"
blob_relative_path = "Safety/Release/city=Boston"
blob_sas_token = r""
# Allow SPARK to read from Blob remotely
wasbs_path = 'wasbs://%s@%s.blob.core.windows.net/%s' % (blob_container_name, blob_account_name, blob_relative_path)
spark.conf.set(
'fs.azure.sas.%s.%s.blob.core.windows.net' % (blob_container_name, blob_account_name),
blob_sas_token)
print('Remote blob path: ' + wasbs_path)
# SPARK read parquet
# use the GeoAnalytics for Fabric ST_Point function to create a geometry
df = spark.read.parquet(wasbs_path)\
.withColumn("geometry", ST.point("longitude", "latitude", 4326))
df.persist().count()
このデータセットはかなり大きく、2400万件以上のレコードがあります!大規模なデータセットでは、単にデータを見るだけでは視覚的にパターンを特定することが難しいことがよくあります。

GeoAnalytics for Fabricは集約やその他の分析技術を通じてこれらのパターンを探索しやすくします。本投稿で探る内容です。ノートブック内でパターンを見やすくするだけでなく、データ集約は一般的なビジネスインテリジェンスツール(例えばPower BI)で探索用にデータを準備する重要なステップでもあります。
まずは集約から始めましょう。
空間ビニングによるパターン発見と可視化の簡素化
ポイントデータセットでは、地図上のポイントが重なり合い分布パターンが隠れてしまうことがよくあります。これはポイントが重なりすぎて密度を視覚的に識別できないためで、地図全体がデータマーカーで完全に覆われている場合は、完全に覆われた地図以外にパターンがありません。
このような場合には空間集約が役立ちます。空間集約では離散的な地理的領域(例:正方形、六角形、学区、国勢調査区など)に落ちるポイント数をカウントし、それらのポリゴンごとにポイント数や属性の他の集約値をマッピングできます。
データを集約して空間パターンを特定することに加え、これはPower BIなどBIツールでダッシュボード上でより簡単に可視化するためのデータセット作成にも役立ちます。
上記のデータセットプロットで見たように、本当に多すぎて明確なパターンを見ることは困難です。かなりズームインしても、この密集したデータセットでパターンを見ることは難しいかもしれません。そこで空間ビニングと集約がどのように役立つか探ってみましょう。

分布を理解しやすくするために、GeoAnalytics for Fabric の Aggregate Points ツールを使って集約します。Aggregate Pointsは他のデータセットからポリゴンまたはビン(正方形、六角形、H3)へのポイント要約を行います。ポリゴンやビンの境界を使って各領域内のポイントを収集し統計量を計算します。結果には常に各領域内のポイント数が含まれます。
六角形または正方形ビンによる分析には入力ジオメトリが投影座標系である必要があります。H3ビンによる分析では入力ジオメトリがWorld Geodetic System 1984座標系(SRID 4326)であることが期待されます。投影法と座標系については Coordinate systems and transformationsコアコンセプトをご参照ください。
適切な座標系でない場合、Aggregate Pointsツールは入力を必要な座標系に変換します。または自分で ST_Transformを使って変換可能です。
ビン作成
背景説明はここまでとして、正方形ビンを作成しましょう。以下の例では Aggregate Points ツールを使い、一辺0.1マイル長さの正方形空間ビンにデータを分割しています。
# bin the data
from geoanalytics_fabric.tools import AggregatePoints
# aggregate points into square bins
result_agg = AggregatePoints() \
.setBins(bin_size=0.1, bin_size_unit="Miles", bin_type="Square") \
.run(df)
これにより、新しいDataFrameが生成され、その中にはビンジオメトリとビン内特徴量数が含まれます。またビン作成時に他の集約サマリーフィールド(例:最小値、最大値、合計など)も追加可能です。
集約結果をプロットすると、新たなパターンが現れ、データ分布をより簡単に理解できるようになります。
元のデータセットと0.1マイル正方形ビンに分割したデータとの比較マップ
Aggregate Pointsツールでデータ集約する際には、すべてのデータをまとめてビニングする代わりに時間ベースでスライスすることも可能です。これにより時間経過による変化パターン比較が容易になります。
時間ステップによるビニングには入力DataFrameで時間が有効になっている必要があります(例:タイムスタンプ列がある)。
既定では時間スライシングは1970年1月1日に自動的に揃えられ、その時点からステップが計算されます。この開始時刻は変更可能です(既定1970年1月ではなく指定したい場合)。 1970年1月1日)。これは <\/SPAN>reference time<\/EM>を使用して行われます。reference timeは日付(例:2016年1月1日)または日時(例:2016年1月1日午前9時30分)で指定できます。 時間ステップに関する詳細は、コアコンセプトのドキュメントの <\/SPAN>time stepping<\/A>をご覧ください。<\/P>ここでは、入力データの各year<\/EM>ごとに別々のビンセットを作成する例を示します。 これにより、個々の年や時間経過による変化(例:過去1年間の絶対的またはパーセント増減)を見ることができます。 <\/P> <\/P># aggregate points into square bins - for every 1 year in the data. By default the yearly interval starts at January 1
# this can be adjusted with the reference_time parameter input
result_agg_yearly = AggregatePoints() \
.setBins(bin_size=0.1, bin_size_unit="Miles", bin_type="Square") \
.setTimeStep(interval_duration=1, interval_unit="years") \
.run(df)<\/code><\/pre> <\/P> その結果、個々の年を見て比較することができます。 分析やプロットを行う際に年を指定するには、step_start<\/FONT>またはstep_end<\/FONT>列でフィルタリングします。<\/P> <\/P># plot results from aggregating points into square bins for _one_ year (2013)
result_plot = result_agg_yearly\
.filter(F.year("step_start") == 2013)\
.st.plot(cmap_values="COUNT",
basemap="dark",
cmap="YlGnBu",
vmax=1000,
figsize=(10,10))<\/code><\/pre> <\/P> 以下は結果の2つの年の例です:<\/P>
Comparing binned data for two different years<\/span><\/span><\/P>これらの結果を使って、次のような時間経過による変化を計算することもできます:<\/P>
<\/span> <\/P>
結論<\/H3>トレンドとホットスポットの探索に関するこの簡単な入門が役立ったことを願っています。 今後も開始に役立つ追加コンテンツを投稿していきますので、コミュニティでチェックしてください! また、どんな内容をもっと知りたいか教えてください!<\/P>