[Python]20倍ファミチキをTwitterで当てる方法

# はじめに

ファミチキを当てたかったら**<FONT COLOR=red>日付変わった瞬間に応募するな</FONT>**．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204520/c60e3bb1-e17b-a80b-9e95-bc3e68ccda2b.png)

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">ツイッターでファミマの抽選を当てたい人はこれを見ろ！<br>日付変わった瞬間に応募するのはやめようね！！！！<br>youtubeでめっちゃ詳しく解説したので見てくれ！！！<a href="https://t.co/VBI5hUSeNO">https://t.co/VBI5hUSeNO</a> <a href="https://t.co/svHqMGlfmP">pic.twitter.com/svHqMGlfmP</a></p>&mdash; 電気野菜 (@YasaiDev) <a href="https://twitter.com/YasaiDev/status/1299924326632665088?ref_src=twsrc%5Etfw">August 30, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> 

# Twitterでファミチキ？

Twitterでファミチキを当てるってなんの話かと思う人もいると思いますが，下の画像を見れば分かる人もいるのではないでしょうか．

![](https://pbs.twimg.com/ad_img/1291573565024657411/hoGreuu-?format=jpg&name=small)
>広告の画像が引用ツイートではでなかったので貼ってます．

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">【本日最終日】🎉7日間連続✨<br>このアカウントをフォローして、<a href="https://twitter.com/hashtag/%E3%83%95%E3%82%A1%E3%83%9F%E3%83%81%E3%82%AD%E3%81%9F%E3%81%B9%E3%81%9F%E3%81%84?src=hash&amp;ref_src=twsrc%5Etfw">#ファミチキたべたい</a> と <a href="https://twitter.com/hashtag/%E3%83%95%E3%82%A1%E3%83%9F%E3%83%9E?src=hash&amp;ref_src=twsrc%5Etfw">#ファミマ</a> でツイートしてくれた人の中から<br>毎日抽選で1万名様に<br>🍗ファミチキ（骨なし）無料引換券🍗が当たる！</p>&mdash; ファミリーマート (@famima_now) <a href="https://twitter.com/famima_now/status/1295012441001205762?ref_src=twsrc%5Etfw">August 16, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> 

これに限らず，Twitter上ではリプライで毎日ホニャララ名様に当たるキャンペーンが多く開催されています．できるならこれを当てたいというのが人の性です．

そこで，今回ファミチキキャンペーンに関して，**すべての抽選参加者とその結果を集計**し当てるコツを調査しました．

# 調査手法

ファミチキの当選結果は，ファミマ公式(famima_now)ではなくファミリーマート公式返信用アカウント(famima_reply)が通知しています．

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr"><a href="https://twitter.com/rngn0710?ref_src=twsrc%5Etfw">@rngn0710</a> ご応募ありがとうございます！<br>残念はずれ…！<br><br>でも！はずれた方にも【先着100万名】に<br>「ファミチキ（骨なし）20円割引券」をプレゼント中！<br>※予定引換数に達し次第、Famiポートでの発券はできなくなります※<br><br>▼Famiポートの使い方はこちら<a href="https://t.co/GihPGGELuG">https://t.co/GihPGGELuG</a> <a href="https://t.co/I8AMb8miC0">pic.twitter.com/I8AMb8miC0</a></p>&mdash; ファミリーマート公式返信用アカウント (@famima_reply) <a href="https://twitter.com/famima_reply/status/1286705368643575809?ref_src=twsrc%5Etfw">July 24, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> 

なので[Twint](https://github.com/twintproject/twint)という最強のツイート収集用のライブラリを使い，ひたすら(famima_reply)のツイートを収集しました．

>Q.なぜTwintは最強なのか？
>A.期間や取得数上限なくツイートを収集可能だから．公式APIのフリープランだと期間は直近1週間，上限は3000程度であるはず...


>収集したデータ: 7/26~7/29のfamima_replyの全ツイート(**150万以上**)

そして，収集後のデータをPandasでうまいこと整形して，[Tweepy](https://www.tweepy.org/)でTwitterAPIからデータ(FF数・アカウント開設日)を取得し可視化を行いました．

# 結果
これは7/26~7/29のキャンペーンの抽選結果に基づきます．

## おおまかに分析

- 一日あたりの応募者数: 約38000人
- 一日あたりの当選者: 10000人(公式情報)
- 一日あたりの当選確率: 約2.6%
- 一週間(キャンペーン期間)中に当たる確率: 約17%

```math
1-(1-0.026)^7=17\%
```
>一週間連続で外れる以外の可能性

## 時系列で分析(7/26だけ)
どの日付でもおんなじ傾向だったので，7/26だけを見ます．データを30分ごとに当選者・落選者に分けて分析します．

### 30分ごとのファミマ抽選結果

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204520/88039625-5169-e8b7-256b-29285ff0135b.png)
日付を変わった瞬間や，起床する時間帯に応募する人がめっちゃくっちゃ多いみたいに**応募者は時間帯ごとに偏りがある**のに，**当選者**は**200人前後で一定**ですね．**おそらく，意図的に時間帯ごとに偏りなく当選者が出るように設定されていると考えられますね．**

>Q.なせ応募者は30分ごとに200人なのか？
>A.1日を30分に分割して10000人で割ると，大体208人になる．

### 30分ごとのファミマ当選確率

したがって，当選確率は応募者の少ない時間帯が高くなります．なので一枚目の画像になるわけですね．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204520/c60e3bb1-e17b-a80b-9e95-bc3e68ccda2b.png)

ファミチキをほしけりゃ**<FONT COLOR=red>3時から4時・19時以降</FONT>**に応募しろってことですね．

## 当たる"アカウント"を分析

7/26~7/29の抽選結果を当選者・落選者からそれぞれ1000アカウント分ランダムサンプリングして分析を進めました．アカウントのデータは分析日(8/28)に準じるので，キャンペーン期間中とはややズレがあるかもしれません．

### 当選者と非当選者のFF数分布

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204520/e67c2523-8bb3-18ff-a2e8-b673fe864fda.png)
対数グラフで表してるので，実際には0でも1の軸にデータが表示されてしまっている部分もあります．当選者・落選者が重なっているゾーンは抽選に参加できているということですね．注目すべきなのは，当選者と落選者が別れてしまっているゾーンです．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204520/dc84394d-de23-09a9-06df-b872f33ecce8.png)
やはり，FF数の偏っているアカウント，特にフォロワー数が0のアカウントはフォロー数によらずすべて落選しており，明らかに異常だと考えられます．

したがって，当てたければ**<FONT COLOR=red>フォロワー数1以上のアカウントで応募</FONT>**すべきですね．

### アカウント開設時期
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204520/a298b92a-e8a2-0d57-4b9d-22bb4ddc222f.png)
少し見づらいのですが，キャンペーン時期(2020/7)の直近(2020/5~2020/6)に開設されたアカウントに関しては，当選者と落選者に乖離があります．直近に開設されたアカウントはフォロー数も少ないと考えられるので，「フォロワー数が0のアカウントはフォロー数によらずすべて落選」と繋がります．また，抽選応募用の捨てアカウント等を防ぐためのフィルターがあるのではと考えられますね．(強引な推測ですけど...)


#当たるコツまとめ

- **<FONT COLOR=red>3時から4時・19時以降</FONT>**に応募
- **<FONT COLOR=red>フォロワー数1以上のアカウント</FONT>**で応募
- 捨てアカウントでは応募しない