[Power BI Tips] 列の分割には横と縦がある!? ～Power BI でアンケートを分析する場合に複数選択可能な値に困った時の対処法～

# Power BI で可能なデータ整形機能のひとつ
はい、今回は **[列の分割]** についてです。これは使えるようになると地味に強い武器になります。

# まずはケーススタディ
昨今いろんな場面で、アンケート、取りますよね。イベントや製品のフィードバック、マーケティングの一種、などなど。そんなアンケートの回答を集計して、分析する。当たり前のことですが、これが地味に面倒ですw

今回のネタはそんなアンケート結果をまとめるときに使えます。

## 例えばこんなアンケート
とある勉強会的なイベントがあったとします。セミナーでも結構です。最初にアンケートに入力してもらいます。
可能であれば、イベント中に集計を終えて、最後のまとめセッションで使いたい。また後に参加者の属性をまとめ、報告にも使いたいし、データとして保存もしたい。こんな前提です。

以下はアンケート例です。（今回は **[Microsoft Forms](https://forms.office.com/)** を使用しています）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152946/57b06281-f985-284f-87b5-9ce104346d85.png)
よくある質問項目ですが、何が困るって、そう、この **複数選択可能** ってやつです。

通常、回答者ひとりにつき、1レコード（＝1行）になり、質問項目ひとつにつき、1列を使います。つまり、この画像のように5問ある場合、質問項目の列は5列になり、複数選択可能な質問はひとつのセルに何らかの記号で連結されて、入力されます。

そう、これがやっかいなのです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152946/18437cc6-00ef-20d0-4e94-2437a380536e.png)
こういうことです。
このように一つのセルに複数の回答が何らかの文字で連結されると、理論上すべての組み合わせのデータができる可能性があり、それはすべて異なる値になってしまいます。これを集計するのはまともにやるととっても面倒で、とてもイベント中にできることではありません。

でも、Power BI の **[列の分割]** を使うと、これがすんごく簡単に分けられて、集計できます。

## 具体的内容はここから
今回もExcelファイルを用意しました。これをダウンロードしてください。
**[アンケート.xlsx](https://powerbistudy01.blob.core.windows.net/file/%E3%82%A2%E3%83%B3%E3%82%B1%E3%83%BC%E3%83%88.xlsx)**

## Power BI Desktop で読み込み
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152946/10a69861-c2ae-92a7-4be3-f76329e62fe4.png)
**Power BI Desktop** を開いて、**Excel アイコン** ⇒ ダウンロードした Excel ファイルを選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152946/8ee97d14-7a6d-accd-acb6-976fbd35f459.png)
**[テーブル1]** にチェックを入れて、**[データの変換]** をクリック

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152946/4a4452e1-ea60-f694-f615-1aa8f417786f.png)
そうすると **Power Query** エディターが開きます。赤枠の列が複数選択の質問項目です。これをどうにかしたいですね。

## 列の分割をする前に Key を決める
データから **Key** となる項目を探してください。**Key** とは一意の値で、値を指定したらレコードを 1 行に特定することができるものです。今回の場合だと **ID** か **メールアドレス** ですね。ただメールアドレスは回答が 1 人 1 回という前提があれば、ということになります。どちらでもよいですが、今回は **ID** を **Key** にします。

## Key を決めたら Key と質問項目のみのクエリ(テーブル)を作る
何を言ってるのかわからないと思うので、まずは騙されたと思って、以下の手順をやってみてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152946/5356d23f-9ff3-a95f-f834-eea30df50af6.png)
**[テーブル1]** を右クリック - [参照] をクリック

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152946/969309fe-8cdf-0b4f-3c9f-376982f8a5d5.png)
**[テーブル1 (2)]** ができました

※参照とはその名の通り**「参照」**なので **[テーブル1]** の最後の状態を参照していることになります。従って、もし **[テーブル1]** に何か変更を加えると、 **[テーブル1 (2)]** もその変更の影響を受けます。影響を受けたくない場合は **「参照」** ではなく **「複製」** を選んでください。**「複製」** は文字通りコピーで、クエリをイチから別モノとして実行します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152946/244f27a3-ba04-2abe-d86e-6b60d3f04406.png)
**[テーブル1 (2)]** の **[ID]** を選択した後、**Ctrl** を押しながら **[あなたの立場は？]** を選択します。それから **[あなたの立場は？]** を右クリックし、**[他の列の削除]** をクリック

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152946/5b23050b-475d-b24b-f797-ddddef0b2e55.png)
**[ID]** と **[あなたの位置は？]** のみになりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152946/833df7c2-aa14-a10a-889d-deca696eb601.png)
2行目の複数の質問が入っているセルを選択し、画面下部に表示された値を全選択して、メモ帳などに張り付けます。
値と値の間の **区切り記号** に使えるモノを確認します。

今回の場合は **半角セミコロン (;)** です。
ここまで確認ができたら、いよいよ列を分割します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152946/e3edef59-f13d-9cf5-3896-be7a2ff7ebbe.png)
**[あなたの位置は？]** を選択して [列の分割] - [区切り記号による分割] をクリック

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152946/e7692d5d-d8f6-2222-fda1-23e6330b7c2e.png)
**[区切り記号]** は **セミコロン** が選択されています。これは値を見て、たぶんこれかな？って勝手に推測してくれます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152946/cb465a01-5112-86e2-014e-109f2f1569b1.png)
選択可能なモノは全部で **6 種類 ＋ --カスタム--** です。**--カスタム--** は任意に入力することができます。
全角の記号や2文字以上の文字列を指定する場合は、**--カスタム--** を選んでください。

**[分割]** は

- **一番左の区切り記号** ⇒ 値の中で指定した区切り記号の左から1個目のところでのみ分割される
- **一番右の区切り記号** ⇒ 値の中で指定した区切り記号の右から1個目のところでのみ分割される
- **区切り記号の出現ごと** ⇒ 値の中で指定した区切り記号出現するたびに分割される

の3種類です

そしてここで大事なのは **[詳細設定オプション]** です。これは必ず開いてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152946/59161303-58f1-d5aa-d4e4-380bf53ec968.png)
デフォルトだとこの状態です。

- 分割の方向：列
- 分割後の列数：3
- 引用符文字："

**分割の方向** が一番大事です。**列** ということはここで OK を押すと、列が増えます。区切り記号で文字列を分割して、その値の数の分だけ列に分けてくれます。そして **[分割後の列数]** がなぜ 3 となっているか？というと、値をすべてみて、最大３つの値に分けられると判断しているからです。

ということで、とりあえずこのまま **[OK]** を押してみましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152946/95804442-f2de-f7f3-8054-f3e2be14d010.png)
はい、この通りです。
元の列名に .数字 という文字列を付けて、列を増やしています。**[あなたの立場は？.3]** ができていることを不思議に思うかもしれませんが、元の値を見ると、最後の値にも **セミコロン(;)** が付いているので、空文字が値として入っています。そして3つ目の値がない1行目と3行目は null になっています。

はい、今回はこれは目的の形ではないので、いったん元に戻します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152946/2fa9cb5d-31b9-9248-25d0-56b9ab0c9dfa.png)
画面右端の **[適したステップ]** の **[Changed Type]**（日本語だと **[型の変更]** となっています）の左の × をクリックしてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152946/9562c1f7-e17e-5d1a-d239-a38ebbf20e01.png)
次に **[区切り記号による列の分割]** のステップの右側の歯車マークをクリックすると **[区切り記号による列の分割]** 画面が開きますので、**[分割の方向]** を **[行]** にしてください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152946/38cf7cc0-6930-2f5d-b0dc-99b69b5df6ef.png)
そのまま **OK** をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152946/0f7d8e7d-6859-909c-444e-38258d01c0f9.png)
そうすると区切り記号によって分割した値を行に展開してくれます。そして **[ID]** は元の値を引き継いでいます。結果として ID が同じものが増えます。さて、列方向に分割した時と同様、空の値がありますので、**[あなたの立場は？]** の列名の右にある **▽** をクリックして **[空白]** のチェックを外します。こうすることで **[空白]** の行をフィルタリングで消すことができました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152946/efa2366d-5034-881a-5fe1-3348a019d25d.png)
画面右端の名前を**「あなたの立場は？」**に変えておきましょう

同様の手順で **[あなたの役割は？]** と **[今日期待することは？]** はもクエリを作成してください
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152946/13fb00d4-4a01-8fba-33db-b50e8cc93133.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152946/32800235-c904-3a82-0b57-3c47124f73b0.png)
**[閉じて適用]** をクリックしてください。

はい、これで Power Query での作業は完了です！
次は **[リレーション]** です。

## モデルペインを開く

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152946/4e396cd0-6733-0f45-32ad-7d0192003a92.png)
画面左端一番下の **[モデルペイン]** を開きます。この画面はテーブル間のリレーションを定義したり各カラムのプロパティを設定することができます。
ここでやることは2つ。

- 紐付けに使った **[ID]** を非表示にする
- クロスフィルターの方向を **[双方向]** にする

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152946/8a86fed9-ec87-132d-991e-f08068fe971f.png)
**Ctrl** キーを押しながら、周囲の３つのテーブルの **[ID]** 列を選択し、画面右側の **[プロパティ]** - 非表示を **[オン]** にします

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152946/4fd780cf-7796-4d16-cf68-87435a1a5b4b.png)
**[アンケート]** と **[あなたの役割は？]** テーブルの間の線を右クリックして **[プロパティ]** をクリック

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152946/fe78b468-4164-8468-fc28-e43af8e2282a.png)
**[リレーションシップの編集]** でクロスフィルターの方向を **[双方向]** にしてください。
これを他の2本の線にも設定してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152946/d9bff249-fcb5-87c1-2859-dbc6b98de670.png)
はい、これでできました。

あとは好きなようにビジュアルを作ってください！
たとえばこんな感じです

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152946/c470a96b-2326-6c11-40d4-cd37bc63c76a.png)
左上の「あなたの役割は？」を作るには、ドーナツグラフを選択して、
値に **[ID]**、凡例に **[あなたの役割は？]** を入れます。

あとはこのグラフをコピーして、凡例を **[あなたの立場は？]** に変えたら、
左下の**「あなたの立場は？」グラフ**のできあがり。

またグラフをコピーして、凡例を **[今日期待することは？]** に変えたら、
右下の**「今日期待することは？」グラフ**のできあがり。

という感じです。

# まとめ
いかがでしたでしょうか？
たぶん読みながらやると難しいなーとかややこしいなーと思われたかもしれません。
が、慣れると大したことはありません。実際このくらいの内容なら10分くらいで作れます。

そして私が紹介した方法が唯一の方法でもありません。皆さんなりにいろいろと工夫をしてみてください！
何かリクエストがあれば、以下までー🤗
Twitter: https://twitter.com/yugoes1021
Facebook: https://www.facebook.com/yugoes1021
LinkedIn: https://www.linkedin.com/in/yugoes1021/