【コーディング不要】Microsoft Formsの複数回答をExcel Power Queryを使ってクロス集計する

# はじめに
 **※この記事は「[LTSグループ Advent Calendar 2023](https://qiita.com/advent-calendar/2023/ltsgroup)」に参加しています**

はじめまして！[株式会社エル・ティー・エス](https://lt-s.jp/)のそねはらと申します。
私は非エンジニアながらデータを扱うことが多々あり、最近は **Power Query** にはまっています。
今回、LTSグループでアドベントカレンダーということで、 **Power Query** に関するTipsをご紹介できればと思います。

# 想定読者
- Microsoft Formsで複数回答した設問を、他の設問とクロス集計したい人
- 上記の内容を、 **コーディングせずに** 実現したい人
- 同じく、Excel以外を **インストールせずに** 実現したい人

# やりたいこと
### Microsoft Forms で複数回答をつかうと・・・

手軽に利用できるアンケートツールとして、Microsoft Formsを利用することが多いと思います。
例えば、Formsを利用すると、以下のようなアンケートが作れます。
設問1でサービスを友人や仕事仲間に進める可能性（いわゆるNPS）を10段階で確認し、設問2・3ではサービスの満足・不満足の理由を確認しています。設問2・3は、複数回答を選択できるようにしています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3631668/6a4d3d2a-7f00-5ef6-1a0e-f8d8216c587d.png)

Formsには簡易的に結果を分析する機能があり、下記のようなグラフを見ることができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3631668/18601aaa-8108-fdc0-8ec7-aa8027ca2de6.png)

しかし、上記の分析機能はあくまで簡易的なものなので、フィルタやクロス集計といった操作はすることができません。
一方で、今回のアンケートだと、 **NPSが高いユーザーは、何に満足感を感じているか**や、反対に **NPSの低いユーザーが不満に感じているポイント**などのクロス集計をかけたいところです。

### ゴールイメージ
改めて、今回の分析のゴールとしては **NPSと満足点・不満足点でクロス集計** をおこなうこととします。
具体的には、下記のようなピボットテーブル・グラフを作ることを目指します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3631668/c10b235f-ec08-faa5-cfc0-ec136014d695.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3631668/dac96922-c9bc-2eaa-72ec-b5c10155f56c.png)

これを実現するために、下記のように **「NPS」「満足点」「不満足点」** をそれぞれ管理する3つのテーブルを作り、IDをキーにしてリレーションシップを張ります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3631668/d88ae141-10b9-76f5-dac4-7c13f7bb9b78.png)


# Power Query を使ってみる
### まずはExcelにダウンロード
Formsでは、回答結果をExcelにダウンロードできる機能があります。
クロス集計をおこなうために、Excelをダウンロードしてみました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3631668/24aca487-d660-0e14-e547-9e0275d475e7.png)
※一部列項目を非表示にしています。

ダウンロードしたデータを見ると、複数回答の項目は下記のように **「;（セミコロン）」** 区切りで回答が記載されていました。
`料金が安い;UIが使いやすい;機能が充実している;サポート体制が充実している;`

### Power Queryを立ち上げる
データの処理のために、 **Power Query** を立ち上げます。
回答データのテーブル内にあるセルにカーソルを合わせた状態で、 **「データ」 > 「テーブルまたは範囲から」** を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3631668/678d46d3-9ffc-535d-1045-f0956d36f47e.png)

すると、 **Power Query エディタ** がポップアップで立ち上がります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3631668/34b72641-4abe-4079-8de5-c0a4a0315e33.png)

ここから、クロス集計に必要なデータの処理をおこなっていきます。

### テーブルの複製・名前の変更
Power Query エディタの左側にあるナビゲーションウィンドウにてテーブル名を右クリックすることで、 **テーブルの複製・名前の変更** をすることができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3631668/267f458d-641d-65df-6afe-f895837db27b.png)

今回は計3つのテーブルを作成したいので、Table1から2回複製をおこないます。
併せて、区別がしやすいように適当にテーブル名をつけます。（今回は、「NPS」「満足点」「不満足点」としました。）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3631668/0667210d-0777-0403-4328-65d9773568de.png)

### 「NPS」テーブルの処理
はじめに、「NPS」テーブルの処理をおこないます。
「NPS」テーブルでは、IDとNPSの値だけがあればよいので、他の列は **右クリック > 削除** します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3631668/ce2ee451-f019-63be-db59-269cfc6d22e1.png)

また、分かりやすいように **右クリック > 名前の変更** で列名を変えておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3631668/aab7fac3-b26a-dc41-cb1d-3cf53a1df5ee.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3631668/733d839d-34e3-5308-4f8b-cc8cb50ffe8c.png)

### 「満足点」テーブルの処理
次は、「満足点」テーブルの処理をおこないます。
##### 不要な列の削除と名前の変更
「満足点」テーブルでは、IDと、IDごとに選択された満足点が一覧化できればよいので、他の列は **右クリック > 削除** します。
分かりやすいように、 **右クリック > 名前の変更** で列名も変えておきましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3631668/77747efc-38b1-e444-f6dd-3e253e3270a0.png)

##### 列の分割
次に、 **「満足点」** 列に含まれている複数回答を、集計のために分割する処理をします。
「満足点」列を選択肢、 **右クリック > 列の分割 > 区切り記号による分割** を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3631668/6c3fa0ee-a231-8f5a-84a4-a50c432c3ad4.png)

設定のポップアップが立ち上がるので、下記のように設定します。
| 項目 | 設定値 |
|:-:|:-:|
|区切り記号|セミコロン|
|分割|区切り記号の出現ごと|
|分割の方法|行|

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3631668/8ce250ef-aae0-5b4b-a14e-4543a937f4f0.png)

すると、1つのセルの中で「;（セミコロン）」により区切られていた複数回答が、列方向に分割されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3631668/b59c8a96-994a-79b2-ab10-7a23e763932d.png)

#### 空白行のフィルタ
最後に、 列の分割により作成した行には、 **空白** や **null** といった集計に不要な値が含まれているため、フィルタにより除外します。
 **「満足点」** 列のフィルタ設定を開き、 **空白** や **null** のチャックを外します。
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3631668/446cef11-01de-897a-3d68-9b766de3ba40.png)

こうして、 **IDごとに複数回答した満足点が、列方向に展開された** テーブルが作成できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3631668/2c6aedd3-bdd2-6023-c6d9-1a76ed9fb7fd.png)

### 「不満足点」テーブルの処理
 **「不満足点」** テーブルにおいても、「満足点」テーブルと同様の処理により、 **「不満足点」** 列を列方向に分割します。
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3631668/e013d726-d9a7-b716-cfd4-40e7ab15c29a.png)

### クエリの読み込み
ここまでで処理したテーブルをExcelで利用するために、クエリの読み込みをおこないます。
Power Query エディタ左上の、 **閉じて読み込む** をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3631668/61a8f2fc-cf23-7275-8ce9-639984ebb933.png)

すると、作成した3つのテーブルが、それぞれ新しいシートにテーブルとして追加されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3631668/715b4f09-e9fd-619b-e9df-78733320f6cb.png)

### リレーションシップの作成
このままでは単に3つのテーブルが作成されただけなので、 **リレーションシップ** を作成して、3つのテーブルを関連付けながら集計できるようにします。
**データ > リレーションシップ** を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3631668/822d13b1-2fb7-dbdc-b1e3-2b2ac3ae6e43.png)

すると、リレーションシップ作成のポップアップが立ち上がるので、 **新規作成** をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3631668/66512b46-2281-506e-089b-754b3609ad3f.png)

**「満足点」テーブルの「ID」列** と **「NPS」テーブルの「ID」列** とで、リレーションシップを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3631668/c5318694-a40d-16d2-f240-7e1ef60e4612.png)

**「満足点」テーブルの「ID」列** と **「NPS」テーブルの「ID」列** とでも、同様にリレーションシップを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3631668/5057ce6e-4866-99fc-5f41-ac5f6c802b7e.png)

### ピポットテーブル・グラフの作成
 **挿入 > ピポットグラフ > ピポットグラフとピポットテーブル** を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3631668/dd6deed9-109f-1815-21d6-acb3a7e9a088.png)

ピポットテーブル作成のポップアップが立ち上がるので、分析するデータに **このブックのデータモデルを使用する** を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3631668/0d46bf05-2715-807c-cad6-74a4b9b1097f.png)

新しいシートにピポットテーブル・ピポットグラフが作成されるので、 **軸（分類項目）に「NPS」** 、 **凡例（系列）に「満足点」** を設定します。また、 **値に「ID」** を設定し、値フィールドの設定から「重複しない値の数」を設定します。
こうして、「NPS」と「満足点」とでクロス集計をすることができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3631668/233c44f4-00ef-7db0-5636-c514433d28fc.png)

ピポットテーブル・ピポットグラフで作成しているので、後は行・列の入れ替えやフィルタ、グラフ種別の変更などを自由に設定することが可能です。

# おわりに
書き終わってみるとなかなかニッチな内容になってしまいましたが、ここまでお読みいただきありがとうございます！
Power Queryは少し取っ付き難さはありますが、学んでいくとこれまでVBA等でのコーディングが必要だったことがノーコードで出来るとても便利なツールだと思います。
何より、Excelさえインストールされていれば、他ツールのインストールがいらないという、非エンジニアの会社員にとってはとてもありがたいツールでもあります。笑

また、データベースやデータ分析の基礎を触りながら学べるため、これからデータ分析を始めたいという人にもおすすめのツールになっています。
MicrosoftのBIツールであるPower BIでも、Excelと同様のPower Queryによりデータ処理をおこなうため、ガッツリ分析をしたければPower BIへ移行しやすいというメリットもあると思います。

この記事が、みなさまのお役に立てばうれしいです！