Lesson 304

X04 広島県クルーズ需要の港別・季節別構造分析

X04クルーズ市場構造集中度Gini季節係数RQ×3Format B
所要 50〜70分 / 想定レベル: L01 水準 (中級) / データ: DoBoX #1282 しまたびライン (resource 39787) + #1280 モニタークルーズ (resource 39782 + 39781)

データ取得手順

⚠️ このスクリプトは自動取得に対応していません。以下のデータセットを DoBoX から手動でダウンロードし、data/extras/ 以下に保存してください。

IDデータセット名
#666dataset #666
#888都市計画区域情報_区域データ_安芸高田市_行政区域
#999dataset #999
#1280せとうちモニタークルーズ実施結果
#1282瀬戸内しまたびライン利用状況

実行コマンド:

cd "2026 DoBoX 教材"
python -X utf8 lessons/X04_cruise_intervention_timeseries.py

DoBoX のオープンデータは申請不要・商用/非商用とも利用可。 data/extras/.gitignore 対象(約 57 GB のキャッシュ)。 スクリプト実行で自動再生成されます。

学習目標と問い

【本記事は 2026-05 改訂版】
旧 X04 (2026-05 以前) は 2022 年 12 月のせとうちモニタークルーズ実証実験を 「介入パルス」 とみなし、しまたびライン 8 ヶ月のベースラインに対する DID 風前後比較で 「介入効果」 を推論しよう としていた。 しかし以下の方法論的問題があり、研究としての妥当性が確保できなかった:
  • (1) 介入イベント n = 1 で因果推論不可 (反復観測なし)。
  • (2) ベースライン傾き |a₁| が小さく、|差|/|a₁| が 約 200 倍 (19919%) に発散して 効果サイズの解釈が成立しない。
  • (3) コロナ禍・季節・天候・経済環境の交絡が一切統制されていない。
  • (4) DID 風と称しながら 平行トレンド前提が検証不可能。
本改訂では因果推論を装う構成を 全面廃案にし、同一データセット 2 件 (#1282 + #1280) を用いた 記述統計 + 市場構造分析に転換する。 3 つの研究角度 (RQ1/RQ2/RQ3) を Format B で並列に立てる。
【本記事のスタイル: 単独 3RQ 形式 (Format B) / 記述統計 + 市場構造分析】
1 記事の中で 3 つの独立した研究角度を並列に進める。 各 RQ は単独で読める単元を成し、全体として広島県沿岸クルーズ需要の 3 軸プロファイルを形成する。

本記事は、DoBoX が公開する 瀬戸内クルーズ関連 2 データセット記述統計 + 市場構造分析の枠組みで読み解く。

このレッスンで答えたい問い (3 軸の RQ)

RQ位置付け問い使うデータ
RQ1主研究 広島県沿岸クルーズ需要は 14 港にどう配分されているか? 集中度はどの程度か? 主要港 vs 周辺港 の役割分化は? #1282 (港 × 月)
RQ2副研究 1 需要の季節性は春秋 2 山型か? 港別差はあるか? #1282 (港 × 月 季節係数)
RQ3副研究 2 モニタークルーズ実施結果のルート設計を記述する。 新規/既存区間の混合、寄港数、運航日分布は? 因果推論はしない (n = 1)。 #1280 (航路 × 寄港地 × 運航日)

立てた仮説 (H1〜H5)

用語の独自定義 (このレッスン専用)

到達点

3 つの RQ を順に追体験することで、学習者は次の 3 つの分析手法を身につける: (1) 集中度指標 3 種 (Gini / HHI / CRn) の使い分け、 (2) 季節係数による港別パターン正規化と振幅比較、 (3) ルート構成データの記述分析 (区間混合比 + ルートタイプ分類)。 広島県沿岸クルーズ市場が 「主要港 5+ 港 + 周辺港 9 港」 × 「春秋 2 山 + 冬の谷」 × 「東に延伸する実験ルート」の 3 構造でできていることを 1 つの一貫したデータ物語として 把握する。

使用データ

改訂理由 (再掲): 旧 X04 は n=1 の介入効果分析を試みていたが、 方法論的に成立しないため 記述統計に転換。同じ 2 データセットを 3 つの記述研究角度 (RQ1/RQ2/RQ3) で読み直す。

本レッスンは DoBoX オープンデータ 2 件を使う:

DoBoX IDデータ名本記事での役割形式サイズ
#1282 瀬戸内しまたびライン利用状況 (resource 39787) RQ1 / RQ2 の主データ — 港 × 月 の乗降客数 CSV (cp932)24 行 × 17 列 (3 KB)
#1280 せとうちモニタークルーズ実施結果 (resource 39782) RQ3 の主データ — 航路 × 寄港地 × 運航日 CSV (cp932)133 行 × 11 列 (16 KB)
#1280 (補) モニタークルーズ寄港地マスタ (resource 39781) 23 寄港地の住所・緯度経度・区間情報 CSV (cp932)23 行 × 8 列 (3 KB)

サイズの整理 (要件L: 表示と次元の混同を防ぐ):

段階行数列数説明
原データ shimatabi_monthly.csv2417 2 航路 × 14 桟橋 = 24 行 (頭末に NaN 行あり, 除去後)。月列 9 個 (4-12月)。
原データ cruise_monitor_daily.csv13311 7 航路 × 平均 8 寄港地 × 平均 2 運航日 = 133 行。1 行 = 1 (運航日, 寄港地)。
長表 long_df (本記事生成)2167 (航路, 港, 月) のタプルごとに 1 行。
港×月 集約 port_month1263 東/西航路を合算し (港, 月, 乗降客数) に圧縮。RQ1/RQ2 の主表。
港別年間 port_yearly145 14 港 × (順位, 港名, 年間客数, シェア, 累積)。
港×月 季節係数 (pivot)14 港9 月 係数 = 港m / 港年平均。1.0 = 港の年平均水準。
モニタールート route_records7 航路11 各航路の寄港数・新規率・運航日数・観光客数集計。
モニター航海 trip15 航海3 1 行 = 1 (運航日, 航路) = 1 航海 (= 観光客数 1 値)。

「14 港」 と 「7 航路」 と 「23 寄港地」 は別物。 14 港 = しまたび東/西航路の港 (2022 年定常運航)、 23 寄港地 = モニタークルーズの寄港地 (2022 年 12 月実証, 14 港の一部 + 新規 9 港)、 7 航路 = モニタークルーズで運航された航路。

データ実態の重要事項: DoBoX のデータセットページには複数の resource が登録されており、 本記事で使う時系列 CSV は resource_id 39787 (#1282)resource_id 39782 (#1280)。 データセット ID で検索した場合の 先頭リソースは別のファイル (港マスタ・SHP)なので注意。 本記事のスクリプトは resource_id を直接指定して取得する。

ダウンロード (再現用データ・中間データ・図)

原データ (DoBoX)

論題データセットresource_download 直 DL保存先形式サイズ
瀬戸内しまたびライン 月次 DoBoX #1282 直DL (39787) data/extras/shimatabi_monthly.csv CSV (cp932)3 KB
モニタークルーズ 日別 DoBoX #1280 直DL (39782) data/extras/cruise_monitor_daily.csv CSV (cp932)16 KB
モニタークルーズ 寄港地マスタ DoBoX #1280 直DL (39781) data/extras/cruise_monitor_ports.csv CSV (cp932)3 KB

個別取得 (PowerShell, このレッスンだけ):

cd "2026 DoBoX 教材"
iwr "https://hiroshima-dobox.jp/resource_download/39787" -OutFile "data/extras/shimatabi_monthly.csv"
iwr "https://hiroshima-dobox.jp/resource_download/39782" -OutFile "data/extras/cruise_monitor_daily.csv"
iwr "https://hiroshima-dobox.jp/resource_download/39781" -OutFile "data/extras/cruise_monitor_ports.csv"

本レッスンの .py スクリプトは、データが無ければ ensure_dataset() で自動取得してから処理を始める。

本レッスン生成の中間 CSV (HTML から直 DL)

図 PNG (HTML から直 DL)

再現スクリプト

X04_cruise_intervention_timeseries.py を以下で実行:

cd "2026 DoBoX 教材"
py -X utf8 lessons/X04_cruise_intervention_timeseries.py

【RQ1】 港別需要構造の研究 — 14 港の集中度と役割分化

研究の問い (RQ1)

広島県沿岸クルーズ需要は 14 港にどう配分されているか? 集中度はどの程度で、 主要港と周辺港の役割分化はあるか?

仮説 (再掲)

手法 (ツール視点・要件J)

(1) 集中度指標 3 種は何のツールか:

(2) 「ローレンツ曲線」 とは何のツールか:

(3) 港の役割分類 (主要 vs 周辺) の作り方:

なぜこの分析か (要件H): クルーズ需要が どう配分されているかを 1 軸 (絶対値) だけで見ると順位は分かるが分布の 偏り具合が分からない。 集中度指標 3 種 + ローレンツ曲線 + 役割分類の 4 視点で重ねれば、 「上位 3 港が約 26%」「下位 5 港で約 19%」「主要 5 港 + 周辺 9 港」 のような 多面的プロファイルが描ける。

実装

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
import numpy as np, pandas as pd

# 港 × 月 を 港別年間 に集約
port_yearly = (port_month.groupby("港", as_index=False)["乗降客数"].sum()
               .sort_values("乗降客数", ascending=False).reset_index(drop=True))
total = port_yearly["乗降客数"].sum()
port_yearly["シェア"] = port_yearly["乗降客数"] / total

# Gini 係数 (sorted ascending)
def gini_coefficient(x):
    x = np.sort(np.asarray(x, dtype=float))
    n = len(x)
    if n == 0 or x.sum() == 0: return 0.0
    return (2 * np.arange(1, n+1).dot(x) / (n * x.sum())) - (n+1)/n

gini = gini_coefficient(port_yearly["乗降客数"].values)

# HHI = Σ シェア²
hhi = (port_yearly["シェア"] ** 2).sum()

# CRn = 上位 n のシェア合計
cr3, cr5, cr10 = port_yearly["シェア"].head(3).sum(),                  port_yearly["シェア"].head(5).sum(),                  port_yearly["シェア"].head(10).sum()

# ローレンツ曲線 (昇順累積)
sorted_demand = np.sort(port_yearly["乗降客数"].values)
cum_demand = np.concatenate([[0], np.cumsum(sorted_demand)])
cum_demand_pct = cum_demand / cum_demand[-1]
rank_pct = np.arange(0, len(sorted_demand) + 1) / len(sorted_demand)

# 役割分類: 上位 5 位 ∪ 始発・終着
endpoint_ports = set()
for name, g in shimatabi.groupby("航路名"):
    g = g.sort_values("寄港桟橋順")
    endpoint_ports.add(g.iloc[0]["寄港地(桟橋名)"])
    endpoint_ports.add(g.iloc[-1]["寄港地(桟橋名)"])

port_yearly["港クラス"] = np.where(
    (port_yearly["順位"] <= 5) | (port_yearly["港"].isin(endpoint_ports)),
    "主要港", "周辺港")

1 港の Before/After 追跡 — 「ひょうたん島」 (要件K)

例として年間需要 1 位の 「ひょうたん島」を切り出し、生データ → 集計 → ランクの流れを 1 件で追跡する:

段階このデータで何が起きるかサイズ
1. 生データ (港 × 月, 東/西別) ひょうたん島 行 (東向き 1 行 + 西向き 1 行) × 月列 9 個 = 18 値 2 行 × 9 列
2. 港 × 月 集約 (東 + 西 を合算) 9 ヶ月の値: 971, 1560, 987, 630, 838, 755, 1168, 1356, 254 長さ 9 の数値列
3. 年間集計 (Σ 月) 合計 = 8,519 人1 個の数値
4. シェア計算 8.81% (= 8,519 / 96,685)1 個の数値
5. 順位 14 港中の 1 位1 個の整数
6. 役割判定 始発終着 = No かつ 上位 5 = Yes → 主要港 1 個のラベル

この表から読み取れること:

重要なデータ品質情報 (このセクションを読む前提): 本データ (#1282) は 同じ航海の通過客数を全寄港地に同値で記録する方式で作られている。 たとえば東向き航路の 5 月 752 人/月という値は、3 番目の呉港から 11 番目の瀬戸田まで 9 寄港地すべてで同じ 752として記録される。乗船 / 下船が偏在する始発・終着港 (広島港・三原) だけが他より低い値になる (= 端で乗降が発生し中継ではほぼ通過のみ)。 そのため、本記事の「港別年間需要」 は厳密には 「その港を通過した船客数 ≠ その港で実際に 乗降した人数」 である。本記事では便宜上 需要 ≈ 乗降客数 (=通過客数)として扱うが、 中継港の数値は 船のキャパ × 月数に強く拘束されることに注意。 集中度指標は港の 「サービス影響範囲」の指標と読むのが妥当で、純粋な「需要量」 ではない。

結果 (図と読み取り)

図1 (RQ1): 14 港の年間乗降客数バーチャート
図1 (RQ1): 14 港の年間乗降客数バーチャート

この図から読み取れること:

結果 (表と読み取り)

表 1-1: 港別年間乗降客数 (降順) と シェア

順位 乗降客数 シェア 累積シェア
1 ひょうたん島 8519 0.0881 0.0881
2 呉港(呉中央桟橋ターミナル) 8519 0.0881 0.1762
3 海上自衛隊呉基地沖 8519 0.0881 0.2643
4 瀬戸田(瀬戸田浮さん橋) 8519 0.0881 0.3524
5 安芸灘大橋 8519 0.0881 0.4406
6 大久野島 8519 0.0881 0.5287
7 音戸の瀬戸 8519 0.0881 0.6168
8 プリンスホテル前 7555 0.0781 0.6949
9 三原(内港客船桟橋) 7516 0.0777 0.7727
10 広島港(広島港統合桟橋) 4943 0.0511 0.8238
11 御手洗港 4448 0.0460 0.8698
12 中ノ鼻灯台 4448 0.0460 0.9158
13 下蒲刈港 4071 0.0421 0.9579
14 契島(軍艦島) 4071 0.0421 1.0000

この表から読み取れること:

表 1-2: 集中度指標 3 種 (Gini / HHI / CRn)

指標 0..1 解釈 判定
Gini 係数 0.1431 0=完全均等, 1=1 港独占 穏やかな集中
HHI (Herfindahl-Hirschman 指数, 1 ベース) 0.0769 0=分散, 0.18 以上で高集中 (米 DOJ 基準) 低集中 (HHI < 0.15)
HHI (10000 ベース) 769.0000 10000=独占, ≥1800 で高集中 (HHI 同等)
CR3 (上位 3 港シェア) 26.4000 上位 3 港が占める割合 (%) 穏やか分散
CR5 (上位 5 港シェア) 44.1000 上位 5 港が占める割合 (%) 穏やか分散
CR10 (上位 10 港シェア) 82.4000 上位 10 港が占める割合 (%)

この表から読み取れること:

表 1-3: 港の役割分類 — 主要港 vs 周辺港

順位 乗降客数 シェア 累積シェア 出現航路数 平均寄港順 中央寄港順 始発終着 港クラス
1 ひょうたん島 8519 0.0881 0.0881 2 6.5 6.5 経由 主要港
2 呉港(呉中央桟橋ターミナル) 8519 0.0881 0.1762 2 6.5 6.5 経由 主要港
3 海上自衛隊呉基地沖 8519 0.0881 0.2643 2 6.5 6.5 経由 主要港
4 瀬戸田(瀬戸田浮さん橋) 8519 0.0881 0.3524 2 6.5 6.5 経由 主要港
5 安芸灘大橋 8519 0.0881 0.4406 2 6.5 6.5 経由 主要港
6 大久野島 8519 0.0881 0.5287 2 6.5 6.5 経由 周辺港
7 音戸の瀬戸 8519 0.0881 0.6168 2 6.5 6.5 経由 周辺港
8 プリンスホテル前 7555 0.0781 0.6949 2 6.5 6.5 経由 周辺港
9 三原(内港客船桟橋) 7516 0.0777 0.7727 2 6.5 6.5 始発/終着 主要港
10 広島港(広島港統合桟橋) 4943 0.0511 0.8238 2 6.5 6.5 始発/終着 主要港
11 御手洗港 4448 0.0460 0.8698 1 6.0 6.0 経由 周辺港
12 中ノ鼻灯台 4448 0.0460 0.9158 1 5.0 5.0 経由 周辺港
13 下蒲刈港 4071 0.0421 0.9579 1 7.0 7.0 経由 周辺港
14 契島(軍艦島) 4071 0.0421 1.0000 1 8.0 8.0 経由 周辺港

この表から読み取れること:

表 1-4: ローレンツ曲線の点列 (昇順累積)

累積港数比 累積需要比
0.0000 0.0000
0.0714 0.0421
0.1429 0.0842
0.2143 0.1302
0.2857 0.1762
0.3571 0.2273
0.4286 0.3051
0.5000 0.3832
0.5714 0.4713
0.6429 0.5594
0.7143 0.6476
0.7857 0.7357
0.8571 0.8238
0.9286 0.9119
1.0000 1.0000

この表から読み取れること:

結果 (図 2 と読み取り)

図2 (RQ1): 広島県クルーズ需要のローレンツ曲線
図2 (RQ1): 広島県クルーズ需要のローレンツ曲線

この図から読み取れること:

結果 (図 3 と読み取り) — 要件 T (地理可視化)

図3 (RQ1): 14 港の地理配置と需要規模
図3 (RQ1): 14 港の地理配置と需要規模

なぜこの図か (要件H): バー (図1) では順位は見えるが 地理的位置は分からない。 緯度経度に円を配置し、円の サイズで需要色で役割を表現すると、 「広島-呉-三原を結ぶ細長い航路 + 島嶼経由地」 という空間構造が一目で読める。

この図から読み取れること:

【RQ2】 季節性の研究 — 春秋 2 山型と港別振幅

研究の問い (RQ2)

需要の季節性は 春秋 2 山型か? 港別差はあるか?

仮説 (再掲)

手法 (ツール視点・要件J)

(1) 「月別総需要」 とは何のツールか:

(2) 「季節係数 (seasonal index)」 とは何のツールか:

(3) 「季節振幅 (seasonal amplitude)」 とは何のツールか:

なぜこの分析か (要件H): 月別総需要 (図4) は 全体の山谷を見せる。 ヒートマップ (図5) は 港 × 月の細部を見せる。季節係数 (図6 左) は 港の絶対量を消したパターン形状を見せる。振幅バー (図6 右) は 港間比較を見せる。 この 4 段階で「季節性の全体 → 細部 → 形 → 港間差」 という階層的把握ができる。

実装

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
# 月別総需要 = 全港合算
month_total = port_month.groupby("月", as_index=False)["乗降客数"].sum().sort_values("月")

# 港 × 月 ピボット
pivot = port_month.pivot(index="港", columns="月", values="乗降客数")

# 季節係数 = 港m / 港年平均  (港ごとに正規化)
season_index = pivot.div(pivot.mean(axis=1), axis=0)

# 港別 季節振幅 (max - min, max/min, std)
season_amp = pd.DataFrame({
    "港": season_index.index,
    "最大月":  season_index.idxmax(axis=1),
    "最大係数": season_index.max(axis=1),
    "最小月":  season_index.idxmin(axis=1),
    "最小係数": season_index.min(axis=1),
    "振幅":    season_index.max(axis=1) - season_index.min(axis=1),
    "比率":    season_index.max(axis=1) / season_index.min(axis=1),
})

結果 (図 4 と読み取り)

図4 (RQ2): 月別総需要 — 春秋 2 山型 + 夏冬 2 谷
図4 (RQ2): 月別総需要 — 春秋 2 山型 + 夏冬 2 谷

この図から読み取れること:

結果 (表と読み取り)

表 2-1: 月別総需要 と シェア

乗降客数 シェア 季節
4 11044 0.1142
5 17665 0.1827
6 11223 0.1161
7 7214 0.0746
8 9568 0.0990
9 8565 0.0886
10 13325 0.1378
11 15265 0.1579
12 2816 0.0291

この表から読み取れること:

結果 (図 5 と読み取り)

図5 (RQ2): 港 × 月 乗降客数ヒートマップ
図5 (RQ2): 港 × 月 乗降客数ヒートマップ

この図から読み取れること:

表 2-2: 港 × 月 季節係数 (= 港m / 港年平均)

4 5 6 7 8 9 10 11 12
ひょうたん島 1.026 1.648 1.043 0.666 0.885 0.798 1.234 1.433 0.268
呉港(呉中央桟橋ターミナル) 1.026 1.648 1.043 0.666 0.885 0.798 1.234 1.433 0.268
海上自衛隊呉基地沖 1.026 1.648 1.043 0.666 0.885 0.798 1.234 1.433 0.268
瀬戸田(瀬戸田浮さん橋) 1.026 1.648 1.043 0.666 0.885 0.798 1.234 1.433 0.268
安芸灘大橋 1.026 1.648 1.043 0.666 0.885 0.798 1.234 1.433 0.268
大久野島 1.026 1.648 1.043 0.666 0.885 0.798 1.234 1.433 0.268
音戸の瀬戸 1.026 1.648 1.043 0.666 0.885 0.798 1.234 1.433 0.268
プリンスホテル前 0.979 1.674 1.051 0.669 0.857 0.820 1.240 1.446 0.264
三原(内港客船桟橋) 0.995 1.646 1.056 0.674 0.932 0.723 1.286 1.461 0.226
広島港(広島港統合桟橋) 1.187 1.539 1.049 0.763 0.963 0.870 1.271 1.142 0.217
御手洗港 1.070 1.635 1.182 0.726 0.894 0.844 1.170 1.261 0.219
中ノ鼻灯台 1.070 1.635 1.182 0.726 0.894 0.844 1.170 1.261 0.219
下蒲刈港 0.977 1.662 0.891 0.599 0.875 0.747 1.304 1.620 0.323
契島(軍艦島) 0.977 1.662 0.891 0.599 0.875 0.747 1.304 1.620 0.323

この表から読み取れること:

結果 (図 6 と読み取り)

図6 (RQ2): 港別 季節係数ヒートマップ (左) と 振幅バー (右)
図6 (RQ2): 港別 季節係数ヒートマップ (左) と 振幅バー (右)

この図から読み取れること:

表 2-3: 港別 季節振幅 (max-min, max/min, std)

最大月 最大係数 最小月 最小係数 振幅 (max-min) 比率 (max/min) 係数の標準偏差 順位 乗降客数
ひょうたん島 5 1.648 12 0.268 1.380 6.15 0.413 1 8519
呉港(呉中央桟橋ターミナル) 5 1.648 12 0.268 1.380 6.15 0.413 2 8519
海上自衛隊呉基地沖 5 1.648 12 0.268 1.380 6.15 0.413 3 8519
瀬戸田(瀬戸田浮さん橋) 5 1.648 12 0.268 1.380 6.15 0.413 4 8519
安芸灘大橋 5 1.648 12 0.268 1.380 6.15 0.413 5 8519
大久野島 5 1.648 12 0.268 1.380 6.15 0.413 6 8519
音戸の瀬戸 5 1.648 12 0.268 1.380 6.15 0.413 7 8519
プリンスホテル前 5 1.674 12 0.264 1.410 6.34 0.421 8 7555
三原(内港客船桟橋) 5 1.646 12 0.226 1.420 7.28 0.433 9 7516
広島港(広島港統合桟橋) 5 1.539 12 0.217 1.322 7.09 0.372 10 4943
御手洗港 5 1.635 12 0.219 1.416 7.47 0.397 11 4448
中ノ鼻灯台 5 1.635 12 0.219 1.416 7.47 0.397 12 4448
下蒲刈港 5 1.662 12 0.323 1.339 5.15 0.451 13 4071
契島(軍艦島) 5 1.662 12 0.323 1.339 5.15 0.451 14 4071

この表から読み取れること:

【RQ3】 モニタークルーズルート記述分析 — 区間混合と東への延伸

研究の問い (RQ3)

モニタークルーズ実施結果のルート設計を 記述分析する。 新規/既存区間の混合、寄港数、運航日分布は? 因果推論はしない (n=1 で不可)。

仮説 (再掲)

因果推論を行わない理由: モニタークルーズは 2022 年 12 月の単発実証実験 (n=1)。 複数年・複数イベントの反復観測がなく、コロナ・天候・宣伝強度などの交絡が統制されていないため、 「介入効果」 を統計的に推論することは不可能。本 RQ ではあくまで 記述 (= ルート設計の特徴の言語化) に留める。

手法 (ツール視点・要件J)

(1) 「ルートタイプ分類」 とは何のツールか:

(2) 「ルートマップ」 とは何のツールか:

なぜこの分析か (要件H): 介入効果を量的に推論できないとき、ルート設計を 記述すること それ自体が研究上の価値を持つ。「県は何を試したのか / どこに試したのか / どれくらいの規模か」 を データで示すことで、後年の本格評価 (= 複数年データ取得後) のための 記述ベースラインになる。

実装

X04_cruise_intervention_timeseries.py 行 1503–1547

 1
 2
 3
 4
 5
 6
 7
 8
 9
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
# 1 航海 = 1 日 × 1 航路 (寄港地ごとの行は同じ観光客数)
trip = (monitor.drop_duplicates(["運航日", "航路名"])
        [["運航日", "航路名", "観光客数(人)"]]
        .sort_values(["運航日", "航路名"]).reset_index(drop=True))

# 各航路サマリ: 寄港数, 新規/既存, 運航日数, 客数
route_records = []
for name, g in monitor.groupby("航路名"):
    stops = g.drop_duplicates("寄港地ID")
    new_stops = (stops["区間情報"] == "新規区間").sum()
    old_stops = (stops["区間情報"] == "既存区間").sum()
    new_ratio = new_stops / (new_stops + old_stops)
    if new_ratio == 1.0: rtype = "完全新規"
    elif new_ratio == 0.0: rtype = "完全既存"
    elif new_ratio >= 0.5: rtype = "新規主体"
    else: rtype = "既存主体"
    pas = g.drop_duplicates("運航日")["観光客数(人)"]
    route_records.append({"航路名": name, "寄港地数": len(stops),
        "新規率": new_ratio, "ルートタイプ": rtype,
        "運航日数": g["運航日"].nunique(), "観光客数_合計": pas.sum()})
routes_df = pd.DataFrame(route_records)

結果 (図 7 と読み取り) — 要件 T (地理可視化)

図7 (RQ3): モニタークルーズ 7 航路 × 23 寄港地のルートマップ
図7 (RQ3): モニタークルーズ 7 航路 × 23 寄港地のルートマップ

この図から読み取れること:

結果 (図 8 と読み取り)

図8 (RQ3): モニタークルーズ 9 運航日 × 7 航路 = 15 航海の観光客数
図8 (RQ3): モニタークルーズ 9 運航日 × 7 航路 = 15 航海の観光客数

この図から読み取れること:

結果 (図 9 と読み取り)

図9 (RQ3): 7 航路の区間構成 (左) と ルートタイプ別 平均客数 (右)
図9 (RQ3): 7 航路の区間構成 (左) と ルートタイプ別 平均客数 (右)

この図から読み取れること:

結果 (表と読み取り)

表 3-1: モニタークルーズ 7 航路サマリ

航路名 寄港地数 新規寄港数 既存寄港数 新規率 ルートタイプ 運航日数 観光客数_合計 観光客数_平均 観光客数_最大 観光客数_最小
①鞆の浦⇒広島コース(西) 13 5 8 0.38 既存主体 3 162 54.0 66 36
②尾道⇒広島コース(西) 7 1 6 0.14 既存主体 2 117 58.5 68 49
②広島⇒尾道コース(東) 8 2 6 0.25 既存主体 2 123 61.5 70 53
③三原⇒広島コース(西) 8 0 8 0.00 完全既存 2 121 60.5 65 56
③広島⇒三原コース(東) 8 1 7 0.12 既存主体 2 87 43.5 45 42
④しまなみ・尾道⇒広島コース(西) 8 2 6 0.25 既存主体 2 123 61.5 67 56
④広島⇒しまなみ・尾道コース(東) 8 2 6 0.25 既存主体 2 138 69.0 70 68

この表から読み取れること:

表 3-2: 運航日 × 航路 = 15 航海の客数詳細

運航日 航路名 観光客数(人)
2022-12-06 ①鞆の浦⇒広島コース(西) 60
2022-12-07 ②尾道⇒広島コース(西) 68
2022-12-07 ②広島⇒尾道コース(東) 70
2022-12-08 ③三原⇒広島コース(西) 65
2022-12-08 ③広島⇒三原コース(東) 42
2022-12-13 ①鞆の浦⇒広島コース(西) 66
2022-12-14 ④しまなみ・尾道⇒広島コース(西) 67
2022-12-14 ④広島⇒しまなみ・尾道コース(東) 70
2022-12-15 ④しまなみ・尾道⇒広島コース(西) 56
2022-12-15 ④広島⇒しまなみ・尾道コース(東) 68
2022-12-20 ①鞆の浦⇒広島コース(西) 36
2022-12-21 ②尾道⇒広島コース(西) 49
2022-12-21 ②広島⇒尾道コース(東) 53
2022-12-22 ③三原⇒広島コース(西) 56
2022-12-22 ③広島⇒三原コース(東) 45

この表から読み取れること:

表 3-3: モニタークルーズ 23 寄港地マスタ (一部抜粋)

寄港地ID 寄港地名 区間情報 緯度 経度
2001 広島港(広島港統合桟橋) 既存区間 34.352503 132.455055
2002 プリンスホテル前 既存区間 34.342842 132.465197
2003 呉港(呉中央桟橋ターミナル) 既存区間 34.240321 132.555993
2004 海上自衛隊呉基地沖 既存区間 34.231215 132.545136
2005 音戸の瀬戸 既存区間 34.194940 132.537520
2006 安芸灘大橋 既存区間 34.206958 132.679280
2007 下蒲刈港 既存区間 34.193141 132.682091
2008 御手洗港 既存区間 34.180044 132.866791
2009 中ノ鼻灯台 既存区間 34.215029 132.920458
2010 契島(軍艦島) 既存区間 34.298503 132.902855
2011 大久野島 既存区間 34.305481 132.995307
2012 ひょうたん島 既存区間 34.284519 133.050242
2013 瀬戸田(瀬戸田浮さん橋) 既存区間 34.305165 133.083990
2014 高根大橋 既存区間 34.308054 133.083320
2015 三原(内港客船桟橋) 既存区間 34.398198 133.081994

※ 全 23 寄港地のうち上位 15 を表示。残りは X04_monitor_ports.csv で参照。

この表から読み取れること:

表 3-4: ルートタイプ別 サマリ

ルートタイプ 観光客数_合計 観光客数_平均 運航日数 航路数
完全既存 121 60.5 2 1
既存主体 750 58.0 13 6

この表から読み取れること:

仮説検証総合

仮説と結果の照合 (要件: 仮説×結果対照表)

仮説RQ主要な結果判定
H1: 14 港の需要は均等配分でなく CR5 ≥ 40%, Gini ≥ 0.10 程度の集中度がある RQ1 CR5 = 44.1%, Gini = 0.143, HHI = 0.077 支持
H2: 主要港 (上位 3) は始発・終着港、周辺港は島嶼経由地 RQ1 上位 3 港のうち 0 港が始発/終着。中継主要港 (呉港等) も上位 部分支持
H3: 春秋 2 山型 (5 月・11 月ピーク)、12 月谷はピークの 1/4 以下 RQ2 ピーク = 5月 (17,665人), 谷 = 12月 (2,816人), 比 = 6.27 支持
H4: 港間の季節振幅は 1.5 倍以上の差 RQ2 max振幅 = 1.42 (三原(内港客船桟橋)), min振幅 = 1.32 (広島港(広島港統合桟橋)), 比 = 1.07 部分支持
H5: モニタークルーズは 4 ルートタイプに分類できる、東への延伸設計 RQ3 観察されたタイプ数 = 2 (完全既存・既存主体・新規主体)。完全新規は試行なし。 新規寄港地は経度 133° 以東に集中。 部分支持

3 RQ を統合した総合考察

(1) 広島県沿岸クルーズ市場は「軽度集中 + 共通季節パターン + ハイブリッド実験」 で構成される

(2) 因果推論はしないが、記述から導かれる政策的含意

(3) 本記事の限界

発展課題

結果X → 新仮説Y → 課題Z (要件 E: 3 段の論理鎖)

RQ1 から派生する発展課題

課題1: 主要港の役割分類を クラスタリングで再構築

課題2: 港のネットワーク中心性 (= ハブ性) を測る

RQ2 から派生する発展課題

課題3: 古典時系列分解で「トレンド + 季節 + 残差」 に分解

課題4: 季節パターンの クラスタリングで港のタイプを発見

RQ3 から派生する発展課題

課題5: モニタークルーズと 定常運航 (しまたび 12 月) の集客性能比較

課題6: 運航日 × 曜日 × 天候 の交絡分解

3 RQ 横断の総合課題

課題7: 複数年データで 本格的な季節安定性 + ルート評価を再現