発表しました。

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の中身がエラーになるようなので、そこはご承知ください。

実行環境

macOS Mojave(10.14.2)のbashで実施

コマンド

下記コマンドは、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

参考文献

https://qiita.com/b4b4r07/items/e56a8e3471fb45df2f59

名古屋データ分析もくもく会 #6, #7公開しました

詳細はこちらのリンク先ご覧ください。

nagoya-stats.connpass.com

nagoya-stats.connpass.com

--

以下、定型文

各自もくもくと、勉強したり、プログラムを作成したり、報告資料を作ったりします。

データ分析という名前をつけていますが、そこまでテーマは固定しなくていいかなと思ってます。

統計でもいいし、機械学習でもいいし、何作っててもいいです。

とりあえず、主催者は名古屋市営地下鉄の乗車数の重回帰分析モデル作っている気がします。


会場

セルフカフェ神沢店 (愛知県名古屋市緑区神沢一丁目205)

桜通線 神沢駅 1番出口すぐ




参加費

無料

ただし、セルフカフェ利用料として、自販機から何かをご購入ください。(200〜300円くらい)


タイムスケジュール

13:00-17:30 もくもく作業

17:30-17:45 やったこと発表

18:00 自由解散

(なお、頑張りたい方は22時までもくもくできます)



遅刻、早退、自由です。

休憩は適宜自由にとってください。


用意していただくもの

・勉強や作業に使うもの

一応Free WiFiはありますが、WiMAX等をご準備いただいたほうが無難かなと思います。

無料の電源あります。ただし、数に限りあり。


注意事項

他のお客さんもいますので、もしかすると混み合うこともあるかもしれません。 そこはすみませんが、ご了承ください。

愛知県の電車+徒歩でいける範囲まとめ

なんで作ろうと思ったか

東山線名古屋駅伏見駅間に新駅(柳橋新駅)を作るとか作らないという話を名古屋市がしてるので、新駅がないとあの辺をぶらぶら歩くのがしんどいのかどうかを検証してみました。

あと、高辻のあたりって徒歩で移動すると死ぬよねー、とか、豊明市みよし市の境あたりって鉄道全然ないから、桜通線伸ばして三河豊田まで到達させるとハッピーな人多いんじゃないかな? みたいのも示そうかと思いました。(収益性についての話はさておき)

実行環境

その他前提

  • 半径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分くらいのエリアに含まれてるので、やっぱ問題ない気はする。ほらわがまま言わず桜通線使いなさいよ桜通線reachable_Yanagibashi.jpg

名古屋全体

地下鉄のおかげもあってだいたいのエリアが徒歩圏内に収まっているけれど、中川運河のあたりと高辻のあたりは、車がないとしんどい。 庄内川の沿線もしんどい。 あと、市東部のあたりもところどころおっきな空白地帯があるのでしんどそう。 reachable_Nagoya.jpg

愛知県全体

東三河は車がないと生きていけない。。。

あと、やっぱみよし市豊明市のあたりがすっぽり空白。名古屋市近郊エリアなのにここだけ線路網が薄い。市内でも人口多いエリアなのに。。。 桜通線三河豊田駅まで伸ばしてくれると嬉しい。 reachable_Aichi.jpg

参考にしたところ

Python: foliumでJupyter Notebookに地図を描画する - け日記

Folium: Pythonでデータを地図上に可視化 - Qiita

名古屋の駅乗者数で単回帰分析 #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が消えたことを確認。 sample.png

あとは前回と同様に、単回帰分析をしてみる。

結果

相関係数

np.corrcoef(nz_datas['lines'], nz_datas['josha_num'])
array([[1.        , 0.85435272],
       [0.85435272, 1.        ]])

0.85だった。 前回は0.82なのでちょっと改善

回帰直線と散布図を見比べてみるとこんな感じ。 graph2.png

決定係数

決定係数は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')

Unknown.jpg

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')

Unknown.png

割と頒布図に沿っているように見えるが、駅数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なので、適当にやった割にはいい数字が出た。