差分プライバシーとランダマイズド・レスポンス

アップルは、2016年の開発者向け会議WWDC2016で、製品から利用情報をアップルに送る際に差分プライバシーを使うと発表して、注目を浴びました。この仕組みは、端末から情報を送る段階でランダムなノイズを加えるというもので、正確な情報はアップルにも伝わりませんが、全体の傾向は調べられます。アップルに続き、グーグル、メタ(フェイスブック)、ウーバーなど、IT企業が続々と差分プライバシーを導入しています。2020年の米国の国勢調査でも差分プライバシーが使われました。

差分プライバシーと同様な考え方を使った「ランダマイズド・レスポンス」という方法は昔からありました。ここではその方法を試してみましょう。

例えば40人のクラスでアンケートをするとします。そのとき、「彼氏・彼女がいますか?」のような微妙な質問だと、恥ずかしがって正しく答えてもらえません。そこで、ランダマイズド・レスポンスの登場です。

コインを2回投げてください。表が出たか裏が出たかは他人に見えないようにします。1回目に表が出たなら、2回目のコインは無視して、正直に「はい」「いいえ」を答えてください。1回目に裏が出たなら、2回目のコインが表なら「はい」、裏なら「いいえ」と答えてください。

これなら、回答を他人に見られても真実はわかりませんので、正直に答えてもらえそうです。

何%が「はい」と答えたかを調べ、それを2倍して50%を引けば、だいたいの値がわかります。

シミュレーションで試してみましょう。

40人のクラスで、仮に16人(40%)に彼氏・彼女がいるとしましょう。

import numpy as np
import seaborn as sns

rng = np.random.default_rng()
N = 40  # クラスの人数
Y = 16  # 本当はYesの人数

def response():
    s = 0
    for i in range(N):
        r1 = rng.integers(2)     # 0か1かの乱数
        r2 = rng.integers(2)     # 0か1かの乱数
        if r1 == 1:
            if i < Y:
                s = s + 1
        else:
            s = s + r2
    return s

# 1万回のシミュレーション
a = [2 * response() - N / 2 for i in range(10000)]
print(np.mean(a))
sns.histplot(a, discrete=True)
ランダマイズド・レスポンス

だいたい正しい結果が出ますが、40人のような少人数では、誤差が大きいこともわかります。