Power BIでデータ解析を視覚化する 活用編
これまで2回に渡って、Power BIの基礎編、作成編と紹介してきました。ここまでで概ね、Power BI Desktopを用いて、データの整備や解析は出来ます。今回のエントリーはPower BI自体に備わってるいろいろな機能での操作で、データ解析を活用してみようという内容が目的になります。
また、Power BIとPower Automateの連携やデータ反映の自動化なども挑戦してみたいと思います。
目次
今回使用するアプリと資料
- Power BI Desktop
- ガントチャート – Power BI用ファイル
- 人口動態統計 – Power BI用ファイル
- 金属価格推移マトリックス - Excelファイル
- 金属価格推移マトリックス - Power BI用ファイル
Power Queryの活用
Excelでもおなじみのデータの加工に貢献してくれるPower Query。他のBIツールと違い、こういった機能があるのが、Power BIの利点の一つ。全く同様にPower BIでも利用が可能であるため、すでに学習済みの人にとっては学習コストゼロで、Power BI上で利用できますし、そうでない人も今後Excel上でも役立てる事が出来るので、学んでおくべき機能です。
但し、Accessのクエリ等とはちょっと異なるので、その機能と癖はよく見極める必要があります。
データソースの変更
自分個人だけの利用であっても、pbixファイルを他人と共有する場合であっても、問題になるのが「データソース」の更新。途中で同じデータ形式だけれど、違うExcelデータにしたいとなると、データソースを変更して更新を掛けないと、Power BI上でデータの入れ替えが出来ません。また、この時のデータソースはファイルに対してのフルパスで指定されているため、他人に渡した場合、当然その場所にそのファイルは存在しません。
そこで、こういったデータソースの変更を要するシーンに於いてデータの入れ替えをする手順はよく使うので覚えておく必要があります。変更手順は以下の通りです。
- Power BI Desktopでデータを読み込ませた状態にする
- フィールドにデータソースが表示されてるので、右クリック -> クエリの編集を実行
- Power Queryが起動するので、リボンより「データソースの設定」を開く。
- データソース設定が出てくるので、xlsxなどへのフルパスを選び、ソースの変更をクリック
- Excelの場合、ファイルパス画面が出てくるので、参照をクリックして新しいファイルを指定し、OKをクリックする
- データソース設定も閉じる
- Power Queryに戻ってきたら、プレビューの更新をクリックしてみて最新の情報に入れ替わっているか検証。
- 最後にリボンより「閉じて適用」をクリックしてPower BIに反映する
- 再度データソースに対してPower BIが読みに行くので、これでエラーが出なければ完了。
- 最後、Power BI上でファイルに保存するのを忘れずに。
図:データソース設定画面
列分割
時々現場のデータで見かける厄介な形式として、1つの列内(セル内)にて、複数の値がカンマ区切りなどで入ってるケースがあります。本来Power BIで解析する前にこういったデータはデータソースの側で前処理をしてから分析を行うべきですが、そうもいかないケースというのもあります。そこでこういったデータに出くわした場合に、Power Queryにて1つの列毎にデータを切り出す機能が列の分割です。
- Power BI Desktopでデータを読み込ませる
- フィールドにデータソースが表示されてるので、右クリック -> クエリの編集を実行
- Power Queryが起動する
- カンマ区切りの値が入ってる列をクリックする
- 右クリック -> 列の分割 -> 区切り記号による分割
- コンマで区切り記号の出現毎のままで、OKをクリック
- この段階で、指定の列の値がカンマ区切りの値毎に列に分離されて、列が生成されます。
- 閉じて適用をすると、分割した列のソースで適用がなされます。
図:列の分割機能
図:データ列の値に応じて列が分割された
クロス集計
いわゆるピボットテーブルと同じものですが、ピボットテーブルと異なり、データの再利用がしやすいので、Excelで活用する場合もピボットテーブルよりもPower Queryでクロス集計する機能を使ってクロス集計したほうがオススメです。今回は、金属名・年度・金額の3列のデータからクロス集計を作ります。
- Power Queryにて集計されていない生データのExcelを読み込ませる
- フィールドにデータソースが表示されてるので、右クリック -> クエリの編集をクリック
- クロス集計する時の列名にあたる列(今回は年度)の列を選択します。
- リボンより変換 -> 列のピボットをクリック
- ダイアログが出るので、値列には集計する数値の列を指定(今回は金額列)する
- オプションの値の集計関数はデフォルトが合計となってる。平均や中央値、最大最小、カウントなどを選べるので状況に応じて指定する
- すると、年度の分だけ列が作られ、金属名にてクロス集計された表が作られる
- あとはこれを元にレポートを作成すれば完了
図:オプションで集計関数の指定が可能(合計や平均)
ピボット解除
データをもらったらデータではなく、「集計された表だった」というケースが現場では多々見受けられます。しかも、セルに直打ちされているため、そのまま二次加工に使おうとすると非常に使いづらいということを作成者が分かっていないケースがあります。大本の生データがほしいのに。これを二次加工するにはマトリックス変換をしてあげなければなりません。
多くのこうした集計表はクロス集計表のようなスタイルになっており、これらから生データを復元する機能がPower Queryのピボット解除。解除してしまえばPower BI Desktopでそのデータを元に解析を行う事が可能になります(但し、もともとの表が集計表であるため、個々のデータは集計値でしかないため、大味な分析にはなってしまいます。今回は、金属の価格推移表を元にマトリックス変換してみます。
- Power BI Desktopで集計表のExcelを開く(表はテーブル化しておきましょう)
- 開いたら、フィールドにデータソースが表示されているので、右クリック -> クエリの編集をクリック
- 列項目の部分だけを選択する(サンプルだと金属名の列を除いて年度の列だけ選択する)
- 変換⇒列のピボット解除をクリックする
- リボンより閉じて適用をクリックして反映する
- マトリックス変換が完了したので、このデータを元にレポートを作成する。
図:縦横変換とは違いますよ
図:Power Queryでマトリックス変換出来た
図:推移表を作ることが出来た
DAX式と列追加
Power Queryにて既存のデータソースに対して、Accessのように計算式で列を追加するといったシーンで利用するのが、DAX式。例えば数値の列に対して一定の係数を掛けた値を演算した結果を列として加えたいといったようなケースで利用することが可能です。合計、平均、カウントの他にIFなどもあり、詳細はDAX関数リファレンスを見ながら作ることになります。
人口動態統計のxlsxからPower BIへ読み込ませて、DAX式を使って演算してみます。今回は、行毎に値の評価を行うCalculate関数とSUM関数を使ってみたいと思います。
- Power BI Desktopを起動し、人口動態統計のxlsxファイルを読み込ませる
- 右サイドバーのアイコン「データ」を開く
- リボンより「新しいメジャー」をクリックする
- Excelのように数式入力欄が表示され、メジャー = が表示されてる状態になる。
- 数式欄は、出生構成割合 = SUM(Sheet[出生総数]) / CALCULATE(SUM(Sheet[出生総数]),ALL()) と入力する
- 出生構成割合の列をクリックして、リボンより書式 -> パーセンテージ、小数点以下は3桁表示に変更する
- この出生構成割合は、データの項目としては列として表示されません。列として表示したい場合は、テーブルツール -> 新しい列をクリック後、6.と同様の書式にすると良いです。但し、数式は出生構成割合2 = Sheet[出生総数] / SUM(Sheet[出生総数])となり、5.と異なります(列とメジャーでは挙動が異なる)。
- レポート画面に戻り、視覚化から「テーブル」を追加、値として年度、都道府県、出生総数、出生構成割合を追加。出生構成割合が行の出生総数 / 全体の出生総数合計のパーセンテージ表示になっているか確認。
- あとはこのデータソースを元に可視化を追加してレポートを作成すれば良いです。
今回計算対象としては全体合計にしましたので、calculate関数では引数としてALL()を利用しています。実際の現場では、全体ではなく、特定の列の、例えば今回で言えば年度などでフィルタして各年度の総合計に対する割合といったような計算を行うシーンが多いのではないかと思います。この場合、ALL()の引数には、Sheet[年度]を追加したりします。
図:1行ずつ評価して全体に対する割合を出してみた
M言語を使ってみる
言語仕様
Power QueryにはM言語と呼ばれる独自のスクリプト言語環境が装備されており、これまでもクエリ編集で加工を加えた結果は、実は後ろでこの言語によってスクリプトが自動生成されていたりします。基本的な型は
1 2 3 4 5 6 7 |
let 変数A = 変数B = 変数C = 変数D = in 変数D = |
letで様々な処理をし、inでそれを出力する。また、引数を取る関数のようなスタイルの場合には、以下のような形で構築します。こうすることで、実行時にパラメータ入力が要求され、そのパラメータに応じてクエリが実行されて結果を吐き出すようになったりします。
1 2 3 4 5 6 7 8 9 10 |
let functionname = (arg1 as string) as table => let 変数A = arg1 変数B = 変数C = 変数D = in 変数D = in functionname |
図:こんな感じでクエリにはスクリプトが定義されてる
ユニークな値を取り出す
このM言語を利用して、特定の列に於けるユニークな値を取り出してみたいと思います。前項の金属価格推移マトリックスのピボット解除後のデータにある金属名の列かに対して、M言語でユニークな値を取り出してみます。
- Power Queryにて、ピボット解除後のデータを出しておく。
- 左サイドバーで右クリック -> 空のクエリをクリック
- クエリ1が作成されて、入力欄に、「=List.Distinct」と入れてみる(これがユニーク値を取り出す関数です)
- 次の画面にて、列の選択を実行します。
- テーブル名と列の選択にて金属名を選択してOKをクリック
- 呼び出しをクリックする
- ユニークな金属名が抽出される(呼び出された関数として作られる)
- リボンより、ホーム => 詳細エディタを開く
- すると今回の処理のM言語が書かれている。初めからこのような形でコードを記述すればダイレクトに処理がなされます。
より高度な記述をする事で、たとえばREST APIでリクエストした結果、複数ページに渡るケースで、次のページのデータを続けて受信して、全レコードを取得した結果を表示させるといったようなことも可能になります。
1 2 3 4 |
let ソース = クエリ1(テーブル1[金属名], null) in ソース |
図:M言語の記述
図:ユニーク値が抽出出来た
Power Automateとの連携
Power BI上から設置ボタンをクリックすることで、Power BI上のデータをPower Automate側に渡し、フローを実行する為の機能として、Power Automate Visualと呼ばれる特殊なカスタムビジュアルがプレビュー版ですが、Microsoftから提供されています。以下の手順でビジュアルを追加し、Power Automate上でフローを構築する事で、様々なタスクランナーを構築可能です。
Power BI側の作業
今回はガントチャートのpbixファイルを利用して、この機能を試してみたいと思います。
- Power BI Desktopでファイルを読み込む
- リボンより、その他の資格エフェクトをクリックし、AppSource空をクリックする
- ダイアログの検索窓よりautomateで検索して、Power Automateを見つけ、追加をクリック
- 視覚化にPower Automateのアイコンが表示されるのでクリックして、ビジュアルを追加
- 4.のPower Automate Dataにデータソースから適当にデータを追加する
- 4.で追加したビジュアルの右上にある「…」をクリック -> 編集をクリックする
- Power BI Desktopの中にPower Automateの画面が表示される。現在4つほどフローテンプレートが表示されています。Power BI Desktopでログインしてるテナントに自動で接続されるので、アカウントが複数ある場合は注意。
- 左上にある「+新規」をクリックしてインスタントクラウドフローをクリック。クリックされたPower BIボタンというフローが自動で追加されます。
ここまでが、Power BI Desktop側の処理となります。
図:カスタムビジュアルとして追加する
図:ビジュアルにデータを追加した様子
Power Automate側の作業
前項に続けて、Power Automateにフローを普通に追加していくことになります。今回はTeamsにメッセージを送信してみようと思います。
- 新しいステップをクリックする
- 検索窓でTeamsを検索し、「メッセージを投稿する(v3)」を選ぶ
- チーム、チャネルを選びます。
- メッセージをクリックすると、Power BI側の送信項目であるデータソースの列名などが出てくる。今回は、ユーザIDとタイムスタンプ、タスク名等をメッセージに組み込んでいきます。
- 列名をクリックすると自動的にApply to eachのループが自動で作成されてレコード単位でTeamsに投稿されるように構築されます。
- 保存をクリックする
- 左上のレポートに戻るの下にある「←」をクリックして、Power Automateの一覧画面に戻る
- 今作成した「ApiConnection」と名前のついてるフローのラジオボタンをクリックして、適用をクリックする
- レポートに戻るをクリックする
- 戻ると、Power Automateビジュアルが「Run Flow」というボタンに変化する。この文字は、視覚化の書式にある「Button text」で変更可能。
図:Teamsのフローを構築してみた
図:適用を押さないと紐付けされないので注意
図:ボタンが完成した
実行してみる
作成したボタンは、クリックではなく「Ctrl+クリック」で実行されます。送信されるデータの上限は1000レコードになりますので、送信する場合には注意が必要です。送信を実行すると「トリガー中」のメッセージが表示され、完了しても特にメッセージは表示されません。実行が無事に確認するには以下の通りです。
- Power Automateを開き、マイフローから作成した該当のフローを開く
- 画面下に実行履歴が表示されていて、状況が「成功」ならばOK
- この画面はPower BI上のPower Automateの作成画面からも同様に確認可能です。
- この機能はPower BI Desktopのみであり、オンライン版では動作しません。
実際には通知のような機能よりも、こちらを参考にPDF出力でもして、メールやTeamsに1件だけ投稿するのがベストです。
図:レコードの数だけ送信されてしまうので要注意
図:実行状況の確認
データ反映の自動化
Power BIは発行にて、オンライン版にデータを発行出来ますが、これらの作業はそのままではユーザが手動で発行の手続きを実行しなければ反映しません。そこで有償の機能になりますが、Power BI上の自動更新機能を利用して、Power BI Desktop上で行ったデータの反映をオートマチックに行うことが出来るようになっています。
手段としてはPower BI DesktopでのDirectQuery機能を利用する手段と、オンライン版上で自動更新の設定を行う方法があります。
オンライン版の自動更新設定
オンライン版Power BI上でデータソースの更新を行わせる方法です。オンライン上で設定する事になるので、データソースがローカルPCの場合には、Power Automate Desktopのように「オンプレミスデータゲートウェイ」のインストールと設定が必要になります。データソースもオンラインの場合(AWS上のMySQLであったり、SharePoint Online上のExcelであったり)には、オンプレミスデータゲートウェイは不要です。
今回は、SharePoint Online上のExcelに接続して解析するファイルを発行させています。
- Power BI Desktopでオンラインのデータソースを利用したファイルを作成する。
- 発行をクリックして、オンライン版のマイワークスペースにデータを送り出す
- Power BI オンライン版にサインインして、マイワークスペース -> データセット+データフローの一覧を開く
- 対象のプロジェクトにマウスカーソルを移動すると、「更新のスケジュール設定」というものが出てくるのでクリックする
- ダイアログでまず、データソースの資格情報をクリックする
- 認証方法は「OAuth2」、プライバシーレベルの設定は「Organizational」を指定し、Microsoft365アカウントでログイン処理を済ませる。ローカルデータの場合ここで、オンプレミスデータゲートウェイの設定が必要になります。
- スケジュールされている更新を開く
- データを最新の状態に保つのチェックを入れてオンにする
- 更新頻度、タイムゾーン、時刻の設定を入れて適用を押せば、指定時刻に自動でデータを取得して反映するようになります。
- もちろん手動更新もこれで行えるようになります。
図:自動更新の設定箇所
図:これで自動更新されるようになる
DirectQueryを使用した自動更新設定
オンライン上のデータベースサーバ等に於いて、DirectQueryを使用して接続してる場合には、Power BI Desktop上での自動更新が可能になっています。自動更新を使えるようにするには、以下の手順で設定します。
- Power BIでDirectQueryで接続できるデータソースに接続してファイルを作成する
- ビジュアルを追加してる場合、追加したビジュアルを選択していない状態で、視覚化の書式を開く
- 項目に「ページの更新」という項目があるので、スイッチをオンにする
- ページの更新を選ぶ。今回は自動更新を選択
- 更新時間は30分毎としてセットしました。
これで、データソースに追加がなされた場合であったり、指定時刻毎にデータソースにアクセスしてレポートを自動更新するようになります。
※次項でDirectQueryでの接続方法について説明しています。
図:自動更新設定が使えるようになった
その他の設定
DirectQuery
Power BIでのデータ接続方法に於いて、ファイル内にデータを持たずに、直接データソースと接続して解析する方法になります。しかし、DirectQueryが利用できるデータソースは結構限られている為、この設定を使っての更新は多くの人が使えるというものではないと思います。主に
- Amazon RedShift
- Azure SQL Database
- Microsoft Dataverse
- Google BigQuery
- MariaDBやOracle、PostgreSQL、SQL ServerなどのDBサーバ(MySQLは利用出来ませんでした)
- SAP HANA
が日本国内ではDirectQueryが使えるデータソースとなると思います。この手法での接続手順は以下の通りになります。今回は、Google BigQueryにテーブルを用意して、そちらにDirectQueryで接続させています。予め、BigQuery側でsoniqueというデータセットを用意して、tomatoというテーブルと値を格納してあります。
- Power BI Desktopにて、データを取得をクリックし、Google BigQueryを選択し接続します。
- サインインを要求されるので、アクセスできるGoogleアカウントでサインインします
- ナビゲータが起動して、用意されてるプロジェクト一覧が出ます。BigQueryを用意したプロジェクトを開き、データセットを選択、データベースを選択します。
- 読み込みをクリックする
- 接続の設定が出てくるので、DirectQueryを選択してOKをクリック
- テーブル接続されて、いつものようにデータソースとして利用出来るようになります。
これで、ページの自動更新なども出来るようになります。但しDirectQueryはファイル内にデータを持っていないので、都度データを取得することになる結果処理が重たくなる傾向です。
図:BigQueryのテーブル選択画面
図:DirectQueryで接続する画面
図:BigQueryのデータソースの様子
自然言語検索
Power BIではチャートを作成する場合は基本的にはユーザが、チャートのタイプに合わせて自らデータソースから対象のフィールドを拾ってきて構成するのが定石です。しかし、グラフを作成するのに慣れていない人にとっては、どんな列をピックアップすべきかわからないことも多いです。そんなケースに対応する機能が、Q&A機能で検索ボックスにルールに従ってワードを入れていくだけで、自動的に適切なビジュアルパーツを選んで描画してくれます。
人口動態統計のBIファイルを用いて作ってみます。
- Power BI Desktopで対象のファイルを開く
- リボンの挿入をクリックし、Q&Aをクリックします。
- 検索ボックス付きのビジュアルパーツが入る。英語のみと書いてあるものの、フィールド名などは日本語でもOKです。
- 試しに、show 出生総数 と入力すると出生総数合計値が計算されて、値を表示するだけの単一のパーツが生成されました。
- また、show 都道府県 出生総数 と入力すると、2つのフィールドを使って、自動的に都道府県別出生総数棒グラフが生成されます。
- さらに、show 都道府県 出生総数 by 2018 (年度) といったように、byで絞り込みを書けてあげると、2018年度の出生総数の合計が表示されます。
- チャートタイプを指定する場合は、show 都道府県 出生総数 as treemap といったような検索を行うと、都道府県別出生総数をツリーマップで表示してくれます。
- 追加で年度でフィルタして表示したい場合には、show 出生総数 都道府県 as treemap filter 2018 (年度) とすることで、年度が2018のデータでフィルタして表示してくれます。
図:自動的に最適なグラフが選択されて表示される
図:チャートタイプを指定して表示
関連リンク
- Power BI データ アラートを Power Automate と統合する
- Power Automate を使用して、Power BI レポートをエクスポートし、電子メールで送信する
- Power BI で閾値を設定して、通知を受けるには?~Data alerts in Power BI Service ⇒ Microsoft Flow との連携~
- MS「Power BI」の「DirectQuery」--データインポートなしで手軽な分析や視覚化を実現
- Power BI Desktopでデータを自動更新する方法
- Power BIでデータ項目を追加する4つの方法
- ついに来ました!Power Automateビジュアル!
- Power Automate visual for Power BI report を試してみた
- Visio Visuals を Power BI レポートに追加する
- Power BI でのページの自動更新
- Power BI のリアルタイム ストリーミング
- DAX関数で最低限覚えておいたほうが良いかも一覧|Power BI
- Power BI等のDAXは怖くないよ!
- Power BI - SUM, CALCULATE(SUM), SUMX がどのように行コンテキストに沿って評価しているか