「Rを使った南アメリカのマッピング:ジオビジュアライゼーションの詳細解説」

南アメリカのマッピングのRによる詳細解説

Alexander Schimmeckによる写真、Unsplashより

あなたは、幼少期から地図と地理に興味を持つデータサイエンティストであり、アマチュアのVoAGIライターです。グラフとおそらく地図を使用した次の作業のための良いテーマを探しています。そこで、あなたの国、ブラジルの公式統計機関が最新の国勢調査データを公開したことに気付きます。なぜやらないのでしょうか?ブラジルを南アメリカの隣国と比較する写真を撮ることは簡単なタスクかもしれません。Rとその良いパッケージを使用すれば、簡単なタスクです。やってみましょう。

この決断の瞬間の次に、簡単なタスクは実際にはヒーローの旅であり、適切なシェイプファイルのデータセットの発見、情報の欠如、シェイプファイルの相互運用性、緯度経度の数学、地理概念の文化的な違い、さらには地政学的な問題などの要素が含まれていることに気付きます。たとえば、フランスの海外領土の地図とデータを正しく南アメリカに配置する方法を理解するなどの問題があります。

次の段落では、世界地図の一部に人口情報を描画するための可能性のあるパスの1つを説明します。以下に説明するステップバイステップの手順は、地理視覚化アプローチを使用して国際比較に興味があるすべての人に役立つかもしれません。たとえば、アフリカ諸国間の水へのアクセスや北アメリカの肥満率を比較する目的であってもです。

Pachamama

まず全体像から始めましょう:mapa-mundiのRバージョンです。以下の画像とコードをご覧ください。

Mapa Mundi: Image by author
library(readxl)library(geobr)library(tidyverse)library(sf)library(spData)library(ggrepel)data("world")#mapa mundiworld %>%  ggplot() +  geom_sf(aes(fill=pop/10^6)) +  scale_fill_continuous_sequential(palette= "Heat 2" )+  theme_void() +  theme(    panel.background = element_rect(fill="#0077be")  ) +  labs(    fill= str_wrap("População em milhões de habitantes", 10)  )

私はパッケージ{spData}を使用して、地球上のすべての領域のシェイプファイルのジオメトリ情報を参照するための参考としています。aes関数は、人口情報を形状に埋めるために使用されます。中国とインドは世界で最も人口の多い国であり、それぞれ10億人以上います。ヒートカラーは他のすべての国との対比を示しています。ほとんどの連続的な色は弱いです。私たちは写真の色のグラデーションをほとんど理解することができません。色の分布をより良く把握したい場合は、対数が最良の代替方法です。以下を参照してください。

Mapa mundi with log scale. Image by author
world %>%  ggplot() +  geom_sf(aes(fill=pop)) +  scale_fill_continuous_sequential(palette= "Heat 2", trans= "log2" )+  theme_void() +  theme(    panel.background = element_rect(fill="#0077be"),    legend.position = "none"  )

コードでは、scale_fill_continuous_sequential関数で対数変換が行われていることがわかります。

worldデータフレームの構造には、Continent列があります。したがって、この列を使用してデータをフィルタリングして南アメリカの地図を取得するのは明らかです。以下にコードとその直後の地図をご覧ください。

South America map: first version. Image by author
world %>%  filter(continent == "南アメリカ") %>%  ggplot() +  geom_sf(aes(fill=pop/10^6)) +  scale_fill_continuous_sequential(palette= "Heat 2" )+  theme_void() +  theme(    panel.background = element_rect(fill="#0077be")  ) +  labs(    fill= str_wrap("人口(百万人)", 10)  )

ご覧の通り、dplyrのfilter関数は正常に動作しました。これは私たちが見たかった地図です。しかし、本当に正しいのでしょうか?

気候変動は大きな問題ですが、海面はまだ南アメリカ北部に登場した顕著な地域を溺れさせるほど上昇していません。ここで何が起こったのでしょうか?今度は座標の助けを借りて、ポリゴンに名前を付けて別の地図を描いてみましょう。

南アメリカ地図:第2バージョン。著者による画像
southamerica<-  world %>%  filter(continent=="南アメリカ") southamerica$lon<- sf::st_coordinates(sf::st_centroid(southamerica$geom))[,1]   southamerica$lat<- sf::st_coordinates(sf::st_centroid(southamerica$geom))[,2]southamerica %>%  ggplot() +  geom_sf(aes(fill=pop/10^6)) +  scale_fill_continuous_sequential(palette= "Heat 2" )+  theme_light() +  theme(    panel.background = element_rect(fill="#0077be")  ) +  labs(    fill= str_wrap("人口(百万人)", 10)  )+  geom_text_repel(aes(x=lon, y=lat, label= str_wrap(name_long,20)),                   color = "black",                   fontface = "bold",                   size = 2.8)

theme_lightではなくtheme_voidだと座標が表示されませんでした。ポリゴンの名前付けにはもう少し作業が必要でした。各ポリゴンの重心を計算し、この情報をgeom_text_repel関数のxとy座標として使用する必要がありました。

この新しい地図バージョンと前の知識を活用して、失われた領土がフランス領ギアナであることが分かりました。フランス領ギアナは、南緯0度から10度、西経53度から55度の間に位置しています。次の目標は、フランス領ギアナの情報を取得する方法を理解することです。ポリゴン、人口、マップを埋めるためのいくつかの座標などです。

La Mer

フランスの地図データを理解するために、{spData}パッケージがこの国の地図データをどのように扱っているかを他の地域から分離する必要がありました。以下はその結果です。

フランスの地図。著者による画像
france<-  world %>%  filter(iso_a2 == "FR")france %>%  ggplot() +  geom_sf(aes(fill=pop)) +  scale_fill_continuous_sequential(palette= "Heat 2", trans= "log2" )+  theme_light() +  theme(    #panel.background = element_rect(fill="#0077be")  ) +  labs(    fill= str_wrap("人口", 30)  )

フランスには多くのいわゆる海外領土があります。{spData}パッケージのアプローチは、主要な領土と地中海にある島であるコルシカ、そしてフランス領ギアナのみを表すことでした。フランス領ギアナは、前回の南アメリカの地図にあるギャップを特徴づける座標範囲に正確に位置しています。

次に、フランスのジオメトリデータフレームを南アメリカのフィルタに追加しようとしましたが、さらに必要なものがあることを知っていました。以下をご覧ください。

南アメリカ + フランス。著者による画像
southamerica %>%  bind_rows(france) %>%  ggplot() +  geom_sf(aes(fill=pop/10^6)) +  scale_fill_continuous_sequential(palette= "Heat 2" )+  theme_light() +  theme(    panel.background = element_rect(fill="#0077be")  ) +  labs(    fill= str_wrap("人口(百万人)", 10)  )+  geom_text_repel(aes(x=lon, y=lat, label= str_wrap(name_long,20)),                   color = "black",                   fontface = "bold",                   size = 2.8)

コードでわかるように、bind_rowを使用して南米の領土とフランスのシェープファイルを結合しました。その結果、フランス・ギアナが適切に配置されました。一方、地図には人口情報が表示されておらず、フランスは植民地主義の歴史の逆において南アメリカの一部です。

言い換えれば、この地図が欲しかったのです。

フランス・ギアナが南アメリカの地図上に表示されています。作者提供の画像
data_guiana<-  insee::get_idbank_list('TCRED-ESTIMATIONS-POPULATION') %>%  filter(str_detect(REF_AREA_label_fr,"Guyane")) %>%  filter(AGE == "00-") %>% #全年齢層を対象にする  filter(SEXE == 0) %>% #男性と女性  pull(idbank) %>%  insee::get_insee_idbank() %>%  filter(TIME_PERIOD == "2023") %>%   select(TITLE_EN,OBS_VALUE) %>%  mutate(iso_a2 = "FR")data_guiana <- janitor::clean_names(data_guiana)southamerica %>%  bind_rows(france) %>%  left_join(data_guiana) %>%  mutate(pop=ifelse(iso_a2=="FR",obs_value,pop))%>%  mutate(lon= ifelse(iso_a2=="FR", france[[11]][[1]][[1]][[1]][1,1], lon),         lat= ifelse(iso_a2=="FR",france[[11]][[1]][[1]][[1]][1,2], lat)) %>%  ggplot() +  geom_sf(aes(fill=pop/10^6)) +  scale_fill_continuous_sequential(palette= "Heat 2" )+  geom_text_repel(aes(x=lon, y=lat, label= str_wrap(name_long,20)),                   color = "black",                   fontface = "bold",                   size = 2.8)+  coord_sf(xlim = c(-82,-35), ylim=c(-60,15))+  theme_light() +  theme(    panel.background = element_rect(fill="#0077be")  ) +  labs(    fill= str_wrap("人口(百万人)", 10)  )

読んでわかるように、フランスの公式統計機関が提供しているRパッケージを使用してギアナの人口を取得しました。さらに、南アメリカを見るために地図を適切な座標に制限しました。

Emolduram e aquarelam o meu Brasil

南米の問題を解決し、フランスと平和の笛を吹いたマップの英雄がいよいよブラジルのデータと地図に戻ってきました。思い出してください、私はブラジルの国勢調査の詳細を他のパナマ以南の国や地域と比較したいと思っています。

データの国勢調査はRパッケージまたはAPIアドレスで利用可能です。私はAPIを使用してより困難なオプションを選びました。他のオプションを使用することも良い考えです。以下のコードと地図をご覧ください。ここでは、ブラジル各州の人口を他の南アメリカの領土と対比して表示しています。

南アメリカとブラジル各州の地図。作者提供の画像
central_america<-  world %>%  filter(subregion == "中央アメリカ")brasil<- geobr::read_country()estados<- geobr::read_state()#人口データibge2022<-  get_municipalies_data()estados<-  estados %>%  inner_join(    ibge2022 %>%      rename(abbrev_state = uf) %>%      summarise(.by=abbrev_state,                pop = sum(populacao_residente)      )  )southamerica %>%  filter(iso_a2!="BR") %>%  bind_rows(france) %>%  left_join(data_guiana) %>%  mutate(pop=ifelse(iso_a2=="FR",obs_value,pop))%>%  mutate(lon= ifelse(iso_a2=="FR", france[[11]][[1]][[1]][[1]][1,1], lon),         lat= ifelse(iso_a2=="FR",france[[11]][[1]][[1]][[1]][1,2], lat)) %>%  ggplot() +  geom_sf(aes(fill=pop/10^6)) +  geom_sf(data=estados, aes(fill=pop/10^6)) +  geom_sf(data=brasil,fill=NA, color="#00A859", lwd=1.2)+  geom_sf(data= central_america,fill= "#808080")+  scale_fill_continuous_sequential(palette= "Heat 2" )+  geom_text_repel(aes(x=lon, y=lat,                       label= str_wrap(name_long,20)),                   color = "black",                   fontface = "bold",                   size = 2.8)+  coord_sf(xlim = c(-82,-35), ylim=c(-60,15))+  theme_void() +  theme(    panel.background = element_rect(fill="#0077be")  ) +  labs(    fill= str_wrap("人口(百万人)", 10)  )

上記のAPIを使用して、get_municipalites_dataという関数を作成しました。コードは私のgistにあります。さらに、ブラジルとそのサブリージョンの境界を描画するために使用されるshapefileを提供する2つの関数、read_countryとread_statesもあります。これらの関数は{geobr}パッケージに含まれています。

worldデータフレームから別のフィルタを使用しました。この場合、目的は中央アメリカ大陸の始まりを表示し、その地図を灰色で塗りつぶすことです。ここで、ブラジルではアメリカ大陸が3つのサブコンティネント、北アメリカ、中央アメリカ、南アメリカを持つと学んできましたが、データセットの著者にとっては中央アメリカは北アメリカのサブリージョンです。さて、仕事を終わらせる時が来ました。地図上に8つの人口が最も多い地域の名前を表示したいです。この最終スプリントでも、いくつかのコードのトリックがありました。

人口が最も多い地域。著者による画像
estados$lon<- sf::st_coordinates(sf::st_centroid(estados$geom))[,1]   estados$lat<- sf::st_coordinates(sf::st_centroid(estados$geom))[,2]most_populated<-  southamerica %>%  filter(iso_a2 !="BR") %>%  rename(name= name_long) %>%  as_tibble() %>%  select(name, pop, lat, lon) %>%  bind_rows(    estados %>%      rename(name= name_state) %>%      as_tibble() %>%      select(name, pop, lat, lon)  ) %>%  slice_max(order_by = pop, n=8)southamerica %>%  filter(iso_a2!="BR") %>%  bind_rows(france) %>%  left_join(data_guiana) %>%  mutate(pop=ifelse(iso_a2=="FR",obs_value,pop))%>%  mutate(lon= ifelse(iso_a2=="FR", france[[11]][[1]][[1]][[1]][1,1], lon),         lat= ifelse(iso_a2=="FR",france[[11]][[1]][[1]][[1]][1,2], lat)) %>%  ggplot() +  geom_sf(aes(fill=pop/10^6)) +  geom_sf(data=estados, aes(fill=pop/10^6)) +  geom_sf(data=brasil,fill=NA, color="#00A859", lwd=1.2)+  geom_sf(data= central_america,fill= "#808080")+  scale_fill_continuous_sequential(palette= "Heat 2" )+  geom_text_repel(data= most_populated,                  aes(x=lon, y=lat,                       label= str_c(str_wrap(name,10),": ",round(pop/10^6,1))),                   color = "black",                   fontface = "bold",                   size = 2.9)+  coord_sf(xlim = c(-82,-35), ylim=c(-60,15))+  theme_void() +  theme(    panel.background = element_rect(fill="#0077be")  ) +  labs(    fill= str_wrap("人口(百万人)", 10)  )

ブラジルの3つの州が南アメリカで最も人口の多い地域の8つに含まれています。実際、サンパウロは地図上で2番目に人口の多い場所であり、コロンビアを除くすべての国を上回っています。

さて、コードに焦点を当てると、私は2つの異なるsfオブジェクトを組み合わせてこのランキングを作成するための新しいデータフレームを作成しました。私は列のサブセットを選択し、sfからtibbleにタイプを変更して行のバインディングを有効にしました。

これでおしまいです。ヒーローは1つの可能な道を完成させ、次の旅のための足跡を残しました。さあ、あなたの番です。地図の表現を使用すると、重要な改善が可能なすべてのプロジェクトを思い出してください。上記の手順を使用して、人口、社会経済問題などに関する利用可能なすべてのデータを収集し、ポリゴンを埋める変数を選択するだけです。

コードとデータ

完全なコードはgistで入手できます。

ブラジルのすべてのデータセットは、連邦政府機関によって作成され、インターネット上でアクティブな透明性として提供され、ブラジルの情報公開法の対象となっているため、パブリックドメインとして特徴付けられます。

IBGE:ブラジルの国勢調査データ

IPEA:ブラジルのシェープファイル

フランスのデータはオープンデータポータルから入手でき、商業目的で情報を利用することが許可されています。

We will continue to update VoAGI; if you have any questions or suggestions, please contact us!

Share:

Was this article helpful?

93 out of 132 found this helpful

Discover more