ZOZOの前澤社長がどのように100人抽選したかに関する一考察
※1/8 16時 表記の修正/1.2節補足/1.4節の追加/おわりに補足
はじめに
ZOZOの前澤社長の以下のツイートが年明け早々TLに溢れました。
1/8に当選者へのDMが送られたようですが、もしマトモに抽選したとしたら、どのようにこれだけ膨大な数の参加者から抽選したのでしょうか?
ZOZOTOWN新春セールが史上最速で取扱高100億円を先ほど突破!!日頃の感謝を込め、僕個人から100名様に100万円【総額1億円のお年玉】を現金でプレゼントします。応募方法は、僕をフォローいただいた上、このツイートをRTするだけ。受付は1/7まで。当選者には僕から直接DMします! #月に行くならお年玉 pic.twitter.com/cKQfPPbOI3
— Yusaku Maezawa (MZ) 前澤友作 (@yousuck2020) 2019年1月5日
時間制約について
以下のツイートから、締め切りから抽選まで9時間以内に終えたことがわかります。
たった今お年玉キャンペーン終了しました。多くのご応募ありがとうございました。この後抽選作業に入り、明日の朝9時頃から当選者へ順次DMにて僕よりご連絡させていただきます。楽しみにお待ちください。 #月に行くならお年玉
— Yusaku Maezawa (MZ) 前澤友作 (@yousuck2020) 2019年1月7日
おはようございます。
— Yusaku Maezawa (MZ) 前澤友作 (@yousuck2020) 2019年1月8日
当選者へのDM配信開始します!
100名に送り終えるのに数時間かかると思います。
楽しみにお待ちください!!
1. 選別せずに抽選した場合
該当のツイートをRTした人を列挙し乱数とかで抽選すれば公平そうです。ただこれだけ膨大になるとRTした人をどうやって抽出したのかが気になるところです。まずはRTした人を選別せずに抽選した場合について、以下のような仮説を検証していきます。
1.1 該当ツイートをRTした人のリストを直接入手した?
だれがRTしたかわかればそれが一番楽ですが、公式アプリやWebクライアントだと100人程度が表示限界のようです。そこでTwitterのapiを使って入手できないかと考えます。しかし、apiでも直近100ユーザー分のidしか取得できないようです。*1
1.2 フォロワーのリストを入手してから該当ツイートをRTしているか調べる?
1/8 12時時点で616万フォロワーですので、フォロワーの全貌を把握するのは難儀かと思いますが、一応このような手法も考えられます。フォロワーを取得するapiが存在し、1回のリクエストで5000 ids入手できます。*2 リミットは 15 times/15 minですので、5000 ids/min入手できます。これだとフォロワー全部取得するまで 1232 min = 20.5 h かかるので、時間制限に引っ掛かります。ここから各ユーザーのタイムラインを取得して該当ツイートが含まれているか(RTしたツイートが含まれている)調べることになるので、さらに時間がかかります。
フォロワーの取得を応募開始から随時行っていたとしたら、猶予が2日くらいに伸びます。その場合、フォロワーそれぞれについて、該当ツイートをRTしているか確かめます。あるユーザーのツイートを得るapiでは、リミットが900 times/15 minなので、60 times/minの頻度で確認できます。*3 この場合全フォロワーについて直近のタイムラインに該当ツイートのRTが含まれているか確かめることになります。しかし全フォロワーを終えるのに102,666 min = 71.2 dayかかります。また、1回のリクエストでは直近200ツイートまでしか取得できないので、ヘビーユーザーも除外されます。
1.3 ツイートを検索する?
[Twitter API] リツイートを100件より多く取得する方法 – プログラミング生放送
上記サイトにて紹介されていた方法では、1.1で述べた100ユーザー制限を突破できます。結果からidを抽出すればRTしたユーザーのリストが作れます。1回の検索で100件取り出せ、リミットは180 times/15 minですので、1200 ids/min入手できます。1/8 12時時点で該当ツイートのRT数は564万ですので、これだとRTしたユーザーをすべて取得するのに 4700 min = 78.3 h かかり、時間制限に引っ掛かります。
1.4 ユーザーidを乱数で生成し、そのユーザーがフォロワーかつ該当ツイートをRTしているか調べる
学科民をはじめとする方々から上記の意見をいただいたので追記します。
1.3までは、あてはまるユーザーを探しにいくという発想でしたが、逆にユーザーをランダムに選んでそのユーザーが当てはまっているか調べるという発想です。2018年10月時点でTwitterのアクティブユーザー総数は3億2600万、うち日本のユーザーは4500万。*4 また、1/8時点で前澤社長のフォロワー数は約600万です。したがって、全ユーザーの1.8%が前澤社長のフォロワーということになります(!?)。また、該当ツイートのRT数が1/8 12時時点で564万であり、仮にすべてフォロワーによるRTとすれば、この564万ユーザーを引き当てられればよいということになります。
ただ、これは現時点で生きているアカウントの総数であり、今までに数多くのアカウントが消えているため、もしランダムにidを指定しても生きているアカウントにヒットするかはわかりません。また、Twitterのユーザーidの生成規則を調べてみたのですが、明快な答えが得られずじまいでした。例えばTwitterのオフィシャルアカウント(@Twitter)のユーザーidは783214、自分のアカウント(2012/8作成)のユーザーidは9桁、最近作成されたアカウントだとユーザーidが10桁になっているようです。9桁対応でidを生成するのであれば条件に適合するユーザーへのヒット率は0.56%ですが、10桁対応するとヒット率が0.056%に落ちます。
生成されたidのアカウントがフォロワーかつ該当ツイートRT済みであることを確認するためには、手作業だと面倒なのでやはりapiに頼ることになります。まず社長をフォローしているか確かめます。あるユーザーのフォローリストを得るapiでは、リミットが15 times/15 minなので、1分に1ユーザーしかチェックできません。*5 RTしているか調べるのは、1.2節で述べたのと同様のapiを用います。
有効な100人を得るために、その100倍以上のidを生成して確かめなければいけないので、apiでやるには意外と時間がかかりそうです。もしこの手法を採用するなら、id生成した後は社員がやるのかもしれません。
2. リプライを送った人に限定して抽選した場合
どうも1の手法だと時間制限に引っ掛かるっぽいので、リプライした人限定なのかもしれません。該当ツイートにリプライしたユーザーを列挙する手法について考えます。
ところが、「あるツイートに対するリプライ」を拾ってくるapiがないらしい。あるのは「あるユーザーに対するリプライ」を拾ってくるapiのみ。*6
該当ツイートについているリプライ数は39万、また該当ツイート以降のツイートについているリプライ数は、足し合わせても10万程度という感じです。したがって約50万のリプライのデータからidを抽出すればよいことになります。1回のリクエストで200件のリプライが取得でき、リミットは75 times/15 minですので、1000 replys/min入手できます。50万リプとして全所要時間は 500 min = 8.3 hですので、時間制限に引っ掛かりません。
リプしてきた人を重複を取りのぞいて100人抽選し、その人が当該ツイートをRTしていなかったり、フォロワーでなかったりしたら、追加で抽選していく感じになるかと思います。
おわりに
ちょっと検索してみると、実際に当選したのは具体的な目標を語ったリプを送った人が多いようです。届くDMにも、目標を応援している旨のメッセージが書かれているようです。最初は完全にランダムでやるつもりが、予想外に伸びてしまったため、急遽リプを送った人から選ぶ形に変えたのかもしれません。
また、Rate Limiting — Twitter Developersを見ると、
Standard API endpoints only, does not apply to premium APIs
と書いてあります。Twitter Developersに課金すれば、ここまで述べてきたしょうもないリミットを回避することができるわけです。金は正義っぽい。
この企画に便乗してバラマキ企画をしている方で、本当にばらまく意思があって、課金もしたくない方は、上記の手法からお選びください(いるのか?)。