AlteryxとPowerBIを組み合わせてログの解析と可視化を行う

# はじめに

弊社では昨年からAlteryxとPower BIを導入しています。今回自身の業務で2つのソフトウェアを組み合わせて使ってみたので、その内容を共有します。

# 概要

弊社で使用している技術系ソフトウェアのライセンス使用状況のログ（5分間隔、各日ごと別々のCSVファイル）をAlteryx Designerを使って解析し、日付およびライセンスごとに稼働率を計算してCSVファイルに出力します。そのCSVファイルをPower BI Desktopで読み込み可視化してレポートを作成しました。

# 詳細

## Alteryxを用いたログの解析

ライセンスログは以下の様になっています。

```text:20230925.csv
time,feature,issued,used
2023-09-25 09:00:00,feature_a,3,1
2023-09-25 09:00:00,feature_b,6,2
2023-09-25 09:05:00,feature_a,3,1
2023-09-25 09:05:00,feature_b,6,3
...
```

このようなログを解析し、下記のような各日ごとの稼働率を計算して出力します。

```text:DailyUsage.csv
Date,Feature,Max_OperatingRate,Avg_OperatingRate,Sum_UsedHours
2023-09-25,feature_a,1.0,0.333333,24.0
2023-09-25,feature_b,0.5,0.4,57.6
...
```

この解析をPythonを使って行うと、そのスクリプトは以下の様になります。

```python
import pandas as pd
from pathlib import Path


def read_csv_files(folder: Path) -> pd.DataFrame:
    """Read CSV files in a given folder.

    Args:
        folder: Folder where license log files are stored.

    Returns:
        License log data.
    """
    df = pd.DataFrame()
    for file in folder.iterdir():
        if file.is_file() and file.suffix == '.csv':
            df_tmp = pd.read_csv(file, converters={'time': pd.to_datetime})
            df = pd.concat([df, df_tmp])
    return df


def analyze_log(folder: Path, file: Path) -> None:
    """Read license log files and convert to daily data.

    Args:
        folder: Folder where license log files are stores.
        file: Output file for daily data
    """
    df = read_csv_files(folder)
    df.rename(columns={'time': 'DateTime', 'feature': 'Feature',
              'issued': 'Issued', 'used': 'Used'}, inplace=True)
    df['Date'] = df['DateTime'].dt.date
    df['UsedHours'] = df['Used']*5/60
    df['OperatingRate'] = df['Used']/df['Issued']
    df_daily = df.groupby(['Date', 'Feature']).agg(
        Max_OperatingRate=pd.NamedAgg(column='OperatingRate', aggfunc='max'),
        Avg_OperatingRate=pd.NamedAgg(column='OperatingRate', aggfunc='mean'),
        Sum_UsedHours=pd.NamedAgg(column='UsedHours', aggfunc='sum'))
    df_daily.to_csv(file)


if __name__ == '__main__':
    analyze_log(folder=Path('log'), file=Path('DailyUsage.csv'))
```

普段からpandasを使っている人ならすぐ作成できてしまう非常に簡単なスクリプトですが、Pythonを使ったことがない人にこの業務を引継ぐことになった場合、Pythonの環境設定もかかわってきて非常に大変です。

これをAlteryx Designerを使って解析するワークフローをノーコードで作成すると以下の様になります。

![alteryx-workflow.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130485/09cb258b-33b9-5877-e306-066395a7f3e4.png)

各アイコンは左から以下の作業をおこなっています。

1. 指定されたフォルダに含まれるCSVファイルの一覧を取得する。
2. 各CSVファイルのデータを読み込む（マクロ）。
3. 各CSVファイルから読み取ったデータを結合する。
4. 列名を修正する。
5. 「DateTime」列を基に日付データ「Date」列を作成する。
6. 稼働率等を計算する。
7. 日付およびライセンスごとにグループ化して集計する。
8. CSVファイルに結果を書き込む。

Alteryx Designerのワークフローを作成して引き継いだ場合、後任の人はAlteryx Designerをインストールして、(1)のフォルダパスか(8)のCSVファイル名のみを必要に応じてGUIで修正すればよいので、Pythonに比べて圧倒的に引継ぎが楽です。
一方で、ワークフローの作成はそれなりに慣れが必要で、いくらローコードで作成できるとは言えプログラミングの素養がない人が作成するのはかなり難しそうと感じました。基本的には、この種のことが得意な人がワークフローを作成して、実際にデータを取り扱う人は受け取ったワークフローの特定部分を入力して実行するというのが現実的なやり方と思います。
あとAlteryxはライセンス料がそれなりにかかるので、導入したら可能な限り使い倒して業務を効率化していかないと費用対効果が悪いです。各部署での使用率を上げるように支援する取り組みが必須と感じました。

## Power BIを用いた可視化

Alteryxを用いて作成した各日ごとの稼働率データをPower BIで読み込んで可視化します。
稼働率データのファイル「DailyUsage.csv」を読み込み、カレンダーテーブルとFeatureMasterテーブルを作成してリレーションを定義します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130485/4d1c0a60-f2f8-913c-a268-987366c71913.png)

カレンダーテーブルは、DAX式を用いてDailyUsageテーブルの日付範囲を基に自動生成します。

```DAX
Calendar = 
    var StartDate = MIN('DailyUsage'[Date])
    var EndDate = MAX('DailyUsage'[Date])
    return ADDCOLUMNS(
        CALENDAR(StartDate, EndDate),
        "日", DAY([Date]),
        "月", MONTH([Date]),
        "年", YEAR([Date])
    )
```

これらのデータを用いて各日の最大稼働率と今年度の平均稼働率のグラフを含むレポートを作成します。

![powerbi2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130485/ce2f3b9a-0c97-a01a-24fa-742d2a5730b4.png)

Power BI Proライセンスがあれば、このレポートを発行し、ウェブ上で関係者と共有することができます。またデータが更新された場合は、テーブルを右クリックして「データの更新」を選択すればデータが更新されます。
リアルタイムで、あるいは毎日更新して確認するようなデータの場合、クラウドデータベースを構築して自動更新するようにすればさらに楽になります。
Excelを使ってレポートを作成していると、関係者がセルの式をいじった結果、最終的にメンテナンス不可能なファイルになることが多いので、DAX式に慣れればPower BIの方が楽だなと思いました。皆さんも是非Power BIを使ってみてください。