データ準備でよく使うツールと簡単なマクロのつくり方　 – Alteryx User Group in 東京 Advent Calendar 2018 #alteryx #alteryx_ug

![photo.jpg](https://qiita-image-store.s3.amazonaws.com/0/238533/402e491e-ab5a-86d4-84aa-51425f062175.jpeg)

こんにちは、みずたにです

シリーズ20日目の当エントリは、データを扱っているときによく使うツールのご紹介です。
特にエクセルデータの加工や出力、Tableau用のデータ加工で使うツールの中で2018年によく聞かれた・使ったツールを紹介します。
また最後にバッチマクロを簡単に紹介します。


#目次   
**1. 行がセル結合されたエクセルをどうにかする。
2. 月別・日付別のデータをもれなく作成する。
3. データを複数のエクセルに分割して作成する。
4. マクロを使ってファイルをフォルダに配置する**

# １．行がセル結合されたエクセルをどうにかする
例えばですが、Tableauユーザの方ならおなじみの下記のような集計表を作って
<img src=https://qiita-image-store.s3.amazonaws.com/0/238533/b42c1763-c74d-d11c-6b84-6d351533b32f.jpeg width=60%>

こうエクセルに出力すると階層構造になっているところ（ここではCategory, Sub-Category）がセルセル結合されて出力されてしまいます。
<img src=https://qiita-image-store.s3.amazonaws.com/0/238533/ac34efbe-330a-6bd7-3b3b-52cda8f6effa.jpeg width=60%>

こういう行単位でセル結合されたエクセル表をデータとして使う場合、エクセルでセル結合を解除してセルをコピーして・・・という面倒な作業が発生します。
ここでAlteryxの**複数行フォーミュラ**を使うと簡単に処理できます。
<img src=https://qiita-image-store.s3.amazonaws.com/0/238533/b0b48957-9a41-4415-7f8f-fc8777b0ba54.jpeg width=30%>

フローとしてはこんな感じです。
<img src=https://qiita-image-store.s3.amazonaws.com/0/238533/a228596a-80a7-e1f4-55ef-914d30728878.jpeg width=60%>
**複数行フォーミュラ**の設定は以下のとおり、**式：**にアクティブ行が空白（null）ならば、
一行前の値をセット、そうでない場合は、アクティブ行の値をセットというように記述します。
<img src=https://qiita-image-store.s3.amazonaws.com/0/238533/a4189cfe-8df4-7b8c-87a1-35a2d0903d81.jpeg width=40%>
結果はこのように、空白だった行にデータがセットされています。（ここではSub-Category列も同様の処理を実施しています）
<img src=https://qiita-image-store.s3.amazonaws.com/0/238533/8abd2932-39ea-3eff-8f13-f2aed8fe827e.jpeg width=60%>

**複数行フォーミュラ**はこういったケースで活躍します、
なお、複数行フォーミュラツールの**例を開く**で、類似のフローを確認できます。
<img src=https://qiita-image-store.s3.amazonaws.com/0/238533/b0b48957-9a41-4415-7f8f-fc8777b0ba54.jpeg width=30%>

#２．月別・日付別のデータをもれなく作成する
Tableauに読み込ませるデータを作る際によくやってしまいがちなのですが、Tableauは時系列のデータにおいて、特定の月のデータがない場合でも構わず線を繋いでしまいます。
例えば下記の折れ線グラフでは3月のデータがありません。
<img src=https://qiita-image-store.s3.amazonaws.com/0/238533/d82c3763-5d88-9152-7bcd-5547f0a0951d.jpeg width=50%>
こういう場合、ちゃんと月別のデータを用意したうえで実績データを結合するなどが必要です。
ここで**行生成**のツールを活用します。
<img src=https://qiita-image-store.s3.amazonaws.com/0/238533/74312046-6c1c-0c79-1171-31edeaf771cc.jpeg width=30%>


例えば、下記のように顧客別のデータに対して、**行生成**のツールを使い月別のデータに展開します。サンプルとして使っているデータはAlteryxのサンプルデータのCustomer.yxdbになります。
（通常`C:\Program Files\Alteryx\Samples\ja\SampleData\`にあります）
<img src=https://qiita-image-store.s3.amazonaws.com/0/238533/08c9eefb-6564-43d6-6c7a-29526289ccec.jpeg width=80%>



**行生成**のデータは下記のとおり設定します。今回は2018年1月から12月まで月別に展開しています。
<img src=https://qiita-image-store.s3.amazonaws.com/0/238533/fb01c451-740f-caf0-4ad6-42e8bb9383d3.jpeg width=60%>
ループ式として`DateTimeAdd([YearMonth],1,"month")`を記述します。
結果としては、下記のように月別に展開されます。例えば顧客別月別購買データを作成する場合は、このように行生成を活用してデータを作成すると抜けがないデータが作成できます。
![WS000024.JPG](https://qiita-image-store.s3.amazonaws.com/0/238533/ce5d3a89-1508-83d7-0177-7d0d10c6324a.jpeg)


これも行生成の**例を開く**で、類似のフローが確認できます。

#３.データを複数のエクセルに分割して出力する
1つのエクセルに複数のシートに分けてデータを書き込むことや複数のcsvファイルを一度に出力することは**データ出力**で実現できますが、あるグループに基づいて複数のエクセルを出力することも**テーブル**および**レンダリング**を使えば簡単にできます。
<img src=https://qiita-image-store.s3.amazonaws.com/0/238533/61c41d7e-e814-2651-bc8d-130180ee5bce.jpeg width=30%>  <img src=https://qiita-image-store.s3.amazonaws.com/0/238533/f6739a4e-6aef-bfaf-1b81-6d71bde1c20b.jpeg width=30%>

さきほど使った、Sample - Superstoreのデータを使い、Categoryごとにファイルを出し分けてみます。
フローは下記になります。
<img src=https://qiita-image-store.s3.amazonaws.com/0/238533/181e9746-3b3b-00ae-6a12-259dcdaed5b8.jpeg width=70%>

まず、**テーブル**ツールで、ファイルを分けたデータの列項目をグループとして指定します。ここではCategoryを指定します。
<img src=https://qiita-image-store.s3.amazonaws.com/0/238533/def02ddc-0885-750c-3813-7c46c73d91e6.jpeg width=60%>

そして、**レンダリング**では、下記のように設定します。
**データを別々のレポートにグループ化する**のチェックボックスをチェック
**グループ化するフィールド**に先ほどの**テーブル**ツールで指定した列項目を指定
**以下によりファイル名を変更する**でReplace Filename With Groupを指定
<img src=https://qiita-image-store.s3.amazonaws.com/0/238533/b1303c42-e2a9-425c-fda4-74274141a2e1.jpeg width=60%>

そうすると、下記のようにCategoryごとにエクセルファイルが出力されます。
<img src=https://qiita-image-store.s3.amazonaws.com/0/238533/18da04b4-34e2-e315-7945-b02758ecfe90.jpeg>

#４．マクロを使ってファイルをフォルダに配置する
今回紹介する使い方はあくまで1例なのですが、簡単なのでご紹介します。
（マクロって何？というところは別エントリに詳しく紹介されているので割愛します。）
例として、作成した月別のデータを月別のフォルダにエクセルで出力したいケースがあるとします。
その場合、通常だと**データ出力**ツールを月別に作りそれぞれのフォルダに出力することになりますが、月が増えたときや年が変わった際にフローの修正が必要になります。
こういう場合、マクロを使えば、少し効率化できます。
（フォルダは事前に作っておく必要があります）

具体的な手順を見ていきます、まず３．のフローに少し手を加えて特定の年月（下では201801）のデータを年月別のフォルダに出力するフローを作ります。
<img src=https://qiita-image-store.s3.amazonaws.com/0/238533/ae0897a2-ae7a-0121-cbd2-fb378fbdfac1.jpeg width=100%>

上記のフローは**201801**という2018年1月のデータを**フィルタ**ツールで抜き出して、**データ出力ツール**で**201801**というフォルダに格納するフローです。
ここの**フィルタ**ツールと**データ出力ツール**の日付部分の値を**アクション**ツールで更新し、動的に抽出するデータを出力先を切り替えるようなマクロを作ります。
<img src=https://qiita-image-store.s3.amazonaws.com/0/238533/5194fe59-b889-e4a1-9fea-dee99f21e2b5.jpeg width=30%>

**フィルタ**ツールでの設定内容は以下になります`Operand - value='201801'`をハイライトし、**特定の文字列を置き換えます。**のチェックボックスをチェックしてください。
<img src=https://qiita-image-store.s3.amazonaws.com/0/238533/adcc894b-da5d-c3e9-f865-543a388d6a83.jpeg width=70%>

**データ出力**ツールの場合は、`File -value='フォルダパス'`をハイライトし、**特定の文字列を置き換えます。**のチェックボックスをチェックしたうえで、置き換えたい文字列、ここでは201801という年月別のフォルダ名を記述します。
<img src=https://qiita-image-store.s3.amazonaws.com/0/238533/008b7a66-8491-79a8-4548-c5ef0f94daf0.jpeg width=70%>

今回このyyyyMMの年月を外部からパラメータとして与えて繰り返し処理します。この場合、**コントロールパラメータ**というツールを使います。
<img src=https://qiita-image-store.s3.amazonaws.com/0/238533/804142d5-5e52-3d68-5a9e-307b28635dae.jpeg width=30%>

こんな感じで設定します。**コントロールパラメータのラベルを入力**には適当なラベルを設定しておきます。
<img src=https://qiita-image-store.s3.amazonaws.com/0/238533/d2392c45-231b-17ab-9f61-3ed3882ca899.jpeg width=80%>

最後にマクロ化しておきたいところだけ切り出し、入力として**マクロ入力**を設定します。
この際**マクロ入力**の設定で、**追加の入力接続**のチェックボックスをチェックしてください。
<img src=https://qiita-image-store.s3.amazonaws.com/0/238533/67fa4fd3-f87d-42a9-7ead-afaf1e0b4f6f.jpeg width=80%>

ここまで設定したらマクロを保存してください。デフォルトでマクロ（.yxmcファイル）として保存されます。
なお、オプション->ユーザー設定からマクロを保存するフォルダを指定しておく必要があります。
<img src=https://qiita-image-store.s3.amazonaws.com/0/238533/c33c7130-cf8b-289f-10da-46e782368ebd.jpeg width=60%>

そうすると、ツールパレットに先ほど保存したマクロがアイコンとして表示されます。（ツール名は保存したときのマクロの名前になります、ここでは"マクロ"としています）
<img src=https://qiita-image-store.s3.amazonaws.com/0/238533/03255fee-c3a8-3d71-f520-6713f26a9b24.jpeg width=70%>

それでは作ったマクロを使っていきます。
作ったマクロツールにはInputとなる接続が2つあります。上の"?"が逆を向いているのが、パラメータの入力で、下のグレーの入力がデータ接続の入力です。
<img src=https://qiita-image-store.s3.amazonaws.com/0/238533/c3b084bb-b7ea-a46f-8dd5-6f64748a6fea.jpeg>

先ほど作成したフローにおいて、**フィルタ**ツール、**データ出力**ツール部分をマクロに置き換えます。
<img src=https://qiita-image-store.s3.amazonaws.com/0/238533/fde456bb-f311-66ab-adf2-753dcbdc7ed4.jpeg width=80%>

ここで、データ接続の入力に対してはそのままマクロと接続しています。
一方、パラメータに対しては、データが持っている年月項目（このフローでは"yyyyMM"という列名）を**サマライズ**ツールでGroup by しパラメータとしてマクロに渡しています。
マクロの設定としては、下記のとおり"Questions"タブの**フィールドを選択**において、パラメータとして渡すフィールド名を指定します。（ここでは"yyyyMM"）
<img src=https://qiita-image-store.s3.amazonaws.com/0/238533/f319675e-a18a-1417-bfe0-b081da0bd8a4.jpeg width=80%>

そうして実行すると、渡したパラメータの数だけ実行されます。
<img src=https://qiita-image-store.s3.amazonaws.com/0/238533/57c68b41-24c4-fe73-3170-139bb1aee4e4.jpeg width=80%>

試しに、特定のフォルダを見てみると下記の通り、ファイルが出力されています。
<img src=https://qiita-image-store.s3.amazonaws.com/0/238533/3c68386e-3a1a-18f4-2d49-3c2603050903.jpeg width=80%>

こんな感じです。最初はとっつきにくい印象がありますが、慣れてしまうと簡単に使うことができます。

#まとめ
ということで、[『Alteryx User Group in 東京 Advent Calendar 2018』](https://dev.classmethod.jp/series/alteryx-user-group-in-tokyo-advent-calendar-2018/) 20本目のエントリ「データ準備でよく使うツールと簡単なマクロのつくり方」のご紹介でした。
明日21日目は、Rushさんの「RESAS API を使って 宿泊動向を さくっとビジュアライズしてみました」になります！