読者です 読者をやめる 読者になる 読者になる

次元の海で溺れる

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

【Nippon,infotheo,tidyr】チョコレート狂が生きていきやすい場所を探す

ここ2週間ほど
バグの地雷原とログの森で迷子になっている間に、

札幌では初雪が降りました。

まだ夏が終わったのを受け入れていないのになんてことだ。


ということで
冬の楽しみを一生懸命考えてみました。

クリスマス → いい子にしていたからきっと12/25にはPS4が枕元にあるに違いない

スキー   → 行く。

バレンタイン→ ???

???

そ う だ バ レ ン タ イ ン が あ る

バレンタインは恋人たちだけのものじゃない。
私は世界で一番チョコレートが好きだ。
チョコレートの海で溺れて死にたい。

ということでチョコレートを死ぬほど食べても恥ずかしくないエリアを探します。

テーマ

チョコレートの消費額の多いエリアを可視化

あんま目新しいことはしないです。

データ

e-statから以下を取得
家計調査品目別都道府県庁所在市及び政令指定都市(※)ランキング平成24年(2012年)~26年(2014年)平均)

さくっとやる

> choco_1 #チョコレートの消費額
         area Expenditure1
1      金沢市         6543
2      山口市         5853
3    宇都宮市         5797
4      山形市         5697
5      富山市         5634
6      奈良市         5620
7      高松市         5479
8      札幌市         5478
9      京都市         5455
10     高知市         5428
11     川崎市         5388
12     鳥取市         5381
13     大分市         5377
14     広島市         5313
15     長野市         5251
16 東京都区部         5248
17 さいたま市         5239
18   鹿児島市         5237
19     福井市         5235
20   名古屋市         5091
21     仙台市         5064
22     甲府市         5057
23     松山市         5039
24       津市         4987
25     福島市         4922
26     神戸市         4880
27     浜松市         4849
28     前橋市         4839
29     水戸市         4807
30     岐阜市         4805
31     新潟市         4801
32     静岡市         4733
33     横浜市         4729
34     佐賀市         4703
35     大津市         4652
36     秋田市         4639
37     千葉市         4634
38     岡山市         4619
39     熊本市         4576
40     松江市         4539
41     宮崎市         4536
42   和歌山市         4501
43     徳島市         4477
44     盛岡市         4317
45     福岡市         4232
46     那覇市         4174
47       堺市         4133
48     大阪市         4096
49     長崎市         4076
50   北九州市         3952
51     青森市         3471

> choco_2 #チョコレート菓子類の消費額
         area Expenditure2
1      札幌市         1976
2      山口市         1950
3      高知市         1933
4      金沢市         1906
5      鳥取市         1757
6      山形市         1721
7    宇都宮市         1713
8      富山市         1683
9      松山市         1668
10     浜松市         1646
11   鹿児島市         1630
12     福井市         1612
13     松江市         1580
14     徳島市         1558
15     大分市         1557
16     奈良市         1555
17     佐賀市         1537
18     仙台市         1499
19     長野市         1474
20     岡山市         1466
21     川崎市         1445
22     大津市         1395
23     福島市         1373
24     盛岡市         1359
25       津市         1355
26     高松市         1344
27     甲府市         1343
28     広島市         1308
29     宮崎市         1248
30     岐阜市         1229
31     水戸市         1222
32     秋田市         1214
33     千葉市         1196
34     京都市         1188
35 さいたま市         1185
36     神戸市         1182
37     横浜市         1165
38     新潟市         1162
39     静岡市         1156
40     前橋市         1152
41   名古屋市         1148
42     青森市         1125
43 東京都区部         1123
44   和歌山市         1100
45     熊本市         1081
46       堺市         1045
47     福岡市         1035
48     那覇市         1035
49     長崎市          974
50     大阪市          943
51   北九州市          923

県庁所在地の他、政令指定都市が混ざってます。
なんかの時に作った県庁所在地→都道府県→地方変換マスタがあったので今回はそれとマージして都道府県名に変換。

#都道府県マスタ-----------------------------------------------
master<-read.csv("ID.csv",header=FALSE)  
colnames(master)<-c("ID","areaname","chiho","area")

#マージと合計行の追加------------------------------------------
choco_map<-master %>%
  dplyr::left_join(.,choco_1,by="area") %>% 
  dplyr::left_join(.,choco_2,by="area") %>% 
  dplyr::mutate(.,Expenditure=Expenditure1+Expenditure2)
#--------------------------------------------------------------

> choco_map
   ID areaname    chiho       area Expenditure1 Expenditure2 Expenditure
1   1   北海道 hokkaido     札幌市         5478         1976        7454
2   2   青森県   tohoku     青森市         3471         1125        4596
3   3   岩手県   tohoku     盛岡市         4317         1359        5676
4   4   宮城県   tohoku     仙台市         5064         1499        6563
5   5   秋田県   tohoku     秋田市         4639         1214        5853
6   6   山形県   tohoku     山形市         5697         1721        7418
7   7   福島県   tohoku     福島市         4922         1373        6295
8   8   茨城県   kantou     水戸市         4807         1222        6029
9   9   栃木県   kantou   宇都宮市         5797         1713        7510
10 10   群馬県   kantou     前橋市         4839         1152        5991
11 11   埼玉県   kantou さいたま市         5239         1185        6424
12 12   千葉県   kantou     千葉市         4634         1196        5830
13 13   東京都   kantou 東京都区部         5248         1123        6371
14 14 神奈川県   kantou     横浜市         4729         1165        5894
15 15   新潟県    tyubu     新潟市         4801         1162        5963
16 16   富山県    tyubu     富山市         5634         1683        7317
17 17   石川県    tyubu     金沢市         6543         1906        8449
18 18   福井県    tyubu     福井市         5235         1612        6847
19 19   山梨県    tyubu     甲府市         5057         1343        6400
20 20   長野県    tyubu     長野市         5251         1474        6725
21 21   岐阜県    tyubu     岐阜市         4805         1229        6034
22 22   静岡県    tyubu     静岡市         4733         1156        5889
23 23   愛知県    tyubu   名古屋市         5091         1148        6239
24 24   三重県   kansai       津市         4987         1355        6342
25 25   滋賀県   kansai     大津市         4652         1395        6047
26 26   京都府   kansai     京都市         5455         1188        6643
27 27   大阪府   kansai     大阪市         4096          943        5039
28 28   兵庫県   kansai     神戸市         4880         1182        6062
29 29   奈良県   kansai     奈良市         5620         1555        7175
30 30 和歌山県   kansai   和歌山市         4501         1100        5601
31 31   鳥取県  tyugoku     鳥取市         5381         1757        7138
32 32   島根県  tyugoku     松江市         4539         1580        6119
33 33   岡山県  tyugoku     岡山市         4619         1466        6085
34 34   広島県  tyugoku     広島市         5313         1308        6621
35 35   山口県  tyugoku     山口市         5853         1950        7803
36 36   徳島県  shikoku     徳島市         4477         1558        6035
37 37   香川県  shikoku     高松市         5479         1344        6823
38 38   愛媛県  shikoku     松山市         5039         1668        6707
39 39   高知県  shikoku     高知市         5428         1933        7361
40 40   福岡県   kyusyu     福岡市         4232         1035        5267
41 41   佐賀県   kyusyu     佐賀市         4703         1537        6240
42 42   長崎県   kyusyu     長崎市         4076          974        5050
43 43   熊本県   kyusyu     熊本市         4576         1081        5657
44 44   大分県   kyusyu     大分市         5377         1557        6934
45 45   宮崎県   kyusyu     宮崎市         4536         1248        5784
46 46 鹿児島県   kyusyu   鹿児島市         5237         1630        6867
47 47   沖縄県  okinawa     那覇市         4174         1035        5209

チョコレート、チョコレート菓子、チョコ類合計額があるけど、
このままだと可視化した時に見づらいので離散化して均等な額ごとのグループにまとめます。

#消費額のクラス分け--------------------------------------------

class_1<-infotheo::discretize(subset(choco_map,select=Expenditure1),disc="equalwidth")
class_2<-infotheo::discretize(subset(choco_map,select=Expenditure2),disc="equalwidth")
class_a<-infotheo::discretize(subset(choco_map,select=Expenditure),disc="equalwidth")
colnames(class_1)<-"class_1"
colnames(class_2)<-"class_2"
colnames(class_a)<-"class_a"
 
> choco_map<-dplyr::bind_cols(choco_map,class_1,class_2,class_a);head(choco_map)

  ID areaname    chiho   area Expenditure1 Expenditure2 Expenditure class_1 class_2 class_a
1  1   北海道 hokkaido 札幌市         5478         1976        7454       2       3       3
2  2   青森県   tohoku 青森市         3471         1125        4596       1       1       1
3  3   岩手県   tohoku 盛岡市         4317         1359        5676       1       2       1
4  4   宮城県   tohoku 仙台市         5064         1499        6563       2       2       2
5  5   秋田県   tohoku 秋田市         4639         1214        5853       2       1       1
6  6   山形県   tohoku 山形市         5697         1721        7418       3       3       3

額が小さい順に1→2→3のグループが出来たので可視化します。

今回は(も){Nippon}パッケージ。

デフォルトの色を変えてみたくて試行錯誤しましたがなんか直接色指定することしか成功しなかった...

#コロプレス(色指定がしたい)----------------------------------------------------
cols <- rev(RColorBrewer::brewer.pal(3,"Set2"))
choco_map$class_1<-gsub("1",cols[1],choco_map$class_1)
choco_map$class_1<-gsub("2",cols[2],choco_map$class_1)
choco_map$class_1<-gsub("3",cols[3],choco_map$class_1)

#描画
Nippon::JapanPrefecturesMap(col = choco_map$class_1,axes=FALSE) #チョコレート消費額
Nippon::JapanPrefecturesMap(col = choco_map$class_a) #チョコレート全般消費額


f:id:WAFkw:20151026233449p:plain

f:id:WAFkw:20151026233458p:plain

上が{RColorBrewer}のセットで色指定したやつ、下がデフォルトです。

なんかこんなやり方じゃなくていい気がする。。。むむむ


しかもちょっと待って。
地元が一番チョコレート食べてないエリアってどういうことなの、ねえ岩手。。。私が居なくなったから...?

地域性は特になさそう。。というか額の幅を均等にすると、ほとんど「2」に分類されてるから
極端に多いところと、極端に少ないところが目立つ感じに。


とりあえず金沢に行けばチョコレートを死ぬほど食べても浮くことはなさそう。

おまけ

「そんなチョコレート食べたら太るよ」って散々言われるので

都道府県別の肥満率をクラス分けしてクロス集計でもしてみた。

このへんの書き方、
table()から{tidyr}に移行していきたいなあと。

データ元は同じくe-statの国民健康・栄養調査(2010年)より。

> himan
   areaname himan
1    沖縄県 0.452
2    宮崎県 0.447
3    栃木県 0.405
4    福島県 0.403
5    徳島県 0.401
6    宮城県 0.395
7    岩手県 0.387
8    北海道 0.385
9    青森県 0.380
10   高知県 0.376
11   大分県 0.373
12   長崎県 0.365
13   熊本県 0.337
14 鹿児島県 0.335
15   愛媛県 0.330
16   奈良県 0.326
17   千葉県 0.317
18 和歌山県 0.315
19   大阪府 0.314
20   佐賀県 0.313
21   秋田県 0.312
22   茨城県 0.312
23   埼玉県 0.310
24   東京都 0.305
25 神奈川県 0.303
26   福岡県 0.298
27   富山県 0.296
28   群馬県 0.296
29   広島県 0.294
30   愛知県 0.294
31   山形県 0.293
32   三重県 0.292
33   岐阜県 0.292
34   石川県 0.284
35   島根県 0.278
36   兵庫県 0.277
37   新潟県 0.277
38   岡山県 0.275
39   山梨県 0.272
40   長野県 0.257
41   京都府 0.256
42   香川県 0.254
43   静岡県 0.252
44   鳥取県 0.251
45   滋賀県 0.230
46   福井県 0.225
47   山口県 0.221

#チョコマップとくっつける
himan_map<-dplyr::left_join(choco_map,himan,by="areaname")


#肥満率もクラス分け
class_himan<-infotheo::discretize(subset(himan_map,select=himan),disc="equalwidth")
colnames(class_himan)<-"class_himan"

#クラスもくっつける
himan_map<-dplyr::bind_cols(himan_map,class_himan)


#クロス集計-------------------------------------------------------
himan_map$class_himan<-gsub("1","S",himan_map$class_himan)
himan_map$class_himan<-gsub("2","M",himan_map$class_himan)
himan_map$class_himan<-gsub("3","L",himan_map$class_himan)


> dplyr::count(himan_map,class_a,class_himan) %>%
+ tidyr::spread(.,class_himan,n) %>%
+ dplyr::select(.,class_a,S,M,L)
Source: local data frame [3 x 4]

  class_a  S M L
1       1 NA 7 4
2       2 17 8 3
3       3  4 1 3


最後にselect()したら並び順を変えられた。今更いいこと覚えた。


そして今気づいたけどクラス内の個数にだいぶ偏りがあるのに
単純にクロス集計なんてするもんじゃなかった。。


でもなんかクラス2とか肥満率Sが多いよ、ほら。
ほどほどチョコ食べたらむしろいいんじゃない、、いやなんでもないです。

追記

もっかい回したら謎の")"でエラーが出たので修正しまぴた。

class_himan<-infotheo::discretize(subset(himan_map,select=himan),disc="equalwidth")
colnames(class_himan)<-"class_himan"

こういう処理を外出しせずに、
mutate()とかの中にうまく入れてしまいたいんだけどどうにもうまくいかなかった..

infotheo::discretizeの戻り値の列名が分割元の列と同じになるのを制御したかったりするんだけどなあ..