Rで何かをしたり、読書をするブログ

政府統計の総合窓口のデータや、OECDやUCIやのデータを使って、Rの練習をしています。ときどき、読書記録も載せています。

全国の主要な市の刑法犯認知件数のデータの分析5 - 人口密度を加えて回帰分析

www.crosshyou.info

の続きです。に続いて、今回は人口密度と刑法犯認知件数の関係をみてみます。

人口密度のデータフレームを作成するところからはじめます。

このdf_mitsudoに前回作成したdf_popを合体させます。

summary()関数でデータフレームのサマリーをみてみましょう。

year, pref, cityをファクター型にします。

調査年度は1985, 1990, 1995, 2000, 2005の5つの年度です。いわき市やさいたま市などは5つの年度すべてでデータあるということですね。でも、さいたま市って1985年度はまだ大宮市や浦和市など合併前だったような気がします。遡及してデータを作ったんでしょうか。

それでは、人口密度とcrimeの散布図を描いてみます。

人口とcrimeの散布図のようなL字型の分布では無いですね。微妙に右肩上がりの散布図に見えます。

では、crimeをmitsudoだけで回帰分析してみます。

summary()関数で結果をみてみます。

p-valueは2.406e-10と0.05よりもうんと0に近いですので、mitsudoはcrimeと関連があるといえます。係数は0.0008405ですので、0に近いですが、プラスです。つまり、人口密度が高い市ほど、刑法犯認知件数は多いということですね。

ただ、R2(決定係数)は0.08591とかなり小さい値ですから、人口密度で刑法犯認知件数を説明することはほとんどできていないです。

実際のcrimeとモデルが予測した値の散布図を描いてみます。

右にある外れ値が気になりますね。

前回のpop_mod2で使った説明変数、year, pref, pop, pop^2, l_pop, l_pop^2を加えて回帰分析モデルを作ります。

summary()関数で結果をみてみます。

中略

mitsudoの係数は、4.470e-04(0.0004470)でした。人口や調査年度、都道府県をコントロールしてもmitsudoの係数はプラスでp値も0.008788と0.05よりも小さいので、人口密度が高いほど、刑法犯認知件数は高いということは言えます。

また、R2は0.8295とこのモデルで82.95%はcrimeの値を説明できます。

mitsudoを含まないモデル、pop_mod2とR2, Adjusted R2の比較をしてみます。

R2, Adj. R2ともにmitsudoを入れたモデルのほうがいいですね。

最後に実際のcrimeとmitsudo_mod2のモデルの予測値を散布図にしてみます。

右にあったcrimeの外れ値が解消されていることがわかります。

今回は以上です。

はじめから読むには、

www.crosshyou.info

です。

今回のコードは以下になります。

#
# mitsudoのデータフレームを作成する
df_mitsudo <- df_raw |> 
  filter(!is.na(mitsudo)) |> 
  select(year, code, mitsudo)
df_mitsudo
#
# df_mitsudoにdf_popを合体させる
df_mitsudo <- df_mitsudo |> 
  inner_join(df_pop, by = join_by(year, code))
df_mitsudo
#
# df_mitsudoのサマリー
summary(df_mitsudo)
#
# year, pref, cityをファクター型にする
df_mitsudo <- df_mitsudo |> 
  mutate(
    across(c(year, pref, city), as.factor)
  )
summary(df_mitsudo)
#
# crimeとmitsudoの散布図
df_mitsudo |> 
  ggplot(aes(x = mitsudo, y = crime)) +
  geom_point(aes(color = year)) +
  theme_minimal()
#
# crimeをmitsudoで回帰分析
mitsudo_mod <- lm(crime ~ mitsudo, data = df_mitsudo)
#
# 結果
summary(mitsudo_mod)
#
# 実際のcrimeとモデルの予測値の散布図
df_mitsudo |> 
  mutate(estimate = predict(mitsudo_mod)) |> 
  ggplot(aes(x = crime, y = estimate)) +
  geom_point(aes(color = year)) +
  geom_abline() +
  theme_minimal()
#
#
# year, pref, pop, pop^2, l_pop, l_pop^2も加える
mitsudo_mod2 <- lm(crime ~ mitsudo + pop + I(pop^2) + l_pop + I(l_pop^2) +
                     year + pref, data = df_mitsudo)
#
# 結果
summary(mitsudo_mod2)
#
# R2の比較
summary(mitsudo_mod2)$r.squared
summary(pop_mod2)$r.squared
#
# Adj. R2の比較
summary(mitsudo_mod2)$adj.r.squared
summary(pop_mod2)$adj.r.squared
#
# 実際の値とモデルの予測値の散布図
df_mitsudo |> 
  mutate(estimate = predict(mitsudo_mod2)) |> 
  ggplot(aes(x = crime, y = estimate)) +
  geom_point(aes(color = year)) +
  theme_minimal() +
  geom_abline(color = "red")
#

(冒頭の画像は、Bing Image Creator で生成しました。プロンプトは、Natural scene landscape of wild land, close up of purple Akebia flower trees, blue sky, Photo です。)

 

全国の主要な市の刑法犯認知件数のデータの分析4 - 刑法犯認知件数を人口で回帰分析してみる。

www.crosshyou.info

の続きです。今回はcrime: 刑法犯認知件数と人口の関係をみてみます。

まず、人口だけのデータフレームを作ります。

このデータフレームに前回作ったcrimeだけのデータフレームを合体させます。inner_join()関数を使います。yearとcodeをキーにして一致させます。

札幌市は188万人で、人口千人当たりの刑法犯認知件数は17.0件とわかりますね。

人口のようなデータは対数変換しておくといいと、良く言われますので対数変換したデータも追加しておきます。

popとcrimeの散布図、l_popとcrimeの散布図を描いてみましょう。

L字型の分布でしょうか?

crimeをpop, l_pop, pop^2, l_pop^2で回帰分析してみます。

lm()関数でモデルを作ったら、summary()関数でモデルをみます。

モデル全体のp-valueは < 2.2e-16となりました。全ての係数でp値は0.05でした。

決定係数は0.6392で調整済み決定係数は0.6366でした。

モデルの予測値と実際のcrimeの値を比べてみます。

crimeが50以下の件数の少ないところはあんまりうまく予測できていないような感じですね。

この部分を拡大してみます。corrd_cartesian()関数を使います。

やっぱり、予測値と実際の値には違いがありますね。

yearとprefも加えた線形回帰モデルを作ってみましょう。

summary()関数で結果をみてみます。

決定係数が0.812に上がっています。

このモデルの予測値と実際のcrimeの値の散布図を描いてみます。

左下のエリアもそこそこフィットしている感じですね。この部分を拡大してみましょう。

だいぶ改善されていることがわかります。

あらためて、2番目の回帰モデルの係数をみてみます。

popの係数は -1.264e-04, I(pop^2)の係数は 1.149e-11 ということなので、

popは 1.264e-04 / (2 * 1.149e-11) = 5500435人になるまではpopが増えるとcrime は減少し、そこから先はpopが増えるとcrimeは減少する、ということです。

l_popの係数は -8.414e+02, I(l_pop^2)の係数は 3.444e+01 ということなので、

l_popは 8.414e+02 / (2 * 3.333e+01) = 16.62226 になるまでは、l_popが増えるとcrimeは減少して、そこから先はl_popが増えるとcrimeは減少するということです。

ただし、popが変化すれば、l_popも変化するから解釈は難しいですね。

curve()関数で、popの動きとcrimeの動きの曲線を描いてみましょう。

 

基本的には、popが増えるとcrimeも増える、ということですね。crimeは人口千人当たりの件数ですから、大都会ほど犯罪件数が多いということですね。

今回は以上です。

次回は、

www.crosshyou.info

です。

 

はじめから読むには、

www.crosshyou.info

です。

今回のコードは以下になります。

#
# year, code, popのデータフレームを作る
df_pop <- df_raw |> 
  select(year, code, pop) |> 
  na.omit()
df_pop
#
# df_popにdf_crimeを合体させる
df_pop <- df_pop |> 
  inner_join(df_crime, by = join_by(year, code))
df_pop
#
# popの対数変換値を作る
df_pop <- df_pop |> 
  mutate(l_pop = log(pop)) |> 
  relocate(year, code, pop, l_pop)
df_pop
#
# popとcrime
df_pop |> 
  ggplot(aes(x = pop, y = crime)) +
  geom_point() +
  theme_minimal()
#
# l_popとcrime
df_pop |> 
  ggplot(aes(x = l_pop, y = crime)) +
  geom_point(color = "red") +
  theme_minimal()
#
# crimeをpop, l_pop, crime^2, l_pop^2で回帰分析
pop_mod <- lm(crime ~ pop + I(pop^2) + l_pop + I(l_pop^2),
              data = df_pop)
#
# 回帰分析結果を見る
summary(pop_mod)
#
# 予測値と実際のcrimeの散布図
df_pop |> 
  mutate(estimate = predict(pop_mod)) |> 
  ggplot(aes(x = crime, y = estimate)) +
  geom_point() +
  geom_abline(color = "red") +
  theme_minimal()
#
# 予測値と実際のcrimeの散布図
# 左下の部分を拡大
df_pop |> 
  mutate(estimate = predict(pop_mod)) |> 
  ggplot(aes(x = crime, y = estimate)) +
  geom_point() +
  geom_abline(color = "red") +
  coord_cartesian(xlim = c(0, 50), ylim = c(0, 40)) +
  theme_minimal()
#
# year, prefも加えたモデル
pop_mod2 <- lm(crime ~ pop + I(pop^2) + l_pop + I(l_pop^2) +
                 year + pref, data = df_pop)
#
# 結果を見る
summary(pop_mod2)
#
# 予測値と実際の値の散布図
df_pop |> 
  mutate(estimate = predict(pop_mod2)) |> 
  ggplot(aes(x = crime, y = estimate)) +
  geom_p5oint() +
  geom_abline(color = "red") +
  theme_minimal()
#
# 左下の部分を拡大
df_pop |> 
  mutate(estimate = predict(pop_mod2)) |> 
  ggplot(aes(x = crime, y = estimate)) +
  geom_point() +
  geom_abline(color = "red") +
  coord_cartesian(xlim = c(0, 50), ylim = c(0, 50)) +
  theme_minimal()
#
# pop_mod2の係数の確認
pop_mod2
#
# popの変曲点
1.264e-04 / (2 * 1.149e-11)
#
# l_popの変曲点
8.414e+02 / (2 * 3.333e+01)
#
# popとcrimeの関係
curve(5.185e+03 - 1.264e-04 * x + 1.1492e-11 + x^2 - 8.414e+02 * log(x) +
        3.444e+01 * (log(x))^2,
      from = min(df_pop$pop),
      to = max(df_pop$pop))
#

 

 

(冒頭の画像は、Bing Image Creator で生成しました。プロンプトは Landscape of red Clivia flowers, full of flowers on the grass field, some yellow Dandelion flowers,  under the blue sky, Photo です。)

 

読書記録 - 「諸葛亮 上」と「諸葛亮 下」 宮城谷 昌光 著

日経新聞に連載されていたときにも毎日読んでいいました。今回が2回目の読書です。

宮城谷先生の「諸葛亮」は、正史に近い諸葛亮なので、高校生のころに読んだ吉川英治の「三国志」の中の孔明のようにスーパーマンのような諸葛亮ではありません。

でも、私は宮城谷先生の諸葛亮も吉川英治の孔明もどちらも大好きで、なんでなのかな?とこの読書記録を書く前に考えていましたが、下巻の帯の「その信義は、宇宙をもふるわせ、誠実さは天地をも感動させる」という宣伝文を見て、ああ、そうだ、諸葛亮はほんとうに信義の人で、誠実な人だから、私は大好きなんだな、と腑に落ちました。

諸葛亮が8歳のときから物語ははじまり、三顧の礼で劉備に迎えられるまでの話を、この宮城谷先生の「諸葛亮」で読むことができ、とても嬉しかったです。

 

全国の主要な市の刑法犯認知件数のデータの分析3 - どの市が、どの都道府県が刑法犯認知件数が多いのか?

www.crosshyou.info

の続きです。

今回はどの都市が刑法犯認知件数が多いか、どの都道府県が多いかを確認します。

まずは単純にcrimeの大きい順に並び替えてみます。

東京都千代田区が一番多いことがわかります。千代田区は住んでる人と比べて、働いている人が多いですからこんなふうになってしまうんですかね。

少ないところもみてみましょう。

静岡県浜松市や三重県津市、長崎県佐世保市などが少ないですね。

ここまでは単純な並びかえでした。今度は市ごとに各年の平均を出して、平均値でみてみます。

件数の多いところからみてみます。

東京都千代田区、東京都中央区、東京都渋谷区、と上位は東京都ですね。大阪市、福岡市、名古屋市と続きます。

少ないところはどこでしょうか?

長崎県佐世保市が一番少なくて、2番目が長崎県長崎市です。山口県山口市、静岡県浜松市と続きます。

今度は、都道府県別に集計しましょう。

cityは長崎県 佐世保市のように、都道府県名があって、1つスペースがあって市の名前が入っていますので、これを分割して、prefとcityにします。

separate()関数で都道府県名と市の名前に分割できます。

都道府県別の平均値を計算して、crimeの多いところをみてみます。

東京都が一番多く、福岡県、京都府、高知県、沖縄県、和歌山県、岐阜県、大阪府、千葉県、愛媛県となっています。人口の多い東京都や大阪府などもあれば、人口の少ない高知県などもありますね。

刑法犯認知件数が少ないところはどこでしょうか?

長崎県が一番少ないです。鳥取県、青森県、富山県、大分県、石川県、山口県、三重県、静岡県、佐賀県と続いています。

今回は以上です。

次回は、

www.crosshyou.info

です。

 

はじめから読むには、

www.crosshyou.info

です。

今回のコードは以下になります。

#
# crimeの多いところはどこか
df_crime |> 
  arrange(desc(crime))
#
# crimeの少ないところはどこか
df_crime |> 
  arrange(crime)
#
# crimeの市の平均で多いところはどこか
df_crime |> 
  group_by(city) |> 
  summarize(mean = mean(crime)) |> 
  arrange(desc(mean))
#
# crimeの市の平均で少ないところはどこか
df_crime |> 
  group_by(city) |> 
  summarize(mean = mean(crime)) |> 
  arrange(mean)
#
# cityと都道府県名と市の名前にわける
df_crime <- df_crime |> 
  separate(city, into = c("pref", "city"), sep = " ")
df_crime
#
# 都道府県別のcrimeの多いところ
df_crime |> 
  group_by(pref) |> 
  summarize(mean = mean(crime)) |> 
  arrange(desc(mean))
#
# 都道府県別のcrimeの少ないところ
df_crime |> 
  group_by(pref) |> 
  summarize(mean = mean(crime)) |> 
  arrange(mean)
#

(冒頭の画像は Bing Image Creator で生成しました。プロンプトは Clear landscape of various colors of Pansy flowers, blue sky, Photo です。)

 

全国の主要な市の刑法犯認知件数のデータの分析2 - 刑法犯認知件数の経年変化のグラフとANOVA

www.crosshyou.info

の続きです。前回はデータをウェブサイトからダウンロードして、それをRに読み込ませ、データがどんなだか少し確認しました。今回は刑法犯認知件数の経年変化をみてみます。

分析用に、year, code, city, crimeだけのあるデータフレームを用意しました。

グラフを描いてみます。縦軸がcrimeで横軸がyearで箱ひげ図を描いてみます。

何故か、一番左が2005年度で、一番右が1980年度と時間の向きが逆になってしまいましたが、1980年度、1985年度と比較すると、2000年度、2005年度のほうが件数が多いように見えます。

年度ごとの平均値をみてみます。

crimeは人口千人当たりの刑法犯認知件数です。1980年代は平均値は16.0人、中央値は13.1人だったのが、2005年度は平均値は21.0人、中央値は18.0人と増加しています。

グループごとの平均値に違いがあるかどうかは、ANOVA(ANalysis Of VAriance)ですね。aov()関数でモデルを作り、summary()関数で結果を確認します。

p値は8.23e-11と限りなく0ですね。0.0000000000823です。

TukeyHSD()関数でどのグループとどのグループが違うかを見ることができます。

青枠で囲った年度の組み合わせは違いがあります。一番違うのは1985年度と2000年度ですね。

中央値についても違いがあるかどうかをみてみます。Kruskal-Wallis検定というものでやります。kruskal.test()関数です。

p値が < 2.23-16となりました。中央値も年度によって違いがあります。

FSAパッケージのdunnTest()関数でどのグループとどのグループが違うかわかります。

星印のついているグループの組み合わせが違いがあるということです。

この結果の後半部分は以下のような表形式です。TukeyHSD()関数と同じような表です。

今回は以上です。

次回は

www.crosshyou.info

です。

はじめから読むには、

www.crosshyou.info

です。

今回のコードは以下になります。

#
# crimeのある都市だけのデータ
df_crime <- df_raw |> 
  filter(!is.na(crime)) |> 
  select(year, code, city, crime) |> 
  mutate(year = fct(year))
df_crime
#
# crimeの経年変化のグラフ
df_crime |> 
  ggplot(aes(x = year, y = crime)) +
  geom_boxplot(aes(group = year)) +
  theme_minimal()
#
# 年度ごとの平均値と中央値
df_crime |> 
  group_by(year) |> 
  summarize(average = mean(crime),
            median = median(crime))
#
# ANOVA
ANOVA_model <- aov(crime ~ year, data = df_crime) 
summary(ANOVA_model)
#
# Tukey Honest Significant Difference
TukeyHSD(ANOVA_model)
#

# 中央値の違い: Kruskal-Wallis検定
kruskal.test(crime ~ year, data = df_crime)
#
# どのグループとどのグループが違うか
library(FSA)
dunnTest(crime ~ year, data = df_crime, method = "bonferroni")
#

(冒頭の画像は、Bing Image Creator で生成しました。プロンプトは Splendid moment of natural landscape, full of white and Daisy flowers, which center color are yellow, blue sky far away, Photo  です。)

 

全国の主要な市の刑法犯認知件数のデータの分析1 - ウェブサイトからデータをダウンロードして、Rにデータを読み込む

今回からしばらくは、全国の主要な市の刑法犯認知件数のデータを分析してみたいと思います。政府統計の総合窓口(e-stat)からデータをダウンロードします。

このように、東京の23区と県庁所在市、政令指定都市、中核市を選択します。109の区と市を23区を選択しました。

刑法犯認知件数の他は、総人口、人口密度、第1次産業、第2次産業、第3次産業の就業者比率を選んでみました。

ダウンロードしたCSVファイルは下のようになりました。

7行目に変数名を追加しています。これをRに読み込ませます。

はじめにtidyverseパッケージのをしておきます。

read_csv()関数でCSVファイルのデータを読み込みます。

glimpse()関数でデータの様子を確認しましょう。

文字化けせずに読み込めました。

全てのデータが揃っている年度があるか、na.omit()関数でチェックしてみます。

残念ながら、そのような行はありませんでした。

では、crimeのある年のデータはどのようなものか調べてみましょう。

う~ん、第1次産業などは、crimeとは調査年が被ってないのですね。

mitsudo:人口密度もデータが無い年がありますね。

とりあえず、crimeのある調査年はいつか、第1次産業などのある調査年はいつかを確認します。

1980年度から5年ごとの調査で、2005年度まであることがわかります。2005年度は109の自治体がすべてそろっています。

 

mitsudoのある調査年を調べてみます。

人口密度は1985年から5年ごとの調査ですね。1985年から2005年がcrimeと被っています。

第1次産業などはどうでしょうか?

第1次産業などは、2015年度と2020年度の2つの年だけですね。crimeの一番新しい調査年は、2005年度ですから、第1次産業などの一番近い調査年は2015年度と10年も開きがありますね。

これはもう、しかたがないので、2005年度のcrime, pop, mitsudoと2015年度のone, two, threeで分析することにしましょう。

方針としては、まず、crimeの経年変化を確認して、crimeとmitsudoの関係を見て、最後に2005年度のcrime, pop, mitsudoデータと2015年度のone, two, threeを合わせてクロスセクションで分析することにします。

ここで、各変数が何を意味しているか確認しておきます。

year: 調査年

code: 都市コード

city: 都市名

pop: 総人口【人】

mitsudo: 可住地面積1平方km当たりの人口密度【人】

one: 第1次産業就業者比率【%】

two: 第2次産業就業者比率【%】

three: 第3次産業就業者比率【%】

crime: 人口千人当たりの刑法犯認知件数【件】

今回は以上です。

次回は

www.crosshyou.info

です。

 

今回のコードは以下になります。

#
# tidyverse パッケージの読み込み
library(tidyverse)
#
# CSVファイルの読み込み
df_raw <- read_csv("keiho_ninchi.csv",
                   skip = 6)
#
# データの様子の確認
glimpse(df_raw)
#
# NAの無い行はあるか?
na.omit(df_raw)
#
# crimeのあるデータは?
df_raw |> 
  filter(!is.na(crime)) |> 
  summary()
#
# crimeのある調査年
df_raw |> 
  filter(!is.na(crime)) |> 
  count(year)
#
# mitsudoのある調査年
df_raw |> 
  filter(!is.na(mitsudo)) |> 
  count(year)
#
# oneのある調査年
df_raw |> 
  filter(!is.na(one)) |> 
  count(year)
#

 

(冒頭の画像は、Bing Image Creator で生成しました。プロンプトは Landscape of natural Mimosa tree yellow flowers, blue sky, Photo です。)

 

読書記録 - 「入門 公共政策学 社会問題を解決する「新しい知」」 秋吉 貴雄 著

個人や1企業では解決できない社会問題を解決することが公共政策です。この公共政策を学問として研究するのは公共政策学ということです。

本の帯には、『日本の難題に立ち向かう新しい「武器」』という宣伝文句が書かれています。公共政策学の始まりは第2次世界大戦後なので、学問的には「新しい」と言えると思いますが、私の感覚としては、私が生まれる前にはあったので、「新しい」とは言えないと感じました。

公共政策は利害関係者がたくさんいるし、一つの事象についてもこちらの立場から見るとこう、あちらの立場から見るとこう、というようないろいろな面があるので、解決するのは簡単ではないな、でもだからといって何もしないわけにはいけないし、ほんとうに難しいなと思いました。

この本の文章の進め方が、あることを事例を上げながら説明して、ここまでをまとめよう、と書いて簡単なまとめを記述して、ではこの次はどうかを見ていこう、というように順番に丁寧に進んでいるので、とても読みやすかったです。