PowerBI超入門


PowerBIを使ってお客様の売上データを分析する機会があったので、使い方などの概要をまとめておきます。
触ったことないけど、興味あるな〜って方のような**超初心者向け**の記事となっております。

## PowerBIってなに？

### 概要

microsoftが提供しているBIツール。
csvやSQLサーバ、はてはWebページなどからデータを収集してきて、それらを簡単に視覚化できます。Excelファイルなどからもデータをインポートすることが可能です。

### PowerBIのサービス群

色々あります。
今回使ったのは**powerBI Desktop**と**powerBI service**です。

- power BI Desktop
    - Desktopアプリケーションとして提供されているpowerBI。
    powerBIを使用してデータを可視化する際、ほとんどの場合はこれを使用することになるはず。
    様々なデータソースへ接続してのデータの取り込み、取り込んだデータの変換/整形、レポートの作成（可視化）を行い、「発行」をすることで後述するpowerBI serviceへデータが送信され、ブラウザ上で作成したレポートの参照が可能となる。
    ちなみに、アプリはmac非対応。windowsで頑張りましょう。
- power BI service
    - ブラウザからアクセス可能なクラウドベースのサービスです。
    ここからでもデータを取り込んでレポートの作成は一応可能ですが、かなり制限が多いのでおとなしくDesktopを使用しましょう。
    - このサービスの主な役割は、ダッシュボードの作成やレポートの共有です。
    ダッシュボードとは、作成したレポートをまとめていつでも参照できる形へ整形したものです。
    また、共有を行うことで、m365アカウントを持っている人であれば作成したダッシュボードやレポートを容易に閲覧可能となります。
- power BI Embedded
    - Azure上のサービスです。
    作成したレポートなどを自作のアプリケーションなどに表示したい場合、これを使います。
    - コレ自体はレポートの作成など分析に関する機能は何も持っていません。
    レポートやダッシュボードを使用してデータの可視化を行うためには、上記2つのサービスの利用が必須です。
    - 従量課金なので、立てているだけでもお金がかかります。使用しないときはちゃんと停止しましょう。
    
    
## PowerBI を使ってみよう！
では、さっそくPowerBIを使ってレポートを作ってみましょう。
レポート作成に使用するサンプルデータはMicrosoftのPowerBIの[チュートリアルページ](https://docs.microsoft.com/ja-jp/power-bi/connect-data/desktop-tutorial-analyzing-sales-data-from-excel-and-an-odata-feed)にて提供されているデータを使用していきます。
[こちら](https://download.microsoft.com/download/1/4/E/14EDED28-6C58-4055-A65C-23B4DA81C4DE/Products.xlsx)よりダウンロードしてください。

### その1：データの取り込み
まず、レポートとするデータの取り込みを行います。
今回はExcelファイルに記載された商品データとOData(Open Data Protocol)にて定義されている商品の注文データを取り込んでいきます。

#### 商品データの取り込み
PowerBIを開き、[**ホーム**] → [**データを取得**] → [**Excelブック**]を選択してダウンロードしておいたExcelファイルを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168722/f1665195-b5c9-f9f7-5e2e-36f59d1bbbe7.png)

選択すると、以下の図のようなダイアログが表示されるので、[**Products**]シートを選択し、[**データの変換**]を押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168722/0084fffe-9c5d-5749-7385-8d399c16883c.png)

すると、以下のような画面が表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168722/6333c12e-7549-7cb6-67b5-3137caa8fed8.png)
これはPower Query Editorと呼ばれるもので、取り込むデータの整形、加工ができます。
各列のデータ型の定義を変更したり、不要な列を削除したり、エラーとなっている値の置換をしたりと様々な操作を行うことができます。

ここでは、不要なデータ列の削除を試してみましょう。
ReorderLevel列とDiscontinued列は今回使用しないので、この2つを削除します。
CTRLキーを押したまま上記の2つの列を選択し、複数行を選択します。
選択した列の上で右クリックを行い、ドロップダウンメニューから[**列の削除**]の操作を行うことで、選択した行を削除することができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168722/1c64fd86-5945-6e39-078e-74bc2e1e8f0b.png)

この状態で左上の[**閉じて適用**]を行うことでQuery Editor上で行った操作が反映された状態でデータの取り込みが完了します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168722/1bc07fa0-0283-a234-e380-8281cdd73913.png)

#### 注文データの取り込み

次に商品の注文データを取り込んでいきます。
先ほどはエクセルファイルからデータを取り込みましたが、注文データはODataとなるので若干手順が異なります。
先ほどと同様に[**ホーム**] → [**データを取得**]を選択し、[**ODataフィード**]を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168722/15f00940-c2a3-e9a8-325c-241341da56d0.png)

すると、以下のようなダイアログが表示されます。
[Microsoftのチュートリアルページ](https://docs.microsoft.com/ja-jp/power-bi/connect-data/desktop-tutorial-analyzing-sales-data-from-excel-and-an-odata-feed)にも記載がある通り、以下のURLを入力します。
`https://services.odata.org/V3/Northwind/Northwind.svc/`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168722/a7ca1ec9-fb77-daf7-6f41-bcdfb3b04bcb.png)

しばらくすると以下のような画面が表示されるので、
[Orders]を選択し、[データの変換]を押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168722/fe566d8a-8519-7765-53e5-d47acd610580.png)

Power Query Editorが開いたかと思います。
今回使用しているOrdersのデータの中には、他テーブルへの参照情報が含まれています。
商品データとその注文データを関連付けるための商品IDや注文個数、値段などの情報はこの「他テーブルへの参照情報」の中に含まれています。
明示的にその他テーブルに格納された情報を、PowerBIへ取り込むデータの中に含める操作をしてあげないといけません。

[**Order_Details**]のヘッダの右端に表示されている展開アイコンを押下します。
表示されたドロップダウンメニューより、[**展開**]を選択した状態で[**ProductID**]、[**UnitPrice**]、[**Quantity**]を選択して[**OK**]を押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168722/23217ce4-3e18-93bf-e3c8-3f5cefcdf9cc.png)

この状態で[**閉じて適用**]を押下し、データの取り込みは完了です。


### その2：リレーションシップの設定

次に、取り込んだ商品データと注文データ間のリレーションシップを作成します。
リレーションシップは、2つのテーブル間のデータを結びつけることによって、あたかも1つのテーブルであるようにデータを取り扱うことを可能にします。
今回は注文データの取り込みにて作成したProductsテーブルとOrdersテーブル上のProductID列にリレーションシップを作成します。

PowerBI Desktopの左ペインの[**モデル**]を選択します。すると以下のような画面が表示されると思います。
ここには、取り込んだ2つのテーブルが表示されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168722/d10fc891-c0a0-3f3c-6f17-c39c50d2e11e.png)

この状態で画面上部の[**リレーションシップの作成**]を押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168722/c98b4c6d-a024-1295-f4de-94b7140a87bc.png)

上記のような画面が表示されるので、新規を押下します。
すると、以下のような画面が表示されます。powerBIによって自動的にリレーションシップが検出され、ProductsテーブルのProductIDとOrdersテーブルのOrder_Details.ProductIDが選択されていると思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168722/813e4162-40e4-77b3-de63-c2e5255bf562.png)

この状態でOKを押下し、リレーションシップを作成します。
すると、以下のように表示が更新されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168722/c4c3e84c-1352-7b60-a87b-7b6d136c26d5.png)


### その3：カスタム列の作成

Ordersテーブルには商品の値段(UnitPrice)と注文個数(Quantity)はありますが、注文の合計の列がありません。
Power Query Editorを使用することで、簡単に新しい列を作成することができます。
では、注文の合計のカスタム列を作成していきましょう。

まず、画面上部の[**データの変換**]を押下し、Power Query Editorを開きます。
左ペインから[Orders]テーブルを選択し、上部タブの[**列の追加**]→[カスタム列]を選択します。
カスタム列の作成ダイアログが表示されるので、以下のように入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168722/f978588c-7558-dd18-5067-1e57490b0f66.png)
この状態でOKを押下することで、Ordersテーブル上に注文合計を示すtotal列が追加されます。

また、カスタム列totalを作成した状態だとデータの型は「すべて」が指定されてしまっています。
数値として正常にpowerBI上で処理できるようにしてあげる必要があります。
作成したtotal列を選択し、その上で右クリックを行い表示されたドロップダウンメニューより、[**型の変換**]→[**固定小数点**]を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168722/a39275f7-66b9-6c88-cb58-76946cf7f25d.png)
これにより、作成したtotal列のデータ型が変更され、powerBI上で数値データとして処理できるようになりました。
[**閉じて適用**]を押下して変更を適用しておきましょう。

### その4：レポートの作成

これまで行ってきた手順によって、レポート作成の準備ができました。
さっそくレポートを作成してみましょう。

まずは全注文の売上の総計を表示させてみます。
PowerBI Desktop上の左ペインの[**レポート**]を選択し、右ペインの[**視覚化**]より[**カード**]をクリックします。
そうすると以下のような青枠で囲ったものが表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168722/d54205de-f65f-294f-b8d2-751b4cbaa02c.png)

今は表示するデータを選択していないので何も表示されていませんが、ここに前項にて作成したOrdersテーブルのtotalを指定することで、全期間の総計を表示することができます。
青枠で囲ったカードを選択した状態で、右ペインの[**フィールド**]より、[**Orders**]テーブルの[**total**]にチェックを入れます。
すると、以下のように表示が切り替わるはずです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168722/92f24d56-aeba-4599-58c3-5e5d93b1d34f.png)

この値はOrdersテーブル上のtotal列の値をすべて合計したものが表示されています。

#### ビジュアルの書式設定

カードに売り上げの総計を表示させてみたのは良いのですが、
タイトルが設定されておらず何の数値なのかよくわからないといった点や、&yen;表示になっているが、このデータはおそらく＄での集計である点など気になる点がいくつかあります。
ビジュアルの書式設定を行うことで変更が可能です。

* タイトルの表示  
  カードにタイトルを表示させてみましょう。
  右ペインの[**視覚化**]の中央部に以下のようなアイコンがあります。
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168722/cfcfcf0d-5cd6-aa9f-a4d4-4aae187d490d.png)
  この真ん中の[**書式**]を選択してください。ここでビジュアルの書式設定を変更することができます。
  [**タイトル**]をオンに設定し、[**タイトルテキスト**]に任意のタイトルを入力してください。
  [**カテゴリ**]をオフにし、テーブルのカテゴリ名を非表示にします。
  また、カードに表示する桁数を以下の手順で変更します。
  [**データラベル**]を選択し、[**表示桁数**]を[**なし**]へ変更します。

* 通貨の単位の変更
  カードに表示されている通貨の単位を&yen;から$に変更してみます。
  先ほどは[**視覚化**]からビジュアルの書式設定を変更しましたが、左ペインの[**モデル**]からテーブル列の書式設定を変更します。
  [**Orders**]テーブルの[**total**]を選択すると、右ペインにプロパティが表示されます。
  プロパティ内の[**書式設定**]から、[**通貨の表示形式**]を[**$ 英語(米国)**]に変更してみましょう。

上記の手順を行うことで、カードの表示は以下のようになりました。
容易にビジュアルの見た目を変更できることがわかるかと思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168722/31e6f604-86a9-31b9-c4bb-3385650b037f.png)

#### フィルタの設定

では、実際に売り上げデータをグラフにしてみましょう。
[**視覚化**]より[**積み上げ縦棒グラフ**]を選択し、[**軸**]へ[**ProductsテーブルのProduct**]を、[**値**]に[**Ordersテーブルのtotal**]をそれぞれ設定してください。
以下のように商品ごとの売上額を示すグラフを簡単に作成することができました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168722/34c1d728-2cad-2e80-295d-7669f9f7acf6.png)

このグラフの値を、注文日時を指定してある期間の注文だけ表示するようなフィルタを実行できるようにしてみます。
[**視覚化**]より、[**スライサー**]を選択してビジュアルを追加します。
追加したスライサーを選択した状態で、右ペインの[**フィールド**]より[**Orders1テーブルのOrderDate**]にチェックを入れます。
これにより、注文日時を指定してある期間の商品の総売上を確認することができるようになりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168722/a1454db1-8b6f-75f7-23fe-f0f0885f7f7d.png)

#### メジャーの活用

これまでで作成してきたレポートでは、1996年から1998年の売上の総計をグラフとして表示し、期間を指定してフィルタ可能にしてきました。
これをもう少し改良して、年度別の商品の売上をレポート上で比較できるようにしたいと思います。
これは、メジャーと呼ばれる機能を使用することで実現できます。

PowerBIには取り込んだデータに対して何らかの計算を行ったり、条件を追加して表示するデータの操作を行うことがあります。
このデータの操作の主な方法は２つあり、「計算列」を追加する方法と「メジャー」を用いる方法です。
計算列は、[その3：カスタム列の作成](#その3カスタム列の作成)にて作成したような、１レコード内の値から計算などを行い新たな列を追加します。
対してメジャーは、列の値を集計する際に計算などが必要な場合に使用します。
メジャーについてもっと詳しく知りたい方は、以下の公式ドキュメントを参照してみると良いかもしれません。
https://docs.microsoft.com/ja-jp/power-bi/transform-model/desktop-measures

では早速メジャーを作成してみましょう。
右ペインの[**フィールド**]の[**Orders**]テーブルを選択し、右クリックします。
表示されたドロップダウンリストより、[**新しいメジャー**]を選択します。
以下のようなテキストボックスが表示されるはずです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168722/a73bb731-7489-de58-d45f-6c0f985151a2.png)

ここにはDAXを入力します。
DAXとは、Data Analysis Expressionsの略称であり、Microsoftが開発したpowerBI上でデータの加工や計算を行う言語となります。
詳しくは以下のページにて解説されています。
https://docs.microsoft.com/ja-jp/power-bi/transform-model/desktop-quickstart-learn-dax-basics

表示されているテキストボックスに以下のDAXを入力してください。

```
1996年度売上 = 
CALCULATE(
    SUM('Orders'[total]),
    DATESBETWEEN(
        'Orders'[OrderDate],  
        DATE(1996,1,1),  
        DATE(1996,12,31)
    )
)
```
これは、total列を合計した値のうち、1996/1/1から1996/12/31の間の注文日付のもののみを集計して表示するためのDAXとなります。

同様の手順で1997年と1998年の売上を集計するメジャーを作ってみましょう。
DAX式は1996年度のものからDATE(199X,1,1)とDATE(199X,12,31)のXの部分を書き換えるだけでOKです。

これらのメジャーを使用することで、以下のような年度別の商品売り上げを比較するようなレポートを作成することができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168722/06b3412e-457d-8dd6-1db3-800cad827fb6.png)


## 終わりに
PowerBIの基本的な使い方をお伝えしてきました。
メジャーやDAXなどの使用に習熟が必要な機能は一部存在しますが、データを取り込んで分析可能なレポートの作成を容易に行うことができることがご理解いただけたのではないかと思います。
本記事がどなたかのお役に立てば幸いです。