AI によりデータの結合処理、ファクトテーブルの作成を自動化させる
Copyright © 2026GotoAI株式会社gooseプロジェクトに基く
本事例の手順は、以下の環境で動作を確認しています。
- Kari: バージョン 0.7.3 Windows
- AI プロバイダー: Anthropic Claude サブスクリプション
- モデル: Claude Opus 5.5 High
説明
データ分析において多くの場合は、1つの分析の目的のために異なるデータファイルを結合し、1つのデータのかたまりを作ります。例えば、「国籍・地域別のインバウンド消費総額」を試算するために、前のページで取得したインバウンド消費動向調査データ、訪日外客数データ、そして船舶観光上陸許可データを結合することが必要です。なぜならば、計算のために必要な情報は、異なるデータに分かれているからです。
ここで大事なのは、「データ整合性」という概念です。過去に日本へ訪問した外国観光客の人数および消費金額は、実態としては同時に存在する情報です。しかし、調査手段、データの取得性などの制約事項により、あるいはデータ保持上の利便性などの理由で、こういった本来は一体となった情報は、今のように異なるデータとして断片的に収集・保存されています。複数のデータ断片から、もともとの情報のかたまりを正しく復元できることを、「データの整合性がとれている」といいます。
結合の際に、データのキーと、データの属性を定義します。何をもとに結合し、何を主な情報処理の対象とするかを決めるわけです。しばしば、全ての後続のデータ処理を準備するため、あらかじめ1つの網羅的な結合テーブルを作成します。こういう結合テーブルを「ファクトテーブル」と呼ぶことがあります。
この事例では、「国籍・地域」と「年月」をキーとし、ほかのデータカラムを属性とし、1つのファクトテーブルの作成を AI に任せます。
観光庁が公表する1人あたり旅行支出は、クルーズ客を除いた「一般客」のものです。一方、JNTO の訪日外客数にはクルーズ客が含まれます。 そのまま掛け合わせると、クルーズ客の人数に一般客の単価を掛けることになります。
一般客数 = 訪日外客数 − クルーズ客数
船舶観光上陸許可データは、この引き算の右辺を埋めるために結合します。詳しくは概要を参照してください。
AI に作業を指示
- 前のページで作成した65個のテーブル(消費動向調査10+訪日外客統計24+船舶観光上陸許可31)を入力として、キー・粒度・属性・欠損の扱いをまとめて指示します。
データコレクション「データコレクション2」でのデータテーブルを用いて、ファクトテーブルを作成し、データフローとして保存する。
1. インバウンド消費動向調査データ、訪日外客数データ、船舶観光上陸許可データを結合する。
(1) 結合のキーは、「国籍・地域」と「年月」とする。「国籍・地域」以外の粒度の集計を除外する。
(2) インプットテーブルでのヘッダーにキーがタグとして存在する場合、必要に応じて元の情報をキーと付随情報を分けた上で処理する。
(3) インバウンド消費動向調査データは月単位になっていないため、調査期間に含まれた全ての月では同じ情報を持つことを見なして処理する。
(4) 「国籍・地域」のキー対象はインバウンド消費動向調査データに含まれたものとする。ただし、全体計・地域計・残余(「その他」)にあたる区分は除外する。
(5) データソースにより「国籍・地域」の表記と粒度が異なる。同一の対象はインバウンド消費動向調査データに準拠して名寄せし、対応するものがない区分は結合対象から除外する。名寄せした対応と除外した区分は、すべて報告する。
(6) 集計の「年月」の開始時期は2024年1月とする。
(7) 下記のコラムをファクトテーブルの属性データとする:
- 訪日外客数 (*注意:元データに訪日外客数を示す明確なヘッダーがないため、対応する月により正しく識別すること)
- クルーズ客数 (*注意:船舶観光上陸許可データの全国の総数を用いる。港別の値は用いない)
- 一般客数。訪日外客数からクルーズ客数を差し引いた値とする
- 1人あたり旅行支出。インバウンド消費動向調査データの「全体」の消費単価とする
- 日本滞在中の費目別支出の消費単価。内訳ではなく費目のレベルとし、以下の6項目とする:
- 宿泊費
- 飲食費
- 交通費
- 娯楽等サービス費
- 買物代
- その他
(8) ある国籍・地域が、ある月の船舶観光上陸許可データに現れない場合は、その月の上陸許可が0件であることを意味する。クルーズ客数を0として一般客数を算出する。ただし、船舶観光上陸許可データ自体が存在しない月は、クルーズ客数・一般客数ともNull値とする。
(9) その他にデータが欠損する場合、Null値を結合テーブルに入れる。
2. 結合したテーブルをデータフロー「インバウンドファクトデータ」として保存する。

この指示の組み立て方には、次のポイントがあります。
| 指示のブロック | ねらい |
|---|---|
| 1-(1) キーと粒度 | 結合キーを先に確定させ、「国籍・地域」以外の粒度を除外させます。3つのデータすべてに合計行(全国籍・地域、総数、アジア計…)が混ざっているため、これを書かないと合計と個別が同じ列に並んだまま結合されます。 |
| 1-(2) ヘッダーのタグ分離 | 消費動向調査は 韓国_消費単価 のように、ヘッダーにキーが埋まっています。 列名を分解してキーと指標に分ける、という方針だけを与えます。 |
| 1-(3) 四半期の扱い | 消費側は四半期、人数側は月です。粒度が違うものを結合するときの規則を決めておかないと、AI が独自に按分したり、四半期の行だけ残したりします。 |
| 1-(4) キー対象の基準 | どのデータに合わせるかを決めます。消費動向調査側を基準とすることで、調査対象でない国が混ざりません。 |
| 1-(5) 名寄せと報告 | 具体的な対応表は与えていません。 寄せる先(消費動向調査の表記)だけを決め、何をどう寄せたかを報告させます。 こちらの思い込みを持ち込まずに済み、確認は人がします。 |
| 1-(7) 属性の注意書き | 訪日外客統計に「訪日外客数」という列名はなく、船舶観光上陸許可には全国と港別の値が並んでいます。 どれを取るかを補足しています。 |
| 1-(8) 0 と Null の区別 | 最も間違えやすい箇所です。 下の注意書きを参照してください。 |
| 1-(9) 欠損の扱い | 結合できなかった組み合わせを Null で埋めると指定します。行を落とすか Null を入れるかで、後続の集計が変わります。 |
船舶観光上陸許可データは、その月に上陸許可があった国籍だけが行として載ります。 ある国がある月に載っていないのは、「データがない」のではなく「0件だった」という意味です。
ここを Null のままにすると、一般客数 = 訪日外客数 − Null となって一般客数ごと Null になります。 人数が分かっているのに消えてしまうわけです。
一方、統計そのものが未公表の月(本事例では2026年8月)は、0ではなく本当に不明です。ここを0で埋めると、訪日外客数がそのまま一般客数になり、クルーズ客がいなかったことにされます。
同じ「空欄」が2つの意味を持つため、指示 1-(8) で明示的に区別しています。
粒度の除外を指示に含めてください。 インバウンド消費動向調査には「全国籍・地域」「中東」「北欧」「その他」、訪日外客統計には「総数」「アジア計」「ヨーロッパ計」、船舶観光上陸許可には「総数」「アジア」「ヨーロッパ」といった合計行があります。これらをキーから除外しないと、個別の国と合計が同じ列に並び、合計すると二重に数えることになります。
AI の作業結果を確認する
データフロー「インバウンドファクトデータ」を保存しました。672行 = 21国籍・地域 × 32ヶ月(2024-01〜2026-08)、キー重複ゼロ。
行数が 21 × 32 = 672 と分解して示され、キーの重複がゼロであることも報告されています。結合処理で最も起きやすい失敗は「キーが重複して行が増える」ことなので、ここが確認されているのは重要です。
列構成は次のとおりです。
| 列 | 内容 |
|---|---|
| 国籍・地域 | 結合キー |
| 年月 | YYYY-MM(結合キー) |
| 訪日外客数 | JNTO の訪日外客数(クルーズ客を含む) |
| クルーズ客数 | 船舶観光上陸許可の全国総数 |
| 一般客数 | 訪日外客数 − クルーズ客数 |
| 1人あたり旅行支出 | 消費動向調査「全体」の消費単価 |
| 宿泊費_消費単価 ほか5費目 | 費目別の消費単価(6列) |
人数系の3列が隣り合い、その右に単価系が並びます。 引き算の材料(訪日外客数・クルーズ客数)と結果(一般客数)が並ぶため、検算が目で追えます。
処理の要点
AI は5つの処理について、何をどう判断したかを説明しています。

1. ヘッダーのタグ分解
3つのデータすべてで、ヘッダーにキーが埋まっているという同じ問題が起きています。指示 1-(2) に対する答えが、3行でまとめられています。
- 消費動向調査:
韓国_消費単価/韓国_構成比→ キー(国籍・地域)と指標に分解し、消費単価のみ採用- 訪日外客数:
1月と1月_伸率→ 月タグ+付随情報に分解。付随情報の付かない月列を訪日外客数と識別(累計は月でないため不使用)- 船舶:
全国_総数と沖縄県_那覇→ 地域タグ+項目に分解し、全国の総数のみ採用
同じ「列名を分解する」という操作が、データごとに違うものを取り出しています。消費動向調査では 構成比 を捨て、訪日外客数では _伸率 と 累計 を捨て、船舶では 県_港 を捨てています。捨てるものが3つとも違うのに、指示は「必要に応じてキーと付随情報を分けた上で処理する」の一文だけです。
累計 を除外している点が効いています。これを人数として拾うと、年計が月の値として紛れ込みます。
2. 粒度の整理
- 消費動向調査:費目区分3 が入る行は内訳なので除外し、費目レベル6項目のみ(「全体」=6費目の合計と一致を検算済み)
- 訪日外客数:
内訳列に値が入る行(中東地域/イスラエル 等)を除外- 四半期調査は調査期間の全月に同値展開(例 2024年1-3月期 → 2024-01/02/03)
括弧の中が重要です。「全体」の消費単価が6費目の合計と一致することを確かめてから、内訳行を落としています。内訳行を落としすぎれば合計が合わなくなり、落とし足りなくても合いません。検算が成立したこと自体が、粒度の切り方が正しかった証拠になっています。
3つ目の「同値展開」が、このファクトテーブルを読むうえで最も重要な性質です。実際の値は次の節で見ます。
3. キー対象の確定
キー対象(21区分、消費動向調査準拠)
韓国・台湾・香港・中国・タイ・シンガポール・マレーシア・インドネシア・フィリピン・ベトナム・インド・英国・ドイツ・フランス・イタリア・スペイン・ロシア・米国・カナダ・オーストラリア・メキシコ
21区分が名前で列挙されています。「21国籍・地域」という数だけでは、どの国が入ってどの国が落ちたか分かりません。一覧で示されているので、目で確かめられます。 ファクトテーブルの行もこの順に並びます。
4. 名寄せと粒度の除外

除外した消費動向調査の区分:全国籍・地域(全体計)、北欧・中東(地域計)、その他(残余)
名寄せした対応(2件)
消費動向調査(基準) 訪日外客数 船舶観光上陸許可 オーストラリア 豪州 オーストラリア(一致) 香港 香港(一致) 中国〔香港〕
名寄せが2件しかないことに注目してください。3つの官庁が別々に作った統計で、表記がずれていたのは2つだけでした。そして、寄せなかったものについても理由が示されます。
船舶の「中国」は本土のみ(中国+中国〔香港〕+中国〔その他〕=アジア計の内訳として整合確認済み)なので、そのまま中国へ対応させました。
中国 をそのまま使ってよいかどうかを、足し算で確かめたうえで判断しています。中国〔その他〕 を 中国 に足すと、中国本土の数が水増しされていました。
除外した区分も件数とともに報告されます。
- 訪日外客数 26区分:粒度違い=総数・アジア計・ヨーロッパ計…・中東地域・北欧地域・その他アジア…/対応なし=マカオ・モンゴル・オランダ・スイス・ベルギー・ポーランド・オーストリア・ポルトガル・アイルランド・ブラジル・ニュージーランド
- 船舶観光上陸許可 148区分:粒度違い=総数・アジア・ヨーロッパ…/対応なし=中国〔その他〕・ネパール・モンゴル・ウクライナ・トルコ・イスラエル ほか計140か国・地域(全件はデータフローの実行ログに出力)
ここで4種類の作業が同時に行われています。
- 列方向の粒度除外 — 3つのデータすべてから合計行を落とす
- 表記差の吸収 — 同じ国が
豪州とオーストラリア、中国〔香港〕と香港で書かれている。マッピングしないと結合できず、行が消えます - 対応しない区分の除外 — 上陸許可には148区分、外客数には26区分の「使わないもの」があります。消費動向調査の21区分に合わせて落とすのが指示 1-(4) の意味です
- 行方向の粒度除外 — 前のページで見た
費目区分3(新幹線、テーマパークなど)が埋まった内訳行を落とし、費目レベル(宿泊費・飲食費…)だけを採用
5. 0 と Null の書き分け
- 2026-08:船舶データ自体が存在しない月 → クルーズ客数・一般客数を Null(21行)
- 2026-07・08:消費動向調査が未公表 → 消費単価7列を Null
- メキシコ:消費動向調査に2026年1-3月期から登場 → 2024-01〜2025-12 の消費単価を Null(人数系は全月あり)
- ロシア:2024年1-3月期の消費単価が原データで「-」(非公表)→ Null
- 船舶データがある月に現れない国籍・地域はクルーズ客数0(例:2024-01のメキシコ・インド)。一般客数が負になる行は0件です。
指示 1-(8) がそのまま実行されています。0 が入った行と Null の行が別々に存在することを確認してください。
最後の一文が、この報告でいちばん実務的です。一般客数が負になる行が0件であることは、名寄せが正しく効いた証拠になります。寄せ損ねた国があれば、クルーズ客数だけが別キーに乗って、どこかの行で引き算が壊れます。
指示していなかったことを、AI が聞き返しています
報告の末尾に、指示になかった論点が2つ挙がります。
なお 2026年7・8月の訪日外客数は原データが**推計値(100人単位)**です。年月の終期は「3ソースのいずれかにデータがある最終月」としており、開始時期のみ2024年1月と指定されていたため、この終期の取り方を変えたい場合はお知らせください。
指示 1-(6) で決めたのは開始だけでした。終わりをどこにするかは書いていません。AI は「いずれかにデータがある最終月」という規則を自分で選び、そう決めたことを明示して、変更の余地を残しています。
もう一方の選び方は「3ソースすべてにデータがある最終月」です。そうすれば 2026-06 で打ち切られ、Null の行は出ません。本事例では人数のトレンドを2026年8月まで見たいため、長いほうを採っています。
2026年7・8月の訪日外客数は 100人単位に丸めた推計値です。Excel解析のページで「2026年の脚注にある斜体=推計値の区別は、セル書式でしか判別できないためテーブルには反映されていない」と報告されていた、その範囲にあたります。
直近2か月の数字を他の月と同じ精度で比べないでください。国別の細かい増減を論じるには粗すぎます。
ファクトテーブルを確認する
- 作成されたデータフローを開きます。

1行が「ある国籍・地域の、ある月」です。左から 国籍・地域 年月 と続き、訪日外客数 クルーズ客数 一般客数、そして 1人あたり旅行支出 と費目ごとの消費単価が並びます。分析にそのまま使える形になりました。
グリッドの先頭を見るだけでも、クルーズ客の比重が国によってまるで違うことが分かります。2024-01 の中国は 416,088人のうち 32,650人がクルーズ客、台湾は 492,288人のうち 8,378人、一方で韓国は 857,039人のうち 286人です。引き算をするかしないかで、国ごとの順位が変わりうる規模です。
17行目のロシアと21行目のメキシコでは、人数系が埋まっているのに単価系が NULL になっています。欠損の由来は下の節で扱います。
グリッドで 2026-01 のインド(515行目付近)と 2026-02 のインド(536行目付近)を見比べてください。
| 2026-01 インド | 2026-02 インド | |
|---|---|---|
| 訪日外客数 | 18,533 | 15,859 |
| クルーズ客数 | 205 | 4 |
| 一般客数 | 18,328 | 15,855 |
| 1人あたり旅行支出 | 212,460.8008 | 212,460.8008 |
| 宿泊費_消費単価 | 83,479.6174 | 83,479.6174 |
| 飲食費_消費単価 | 41,568.2661 | 41,568.2661 |
人数だけが変わり、消費単価はすべて同じ値です。消費動向調査が四半期単位でしか公表されていないため、1-3月期の値を1月・2月・3月に複製しているからです。
これは誤りではなく、指示 1-(3) のとおりの処理です。ただし月ごとの単価の変動を分析することはできません。 月単位で動くのは人数だけです。消費総額を月次で試算する場合、変動要因は人数のみになります。
Human-in-the-loop のポイント
AI に任せきりにせず、次の点は人が確認してください。
-
行数の内訳を検算する
672行 = 21国籍・地域 × 32ヶ月、と分解されています。掛け算が合うかを確かめてください。合わない場合はキーの重複か、結合漏れが起きています。「キー重複ゼロ」の報告も併せて読んでください。 -
一般客数が人数として成立しているか確かめる
一般客数 = 訪日外客数 − クルーズ客数が負にならないこと、クルーズ客数が訪日外客数を上回る行がないことを確認してください。国籍の名寄せを誤ると、ここが真っ先に壊れます。あわせて、クルーズ客の比率が国によって大きく違うことも押さえてください。期間全体では訪日外客数の3%程度ですが、中国は1割を超えます。 -
0 と Null が書き分けられているか確かめる
クルーズ客数が 0 の行(その月に上陸許可がなかった国)と、Null の行(統計が未公表の月)の両方が存在するはずです。片方しかない場合、指示 1-(8) が効いていません。 -
四半期の値が複製されていることを常に意識する
消費単価は同一四半期内で同じ値です。月次の単価の増減を論じることはできません。 月単位で動くのは人数だけです。四半期をまたぐ比較に限定してください。 -
除外された粒度と区分の一覧を確認する
外客数側で26区分、上陸許可側で148区分が落とされています。「全国籍・地域」「中東」「北欧」「その他」「総数」「アジア計」のほか、マカオ中国〔その他〕ニュージーランドのように消費動向調査に対応区分がない国も除外対象です。自分が分析したい対象が、この除外に含まれていないかを確認してください。たとえば中東全体を見たい場合、このファクトテーブルには入っていません。 -
名寄せの報告を点検する
豪州→オーストラリア、中国〔香港〕→香港のマッピングが行われました。他にも表記が違う国がないかを確認してください。マッピング漏れがあると、その国のクルーズ客数が0として扱われ、一般客数が過大になります。 21国籍・地域という数が期待どおりかを確かめるのが確実です。 -
期間の端と、その決め方を確認する
2024-01 から 2026-08 までです。3つのデータで揃っている最後の月は違います(訪日外客数 2026-08/クルーズ客数 2026-07/消費単価 2026年4-6月期)。終期を「いずれかにデータがある月」とするか「すべてに揃っている月」とするかは分析の目的で決めることです。指示に書かなかった場合、AI の選択を読んで追認してください。あわせて、2026年7・8月の訪日外客数は100人単位の推計値である点も押さえてください。 -
Null の由来を区別する
Null には複数の由来があります。結合できなかった組み合わせ、元データが「-」だったセル、そもそも公表されていない月。集計の際、Null を0とみなすか除外するかで結果が変わります。 -
複製された値であることを、後工程に伝える
ファクトテーブルの1行だけを見ても、その消費単価が四半期から複製されたものだとは分かりません。年月から四半期は復元できますが、後続の処理に渡す際は、この性質を明示してください。
消費単価の欠損は3種類あり、どれも理由が分かっています。 期間の端(2026-07・08)と、区分の追加(メキシコ)は、データソースの性質から予想できるものです。
残る1つ、ロシアの2024年1-3月期は、Excel解析のページで AI が「2024年1-3月期のロシア2列は全43行が -、混在列として数値化した結果が全欠損」と報告していた列です。解析時の報告が、そのまま結合後の欠損になっています。
AI の報告を読み飛ばさずに蓄積しておくと、後工程で出てきた空欄を**「不具合かもしれない」と疑わずに済みます。** 逆に、理由を説明できない欠損が出てきたときは、そこが調べるべき箇所です。
使用する LLM により、粒度の除外や表記差の扱いが変わります。何を除外し、何をマッピングしたかの報告を必ず読み、意図と一致しているかを確認してください。報告されていない除外があれば、行数が合わなくなります。
参考資料
本ページで結合しているデータは、前のページまでで取得・解析した3つの公開データです。画面キャプチャは出所を明示した上で引用として掲載しています。AI が作成したファクトテーブルおよび結合の判断は、GotoAI が Kari の動作例として生成したものであり、観光庁・日本政府観光局・法務省が作成・公表したものではありません。
消費動向データ
- 資料名: インバウンド消費動向調査(旧 訪日外国人消費動向調査)「参考2 国籍・地域別 費目別1人1回当たり旅行消費単価(パッケージツアー参加費内訳含む)」
- 提供元: 観光庁(国土交通省)
- URL: https://www.mlit.go.jp/kankocho/tokei_hakusyo/gaikokujinshohidoko.html
- 閲覧日: 2026年10月15日
- 利用条件: 同ウェブサイトの利用規約に従います。出典:国土交通省ウェブサイト(上記 URL)。
訪日外客数データ
- 資料名: 訪日外客統計「国籍/月別 訪日外客数」(時系列推移表)
- 提供元: 日本政府観光局(JNTO)
- URL: https://www.jnto.go.jp/statistics/data/visitors-statistics/
- 閲覧日: 2026年10月15日
- 利用条件: 同局の定めにより、出典元として「日本政府観光局(JNTO)」を明記のうえ利用しています。
クルーズ客数データ
- 資料名: 出入国管理統計「港別 船舶観光上陸許可を受けた外国人の国籍・地域」(月次表)
- 提供元: 法務省(出入国在留管理庁)/政府統計の総合窓口(e-Stat)
- URL: https://www.e-stat.go.jp/stat-search/files?toukei=00250011
- 閲覧日: 2026年10月16日
- 利用条件: 同サイトの利用規約に従います。出典:法務省「出入国管理統計」。
- 本サイトで引用した外部の情報は、Kari の利用例を説明するためのものです。それらの情報の正確性や最新性について、本サイトは保証しません。引用元の内容は予告なく変更・削除されることがあります。
- 本サイトで示した AI の出力は、記載の検証環境で実際に得られたものです。ただし、その出力の正確性や有用性について、本サイトは保証しません。AI の出力は、使用する LLM や設定、実行のたびに変わることがあります。
- 本事例は Kari の動作を示す例示であり、算出される数値は観光庁の公表数値と異なる可能性があります。
- 本ページのファクトテーブルでは、四半期単位の消費単価を月単位に複製しています。 同一四半期内の3ヶ月は消費単価が同一であり、月ごとの単価の変動を表すものではありません。
- 一般客数は「訪日外客数 − 船舶観光上陸許可数」で求めた近似値であり、観光庁の推計と一致する保証はありません。
- 2026年7月・8月の訪日外客数は、原データが100人単位の推計値です。 他の月と同じ精度では比較できません。
- 本ページで扱うデータには速報値および部分期間のデータが含まれます。分析結果は取得時点のものとして扱ってください。
- 結合にあたり、合計・地域計などの集計行は除外されています。除外された粒度については、元データを参照してください。
- 画面キャプチャは、掲載時点のバージョンの Kari で取得したものです。お使いのバージョンでは表示が異なる場合があります。
- 引用元の各機関・団体は、本サイトおよび Kari と提携・推奨関係にはありません。