「為替 × インバウンド需要」の関係をラグ付きで検証してみた
はじめに|「円安 → 訪日外国人が増える」は本当か?
コロナ禍が明けてから、円安が加速するなかで「外国人旅行者が戻ってきた」という報道が多く見られました。
- 「円が安い=お得だから来る」
- 「だからインバウンド需要は上昇している」
──そうした説明は、直感的で分かりやすいものの、
果たして本当に為替の動きが旅行行動に直結しているのでしょうか?
本記事では、2022年以降(いわゆるポストコロナ期)の訪日者データと為替データを用いて、
「旅行者の行動はどれくらい為替に影響されているのか?」を検証してみます。
データと仮説
使用データ
- 日本政府観光局(JNTO)の時系列推移表
- Investment.comから取得した通貨別為替レート(USD, EUR, GBP, CNY, KWR)
仮説
- H₀(帰無仮説):為替レートと訪日者数に有意な関係はない
- H₁(対立仮説):円安が進行すると、一定のラグ(月遅れ)を経て訪日者数が増加する
ラグ分析|「為替がいつ効いてくるか?」を国別に調べる
旅行は思い立ってすぐには行けません。航空券・休暇・予算などの計画が必要です。
そのため、為替が影響するなら、その数ヶ月後に行動に表れると考えるのが自然です。
以下のコードで、各国について「為替が何ヶ月後の訪日者数に最も強い相関を持つか」を計測しました。
今回の使用データは2022年1月~2024年12月としました。
3年間のデータであることを考慮し、ラグの最大値は3カ月としました。
import pandas as pd
# csvをdata_dfとして読み込んでおく
from collections import defaultdict
max_lag = 3
countries = {
"france": ("EUR", "フランス"),
"uk": ("GBP", "英国"),
"us": ("USD", "米国"),
"china": ("CNY", "中国"),
"korea": ("KWR", "韓国")
}
lag_results = defaultdict(dict)
for country_key, (forex_col, visitor_col) in countries.items():
df = data_df[["日付", forex_col, visitor_col]].copy()
df = df[df["日付"] >= "2022-01-01"]
for lag in range(0, max_lag + 1):
shifted = df.copy()
shifted[forex_col + "_lag"] = shifted[forex_col].shift(lag)
valid = shifted[[forex_col + "_lag", visitor_col]].dropna()
corr = valid[forex_col + "_lag"].corr(valid[visitor_col])
lag_results[country_key][f"lag_{lag}"] = corr
# 最も相関の高いラグを記録
best_lags = {
country: max(lags.items(), key=lambda x: abs(x[1]) if x[1] is not None else -1)
for country, lags in lag_results.items()
}
best_lagsを確認すると以下のようになりました。
国 | 最適なlag | 相関係数(絶対値) |
france | 0 | 0.8355 |
uk | 0 | 0.7966 |
us | 0 | 0.7552 |
china | 1 | 0.7921 |
korea | 3 | 0.7438 |
考察
- 多くの国でラグが「0ヶ月」=即時反応になりました。
- 円安が進行している「その月」に訪日者数が増えていることがわかりました。
- これは「為替が旅行者に即座に影響を与えた」のか、「円安以外の要因で人が動いていて、結果的に円安と重なっただけ」なのかは断定できません。
回帰分析で“説明力”を見る
次に、ラグ付きの為替レートで訪日者数を単回帰モデルにかけ、どれほど説明できるかを数値で確認します。
import statsmodels.api as sm
summary_table = []
for country_key, (forex_col, visitor_col) in countries.items():
lag = int(best_lags[country_key][0].split('_')[1])
df = final_df[["日付", forex_col, visitor_col]].copy()
df = df[df["日付"] >= "2022-01-01"]
df[forex_col + "_lag"] = df[forex_col].shift(lag)
df = df.dropna()
X = sm.add_constant(df[forex_col + "_lag"])
y = df[visitor_col]
model = sm.OLS(y, X).fit()
summary_table.append({
"国": visitor_col,
"通貨": forex_col,
"ラグ": lag,
"R²": round(model.rsquared, 3),
"為替係数": round(model.params[forex_col + "_lag"], 2),
"p値": round(model.pvalues[forex_col + "_lag"], 4)
})
pd.DataFrame(summary_table)
国 | 通貨 | ラグ | R² | 為替係数 | p値 |
france | EUR | 0 | 0.698 | 991.68 | 0.0 |
uk | GBP | 0 | 0.635 | 864.96 | 0.0 |
us | USD | 0 | 0.570 | 6537.89 | 0.0 |
china | CNY | 1 | 0.627 | 244864.63 | 0.0 |
korea | KWR | 3 | 0.553 | 41332778.81 | 0.0 |
- R²は全体的に0.5〜0.6前後で、一定の説明力があるが完全ではない。
- ラグが0なのは為替状況に応じてすぐに旅行に出発しているのか、たまたま為替の状況と一致しているのか、判断ができない。
R²の数字から因果関係があると結論付けるのはこの段階では適切ではありません。
仮に為替だけが訪日者数を左右する要因だった場合、
表の為替係数は「円安が1円進行したら訪日者数がX人増える」と数値上解釈することもできます。
例えば1ユーロが160円だったのが161円になった(円安になった)時、
フランスから来る人が991人増える、という関係になります。
(実際の関係性はもっと複雑なので、あくまで検証の一部として扱っております)
ラグを入れた方が良い国はラグを採用し、
訪日者数と為替の動きをプロットしてみます。
import matplotlib.pyplot as plt
fig, axes = plt.subplots(5, 1, figsize=(14, 20), sharex=True)
countries_order = ["france", "uk", "us", "china", "korea"]
colors = {
"france": ("EUR", "フランス", "blue", "red"),
"uk": ("GBP", "英国", "blue", "red"),
"us": ("USD", "米国", "blue", "red"),
"china": ("CNY", "中国", "blue", "red"),
"korea": ("KWR", "韓国", "blue", "red")
}
for idx, country in enumerate(countries_order):
forex_col, visit_col, visit_color, forex_color = colors[country]
lag = int(best_lags[country][0].split('_')[1])
plot_df = final_df[["日付", forex_col, visit_col]].copy()
plot_df[forex_col + "_lag"] = plot_df[forex_col].shift(lag)
plot_df = plot_df[plot_df["日付"] >= "2022-01-01"].dropna()
ax = axes[idx]
ax2 = ax.twinx()
ax.plot(plot_df["日付"], plot_df[visit_col], label=f"visitors from {visit_col}", color=visit_color)
ax2.plot(plot_df["日付"], plot_df[forex_col + "_lag"], label=f"{forex_col}/JPY({lag}months lag)", color=forex_color)
ax.set_ylabel("visitors", color=visit_color)
ax2.set_ylabel("currency rate", color=forex_color)
ax.set_title(f"{country}")
ax.tick_params(axis='y', labelcolor=visit_color)
ax2.tick_params(axis='y', labelcolor=forex_color)
plt.xticks(rotation=45)
plt.tight_layout()
plt.show()





結論|「為替だけでは語れないが、無視もできない」
本記事では「円安が訪日旅行に影響を与えているのか?」という問いに対して、
データを使って検証しました。あらためて、冒頭の仮説は以下の通りでした:
- H₀(帰無仮説):為替レートと訪日者数に有意な関係はない
- H₁(対立仮説):円安が進むと、一定のラグ(月遅れ)を経て訪日者数が増加する
この検証を経て、次のような現実的な結論が導けます:
- 為替と訪日者数には明確な相関がある(多くの国で R² > 0.5)
- ただし、ラグの有無や説明力は国によって異なり、一定ではない
したがって、帰無仮説(為替と訪日者数に関係はない)を棄却できる状況にあるといえます。
しかし同時に、「為替がすべてを説明している」とも言えず、多因子的な判断が必要です。
円安だと訪日旅行客にとって割安感があるので、
訪日後に消費額は日本円換算で増える可能性があるものの、
訪日を“後押しする”要素であると断定はできない、
というのが現実的な結論になるのではないでしょうか。
ふわっとした着地にはなってしまいましたが、
今後もデータ×観光をテーマにブログ記事を書いてまいりますので
お読みいただけますと幸いです。