Asial Blog

Recruit! Asialで一緒に働きませんか?

非エンジニアにもオススメ。数学が苦手な統計初心者がR言語を触ってみる。

カテゴリ :
日常
タグ :
統計
R
犯罪
こんにちは。海原です。
ここ最近、統計学が流行していますね。「統計学が最強の学問である」がきっかけになっているのでしょうか。数年前に比べてマーケティングが重要視される今日、統計の需要が増えたのかもしれません。私はまだこの本を読んでいませんが、読もうと思った矢先にたまたま統計ツールRに出会いまして、調べながら少しいじってみました。Rを使った感触から申し上げますと、SQLを叩いて好きなデータをピックアップするよりもずっと簡単で小気味良いのです。

他の統計ツールには色々な種類があるようですが、よく知られるものとしてIBMのSPSS (IBM)(有償)があります。
その点、RはMac/Win両方に対応しており無償です。またSPSSに劣らない機能を備えており、統計学者の間でデファクトスタンダードとなっているようです。
Rに関して検索すれば丁寧な解説サイトがたくさんありますので、インストールから何の心配もありませんでした。

初めにこの統計ツールに掛けるテーマを決めました。テーマは「犯罪と関係する事象は何か?」とし、関連しそうなデータを集めました。
データの収集は、統計局とどランから収集しました。他にも、統計・データ・まとめなどで検索すると、多くの公開データがあります。犯罪と相関しそうなデータを拾うのに、上記二つのサイトから直感的に相関しそうなデータをピックアップしました。具体的には2009年の都道府県別犯罪数と、その他のデータを比較しました。一部のカラムデータは2008年/2010年のデータがありますが、サンプルなのでご容赦ください。ピックアップしたデータ一覧は下記の通りです。

  • 人口
  • 面積
  • 人口密度
  • 検挙数
  • 犯罪認知数
  • 犯罪検挙率
  • 外国人登録数
  • 婚姻数
  • 離婚数
  • 離婚数
  • 自殺数
  • 警官の数
  • 失業者数
  • 日照時間
  • 雨日数
  • 所得平均(万円)
  • アルコール消費量(㍑)
  • 睡眠時間


データ解析を行っている過程で気づくことなのですが、一つだけ極端に大きい(小さい)数字があると、その他多くのデータが解析しにくくなってしまいます。例えば東京都の人口や、北海道の面積などです。さらに、データをそのまま使ってしまうと各データが人口と比例に近い形となって現れてしてしまいます。
このため、犯罪認知数~失業者数の値は、人口÷件数 = X数一件(一人など)に対しての人口としています。また、検挙率は特別、生データより犯罪認知数÷犯罪検挙数に整形しました。
※分子・分母を変更すると、一人当たりの数値となりますが、どちらが適切かの判断は適宜行ってください。
解析を行いながら、データ整形やさらに必要なデータを追加するという事が発生します。

Rでデータを解析するには、お馴染みのCSVを用います。(後述しますが、Excelデータそのままも読み取れるようです。)
CSVデータを作成するときの注意は、行名・列名以外はデータ形式が文字列になっていない事です。全角はもちろんエラーとなりますし、半角でも形式が文字列となっている場合も同様にエラーが起きます。セルの書式設定→表示形式から数値に変更しましょう。
私が使ったサンプルデータダウンロード crime_prefecture.csvcrime_prefecture.csv


これで準備は整いました。Rを立ち上げて新規文書を作成します。
Rターミナルに直接ソースを記述してコマンド実行する事も出来ますが、履歴が残りにくいためソースを文書として保持します。Macでは拡張子を.r とすると、Rエディタが立ち上がります。

初めに、用意したCSVをオブジェクトに読み込むところからソースコードを記述します。

  1. ####################################
  2. # CSVファイルの読み込み
  3. ####################################
  4. #Mac読み書きディレクトリを定義
  5. basedata<-"/Users/saity/Dropbox/R/basedata/"
  6. output<-"/Users/saity/Dropbox/R/output/"
  7. #CSVファイルの読み込み
  8. crime<-read.csv(paste(basedata,"crime_prefecture.csv",sep=""), row.names=1)

ソースコードを実行するには、カーソル行でcommand+enter(WinはCtrl+Enter)で実行ができます。
一度に複数行を実行する場合には、選択行で上記コマンドを叩きます。すると、メインコンソールに実行結果が表示されます。
#から始まる行は全てコメントですので実行されません。



read.csv関数はCSVファイルを読み取り、crime変数へオブジェクトとして代入しています。
ほかにも、read.xls()、read.xlsx()、read.table()、read.fortran()など、各種フォーマット読み取り関数が用意されているようです。私はまだ試していませんが頼もしいですね。


ここまでで、データを解析する準備が出来ました。
これよりRに用意されている関数を利用し、データを分析していきます。

  1. ####################################
  2. # データサマリー分析
  3. ####################################
  4. #データサマリー出力
  5. summary(crime)
  6. #ヒストグラム(棒グラフで変数の分布を知る)
  7. #第2引数で区切り幅を指定出来る
  8. hist(crime$crearance_rate)
  9. hist(crime$crearance_rate, 20)
  10. #散布図を描画(認知・検挙・人口密度・登録外人・外人・離婚・自殺…)
  11. #6~19列目という意味
  12. #こんな風にいっぺんにやると、散布図がゴチャっとしてわかりにくい
  13. pairs(crime[c(6:19)])
  14. #工夫しながら二つに分割しましょう
  15. pairs(crime[c(6:12)])
  16. pairs(crime[c(6,13:19)])
  17. #相関マトリクス
  18. #1は正の相関 -1は負の相関
  19. #1や-1に近いデータ程散布図の散らばりが少ない(0.7以上は相関が高い)
  20. cor(crime[3:19])

最初はsummary関数を実行してみます。
下記のような実行結果となり、各データについて説明します。



Min最小値
1st Qu下から1/4の値
Median中央値
Mean平均値
3rd Qu上から1/4の値
Max最大値


中央値と平均値を比較すると、どちらにデータが偏って散らばっているかの雰囲気が掴めます。
中央値と平均値の開きが大きいデータとして例えば、人口密度(population_density)をピックアップします。

  1. population_density
  2. Min.   :  65.98
  3. 1st Qu.: 187.20
  4. Median : 273.49
  5. Mean   : 655.90
  6. 3rd Qu.: 485.56
  7. Max.   :6017.21

中央値が273.49に対し、平均値が655.90です。これは人口が密集している地区と、過疎化しててる地区の開きが大きい事を意味します。最大値が6017.21と圧倒的な数値は東京に違いありませんね。
なお、summary関数を使ってこのような数値が出てこない場合は、データが文字列となっている場合があるので全体を注意深く見てください。
もう一つ、検挙数を見てみましょう。繰り返しとなりますが、検挙数÷人口をしたデータですので「何人に一人検挙されるか」という数値です。

  1. arrest_number
  2. Min.   :216.4
  3. 1st Qu.:279.2
  4. Median :313.3
  5. Mean   :318.6
  6. 3rd Qu.:337.1
  7. Max.   :517.4

中央値と平均がかなり近いので、警察の数が適切に配備されていると言い換えられるかもしれません。最大値は517.4人に一人しか検挙されない富山県でした。犯罪数が少ない事と検挙率が低めなことを合わせて考えますと、比較的安全な地域だと言えるかもしれません。
だからと言って物事の本質としての発見があることは稀だと思いますが、眺めているだけでも多くの気付きがあってとても面白いです。

次に、hist関数で犯罪数(犯罪1件あたりの人口)をヒストグラム(棒グラフ)で描画しています。この関数はRのコマンドライン上に表示はされず、別窓が立ち上がりそこに描画してくれます。
第2引数はデータの区切りを指定します。これを与えない場合は、Rが区切りを適宜計算して出力してくれます。
summaryと一緒に数値の分布を見ながら楽しめます。



これまでは単なるデータの集計でしたので、pairs関数を使ってそれぞれのデータを散布図として突き合わせたデータを見てみます。
データ総当たりで実行することも可能ですが、一つずつが小さくなりすぎてわかりません。突き合わせたいデータ列のみをピックアップしましょう。
出力された散布図の見方ですが、一般には「正の相関」や「負の相関」が見られそうなものを探します。



このように線グラフとして比例の形(右上がり)に点が集まっているものを「正の相関がある」といいます。Xが増えればYが増える傾向があります。反対に、反比例や右下がりになっているものを「負の相関がある」と言いい、Xが増えればYが減ります。
犯罪数・犯罪認知数・検挙率に正の相関があるのは当たり前のことですね。

しかし、他にもよく見てみると相関がありそうなデータが見つかります。





上記散布図ではなんとなくでしか相関がわかりません。散布図を数値化してくれる関数corがあり、これを使ってみます。3列目から19列目全てを総当たりでチェックしてみましょう。
> cor(crime[3:12])



データの見方は、相関係数=rとして、1 > r > -1となります。1と-1はそれぞれ完全な比例であり、0は全く相関が無い値です。これは、二つの変数が標準化されたもので、単位の影響はありません。
相関係数の求め方は難しいので、相関係数値はWikipediaの共分散を参考にしてください。例えば0.7以上、-0.7以下のデータが見つかれば、それは相関がかなり強いと言えます。私が揃えたデータでは0.8を超えるデータは犯罪数と犯罪率などのみで、これを無視すると、0.7以上の値が見つかります。

  • 睡眠時間と犯罪認知
  • 睡眠時間と外国人登録者数

さらに外国人登録者数と犯罪認知の数字を見てみると、0.67程度と高くもないですが低くも無い数値となっています。ここから睡眠と犯罪の相関する理由を仮説立て、検証にコストをかけるにはやや乏しい数値かもしれません。



今日はRの使い方としてほんの少しだけ紹介させて頂きました。上記はSQLとExcelで十分解析が出来てしまうレベルですが、統計手法やRの機能はまだまだ奥が深いようです。
更なる使い方にご興味がある方は、上記データを別の手法で分析したソースコードをアップします。統計学者やR上級者にとっては初歩的なものばかりですが、初心者にとっては解析しやすいと思います。これには、カイ二乗検定、クラスター分析、重回帰分析、ロジスティクス分析を含んでおりますので、調べながら参考にしてください。(需要があればまた記事にしようと思います。)
crimedata.r

いかがでしたでしょうか。森羅万象の中にはまだ無数の未開拓データが埋もれています。例えば下記参考リンクのように、チョコレート消費量とノーベル賞受賞の相関が表れているようです。これはチョコレートをたくさん食べればノーベル賞を取れますよという短絡的なものではなく、もう少し深い議論を行う価値のあるテーブルが用意された形でしょう。
チョコレート消費量とノーベル賞の受賞数

ちょっとした解析で、とんでもない相関が見つかる期待として統計は宝探しのようで楽しいですね。
業務で必要に迫られた人を除き、統計始めとしてはガッツリのめり込むよりもちょっと動かし、ちょっとした発見から統計が楽しいということが理解できると思います。意外なところからお宝がみつかるかもしれません。