19
15

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Pythonによる重複の確認方法とデータ匿名化の方法

Last updated at Posted at 2024-09-23

概要

目次

  • Pythonでデータに重複があるか確認する方法
  • PyCon JPが不正をしていない理由の解説

本記事では、Pythonで重複したデータを集約する方法、及び、機密情報を隠して集計をするための手法について解説します。
本記事で紹介するコードは投票結果の集計やアイデアの集計などで有効に使うことができます。
内容に誤りがありましたらご指摘ください。

本記事は、今後の健全なコミュニティの発展に必要不可欠な情報であるため、健全な技術コミュニティの発展を目指す情報交換プラットフォーム、Qiita.comにて公開します。

Pythonでデータに重複があるか確認する方法

リスト形式の場合

Pythonでリストから重複があるか確認する3種類の方法を紹介します。
重複の有無をbool値で出力します。
外部ライブラリ、cythonを使わない場合、データの分布に関する事前情報がない場合はこれらの方法が有効です。

setを使う方法

values = ['A', 'A', 'B']
len(values) == len(set(values))

list.countを使う方法

values = ['A', 'A', 'B']
any(values.count(value) > 1 for value in values)

collections.Counterを使う方法

from collections import Counter

values = ['A', 'A', 'B']
any(count > 1 for count in Counter(values).values())

辞書型データ構造の場合

キーの重複を抽出する

[{ユーザー名:アイデア},{ユーザー名:アイデア}]の形式のデータから、複数のアイデアを投稿したユーザーのみを抽出するコードはこのように書けます。

from collections import defaultdict

data = [
    {"Alice": "Sushi"},
    {"Alice": "Ramen"},
    {"Bob": "Pasta"},
    {"Charlie": "Curry"},
    {"Bob": "Pizza"},
]

result = defaultdict(list)
for d in data:
    for name, idea in d.items():
        result[name].append(idea)

multiple_ideas = {name: ideas for name, ideas in result.items() if len(ideas) > 1}

for name, ideas in multiple_ideas.items():
    print(f"{name}: {ideas}")
Alice: ['Sushi', 'Ramen']
Bob: ['Pasta', 'Pizza']

データの匿名化

誰が重複して投稿をしたのか、ユーザー名を匿名で確認したい、という場合はハッシュ化が使えます。(UUID、saltを採用しない理由は本記事のコメント欄で説明しています)
以下の処理を踏むことで、人物名を匿名化して重複を検索できるようになります。

import hashlib

data = [
    {"Alice": "Sushi"},
    {"Alice": "Ramen"},
    {"Bob": "Pasta"},
    {"Charlie": "Curry"},
    {"Bob": "Pizza"},
]
# ここでuuid, saltを採用しない理由はコメント欄で説明しています
name_to_hash = {
    name: hashlib.sha256(name.encode()).hexdigest()[:8]
    for name in set(d for d in data for d in d)
}
data = [{name_to_hash[name]: idea for name, idea in d.items()} for d in data]
print(data)
[{'3bc51062': 'Sushi'}, {'3bc51062': 'Ramen'}, {'cd9fb1e1': 'Pasta'}, {'6e81b125': 'Curry'}, {'cd9fb1e1': 'Pizza'}]

以下、Qiita恒例のポエム

PyCon JPが不正をしていない理由

このような声明発表を目にしました。
PyCon JPにおける登壇者採択に関する見解

何を言っているか、相変らず日本語や論理がよくわからなかったのですが、当該団体が不正を行っていない理由について所見を述べます。

インセンティブに従って動くから不正がない

本イベントでは、特定の企業や個人を優遇するような選定は一切行っておりません。

採択プロセスにおいて特定のスポンサー企業や個人を優遇することは、本イベントの目的である「技術や経験を共有し、新たな交流や発見を生み出す」という観点に反するものであり、また、当法人の設立趣旨である「継続的にカンファレンスを開催する」という使命とも相容れない行為です。
さらに、このような不公正なプロセスが行われれば、スポンサー企業やコミュニティメンバーとの信頼関係が損なわれ、イベントの存続自体が危うくなる可能性があります。したがって、本イベントにおいては特定の企業や個人を優遇するようなインセンティブは全く存在しません。

まさにその通りです。
特定の企業(スポンサー企業)や特定個人(コミュニティメンバー)とPyConJPの間にある信頼関係が損われるようなPyConJPにとって不適切なプロセスが採用されるはずはありません。
何故ならそうしたことをするインセンティブは全く存在しないからです。
公式発表の中で述べられていたようにPyConJPは実態として、さまざまな理由から技術や公正を軽んじる採択を行っており、そのようなPyConJPを支援する特定企業、コミュニティメンバーとの信頼関係をPyConJPは重んじています。

PyConJPはバイアスを排除するために適切な措置を講じているから不正がない

また、選定プロセスにおいてはできる限りバイアスを排除するため、複数登壇を防ぐための確認段階まで応募者の名前をマスキングするなど、できる限り公平性を確保するための対策を講じています。

マスキングせず投稿者名を確認しながら選考を行う、現行のプロセスを肯定する公式発表の理由が、同一人物の複数採択を防ぐため、であるのは興味深いですね。
予稿募集の要項に匿名審査を行う、と書いてありますが、これは匿名審査ではないのでは?
今後は本記事を参考にしてください。日本のPythonマスターを名乗って登壇する前に技術を使って課題を解決することから入門してみましょう。

訂正の要求:技術者や専門家が集うコミュニティというのは詐称

近年、Pythonのユーザー層は急速に広がりを見せ、Web開発、データサイエンス、IoT、機械学習といった幅広い分野にわたる多様な技術者や専門家が集うコミュニティとなりました。

ビジネスや社会の要望に答えるため、Pythonを使う技術者や専門家は日本に少なくありません。
しかしながらPyConJPは愛好家のコミュニティであり、そこに技術者や専門家は不在です。
愛好家が技術者・専門家を名乗ることは許されません。
もしかして愛好家に技術者や専門家としての役割と責任が担えるとお考えなのですか?
それは絶対にありえません。

PyConJPは楽しめるかを重視しているから不正がない

私たちが登壇者を選ぶ際、最も大切にしているのは「参加者の皆様に楽しんでいただけるか」という点です。

発信する内容が、あからさまに間違っていようとも、虚偽の内容であろうとも、技術者倫理に反した社会への有害性が非常に高い内容であろうとも、特定企業の宣伝活動であろうとも、常に愛好家の視点から評価をします。
つまり、技術的な評価はしませんし不可能です。
それはPyConJPが「参加者の皆様に楽しんでいただけるか」とHRT「Huminity(謙虚)」、「Respect(尊敬)」、「Trust(信頼)」の考え方を大切にしているためです。
PyConJPはPython愛好家コミュニティであるため、愛好家にHRTを持った愛好家視点の情報発信活動を行っています。

誹謗中傷、虚偽の内容の発信は差し止めるから不正がない

一方で、支援や意見が私たちの成長にとって大切であるのと同時に、個人攻撃や誹謗中傷、あるいはそれに類する行為は、私たちの目指すオープンで協力的なコミュニティの発展に反するものです。そのような行為は、私たちだけでなくコミュニティ全体を傷つけることにつながりますので、どうか控えていただきたいと強くお願い申し上げます。

私たちは皆様からの建設的な意見や提案を真摯に受け止め、コミュニティの成長に活かしたいと考えています。しかし、もし攻撃的な言動がエスカレートし、私たちやコミュニティの健全な運営が脅かされる場合には、残念ながら弁護士など専門家の協力を得て、法的措置を検討せざるを得ません。このような事態は避けたいと考えておりますので、皆様には引き続き、建設的なご意見でのご協力をお願い申し上げます。

特定個人や団体に対する誹謗中傷、脅迫、恫喝、名誉毀損となる情報の発言や虚偽の発表が許されないのはコミュニティ内のローカルルールではなく社会通念であり、ローカルルールより優先されます。
コミュニティの健全な運営、オープンで協力的なコミュニティの発展に繋る情報の発信をしましょう。

19
15
6

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
19
15

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?