訪日外客数データで Power BI レポート作成（データ可視化 中級編）【改訂版】

# はじめに
日本政府観光局の訪日外客数データを使って Power BI Desktop でレポートを作成していく方法を「データクレンジング 編」と「データ可視化 基本編」「データ可視化 中級編」「データ可視化 上級編」の４つに分けて記事を書きました

大変ありがたいことに、本シリーズをPower BI ワークショップや自習用コンテンツとして、たくさんの方にご利用頂いております
中級編以降のコンテンツ充実の声もあり、この度「データ可視化 中級編」を大幅に見直してリニューアルしました✨
本記事は、<b>「✨データ可視化 中級編【改訂版】✨」</b>です

「データ可視化 基本編」で作成したレポートをベースに、さらに他外部データと紐づけてレポート作成していき、可視化したグラフ結果からインサイトを得ていくという実践的な流れになっています
データクレンジング、可視化ともに 現場課題あるあるテクニックを盛り込んだ内容になっています

本編の前提となる「データ可視化 基本編」はこちらです↓

https://qiita.com/mimocihz/items/c157e1b5e51fb0b58b6d


もし、本記事「データ可視化 中級編【改訂版】」から体験したいという場合は、
下記のGitHubからコンテンツをローカルPC にダウンロードし、Zip展開して、「データ可視化 基本編」の完成見本の「F-data_report_sample_2.pbix」をベースに本章をはじめて下さい


https://github.com/mimocihz/powerbi_sample_report


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482258/48ec045d-c392-8c09-80e8-85a497b0ee01.png)

# レポート作成の流れ
1. 各国情報の作成
1-1. 各国人口データの取り込みとクレンジング
1-2. 東京から各国の首都までの距離一覧の取り込みとクレンジングとマージ
1-3. 国別通貨コードの取り込みとクレンジングとマージ
1-4. 1-1~3を省略したい人用：各国情報の取込
2. 各国情報のレポートデータ取込と国マスタとのリレーション設定
3. 訪日外客数の人口比ランキングの確認 💹
4. 外国為替ヒストリカルデータの取り込みとクレンジング
5. テーブルリレーション設定
5-1. [通貨] テーブル作成と [各国情報] と [外国為替ヒストリカルデータ] のリレーション設定
5-2. [年月カレンダー] 作成と [訪日外客数] と [外国為替ヒストリカルデータ] のリレーション設定
5-3. [年月]スライサーを[年月カレンダー]の[年月]に変更
6. 為替レートと訪日外客数の相関確認 💹
7. コロナ前後の訪日外客数伸び率の確認 💹

# 本編で学べること
:::note
学びポイント
✔ マスタとなる項目値の表記ゆれ補正等、データクレンジングの重要性　⇒ 1, 4 章
✔ Power BI のデータモデルの基本であるスタースキーマ構成と、多対多のリレーション対処法　⇒ 2, 5 章
✔ メジャー項目を活用した高度なデータ可視化　⇒ 3, 6, 7 章
✔ ビジュアルの協調表示とフィルターの相互作用の使い分けと制御方法　⇒ 7 章
✔ Microsoft Copilot (生成AI) を活用した DAX 式や可視化実装の生産性向上　⇒ 6, 7 章
:::


# 追加テーブルとリレーションイメージ
先に完成イメージを見ておいた方が、手順内容が理解できると思うので、先に説明します
・紫枠がファクトテーブル(実績データ)、オレンジ枠がディメンションテーブル（属性・マスタ）
・ファクトテーブルの [訪日外客数] [外国為替ヒストリカルデータ] を中心に、
データ分析の切り口となるディメンションテーブル [国マスタ] [各国情報] [通貨] [年月カレンダー] を周囲に配置する、
いわゆる「スタースキーマ」構成が Power BI の データモデルの基本である
・[各国情報] は 3つのデータソースから作成し、合体させたテーブルのみをレポートデータとして使用する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482258/1141e93b-0f73-0249-305f-5f2c97897f9f.png)


それでは、「データ可視化 基本編」で作成したpbix ファイルを使って、レポートを作成していきましょう！

## 1. 各国情報の作成
3つのWebデータソースを取り込んで、人口、東京からの距離、通貨の情報を持つ各国情報テーブルを作成したいと思います
3つのデータソースの表記ゆれを補正しながら合体させていく工程は、
業務現場にありがちな課題であり、即戦力となる技術なので是非泥臭く体験頂きたいですが、
1-1~1-3 を省略して、各国情報データの取込からスタートもできるように 1-4.各国情報の取込 も用意しています
時間の関係で1-1~1-3 をスキップしたい方は、1-4 からスタートして下さい

## データソース紹介
### ① 各国人口データのデータソース
「世界人口ランキング・国別順位（2023年版）」のデータをデータソースとして取り込みたいと思います

https://memorva.jp/ranking/unfpa/who_whs_population.php

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482258/f3667bb3-7654-9a93-f27a-f4672da60eb2.png)

ただし、このデータだと台湾の人口が中国に含まれてしまっているので、「中華民国の人口統計」のWikipediaの情報を元に編集を加えます

https://ja.wikipedia.org/wiki/%E4%B8%AD%E8%8F%AF%E6%B0%91%E5%9B%BD%E3%81%AE%E4%BA%BA%E5%8F%A3%E7%B5%B1%E8%A8%88

### ② 東京から世界各国の首都までの距離一覧

https://rinist.me/entry/819/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482258/24608b93-47e5-07cf-8078-1bba273cf4fa.png)

### ③ 国別通貨コード
各国の通貨が一覧化されており、外国為替ヒストリカルデータとの結合キーとして必要なので取り込みます

https://www.iban.jp/currency-codes

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482258/f99e4eb2-3613-0b12-4987-45b35b697bf8.png)

## 1-1. 各国人口データの取り込みとクレンジング
① データを取得 > Web > URL で下記 URLを指定
https://memorva.jp/ranking/unfpa/who_whs_population.php
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482258/dd7e6e10-3aeb-0030-3834-c369a2641565.png)

② ナビゲーター画面でHTMLの [テーブル1] を選択し、右側のビューでデータ内容を確認し、「データの変換」を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482258/4788e493-d685-643e-5199-712eca758052.png)

③ プロパティで [各国人口データ] に名前変更
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482258/9d4959a8-940f-f272-be49-319e03c64517.png)

④ [順位] [男性の人口] [女性の人口] 列を削除
⑤ [国名・地域名] を [国名] に名前変更
⑥ データの入力で、「中華民国の人口統計」のWikipediaの情報を元に台湾の人口（百万人単位）と人口変動率の列と、中国人口から台湾人口を引いて新しく中国の人口データを追加する
・台湾人口（Wikipediaの情報）： 2,339 万人
・中国人口： 1,425,894 千人 - 23,390 千人 = 1,402,504 千人
テーブル名は、 [台湾中国人口データ] に変更して、「OK」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482258/3f7aa61f-7dcd-879b-567e-35ca58a2858c.png)

⑦ [台湾中国人口データ] の列名を[各国人口データ] の列名に合わせて変更
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482258/f6e42d33-45a5-421b-2ec2-7ae9627da861.png)

⑧ クエリペイン > [各国人口データ] を選択し、[国名] 列の右側の下矢印をクリックし、「全世界合計」「中国」のチェックを外して除外
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482258/42087e80-0774-89e4-32d4-8f287c70dab1.png)

⑨ クエリペイン > [各国人口データ] を選択し、「クエリの追加」 を選択し、追加するテーブル：[台湾人口データ] を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482258/43e50245-a70f-dd2e-f302-88abcab1daf7.png)

⑩ 列の追加 > カスタム列 で以下列を追加
列名：[総人口]、カスタム列の式： [#"総人口(×1000人)"] * 1000
データ型を10進数に変更
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482258/7e17b93c-5bdd-2515-72e7-2b59a48993c5.png)

⑪ [総人口(×1000人)] の列を削除
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482258/a01d416e-6c2c-f742-bbe7-20f987aea392.png)


## 1-2. 東京から各国の首都までの距離一覧の取り込みとクレンジングとマージ
① 新しいソース > Web > URL で下記 URLを指定
https://rinist.me/entry/819/
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482258/fa70cdce-c8b8-a4a3-7db8-cc7844b99bad.png)

② ナビゲーター画面でHTMLのテーブルの [東京からの直線距離一覧] を選択し、右側のビューでデータ内容を確認し、「OK」を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482258/0bb3580c-49cf-19c9-829f-9a4590b8ae2d.png)

③ [1行目をヘッダーとして使用] をクリック
④ [距離] 列を選択して右クリック > 「値の変換」 で、検索する値：「 km」⇒置換後：（指定なし）で、 「 km」という文字列を削除（km の前の半角ブランクも一緒に削除）
データ型を10進数に変更
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482258/ff3036e6-7353-2eb6-34c5-ced05d39dc92.png)

⑤ [東京からの直線距離一覧]に香港とマカオのデータが入っていないため、
データの入力で、香港とマカオの距離データを追加する
・日本, 東京, 0
・香港, , 2786
・マカオ, , 2844
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482258/17d007cd-e412-b9d8-8d7e-f7a364ec19b6.png)

⑥ テーブル名は、 [東京からの直線距離一覧_香港マカオ] に変更し、列名を [東京からの直線距離一覧] の列名に合わせて [国名] [首都] [距離] 変更
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482258/dad280eb-ae52-31a3-cd5c-607f3c6ec319.png)

⑦ クエリペイン > [東京からの直線距離一覧] を選択し、「クエリの追加」で 追加するテーブル： [東京からの直線距離一覧_香港マカオ] を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482258/44c951f2-0afe-a28f-4d5d-6a60bc5a708a.png)

⑧ クエリペイン > [東京からの直線距離一覧] を選択し、[国名]列を選択して右クリック > 「値の変換」で、以下の値を変更する
※各国人口データにマージするために国名を合わせておく
・イギリス（英国）　⇒　イギリス
・アメリカ（米国）　⇒　アメリカ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482258/71cb0a4f-6258-b2ad-d6c8-d4201e3291c9.png)

⑨ クエリペイン > [各国人口データ] を選択し、「クエリのマージ」 > 「新規としてクエリをマージ」で
2つ目のテーブルは [東京からの直線距離一覧] を選択し、両方のテーブルの [国名] 列を選択してマージ列に指定し「OK」を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482258/3b9966b3-bc27-cbcb-f2d2-173b7019caf3.png)

⑩ [東京からの直線距離一覧] 列の右の「展開」ボタンをクリックし、展開後の採用したい項目のみに✅を入れる
ここでは、「首都」「距離」のみ選択し、「元の列名のプレフィックスとして使用します」のチェックを外す
（これに✅すると、「東京からの直線距離一覧.首都」のようにテーブル名が名前に入ってしまうため）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482258/369450d0-fc89-26af-3a95-9d6840c7ef76.png)

⑪ マージされた新しいクエリ名を「各国情報」に変更
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482258/d93fef2c-cb24-29ff-e41c-ebeb900eb132.png)


## 1-3. 国別通貨コードの取り込みとクレンジングとマージ
① 新しいソース > Web > URL で下記 URLを指定
https://www.iban.jp/currency-codes
② ナビゲーター画面でHTMLのテーブルの [テーブル1] を選択し、右側のビューでデータ内容を確認し、「OK」を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482258/51cc77ea-28c9-f135-6214-8944979308d8.png)

③ プロパティで [国別通貨コード] に名前変更
④ [国] 列を選択し、右クリック「値の置換」で  [各国情報] に合わせて値を変更
・アメリカ合衆国（THE）⇒アメリカ
・イギリスと北アイルランド（THE）のイギリス⇒イギリス
・大韓民国⇒韓国
・ロシア連邦（THE）⇒ロシア
・台湾（中国の地域）⇒台湾
・（THE）⇒なし
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482258/def488ba-1c15-f2a0-36bf-05a1245c5c50.png)

⑤ 同国で複数通貨の行が存在するため、[国] 列を選択し、右クリック「重複の削除」で重複行を削除する
（同国が2行存在した場合に、最初の行を残し、後続行が削除される）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482258/e8e4d21d-7d54-a0e2-6760-1be79b20c829.png)

⑥ クエリペイン > [各国情報] を選択し、「クエリのマージ」を選択し
2つ目のテーブルは [国別通貨コード] を選択し、両方のテーブルの [国名] [国] 列を選択してマージ列に指定し「OK」を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482258/9be41980-bad0-f417-a4d1-5eb673fd0ca7.png)

⑦ [各国通貨コード] 列の右の「展開」ボタンをクリックし、[通貨] 項目のみに✅を入れる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482258/bfb667f4-75e0-9e08-f3cc-e1f8d6ed8252.png)

⑧ [国名] 列を選択し、右クリック「重複する列」で列のコピーを作成し、「名前の変更」で [国名_結合用] に変更
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482258/35c9a021-bc74-2f02-97d9-e8e08239b93a.png)

⑨ [国名_結合用] 列を選択し、右クリック「値の置換」で [国マスタ] と結合できるように以下の値を変更する
・アメリカ⇒米国
・イギリス⇒英国
・オーストラリア⇒豪州
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482258/0d566d10-5116-7143-08d0-14463d14cbeb.png)

:::note warn
データ分析においては、他テーブルとリレーションをはって同軸（例：国名）で値を集計したり、同グラフに表示させたりするために、結合キー項目となる値の表記をあわせたり、マッピングテーブルを作成し、各テーブルの表記ゆれを調整統一することが大事なポイント
:::

## 1-4. 1-1~3を省略したい人用：各国情報の取込
1-1~1-3 工程を省略して、完成版の各国情報を取込ところからスタートする方向けの章です
1-1~1-3 工程を実施した方は、本章はスキップして下さい

下記のGitHubからコンテンツをローカルPC にダウンロードし、Zip展開し、
data > country_info.csv (各国情報データ) を手元にご用意下さい


https://github.com/mimocihz/powerbi_sample_report


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482258/48ec045d-c392-8c09-80e8-85a497b0ee01.png)

① データを取得 > テキスト/CSV を選択し、ダウンロードした country_info.csv を指定
② ナビゲーター画面でデータ内容を確認し、「データの変換」を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482258/fbc89662-f749-a2c4-e190-fa4721dc24bb.png)
③ プロパティで [各国人口データ] に名前変更
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482258/966f6b0f-332c-dc43-fadf-22a6ba8e3e81.png)

2章 の ② へ進む


## 2. 各国情報のレポートデータ取込と国マスタとのリレーション設定

クエリペイン に表示されるデータは、初期設定では全てレポートデータとして読み込まれる設定となっているが、[各国情報]を構成する以下データは、右クリック「読み込みを有効にする」を Offすることでレポートデータ更新としては使用されるが、レポートデータとしては読み込まないようにできる
・各国人口データ
・台湾中国人口データ
・東京からの直線距離一覧
・東京からの直線距離一覧_香港マカオ
・国別通貨コード
①レポートデータとして読み込みたくないデータを右クリック「読み込みを有効にする」を Off 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482258/163f39bb-4091-cf86-10e1-ad4e4918455c.png)

②「閉じて適用」で Power BI Desktop 画面に戻り、右のデータペインに [各国情報] だけが追加されたことを確認する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482258/e40e4625-563f-e014-28f6-29aac3955a7f.png)

③ 左の「モデルビュー」を開き、
[国マスタ].[国名] をクリックし、 [各国情報].[国名_結合用] にドラック＆ドロップしてリレーションを設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482258/f391183c-02ec-e245-bd1c-d290dc7b5893.png)

## 3. 訪日外客数の人口比ランキングの確認 💹
各国の人口はかなりちがうので、訪日外客数だけでなく人口比で見ることにより、
各国の訪日度＝親日度がわかるのではないかという発想で、人口比で見てみたいと思います

### [各国情報]を可視化してみる
まずは、[各国人口データ]で総人口ランキングや構成比を確認してみましょう
① 別ページから複製して新しいページ作成、上部分のスライサー以外のビジュアルは削除
② ビジュアル > テーブル、列：[各国情報]の[国名][総人口][総人口構成比%]
（構成比%の設定方法は、フィールドから[総人口]をもうひとつ列に選択し、右の下矢印をクリック > 値の表示方法 > 統計パーセントを選択）
③ [総人口]をクリックして降順に並び替え、総人口ランキングを確認
④ その他、「ドーナツグラフ」「マップ」等のビジュアルで[各国人口データ]を可視化してみる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482258/d496125a-df68-4b19-30e8-21ecb9507c95.png)

:::note
可視化からの考察
✔ 中国、インドの人口はダントツ高い、この2国で世界の1/3の人口を占めている
✔ 日本は11位、意外と上位
:::

### 訪日外客数の人口比ランキング
① [各国人口] ページから複製して新しいページ作成、上部分のスライサーと「総人口ランキングテーブル」以外のビジュアルは削除
② フィールドの[訪日外客数]を選択し、新しいメジャーを選択（右クリック またはテーブルツールタブから）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482258/0513b137-0f07-e361-877c-c590c0895fda.png)

③ 数式バーに以下入力し、書式を%にする
######
```ruby:DAX
人口比 = DIVIDE(SUM('訪日外客数'[人数]), SUM('各国情報'[総人口]))
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482258/f0d65b3d-4fac-9b14-3219-4aab8bc8e0a8.png)


④ 新しいビジュアルを追加、ビジュアル > テーブル、列に以下を選択
・[国マスタ]の[国名]
・[訪日外客数]の[人数]
・メジャーの[人口比]
・[各国情報]の[総人口]

⑤ [人口比]の降順に並べ替え
⑥ 隣に同テーブルビジュアルをコピペし、[人数]の降順に並べ替え
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482258/a120b5ac-63fd-118d-d021-73ef7053f93b.png)

⑦ わかりやすく[人口比ランキング]のメジャー項目も作ってみる
######
```ruby:DAX
人口比ランキング = RANKX(ALL('国マスタ'[国名]),CALCULATE('訪日外客数'[人口比]),,DESC)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482258/81e99594-7c03-b79f-0330-a4e39431cc3b.png)

:::note
可視化からの考察
✔ 訪日外客数累計を各国人口で割った人口比でランキングすると、香港、台湾、韓国は各国人口を上回る人数が訪日していることがわかる（リピート訪日人数が多いと推測できる）
✔ 訪日外客数ランキングでは上位 2 位の 中国は、人口比だと 24 位、米国も訪日外客数では 4 位だが人口比では 16 位以下と低い
✔ 近隣アジア 4 国(韓国、中国、台湾、香港）の訪日外客数が 7 割を占めているが、その中でも人口比でみると中国は 24 位と低い
⇒仮説：中国の人口を考えるとまだまだ中国からの訪日外客数は伸びしろがあると考えられる
:::


## 4. 外国為替レートヒストリカルデータの取り込みとクレンジング
各国の為替レートと訪日外客数は相関があるのではないか？
近年、訪日外客数が増加しているのは、円安だから観光客としては嬉しいからではないか？という仮説を検証すべく、為替レートを取り込んで比較してみましょう

### 各国人口データのデータソース
みずほ銀行の外国為替公示相場ヒストリカルデータをデータソースとして取り込みたいと思います

https://www.mizuhobank.co.jp/market/historical.html

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482258/0b8ade2f-7643-898f-e9cd-9dfe27ae0c81.png)

### 手順
① データを取得 > Web > URL を指定、「データの変換」をクリック
https://www.mizuhobank.co.jp/market/csv/m_quote.csv
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482258/7c311bea-5cff-de6e-496a-4c8c9f4e8e29.png)

② 1行目の通貨名を削除　行の削除 > 上位の行の削除 > 1行目を削除
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482258/daeb45e7-a15f-d999-b6d4-480c2fbc7253.png)

③ 日付列に [date] に名前変更し、一旦データ型をテキストに変更
④ このデータの日付 [date] が月末日となっているが、[訪日外客数] データは月初日を [年月] としているため、[訪日外客数] データに合わせて [date] から月初日を計算して [年月] を作成
列の追加 > カスタム列 > 以下の式を追加して「OK」クリック、データ型を日付型に変更
######
```ruby:カスタム列の式
Text.Middle([date],0,7) & "/01"
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482258/3abd7f36-a5b9-3fd7-e12e-79d7c4984d99.png)

⑤ [年月] を先頭に移動し（列を右クリック > 移動 > 先頭に移動）、[date] 列は削除する
⑥ 通貨列を全て選択肢、右クリック > 値の置換 を選択し、検索する値：「*****」、置換後：（指定なし）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482258/dd8381c5-bada-5c9a-df05-ad157531b4b8.png)

⑦ 同通貨が複数列存在するので、近年のデータが入っている列を優先し、片方は削除する
・インドネシアルピア⇒削除、インドネシアルピア_1 ⇒ ルピアに名前変更
・マレーシアリンギ⇒削除、マレーシアリンギ_3 ⇒ マレーシアリンギットに名前変更
・韓国ウォン⇒削除、韓国ウォン_4 ⇒ ウォンに名前変更
・中華人民元と中華人民元_2 は列を選択し 列の追加 > 列のマージで 結合済みの列を 人民元に名前変更後、元の2列を削除
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482258/9b3be795-37c6-3b2e-52b8-e79317e85bce.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482258/c88a9193-3df2-6434-5496-b8375d700f15.png)

⑧ 通貨名の表記ゆれを補正、[各国情報]の通貨名に合わせて以下変更
・タイバーツ⇒バーツ
・台湾ドル⇒新台湾ドル
・スウェーデンクローネ⇒スウェーデンクローナ
・南アフリカランド⇒ランド
・ベトナムドン⇒ドン

⑨ 通貨列を選択し、「列のピボット解除」を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482258/1853e1e1-b2e4-a518-8dd7-a6b743e7c21c.png)

⑩ 列名を[年月][通貨][通貨為替レート_円]に名前変更、[通貨為替レート_円]のデータ型を10進数に変更
テーブル(クエリ）名を[外国為替ヒストリカルデータ]に変更、「閉じて適用」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482258/e6239014-517e-7d36-7d28-25af34fbbfbb.png)


## 5. テーブルリレーション設定
## 5-1. [通貨] テーブル作成と [各国情報] と [外国為替ヒストリカルデータ] のリレーション設定
[各国情報] と [外国為替ヒストリカルデータ] を [通貨] をキーに直接リレーション設定したいところですが、Power BI でこれをやろうとすると、多対多のリレーションとなり設定できません
マスタとなるテーブルはキー項目がユニークな状態である必要があります

というわけで、まず [外国為替ヒストリカルデータ] の [通貨] からユニークな[通貨] テーブルを作成します

① 左の「モデルビュー」を開き、「新しいテーブル」を選択し、以下の式で [通貨] テーブルを作成
######
```ruby:DAX
通貨 = distinct('外国為替ヒストリカルデータ'[通貨])
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482258/443820f7-016d-51d1-301f-0922b24459a0.png)

② [各国情報]の[通貨] ⇔ [通貨]の[通貨] ⇔ [外国為替ヒストリカルデータ]の[通貨]でリレーション設定
[各国情報] の [通貨] を選択して、 [通貨]の[通貨]に向かってドラック＆ドロップで、[各国情報] と [通貨] テーブルを[通貨]で結合する
このとき、クロスフィルターの方向を双方向に設定する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482258/1c8c177a-1a0f-6e46-3249-3fc866733cc1.png)

:::note warn
クロスフィルターの方向は、データのフィルタリング方法を制御する重要な設定である
双方向を乱用するとパフォーマンス劣化に繋がるため、通常は マスタ（ディメンションテーブル）から実績テーブル（ファクトテーブル）への単一方向のフィルターでOK
しかし、今回はディメンションテーブルが多段階にまたがっており、
[各国情報] と [通貨] の間を単一方向とすると 通貨 ⇒ 各国情報 の方向になってしまい、国名でフィルターをかけても通貨のフィルターがかからない現象が起こるため、双方向に設定する
ディメンションテーブルが多段階ある場合には、この設定を注意すること！
[外国為替ヒストリカルデータ] と [通貨]のクロスフィルターは単一方向でOK、ファクトからディメンションへの逆フィルターは不要であり、下手に設定するとパフォーマンス劣化に繋がるため
:::

[外国為替ヒストリカルデータ] と [通貨] も同様に[通貨]で結合する


## 5-2. [年月カレンダー] 作成と [訪日外客数] と [外国為替ヒストリカルデータ] のリレーション設定
[訪日外客数] と [外国為替ヒストリカルデータ] は[年月]という日付項目を保持しており、同[年月]でフィルターして比較したり集計したりしたいです
そんなときは、独立した[年月]のカレンダーマスタを別に作成し、それをフィルターやグラフ軸に使用することで、同時にフィルターをかけたり、同じグラフにプロットさせたりできます

下記ドキュメントの通り、CALENDAR 関数を使って簡単に日付テーブルを作成することもできますが、

https://docs.microsoft.com/ja-jp/power-bi/guidance/model-date-tables#generate-with-dax

今回は年月単位（各年月1日だけのデータにしたい）のカレンダーマスタがほしいので、[訪日外客数]データに存在する[年月]日付からカレンダーマスタを作成したいと思います

① 「モデルビュー」を開き、「新しいテーブル」を選択し、以下の式で [年月カレンダー] テーブルを作成
######
```ruby:DAX
年月カレンダー = DISTINCT('訪日外客数'[年月])
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482258/5527c284-9441-0b18-a5a0-a651dbf12878.png)

③ [年月]の書式を日付形式（例. yyyy年mm月dd日）に変更

④ [訪日外客数]の[年月] ⇔ [年月カレンダー]の[年月] ⇔ [外国為替ヒストリカルデータ]の[年月]でリレーション設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482258/0a16a1d7-57b9-16a9-67ea-e6023e3382ac.png)


## 5-3. [年月]スライサーを[年月カレンダー]の[年月]に変更
① 各ページの上部分の[年月]スライサーを[年月カレンダー]の[年月]に変更
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482258/2037e856-bb79-f17d-5b81-736a45f4dc12.png)

② 視覚化 > ビジュアルの書式設定 > スライサーの設定で「指定の値の間」にすると日付範囲指定がしやすくなる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482258/2a34c4c1-523e-30de-7695-95b243da29f8.png)

:::note warn
小技：全ページのスライサーの設定を一気に変更
各ページのスライサーを同期をとる設定にしておくと、1箇所の内容を変更しただけで全ページに反映されて便利
:::


## 6. 各国為替レートと訪日外客数の相関比確認 💹
① [時系列]ページから複製して新しいページ作成、上部分スライサーと上の折れ線グラフだけ残す
② ビジュアルを「折れ線グラフおよび積み上げ棒グラフ」に変更し、各軸の値を以下に変更
・X軸： [年月カレンダー] の [年月]　（右の下矢印を開き、日付の階層から年月に変更）
・列のY軸： [訪日外客数] の [人数]
・線のY軸： [外国為替ヒストリカルデータ] の [通貨為替レート_円]
③ [地域] [国名] スライサーを各国に絞って波形の相関を確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482258/7afca1b6-fb3a-9f93-010b-fd09baf9badf.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482258/5984841a-8f5e-f033-1a87-d06f88f68dd7.png)

:::note
可視化からの考察
う～ん、為替と訪日外客数、関係あるような無いような...
円安が急激進んでいる昨今は訪日外客数も伸びてるように見えるが、コロナ以前を見ると為替が円高よりでも訪日外客数は増加しているように見える
:::

訪日外客数だと各国数値が異なるので、昨対比（＝前年同月比伸率）で比較してみましょう

④ データの[訪日外客数]を選択し、新しいメジャーを選択（右クリック またはテーブルツールタブから）
⑤ 数式バーに以下入力し、書式を%にする
######
```ruby:DAX
昨対比_訪日外客数 = DIVIDE(SUM('訪日外客数'[人数]), CALCULATE(SUM('訪日外客数'[人数]),DATEADD('年月カレンダー'[年月],-1,YEAR)))
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482258/e1b7535a-e335-5edc-1e4c-8556c8e8047d.png)

⑥ 上のビジュアルをコピペして、下に張り付けて、「折れ線グラフ」に変更し、各軸の値を以下に変更
⑦ 折れ線のY軸をメジャー項目の[昨対比_訪日外客数] に変更
⑧ コロナ後の [昨対比_訪日外客数] が大きすぎてわかりにくいので、Y軸の範囲を最大値：5(500%)に変更
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482258/30ef3eb4-0ee7-afc1-d49c-4dd2fdc2a6f0.png)

為替レートも [前年為替変動率] を算出して比較してみましょう
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482258/9444adb8-7775-4cac-7d9e-e199e2f28589.png)

⑨ データの[外国為替ヒストリカルデータ]を選択し、新しいメジャーを選択（右クリック またはテーブルツールタブから）
数式バーに以下入力し、書式を%にする
######
```ruby:DAX
前年為替変動率 = 
VAR CurrentRate = MAX('外国為替ヒストリカルデータ'[通貨為替レート_円])
VAR PreviousYearRate = 
    CALCULATE(
        MAX('外国為替ヒストリカルデータ'[通貨為替レート_円]),
        FILTER(
            ALL('年月カレンダー'),
            '年月カレンダー'[年月] = 
                DATEADD('年月カレンダー'[年月], -1, YEAR)
        )
    )
RETURN
IF(
    NOT ISBLANK(PreviousYearRate),
    (CurrentRate - PreviousYearRate) / PreviousYearRate,
    BLANK()
)
```

:::note warn
このようなDAX式をさらっとかける人は少ないはず、Microsoft Copilot をフル活用しましょう！
下記のように、やりたいことと、どのようなテーブルや項目があるかを説明しておくと、そのままコピペして使えそうなDAX式を作ってくれますよ
完璧ではないので、微調整しながら使うくらいの気持ちで活用しましょう
実際、このCopilotの返してきた式は惜しくて、真ん中の通貨EARLIER部分はそのままだと式として成り立たず、この1行を削除したら使えるようになりました！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482258/29d270d5-7774-2b97-7dd4-510200503c10.png)

:::

⑩ 折れ線の第2Y軸をメジャー項目の[前年為替変動率] に変更
中国
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482258/13c06a94-ee42-1814-d159-6fbf962bceb4.png)
香港
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482258/995e680a-39c3-1f03-1f9c-35c2ff44e320.png)
シンガポール
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482258/8dd94a0c-7162-79b7-9551-c41550c3f98a.png)


:::note
可視化からの考察
✔ コロナ以降は変動が激しすぎてよくわからない、もう少し経過観測しないといけない
✔ 為替と訪日外客数の相関は、コロナ以前は多少相関があるように見える国もあったが、強い相関はなさそう
:::


## 7. コロナ前後の訪日外客数伸び率の確認 💹
コロナが明けて、最近街中や観光地でインバウンドの方をたくさん見かけることが多くなりましたね
訪日外客数がコロナ前のピークの2019年を上回ったというニュースもやってましたね
でも、コロナ前とインバウンドの方の顔ぶれが少し変わった感じがするのは私だけでしょうか？
コロナ直前は、中国、台湾、香港等、中国語勢（ざっくりですみません）が多かった気がしますが、最近は欧米人や中東の方を以前より見かけるようになった気がしています
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482258/81ce2a79-b0bd-465b-559c-367202311971.png)

この "気がする" をデータドリブンに確認したくなって、このセクションを作りました
ほぼ興味本位ですが、このように気になったことを掘り下げて仮説⇒検証を繰り返すことがデータ分析において大切な姿勢です

さて、コロナ前後の比較はどうするのがいいか、実際にはコロナ禍という空白の時期もありますよね？
コロナ禍は忘れて、コロナ直前とコロナ後の訪日外客数の平均を比較するのがいいかと思います

① [年月カレンダー] に [CovidPeriod] を追加
年月カレンダーに時期条件で期間命名すればいいと思うのだけど、式を考えるのがめんどくさいので Copilotさんに聞いてみました ↓

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482258/1b6c2763-0d94-b55b-2083-573c0f2bd4ca.png)

はいはい、いいですね～
時期は少し調整して、2015年以前、コロナ以前(2015~2019年)、コロナ禍(2020~2023年)、コロナ後(2024年～)として、以下の式を使用して [年月カレンダー] に新しい列を追加します

######
```ruby:DAX
CovidPeriod = 
SWITCH(
    TRUE(),
    '年月カレンダー'[年月] < DATE(2015, 1, 1), "2015年以前",
    '年月カレンダー'[年月] >= DATE(2015, 1, 1) && '年月カレンダー'[年月] <= DATE(2019, 12, 31), "コロナ以前",
    '年月カレンダー'[年月] >= DATE(2020, 1, 1) && '年月カレンダー'[年月] <= DATE(2023, 12, 31), "コロナ禍",
    '年月カレンダー'[年月] > DATE(2023, 12, 31), "コロナ後"
)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482258/c717c9ce-efd6-bb78-f927-345db773cf12.png)

② コロナ前後の平均訪日外客数と、伸び率のメジャー項目を作成
データの[訪日外客数]を選択し、新しいメジャーを選択（右クリック またはテーブルツールタブから）
数式バーに以下入力し、[コロナ前後の訪日外客数伸び率] は書式を%にする
######
```ruby:DAX
コロナ以前_平均訪日外客数 = 
	CALCULATE(
    	AVERAGE('訪日外客数'[人数]),
    	'年月カレンダー'[CovidPeriod] = "コロナ以前"
	)
```
######
```ruby:DAX
コロナ後_平均訪日外客数 = 
	CALCULATE(
    	AVERAGE('訪日外客数'[人数]),
    	'年月カレンダー'[CovidPeriod] = "コロナ後"
	)
```
######
```ruby:DAX
コロナ前後の訪日外客数伸び率 = 
	DIVIDE(
		'訪日外客数'[コロナ後_平均訪日外客数] - '訪日外客数'[コロナ以前_平均訪日外客数],
		'訪日外客数'[コロナ以前_平均訪日外客数],
		0
	)
```

③ ビジュアル「テーブル」を選択し、列の値は以下を設定
・[各国情報] の [国名]
・[各国情報] の [通貨]
・[訪日外客数] の [コロナ前後の訪日外客数伸び率]
・[訪日外客数] の [コロナ以前_平均訪日外客数]
・[訪日外客数] の [コロナ後_平均訪日外客数]
・[訪日外客数] の [人数]
・[訪日外客数] の [人数]（統計のパーセント）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482258/deb94046-2eb5-99a4-a9f8-5d10f75f1399.png)

④ [為替レートと訪日外客数]ページから、訪日外客数と為替レートの折れ線棒グラフと通貨カードをコピペして、下に貼る
⑤ テーブルビジュアルの[コロナ前後の訪日外客数伸び率] 項目列をクリックして、降順に並べる
⑥ 気になる国名をクリックして、下のビジュアルで、訪日外客数と為替レートの推移を確認する
下のビジュアルの棒グラフが協調表示モードになっているので、上のビジュアルにフォーカスした状態で、
書式 > 相互作用を構編集 > 制御したいビジュアル＝下のビジュアルを「協調表示」から「フィルター」に変更して、相互作用を編集を再度クリックして編集モードを解除する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482258/eba057b9-8f86-3427-6399-4e7d13992444.png)

トルコ
もともと訪日外客数の少ない国ではあるが、コロナ後に200％近く激増している
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482258/c3a2d59f-83a1-98d9-dd93-901b603d0f17.png)

米国
訪日外客数の構成比は4位の米国が、コロナ後に更に訪日外客数が倍増している
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482258/943bedca-e0c6-adb5-baf5-93c3e354ff42.png)


訪日外客数の多い国順に並べると（人数構成比％の降順に並べると）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482258/6bc63603-d43d-bea3-fe73-268aaad83387.png)
中国
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482258/f897e3f3-94aa-b0dd-09d2-2ab9cbf94bb4.png)

地域別に [コロナ前後の訪日外客数伸び率] 降順に並べると
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482258/cc7926a5-6d59-3971-f173-89f1850c9034.png)


:::note
可視化からの考察
✔ コロナ後のトルコからの訪日外客数の伸び率が200％近く激増、トルコリラの為替レートは円高にも関わらず。。
この背景には、フライト増便やビザ緩和等の影響がありそう、伸び率2位のメキシコも同様
⇒為替レートや距離よりも、日本直行フライト数やビザが訪日外客数に大きく影響しそう

✔ 訪日外客数の 7 割を占める近隣アジア各国もコロナ後伸びてはいるが、他国と比べると伸び率は低い、特に コロナ直前では1位だった中国は伸び率マイナス、コロナ以前には戻っていない

✔ コロナ後の訪日外客数伸び率の高い地域は、オセアニア、北米、南米で、100%＝2倍近く増加
⇒ 欧米人が増えている "気がする" はデータでも実証された
:::

# さいごに
他データと紐づけて色々な切り口でデータ可視化をしてみると、新たなインサイトが得られますね
訪日外客数の目的や日本国内での流動等のデータとも紐づけてみてみると面白いかもしれないと、次々興味が湧いてきますね
データ可視化からインサイトを得ていくためには、具体的に考察を整理して、考察した仮説を確認していくように様々な切り口で可視化⇒仮説⇒可視化を繰り返し掘り下げていくことです

追伸：
３回で終わる予定だったのですが、国交省サイトから訪日外国人の日本国内流動データを見つけて、今まで作成したレポートと紐づけて見てみたい欲が出まして、続きの記事「データ可視化 上級編」を書きました
よろしければトライしてみて下さい

https://qiita.com/mimocihz/items/06aab526b0ac4411bf3f