Skip To Content

R および ArcGIS Pro を使用した統計解析の実行

前回のレッスンでは、人口に関する属性などの追加属性を使用して、データに情報を付加しました。今回は、マップ上の位置ごとに犯罪率を計算します。犯罪率は、人口に対する犯罪の発生数を決定します。それによって、人口が大きく異なるエリア間で犯罪数を適切に比較することができ、データに追加したその他の属性によって犯罪率がどの程度影響を受けるかを確認することができます。

ArcGIS では、属性テーブルのフィールド演算を使用して、100,000 人当りの犯罪数を決定できますが、計算した犯罪率が統計的に堅牢であることを確認する必要があります。R で関数を使用して犯罪率をスムージングします。

この解析では、経験的ベイズ スムージング手法を使用します。経験的ベイズ スムージングは、各ビン内の人口をデータの信頼性の尺度として使用するレート スムージング手法であり、人口が多いほど高い信頼性を与えます。その後、平均に向かって低下する信頼性を使用してエリアを調整します。この手法は、犯罪率に安定性を与えます。

R へのデータのブリッジ

次に、犯罪率に対して経験的ベイズ スムージングを実行するために、RStudio で作業します。R-ArcGIS Bridge が存在するため、ArcGIS Pro プロジェクト内のデータが RStudio に接続されて、RStudio からアクセス可能になります。

  1. 必要に応じて、ArcGIS Pro で Crime Analysis プロジェクトを開いてから、RStudio を開きます。

    次に、arcgisbinding パッケージのすべての関数を読み込むコマンドを実行します。次に、すばやくチェックを実行する別のコマンドを実行して、ブリッジが正しく実行されていること、および使用している ArcGIS Pro のバージョンを R が認識することを確認します。

  2. R コンソールで次のコードを入力し、Enter キーを押します。
    library(arcgisbinding)
    注意:

    [Error in library(arcgisbinding): there is no package called ‘arcgisbinding'] などのメッセージを受け取ったら、R-ArcGIS Bridge が正しくインストールされたことになります。

  3. R コンソールで次のコードを入力し、Enter キーを押します。
    arc.check_product()

    arc.check_product() 関数は、ArcGIS 製品およびライセンスに関する情報を RStudio コンソールに出力します。

    arcgisbinding パッケージが RStudio ワークスペースに読み込まれ、R から ArcGIS への接続が初期化された後に、ArcGIS 内の現在のプロジェクトから、データを RStudio ワークスペースに読み込むことができます。シェープファイル、ジオデータベースからのフィーチャクラス、およびテーブルはすべて、open 関数で使用するための有効な引数です。

  4. arc.open() 関数を使用します。その引数で、情報が付加されたデータ サブセット (San_Francisco_Crimes_Enrich_Subset) への絶対パスを入力して Enter キーを押します。
    注意:

    プロジェクト データは、コード例に示した場所とは異なる場所に保存されている場合があります。コピーして貼り付ける場合、それに応じてパスを更新します。パスを Rstudio で指定するには、バック スラッシュ (\) を二重バック スラッシュ (\\) に置き換えるか、バック スラッシュを単一のスラッシュ (/) に置き換えます。

    たとえば、「C:\San-Francisco\Crime Analysis.gdb\San_Francisco_Crimes_Enrich_Subset」を「C:\\San-Francisco\\Crime Analysis.gdb\\San_Francisco_Crimes_Enrich_Subset」または「C:/San-Francisco/Crime Analysis.gdb/San_Francisco_Crimes_Enrich_Subset」に置き換えます。

    enrich_df <- arc.open(path = 'C:/Lessons/San-Francisco/Crime Analysis.gdb/San_Francisco_Crimes_Enrich_Subset')

    open 関数は、変数 arc.dataset に格納した新しい enrich_df クラス オブジェクトを返します。このオブジェクトは、ArcGIS データの空間情報と属性情報の両方を含んでおり、ここで他の関数で使用することができます。

    arc.select() 関数を使用して、解析用のデータとして使用する enrich_df オブジェクトから属性のサブセットを選択することができます。

  5. arc.select() 関数を使用します。1 番目の引数で、サブセットの作成元になるオブジェクトとして enrich_df を入力します。2 番目の引数で、サブセットに含めるデータセットの各属性の名前を含んでいる文字ベクトルを追加し、Enter キーを押します。
    enrich_select_df <- arc.select(object = enrich_df, fields = c('OBJECTID', 'SUM_VALUE', 'populationtotals_totpop10', 'wealth_medval_cy', 'wealth_medhinc_cy', 'ownerrenter_renter_cy', 'businesses_n13_bus', 'businesses_n37_bus'))
    注意:

    RStudio では、arc.select() 関数はフィールド エイリアスを認識しないため、サブセットで使用する実際のフィールド名を指定する必要があります。San_Francisco_Crimes_Enrich_Subset フィーチャクラスの実際のフィールド名とそれに関連するエイリアス名を次に示します。

    • populationtotals_totpop10 - 2010 Total Population
    • wealth_medval_cy - 2018 Median Home Value
    • wealth_medhinc_cy - 2018 Median Household Income
    • ownerrenter_renter_cy - 2018 Renter Occupied HUs
    • businesses_n13_bus - Food & Beverage Stores Bus (NAICS)
    • businesses_n37_bus - Food Service/Drinking Estab Bus (NAICS)

    現在、enrich_select_df 変数には、R 内の完全な元のシェープファイルから選択した 8 つの属性を持つ R データ フレーム オブジェクトが格納されています。それらの属性は、ID 値、六角形ビンごとの犯罪数、およびデータに情報を付加するのに使用した 6 つの属性を含んでいます。

    最後に、arc.data2sp() 関数を使用して、R データ フレームを空間データ フレーム オブジェクトに変換します。空間データ フレーム オブジェクトは、sp パッケージに含まれている空間データ クラスの 1 つです。sp パッケージは、ポイント、ライン、ポリゴン、ピクセル、リング、グリッドなどの空間データを操作するためのクラスおよびメソッドを提供します。この関数を使用して、投影法などのデータの空間属性を、情報の消失を心配することなく ArcGIS から R に転送することができます。

    sp パッケージを使用したことがない場合、sp パッケージを RStudio パッケージ ライブラリにインストールし、sp パッケージからワークスペース環境に関数を読み込む必要があります。

  6. library() 関数を使用して、sp パッケージを RStudio に読み込みます。
    install.packages("sp")
    library(sp)
  7. arc.data2sp() 関数を使用します。1 番目の引数で、enrich_select_df オブジェクトに変換するオブジェクトとして sp データ フレームを使用します。
    enrich_spdf <- arc.data2sp(enrich_select_df)

データが ArcGIS Pro から RStudio にブリッジされました。

スムージングされた犯罪率の計算

解析を開始するために必要なすべての情報が準備されましたが、現在の属性ラベルが曖昧で短縮されていることに気付いているかもしれません。これは、San_Francisco_Crimes_Enrich_Subset フィーチャクラスの元のフィールド名を表しています。R では、情報が付加された属性の名前を、識別しやすいように変更することができます。それが完了したら、経験的ベイズ スムージングをデータに対して実行します。

  1. col_names という文字ベクトルを作成します。ベクトル内のアイテムごとに、現在のラベルを置き換えるのに使用する新しい属性名を指定します。
    col_names <- c("OBJECTID", "Crime_Counts",
    "Population", "Med_HomeValue", "Med_HomeIncome",
    "Renter_Count", "Grocery",
    "Restaurant")
  2. colnames() 関数を使用します。その引数で、enrich_spdf@data を使用して空間ポリゴン データ フレームのデータ属性を選択します。元の変数名の代わりに割り当てられる属性ラベルの値として、作成した col_names ベクトルを割り当てます。
    colnames(enrich_spdf@data) <- col_names

    空間ポリゴン データ フレームのデータ属性の列名を更新しました。変更を確認するには、次のコマンドを R コンソールに入力して、データ属性の最初の数行を表示します。

    head(enrich_spdf@data)

    次に、犯罪率に対して経験的ベイズ スムージングを実行するために、EBest() 関数を使用します。EBest() 関数は、spdep パッケージに含まれています。以前と同様に、spdep パッケージを操作したことがない場合は、library(spdep) 行を実行して spdep ライブラリを現在のワークスペースに読み込む前に、このパッケージをインストールしておく必要があります。

  3. コンソールで以下のコードの行を入力して、六角形ビンごとに経験的ベイズ スムージングが適用された犯罪率を計算します。各行を個別に実行するか、またはコード ブロック全体を貼り付けて、すべての行を一度に実行することができます。
    注意:

    コード ブロックをコピーしてコンソールに貼り付けると、構文エラーが発生する場合があります。エラーが発生した場合は、コードの各行を別々に入力することを検討してください。

    install.packages("spdep")
    library(spdep)
    n <- enrich_spdf@data$Crime_Counts
    x <- enrich_spdf@data$Population
    EB <- EBest (n, x)
    p <- EB$raw
    b <- attr(EB, "parameters")$b
    a <- attr(EB, "parameters")$a
    v <- a + (b/x)
    v[v < 0] <- b/x
    z <- (p - b)/sqrt(v)

    EBest() R 関数は、特定タイプの経験的ベイズ推定を実行します。一般的には、従来のベイズ法は、データ値の観測が完了する前に事前分布を使用するのに対して、経験的ベイズ推定は、使用されるベータ事前分布がデータから推定されるため、これらの手法に近似するものとなっています。ただし、このレッスンで使用される EBest() R 関数では、実際には、経験的ベイズ推定の修正版を使用しており、パラメーターの推定値はモーメント法で決定されます。コードでは、変数 ab は、それぞれ、モーメント法のファイとガンマの値を参照します。これらの値は、人口パラメーターの推定値 (この場合の人口は、六角形ビンの人口値を参照するのではなく、統計のサンプルと人口データのコンセプトを参照します) であり、レートのスムージングの実行に使用されます。この場合のスムージングは、標準スコア (z スコア) を計算することで実行されます。この計算では、未加工の各粗率値から人口平均値 (モーメント法で推定されたガンマ値) を引いて、標準偏差で割ります。標準偏差は、分散の平方根 (負の値は不可) を使用して計算します。したがって、計算は変数 v に関して実行されます。

    最後に、スムージングされた犯罪率を、新しい属性として空間データ フレーム オブジェクトに追加します。

  4. enrich_spdf@data$EB_Rate を使用して EB_Rate という新しい属性を空間ポリゴン データ フレームに作成し、それに対して、位置ごとに犯罪率を含んでいる数値ベクトル z を割り当てます。
    enrich_spdf@data$EB_Rate <- z

    これで、データには、EB_Rate という新しい列が含まれるようになりました。この列は、上で六角形ビンごとに計算した犯罪率の値を含んでいます。

    R での作業が完了したので、次に ArcGIS に戻り、新規作成した犯罪率をマッピングおよび解析によって調査します。

    まず、arc.sp2data() 関数を使用してデータを R 空間データ フレーム オブジェクトから ArcGIS ファイル タイプに再び変換します。次に、arc.write() を使用して、データを選択したプロジェクトに書き込みます。

  5. arc.sp2data() 関数を使用して、その引数として enrich_spdf を入力します。結果を、arcgis_df などの新しい変数に割り当て、Enter キーを押します。
    arcgis_df <- arc.sp2data(enrich_spdf)

    これで、R 空間ポリゴン データ フレームがデータ フレーム オブジェクトに再び変換されました。このデータ フレーム オブジェクトは、ArcGIS プロジェクトに書き込むことができます。データ フレーム オブジェクトは、シェープファイル、テーブル、またはジオデータベース内のフィーチャクラスとして ArcGIS プロジェクトに再び書き込むことができます。

  6. arc.write() 関数を使用します。1 番目の引数で、SF_Crime ジオデータベースのパスを入力し、フィーチャクラスに San_Francisco_Crime_Rates という名前を付けます。arc.write() 関数の 2 番目の引数で、ArcGIS に書き込む R オブジェクトを入力します。最後に、3 番目のオプションのパラメーターを追加して、ArcGIS に書き込むオブジェクトの空間参照を指定します。Enter キーを押します。
    arc.write('C:/Lessons/San-Francisco/SF_Crime.gdb/San_Francisco_Crime_Rates', arcgis_df, shape_info = arc.shapeinfo(enrich_df))

    空間参照により、マップへの追加時にデータが正確に投影されるようになります。

R を使用して、データを強力なデータに変換しました。六角形ビンごとの犯罪数を、人口の変化を考慮する犯罪率に変換し、人口の変化が発生する犯罪数にどのように影響を与えるかを示しました。経験的ベイズ スムージングを使用して、作成した犯罪率が、位置ごとに使用できる情報量に対して堅牢であることを確認しました。

次に、犯罪の傾向とパターンを視覚化できるように、ArcGIS Pro で再びデータを調べます。

引き続き ArcGIS Pro で解析する

R で調整されたデータを ArcGIS に戻すときがきたので、RStudio を最小化して ArcGIS プロジェクトを最大化します。

  1. RStudio を最小化して、ArcGIS Pro を最大化します。
  2. [カタログ] ウィンドウで、[SF_Crime] ジオデータベースを右クリックして [更新] を選択します。

    更新された SF_Crime ジオデータベース

    現在 SF_Crime ジオデータベースは、スムージングされた犯罪率が含まれている San_Francisco_Crime_Rates フィーチャクラスを含んでいます。

  3. [San_Francisco_Crime_Rates] フィーチャクラスを右クリックして [新しいマップに追加] をクリックし、[マップ] を選択します。

    このファイルは、プロジェクト内のマップに追加され、解析に使用することができます。

犯罪率が異常に高いエリアの識別

住民の数に対して犯罪数が予想外に高いサンフランシスコ市内のエリアを確認するために、別のホット スポット分析を実行します。

実行した最初のホット スポット分析では、犯罪数が予想よりも統計的に有意に高いエリアを識別し、位置ごとの犯罪数が時間とともにどのように変化しているかに関する情報を提供しました。今回のホット スポット分析では、高い犯罪率および低い犯罪率の統計的に有意なクラスターを識別し、エリア内の人口に対して犯罪数が異常に高いエリアを確認することができます。

  1. [ジオプロセシング] ウィンドウで、[最適化ホット スポット分析 (Optimized Hot Spot Analysis)] ツールを検索して開きます。
  2. [入力フィーチャ][San_Francisco_Crime_Rates] を選択します。
  3. [出力フィーチャクラス] で、[Crime Analysis.gdb] という名前のデフォルトのプロジェクト ジオデータベースを参照して選択し、出力フィーチャクラスの名前を [San_Francisco_Crime_Rates_OHSA] に設定します。
  4. [分析フィールド][EB_Rate] を選択します。

    EB_Rate 列に含まれている R で計算された犯罪率に対してこのツールを実行することによって、このツールの結果は、犯罪率の値が高いか低い統計的に有意な空間クラスターの位置を特定します。

  5. [実行] をクリックします。

    解析結果マップ

    マップ上の明るい赤色の六角形ビンは、99% の信頼性を持つ非常に値の高いクラスタリングが存在するエリアを示しています。これらは、人口を考慮した場合でも異常に高い犯罪数が発生しているエリアです。各エリアの人口が考慮されると、統計的に有意なコールドスポット (犯罪数が少ないクラスタリングのエリア) がないことに注意してください。

  6. プロジェクトを保存します。

このレッスンでは、R ArcGIS Bridge を使用してデータを R に転送し、スムージングされた犯罪率を計算するために必要な機能を活用しました。その後、データを ArcGIS に再び転送し、引き続き解析を行って、発生している犯罪数を低減するために追加の警察のリソースを必要としているエリアをさらに正確に示しました。

次のレッスンでは、R で探索的データ解析を実行し、犯罪率における傾向が、データに情報を付加するのに使用したその他の属性のいずれかと関係があるかどうかを確認します。