R学習(1):人口データを使って基本的なデータ操作
愛知県の人口データを使ってRでデータ操作します。
データソース:あいちの人口 愛知県人口動向調査結果 CSVファイル - 愛知県(平成31年1月1日現在)
tidyverseパッケージを使うので、まずはパッケージを読み込みます。次に、ダウンロードした人口データ(pop_aichi.csvにファイル名を変更しています)を読み込みます。
このとき、「全国地方公共団体コード」のデータ型を文字列型に指定(col_types)、cp932でエンコーディングを指定しています(locale)。
library(tidyverse) #csvファイルの読み込み。エンコーディングを指定しないと文字化けする。 df <- read_csv('data/pop_aichi.csv', col_types = cols(全国地方公共団体コード = col_character()), col_names = TRUE, locale = locale(encoding = "cp932"))
次に、読み込んだデータをチェックします。head()で5行目までのデータを表示。str()でデータの構造を見ます(structure)。
#データチェック head(df, n = 5) str(df)
> head(df, n = 5) # A tibble: 5 x 47 全国地方公共団体コード~ 地域コード 都道府県名 市区町村名 調査年月日 地域名 総人口 男 女 <chr> <chr> <chr> <chr> <chr> <chr> <dbl> <dbl> <dbl> 1 23000 - 愛知県 - H310101 - 7.54e6 3.77e6 3.77e6 2 23100 - 愛知県 名古屋市 H310101 - 2.32e6 1.15e6 1.18e6 3 23101 - 愛知県 名古屋市千種区~ H310101 - 1.66e5 8.11e4 8.48e4 4 23102 - 愛知県 名古屋市東区~ H310101 - 8.09e4 3.88e4 4.21e4 5 23103 - 愛知県 名古屋市北区~ H310101 - 1.64e5 7.95e4 8.40e4 # ... with 38 more variables: `0-4歳の男` <dbl>, `0-4歳の女` <dbl>, `5-9歳の男` <dbl>, (以下略)
> str(df) Classes ‘spec_tbl_df’, ‘tbl_df’, ‘tbl’ and 'data.frame': 71 obs. of 47 variables: $ 全国地方公共団体コード: chr "23000" "23100" "23101" "23102" ... $ 地域コード : chr "-" "-" "-" "-" ... $ 都道府県名 : chr "愛知県" "愛知県" "愛知県" "愛知県" ... $ 市区町村名 : chr "-" "名古屋市" "名古屋市千種区" "名古屋市東区" ... $ 調査年月日 : chr "H310101" "H310101" "H310101" "H310101" ... $ 地域名 : chr "-" "-" "-" "-" ... $ 総人口 : num 7543393 2321727 165935 80872 163532 ... $ 男 : num 3773778 1146687 81100 38752 79543 ... $ 女 : num 3769615 1175040 84835 42120 83989 ... (以下略)
データには総人口、男女別人口、年齢別人口などありますが、今回は市町村別の総人口について見ていきます。
それでは、読み込んだデータから必要なデータを抽出していきます。まずは、select()で1列目(全国地方公共団体コード)と4列目(市区町村名)、7列目(総人口)のデータを選択して、次にrename()で各列名をid = 全国地方公共団体コード, city_name = 市区町村名, total_pop = 総人口に変換。そして、filter()で県のデータと区のデータを除くための条件を指定して抽出。最後に、総人口の多い順に並べ替えるためにarrange()で降順(desc)を指定して並べ替えます。これで、愛知県の市町村別の総人口が降順で抽出されます。
#愛知県と区を除いた総人口データの抽出 df1 <- df %>% select(1, 4, 7) %>% rename(id = 全国地方公共団体コード, city_name = 市区町村名, total_pop = 総人口) %>% filter(id == 23100 | id >= 23200) %>% arrange(desc(total_pop))
では、データの集計、可視化をやっていきます。 愛知県の市町村別総人口のデータから最大値、最小値、平均値を集計してみます。
#データの集計(最大値、最小値、平均) df1 %>% summarise(pop_max = max(total_pop), pop_min = min(total_pop), pop_mean = mean(total_pop))
集計結果
pop_max pop_min pop_mean <dbl> <dbl> <dbl> 1 2321727 1053 139692.
次に、人口の多い上位10市町村を抽出して棒グラフで可視化してみます。
#人口の多い上位10市町村を抽出して棒グラフで可視化 df1 %>% head(10) %>% print() %>% ggplot(mapping = aes(x =city_name, y = total_pop)) + geom_bar(stat = "identity")
上位10市町村の抽出結果
id city_name total_pop <chr> <chr> <dbl> 1 23100 名古屋市 2321727 2 23211 豊田市 425475 3 23202 岡崎市 386962 4 23203 一宮市 380135 5 23201 豊橋市 373635 6 23206 春日井市 307402 7 23212 安城市 187803 8 23207 豊川市 183695 9 23213 西尾市 169841 10 23210 刈谷市 152288
反対に、人口の少ない下位10市町村を抽出して棒グラフで可視化してみます。
#人口の少ない下位10市町村を抽出して棒グラフで可視化 df1 %>% tail(10) %>% print() %>% ggplot(mapping = aes(x =city_name, y = total_pop)) + geom_bar(stat = "identity")
下位10市町村の抽出結果
id city_name total_pop <chr> <chr> <dbl> 1 23424 大治町 32165 2 23441 阿久比町 28334 3 23361 大口町 24046 4 23446 美浜町 22886 5 23445 南知多町 17717 6 23342 豊山町 15665 7 23561 設楽町 4617 8 23427 飛島村 4570 9 23562 東栄町 3086 10 23563 豊根村 1053
今回は、愛知県の人口データを使って市町村別総人口の多い上位10市町村と少ない下位10市町村を可視化しました。
今後、さらに今回の人口データを使って年齢別人口や地域別分析、そして地図データを使って空間上での可視化などやってみたいと思います。