蛇ノ目の記

技術のことも。そうでないことも。

OverpyでOpenStreetMapのデータを取得して位置情報を可視化する話

4月末に近づいた頃にようやく今月初めての記事。あまりに書かなすぎた。

だいぶ前になるけど、OpenStreetMap(OSM)からガソリンスタンドの位置情報を取得してプロットしたデータアートめいた画像を見た。なにこれかっこいい。

地図ではなく全くの白紙にプロットしてるにも関わらず、欧州・北アフリカの海岸線や主要道路が見て取れる。

あまりにかっこいい画だったので日本でも似たようなことをやってみた。緯度経度をそのまま座標としてプロットしただけで日本列島とわかる姿になる。沖縄だけでなく東京都の島嶼部なんかも確認できる。

gas stations in Japan

今回のリポジトリはこちら。

github.com

OSMからデータを取得するライブラリ

openstreetmap pythonなどと検索するとosmapiがヒットする。しかしこちらはOSMにデータを書き込む用途に向いたライブラリ。

データの取得だけが目的なのであればoverpyを使うのがよい。

A Python Wrapper to access the Overpass API.

とあるようにOverpass APIPython用ラッパーだ。

Overpass API is 何

公式Wiki - Overpass APIには以下のようにある。

Overpass API(別名 OSM3S)とは読み出し専用のAPIであり、OSM地図データの中から個別に選択された部分を取り出します。Webを介したデータベースとして動作します。利用者はAPIに対してクエリを送り、クエリに対応したデータ セットを受け取ります。

クエリはOverpass QLと呼ばれ、OSMからデータを読み出すためのSQLのようなものといえる。

公式Wiki - Overpass API/言語ガイド

OSMのデータには、駅や店舗、施設などを表すノード、道路や河川、鉄道路線を表すウェイ、ノードとウェイを組み合わせたリレーションがあるようだ。

Overpass QLを書いてみる

東京都にあるガソリンスタンドを抽出するOverpass QLを書いてみる。

area["name"~"東京都"];
node(area)["amenity"="fuel"];
out;

WebベースのOSMデータマイニングツールOverpass turboでの(実行結果)http://overpass-turbo.eu/s/yb9にアクセスしてクエリを実行すると取得結果をOSM上で確認できる。

データ取得範囲は area["name"~"東京都|神奈川県"];のように|で区切ることで複数指定できる。新宿区といったより細かい範囲も指定可能。

node(area)["amenity"="fuel"]; でノードの種類を指定している。OSMではキー=値という形のタグでオブジェクトに情報を与えている。OSMのタグ情報はtaginfoが詳しい。

鉄道の駅であれば "railway"="station"、コンビニは"shop"="convenience"と指定する。ただ、コンビニの場合はコンビニエンスストア以外の小さな商店なども含まれているようなので、主要なコンビニリストを作ってノードの他のタグnameをフィルタリングしたりする必要がありそう。

overpyを使ってみる

overpyでデータを取得してシリアライズするスクリプトを書いた。

pickleではシリアライズできなかったのでpickleの拡張モジュールであるdillを使った。

日本全国を範囲指定するので、都道府県を並べたテキストファイルの中身を結合してクエリに突っ込んでいる。

overpass_plot/script at master · NaoY-2501/overpass_plot · GitHub

from datetime import datetime
import os

import dill
import overpy


def get_prefs():
    prefs = ''
    with open('pref.txt', mode='r') as f:
        for row in f.readlines():
            prefs += '{}|'.format(row.rstrip()) 
    return prefs[:-1]


def input_node_info():
    key = input('Input node key:')
    tag = input('Input tag of key:')
    return key, tag


def save_result(result, key, tag):
    now = datetime.now()
    date = '{}{}{}'.format(now.year, now.month, now.day)
    filename = 'data/{}-{}_{}.pkl'.format(date, key, tag)
    
    print('Save as {}'.format(filename))
    
    if not os.path.exists(filename):
        with open(filename, 'wb') as f:
            dill.dump(result, f)
        print('Save complete.')

        
def fetch_result(key, tag):
    api = overpy.Overpass()
    prefs = get_prefs()
    query = (
        'area["name"~"{prefs}"];\n'
        'node(area)["{key}"="{tag}"];\n'
        'out;'
    ).format(prefs=prefs, key=key, tag=tag)
    print('Fetch query...')
    result = api.query(query)
    print('Fetch complete')
    save_result(result, key, tag)


def main():
    key, tag = input_node_info()
    fetch_result(key, tag)


if __name__ == "__main__":
    main()

bokehでプロットする

可視化にはズームして、分布を細かく見たいという理由でbokehを使った。実際にやってみると重くてズームしづらいことに気づいた。bokehがGitHub上ではプレビューできないので保存した画像を貼る。

駅の分布

stations in Japan

駅をプロットするので自然と路線そのものが浮かび上がっている。

コンビニの分布

convenience stores in Japan

流石にコンビニ全国各地にありすぎだろ……。小さい商店なんかも含まれてることが想像できるので、これは見直す必要がある。

というわけでOSMラッパーライブラリOverpyの紹介と実験結果の話だった。

みんなのPython勉強会スタッフ業で長野出張してきた

startpython.connpass.com

長野で行われたみんなのPython勉強会 in 長野 #2にメンター手伝いとして参加してきた。

の4つのグループに分かれて、それぞれ開発する会。スプリントといいつつ、もくもく会に近いけどメンターがいるのでもくもく会ともちょっと違う勉強会だった。

祝日かつ寒い日に14人も集まっていただいて感謝。

Webグループのメンター手伝いにアサインされていたのでDjangoで色々作っている中学生のサポートをすることになるも、彼は自分でガンガン進めていくすごい中学生だったので横に座ってひたすらJupyter notebookを触っていた。Webグループのメンター手伝いとは一体。

彼はDjangoWebサービスを作るだけでなくDiscord botを作ったり草コインと呼ばれる価値がとても安い暗号通貨のチェックをしているらしい。デジタルネイティブ世代やばい。14年くらい前の俺はHTML書くのが精一杯だったぞ……。

他のグループの話。ビギナーとハードウェア。

人数が最も多いのはビギナーで、今日プログラミング始めましたレベルから学校で使ってますレベルなど。ビギナーも一緒に長野のPythonを盛り上げていってほしい(コミュニティスタッフ並感)。

ハードウェアのLTでは山の中に置いたデバイスとIoT用SIMを使って、AWSに観測データを送るという自然が多い長野ならではのIoTトークを聴くことができた。

東京の#stapyでも手を動かす系のイベントやったら楽しそう(メンターやるPython猛者と強いWiFiのある会場が必要そう)。

次回の#stapyは4/3(火)。どうぞよしなに。

startpython.connpass.com

みんなのPython勉強会#33に行った

startpython.connpass.com

1週間も経ってしまったけどまとめる。

大津雄一郎(リブロワークス)

プログラミング『超入門書』から見るPythonと解説テクニック

本を書く人は周りに結構いて話を聞けるけど、編集する側からの話はなかなか聞けない。

単なる入門書から、プログラムが書けることで何ができるかを体験させていく体験重視の超入門書の時代に入っているらしい。そのなかでもPython本はここ数年ブームが来ているそうな。確かに本屋の技術書コーナーに行くとPython本が目立つ(Pythonな会社・コミュニティに関わっているので著者を知っている本もちらほらある)。

以下、編集プロダクションから見たプログラミング言語の特徴。

Pythonは文法が簡単でインデントに厳しいので綺麗に書けて入門者に向く反面、GUIが作りにくいので目に見えて触れるモノづくりを体験させづらいのが弱点だとか。まあ確かに。Webアプリ作るならできるけどゲーム製作などとなると弱い。

一方、JavaScriptは簡単にゲームなどが作れる反面、仕様の変化が激しいのが弱点。JSを使っているわけではないけど変化が激しいというイメージがある(だから入門しにづらいと勝手に思っている)。

C#はUnityがあるお陰で触れるモノづくりにとても強いそう。UnityのGUI+コードの組み合わせ。社畜ちゃんとかニンジャスレイヤーのゲームでUnity製のがあったようななかったような。

一昔にプログラミング言語の定番だったCやC++は、簡単に覚えられる言語がは多いため超入門書の題材にはしにくい。そういやNewGameのねねっちはC++でゲーム作ってたな。

超入門書の定番テクニックとして、

  • 図解

  • ステップバイステップ写経

という2つがあるそう。図解は言わずもがな。

後者は一つのプログラムを少しづつ写していって、段階ごとに成果を見れるようにするというもの。小出しの説明で覚えやすいことがメリットということだけど、達成感を少しづつ積み上げることでモチベの維持もできるんじゃないかと思った。

わざと失敗例を先に見せることで、処理の必要性が伝えやすくなる。テクニックもある。これは僕が仕事でPyQの問題文・解説の追記やら修正をしていく中でも実践してみた。前もって失敗例・アンチパターンを紹介することで、ユーザに正しい書き方や使い方をスムーズに説明できると思う。

次に流行りそうな言語は?という質問が会場から飛んだけど、そういう本が書かれ始めてから編集側がわかることなので、なかなか言えないそう。Python人気はしばらく続きそうとのこと。よかった。

岩崎 圭 (@laughk, 株式会社SQUEEZE)

入門書を読み終わったらなにしよう?

Python と WebAPI の使い方から学ぶ次の一歩〜

@laughkさん。スラスラわかるPythonの著者の1人。

プロジェクターは無事動いた(身内ネタ)。

入門書を一冊一通りやった初学者は次にどうすればいいのって話。

3つの方法がある。

  1. 入門書の内容をカスタムしてみる

  2. 次のレベルの書籍

  3. 実践的なコードを書いてみる

今回の話では3. 実践的なコードを書いてみるを紹介。

とはいえ、いきなり実践的と言われても困ってしまうのが初学者の気持ち。そこで、自分がやりたいこと・日々のタスクの自動化を提案。

laughkさん自身はその日にしたPullRequestをSlackに通知するプログラムを書いた。実際に取り組むステップは以下の通り

  1. 課題を見つける

  2. 課題の解決に必要な登場人物を洗い出す(ここではGitHub API, Slack API)

  3. 登場人物のことを知る(ドキュメントを軽く読む)

  4. Pythonインタラクティブシェルを使って雑にライブラリを試す

  5. 3と4を繰り返して自分が欲しい機能の使い方を探る

  6. エディタを立ち上げて書く

なにより、とにかく書いてみるを大切にする。これが大事。ほんと。

ドキュメントってだいたい英語で最初は怯むけど、自分に必要なところはピンポイントだったりするし、なんならQuick Startとかを読むだけで解決したりする。

清原 弘貴 (DjangoCongress JP 2018 代表)

Pythonを学んだ人にWebもオススメしたい理由

ky氏。5月19日に開催される日本で初めてのDjangoカンファレンスDjangoCongress2018の代表としての登壇。

Djangoに触れる前に、Web開発そのものについての話。個人の開発で作った価値を世界中に広げることができるのがWeb。 ではどうやってPythonでWebで価値を共有するのか。そこで出てくるのがフルスタックフレームワークであるDjango。 connpassもPyQもInstagramDjangoを使っている。みんながDjangoの友達という言葉が印象深い。

Pythonといえば最近はデータサイエンスの文脈で存在感が増していて、スクレイピングでWebからデータを集めて前処理をして機械学習をしたりする。 具体的なパッケージでいえばScrapy, Pandas, Scikit-learnだ。PythonのパッケージなのだからこれらをまとめてDjangoの中で実現することで Webと機械学習の組み合わせができる。データサイエンスに強いPythonだからこそできることで、作れるモノの幅はとても広い。

最後にPythonの他のWebフレームワークにも触れた。難易度順でいえばBottle, Flask, Django, Pyramid。前の2つは軽量フレームワークなのであまり規模の大きいWeb開発には向かない (個人的にはデータ系の人がさくっとデータの可視化なんかをやるのによさそうと思っている)。こうしてみるとDjangoのバランスのよさがわかる。

質疑応答では、Django入門に適した本に関する質問があった。英語であればあるけど、日本語書籍はとても少ない。しかし近い未来に出る、かも知れないとか。気になる。

Webへの熱い気持ちが伝わってくる話だった。

ky氏の発表はとても聞きやすい。話し方に余裕がある。

自分が発表するときは早口になりがちなので参考にしたい。


勉強会後の二次会にて「みんなのPython勉強会 in 長野 #2」のメンター手伝いをすることが大決定したので、3月21日は長野に行ってくる。

startpython.connpass.com

第85回#pyhackに行ってきた

今月もPython mini Hack-a-thonに行ってきた。

pyhack.connpass.com

先月は冬山合宿だったので通常開催は今年初。

前回の冬山合宿から手を付け始めたゼロから作るDeep Leaningの続きをやる予定だったがしばらく放置していたせいで思いの外、忘れていたので復習が主になった。

ということで3章までの復習(1章はNumpyの使い方が主なのでさらっと)。 2章(パーセプトロン)~3章(ニューラルネットワークのソフトマックス関数あたりまで)を、これまでMarkdownで書いていてダサかった数式をTexコマンドで書き直すなどしていた。Jupyter notebookでまとめているのだけど、後から読み直したり公開したりすることを考えると読みやすい方がいい。

TeXコマンドを使うのが初めてだったので { で場合分けする数式の表現なんかで少し苦戦した。学生のときに覚えておけばよかった。

github.com

Djangoを勉強しはじめた人の疑問に答える場面があったけど、力及ばず@aodagさんの力を借りることとなった。Django力の足りなさを痛感した。Class-based viewsなんかをわかるようになっておきたい。

みんなのPython勉強会#32に行った話

みんなのPython勉強会#32に行ってきた。

startpython.connpass.com

今回の内容は

  • Kubernetes

  • Kaggle

  • Network Embedding

「Kubernetesのエコシステムとその影響」

Dockerも触ったことないインフラ面弱すぎマンとしてはKubernetesの話のレベルがかなり高かった……。あ、KubernetesってK8Sって略すらしいっすよ(唯一、把握できたこと

「Road to kaggle master」

機械学習コンペプラットフォームであるKaggleの話。 めざせKaggleマスター。コンペ上位10%に入るともらえるメダルが集まるとマスターになれる仕組みみたい。賞金付きのコンペもあるので興味湧いてくる。

  • 初級編

  • 中級編

  • 上級編

に分かれていて聞きやすかった。

  • 初級編

Kaggleに入門したらまずはTitanicの生存者予測のコンペをやるのがよさそう。他のユーザのコードが公開されているので、チュートリアルして参考にすると捗りそう。

初級者がハマるのはXgboostというアルゴリズム。これは高い精度が出るので、意味もわからず使ってしまうという罠があるみたい。

  • 中級編

中級者の課題は、特徴量の抽出とバリデーションセットの構築。

コンペで使うデータセットから以下に特徴量を抽出するか。Jupyter Notebookで可視化して効いてきそうな値を探したりする。

バリデーションセットは特に時系列データの際に注意が必要。 学習データ・バリデーションセットで未来と過去を分ける工夫をしたりする。

  • 上級編

上級まで来ると、機械学習モデルをコンペの評価指標へ最適化してさらに高いスコアを目指す。そのためにはアルゴリズムの理解・ハイパーパラメータの調節が必要になってくる。

「いまNetwork embeddingが熱い!」

複雑ネットワーク科学の話。 学生時代に少しだけ複雑ネットワークに絡むことをやっていたので熱が入る。

WWWの構造や交友関係、細胞の代謝ネットワークまでが複雑ネットワークという構造になっている。

ネットワークが表現する対象をノード、繋がりをエッジと呼ぶ。WWWならWebサイトがノードでリンクがエッジ。

細胞から人間関係、インターネットまでが同じ構造になっていると考えるとロマンがすごい。

複雑ネットワークの性質として2つ挙げる。

  • 膨大なリンクを持つ極わずかなノード(ハブ)・大してリンクが持ってない大多数のノード

  • ネットワークの規模によらず全てのノード同士は数ステップで繋がっている

6次の隔たり」という例がある。世界中のどの人同士も約6人の知り合いを介して繋がっている、というもの。日本でPythonエンジニアやってる人とサバンナで携帯使ってるマサイ族の人が6人で繋がるようなことになる。実際に繋がるかは置いておいて、これを可能にするのが膨大なリンクを持つノードと理解している。何千何百の知り合いがいる人と繋がっていれば、その先にいる人が地球の裏側にいることも全然あり得るだろう。それを繰り返すと、日本のPythonエンジニアからマサイ族に到達する。

ハブの役割に着目して伝染病の感染をモデル化するといった応用事例がある。

複雑ネットワークにはBetweeness Centralityという値がある。和訳すると媒介中心性。辻さんのスライドの引用が以下。

自分以外のノード間の接続に、自分がどれくらいの影響度合いで関わっているかを表現

この値を使うと、ネットワーク内になるコミュニティ検出ができる。Twitterでいうところの〜クラスタ。この値が高いノードはコミュニティ間の橋渡し役になっていると考えられ、そこを基準にすればネットワークからコミュニティ構造を探し出せる。

複雑ネットワークの考えをWeb開発に応用すると、「この商品を買った人はこれも買っています」「あなたのフォロワーはこの人をフォローしています」ができるようになる。購入履歴やフォロー状況をベクトル化して、ネットワーク構造をつくる。これがNetwork Embedding。

実際のECサイトSNSのノードはあまりに膨大。しかし購入した商品やフォローしているユーザはそのごく一部で、ベクトル化したときに次元がやたら大きいだけでほとんどの値が0になる。コンピュータに計算させるときにもつらいので、ぐっと縮約する。そこでDeep Learningが使われているらしい。Deep Autoencoderという。そして縮約したデータを機械学習に使うとか。

複雑ネットワークを応用することで、実世界の様々な物事を機械学習アルゴリズムで扱うことができそう(小並感

複雑ネットワークの本としては、この分野の第一人者アルバート=ラズロ・バラバシによる「新ネットワーク思考」がわかりやすいし面白い。学術書ではなく科学読み物なのでハードルもそんなに高くないのでおすすめ。

LT

エディタで書いたMarkdown形式のスライドをGitで管理して公開までできるGitPitchの紹介と布教をするLTをやった。

GitPitch Presents: github/NaoY-2501/GitPitch-Slides

雪山合宿に行ってきた話とライブに行ってきた話

#pyhackの雪山合宿に行ってきた。普段のもくもく会は常連だけど合宿は今回が初参加。

pyhack.connpass.com

長野県菅平のペンション マウンテンパパで行われた。

@terapyonの車に乗せてもらって、御徒町から出発。12時半に上田駅近くの蕎麦屋かたなやで昼食。ビールやつまみを買い出ししてからペンションへ、という流れ。

ゼロから作るDeep Leaningを進めたり、美味しいごはんとビールを堪能しまくったりした。

ゼロからDeepは第3章ニューラルネットワーク、手書き数字のクラス分類実装の辺りまで進捗。難しい数式を出さず、かつ(基本的に)NumpyとMatplotlibだけを使ってスクラッチで実装していくスタイルで解説する大変さは想像して余りある。しかしそのお陰で本当にわかりやすい。これからも徐々に進めていきたい。

1/17に発売された「プログラマの数学 第2版」も持っていったけど、こちらは読み始めることができず。腰を据えて一冊に挑むのがいいのかもしれない。

せっかく雪山に来たので雪だるまを粗製乱造したりもした。

雪だるま作りって性格出る……。

今回の学び

  • かたなやの蕎麦はボリュームが半端ない。

  • 合宿で進める本は一冊に絞るのがいいかも

  • 合宿スタイルはすごく進捗出る

  • マウンテンパパのご飯は美味しい

合宿自体は21日までだけど、siraphのライブがあったので一足早く帰ってきた。次の夏山合宿はフルで参加したい。

siraphは同人音楽やアニソンで活躍するAnnabelを中心にしたバンド。バンドメンバーが豪華。 siraph - Wikipedia

レコ発ならぬ酒発とかいう謎ライブ。大和川酒造とコラボしてラベルをsiraph仕様にした日本酒のお披露目的な。ロックバンドと酒蔵がいつどこで知り合ったのかは誰も知らない。

今回はゲストとしてシンガーソングライターのkidlitがバックコーラスとして参加。kidlitも好きなのでテンション上がったし、今後ツインボーカルの曲が作られたらすごく嬉しい。

最後にクロスフェードデモを貼って布教。きちんとしたMVを作るのがsiraphの今年の目標のうちの一つだとか。


siraph Xfade demo


【siraph】「quiet squall」クロスフェード

ブログ初めには遅すぎた

新年明けました。おめでとうございます。

ゼルダにドハマりしたり風邪ひいたりしているうちに仕事が始まり、気付けば2018年も2週間が経過していました。

ゼルダは全然進んでない。オープンワールドにありがちな寄り道をしすぎて本筋を見失う現象が発生している。

新年に入ってからの出来事をば。

1/10のみんなのPython勉強会 #31で登壇してきました。

Pythonでスタートして、Pythonを仕事にするまでの話というエモめなやつ。転職するまでの話とかBPに入ってからの話、それとPythonコミュニティについての話。

GitPitch Presents: github/NaoY-2501/GitPitch-Slides

LT以外で喋るのは初めだったのでえらく緊張した。これからも登壇するチャンスがあればきっちり拾っていきたいし、そのためには素振りしておかないとならない。実のところ、今年に入ってから趣味の開発をなにもできていない。networkXを使ってみるとか、今度こそ機械学習を勉強するとか色々やりたいことはあるのになかなか手を付けられずにいる。まあ焦っても仕方ないので、のんびりいこう。

2018年の目標をいくつか並べて遅すぎたブログ初めを締めたい。

  • 積んである技術書を消化する

  • ブログをもっと書いていく

    • 最低でも週に1本は書いておきたい
  • 本に関わる

    • レビューに関わる

    • 書く実績を解除する

  • Python基礎力を上げる

  • 仕事で機械学習に関わりたい

最後のは目標というか願望になってる。

2018年もよろしくお願いします。