20190428横浜2

Pythonでスクレイピング 横浜港客船入港を分析:基本・初心者向け練習課題

Pythonで基本的なスクレイピングや解析を一緒に行ってみましょう。
題材は”横浜港客船入港”です。基本・初心者向けの記事なります。

---------------------------------------------------------------------

ニュースを見ていたら連休初日に大型クルーズ客船が4隻も横浜港に入港したそうです。多くのクルーズ船が寄港する横浜港でも同時に4隻も着岸するのは初なのだそうで、そして、それは国内でも初めてなのだそうです。10連休はさすがに違いますね。

私の知り合いも昨年、横浜ープサンのクルーズを楽しんでいました。クルーズ船は動く豪華ホテルとも言われますが、最近は価格も下がり、ファミリー層から仕事を引退した団塊の世代まで幅広い世代で人気が高まっているということで、クルーズ船で1泊以上の旅をした日本人はのべ31万5千人余りと、過去最多となったそうです。

下記の画像、リンクは毎日新聞社さんのニュースです。


”事前にそんな大きな船が横浜に来るのが分かっているのなら、子供を連れて横浜港大桟橋に見学・遊びにに行ったのに、、”という声を耳にして、いや、それ事前にわかっているから、、と思いました。

そういった情報は横浜港客船入港予定(2019年スケジュール)にすでに出ているのです。

どんな船が、いつ入港して、どこにいくかはウェブ上にでているのですが、どの船が一番入港しているのでしょうか?
何月が一番入港する船が多いのでしょうか?
目的地・第一寄港地としてはどこが一番多いのでしょうか?

こういったことは、Pythonで分析してみましょう。

解析にはいつも通りGoogle Colaboratoryのpythonを使います。
Chromeブラウザ上で無料で、簡単に解析を行うことができますので、ありがたいですね。お勧めのツールです。


前回とは違いプログラムと解析を一つずつ見ていきましょう。

import pandas as pd
tables = pd.read_html('https://www.city.yokohama.lg.jp/kanko-bunka/minato/kyakusen/nyuko/2019.html', flavor='bs4', header=0)

print(len(tables))
for i in range(len(tables)):
    print(i)
    display(tables[i])

Pythonのスクレイピングです。横浜港客船入港予定のウェブページを指定したうえで、どのような情報があるかをとりあえず、確認してみます。
12個のテーブルがあることを確認し、その中身を表示しています。

画像1

月ごとのデータに分かれているようですね。

まずは分割されているDataTableを結合してみましょう。

df_all=pd.DataFrame()
for i in range(len(tables)) :
  df_all=pd.concat([df_all,tables[i]])
  
display(df_all.head(3).append(df_all.tail(3)))
display(df_all.info())

画像2

164行のデータがあり、月、入港(着岸)、出港(離岸)、着岸場所、客船名、前港、次港 といった情報があることが分かります。

では、どんな船が何回入港しているのでしょうか。以下のコードで確認できます。

print(df_all["客船名"].nunique())
      
for index, value in df_all["客船名"].value_counts().iteritems():
    print(index, ': ', value)

23
ダイヤモンド・プリンセス : 33
飛鳥Ⅱ : 30
ぱしふぃっくびいなす : 27
にっぽん丸 : 21
MSCスプレンディダ : 10
セレブリティ・ミレニアム : 7
オーシャン・ドリーム : 5
ウエステルダム : 4
スペクトラム・オブ・ザ・シーズ : 4
クイーン・エリザベス : 3
ノルウェージャン・ジュエル : 2
スター・レジェンド : 2
クァンタム・オブ・ザ・シーズ : 2
マースダム : 2
アザマラ・クエスト : 2
サン・プリンセス : 2
コスタ・ネオロマンチカ : 2
アルバトロス(初入港) : 1
プロフェッサー・クロモフ : 1
マジェスティック・プリンセス : 1
アザマラ・クエスト(初入港) : 1
マースダム(初入港) : 1
コロンバス(初入港) : 1

船名としては23種類、最も寄港が多いのは
ダイヤモンド・プリンセス の 33回で、それ以降は
飛鳥Ⅱ の 30回、ぱしふぃっくびいなす の 27回 と続くようです。

日本を代表するような豪華客船ですね、、一月に二回以上寄港・クルーズしている感じでしょうか。


次は何月の寄港・クルーズが多いのか調べてみましょう。なんとなく、この4,5月の連休と夏休みあたりが多そうな気がしますが、実際どうでしょうか。

for index, value in df_all["月"].value_counts().iteritems():
    print(index, ': ', value)  

4 : 28
5 : 22
8 : 21
7 : 16
3 : 15
9 : 14
10 : 13
1 : 10
11 : 8
6 : 6
12 : 5
2 : 4
7 : 2

やはり、4月、5月の連休が多いですね、、8月、7月も多いですが、7月の2回が大文字で入手されているようで、一番下にも見えているのはまあ、誤差ということで。

最後に目的地、第一寄港地はどこが多いのでしょうか。

for index, value in df_all["次港"].value_counts().iteritems():
    print(index, ': ', value)

神戸 : 19
横浜 : 14
清水 : 12
名古屋 : 11
函館 : 10
鳥羽 : 8
シャンハイ : 7
プサン : 6
仙台 : 5
那覇 : 5
未定 : 5
二見 : 4
四日市 : 4
大阪 : 4
鹿児島 : 3
石巻 : 3
宮之浦 : 3
広島 : 3
秋田 : 3
新宮 : 2
小樽 : 2
青森 : 2
釧路 : 2
フィリピン : 1
浦河 : 1
長崎 : 1
酒田 : 1
熊野 : 1
宮古(岩手) : 1
館山 : 1
油津 : 1
御前崎 : 1
常陸那珂 : 1
博多 : 1
宮古島 : 1
小豆島 : 1
大洗 : 1
キールン : 1
船川 : 1
下津(和歌山) : 1
小松島 : 1
ナウィリウィリ : 1
蒲郡 : 1
糸島 : 1
ホノルル : 1
高松 : 1
伊東 : 1
尾鷲 : 1
東京 : 1
室蘭 : 1

やはり、日本を代表する港町、神戸が一番みたいですね。友人が参加したプサンは上位ではありますが、一番ではなかったようです。


もうちょっといろいろ調べようと思ったりもしたのですが、”次の休みはクルーズらしいわよ。”という声が聞こえたので、そっと、ブラウザを閉じて終了にしました。笑 Pythonで簡単なコードでいろいろ調査できますね。

--------------------------------------------------------------------------------------
2020/04/06 追記
まさかのコロナでクルーズ船の需要がこんなに落ちるとはこの記事を書いたときには思っておりませんでした。2020年4月の時点での昨年との比較を行ってみたいと思います。前回は2019年のデータでしたので、2020年のデータとして、スクレイピングします。

import pandas as pd
tables2020 = pd.read_html('https://www.city.yokohama.lg.jp/kanko-bunka/minato/kyakusen/nyuko/2020.html', flavor='bs4', header=0)
print(len(tables2020))
for i in range(len(tables2020)):
   print(i)
   display(tables2020[i])
df2020_all=pd.DataFrame()
for i in range(len(tables2020)) :
 df2020_all=pd.concat([df2020_all,tables2020[i]])
 
display(df2020_all.head(3).append(df2020_all.tail(3)))
display(df2020_all.info())  

画像3

3月と4月は入港はなかったようですね、、数字だけではわかりにくいので、グラフにして可視化してみましょう。

import matplotlib.pyplot as plt
fig = plt.figure()
plt.rcParams["font.size"] = 18
fig, (ax1 ,ax2 )= plt.subplots(2,1,figsize=(10,9), 
                                     gridspec_kw = {'height_ratios':[1, 1]},sharex=True)
ax1.hist(df_all["月"].astype(int), bins=50)
ax2.hist(df2020_all.dropna()["月"].astype(int), bins=50)

fig.show()

画像4

上段が2019年、下段が2020年です。
5月以降はまだ確定してないのでしょうけど、昨年のゴールデンワークとの比較では全滅というか、観光業大きな問題でしょうね。

8月の夏休みも期待薄ですから、問題ですね。
早期のコロナの終息が期待されます。

--------------------------------------------------------------------------------------

Pythonで資産運用モデルを作成する記事をまとめました。
Pythonを用いて、株価取得、チャート表示、株価分析、可視化、株価予測、株価の機械学習、ポートフォリオの構築、ポートフォリオの最適化、スクレイピングなどを行う記事を集めました。
もし興味を持っていただけるなら読んでみてください。


面白かった、役に立った、ほかの人にも伝えたい!と思えたら、このnoteのフォローと、ツイッターで@AnalyseTfフォローしてくれるととてもうれしいです!

サポートしていただき大変ありがとうございます。 励みになります。