次元の海で溺れる

Rとデータ解析と統計手法たちとわたし

ggplot2とクラスタリング:極めて個人的な疑問に基づいて都道府県データであそぶ。~k-means編~

こんばんは

巷で噂の「厚切りジェイソン」なる芸人さんが
「厚切りJSON」に脳内変換されたくらいにはJSONに汚染されてきてます。にちようび。

SappoRo.R

ところで

少し前に念願のSappoRo.Rに初参加してきました。
死ぬほど楽しかったです。ありがとうございました。
来年の開催時にLTやれるぐらいには成長してたいなあ・・・なんて

おかげさまで今まで全力で目を逸らしていたこの件と向き合っています。

http://rpubs.com/yamano357/85463rpubs.com

コーディングルール・・・

オブジェクトへの割り当てに「=」を使い続けていた私には耳の痛い話です。
「=」を使い続けようと誓った竹馬の友がいるんですが・・・まあ・・・背に腹は代えられないので今後従います

きょうの本題

コーディング規約準拠の練習もかねて、
前回記事と似たようなことをしようかなと。

・e-statの都道府県データで遊ぶ
クラスタリングしまくってみる
・ggplot2の練習を兼ねる

が基本です。

お題について考えてたら大学1年生の時の統計分析のレポートが出てきた。

その名も

「ネット普及率と大学進学率が睡眠時間に及ぼす影響」

???

当時18歳の私がレポートでやってたことを焼き直してみるとこんなん。

#データ
#sleep:都道府県別睡眠時間(分)・・・社会生活基本調査平成23年度
#net:都道府県別家庭ネット普及率・・・通信利用動向調査平成23年度
#school:都道府県別大学進学率(%)・・・日本の統計2013

> kako_data<-read.table("clipboard",header=TRUE)
> kako_data
       area sleep  net school
1    北海道   468 39.8   40.4
2    青森県   481 30.2   41.9
3    岩手県   472 30.6   41.2
4    宮城県   469 40.3   45.5
5    秋田県   482 33.5   44.5
6    山形県   477 40.4   46.3
7    福島県   475 38.2   42.3
8    茨城県   466 34.2   50.9
9    栃木県   465 38.8   54.3
10   群馬県   464 38.7   52.5
11   埼玉県   455 42.5   57.1
12   千葉県   454 39.4   54.8
13   東京都   457 42.1   65.5
14 神奈川県   451 49.8   60.8
15   新潟県   472 33.4   47.3
16   富山県   466 40.3   54.2
17   石川県   469 43.0   54.8
18   福井県   468 36.2   56.0
19   山梨県   465 39.3   57.9
20   長野県   471 36.3   49.6
21   岐阜県   463 41.5   57.1
22   静岡県   462 41.7   54.1
23   愛知県   462 42.1   58.9
24   三重県   464 43.7   52.2
25   滋賀県   462 45.2   58.0
26   京都府   464 42.5   66.1
27   大阪府   460 40.7   58.7
28   兵庫県   454 42.1   59.9
29   奈良県   453 42.8   58.1
30 和歌山県   470 35.0   49.3
31   鳥取県   468 35.4   43.9
32   島根県   472 29.6   47.2
33   岡山県   462 40.5   52.9
34   広島県   456 32.8   61.1
35   山口県   467 27.0   43.2
36   徳島県   466 38.2   53.0
37   香川県   465 34.7   51.1
38   愛媛県   465 25.2   52.7
39   高知県   480 29.3   45.4
40   福岡県   466 32.6   53.3
41   佐賀県   467 38.0   42.3
42   長崎県   464 24.0   42.2
43   熊本県   471 27.5   43.1
44   大分県   465 27.8   47.4
45   宮崎県   467 21.1   43.0
46 鹿児島県   471 26.4   42.0
47   沖縄県   462 28.6   36.7

> model<-lm(sleep~net+school,data=kako_data)
> summary(model)

Call:
lm(formula = sleep ~ net + school, data = kako_data)

Residuals:
     Min       1Q   Median       3Q      Max 
-12.8256  -3.5658   0.0187   3.3553  12.1481 

Coefficients:
             Estimate Std. Error t value Pr(>|t|)    
(Intercept) 498.48390    5.78069  86.233  < 2e-16 ***
net          -0.04622    0.16341  -0.283 0.778594    
school       -0.60862    0.14572  -4.177 0.000138 ***
---
Signif. codes:  0***0.001**0.01*0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 5.389 on 44 degrees of freedom
Multiple R-squared:  0.4296,	Adjusted R-squared:  0.4037 
F-statistic: 16.57 on 2 and 44 DF,  p-value: 4.328e-06

シンプルでなんか愚かな感じの重回帰ですね。
マルチコの香りが・・・するよ・・・

とりあえず
「なんか睡眠時間少ないところって、ネット普及してて大学進学率が高いところと一致するんじゃない・・・?」
みたいな18歳の着想から始まったんでしょう、このレポートは。

ということで

お題

睡眠時間とネット普及率と大学進学率をそれぞれクラスタリングしてみて、
地域性についてなんとなく知見を得よう。

ってことで、過去の自分を全力でイジ・・・、18歳の私の無念を晴らそうかと。

早速やってみる

#データいろいろ見てみる

library(ggplot2)

kako_data2<-kako_data[1:47,-3]#睡眠×進学率
kako_data3<-kako_data[1:47,-2]#進学率×ネット
kako_data4<-kako_data[1:47,-4]#睡眠×ネット
#睡眠時間と進学率の関係
sp2<-ggplot(kako_data2,aes(x=school,y=sleep))+
  geom_point(colour="orange",size=4)
sp2+geom_text(aes(label=area),size=3,vjust=-1)

f:id:WAFkw:20150628194218p:plain

#進学率とネット普及率の関係
sp3<-ggplot(kako_data3,aes(x=net,y=school))+
  geom_point(colour="blue",size=4)
sp3+geom_text(aes(label=area),size=3,vjust=-1)

f:id:WAFkw:20150628194254p:plain


ほら、、、
やっぱマルチコっぽいじゃん、、

#睡眠時間×ネット普及率の関係
sp4<-ggplot(kako_data4,aes(x=net,y=sleep))+
  geom_point(colour="red",size=4)
sp4+geom_text(aes(label=area),size=3,vjust=-1)

f:id:WAFkw:20150628194330p:plain


ここは意外とバラけてますね。
ネット流行りまくり地域は夜寝ない、みたいな単純な仮説は
どうやら微妙な仮説だったようで、、、

#K-means法でクラスタリングしてみる

library(kernlab)
x2<-as.matrix(kako_data2[,2:3])
x3<-as.matrix(kako_data3[,2:3])
x4<-as.matrix(kako_data4[,2:3])


#クラスタ数3,初期値10で探索開始。
cl2<-kmeans(x2,3,nstart=10)
cl3<-kmeans(x3,3,nstart=10)
cl4<-kmeans(x4,3,nstart=10)

> #評価値の算出
> sum(cl2$withinss)
[1] 1184.379
> sum(cl3$withinss)
[1] 1085.985
> sum(cl4$withinss)
[1] 1466.956

> print(cl2)
K-means clustering with 3 clusters of sizes 9, 20, 18

Cluster means:
     sleep   school
1 456.0000 60.23333
2 471.3000 43.86500
3 464.7222 53.96111

Clustering vector:
 1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 
 2  2  2  2  2  2  2  3  3  3  1  1  1  1  2  3  3  3  3  2  3  3  3  3  3  1  1  1  1  2  2  2  3  1  2  3  3  3  2  3  2  2 
43 44 45 46 47 
 2  3  2  2  2 

Within cluster sum of squares by cluster:
[1] 233.5800 740.1455 210.6539
 (between_SS / total_SS =  74.3 %)

Available components:

[1] "cluster"      "centers"      "totss"        "withinss"     "tot.withinss" "betweenss"    "size"         "iter"        
[9] "ifault" 

####長くなりそうだったので割愛####
print(cl3)
print(cl4)
##################################

#plotします

#睡眠時間×進学率
cl22=data.frame(cl2$cluster)
cl23=cbind(kako_data$area,kako_data$sleep,kako_data$school,cl22)#ダサい

cl_plot2=ggplot(cl23,aes(x=kako_data$school,y=kako_data$sleep,colour=cl2.cluster))+
  geom_point(size=4)
cl_plot2+geom_text(aes(label=kako_data$area),colour="grey40",size=3,vjust=-1)

#進学率とネット普及率
cl32=data.frame(cl3$cluster)
cl33=cbind(kako_data$area,kako_data$school,kako_data$net,cl32)

cl_plot3=ggplot(cl33,aes(x=kako_data$net,y=kako_data$school,colour=cl3.cluster))+
  geom_point(size=4)
cl_plot3+geom_text(aes(label=kako_data$area),colour="grey40",size=3,vjust=-1)

#睡眠時間×ネット普及率
cl42=data.frame(cl4$cluster)
cl43=cbind(kako_data$area,kako_data$sleep,kako_data$net,cl42)

cl_plot4=ggplot(cl43,aes(x=kako_data$net,y=kako_data$sleep,colour=cl4.cluster))+
  geom_point(size=4)
cl_plot4+geom_text(aes(label=kako_data$area),colour="grey40",size=3,vjust=-1)

f:id:WAFkw:20150628194746p:plain

f:id:WAFkw:20150628194806p:plain

f:id:WAFkw:20150628194826p:plain


うーーーんなにかうまいこと言えそうで、、言えない

おまけとして
睡眠時間に関するクラスタの共通項とかないかなーと思って探ってみました

#subset

> kekka_sleep<-subset(all.cluster[,-3],cl2.cluster==cl4.cluster)
> order(kekka_sleep$cl2.cluster) %>%
+ kekka_sleep[.,]
   kako_data$area cl2.cluster cl4.cluster
2          青森県           2           2
3          岩手県           2           2
5          秋田県           2           2
15         新潟県           2           2
32         島根県           2           2
35         山口県           2           2
39         高知県           2           2
42         長崎県           2           2
43         熊本県           2           2
45         宮崎県           2           2
46       鹿児島県           2           2
47         沖縄県           2           2
21         岐阜県           3           3
22         静岡県           3           3
23         愛知県           3           3
24         三重県           3           3
25         滋賀県           3           3
33         岡山県           3           3

睡眠時間×進学率と
睡眠時間×ネットの
それぞれのクラスタをまとめてます。

みごとに首都圏が抜けてますね。。。

なんか言いたい・・・言えない・・・

ということでなんか遠回りしたくせにわりとふつーーのオチで
なんとも言い難い。

ごめんよ18歳のわたし・・・

追記

恐縮ながらお声掛け頂いたこともあり
今回使用したrawデータについて詳細を追記します。

(今回昔の加工データを流用するという横着をしてしまったため
前処理Script存在せずです・・・すみません・・・)


①睡眠時間
都道府県別睡眠時間(分)・・・社会生活基本調査平成23年度【表番号1-1 週全体】
統計表一覧 政府統計の総合窓口 GL08020103

※.xls

②ネット普及率(無線)
都道府県別家庭ネット普及率・・・通信利用動向調査平成23年度【世17 問1(2)】
http://www.e-stat.go.jp/SG1/estat/List.do?bid=000001049749&cycode=0

※.csv
※最新版が存在します
※今考えると【世22 問2(1)】の方がネットの普及率という点では適切なデータかもしれません・・・


③大学進学率
都道府県別大学進学率(%)・・・日本の統計2013【22-18】
統計局ホームページ/日本の統計 2013−第22章 教育

※.xls
※最新版が存在します