ラベル edx の投稿を表示しています。 すべての投稿を表示
ラベル edx の投稿を表示しています。 すべての投稿を表示

2018年6月19日火曜日

プログラミング学習:edx UCバークレー データサイエンス基礎講座、第2弾受講中(python)

前に、プログラミング学習:edx UCバークレー データサイエンス基礎講座の紹介(python)という記事を書きました。このコースは引き続き学習を続けており、現在、第1弾を修了し、第2弾を受講しているところです。学習記録としてどんなことをやっているか書いておきます。

edx UC Berkeley Foundations of Data Science(UCバークレー データサイエンス基礎講座)
https://www.edx.org/professional-certificate/berkeleyx-foundations-of-data-science

前回も書きましたが、このコースは3段階に分かれていて、第1弾がComputational Thinking with Python(pythonによるプログラミング的思考)、第2弾がInferential Thinking by Resampling(リサンプリングによる推論的思考)です。

このコースではpythonを使って演習を行っていきますが、ここではpandasなどの一般的なものではなく「datascience」という独自モジュールを使います。

datascienceモジュール ドキュメント
http://data8.org/datascience/index.html
コースinfrastructure
http://data8.org/#infrastructure

datascienceモジュールはpandas、Matplotlib、Foliumを簡単に使えるようにしたものという感じで、pandasのスライスなど複雑な処理はできない代わりに、分かりやすく迷わず使えるようになっています。一般的なモジュールを使わないことには賛否両論ありそうですが、このコースはデータサイエンスの基礎を学ぶものであり、pythonなど特定の言語を学ぶものではないという方針のようです。

ただ、独自モジュールを使うことで、プログラミング方法による混乱や学習についていけなくなる可能性を減らすという効果がある反面、学習したことを応用するのは難しくなってしまいます。このため、私はpandasなどの一般的なモジュールを使って演習をやり直ししています。

各国の女性の平均就学期間をグラフ化する。(python,pandas)
http://eneprog.blogspot.com/2018/05/pythonpandas.html
サンフランシスコのレンタサイクルのデータを見てみる(基本統計量ヒストグラム)
http://eneprog.blogspot.com/2018/05/pythonpandas_17.html
サンフランシスコのレンタサイクルのデータを見てみる その2。よく使われているステーションを調べる
https://eneprog.blogspot.com/2018/05/pythonpandasgroupbypivottable.html
サンフランシスコのレンタサイクルのデータを見てみる その3。地図上に可視化
https://eneprog.blogspot.com/2018/05/pythonpandasgroupbypivottable.html

これらは全てコース演習ではdatascienceを使って解いたもの。datascienceを使うと簡単にできていたものがpandas等ではできなかったりと意外と苦労しました。datascienceモジュールはpipでインストールできますので、興味のある方は使ってみてください。

第1弾ではプログラミング的思考ということで、データ処理の方法や可視化などがありましたが、第2弾では標本、ランダム化、検定など統計の話が主になっています。データの見方や有効性の判断などの学習になっていて、プログラミング学習と思ってやると期待はずれになるかもしれません。プログラミング学習のコンテンツは多いですが、こういった統計などの講義は少なく、これから役に立つのではないかと思っています

講義では、上記の女性の就学期間、レンタサイクルのデータのほか、乳幼児死亡率の推移、死刑制度による重犯罪の抑止など社会科学的な題材を多く扱っています。実際のデータを見て動かしながら解説しており、興味深いです。

このコースの講義は英語で行われていて、第1弾ではそれほど難しい話もなく付いていけていたのですが、第2弾では統計用語などが多くなり、一度聞いただけでは理解できなくなってきました。分からない語があるたびに動画を止め、調べたりしているので時間がかかってしまっています。

また、このコースでは一つ一つの講義にdiscussionがあり活発に使われています。



ちょっと分からないなと思うところがあれば、ほとんどの場合discussionに質問や回答があり、助けられています。ティーチングアシスタントも時々回答に加わっていて、このような教え合いの場はオンライン学習にはとても有効だと感じています。

オンライン学習というのはなかなか続けるのは難しく、さらに英語というのはハードルが高いですが、何とかこのコースを続けていけているのは内容が面白いからというのが大きいように思います。カリキュラムや学習方法がよく練られている上に、動画講義自体も退屈ではなく、興味を持続させる工夫がされているようです。

まとまりのない記事になってしまいましたが、コースの内容と現状の記録です。7月10日からは第3弾 Prediction and Machine Learning(予測と機械学習)が始まります。最後までやり遂げられるようにがんばります。

参考:
edx
https://www.edx.org/
UCバークレー データサイエンス基礎講座
https://www.edx.org/professional-certificate/berkeleyx-foundations-of-data-science

プログラミング学習:edx UCバークレー データサイエンス基礎講座の紹介(python)
https://eneprog.blogspot.com/2018/04/edx-uc-python.html

各国の女性の平均就学期間をグラフ化する。(python,pandas)
http://eneprog.blogspot.com/2018/05/pythonpandas.html
サンフランシスコのレンタサイクルのデータを見てみる(基本統計量ヒストグラム)
http://eneprog.blogspot.com/2018/05/pythonpandas_17.html
サンフランシスコのレンタサイクルのデータを見てみる その2。よく使われているステーションを調べる
https://eneprog.blogspot.com/2018/05/pythonpandasgroupbypivottable.html
サンフランシスコのレンタサイクルのデータを見てみる その3。地図上に可視化
https://eneprog.blogspot.com/2018/05/pythonpandasgroupbypivottable.html

2018年5月24日木曜日

サンフランシスコのレンタサイクルのデータを見てみる その3。地図上に可視化(python、pandas、folium、Map)

edX UCバークレー データサイエンス基礎講座(Foundation of Data Science)の演習、前回の続きです。

サンフランシスコ ベイエリアのレンタサイクル "Ford Go Bike"の利用状況を把握する。

今回はこのうち、ステーションの可視化を行います。

元データ
サンフランシスコ ベイエリア レンタサイクル Ford Go Bike
https://www.fordgobike.com/
システムデータ
https://s3.amazonaws.com/fordgobike-data/index.html
2017年のトリップデータ(このデータを使います)
https://s3.amazonaws.com/fordgobike-data/2017-fordgobike-tripdata.csv

・foliumのインストール
!pip install folium

地図上への可視化はfoliumを使います。インストールされていなければpip installで入れてください。ちなみに今回インストールしたバージョンは、folium 0.5.0でした。他の方のブログ記事等を見ると、関数などが大幅に違っているようなのでバージョンをご確認ください。

・インポートとデータの読み込み
import numpy as np
import pandas as pd
import matplotlib
import matplotlib.pyplot as plt

import folium
trips = pd.read_csv('tripdata.csv')
trips.head()
duration_secstart_timeend_timestart_station_idstart_station_namestart_station_latitudestart_station_longitudeend_station_idend_station_nameend_station_latitudeend_station_longitudebike_iduser_typemember_birth_yearmember_gender
0801102017-12-31 16:57:39.65402018-01-01 15:12:50.245074Laguna St at Hayes St37.776435-122.42624443San Francisco Public Library (Grove St at Hyde...37.778768-122.41592996Customer1987.0Male
1788002017-12-31 15:56:34.84202018-01-01 13:49:55.6170284Yerba Buena Center for the Arts (Howard St at ...37.784872-122.40087696Dolores St at 15th St37.766210-122.42661488Customer1965.0Female
2457682017-12-31 22:45:48.41102018-01-01 11:28:36.8830245Downtown Berkeley BART37.870348-122.267764245Downtown Berkeley BART37.870348-122.2677641094CustomerNaNNaN
3621722017-12-31 17:31:10.63602018-01-01 10:47:23.5310608th St at Ringold St37.774520-122.4094495Powell St BART Station (Market St at 5th St)37.783899-122.4084452831CustomerNaNNaN
4436032017-12-31 14:23:14.00102018-01-01 02:29:57.5710239Bancroft Way at Telegraph Ave37.868813-122.258764247Fulton St at Bancroft Way37.867789-122.2658963167Subscriber1997.0Female

データの読み込みと確認。ここまで前回と同じです。start、endステーションそれぞれに緯度(Latitude)・経度(Longitude)の情報が入っています。データ数は約52万件です。ステーションはstart、end共有なので、今回はstartステーションの情報を使うことにします。

・データの抽出、重複除去
stations=trips[["start_station_name","start_station_latitude","start_station_longitude"]]
stations=stations.rename(columns={'start_station_name': 'station','start_station_latitude':"lat","start_station_longitude":"long"})
stations=stations.drop_duplicates()

stations.head()
stationlatlong
0Laguna St at Hayes St37.776435-122.426244
1Yerba Buena Center for the Arts (Howard St at ...37.784872-122.400876
2Downtown Berkeley BART37.870348-122.267764
38th St at Ringold St37.774520-122.409449
4Bancroft Way at Telegraph Ave37.868813-122.258764

tripsからステーション名、緯度、経度を取り出し、renameで列名を変更、drop_duplicates()で重複を取り除きました。272件のステーション情報が取得できました。

・前回作ったデータの確認
common_start.head() 
Start Stationstart_count
0San Francisco Ferry Building (Harry Bridges Pl...13338
1San Francisco Caltrain (Townsend St at 4th St)12320
2San Francisco Caltrain Station 2 (Townsend St...11890
3The Embarcadero at Sansome St11861
4Market St at 10th St11577

前回作ったデータフレーム"common_start"を使います。開始ステーション名と利用回数が入っています。

・データベースの結合、並べ替え
stations_startcount=pd.merge(stations,common_start, left_on='station', right_on='Start Station').drop("Start Station",axis=1)
stations_startcount=stations_startcount.sort_values(by=["start_count"],ascending=False).set_index(["station"])

stations_startcount.head()
latlongstart_count
station
San Francisco Ferry Building (Harry Bridges Plaza)37.795392-122.39420313338
San Francisco Caltrain (Townsend St at 4th St)37.776598-122.39528212320
San Francisco Caltrain Station 2 (Townsend St at 4th St)37.776639-122.39552611890
The Embarcadero at Sansome St37.804770-122.40323411861
Market St at 10th St37.776619-122.41738511577

pd.mergeで2つのデータフレームを結合します。結合する列名がstation、Start Stationと異なっているので、left_on、right_onで指定します。結合後には両方の列が残るので、片方(Start Station)をdropで削除しました。sort_valuesで利用回数の多い順に並べ替えてデータは完成。

いよいよ地図に表示させます。下記ページが大変参考になりました。
folium quickstart
け日記 Python: foliumで地図を描画する
Qiita Folium: Pythonでデータを地図上に可視化
・foliumでのマップ表示とマーカーの配置
map_osm = folium.Map(location=[37.792714,-122.248780],zoom_start=8)

for i, r in stations_startcount[0:100].iterrows():
    folium.Marker(location=[r['lat'], r['long']], popup=r['station']).add_to(map_osm)
                     
map_osm

folium.Mapでオブジェクトを作成。locationで中心の座標、zoom_startでズームを指定しています。Markerで各マーカーの座標とポップアップで表示させる文字を指定し、add_toで先に作成したMapオブジェクトに追加します。

全部で272のステーションがあるのですが、全てを描かせようとすると途中で止まってしまったため、今回は利用回数の多い順、100件を表示させています。

出力


インタラクティブ地図が表示されました。マーカーをクリックするとステーション名が表示されます。サンフランシスコ市内に多くのステーションがありますが、対岸のオークランド、それにサンノゼにもあるようです。(前述のとおり、利用回数が多い100件のみの表示であることに注意)

・地図の保存
map_osm.save('index.html')

できた地図はsaveでhtml形式で保存ができます。

・マーカーの色を変更
map_osm = folium.Map(location=[37.795392,-122.394203],zoom_start=14)

k=1
for i, r in stations_startcount[0:100].iterrows():
    if k<=10:
        icon_color="red"
    else:
        icon_color="green"
        
    folium.Marker(
        location=[r['lat'], r['long']],
        popup=r['station'],
        icon=folium.Icon(color=icon_color)
    ).add_to(map_osm)
    
    k=k+1
                 
map_osm

利用の多い10件を赤色で、そのほかを緑のマーカーで表示させてみました。folium.Iconで色が変更できます。マーカーに「i」の表示が出てしまいましたが、最初の地図と同じマーカーで色を変える方法が分かりませんでした。

・円の大きさで表示
map_osm = folium.Map(location=[37.795392,-122.394203],zoom_start=12)

for i, r in stations_startcount[0:100].iterrows():

    folium.Circle(
        location=[r['lat'], r['long']], 
        radius=r["start_count"] / 20,
        popup=r['station'],
        color='#3186cc',
        fill_color='#3186cc', 
        fill=True,
    ).add_to(map_osm)
    
map_osm   

最後に利用回数を円の大きさで表します。folium.Circleで円の表示、radiusで円の半径を指定します。利用回数は最大約13000回で、この数字では大きすぎて円が表示されなかったので、20で割っています。

color、fill_colorで色の指定、fillでTrueにしないと塗りつぶしされないのでご注意を(デフォルトでは塗りつぶし無し)

出力

サンフランシスコ市内の数ヶ所の利用回数が非常に大きくなっています。オークランド、サンノゼでの利用はサンフランシスコと比べて少ないようです。

foliumでは比較的簡単にインタラクティブ地図が作れて楽しいです。

参考:
folium quickstart
https://python-visualization.github.io/folium/quickstart.html
け日記 Python: foliumで地図を描画する
https://ohke.hateblo.jp/entry/2018/03/02/230000
Qiita: Folium: Pythonでデータを地図上に可視化
https://qiita.com/nanakenashi/items/824c0cb16860ca59a424

edx UC Berkeley Foundations of Data Science(UCバークレー データサイエンス基礎講座)
ttps://www.edx.org/professional-certificate/berkeleyx-foundations-of-data-science
Computational Thinking with Python(pythonによるプログラミング的思考)
https://www.edx.org/course/foundations-data-science-computational-uc-berkeleyx-data8-1x

サンフランシスコ ベイエリア レンタサイクル Ford Go Bike
https://www.fordgobike.com/
システムデータ
https://s3.amazonaws.com/fordgobike-data/index.html

プログラミング学習:edx UCバークレー データサイエンス基礎講座の紹介(python)
https://eneprog.blogspot.com/2018/04/edx-uc-python.html
サンフランシスコのレンタサイクルのデータを見てみる(基本統計量、python、pandas、ヒストグラム)
https://eneprog.blogspot.com/2018/05/pythonpandas_17.html
サンフランシスコのレンタサイクルのデータを見てみる その2。よく使われているステーションを調べる(python、pandas、groupby、pivot_table)
https://eneprog.blogspot.com/2018/05/pythonpandasgroupbypivottable.html
プログラミング学習:pandasでweb上の表を取得する。(python)
https://eneprog.blogspot.com/2018/04/pandaswebpython.html プログラミング学習:各国の女性の平均就学期間をグラフ化する。(python,pandas)
https://eneprog.blogspot.com/2018/05/pythonpandas.html
//SyntaxHighlighter CDNより https://cdnjs.com/libraries/SyntaxHighlighter // 対応言語