STU48が某個人配信プラットフォームで強いって言われてるけど・・・ その１

#アイドル様

僕はアイドル様が好きなのですが、そのアイドル愛が歪んで、某個人配信プラットフォームでアイドル様の配信の分析をしています。個人的に、秋元康氏プロデュースのアイドル様に興味があります。究極の目標はアイドル様の人気の数値化と、某総選挙順位や選抜の予測です。ただし、某個人配信プラットフォームを全く利用しないランカーさんも存在するため、そのあたりは知りません。

#STU48とは

>STU48（エスティーユー フォーティーエイト）は、秋元康のプロデュースにより、2017年に誕生した瀬戸内7県を拠点とする日本の女性アイドルグループ。AKB48グループを構成するグループのひとつである。出典：[wikipedia](https://ja.wikipedia.org/wiki/STU48)

[公式サイト](http://www.stu48.com/) メンバー一覧はプロフィールで見れます。かわいい。

一般人の認知度はものすごく低く、劇場となるはずの船の予定も未定、2ndシングルの発売も~~延期となりましたが~~2019年2月に決定と、運もありません。瀬戸内で大きな災害が発生する度に、何かしらを延長するのでしょうか？

ですが、個人配信プラットフォームでは「強い」と一般的に言われています。確かにSTU48メンバーによる配信回数は多そうです。というわけで、本当に強いのかデータで検証しましょう。

ところで、「強い」って何ですか？強さの定義について？


#個人配信プラットフォームでの強さ
とりあえず、個人配信プラットフォームをブラウザで見れる情報だけで、比較します。


##ルームのフォロワー数
フォロワーとは、個人配信プラットフォームで、配信者個人をフォローしている方です。Twitterのフォロワーと同じです。スマホを使っていると、フォローしている配信者が配信を開始すると、通知が来ます。フォローするということは、視聴者が少なくとも該当するアイドル様のファンである可能性が高く、人気のバロメーターの一つといえるでしょう。


```python
import requests
import time
import json
from bs4 import BeautifulSoup
import matplotlib.pyplot as plt
import seaborn as sns
import numpy as np
import pandas as pd
```
以下のようなdictを作ります。ちなみに僕は自動で作りましたがどうやったか忘れました。

```python
url_dict = {
"48_TANIGUCHI_MAHINA" : "谷口 茉妃菜（STU48）","48_OKI_YUKA" : "沖 侑果（STU48 ドラフト3期研究生）","48_NAKAMURA_MAI" : "中村 舞（STU48 ドラフト3期研究生）","48_YURA_AKARI" : "由良 朱合（STU48 ドラフト3期研究生）","48_SHINANO_SORAHA" : "信濃 宙花（STU48 ドラフト3期研究生）","48_MIZOGUCHI_AIKO" : "溝口 亜以子（STU48 ドラフト3期研究生）",
以下略
}
```
dictの値からグループを割り出す関数です。str.find()使わなくてもinで同じことを実現できることを知ってショックです。

```python
def get_team_name(url_key):
    global url_dict
    setumei = url_dict[url_key]
    if setumei.find("AKB") > -1:
        return "AKB"
    elif setumei.find("SKE")> -1:
        return "SKE"
    elif setumei.find("NMB")> -1:
        return "NMB"
    elif setumei.find("HKT")> -1:
        return "HKT"
    elif setumei.find("NGT")> -1:
        return "NGT"
    elif setumei.find("STU")> -1:
        return "STU"
```
フォロワー数が表示されるページに行くためには、room_idというのが必要なので以下のプログラムで取ってきます。ちゃんとtime.sleep(1.0)を付けましょう。ついでにUserAgent も指定しましょう。
この配信プラットフォームの運営者はすぐにアク禁してきます。
実行部分はコメントアウトしてます。


```python
def get_room_id(url_key):
    url = "https://　ひみつ　　/"+url_key
    print(url)
    headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Safari/537.36',
'Connection':'keep-alive'
}
    text = requests.get(url,headers=headers).text
    soup00 = BeautifulSoup(text,'lxml')
    soup01 = soup00.find("a",id="this-room-profile")
    if soup01 == None:
        return None
    soup02 = soup01.get("href")
    if soup02 == None:
        return None
    
    room_id = soup02[soup02.find("=")+1:]
    
    time.sleep(1.0)
    return room_id

dict_room_id = {}
dict_team = {}

#for iurl_key in url_dict:
#    iroom_id = get_room_id(iurl_key)
#    if iroom_id == None:
#        continue
#    dict_room_id[iurl_key]=iroom_id
#    dict_team[iurl_key] = get_team_name(iurl_key)

#print(dict_room_id)
#print(dict_team)

```
room_idを元に配信者のプロフィールページを取得してきて、Follower数を取ってきます。

```python
def get_follow(room_id):
    url = "https://　ひみつ　/room/profile?room_id="+room_id
    print(url)
    headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Safari/537.36',
'Connection':'keep-alive'
}
    text = requests.get(url,headers=headers).text
    soup00 = BeautifulSoup(text,'lxml')
    soup01 = soup00.find("p", class_="room-profile-info-follower").string 
    fo = soup01[:soup01.find("Foll")-1]
    
    time.sleep(1.0)  
    
    return fo 

dict_follow={}

#for iurl_key in dict_room_id:
#    #print(iurl_key)
#    room_id = dict_room_id[iurl_key]
#    fo = get_follow(room_id)
#    dict_follow[iurl_key] = fo

```
Pandasのデータフレームに変換するのために便利なように、整形してデータフレームに変換します。
はじめから {url_key:["Group","Follower"]}の形で作っておけばよかったと後悔しています。

```python
dict_follow2 = {}
for iurl_key in dict_follow:
    dict_follow2[iurl_key] = [dict_team[iurl_key],int(dict_follow[iurl_key])]
df = pd.DataFrame.from_dict(dict_follow2 , orient='index',columns=["Group","follower"])
```

フォロワーが多い順に並べ直して、x軸を(rank-1)/(グループメンバの人数)にして無次元化してます。
AKBさんは100人以上いるのに、STUさんは20数名しかいないので、こうやらないと比較できません。
今回は、比較的配信プラットフォームをよく利用されているAKBさんとNGTとHKTとSTUで比較します。

**今回は以上のようなプログラムは使わずに、がんばって手作業でFollowerを集めました！**
すげーつかれた。


```python
sns.set()

df_akb = df[df["Group"]=="AKB"].sort_values(by=["follower"],ascending =False)["follower"]
df_ngt = df[df["Group"]=="NGT"].sort_values(by=["follower"],ascending =False)["follower"]
df_stu = df[df["Group"]=="STU"].sort_values(by=["follower"],ascending =False)["follower"]
df_hkt = df[df["Group"]=="HKT"].sort_values(by=["follower"],ascending =False)["follower"]


fig = plt.figure(figsize=(10,6),dpi=200)

xvalue = np.linspace(start=0,stop=1,num=len(df_akb), )
plt.plot(xvalue, df_akb.values, "ro",label="AKB")
                     
xvalue = np.linspace(start=0,stop=1,num=len(df_ngt))
plt.plot(xvalue, df_ngt.values, "go", label="NGT")

xvalue = np.linspace(start=0,stop=1,num=len(df_stu))
plt.plot(xvalue, df_stu.values, "bo", label="STU")

xvalue = np.linspace(start=0,stop=1,num=len(df_hkt))
plt.plot(xvalue, df_hkt.values, "yo", label="HKT")
plt.xlabel("(Rank-1)/(num of group member)")
plt.ylabel("Num of Follower")
plt.legend()

```

![ranked.png](https://qiita-image-store.s3.amazonaws.com/0/180426/ca332b94-cf4a-05ad-92cb-3cb5ec036ee7.png)

この記事を書いてるのは2018/10/17らへんです。

全体トップはHKTの宮脇咲良さんで、ぶっちぎりの70000フォロワーです。二位はHKTの指原莉乃さんでした。彼女たちが配信をはじめると、70000人のスマホに配信通知が行きます。めったに配信しませんが。

さて、本題のSTU48ですが、トップの方でも30,000フォロワーです。
この数字はHKTだと6位、NGTだと3位、AKBだと10位に相当します。さらに、[ロングテール](https://ja.wikipedia.org/wiki/%E3%83%AD%E3%83%B3%E3%82%B0%E3%83%86%E3%83%BC%E3%83%AB)部分も、AKBさんやHKTさんに比べると見劣りします。
本当にSTU48さんは、個人配信プラットフォームでお強いのでしょうか？
ですが、僕の知る限りAKBとHKTのトップクラスの方々は滅多に、個人配信プラットフォームを使って配信しません。とってもお忙しいのでしょう。フォロワーが多くても、配信しないなら強くはないですよね。

というわけで、単純にフォロワー数だけをみたら、「個人配信プラットフォームで強い」という結論には至りませんでした。

###余談 アイドルグループの人気の分布
上のグラフですが、グループトップの方のフォロワー数を基準となるように無次元化します。

```python
fig = plt.figure(figsize=(10,6),dpi=200)

top = df_akb.values[0]
xvalue = np.linspace(start=0,stop=1,num=len(df_akb), )
plt.plot(xvalue, df_akb.values/top, "ro",label="AKB")
                     
top = df_ngt.values[0]
xvalue = np.linspace(start=0,stop=1,num=len(df_ngt))
plt.plot(xvalue, df_ngt.values/top, "go", label="NGT")

top = df_stu.values[0]
xvalue = np.linspace(start=0,stop=1,num=len(df_stu))
plt.plot(xvalue, df_stu.values/top, "bo", label="STU")

top = df_hkt.values[0]
xvalue = np.linspace(start=0,stop=1,num=len(df_hkt))
plt.plot(xvalue, df_hkt.values/top, "yo", label="HKT")

plt.xlabel("(Rank-1)/(num of group member)")
plt.ylabel("Nondimensional Num of Follower")
plt.legend()

```
![untitled_nondim.png](https://qiita-image-store.s3.amazonaws.com/0/180426/bfc04839-313c-8bb1-f5c2-0d7202ba340c.png)

明らかに4つのグループの線が一致しています。人数も規模も人気も地域もバラバラなのですが、(無次元化すると)これほど一致するということは、何か法則が存在するとしか思えません。例えば、[働きアリの法則](https://ja.wikipedia.org/wiki/%E5%83%8D%E3%81%8D%E3%82%A2%E3%83%AA%E3%81%AE%E6%B3%95%E5%89%87)とか。

人数が多いAKBさんを基準にすると、STUのロングテール部分の方々は、~~人気・知名度の割には~~頑張っているのではないでしょうか？**と思った方はこのグラフの意味がよくわかってない方です。**割り算して出したデータの意味について本当によく考えないと間違えます。例えば実質賃金([wikipedia](https://ja.wikipedia.org/wiki/%E5%AE%9F%E8%B3%AA%E8%B3%83%E9%87%91))とか。

##ルームのレベル
次にルームのレベルを見ます。
>ルームレベルとは、累積獲得ポイントを元にサイトが独自に集計したレベルです。
現在、ルームレベルを元にしたランキング表示はございません。 

だそうです。累積獲得なので、歴史が長いほど蓄積されるため、新設のSTU48は一番不利な数値かもしれません。

プログラムなんて使わずに、頑張りましたよ。

![u_level_ntitled.png](https://qiita-image-store.s3.amazonaws.com/0/180426/f69c1b11-8558-6c73-5a33-8f9fe9373825.png)

NGTのトップは中井りかさん、STUのトップは福田朱里さん、AKBのトップは大西桃香さんでした。どなたも、某プラットフォーム選抜経験者様ですね。
**このグラフを見て、「トップを除くと、STUがAKBに圧勝じゃないか！」と思ったアナタ！それ間違いです。**
NGTとHKTに対しては、STUは勝っていると言えます。たぶん。AKBさんは人数が多すぎるので直接比較できないんです！
少なくともSTUで序列が中間の方は、AKBでは上位15％くらいに匹敵するようです。なので、STUが某配信プラットフォームで非常に頑張っていることが伺えます。

###余談２ 相関係数

フォロワー数とレベルに相関がありそうかなぁと思ってプロットしてみました。

```python
sns.relplot(x="follower",y="Level",hue="Group",data=df,height=10)
```
![untitled_follow_vs_Level.png](https://qiita-image-store.s3.amazonaws.com/0/180426/b0adc51e-05eb-a6af-23aa-f92b6775a86c.png)

相関係数を計算しても微妙なレベルですね・・・

```python
sns.jointplot(x="follower",y="Level",data=df,kind="reg",color="m",height=10,)
```
![untitled_aaaaaaa.png](https://qiita-image-store.s3.amazonaws.com/0/180426/9ee1e13f-76b7-d1fd-9e1b-f692053e69aa.png)

```python
sns.lmplot(x="follower",y="Level",hue="Group",data=df,height=10,truncate=True)
```
![untitled_follow_vs_Level2.png](https://qiita-image-store.s3.amazonaws.com/0/180426/45b54fba-cb71-7100-ac4a-59efccac9c5c.png)


#まとめ

公開情報だけで調査してみました。ついでにウェブスクレイピングも。どうでしょうか？
よく見る意見としては、
「配信数がめっちゃ多い」
「コメントの数が増えた」
「OnliveのアイドルタブがSTU48で埋まってた」
という、ほぼただの主観データで、[ゴースト](https://information-station.xyz/8250.html)は重要ですが、明確な数値では残念ながらありません。

ただたんに、seabornとPandasを使いたかっただけです。