【JKI】009_Simple_Anonymization
【JKI_009】課題を確認
Just KNIME It! (JKI)
今回の挑戦はこちら
DeepL翻訳するとこちら。
例は上述の通りです。参考情報として
【匿名化について勉強】
匿名化って正しくはどういう意味なんだろうと調べてみました。
上述のKNIMEでの匿名化実装例の記事に加えて日本語化されたディスクリプションを引用してみます。
Anonymization:個人名などの識別子を匿名化するために使用
Create Hierarchy:組み合わせによって個人を識別できる準識別子に適用
下記の記事ではk-匿名化技術を例示してくれていたので引用しておきます。
また、匿名化は個人情報保護などには欠かせない技術でありつつも、個人の特定を防ぐことの難しさもある程度は想像できます。
本格的な匿名化技術の難しさは十分伝わってきました。
さて、実は上記全て寄り道です。興味の赴くままに走り出してしまいすみません。
【今回の匿名化手法の特殊さについて】
実は今回の課題は上記技術を利用しないで解答が可能でした。
大きく分けて3つの要求がありましたね。
特に2番目が一般的にはあまりしない匿名化手法ではないかと思うのです。他の列と関係を持たないように列の行をシャッフルします。すなわち各行では特定の個人の状態を表現しませんので、各列の関連性の解析は不可能となり、各列の分布解析程度しかできなくなると考えられるからです。
この手法は匿名化よりもむしろ、機械学習での説明変数の寄与度を評価する時に使う技術のように思いました。
さて、ではworkflow(WF)を作ってみます。
【CSVファイルの格納と読込】
いつも通りのダウンロードとWFファイル内への格納をしました。
データ入手先:
CSV Reader設定:
結果:
バルセロナのメッシを筆頭に18207名のデータが!カラム数も89と豊富です。私がサッカーファンなら道草だけで1章書きそうです。
データソースは違うものの参考情報を。道草してすみません。
【機密事項の削除】
どの列が相当するかは明示されなかったので個人的に判断して下記の通り削除しました。
設定:
クラブ名は場所データに相当すると判断しています。
Body Typeは普通は体形の判別だと思うのですが、この列のデータに不備があるようで一部個人名などが入力されていましたので削除します。Body Type = Messiってどんなん?
あと、削除しなかったカラム群についてもいくつかのノードでデータ分布を確認して、個人特定につながりうるような偏りがないかなども一応見ました。
例えばですけど、18207名のデータが18207通りに分かれるカラムが残されてしまったら、IDと同じように使えてしまいますよね。本当に詳しく考えると上述のように複数カラムの組み合わせまで検証すべきかもしれませんが、今回は手が出ませんでした。
別件でKNIME日本コミュニティでも話題になっていましたが、こういう時に手軽にデータ分布を見ることができるStatisticsノードって便利だと思います。
【残りの列の行をシャッフル】
カラム別にループをかけてShuffleすればいいので、上記のようにしています。ランダムシードを指定しなくてもいいのでしょうが、必ず変わるようにと変数で定義して見たりしました。
設定:
【列名も匿名化】
Column Renameで実装可能です。
設定:
一見するとエラーが出ているように見えますが、ループ処理が完了した状態だと実行前の設定時とは違うカラムがループ処理されている場合に表示されます。実際には改名前のカラム名は変数で指定するので問題なく動作します。
【見事に引っかかりました】
これでLoop Endとつないで完了かと思ったんですよ最初は。でもこれでは匿名化には失敗します。
失敗した結果:
「他の列と関係を持たないようにする必要があります」が、元の関係性を保ったままで単に行順がシャッフルされています。
理由はデータ結合の仕様によります。
日本語化されたノードディスクリプションから引用します。
単にシャッフルしただけでRowIDカラムが変化してなければ、もともとのRowIDをキーにデータ結合されるのですから上記の結果になるのが当たり前ということです。
見事に引っかかった感があります。
【解答例の提出】
修正後WFはこちらです。
結果:
RowIDは下記の設定で再発番をしています。
WFはアップロードしました。
おまけ:
【JKI_008感想戦】
公式解答しか見ることができていないのですが、なかなか興味深いものでした。
棒グラフは解答1回目で充てた人は誰もいないことは表現する必要がなかったらしく私が独りで問題を難しく考えてあれこれしてしまったようでした。
公式解答は色遣いがきれいだなと思ったので紹介しておきます。
他には、
0から10の範囲でのスコアリングにNormalizerを使われていて自分にはない新鮮な発想だと思いました。
重みづけスコアリングについて私は愚直に加重平均を算出に行きました。
一方で、公式解答は目的が順位付けなのでより簡便に実装していました。
Meanで算出しているから正確には加重平均ではないでしょうが、順位付けには影響がないんですよね。合理的だなと思いました。
以上小並感想戦でした。
最近他の方のWF群までちゃんと味わえていないのがもったいないんです。自分で一回苦労してから他の人の美麗な回答を見ると記憶に深く残るんで、一層勉強になると思うのです。
記事を読んでいただきありがとうございます。 先人の智慧をお借りしつつ、みなさんに役立つ情報が届けられたらと願っています。 もしサポートいただけるなら、そのお金はKNIMEの無料勉強会の開催資金に充てようと思います。