発表しました。
Yahoo! JAPAN名古屋で行われてる名古屋検索勉強会の#2で発表しました。
検索技術の基礎 (原著名:Introduction to Information Retrieval)、第2章 用語語彙とポスティングリスト、をまとめたものになります。
資料はこちら。
https://speakerdeck.com/takinou0/ming-gu-wu-jian-suo-mian-qiang-hui-number-2
e-Statからの人口メッシュデータダウンロード
背景とか
人口メッシュデータが欲しかったので、eStatのメッシュデータを見に行きました。(https://www.e-stat.go.jp/gis/statmap-search?type=1) で、ダウンロードのためにボタンを一つ一つクリックするのが面倒くさかったので、curlで実装。
一番面倒くさかったのは、地域メッシュ情報を抜き出すところだったと思う。ここは手実行しか思いつかなかった。。。 抜け漏れあるかもしれないので、漏れてたら指摘ください。 ↓のサイトの数字を見ながら抜き出し。。。 (https://www.e-stat.go.jp/sites/default/files/pdf/gis/primary_mesh_jouhou.pdf)
あと、離島については、一次メッシュ情報は定義されているものの、データがないらしくってzipの中身がエラーになるようなので、そこはご承知ください。
実行環境
コマンド
下記コマンドは、2015年国税調査 => 4次メッシュ(500mメッシュ) => その1 人口等基本集計に関する事項、を落とすように作っています。 他の情報が欲しい場合は、ダウンロードボタンのURL確認してアレンジしてください。
あと、1つダウンロードするごとに5秒sleepにしてます。 まぁ、気長にやってください。
array=("6840" "6841" "6842" "6847" "6848" "6740" "6741" "6742" "6747" "6748" "6641" "6642" "6643" "6644" "6645" "6646" "6647" "6540" "6541" "6542" "6543" "6544" "6545" "6546" "6439" "6440" "6441" "6442" "6443" "6444" "6445" "6339" "6340" "6341" "6342" "6343" "6239" "6240" "6241" "6243" "6139" "6140" "6141" "6039" "6040" "6041" "5939" "5940" "5941" "5942" "5839" "5840" "5841" "5738" "5739" "5740" "5741" "5636" "5637" "5638" "5639" "5640" "5641" "5531" "5536" "5537" "5538" "5539" "5540" "5541" "5432" "5433" "5435" "5436" "5437" "5438" "5439" "5440" "5332" "5333" "5334" "5335" "5336" "5337" "5338" "5339" "5340" "5229" "5231" "5232" "5233" "5234" "5235" "5236" "5237" "5238" "5239" "5240" "5129" "5130" "5131" "5132" "5133" "5134" "5135" "5136" "5137" "5138" "5139" "5029" "5030" "5031" "5032" "5033" "5034" "5035" "5036" "5038" "5039" "4928" "4929" "4930" "4931" "4932" "4933" "4934" "4939" "4828" "4829" "4830" "4831" "4839" "4728" "4729" "4730" "4731" "4739" "4740" "4629" "4630" "4631" "4529" "4530" "4531" "4540" "4429" "4440" "4328" "4329" "4229" "4230" "4128" "4129" "4142" "4027" "4028" "4040" "4042" "3926" "3927" "3928" "3942" "3823" "3824" "3831" "3841" "3724" "3725" "3741" "3622" "3623" "3624" "3631" "3641" "3653" "3036") i=0 for e in ${array[@]}; do echo "array[$i] = ${e}" curl "https://www.e-stat.go.jp/gis/statmap-search/data?statsId=T000847&code=${e}&downloadType=2" --output "$HOME/Documents/${e}.zip" sleep 5 let i++ done
参考文献
名古屋データ分析もくもく会 #6, #7公開しました
詳細はこちらのリンク先ご覧ください。
--
以下、定型文
各自もくもくと、勉強したり、プログラムを作成したり、報告資料を作ったりします。
データ分析という名前をつけていますが、そこまでテーマは固定しなくていいかなと思ってます。
統計でもいいし、機械学習でもいいし、何作っててもいいです。
とりあえず、主催者は名古屋市営地下鉄の乗車数の重回帰分析モデル作っている気がします。
会場
セルフカフェ神沢店 (愛知県名古屋市緑区神沢一丁目205)
桜通線 神沢駅 1番出口すぐ
参加費
無料
ただし、セルフカフェ利用料として、自販機から何かをご購入ください。(200〜300円くらい)
タイムスケジュール
13:00-17:30 もくもく作業
17:30-17:45 やったこと発表
18:00 自由解散
(なお、頑張りたい方は22時までもくもくできます)
遅刻、早退、自由です。
休憩は適宜自由にとってください。
用意していただくもの
・勉強や作業に使うもの
一応Free WiFiはありますが、WiMAX等をご準備いただいたほうが無難かなと思います。
無料の電源あります。ただし、数に限りあり。
注意事項
他のお客さんもいますので、もしかすると混み合うこともあるかもしれません。 そこはすみませんが、ご了承ください。
愛知県の電車+徒歩でいける範囲まとめ
なんで作ろうと思ったか
東山線の名古屋駅・伏見駅間に新駅(柳橋新駅)を作るとか作らないという話を名古屋市がしてるので、新駅がないとあの辺をぶらぶら歩くのがしんどいのかどうかを検証してみました。
あと、高辻のあたりって徒歩で移動すると死ぬよねー、とか、豊明市とみよし市の境あたりって鉄道全然ないから、桜通線伸ばして三河豊田まで到達させるとハッピーな人多いんじゃないかな? みたいのも示そうかと思いました。(収益性についての話はさておき)
実行環境
macOS 10.14.2
Anaconda 1.9.4 でjupyter notebokを起動。
あと、foliumはAnacondaで初期インストールされてなかったので、pip3 install foliumでインストールしてます
地図データはhttp://www.ekidata.jp/のデータを利用。再配布OKと規約に書いてあるので、githubにそのまま載せてます。 使いたい場合は、https://github.com/takinou/station_sim/blob/master/datas/ekidata.jp/station20180330free.csvから落としてください。
その他前提
半径800mを駅から歩ける距離として採用。不動産会社としては、徒歩10分 = 800mらしいので。
愛知県に所在する駅データだけを元にしてるので、岐阜・三重・静岡の駅は乗ってません。
コード
import folium import pandas as pd #駅からの距離を設定 RADIUS=800 #名古屋市の全体を表示してみる mp_Nagoya = folium.Map(location=[35.14, 136.9064], zoom_start=12) mp_Nagoya #愛知県も作る mp_Aichi = folium.Map(location=[35.0, 137.25], zoom_start=10) mp_Aichi df_free = pd.read_csv("./datas/ekidata.jp/station20180330free.csv") #愛知県だけのデータに絞る df_free=df_free[df_free['pref_cd']==23] #駅からの半径で色ぬり #ちなみに、Circleだとm単位、makeCircleだとpixel単位で色ぬりするらしい。 for i,row in df_free.iterrows(): folium.Circle( [row['lat'], row['lon']], radius=RADIUS, popup=row['station_name'], color='#3186cc', fill_color='#3186cc', ).add_to(mp_Nagoya) folium.Circle( [row['lat'], row['lon']], radius=RADIUS, popup=row['station_name'], color='#3186cc', fill_color='#3186cc', ).add_to(mp_Aichi) mp_Nagoya mp_Aichi
結果
こんな感じ
柳橋駅(の候補地)
一応、徒歩圏内に入っているけれど、名鉄名古屋駅・近鉄名古屋駅・JR名古屋駅・地下鉄名古屋駅・地下鉄丸の内駅・地下鉄伏見駅からみて円の縁にギリギリかかっているかどうかという感じなので、アクセスが悪いといえば悪いかもしれない。
でも国際センター駅から徒歩5分くらいのエリアに含まれてるので、やっぱ問題ない気はする。ほらわがまま言わず桜通線使いなさいよ桜通線。
名古屋全体
地下鉄のおかげもあってだいたいのエリアが徒歩圏内に収まっているけれど、中川運河のあたりと高辻のあたりは、車がないとしんどい。 庄内川の沿線もしんどい。 あと、市東部のあたりもところどころおっきな空白地帯があるのでしんどそう。
愛知県全体
東三河は車がないと生きていけない。。。
あと、やっぱみよし市と豊明市のあたりがすっぽり空白。名古屋市近郊エリアなのにここだけ線路網が薄い。市内でも人口多いエリアなのに。。。 桜通線を三河豊田駅まで伸ばしてくれると嬉しい。
参考にしたところ
名古屋の駅乗者数で単回帰分析 #2
前回までと反省
前回までは以下を参照 https://qiita.com/takinou/items/5cd236ef05c68304f09b
データ数確保のために、1990年とか2000年とか、古い時期のデータも入れていたのだけど、未開設の駅もそのまま放り込んでいたのでよくないと思った。 そこに何の路線も通っていないよ、だから利用者0人だよ、と言うのは正しいには正しいんだけど、データ的にはゴミじゃね? と言うことで除外することにする。
コードはここ。
https://github.com/takinou/station_sim/blob/master/2_simple_linear_regression_nonzero.ipynb
前回と変えたところ
路線数が非0のデータだけを元データとして採用する。
Nagoya_Station_data=Nagoya_Station_data[Nagoya_Station_data['lines']!=0]
散布図からも0が消えたことを確認。
あとは前回と同様に、単回帰分析をしてみる。
結果
np.corrcoef(nz_datas['lines'], nz_datas['josha_num']) array([[1. , 0.85435272], [0.85435272, 1. ]])
0.85だった。 前回は0.82なのでちょっと改善
回帰直線と散布図を見比べてみるとこんな感じ。
決定係数
決定係数は0.73だった。 前回は、0.68だったので、ちょっと改善。 やっぱ適当なデータは入れるべきではないなぁ。
名古屋の駅乗者数で単回帰分析
目的とか
pythonの練習 兼 回帰分析の練習 兼 趣味の一環。 名古屋の鉄道駅の乗車数で単回帰分析をやってみました。
ファイル置き場とか
コードはここ。 https://github.com/takinou/station_sim/blob/master/1_simple_linear_regression.ipynb
元データは名古屋市が公開してくれている統計なごやweb版を利用しています。 オープンソースは幸せ。http://www.city.nagoya.jp/somu/page/0000068179.html そのまま使うとpythonで読み込めないので、以下のような形式に修正しています。
駅名, 年, その年の乗車数, 使える路線名1, 使える路線名2, ... , 利用可能な路線数
加工した後の乗車数データはこちら。 https://github.com/takinou/station_sim/blob/master/datas/Nagoya_Station_data.csv
まずはデータについて
import numpy as np import pandas as pd import matplotlib.pyplot as plt Nagoya_Station_data = pd.read_csv("./datas/Nagoya_Station_data.csv")
こんな感じのデータです。 ここでは地下鉄 大曽根を記しています。地下鉄の名城線(meijo)と名港線(meiko)が使えるのでフラグを立て、利用線数(lines)は2です。 JR大曽根と、名鉄大曽根は別の行で定義しています。
名鉄は本当は名古屋本線、常滑線、犬山線、など分けなければいけないかなと思ったのですが、そうすると名古屋駅や金山駅など、何線利用という定義にするべきかわからなくなった為、どこも1線としています。
year | station_no | station_name | josha_num | ward_office | meijo | meiko | kamiida | higashiyama | tsurumai | sakuradori | aonami | tokaido | chuo | kansai | meitetsu | kintetsu | lines | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 1991 | 0 | 大曽根 | 4785428.0 | 0 | 1.0 | 1.0 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 2 |
1 | 1992 | 0 | 大曽根 | 4660204.0 | 0 | 1.0 | 1.0 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 2 |
2 | 1993 | 0 | 大曽根 | 4592223.0 | 0 | 1.0 | 1.0 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 2 |
3 | 1994 | 0 | 大曽根 | 4669642.0 | 0 | 1.0 | 1.0 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 2 |
地下鉄、JRなどをgroupbyで合算する
今のままだと地下鉄千種駅と、JR千種駅とかが別々になっているので、groupbyで合算する
datas = Nagoya_Station_data.groupby(['station_name','year'])[['josha_num','lines']].sum() #こんな感じになります josha_num lines station_name year いりなか 1991 3632472.0 1 1992 3549946.0 1 1993 3572420.0 1 2013 2614891.0 1 2014 2589814.0 1 2015 2613444.0 1 ささしまライブ 2004 119622.0 1 2005 882339.0 1 2006 194865.0 1 2007 195160.0 1 2008 170932.0 1 黒川 2011 4723563.0 2 2012 4845255.0 2 2013 4943361.0 2 2014 4939585.0 2 2015 5069276.0 2 ナゴヤドーム前矢田 1991 0.0 0 1992 0.0 0 1993 0.0 0 1994 0.0 0
利用路線数、年間乗車数をプロットしてみる
直感通り、利用路線数が多いと乗車数多い
datas.plot(x='lines',y='josha_num', kind='scatter')
linesの8と9は名古屋駅。あおなみ線ができる前とできた後 内訳は、 1.東山線 2.桜通線 3.近鉄線 4.名鉄線 (数え方がしんどいので、名古屋本線に1本化) 5.JR東海道線 6.JR中央線 7.JR関西線 8.新幹線 9.あおなみ線
相関係数を測ってみる
np.corrcoef(datas['lines'], datas['josha_num']) array([[1. , 0.82618746], [0.82618746, 1. ]])
0.82なので、かなり高い。
単回帰分析にかける
X=datas.lines.values #Xと同じ長さの列を作成して、1埋めする A = np.vstack([X, np.ones(len(X))]).T Y = datas.josha_num.values #傾きa, 切片bを求める a,b = np.linalg.lstsq(A,Y,rcond=None)[0] print(a,b) 16512584.716035834 -15260790.749897148
係数 16512584.716035834 切片 -15260790.749897148
回帰直線とplotを比較してみる
#推定Yのplot X2 = np.arange(0, 10, 0.01) plt.plot(X2, a*X2 + b) plt.plot(X,Y,'ro')
割と頒布図に沿っているように見えるが、駅数8,9(名古屋駅)のところに大きな乖離が見える。。。
決定係数を手計算する
#残差計算 child = ((datas['josha_num'] - (datas['lines']*a + b))**2).sum() #分母の計算 mother = ((datas['josha_num'] - datas['josha_num'].mean())**2).sum() #決定係数 R = 1 - child / mother 0.6825857266199629
決定係数が0.68なので、適当にやった割にはいい数字が出た。