Power BIであいまい一致を使用してクエリをマージする

去年12月のアップデートで実装された[**Fuzzy merge – support for Top N best matches**](https://powerbi.microsoft.com/ja-jp/blog/power-bi-desktop-december-2018-feature-summary/#fuzzyMerge)。
日本語UIだと**「あいまい一致」**または**「あいまい結合」**になります。

猫型ロボットのひみつ道具一覧を作ってたら使う機会に恵まれたので、分かった所を書いていきます。

#あいまい一致を使用してクエリをマージするとは

[Microsoft Docs](https://docs.microsoft.com/ja-jp/power-bi/)に詳細な解説が…**無い**。
2019/3/8現在、なんと日本語は愚か英語ですら公式リファレンスがありません。

仕方ないので[非公式リファレンス](https://www.powerquery.io/table/table.fuzzynestedjoin)を読んでみましょう。

なになに、「**指定された列のテーブル間であいまい結合を実行し、結合結果を新しい列に生成します。**」
~~どういうことだってばよ…~~

自分なりに噛み砕くと、「**テーブルをマージする際に、照合列が完全一致でなく類似性によって評価される機能**」です。
~~すまねぇ、ロシア語はサッパリなんだ~~
##何ができるのか
あいまい一致とは**似た者同士をくっ付ける機能**であると言えます。

今回は猫型ロボットのひみつ道具一覧を作る過程で、[テレ朝](https://www.tv-asahi.co.jp/doraemon/tool/)と[Wikipedia](https://ja.wikipedia.org/wiki/ひみつ道具一覧_(あ-そ))のひみつ道具一覧をマージするのに使っています。

二つの一覧は同じひみつ道具を扱ってはいますが、別個に作成されているので**編述ルールは統一されていません**。
その為、テーブルをマージするには**多くの例外を処理する**必要がありました。

主な例外パターンは以下の通りです。

|例外パターン|テレ朝名称|Wiki名称|
|:--|:--|:--|
|振り仮名が付いている|Ｅ・Ｓ・Ｐ（エスパー）訓練ボックス|E・S・P訓練ボックス|
|スペースの有無|異説クラブメンバーズ　バッジとマイク|異説クラブメンバーズバッジとマイク|
|全角と半角|Ｎ・Ｓワッペン|N・Sワッペン|
|何か足りない|国際保護動物スプレー|国際保護スプレー|

これら例外パターンを全て把握し、例外処理するのは現実的ではありません。
しかし同じ物を扱っている一覧であれば、中のレコードも類似性が高い事は容易に想像がつきます。

であれば、**ひみつ道具名称の類似している部分を探し、類似性が設定した閾値を超えたら一致として扱えばいい訳です。**

これを上手く使うと**例外処理の手間を大幅に削減**する事が出来ます。

#本題を話す前に:予備知識
あいまい一致の説明の前に予備知識として、Power Queryにおけるクエリのマージについて少し説明します。

##通常のクエリのマージ
Power Queryにおけるクエリのマージは、特に設定を行わなければ**完全一致**のロジックで動作します。
###完全一致
完全一致ではキーとなる列の値が、文字数から何から何まで全て一致しなければ同一の値として扱われません。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/313502/bf28a96d-231a-06e9-64bd-408eeec6c29b.png)

####完全一致でありがちなハマりポイント
漏れがあるかもしれませんが、ハマりやすい一致しない条件は以下の通りです。

|一致しない理由|表A|表B|
|:--|:--:|:--:|
|大文字と小文字|Yellow|yellow|
|1バイト文字と2バイト文字|Y|Ｙ|
|前か後にスペースがある場合|Yellow|Yellow　|

今回は割愛しますが、Power Queryにはこれらハマりポイントをクレンシングするのに便利な機能が色々とあるので探してみてください。

#あいまい一致を使用してクエリをマージする
ここからはあいまい一致を利用する方法を説明します。

##あいまい一致を利用する
あいまい一致は、Power Query上で**[クエリのマージ]**内で利用できます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/313502/647b7c59-ee57-2d51-8052-4d2b8c61c7b9.png)
まずダイヤログ上で[あいまい一致を使用してマージを実行する]のチェックボックスを有効にします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/313502/105ed09e-5ea3-6610-27b6-94a2028887d3.png)
###あいまい結合オプションの説明
あいまい結合で利用できるオプションは以下の通りです。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/313502/3f862d5b-588b-440e-9cda-911f97f99375.png)

- 類似性のしきい値(省略可能)
    - 二つの列の値が一致として見なされるために必要な類似性を設定します。
    - 詳細は後述
- 大文字と小文字を区別しない
    - 有効にすると`Yellow`と`yellow`を一致として返します。
- テキストの一部を結合して一致させます
    - 有効にすると`Power BI`と`PowerBI`を一致として返します。
- 一致の最大数(省略可能)
    - 一致として返された値を類似性が高い順に最大何個返すかを設定します。
- 変換テーブル(省略可能)
    - カスタムマッピングに利用する変換テーブルを指定します。
    - 詳細は後述

####類似性のしきい値(省略可能)の詳細
|しきい値の最大値|しきい値の最小値|既定値|
|:--|:--|:--|
|1.00|0.00|0.80|

1.00では**完全一致**で動作します。
0.00では**無条件で全てが一致と返され、CROSS JOIN**の動きをします。

**0.90未満で文字数の違いによる類似を結果に含みます。**
つまり0.90未満に設定されている場合のみ、`Yellow`は`Yelow`と一致します。
####変換テーブル(省略可能)の詳細
[From]列と[To]列で作られた変換テーブルを読み込ませることで、特定の値にカスタム値をマッピングできます。
#####変換テーブルを使わない場合
以下の元テーブルと判定テーブルをあいまい一致で、**変換テーブルを使わずに**マージします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/313502/e70273ad-75eb-ad92-d126-f6785a5f44e8.png)
結果は一行のみ一致として判定されました。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/313502/ff7b12c4-ce72-5e7f-fecb-b28b03b40ac0.png)
#####変換テーブルを使う場合
次に同じ元テーブルと判定テーブルを**以下の変換テーブルを使って**マージします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/313502/9b27f9f0-47cf-f634-b4f7-22d244437cb5.png)
利用する変換テーブルをプルダウンで選択します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/313502/fbf0f9fd-6601-c8c7-3b1d-d4c1e6a0c97e.png)
結果は**変換テーブルでマッピングされた通り、全てが`江戸川コナン`に一致**として判定されました。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/313502/9faea7b8-7bc8-d451-078a-d1517da2b176.png)
事前に変換テーブルを用意することで、略語や類似語などを特定の語句に関連付けることが出来るでしょう。
#利用上の注意
**正確性や完全一致が求められる業務には絶対に使用しないで下さい。**

Fuzzyな処理はデータの正確さや健全性を大きく損ないます。
~~そもそも元から綺麗なデータを作っていれば、Fuzzyな処理なんてする必要がない~~

今回のひみつ道具一覧の場合は、**一致に誤りがあっても特に実害が無いので使っています。**
あったとしても、一覧からWikipediaの似た名前の道具ページに飛ばされるだけです。
#まとめ
- **あいまい一致は似た者同士をくっ付ける機能。**
    - しかも自分である程度ルールをコントロールできる。
- **完全一致を理解してから使おう。**
    - Power Queryにおける一致の条件はExcelと違うので注意が必要です。
- **業務に限らず、よく用途を考えてから使う。**
    - 「便利」である事と「効果的」である事は違います。

因みに筆者は冒頭で書いた猫型ロボットひみつ道具一覧を作っている最中です。
レポート画面が何時完成する事やら…(´・ω・｀)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/313502/1281d8c8-9245-9577-7c6a-3ca45522b478.png)
使っているひみつ道具一覧データはこちらです。
[テレビ朝日](https://www.tv-asahi.co.jp/doraemon/tool/)
[Wikipedia](https://ja.wikipedia.org/wiki/ひみつ道具一覧_(あ-そ))
皆さんも自分の好きなジャンルで是非チャレンジしてみてください。