目次(まとめ)
- 9. データから、指定する文字列を含む行だけを抽出する
- 10. 2項目のデータを用いて散布図を作成する
- 11. 2項目のデータの相関係数を算出する
こんにちは、みっちゃんです。
前回の記事では「プログラミングをやってみたいけれど、手元のデータからどうやって始めたらいいかわからない」という方向けに、実際のデータをダウンロードするところから、Rを使ったデータ解析手順(読み込み/グラフ作成)を紹介しました。
今回の記事では、前回のつづきとして、Rを使ったデータ解析手順(相関解析)を紹介したいと思います。
9. データから、指定する文字列を含む行だけを抽出する
前回の記事で紹介したように、国勢調査のデータをRで読み込みます。
> data <- read.csv("/Users/***/Downloads/001_00.csv", fileEncoding = "CP932", skip = 9, header = T)
以下のように、項目名およびデータの一部を表示します。
> names(data)
[1] "X10" "X.大項目"
[3] "地域コード" "地域識別コード"
[5] "境域年次.2015." "境域年次.2000."
[7] "X" "人口.平成27年..a."
[9] "人口.平成22年.組替..2.." "平成22年.27年の人口増減数.2.."
[11] "平成22年.27年の人口増減率....2.." "面積.km2...b..1..2.."
[13] "人口密度.1km2当たり...a...b..2." "世帯数.平成27年."
[15] "世帯数.平成22年.組替..2.." "平成22年.27年の世帯数増減数.2.."
[17] "平成22年.27年の世帯数増減率....2."
> head(data)
X10 X.大項目 地域コード 地域識別コード 境域年次.2015. 境域年次.2000. X
1 11 NA 0 a 2015 2000 全国
2 12 NA 1 b 2015 2000 市部
3 13 NA 2 b 2015 2000 郡部
4 14 NA 1000 a 2015 2000 北海道
5 15 NA 1001 b 2015 2000 市部
6 16 NA 1002 b 2015 2000 郡部
人口.平成27年..a. 人口.平成22年.組替..2.. 平成22年.27年の人口増減数.2..
1 127094745 128057352 -962607
2 116137232 116549098 -411866
3 10957513 11508254 -550741
4 5381733 5506419 -124686
5 4395172 4449360 -54188
6 986561 1057059 -70498
平成22年.27年の人口増減率....2.. 面積.km2...b..1..2..
1 -0.7516999102 377970.75
2 -0.3533841163 216973.76
3 -4.7856173491 160912.77
4 -2.2643754498 83424.31
5 -1.2178830214 18536.20
6 -6.6692587642 64829.10
人口密度.1km2当たり...a...b..2. 世帯数.平成27年. 世帯数.平成22年.組替..2..
1 340.8 53448685 51950504
2 535.5 49319924 47812998
3 70.2 4128761 4137506
4 68.6 2444810 2424317
5 238.3 2021698 1989236
6 16.5 423112 435081
平成22年.27年の世帯数増減数.2.. 平成22年.27年の世帯数増減率....2.
1 1498181 2.8838623009
2 1506926 3.1517078264
3 -8745 -0.2113592101
4 20493 0.8453102461
5 32462 1.6318827932
6 -11969 -2.7509820011
これらのデータを確認すると、7列目の "X" には「都市名」が記載されていることがわかります(ダウンロードしたExcelファイルでも確認できます)。
例えば、データの1行目は「全国」のデータになっており、その行だけを取り出すためには、以下のように実行します。
> data[data$X=="全国", ]
「data[行番号、列番号]」という形式でデータを取れるのですが、いま行番号として「data$Xの情報が "全国" になっている行の番号」を設定しています。
実行すると、以下のような結果が得られます。
> data[data$X=="全国", ]
X10 X.大項目 地域コード 地域識別コード 境域年次.2015. 境域年次.2000. X
1 11 NA 0 a 2015 2000 全国
人口.平成27年..a. 人口.平成22年.組替..2.. 平成22年.27年の人口増減数.2..
1 127094745 128057352 -962607
平成22年.27年の人口増減率....2.. 面積.km2...b..1..2..
1 -0.7516999102 377970.8
人口密度.1km2当たり...a...b..2. 世帯数.平成27年. 世帯数.平成22年.組替..2..
1 340.8 53448685 51950504
平成22年.27年の世帯数増減数.2.. 平成22年.27年の世帯数増減率....2.
1 1498181 2.8838623009
このような書き方の場合、「data$X」が「全国」という単語に一致していなければなりません。
それでは、例えば、「札幌市」に関わるデータを取り出したい場合にはどうしたらいいでしょうか?
この場合には、以下のように実行します。
> data[grep("札幌市", data$X), ]
先ほどと同様に「data[行番号、列番号]」という形式でデータを取っているのですが、いま行番号として「data$Xの情報に "札幌市" という単語を含んでいる行の番号」を設定しています。
「grep(A, B)」とすると、Bの中からAの情報を含むデータを検索します。
実行結果は、以下のようになります(一部抜粋しています)。
> data[grep("札幌市", data$X), ]
:
X 人口.平成27年..a. 人口.平成22年.組替..2..
7 札幌市 1952356 1913545
8 札幌市 中央区 237627 220189
9 札幌市 北区 285321 278781
10 札幌市 東区 261912 255873
11 札幌市 白石区 209584 204259
12 札幌市 豊平区 218652 212118
13 札幌市 南区 141190 146341
14 札幌市 西区 213578 211229
15 札幌市 厚別区 127767 128492
16 札幌市 手稲区 140999 139644
17 札幌市 清田区 115726 116619
4508 札幌市 人口集中地区 1899081 1846399
4509 札幌市 中央区 人口集中地区 235356 217633
4510 札幌市 北区 人口集中地区 275495 261235
4514 札幌市 東区 人口集中地区 255507 249599
4517 札幌市 白石区 人口集中地区 205645 200377
4518 札幌市 豊平区 人口集中地区 217832 210803
4519 札幌市 南区 人口集中地区 122354 127198
4520 札幌市 西区 人口集中地区 211996 209283
4521 札幌市 厚別区 人口集中地区 125771 126264
4522 札幌市 手稲区 人口集中地区 137016 134390
4523 札幌市 清田区 人口集中地区 112109 109617
:
このように、「札幌市」関連のデータのみを取り出すことができます。
10. 2項目のデータを用いて散布図を作成する
ここでは、札幌市関連の地域について、「人口」と「人口密度」の関係をグラフとして表示することを考えます。
まず「人口」の情報は、以下のように取得することができます。
> data$人口.平成27年..a.[grep("札幌市", data$X)]
[1] 1952356 237627 285321 261912 209584 218652 141190 213578 127767
[10] 140999 115726 1899081 235356 275495 255507 205645 217832 122354
[19] 211996 125771 137016 112109
また「人口密度」の情報は、以下のように取得することができます。
> data$人口密度.1km2当たり...a...b..2.[grep("札幌市", data$X)]
[1] 1741.2 5119.1 4488.3 4597.4 6080.2 4729.7 214.7 2843.9 5240.6
[10] 2483.7 1933.0 8064.0 10246.2 7743.0 7982.1 8710.1 10029.1 6261.7
[19] 8462.9 7544.8 6340.4 6689.1
「人口」と「人口密度」の関係をグラフで表現するため、散布図を使用します。
描き方は以下の通りです。
> plot(data$人口.平成27年..a.[grep("札幌市", data$X)], data$人口密度.1km2当たり...a...b..2.[grep("札幌市", data$X)], xlab = "Population", ylab = "Population density")
実行すると、以下のような図が作成されます。
11. 2項目のデータの相関係数を算出する
上で描いた散布図を見ると、「人口」と「人口密度」との間に相関があるのか明らかではありません。
数値として、相関の有無を評価するため「相関係数」という指標があります。
以下のように計算することができます。
> cor(data$人口.平成27年..a.[grep("札幌市", data$X)], data$人口密度.1km2当たり...a...b..2.[grep("札幌市", data$X)])
実行すると「-0.07984487」という数値が出てきます。
この数値は、ほとんど相関はないものの、人口が多い地域ほど人口密度が低い傾向があることを示しています。
散布図を見ると、全体とは違う数値を示すような点(外れ値)がありそうなので、その影響が考えられます。
相関解析を行う際には、数値としての相関係数と、実際の散布図を見比べることも重要です。