中野智文のブログ

データ・マエショリストのメモ

iOS のUU数を調べる

背景

クッキーが全て取得できない場合でも UU 数を知りたい。

iPhone などのiOSのブラウザでは第三者クッキー(別ドメインのクッキー)が焼けないようになっている。 これは、広告を運用する上では非常に大きな問題である。 なぜなら広告のドメインは広告が表示されるページのドメインではないから、第三者クッキーとなるからである。

今ある手がかりを元になんとか統計を使ってUU数を調べる方法はないのだろうか。

方法

早速始めよう。

用意するデータ

同じ UU がアクセスした頻度を imps とそのUU数を表したデータを準備する。 例えば、一回しかアクセスしていない UU は imps = 1 の UU数に、 2回アクセスした場合には imps = 2 の UU 数にカウントする。

例えば次のようになる。

imps uu
1 141497411
2 1952850
3 929600
4 677190
5 479118
6 377811
7 301407
8 252147
9 212153
10 184203
11 159196
12 141028
13 123652
14 111885
15 101167
16 91964
17 84616
18 78076
19 71527
20 66685
... ...

上記のデータは、ログから次のSQLで取得するイメージである。

select
  imps,
  count(1) uu
from (
 select 
   uuid,
   count(1) imps
 FROM log_data
 group by uuid)
group by  imps

面倒なことに、クッキーが焼けていない UU は全て imps = 1 に混じってカウントされいる。これはクッキーの仕様上仕方ないこと。 (クッキーが焼けた場合のみカウントしようとすると、2回目以降でしか確認できないため、imps = 1 は原理上カウントできないことになってしまうため)

この imps = 1 の中に焼けていないクッキーも含まれていて、この焼けていないクッキーのUU数と焼けているがimps = 1 のUU数を推定するのが、今回の課題となる。

べき乗則を利用する

べき乗則が利用できないかどうか検討する。べき乗則とは、

冪乗則 - Wikipedia

であるが、今回のクッキーの話に適用する。

先の頻度 imps ごとの UU 数を、imps を{i}で、そのUU数を { u(i) } で表すとする。すると、

{ \displaystyle \log u(i) = b \log(i) + a }

の式がべき乗則に従った分布の場合成り立つと考えられる。( {a, b} はなんからの値)

数式だけでは分かりにくいと思うので、先のデータの impsとUU数の関係を二次元のグラフで見てみよう。

https://docs.google.com/spreadsheets/d/e/2PACX-1vT-7jpBFx9UN75_6ASDfvd_5dT35meCj1C-A7wDUUiKjii-ofNg8OPTJXaoMHhIwJnbzBMWNihWdPhh/pubchart?oid=1787407246&format=image

縦軸と横軸は対数にしてあるが、頻度の対数とUU数の対数のプロットが直線上に並んでいる。この様にプロットが直線上に並ぶときべき乗則に従った分布であると考えられる。

この直線を imps = 1 まで伸ばしていけば、頻度 imps = 1 の UU 数が推定できる。それには、この直線(線形関数)を決めているパラメータ {a, b} を求める必要がある。

この {a, b} を求める方法は色々あるが、今回は最小二乗法で求めることにしたい。

線形関数の最小二乗法は解析的に求めることができるので特別な分析ソフトウエアなどは必要としない。 ExcelSQL上で容易に計算することができる。

例えば、SQLで求めるなら次のような感じである。

SELECT 
       (n*d-c*e)/(n*b-e*e) AS a,
       (b*c-d*e)/(n*b-e*e) AS b,
       sum_uu
FROM
  (SELECT 
          sum(ln(imps)*ln(imps)) AS b,
          sum(ln(uu)) AS c,
          sum(ln(imps)*ln(uu)) AS d,
          sum(ln(imps)) AS e,
          count(1) AS n,
          sum(uu) AS sum_uu
   FROM imps_uu)

この例の場合、

{a = -1.434762915, b = 15.41025807}

が得られる。

これを使うと

{ \displaystyle u(i) = e^{a\ln(i) +b} }

だから、

{ \displaystyle
u(1) = e^{-1.434762915 * \ln(1) +15.41025807}
       =  4927084
}

と、クッキーが焼けて頻度が imps = 1 のUU数は、4927084 UUと推定できる。

クッキーが焼けていない UU 数

残るはクッキーが焼けていない UU 数の推定である。クッキーが焼けていないデータは、元のデータの imps =1 のUU数から、先の推定で分かった UU を引いたものである。 この例では、

{ \displaystyle 141497411  - 4927084 = 136570327 }

が、そのインプレッションとなる。これはUU数ではないことに注意する。

さて、このインプレッションがどのようなUU数になるかは、クッキーが焼けている既知の頻度とUU数の分布に従うとしよう。 全インプレッション数がすでに求まっているのであれば、クッキーが焼けている既知のインプレッション数は、全インプレッション数からクッキーが焼けていないインプレッション数を引けば良い。 この例だと、全インプレッション数は、361042790 であるので、

{ \displaystyle  361042790 - 136570327 =  224472463 }

である。これを使って残りのインプレッションがどこに分布するか計算できる。 その分布にしたがった残りのインプレッションの各頻度のインプ数からその頻度で割ることでUU数が求まる。 それらの合計のUU数がクッキーが焼けていないUU数である。すなわち、次の式で表せる。

{ \displaystyle \frac{\widetilde{i}}{\hat{i}} \sum_{i=1} \frac{u(i)}{i} }

ここで、 {\widetilde{i}, \hat{i}} は、それぞれ、 残りのインプレッション数、クッキーが焼けているUUのインプレッション数である。 この例だと、{\widetilde{i} = 136570327, \hat{i} = 224472463} である。 最終的に、クッキーが焼けていない UU 数は、8199399 となった(少数切り捨て)。

全UU数

クッキーが焼けているUU数+クッキーが焼けていない UU 数となる。

クッキーが焼けているUU数は、imps = 2 以上の UU数と、べき乗則によって推定した imps = 1 のUU数である。 この例の場合、

{ \displaystyle  8549777 + 4927084 = 13476861 }

である。また、クッキーが焼けていない UU 数は8199399 だった。

よって、求める全UU数は、

 {13476861 + 8199399 = 21676260}

である。

まとめ

クッキーが取得できない場合に、既に取得できているクッキーの頻度データにもとづき、UU数を推定する手法について述べた。特殊な計算は必要なくSQLExcelだけで計算できることを示した。

この記事は、VOYAGE GROUP Advent Calendar 2017 - Qiita に参加しています。

参考資料

今回使ったデータ(Excel の計算も有り)

docs.google.com

参考サイト