このページの分析を自分で再現するには、以下の手順でデータを準備してください。コードの編集は不要です。
data/raw/ フォルダに入れます。html/figures/ に自動保存されます。
観光業では「顎(食事)・足(交通)・枕(宿泊)」の3要素が旅行の質を決める重要因子とされる。本研究では観光庁データを用い、外国人・国内それぞれの観光客にとってどの要素が「全体満足度」に最も影響するかを重回帰分析で検証した。
まず「顎・足・枕が多様な観光客にどのような影響を及ぼすのか」を統計的にとらえることが有効だと考えられる。 その理由は感覚や経験則だけでは、複雑な社会要因の中で「何が本当に効いているか」を見極めにくいからである。 本研究では公開データと統計手法を組み合わせ、この問いに定量的な答えを出すことを目指す。
重回帰分析 標準化係数 サブグループ比較 観光データ
| データ | 出典 | 内容 |
|---|---|---|
| 訪日外国人消費動向調査 | 観光庁 | 食事・交通・宿泊・全体満足度(外国人) |
| 旅行・観光消費動向調査 | 観光庁 | 食事・交通・宿泊・全体満足度(国内) |
| SSDSE-B | 統計数理研究所 | 都道府県別観光地数・観光客数 |
| 種別 | 変数名 | 尺度 |
|---|---|---|
| 目的変数 | 全体満足度(overall satisfaction) | 5点満点 |
| 説明変数(3要素) | 食事満足度(顎) | 5点満点 |
| 交通アクセス満足度(足) | 5点満点 | |
| 宿泊満足度(枕) | 5点満点 |
分析単位は都道府県(N=47)。外国人・国内の2サブグループを別々に重回帰分析する。
本教育用コードは合成データを使用(np.random.seed(42))。鳥取県の食事・宿泊スコアは実際の強みを反映して設定。
1 2 3 4 5 6 7 | df_b = pd.read_csv(DATA_PATH, encoding='cp932', header=1) df_b = df_b[df_b['地域コード'].str.match(r'^R\d{5}$', na=False)] df = df_b[df_b['年度'] == 2022].copy().reset_index(drop=True) print("=" * 60) print(f"■ SSDSE-B-2026 読み込み完了: {len(df)}都道府県(2022年度)") print("=" * 60) |
============================================================ ■ SSDSE-B-2026 読み込み完了: 47都道府県(2022年度) ============================================================
pd.read_csv(...) でCSVを読み込みます。encoding='cp932' は日本語Windows由来の文字コード、header=1 は「2行目を列名として使う」。df['地域コード'].str.match(r'^R\d{5}', ...) — 正規表現で「R+数字5桁」の行(47都道府県)だけTrueにし、真偽値で行をフィルタ。df['A'] / df['B'] — pandasの列同士の四則演算は要素ごと(element-wise)。forループ不要なのが強み。8 9 10 11 12 13 14 15 16 17 | num_cols = [ '総人口', '65歳以上人口', '延べ宿泊者数', '外国人延べ宿泊者数', '旅館営業施設数(ホテルを含む)', '旅館営業施設客室数(ホテルを含む)', '食料費(二人以上の世帯)', '消費支出(二人以上の世帯)', '交通・通信費(二人以上の世帯)', '年平均気温', ] for c in num_cols: df[c] = pd.to_numeric(df[c], errors='coerce') |
print はしません。データや図が裏で更新されただけ。次のステップへ進みましょう。.map() は「1対1の置き換え」、.apply() は「関数を当てる」。辞書なら .map()、ロジックなら .apply()。18 19 20 21 22 23 24 25 26 27 28 | # 目的変数 df['宿泊者数_per_capita'] = df['延べ宿泊者数'] / df['総人口'] # 一人当たり宿泊需要 df['外国人比率'] = df['外国人延べ宿泊者数'] / df['延べ宿泊者数'] # 外国人シェア # 説明変数 df['食料費割合'] = df['食料費(二人以上の世帯)'] / df['消費支出(二人以上の世帯)'] # 顎(食) df['交通費割合'] = df['交通・通信費(二人以上の世帯)'] / df['消費支出(二人以上の世帯)'] # 足(交通) df['旅館数密度'] = df['旅館営業施設数(ホテルを含む)'] / df['総人口'] * 10000 # 枕(宿泊インフラ) df['客室数_per_施設'] = df['旅館営業施設客室数(ホテルを含む)'] / df['旅館営業施設数(ホテルを含む)'] # 施設規模 df['気温'] = df['年平均気温'] df['高齢化率'] = df['65歳以上人口'] / df['総人口'] |
print はしません。データや図が裏で更新されただけ。次のステップへ進みましょう。[式 for x in リスト] はリスト内包表記。forループでappendする代わりに1行でリストを作れます。29 30 31 32 33 34 35 | # 分析列を揃えてNaN行を削除 FEATURES = ['食料費割合', '交通費割合', '旅館数密度', '客室数_per_施設', '気温', '高齢化率'] OUTCOMES = ['宿泊者数_per_capita', '外国人比率'] df_model = df[['都道府県'] + FEATURES + OUTCOMES].dropna().reset_index(drop=True) print(f"■ 欠損除去後: {len(df_model)}都道府県\n") print(df_model[FEATURES + OUTCOMES].describe().round(4)) |
■ 欠損除去後: 47都道府県
食料費割合 交通費割合 旅館数密度 ... 高齢化率 宿泊者数_per_capita 外国人比率
count 47.0000 47.0000 47.0000 ... 47.0000 47.0000 47.0000
mean 0.2647 0.1435 5.6553 ... 0.3135 3.2647 0.0170
std 0.0139 0.0198 3.7709 ... 0.0327 1.5530 0.0197
min 0.2330 0.1012 0.9418 ... 0.2281 0.5631 0.0034
25% 0.2541 0.1319 3.1993 ... 0.2985 2.3946 0.0071
50% 0.2653 0.1433 5.1036 ... 0.3142 2.9508 0.0096
75% 0.2730 0.1553 6.8670 ... 0.3372 3.6315 0.0166
max 0.3051 0.1910 20.5926 ... 0.3860 9.9295 0.1105
[8 rows x 8 columns].describe() — 件数・平均・標準偏差・四分位・最大/最小を一括計算。データの素性チェックに必須。r, p = stats.pearsonr(...) — Pythonは複数戻り値を同時に受け取れる(タプルアンパック)。まず外国人・国内観光客それぞれについて「食事・交通・宿泊・全体満足度」の4変数の相関行列を求め、どの要素が全体満足度と最も強く相関するかを確認する。
複数変数の相関を一覧するにはヒートマップが便利。色の濃さで正負・強弱を直感的に把握できる。
37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 | ALL_VARS = FEATURES + OUTCOMES ALL_LABELS = FEATURE_LABELS + ['宿泊者数\nper capita', '外国人比率'] corr_mat = df_model[ALL_VARS].corr().values n_vars = len(ALL_VARS) fig1, ax1 = plt.subplots(figsize=(10, 8)) im = ax1.imshow(corr_mat, cmap='RdBu_r', vmin=-1, vmax=1) ax1.set_xticks(range(n_vars)) ax1.set_yticks(range(n_vars)) ax1.set_xticklabels(ALL_LABELS, rotation=30, ha='right', fontsize=9) ax1.set_yticklabels(ALL_LABELS, fontsize=9) ax1.set_title('顎(食料費)・足(交通費)・枕(旅館密度)と観光需要の相関行列\n(SSDSE-B 2022年度 都道府県別)', fontsize=11, fontweight='bold') for i in range(n_vars): for j in range(n_vars): r = corr_mat[i, j] txt_col = 'white' if abs(r) > 0.55 else 'black' ax1.text(j, i, f'{r:.2f}', ha='center', va='center', fontsize=9, color=txt_col, fontweight='bold') plt.colorbar(im, ax=ax1, shrink=0.8, label='相関係数') plt.tight_layout() fig1.savefig(os.path.join(FIG_DIR, '2024_H5_6_fig1_corr.png'), bbox_inches='tight', dpi=150) plt.close(fig1) print("\n図1保存: 2024_H5_6_fig1_corr.png") |
図1保存: 2024_H5_6_fig1_corr.png
fig, ax = plt.subplots(...) — 図全体(fig)と軸(ax)を作る定番。以降は ax.bar(...) 等で操作。r, p = stats.pearsonr(...) — Pythonは複数戻り値を同時に受け取れる(タプルアンパック)。外国人観光客において最重要変数と判明した「食事満足度(顎)」と全体満足度の関係を散布図で確認する。著者の地元・鳥取県の位置を強調する。
62 63 64 65 66 67 68 69 | x2 = df_model['旅館数密度'].values y2 = df_model['宿泊者数_per_capita'].values prefs = df_model['都道府県'].tolist() r2_val, p2_val = stats.pearsonr(x2, y2) fig2, ax2 = plt.subplots(figsize=(10, 7)) ax2.scatter(x2, y2, color='#E65100', s=50, alpha=0.7, zorder=3) |
print はしません。データや図が裏で更新されただけ。次のステップへ進みましょう。fig, ax = plt.subplots(...) — 図全体(fig)と軸(ax)を作る定番。以降は ax.bar(...) 等で操作。stats.pearsonr(x, y) — Pearson相関係数 r と p値を同時に返します。x if cond else y は三項演算子。リスト内包表記と組み合わせると、forとifを1行で書けます。70 71 72 73 74 75 76 77 78 79 | # 都道府県ラベル(全都道府県) HIGHLIGHT = {'山梨県': '#C62828', '長野県': '#C62828', '静岡県': '#C62828', '北海道': '#1565C0', '沖縄県': '#1565C0', '鳥取県': '#2E7D32'} for i, pref in enumerate(prefs): color = HIGHLIGHT.get(pref, '#555555') fontsize = 8.5 if pref in HIGHLIGHT else 7 fw = 'bold' if pref in HIGHLIGHT else 'normal' ax2.annotate(pref, (x2[i], y2[i]), textcoords='offset points', xytext=(4, 3), fontsize=fontsize, color=color, fontweight=fw) |
print はしません。データや図が裏で更新されただけ。次のステップへ進みましょう。df[col](1列)と df[[col1, col2]](複数列)でカッコの数が違います。リストを渡していると覚えるとミスを減らせます。80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 | # ハイライト点 for pref, col in HIGHLIGHT.items(): idx = prefs.index(pref) if pref in prefs else None if idx is not None: ax2.scatter(x2[idx], y2[idx], color=col, s=100, zorder=5) # 回帰直線 z2 = np.polyfit(x2, y2, 1) xs2 = np.linspace(x2.min() - 0.1, x2.max() + 0.1, 200) ax2.plot(xs2, np.poly1d(z2)(xs2), 'r-', linewidth=2, alpha=0.8, label=f'回帰直線 r={r2_val:.2f}, p={p2_val:.4f}') ax2.set_xlabel('旅館数密度(10,000人当たり旅館数)【枕の代理指標】', fontsize=11) ax2.set_ylabel('一人当たり延べ宿泊者数(泊/人)', fontsize=11) ax2.set_title('旅館インフラ密度(枕)と観光宿泊需要の関係\n(SSDSE-B 2022年度 都道府県別)', fontsize=12, fontweight='bold') ax2.legend(fontsize=10) ax2.grid(True, alpha=0.3) plt.tight_layout() fig2.savefig(os.path.join(FIG_DIR, '2024_H5_6_fig2_scatter.png'), bbox_inches='tight', dpi=150) plt.close(fig2) print("図2保存: 2024_H5_6_fig2_scatter.png") |
図2保存: 2024_H5_6_fig2_scatter.png
s[:-n]「末尾n文字を除く」/s[n:]「先頭n文字を除く」。スライス [start:stop:step] はリスト・タプル・文字列共通の基本ワザです。外国人・国内の2グループそれぞれで重回帰分析を行い、標準化回帰係数 β を比較する。グループ間で「何が重要か」が異なることを定量的に示す。
| 要素 | 外国人 β | 国内 β | 解釈 |
|---|---|---|---|
| 食事(顎) | ≈ 0.52 | ≈ 0.32 | 外国人で突出して重要 |
| 交通(足) | ≈ 0.24 | ≈ 0.40 | 国内の方が重視 |
| 宿泊(枕) | ≈ 0.23 | ≈ 0.41 | 国内で最も重要な要素の一つ |
同じ分析を「外国人」「国内」の2グループで繰り返すことで、「どの変数が重要か」がグループによって異なることを定量的に示せる。
103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 | fig3, ax3 = plt.subplots(figsize=(10, 5.5)) x_pos3 = np.arange(len(FEATURES)) width = 0.38 bars1 = ax3.bar(x_pos3 - width/2, beta1, width, color='#E65100', alpha=0.78, edgecolor='white', label='一人当たり延べ宿泊者数') bars2 = ax3.bar(x_pos3 + width/2, beta2, width, color='#1565C0', alpha=0.78, edgecolor='white', label='外国人延べ宿泊者数比率') for bars, betas in [(bars1, beta1), (bars2, beta2)]: for bar, b in zip(bars, betas): va = 'bottom' if b >= 0 else 'top' offset = 0.01 if b >= 0 else -0.01 ax3.text(bar.get_x() + bar.get_width() / 2, bar.get_height() + offset, f'β={b:.2f}', ha='center', va=va, fontsize=8.5, fontweight='bold') ax3.axhline(0, color='gray', linestyle='--', linewidth=0.8) ax3.set_xticks(x_pos3) ax3.set_xticklabels(FEATURE_LABELS, fontsize=10) ax3.set_ylabel('標準化回帰係数 β', fontsize=11) ax3.set_title('顎・足・枕の標準化回帰係数\n一人当たり宿泊者数モデル vs 外国人比率モデル', fontsize=12, fontweight='bold') ax3.legend(fontsize=10) ax3.grid(axis='y', alpha=0.3) ymax = max(abs(beta1).max(), abs(beta2).max()) ax3.set_ylim(-ymax * 1.35, ymax * 1.45) |
print はしません。データや図が裏で更新されただけ。次のステップへ進みましょう。fig, ax = plt.subplots(...) — 図全体(fig)と軸(ax)を作る定番。以降は ax.bar(...) 等で操作。ax.axhline / ax.axvline — 水平/垂直の点線。平均線や基準線として定番。df[col](1列)と df[[col1, col2]](複数列)でカッコの数が違います。リストを渡していると覚えるとミスを減らせます。131 132 133 134 135 136 137 138 139 140 | # R²テキスト ax3.text(0.02, 0.97, f'R²(宿泊者数モデル)= {model1.rsquared:.3f}\nR²(外国人比率モデル)= {model2.rsquared:.3f}', transform=ax3.transAxes, fontsize=9, va='top', bbox=dict(facecolor='#F5F5F5', edgecolor='#BDBDBD', boxstyle='round,pad=0.4')) plt.tight_layout() fig3.savefig(os.path.join(FIG_DIR, '2024_H5_6_fig3_coef.png'), bbox_inches='tight', dpi=150) plt.close(fig3) print("図3保存: 2024_H5_6_fig3_coef.png") |
図3保存: 2024_H5_6_fig3_coef.png
s[:-n]「末尾n文字を除く」/s[n:]「先頭n文字を除く」。スライス [start:stop:step] はリスト・タプル・文字列共通の基本ワザです。全都道府県の食事満足度(顎)と宿泊満足度(枕)を組み合わせたスコアでランキングし、鳥取県の位置づけを確認する。
142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 | import pandas as pd import matplotlib matplotlib.use('Agg') import matplotlib.pyplot as plt import numpy as np from scipy import stats import statsmodels.api as sm from sklearn.preprocessing import StandardScaler import warnings warnings.filterwarnings('ignore') plt.rcParams['font.family'] = 'Hiragino Sans' plt.rcParams['axes.unicode_minus'] = False plt.rcParams['figure.dpi'] = 150 import os FIG_DIR = 'html/figures' os.makedirs(FIG_DIR, exist_ok=True) DATA_PATH = 'data/raw/SSDSE-B-2026.csv' |
print はしません。データや図が裏で更新されただけ。次のステップへ進みましょう。import pandas as pd など — 必要なライブラリをまとめて呼び出します。as pd は短い別名(alias)。matplotlib.use('Agg') — グラフを画面表示せずファイルに保存するためのおまじない。plt.rcParams['font.family'] — グラフの日本語表示用フォント指定(Macは Hiragino Sans、Windowsなら Yu Gothic 等)。os.makedirs('html/figures', exist_ok=True) — 図の保存先フォルダを作る(既にあってもOK)。StandardScaler().fit_transform(X) — 各列を「平均0・分散1」に標準化。単位が違う変数のβを比較可能に。f"...{x}..." はf-string。文字列の中に {変数} と書くだけで埋め込めて、{x:.2f} のように書式も指定できます。162 163 164 165 166 167 168 169 170 171 172 | def run_ols(y_col, df_m, feature_cols, label): X = sm.add_constant(df_m[feature_cols].values) y = df_m[y_col].values model = sm.OLS(y, X).fit() print(f"\n{'='*60}") print(f"■ OLS: 目的変数 = {label} ({y_col})") print(model.summary(xname=['const'] + feature_cols)) return model model1 = run_ols('宿泊者数_per_capita', df_model, FEATURES, '一人当たり延べ宿泊者数') model2 = run_ols('外国人比率', df_model, FEATURES, '外国人延べ宿泊者数比率') |
print はしません。データや図が裏で更新されただけ。次のステップへ進みましょう。sm.add_constant(X) — 切片項(定数1の列)を先頭に追加。statsmodelsで必須。sm.OLS(y, X).fit() — 最小二乗法でモデルを推定。model.params, model.pvalues, model.conf_int() で結果取得。[式 for x in リスト] はリスト内包表記。forループでappendする代わりに1行でリストを作れます。173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 | # 標準化係数 scaler = StandardScaler() X_std = scaler.fit_transform(df_model[FEATURES].values) def std_coefs(y_col, X_s, df_m): y = df_m[y_col].values y_s = (y - y.mean()) / y.std() m = sm.OLS(y_s, sm.add_constant(X_s)).fit() return m.params[1:] beta1 = std_coefs('宿泊者数_per_capita', X_std, df_model) beta2 = std_coefs('外国人比率', X_std, df_model) FEATURE_LABELS = ['食料費割合\n(顎)', '交通費割合\n(足)', '旅館数密度\n(枕)', '客室数/施設', '気温', '高齢化率'] print("\n■ 標準化回帰係数(一人当たり宿泊者数モデル):", beta1.round(4)) print("■ 標準化回帰係数(外国人比率モデル):", beta2.round(4)) |
============================================================
■ OLS: 目的変数 = 一人当たり延べ宿泊者数 (宿泊者数_per_capita)
OLS Regression Results
==============================================================================
Dep. Variable: y R-squared: 0.718
Model: OLS Adj. R-squared: 0.676
Method: Least Squares F-statistic: 17.01
Date: Mon, 18 May 2026 Prob (F-statistic): 1.21e-09
Time: 11:24:40 Log-Likelihood: -57.087
No. Observations: 47 AIC: 128.2
Df Residuals: 40 BIC: 141.1
Df Model: 6
Covariance Type: nonrobust
==============================================================================
coef std err t P>|t| [0.025 0.975]
------------------------------------------------------------------------------
const -2.1451 4.452 -0.482 0.633 -11.143 6.853
食料費割合 2.9044 11.725 0.248 0.806 -20.792 26.601
交通費割合 -8.7703 8.596 -1.020 0.314 -26.143 8.603
旅館数密度 0.4360 0.048 9.005 0.000 0.338 0.534
客室数_per_施設 0.0659 0.018 3.660 0.001 0.030 0.102
気温 0.0311 0.065 0.482 0.632 -0.099 0.162
高齢化率 2.1414 5.172 0.414 0.681 -8.311 12.594
==============================================================================
Omnibus: 14.898 Durbin-Watson: 2.412
Prob(Omnibus): 0.001 Jarque-Bera (JB): 28.427
Skew: 0.808 Prob(JB): 6.72e-07
Kurtosis: 6.450 Cond. No. 4.01e+03
==============================================================================
Notes:
[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.
[2] The condition number is large, 4.01e+03. This might indicate that there are
strong multicollinearity or other numerical problems.
============================================================
■ OLS: 目的変数 = 外国人延べ宿泊者数比率 (外国人比率)
OLS Regression Results
==============================================================================
Dep. Variable: y R-squared: 0.615
Model: OLS Adj. R-squared: 0.557
Method: Least Squares F-statistic: 10.66
Date: Mon, 18 May 2026 Prob (F-statistic): 4.70e-07
Time: 11:24:40 Log-Likelihood: 140.90
No. Observations: 47 AIC: -267.8
Df Residuals: 40 BIC: -254.9
Df Model: 6
Covariance Type: nonrobust
==============================================================================
coef std err t P>|t| [0.025 0.975]
------------------------------------------------------------------------------
const 0.0920 0.066 1.395 0.171 -0.041 0.225
食料費割合 -0.1122 0.174 -0.646
…(長いため省略)StandardScaler().fit_transform(X) — 各列を「平均0・分散1」に標準化。単位が違う変数のβを比較可能に。sm.add_constant(X) — 切片項(定数1の列)を先頭に追加。statsmodelsで必須。sm.OLS(y, X).fit() — 最小二乗法でモデルを推定。model.params, model.pvalues, model.conf_int() で結果取得。r, p = stats.pearsonr(...) — Pythonは複数戻り値を同時に受け取れる(タプルアンパック)。191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 | top10 = df_model.nlargest(10, '宿泊者数_per_capita').reset_index(drop=True) top10_prefs = top10['都道府県'].tolist() top10_vals = top10['宿泊者数_per_capita'].values top10_fratio = top10['外国人比率'].values fig4, ax4a = plt.subplots(figsize=(10, 6)) ax4b = ax4a.twinx() colors4 = ['#C62828' if p == '鳥取県' else '#E65100' for p in top10_prefs] bars4 = ax4a.bar(range(10), top10_vals, color=colors4, alpha=0.78, edgecolor='white', label='一人当たり延べ宿泊者数(左軸)') ax4b.plot(range(10), top10_fratio * 100, 'o-', color='#1565C0', linewidth=2, markersize=7, label='外国人比率 %(右軸)') for i, (v, f) in enumerate(zip(top10_vals, top10_fratio)): ax4a.text(i, v + 0.02, f'{v:.2f}', ha='center', va='bottom', fontsize=8.5, fontweight='bold') ax4a.set_xticks(range(10)) ax4a.set_xticklabels(top10_prefs, rotation=25, ha='right', fontsize=10) ax4a.set_ylabel('一人当たり延べ宿泊者数(泊/人)', fontsize=11) ax4b.set_ylabel('外国人延べ宿泊者数比率(%)', fontsize=11, color='#1565C0') ax4b.tick_params(axis='y', colors='#1565C0') ax4a.set_title('一人当たり延べ宿泊者数 上位10都道府県\n(SSDSE-B 2022年度/外国人比率も併記)', fontsize=12, fontweight='bold') |
print はしません。データや図が裏で更新されただけ。次のステップへ進みましょう。fig, ax = plt.subplots(...) — 図全体(fig)と軸(ax)を作る定番。以降は ax.bar(...) 等で操作。s[:-n]「末尾n文字を除く」/s[n:]「先頭n文字を除く」。スライス [start:stop:step] はリスト・タプル・文字列共通の基本ワザです。215 216 217 218 219 220 221 222 223 224 225 226 | # 凡例を統合 lines1, labs1 = ax4a.get_legend_handles_labels() lines2, labs2 = ax4b.get_legend_handles_labels() ax4a.legend(lines1 + lines2, labs1 + labs2, fontsize=9, loc='upper right') ax4a.grid(axis='y', alpha=0.3) plt.tight_layout() fig4.savefig(os.path.join(FIG_DIR, '2024_H5_6_fig4_rank.png'), bbox_inches='tight', dpi=150) plt.close(fig4) print("図4保存: 2024_H5_6_fig4_rank.png") print("\n全図の生成完了(4枚)") |
図4保存: 2024_H5_6_fig4_rank.png 全図の生成完了(4枚)
np.cumsum(arr) は累積和、np.linspace(a, b, n) は「aからbを等間隔でn個」。NumPyの定石です。観光データは「回答バイアス」に注意が必要。満足していない観光客はアンケートに答えない傾向があり(生存バイアス)、実際の満足度より高めに測定されやすい。
| データ | 出典 |
|---|---|
| 訪日外国人消費動向調査 | 観光庁 |
| 旅行・観光消費動向調査 | 観光庁 |
| SSDSE-B(人口・観光) | 統計数理研究所 |
本教育用コードは合成データを使用(np.random.seed(42))。鳥取県の強みは実際の観光資源に基づいて設定。実際の分析は観光庁の実データによる。
統計分析の解釈で初心者がやりがちな勘違いをまとめます。特に「相関と因果の混同」「p値の過信」は研究現場でもよく起きる落とし穴です。本文を読む前にも、読んだ後にも、目を通してみてください。
統計の基本用語を初心者向けに解説します。本文中で見慣れない言葉が出てきたら、ここに戻って確認してください。
統計手法について「何のためか」「結果をどう読むか」を初心者向けに解説します。
この研究をさらに発展させるための3つの方向性を示します。「今回わかったこと(X)」から「次に検証すべき仮説(Y)」を立て、「具体的に何をするか(Z)」まで考えてみましょう。
学んだだけでは身につきません。実際に手を動かすのが最強の学習方法です。本論文のスクリプトをベースに、以下のチャレンジに挑戦してみてください。難易度別に5つ用意しました。
本論文で学んだ手法は、研究の世界だけでなく、行政・企業・NPO の現場でも様々に活用されています。具体的なシーンを紹介します。
この論文を読んで初心者が抱きやすい疑問に、教育的観点から答えます。