統計を知らん奴が統計処理に挑戦する その１

# 目的
主に**AKB系**のアイドル様がよく使っている生配信プラットフォームで独自に取得したデータを使って、最終目的はアイドル様の人気を統計技術を使って数値化すること（謎）ではなく、**ただ単に手段と目的が逆転して統計処理してみたい**だけです。
統計初心者なのでこの記事はうのみにしないでください。

今回はアクティブユーザー数を使って統計処理をしたいと思ってます。

## アクティブユーザー数とは
アイドル様の人気を測るのに最も一般的なのは来場者数＝視聴者数だと思います。
僕が対象にしている生配信プラットフォームではプラットフォーム側が集計した来場者数を取得することができます。ただし、このプラットフォームの仕様に問題（＝特徴）があって、30秒だけ放送を見ることでアイテムを取得できる機能があるため、配信者（アイドル様）に全く興味がない、まるでただの通行人の人数も含まれています。これでは正確な人気は測れません。
そこで、ここで定義するアクティブユーザーとは、**配信者（アイドル様）に一つでもコメントやアイテム使用行為を行った人**とします。
アイテムをもらうためだけなら、コメントもアイテム使用も必要ないので、これらのアクティブな活動をした人は、少なくとも配信者（アイドル様）に興味があると解釈しました。

## アクティブユーザーの特性
上記の定義のように、少なくともコメントやアイテム使用行為をする人は配信者様に興味がある人だと思われます。
ただし、（**まるで僕のように**）挨拶もしなければアイテムも使わないのに、配信者様の配信を**ニヤニヤ**しながら見てるだけの視聴者はプラットフォームの仕様上補足できません。
また、配信時間が長くなればなるほど、アクティブユーザー数は増加する傾向にあります。そのため放送時間の差を考えずにアクティブユーザー数の大小で人気を判断すると全く異なる傾向となります。
~~などなど~~
## やりたい統計処理
アクティブユーザー数は配信時間にだいたい比例してるのですが、今回は本当に**比例するかどうかを統計的に確かめる**ことと、その比例定数等を**統計処理的な**やつで求めたいと思ってます。
暗黙のルールとして配信時間は約1時間です。ですが配信者様の都合で10分だったり、24時間だったりします。なので、50分くらいを基準に短い放送は50分時点への予測へ、長い放送は50分で切ったデータを得たいなぁと思います。

#処理いろいろ
##前処理
事前に某プラットフォームの有名アイドル様の約一か月分の放送分から放送時間が50分を超えるデータを抽出して5,10,15,20,25,30,35,40,45,50分時点での累計アクティブユーザー数を取り出したCSVを用意した。
データ処理には基本的にはpython3.5(3.6にアップデートするのが面倒なだけ）
一時間を超えた放送データは約1100ありました。

```python
import pandas as pd
df = pd.read_csv( 'x5x10x15x20x25x30x35x40x45x50.csv' ,names=('x5', 'x10', 'x15', 'x20', 'x25', 'x30', 'x35', 'x40', 'x45', 'x50') )
````
## データ可視化
### ヒストグラム
とりあえず基本中の基本のヒストグラム 下の図は5分時点での累計アクティブユーザー数の分布です。
だいたい平均は150くらいですが、たった5分で1200人集める超有名配信も含まれています。
その次は35分時点での累計ヒストグラム

```python
import seaborn as sns
sns.distplot(df["x5"],bins=100,kde = False)
#sns.distplot(df["x15"],bins=100,kde = False)
#sns.distplot(df["x25"],bins=100,kde = False)
````
![x5.png](https://qiita-image-store.s3.amazonaws.com/0/180426/76fde40b-adb1-c92d-78d7-3c301b3581b7.png) 
![x35.png](https://qiita-image-store.s3.amazonaws.com/0/180426/35d39d3d-ff14-4e99-2a66-04db9eae26b0.png)
どの時点でのデータをみても、アクティブユーザーが少ない方寄りの正規分布というには偏っているデータでした。
こういう偏り（特に低い方）があって、データがかならず正の値の場合は魔法のワード logをつかってみます。

```python
import seaborn as sns
import numpy as np
sns.distplot(np.log(df["x5"]),bins=100,kde = False)
````
![log(x5).png](https://qiita-image-store.s3.amazonaws.com/0/180426/c7d1c779-b9e9-5841-d295-679f49f2849b.png)
同じデータなのにlogるだけでものすごく正規分布に近くなります（って本に書いてあって初めて知った）
事前に試しにlog無しでデータ作ったからどーしよって執筆中の僕は本気で困っています。
![log_x15_50.png](https://qiita-image-store.s3.amazonaws.com/0/180426/097227f5-c26b-01ef-b6b4-c56d5869eb1b.png)
最も処理したいデータは放送時間が15分時点でのデータを使って50分の時のアクティブユーザ数を予測できるか、という処理なので、そういうグラフを作ってみました。
これを見る限り、15分時点でのデータ（対数）に1を加えるだけで予測できそうな感じがプンプンします。

```math
\log(A)+\log(B) = \log (A \times B)
```
という非常に便利な性質があるので(~~ってあらゆる統計の教科書に書いてるけど数学の教科書には書いてない~~)、15分時点のデータから$\exp(1)$倍したら予測できそうです。

### 散布図
ヒストグラムを描いた時点で大体予想できてしまったんですが、ちゃんと散布図も描きます。
![plot_(x5,50).png](https://qiita-image-store.s3.amazonaws.com/0/180426/44417402-5235-c6a2-7eb3-a9658af37bf7.png)
![plot_log(x5,50).png](https://qiita-image-store.s3.amazonaws.com/0/180426/b1e9ec01-918d-b406-fb6d-1d7922c53792.png)
対数を取ろうが、とるまいが、ものすごく直線。
どのような人気の方でも、15分時点での累計アクティブユーザーを取得したら50分時点を予測できそうです。

と思ってたら相関係数まで計算してくれる便利機能を見つけました.

```python
sns.jointplot(x="x15",y="x50", data=df)
```
![pearson_x35.png](https://qiita-image-store.s3.amazonaws.com/0/180426/88a7b603-7017-dee8-8bee-4f6111b6ccbe.png)
![pearson_logx35.png](https://qiita-image-store.s3.amazonaws.com/0/180426/1624fb9d-22ef-8681-4c8c-855755ef7533.png)

相関係数はほぼ１だそうです。対数をとっても同じでした。


##相関係数
グラフの付属機能ですでに計算されてしまった感があるんですが、一応ちゃんと別の方法で相関性をみます。

```python
import scipy as sp
import scipy as sp
print(sp.corrcoef(df["x5"],df["x50"]))
#0.97175064
print(sp.corrcoef(df["x15"],df["x50"]))
#0.99087099
print(sp.corrcoef(df["x25"],df["x50"]))
#0.99631922
print(sp.corrcoef(df["x35"],df["x50"]))
#0.99871767
print(sp.corrcoef(df["x45"],df["x50"]))
#0.99984266
######## log ############
print(sp.corrcoef(np.log(df["x5"]),np.log(df["x50"])))
#0.96888512
print(sp.corrcoef(np.log(df["x15"]),np.log(df["x50"])))
#0.98744595
print(sp.corrcoef(np.log(df["x25"]),np.log(df["x50"])))
#0.9938611
print(sp.corrcoef(np.log(df["x35"]),np.log(df["x50"])))
#0.99777255
print(sp.corrcoef(np.log(df["x45"]),np.log(df["x50"])))
#0.9996307
```

5分でのアクティブユーザー数から50分を予測するのは、一番相関係数が悪いです。
相関係数を見る限り、対数を取るより生値の方がいいらしいです。
散布図とヒストグラムを見ると、少ないアクティブユーザーから多いアクティブユーザーまで満遍なく広がっているように見えるので、よさそうなのですが。
とはいえ、0.9超えてたら差はなさそう感が。この辺りの**匙加減が未経験者にはわかりません。**


## 無次元化処理
むじげんか と正式には呼ぶのですが、僕が ないじげんか と言い続けてたら、知り合いの何人かが、僕との会話では ないじげん と呼ぶようになりました。
というわけで、放送時間が50分経った時点でのアクティブユーザーを1としてデータを処理します。
なぜなら、5分で2000人近く集める超人気放送と5分で100人程度しかない放送の直接比較できないし、平均とか分散を計算しても意味がないという。

```python
df2 = pd.DataFrame()
df2["nx15"] = df["x15"]/df["x50"]
df2["nx25"] = df["x25"]/df["x50"]
df2["nx35"] = df["x35"]/df["x50"]
df2["nx45"] = df["x45"]/df["x50"]
df2.describe()
```
![table_2222.png](https://qiita-image-store.s3.amazonaws.com/0/180426/a07f6201-aa69-6384-1d1c-c172858242d3.png)

descriveで標準的な統計処理を自動でやってくれます。
nx15の平均を見ると、0.56ですが最大最小が0.8と0.3とまぁまぁでかい。標準偏差をみると、10%くらい。nx25,nx45とあがると標準偏差も最大最小値の差も小さくなって、ぶっちゃけ放送時間15分で50分時点のアクティブユーザー数を予測するのは無理じゃね感がすごいです。

次に、配信者の人気（開始15分でのアクティブユーザー数の大小）で差があるかみてみます。
というわけで下記のような散布図を作りました。

```python
plt.ylim(0,1)
plt.xlabel("x15")
plt.ylabel("nx15")
plt.plot((df["x15"]),(df2["nx15"]),"o")
```
![n15nx15.png](https://qiita-image-store.s3.amazonaws.com/0/180426/aee48497-16ea-7c8a-4d00-44921a56d2f0.png)

だいたい0.55付近に集まっており、配信者の人気が50分時点での累計アクティブユーザー数はだいだい1/0.55倍っぽいです。
といっても、配信開始15分で500人以下の配信では、ばらつきが大きそうですが、まぁぶっちゃけ仕方がない。

#まとめ
統計がよくわかってないやつが、本を片手に、うるとら簡単な統計処理をやりました。
やっただけです。




#参考文献
Pythonで学ぶあたらしい統計学の教科書
馬場真哉  [翔泳社](https://www.shoeisha.co.jp/book/detail/9784798155067)