定期船とびしまの運航予報データ

定期船とびしまの運航予報はどれくらい当たる?過去データで検証してみた

定期船とびしまの運航予報はどれくらい当たる?過去データで検証してみた

2025-05-12 プログラム

 私は趣味で飛島に関する情報発信を行っており、飛島観光サイトや、定期船の運航予報を通知するボットを運営しています。

毎日のルーティンとして、「とびしま」のXアカウントに投稿される5日分の運航予報を、データベースに記録しています。

そんな日々の中で、ふと疑問が湧きました。

「この運航予報って、実際どのくらい当たってるんだろう?」

幸い、私は予報と実績の両データを記録していたので、それを使って検証してみることにしました。

出航予報の取り扱いルール

定期船とびしまのpost
  • 1日2便ある場合は、よりポジティブな予報(○>△>×)をその日の予報とします。(上の画像の場合、5日の予報は△としています。)
  • 1日2便ある場合で、1便が出航、もう1便が欠航だった場合は「出航した」とみなします。
  • 「着発」「延発」も「出航」として扱います。
  • 2025年1月28日から2025年5月17日までのデータを対象とします。

使用データ

使用したテーブルは以下の通りです。

飛島のdb1

table1: 出航予報(1日1行、予報は5日分)

飛島のdb2

table2: 実際の出航状況(便ごとに1行)

比較用ビューの作成

まずは、運航予報と実際の運航状況を比較するため、母体となる、1日~5日前の運航予報と当日の実際の運航状況を列に持つビューを作成します。

コピーしました!
SELECT t1.idx, t1.date, t1.forecast_d1, t1.forecast_d2, t1.forecast_d3, t1.forecast_d4, t1.forecast_d5,
CASE
WHEN SUM(t2.status IN (1, 2, 3)) > 0 THEN 1
WHEN SUM(t2.status = 0) > 0 THEN 0
ELSE NULL END AS status
FROM table1 t1
INNER JOIN table2 t2 ON t1.date = t2.date
GROUP BY t1.idx, t1.date, t1.forecast_d1, t1.forecast_d2, t1.forecast_d3, t1.forecast_d4, t1.forecast_d5
ORDER BY t1.idx;

出航状況は1日分にまとめて集計(1つでも出航していれば出航とする)

出航率の算出コード

たとえば、前日の予報(`forecast_d1`)ごとの出航率を集計するSQLは以下のようになります。

コピーしました!
SELECT
forecast_d1,
COUNT(*) AS total,
SUM(CASE WHEN status = 1 THEN 1 ELSE 0 END) AS departures,
ROUND(SUM(CASE WHEN status = 1 THEN 1 ELSE 0 END) / COUNT(*) * 100, 1) AS departure_rate_percent
FROM view
GROUP BY forecast_d1
ORDER BY forecast_d1;

実行すると…

1日前の予報のデータ

このようにして、「○」「△」「×」それぞれの予報がどのくらい実際の出航につながったかを分析しました。

結果(1日前〜5日前の予報別の出航率)

×
1日前100%83.3%6.3%
2日前100%66.7%9.5%
3日前92.9%52.6%12.1%
4日前86.2%54.2%9.6%
5日前83.3%51.6%14.0%

1日前と2日前に注目すると、予報が○の場合、100%出航しています。

また、△も全て50%以上の出航率であることから、定期船とびしまの運航予報は全体的にネガティブ気味であることが推測できます。

最後に

 定期船とびしまのXアカウントで発信されている運航予報は、あくまでも“予報”です。おそらく観光客の方や地元の方の参考になれば…という、善意で続けられている取り組みなのではないかと感じています。

なお、今回使っている予報データはすべて手入力でコツコツ記録したものです。できる限り正確に整理していますが、人の手でやっている以上、多少のミスはあるかもしれません。その点はご了承ください。

少しでも、船に乗るかどうか迷っている方の判断材料になれば嬉しいです!

みっつーみっつー

会話の後に待っているのは……反省会(ソロ)