sage/オープンデータ解析例1
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
単語検索
|
最終更新
|
ヘルプ
]
開始行:
[[FrontPage]]
#contents
2016/02/16からのアクセス回数 &counter;
ここで紹介したSageワークシートは、以下のURLからダウンロー...
http://www15191ue.sakura.ne.jp:8000/home/pub/61/
また、私の公開しているSageのサーバ(http://www15191ue.sak...
アップロードし、実行したり、変更していろいろ動きを試すこ...
** オープンデータ解析例1 [#k120014b]
高岡市の公開しているオープンデータを使ってデータ解析をし...
今回は、平成27年7月地区別世帯数及び人口集計表の「全体」シ...
*** 必要なユーティリティの準備 [#rd844635]
データを簡単に処理するために、ggplot2等のライブラリーを読...
sageへの入力:
#pre{{
# RとPandasで必要なユーティリティ
# Rの必要なライブラリ
r('library(ggplot2)')
r('library(jsonlite)')
# RUtilにRとPandasのデータフレームを相互に変換する関数を...
load(DATA + 'RUtil.py')
}}
** 平成27年7月地区別世帯数及び人口集計表 [#y88d0032]
それでは、オープンデータとして公開されている高岡市の「平...
読み込んでPandasのデータフレームに取り込みます。
平成27年7月地区別世帯数及び人口集計表のデータは、以下の様...
&ref(Excel_format.jpg);
ヘッダは、4,5行目にあり、カラムは、2列目から始まっていま...
pd.read_excel関数に読み込むExcelファイルのあるURLを指定し...
ヘッダは、3(0始まり)とし、カラムは1(0始まり)にあるこ...
sageへの入力:
#pre{{
# 高岡市のオープンデータから平成27年7月の人口データ(h2707...
d = pd.read_excel('http://www.city.takaoka.toyama.jp/joho...
d.head()
}}
#pre{{
頁 地区\nコード 地区名 人 口 Unnamed: 4 Unnam...
NaN NaN NaN NaN 男 女 計 NaN
2 NaN 01 平米地区 NaN 1573 1807 3380 1591
3 NaN 02 定塚地区 NaN 4428 4967 9395 3977
4 NaN 03 下関地区 NaN 4439 4629 9068 3971
5 NaN 04 博労地区 NaN 5317 5833 11150 4582
}}
*** カラム名のセットと不要なカラムの削除 [#pde60d63]
カラム名が日本語のままだと操作しにくいので、カラム名をd.c...
頁の後にNaNという変な値が入っているので、not_usedというカ...
地区名はセル結合されて、codeの欄に地区コード+地区名でセッ...
sageへの入力:
#pre{{
# カラム名を付け直し、最初の5個を表示
d.columns = ['not_used', 'code', 'region', 'male', 'femal...
d.head()
}}
#pre{{
not_used code region male female population h...
NaN NaN NaN NaN 男 女 計...
2 NaN 01 平米地区 NaN 1573 1807 338...
3 NaN 02 定塚地区 NaN 4428 4967 939...
4 NaN 03 下関地区 NaN 4439 4629 906...
5 NaN 04 博労地区 NaN 5317 5833 1115...
}}
博労地区と佐野地区は木津地区を除いた集計がされているので...
d.index > 1とすることで不要なデータを取り除きます。
sageへの入力:
#pre{{
# 最初の番号(index)が1より大きなcode, population, house...
d1 = d[d.index > 1][['code', 'male', 'female', 'populatio...
d1.head()
}}
#pre{{
code male female population household
2 01 平米地区 1573 1807 3380 1591
3 02 定塚地区 4428 4967 9395 3977
4 03 下関地区 4439 4629 9068 3971
5 04 博労地区 5317 5833 11150 4582
6 05 横田地区 2839 3070 5909 2286
}}
*** データの可視化 [#w55636ee]
各要素にどのような関係があるかを、Rのpairsプロットでみて...
SageのPandaで作られたデータフレームをRのデータフレームに...
残念ながら、日本語のデータが正しくRに変換できないため、こ...
codeを除いてRに渡しています。
sageへの入力:
#pre{{
# d2をRのデータフレームd1に変換する
# 日本語が上手く渡せない
d2 = d[d.index > 1][['male', 'female', 'population', 'hou...
d2 = d2[d2.index <36]
PandaDf2RDf(d2, "d2")
}}
sageへの入力:
#pre{{
# 分布を可視化
g_pairs = preGraph("pairs.pdf")
r('pairs(d2, main="Basic Scatter Plot Matrix")')
postGraph(g_pairs, fac=0.6)
}}
&ref(th_pairs.png);
世帯数(household)と人口(population)の関係を散布図でみ...
世帯数と人口は、概ね直線上にのっており、地区によるおおき...
sageへの入力:
#pre{{
# 世帯数(household)と人口(population)の関係をみる
df = d1[d1.index <36]
ggplot(df, aes(x='household', y='population')) + geom_poi...
}}
#pre{{
<repr(<ggplot.ggplot.ggplot at 0x7f7943c6a6d0>) failed: K...
}}
sageへの入力:
#pre{{
GgSave('fig_1.png', fac=0.8)
}}
#pre{{
Saving 11.0 x 8.0 in image.
}}
&ref(th_fig_1.png);
** グループ分け [#sefb380b]
高岡市の地区を2つのグループに分けてみましょう。
グループ分けに使用するデータは、男性、女性の人数と世帯数...
分析に使用する手法は、混合正規分布(GMM)を使用します。
ここでは、sklearnのmixtureパッケージのGMMを使っています。
n_components=2で2つのグループに分けることを指定しています。
sageへの入力:
#pre{{
# 混合正規分布
from sklearn import mixture
# 分類器の生成
classifier = mixture.GMM(n_components=2, covariance_type=...
}}
sageへの入力:
#pre{{
# GMMを求める
# GMMについては、http://www15191ue.sakura.ne.jp:8000/home...
data = df[['male', 'female', 'household']].values
# 混合正規分布を求める
classifier.fit(data)
}}
#pre{{
GMM(covariance_type='full', init_params='wmc', min_covar=...
n_components=2, n_init=1, n_iter=100, params='wmc', ran...
thresh=None, tol=0.001)
}}
*** 分析結果のプロット [#oe1932f1]
グループ分けされた結果は、classifier.predict関数で得るこ...
この結果をデータフレームdfのpredにセットします。
predの値で散布図の点を色分けしてプロットしてみます。
sageへの入力:
#pre{{
# 分類結果をpredにセット
df['pred'] = classifier.predict(data)
# 世帯数(household)と人口(population)の関係をみる
ggplot(df, aes(x='population', y='household', colour='pre...
}}
#pre{{
<repr(<ggplot.ggplot.ggplot at 0x7f79437b9810>) failed: K...
}}
sageへの入力:
#pre{{
GgSave('fig_2.png', fac=0.8)
}}
#pre{{
Saving 11.0 x 8.0 in image.
}}
&ref(th_fig_2.png);
*** 世帯数と分類の結果 [#lcb3ca4f]
データを世帯数でソートして表示してみます。
predがグループ分けの結果で、平米地区が世帯数が中田地区よ...
グループ1に入っており、興味深い結果となっています。
sageへの入力:
#pre{{
# 世帯数でソート
# 平米地区に注目
df.sort('household')
}}
#pre{{
code male female population household pred
33 30 福岡町五位山地区 204 217 421 17...
18 16 小勢地区 488 498 986 277 ...
34 31 福岡町赤丸地区 577 612 1189 414...
21 19 石堤地区 613 619 1232 443 ...
32 29 福岡町西五位地区 938 975 1913 61...
31 28 福岡町大滝地区 1197 1240 2437 796...
25 23 太田地区 1221 1387 2608 889 ...
17 15 福田地区 1309 1347 2656 900 ...
23 21 守山地区 1259 1380 2639 933 ...
10 09 二上地区 1270 1366 2636 999 ...
29 26 福岡町福岡地区 1477 1616 3093 1153...
19 17 立野地区 1578 1698 3276 1181 ...
22 20 国吉地区 1719 1844 3563 1192 ...
15 13 二塚地区 1770 1894 3664 1218 ...
30 27 福岡町山王地区 1958 1980 3938 1244...
8 07 川原地区 1554 1719 3273 1336 ...
2 01 平米地区 1573 1807 3380 1591 ...
20 18 東五位地区 2354 2546 4900 1700 ...
35 木津地区 ※ 2765 2966 5731 2135 ...
28 25 中田地区 3025 3270 6295 2220 ...
6 05 横田地区 2839 3070 5909 2286 ...
16 14 佐野地区 3238 3530 6768 2399 ...
7 06 西条地区 3427 3565 6992 2676 ...
12 11 牧野地区 4678 4909 9587 3461 ...
9 08 成美地区 3877 4414 8291 3512 ...
4 03 下関地区 4439 4629 9068 3971 ...
3 02 定塚地区 4428 4967 9395 3977 ...
24 22 伏木地区 5368 5939 11307 4442 ...
11 10 能町地区 5667 5874 11541 4449 ...
5 04 博労地区 5317 5833 11150 4582 ...
26 24 戸出地区 6716 6921 13637 4948 ...
13 12 野村地区 8443 8996 17439 6907 ...
}}
*** 男性と女性の数の関係 [#te754baa]
同様に、男性と女性の関係をプロットしてみます。
世帯数よりも男性と女性の関係の方が、はっきりした直線の関...
sageへの入力:
#pre{{
# 男性(male)と女性(female)の関係をみる
ggplot(df, aes(x='male', y='female', colour='pred')) + ge...
}}
#pre{{
<repr(<ggplot.ggplot.ggplot at 0x7f793f22b710>) failed: K...
}}
sageへの入力:
#pre{{
GgSave('fig_3.png', fac=0.8)
}}
#pre{{
Saving 11.0 x 8.0 in image.
}}
&ref(th_fig_3.png);
*** ペア・プロットにグループで色分け [#uc1a1dc1]
平米地区がグループ1に入っている理由をみるために、
ペア・プロットにグループで色分けしてみます。
sageへの入力:
#pre{{
# グループ分けの結果で色分けしてペア・プロットを表示
d2 = df[['male', 'female', 'population', 'household', 'pr...
PandaDf2RDf(d2, "d2")
}}
sageへの入力:
#pre{{
# 分布を可視化
graph = preGraph("pairs2.pdf")
r('pairs(d2[, c(2, 3, 4, 5)], main="Takaoka Group", pch=2...
postGraph(graph, fac=0.8)
}}
&ref(th_pairs2.png);
** クラス分けを地図に表示 [#x95d57fc]
*** 国土地理院の小学校区のshapeファイル [#l323446a]
クラス分けの結果を地図にプロットするために、国土地理院が...
- [[国土交通省 GIS データのダウンロード>http://nrb-www.ml...
小学校区は、A27-10_16-g_SchoolDistrict.shpに定義され、小...
国土地理院のデータはShift-JISコードであり、これをUTF-8に...
以下のサイトを参考にUTF-8に変換しました。
- [[Google Earth の使い方~その2 道路や鉄道、将来人口情...
*** 地区と小学校の関係 [#ae43b3b4]
高岡市の地区と小学校区の関係をExcelシートに整理しました。...
分からなかったので、高岡市の防災マップを元に人に聞きなが...
このExcelファイルを修正すれば、地図はすぐに書き直せます。
sageへの入力:
#pre{{
# 高岡市地区の小学校区を読み込む
schoolDistrict = pd.read_excel(DATA + "schoolDistrict.xls")
# 予測結果に対する色と小学校をd2にセット
schoolDistrict.head()
}}
#pre{{
code schoolDsitrict
0 01 平米地区 平米小学校
1 02 定塚地区 定塚小学校
2 03 下関地区 下関小学校
3 04 博労地区 博労小学校
4 05 横田地区 横田小学校
}}
つぎにcodeをキーにして、高岡市のクラス分け結果(df)と小...
sageへの入力:
#pre{{
# 小学校区と地区をマージ
df.set_index('code')
schoolDistrict.set_index('code')
df = df.merge(schoolDistrict)
df.head()
}}
#pre{{
code male female population household pred schoo...
0 01 平米地区 1573 1807 3380 1591 1 ...
1 02 定塚地区 4428 4967 9395 3977 1 ...
2 03 下関地区 4439 4629 9068 3971 1 ...
3 04 博労地区 5317 5833 11150 4582 1 ...
4 05 横田地区 2839 3070 5909 2286 0 ...
}}
地図の表示には、Rのmaptoolsを使用するため、
小学校区(schoolDsitrict)とクラス分け結果(pred)をCSVフ...
sageへの入力:
#pre{{
# 小学校区のクラス分け
schoolClass = df[['schoolDsitrict', 'pred']]. drop_duplic...
schoolClass.head()
}}
#pre{{
schoolDsitrict pred
0 平米小学校 1
1 定塚小学校 1
2 下関小学校 1
3 博労小学校 1
4 横田小学校 0
}}
sageへの入力:
#pre{{
# 日本語を含むため、csvファイルを使ってRへ渡す
schoolClass_file = DATA + 'schoolCalss.csv'
schoolClass.to_csv(schoolClass_file)
}}
*** maptoolsで地図にプロット [#q6aab298]
Rのmaptoolsをロードし、富山県の小学校区のshapeファイルA27...
shape変数から高岡市立の小学校区のみを抽出するため、shape[...
sageへの入力:
#pre{{
# maptoolsをロード
# r("install.packages('maptools')")
r("library(maptools)")
}}
#pre{{
[1] "maptools" "sp" "jsonlite" "ggplot2" "sta...
[9] "datasets" "methods" "base"
}}
sageへの入力:
#pre{{
# 富山県の小学校区のshapeファイルを読み込み、高岡市立の小...
shape_file = DATA + "A27-10_16-g_SchoolDistrict.shp"
r('shape <- readShapePoly("%s")' % shape_file)
r('takaoka <- shape[shape@data$A27_006=="高岡市立",]')
r('takaoka@data$A27_007')
}}
#pre{{
[1] 成美小学校 戸出東部小学校 戸出東部小学校 博労小...
[7] 万葉小学校 福岡小学校 太田小学校 国吉小...
[13] 西広谷小学校 古府小学校 能町小学校 西条小...
[19] 石堤小学校 定塚小学校 横田小学校 平米小...
[25] 南条小学校 二塚小学校 中田小学校 下関小...
122 Levels: あさひ野小学校 さみさと小学校 井口小学校 井波...
}}
高岡市の小学校区のクラス分け結果のCSVファイルを読み込み、...
色分けを0=赤、1=青とし、Rのインデックスが1はじまりなの...
sageへの入力:
#pre{{
# shcoolClassを読み込む
r('shcoolClass <- read.csv("%s")' % schoolClass_file)
# クラス分けを変数predにセット
r('pred <- shcoolClass$pred[match(takaoka@data$A27_007 , ...
# クラスの色を配列にセット
r('cols <- c("red", "blue")')
# クラス分けを色に変換(Rのインデックスが1始まりなのでpre...
r('col <- cols[pred+1]')
}}
#pre{{
[1] "blue" "blue" "blue" "blue" "blue" "blue" "red" "re...
[14] "blue" "blue" "blue" "blue" "red" "red" "blue" "re...
[27] "red" "blue" "blue" "blue"
}}
準備ができたので、takaokaの小学校区のクラス分けを地図にプ...
赤で囲まれた青の地区は、「川原地区」です。
sageへの入力:
#pre{{
graph = preGraph("schoolDistrict.pdf")
r('plot(takaoka, col=col)')
postGraph(graph, fac=0.8)
}}
&ref(th_schoolDistrict.png);
** データ替えて同じ計算をする [#f3df4804]
最初のデータの読み込みを以下のように6月のデータに替えて、...
平成27年6月地区別世帯数及び人口集計表に対して同じ計算を行...
#pre{{
d = pd.read_excel('http://www.city.takaoka.toyama.jp...
}}
これが、Sageを使った「リプロデューシブルリサーチ」です。
Sageは、実行可能なドキュメントなので、入力のExcelファイル...
別のデータに同じような分析を実行することができるのです。
** コメント [#ve498b7a]
#vote(おもしろかった,そうでもない,わかりずらい)
皆様のご意見、ご希望をお待ちしております。
#comment_kcaptcha
終了行:
[[FrontPage]]
#contents
2016/02/16からのアクセス回数 &counter;
ここで紹介したSageワークシートは、以下のURLからダウンロー...
http://www15191ue.sakura.ne.jp:8000/home/pub/61/
また、私の公開しているSageのサーバ(http://www15191ue.sak...
アップロードし、実行したり、変更していろいろ動きを試すこ...
** オープンデータ解析例1 [#k120014b]
高岡市の公開しているオープンデータを使ってデータ解析をし...
今回は、平成27年7月地区別世帯数及び人口集計表の「全体」シ...
*** 必要なユーティリティの準備 [#rd844635]
データを簡単に処理するために、ggplot2等のライブラリーを読...
sageへの入力:
#pre{{
# RとPandasで必要なユーティリティ
# Rの必要なライブラリ
r('library(ggplot2)')
r('library(jsonlite)')
# RUtilにRとPandasのデータフレームを相互に変換する関数を...
load(DATA + 'RUtil.py')
}}
** 平成27年7月地区別世帯数及び人口集計表 [#y88d0032]
それでは、オープンデータとして公開されている高岡市の「平...
読み込んでPandasのデータフレームに取り込みます。
平成27年7月地区別世帯数及び人口集計表のデータは、以下の様...
&ref(Excel_format.jpg);
ヘッダは、4,5行目にあり、カラムは、2列目から始まっていま...
pd.read_excel関数に読み込むExcelファイルのあるURLを指定し...
ヘッダは、3(0始まり)とし、カラムは1(0始まり)にあるこ...
sageへの入力:
#pre{{
# 高岡市のオープンデータから平成27年7月の人口データ(h2707...
d = pd.read_excel('http://www.city.takaoka.toyama.jp/joho...
d.head()
}}
#pre{{
頁 地区\nコード 地区名 人 口 Unnamed: 4 Unnam...
NaN NaN NaN NaN 男 女 計 NaN
2 NaN 01 平米地区 NaN 1573 1807 3380 1591
3 NaN 02 定塚地区 NaN 4428 4967 9395 3977
4 NaN 03 下関地区 NaN 4439 4629 9068 3971
5 NaN 04 博労地区 NaN 5317 5833 11150 4582
}}
*** カラム名のセットと不要なカラムの削除 [#pde60d63]
カラム名が日本語のままだと操作しにくいので、カラム名をd.c...
頁の後にNaNという変な値が入っているので、not_usedというカ...
地区名はセル結合されて、codeの欄に地区コード+地区名でセッ...
sageへの入力:
#pre{{
# カラム名を付け直し、最初の5個を表示
d.columns = ['not_used', 'code', 'region', 'male', 'femal...
d.head()
}}
#pre{{
not_used code region male female population h...
NaN NaN NaN NaN 男 女 計...
2 NaN 01 平米地区 NaN 1573 1807 338...
3 NaN 02 定塚地区 NaN 4428 4967 939...
4 NaN 03 下関地区 NaN 4439 4629 906...
5 NaN 04 博労地区 NaN 5317 5833 1115...
}}
博労地区と佐野地区は木津地区を除いた集計がされているので...
d.index > 1とすることで不要なデータを取り除きます。
sageへの入力:
#pre{{
# 最初の番号(index)が1より大きなcode, population, house...
d1 = d[d.index > 1][['code', 'male', 'female', 'populatio...
d1.head()
}}
#pre{{
code male female population household
2 01 平米地区 1573 1807 3380 1591
3 02 定塚地区 4428 4967 9395 3977
4 03 下関地区 4439 4629 9068 3971
5 04 博労地区 5317 5833 11150 4582
6 05 横田地区 2839 3070 5909 2286
}}
*** データの可視化 [#w55636ee]
各要素にどのような関係があるかを、Rのpairsプロットでみて...
SageのPandaで作られたデータフレームをRのデータフレームに...
残念ながら、日本語のデータが正しくRに変換できないため、こ...
codeを除いてRに渡しています。
sageへの入力:
#pre{{
# d2をRのデータフレームd1に変換する
# 日本語が上手く渡せない
d2 = d[d.index > 1][['male', 'female', 'population', 'hou...
d2 = d2[d2.index <36]
PandaDf2RDf(d2, "d2")
}}
sageへの入力:
#pre{{
# 分布を可視化
g_pairs = preGraph("pairs.pdf")
r('pairs(d2, main="Basic Scatter Plot Matrix")')
postGraph(g_pairs, fac=0.6)
}}
&ref(th_pairs.png);
世帯数(household)と人口(population)の関係を散布図でみ...
世帯数と人口は、概ね直線上にのっており、地区によるおおき...
sageへの入力:
#pre{{
# 世帯数(household)と人口(population)の関係をみる
df = d1[d1.index <36]
ggplot(df, aes(x='household', y='population')) + geom_poi...
}}
#pre{{
<repr(<ggplot.ggplot.ggplot at 0x7f7943c6a6d0>) failed: K...
}}
sageへの入力:
#pre{{
GgSave('fig_1.png', fac=0.8)
}}
#pre{{
Saving 11.0 x 8.0 in image.
}}
&ref(th_fig_1.png);
** グループ分け [#sefb380b]
高岡市の地区を2つのグループに分けてみましょう。
グループ分けに使用するデータは、男性、女性の人数と世帯数...
分析に使用する手法は、混合正規分布(GMM)を使用します。
ここでは、sklearnのmixtureパッケージのGMMを使っています。
n_components=2で2つのグループに分けることを指定しています。
sageへの入力:
#pre{{
# 混合正規分布
from sklearn import mixture
# 分類器の生成
classifier = mixture.GMM(n_components=2, covariance_type=...
}}
sageへの入力:
#pre{{
# GMMを求める
# GMMについては、http://www15191ue.sakura.ne.jp:8000/home...
data = df[['male', 'female', 'household']].values
# 混合正規分布を求める
classifier.fit(data)
}}
#pre{{
GMM(covariance_type='full', init_params='wmc', min_covar=...
n_components=2, n_init=1, n_iter=100, params='wmc', ran...
thresh=None, tol=0.001)
}}
*** 分析結果のプロット [#oe1932f1]
グループ分けされた結果は、classifier.predict関数で得るこ...
この結果をデータフレームdfのpredにセットします。
predの値で散布図の点を色分けしてプロットしてみます。
sageへの入力:
#pre{{
# 分類結果をpredにセット
df['pred'] = classifier.predict(data)
# 世帯数(household)と人口(population)の関係をみる
ggplot(df, aes(x='population', y='household', colour='pre...
}}
#pre{{
<repr(<ggplot.ggplot.ggplot at 0x7f79437b9810>) failed: K...
}}
sageへの入力:
#pre{{
GgSave('fig_2.png', fac=0.8)
}}
#pre{{
Saving 11.0 x 8.0 in image.
}}
&ref(th_fig_2.png);
*** 世帯数と分類の結果 [#lcb3ca4f]
データを世帯数でソートして表示してみます。
predがグループ分けの結果で、平米地区が世帯数が中田地区よ...
グループ1に入っており、興味深い結果となっています。
sageへの入力:
#pre{{
# 世帯数でソート
# 平米地区に注目
df.sort('household')
}}
#pre{{
code male female population household pred
33 30 福岡町五位山地区 204 217 421 17...
18 16 小勢地区 488 498 986 277 ...
34 31 福岡町赤丸地区 577 612 1189 414...
21 19 石堤地区 613 619 1232 443 ...
32 29 福岡町西五位地区 938 975 1913 61...
31 28 福岡町大滝地区 1197 1240 2437 796...
25 23 太田地区 1221 1387 2608 889 ...
17 15 福田地区 1309 1347 2656 900 ...
23 21 守山地区 1259 1380 2639 933 ...
10 09 二上地区 1270 1366 2636 999 ...
29 26 福岡町福岡地区 1477 1616 3093 1153...
19 17 立野地区 1578 1698 3276 1181 ...
22 20 国吉地区 1719 1844 3563 1192 ...
15 13 二塚地区 1770 1894 3664 1218 ...
30 27 福岡町山王地区 1958 1980 3938 1244...
8 07 川原地区 1554 1719 3273 1336 ...
2 01 平米地区 1573 1807 3380 1591 ...
20 18 東五位地区 2354 2546 4900 1700 ...
35 木津地区 ※ 2765 2966 5731 2135 ...
28 25 中田地区 3025 3270 6295 2220 ...
6 05 横田地区 2839 3070 5909 2286 ...
16 14 佐野地区 3238 3530 6768 2399 ...
7 06 西条地区 3427 3565 6992 2676 ...
12 11 牧野地区 4678 4909 9587 3461 ...
9 08 成美地区 3877 4414 8291 3512 ...
4 03 下関地区 4439 4629 9068 3971 ...
3 02 定塚地区 4428 4967 9395 3977 ...
24 22 伏木地区 5368 5939 11307 4442 ...
11 10 能町地区 5667 5874 11541 4449 ...
5 04 博労地区 5317 5833 11150 4582 ...
26 24 戸出地区 6716 6921 13637 4948 ...
13 12 野村地区 8443 8996 17439 6907 ...
}}
*** 男性と女性の数の関係 [#te754baa]
同様に、男性と女性の関係をプロットしてみます。
世帯数よりも男性と女性の関係の方が、はっきりした直線の関...
sageへの入力:
#pre{{
# 男性(male)と女性(female)の関係をみる
ggplot(df, aes(x='male', y='female', colour='pred')) + ge...
}}
#pre{{
<repr(<ggplot.ggplot.ggplot at 0x7f793f22b710>) failed: K...
}}
sageへの入力:
#pre{{
GgSave('fig_3.png', fac=0.8)
}}
#pre{{
Saving 11.0 x 8.0 in image.
}}
&ref(th_fig_3.png);
*** ペア・プロットにグループで色分け [#uc1a1dc1]
平米地区がグループ1に入っている理由をみるために、
ペア・プロットにグループで色分けしてみます。
sageへの入力:
#pre{{
# グループ分けの結果で色分けしてペア・プロットを表示
d2 = df[['male', 'female', 'population', 'household', 'pr...
PandaDf2RDf(d2, "d2")
}}
sageへの入力:
#pre{{
# 分布を可視化
graph = preGraph("pairs2.pdf")
r('pairs(d2[, c(2, 3, 4, 5)], main="Takaoka Group", pch=2...
postGraph(graph, fac=0.8)
}}
&ref(th_pairs2.png);
** クラス分けを地図に表示 [#x95d57fc]
*** 国土地理院の小学校区のshapeファイル [#l323446a]
クラス分けの結果を地図にプロットするために、国土地理院が...
- [[国土交通省 GIS データのダウンロード>http://nrb-www.ml...
小学校区は、A27-10_16-g_SchoolDistrict.shpに定義され、小...
国土地理院のデータはShift-JISコードであり、これをUTF-8に...
以下のサイトを参考にUTF-8に変換しました。
- [[Google Earth の使い方~その2 道路や鉄道、将来人口情...
*** 地区と小学校の関係 [#ae43b3b4]
高岡市の地区と小学校区の関係をExcelシートに整理しました。...
分からなかったので、高岡市の防災マップを元に人に聞きなが...
このExcelファイルを修正すれば、地図はすぐに書き直せます。
sageへの入力:
#pre{{
# 高岡市地区の小学校区を読み込む
schoolDistrict = pd.read_excel(DATA + "schoolDistrict.xls")
# 予測結果に対する色と小学校をd2にセット
schoolDistrict.head()
}}
#pre{{
code schoolDsitrict
0 01 平米地区 平米小学校
1 02 定塚地区 定塚小学校
2 03 下関地区 下関小学校
3 04 博労地区 博労小学校
4 05 横田地区 横田小学校
}}
つぎにcodeをキーにして、高岡市のクラス分け結果(df)と小...
sageへの入力:
#pre{{
# 小学校区と地区をマージ
df.set_index('code')
schoolDistrict.set_index('code')
df = df.merge(schoolDistrict)
df.head()
}}
#pre{{
code male female population household pred schoo...
0 01 平米地区 1573 1807 3380 1591 1 ...
1 02 定塚地区 4428 4967 9395 3977 1 ...
2 03 下関地区 4439 4629 9068 3971 1 ...
3 04 博労地区 5317 5833 11150 4582 1 ...
4 05 横田地区 2839 3070 5909 2286 0 ...
}}
地図の表示には、Rのmaptoolsを使用するため、
小学校区(schoolDsitrict)とクラス分け結果(pred)をCSVフ...
sageへの入力:
#pre{{
# 小学校区のクラス分け
schoolClass = df[['schoolDsitrict', 'pred']]. drop_duplic...
schoolClass.head()
}}
#pre{{
schoolDsitrict pred
0 平米小学校 1
1 定塚小学校 1
2 下関小学校 1
3 博労小学校 1
4 横田小学校 0
}}
sageへの入力:
#pre{{
# 日本語を含むため、csvファイルを使ってRへ渡す
schoolClass_file = DATA + 'schoolCalss.csv'
schoolClass.to_csv(schoolClass_file)
}}
*** maptoolsで地図にプロット [#q6aab298]
Rのmaptoolsをロードし、富山県の小学校区のshapeファイルA27...
shape変数から高岡市立の小学校区のみを抽出するため、shape[...
sageへの入力:
#pre{{
# maptoolsをロード
# r("install.packages('maptools')")
r("library(maptools)")
}}
#pre{{
[1] "maptools" "sp" "jsonlite" "ggplot2" "sta...
[9] "datasets" "methods" "base"
}}
sageへの入力:
#pre{{
# 富山県の小学校区のshapeファイルを読み込み、高岡市立の小...
shape_file = DATA + "A27-10_16-g_SchoolDistrict.shp"
r('shape <- readShapePoly("%s")' % shape_file)
r('takaoka <- shape[shape@data$A27_006=="高岡市立",]')
r('takaoka@data$A27_007')
}}
#pre{{
[1] 成美小学校 戸出東部小学校 戸出東部小学校 博労小...
[7] 万葉小学校 福岡小学校 太田小学校 国吉小...
[13] 西広谷小学校 古府小学校 能町小学校 西条小...
[19] 石堤小学校 定塚小学校 横田小学校 平米小...
[25] 南条小学校 二塚小学校 中田小学校 下関小...
122 Levels: あさひ野小学校 さみさと小学校 井口小学校 井波...
}}
高岡市の小学校区のクラス分け結果のCSVファイルを読み込み、...
色分けを0=赤、1=青とし、Rのインデックスが1はじまりなの...
sageへの入力:
#pre{{
# shcoolClassを読み込む
r('shcoolClass <- read.csv("%s")' % schoolClass_file)
# クラス分けを変数predにセット
r('pred <- shcoolClass$pred[match(takaoka@data$A27_007 , ...
# クラスの色を配列にセット
r('cols <- c("red", "blue")')
# クラス分けを色に変換(Rのインデックスが1始まりなのでpre...
r('col <- cols[pred+1]')
}}
#pre{{
[1] "blue" "blue" "blue" "blue" "blue" "blue" "red" "re...
[14] "blue" "blue" "blue" "blue" "red" "red" "blue" "re...
[27] "red" "blue" "blue" "blue"
}}
準備ができたので、takaokaの小学校区のクラス分けを地図にプ...
赤で囲まれた青の地区は、「川原地区」です。
sageへの入力:
#pre{{
graph = preGraph("schoolDistrict.pdf")
r('plot(takaoka, col=col)')
postGraph(graph, fac=0.8)
}}
&ref(th_schoolDistrict.png);
** データ替えて同じ計算をする [#f3df4804]
最初のデータの読み込みを以下のように6月のデータに替えて、...
平成27年6月地区別世帯数及び人口集計表に対して同じ計算を行...
#pre{{
d = pd.read_excel('http://www.city.takaoka.toyama.jp...
}}
これが、Sageを使った「リプロデューシブルリサーチ」です。
Sageは、実行可能なドキュメントなので、入力のExcelファイル...
別のデータに同じような分析を実行することができるのです。
** コメント [#ve498b7a]
#vote(おもしろかった,そうでもない,わかりずらい)
皆様のご意見、ご希望をお待ちしております。
#comment_kcaptcha
ページ名:
SmartDoc