Python分析101位《創造營2020》小姐姐,誰纔是網友們心中的顏值擔當?

前言

本文的文字及圖片來源於網絡,僅供學習、交流使用,不具有任何商業用途,版權歸原作者所有,如有問題請及時聯繫我們以作處理。

最近可以追的綜藝真是太多了,特別是女團選秀節目。之前我們剛聊過《青春有你2》,現在隔壁鵝廠的《創造營2020》又火熱開播了。除了數不清的漂亮小姐姐,導師團除了黃子韜、鹿晗,最新一期中吳亦凡更是作爲特約教練登場,“歸國三子”一下子就引爆了話題度。

 

 

 

1、《創造營2020》到底好看嗎?

 

那麼《創造營2020》到底好看嗎?先讓我們看到豆瓣,目前已經有25129人打分,分數爲6.6分。

對比起隔壁的《青你2》5.2分,創造營還略勝一籌,不過剛更新3期,還可以在觀望一下。

 

總體評分分佈

具體看到總體評分分佈,其中11.8%的人給了5星,19.6%的人給了4星,其中打1星的最多佔到39.8%。

其中給出1分2分算評分較差的,4分5分算比較好的推薦分數。我們分佈看到這兩部分評分的詞雲圖。

在評分較低的觀衆看來,主要的吐槽點有關於"賽制"、"導師"、"剪輯"方面。直接表達"不好看"、"勸退"、"吊打"的評論也有不少。

 

 

在給出分數較高,推薦的觀衆看來,《創造營2020》的亮點在於"選手小姐姐"、"導師陣容"、"話題"。鵝廠的"財大氣粗"、"燃燒的經費"也令人印象深刻。其次也有認爲比《青你2》要更好看的。

 

 

2、教你用Python分析101位選手小姐姐

這次C君也受到了點啓發,打算也用Python來盤一盤《創造營2020》的小姐姐們。

下面讓我們來通過Python爲大家介紹一下這101位美麗的小姐姐吧。

  • 數據獲取

  • 數據預處理:數據合併和字段提取

  • 數據可視化分析

數據獲取

1、此次我們主要獲取了以下部分的數據:

  • 從騰訊的官方助力網站,來獲取選手的姓名和照片信息

  • 從維基百科獲取選手的籍貫、年齡、身高、所在經濟公司信息

  • 調用百度智能雲的AI人臉識別接口,輸入選手照片,獲取選手顏值等信息。

下面看到具體步驟和部分關鍵代碼:

獲取騰訊撐腰榜數據

我們獲取數據的頁面地址如下:

https://m.v.qq.com/activity/h5/303_index/index.html?ovscroll=0&autoplay=1&actityId=107015

這是一個動態js加載的網站,使用chrome瀏覽器簡單的抓包分析,得到真實的數據傳輸接口,通過修改其中的pageSize參數即可得到所有的數據。

 

 

代碼如下:

# 導入庫
import pandas as pd
import requests
import json

def get_tx_actors():
    """
    功能:獲取創造營2020撐腰榜數據。
    """
    # 獲取URL
    url = 'https://zbaccess.video.qq.com/fcgi/getVoteActityRankList?raw=1&vappid=51902973&vsecret=14816bd3d3bb7c03d6fd123b47541a77d0c7ff859fb85f21&actityId=107015&pageSize=101&vplatform=3&listFlag=0&pageContext=&ver=1&_t=1589598410618&_=1589598410619'

    # 添加headers
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36'
    }

    # 發起請求
    response = requests.get(url, headers=headers)

    # 解析數據
    json_data = json.loads(response.text)

    # 提取選手信息
    player_infos = json_data['data']['itemList']

    # 提取詳細信息
    names = [i['itemInfo'].get('name') for i in player_infos]
    rank_num = [i['rankInfo'].get('rank') for i in player_infos]
    images = [i['itemInfo']['mapData'].get('poster_pic') for i in player_infos]

    # 保存信息
    df = pd.DataFrame({
        'names': names,
        'rank_num': rank_num,
        'images': images
    })

    return df

 

通過以上程序,獲取到101位選手的姓名、排名和照片信息,並將選手的照片保存到本地。獲取數據如下所示:

df1.head() 

 

3、獲取維基百科數據

此處使用selenium獲取,需要電腦可以登錄外網,代碼較爲簡單,暫時省略。

這裏主要獲取了選手的籍貫、年齡、身高、所在經濟公司信息,如下所示:

df2.head()

 

4、調用百度AI接口獲取顏值數據

百度AI人臉詳細的識別文檔地址如下:

https://ai.baidu.com/ai-doc/FACE/yk37c1u4t

 

首先需要在官網申請個人的token信息,然後下面的程序中,get_face_score函數首先構造請求URL,然後構造請求的params表單數據,包括base64編碼的圖片信息,圖片類型和想要獲取的人臉信息。通過POST方法獲取返回的json數據,返回的json數據裏就包含着我們需要的顏值得分和年齡估計等信息,具體代碼如下:

def get_file_content(file_path):
    """
    功能:使用base64轉換路徑編碼
    """
    with open(file_path, 'rb') as fp:
        content = base64.b64encode(fp.read())
        return content.decode('utf-8')

def get_face_score(file_path):
    """
    功能:調用api,實現一個百度的顏值分析器
    """
    # 調用函數,獲取image_code
    image_code = get_file_content(file_path=file_path)

    # 請求base_url
    request_url = "https://aip.baidubce.com/rest/2.0/face/v3/detect"

    # 表單數據
    params = {
        'image':'{}'.format(image_code),
        'image_type': 'BASE64',
        'face_field': 'age,gender,beauty'
    }

    # 調用函數,獲取token
    my_access_token = "官網獲取的個人的token信息"

    # 獲取access_token
    access_token = my_access_token

    # 構建請求URL
    request_url = request_url + "?access_token=" + access_token
    # 請求頭
    headers = {'content-type': 'json'}
    # 發起請求
    response = requests.post(request_url, data=params, headers=headers)

    if response:
        print(response.json())
        age = response.json()['result']['face_list'][0]['age']
        gender = response.json()['result']['face_list'][0]['gender']['type']
        gender_prob = response.json()['result']['face_list'][0]['gender']['probability']
        beauty = response.json()['result']['face_list'][0]['beauty']

        all_results = [age, gender, gender_prob, beauty]

    return all_results

 

通過以上程序,獲取到101位選手通過百度AI預測的年齡、性別、性別預測概率、顏值等信息。

df3.head() 

 

 

5、數據預處理

此處我們主要對以上獲取的數據集進行整理和清洗,清洗後的數據如下所示:

df.head()  

 

 

6、數據可視化

獲取和整理數據之後,接下來我們使用數據可視化庫pyecharts進行以下的數據可視化分析。

選手的年齡分佈

首先在年齡上,選手最小年齡是18歲,最大年齡是25歲。我們對年齡進行了分箱,具體分析發現20-22歲的選手最多,佔比達到35.87%。其次是22-24歲,佔比29.35%,緊隨其後是18-20歲,佔比28.26%。最後是24-26歲,僅佔比6.52%。看來想要出道真的需要趁早啊!

 

代碼如下:

 

# 分箱
age_bins = [18,20,22,24,26] 
age_labels = ['18-20', '20-22', '22-24', '24-26']
age_cut = pd.cut(df.age, bins=age_bins, labels=age_labels)
age_cut = age_cut.value_counts()

# 產生數據對
data_pair = [list(z) for z in zip(age_cut.index.tolist(), age_cut.values.tolist())]

# 繪製餅圖
# {a}(系列名稱),{b}(數據項名稱),{c}(數值), {d}(百分比)
pie1 = Pie(init_opts=opts.InitOpts(width='1350px', height='750px'))
pie1.add('', data_pair=data_pair, radius=['35%', '60%'])
pie1.set_global_opts(title_opts=opts.TitleOpts(title='選手年齡分佈'), 
                     legend_opts=opts.LegendOpts(orient='vertical', pos_top='15%', pos_left='2%'))
pie1.set_series_opts(label_opts=opts.LabelOpts(formatter="{b}:{d}%"))
pie1.render()

 

選手的真實年齡和百度AI預測對比

我們將百度AI預測的年齡和真實年齡進行了對比,可以看出模型預測的方差較小,由計算可知平均預測的絕對誤差在1.67歲,預測結果還是比較準確的。

 

代碼如下:

# 產生數據
x1_line2 = df.names.values.tolist()
y1_line2 = df.age.values.tolist()
y2_line2 =  df.pred_age.values.tolist()

# 繪製折線圖
line2 = Line(init_opts=opts.InitOpts(width='1350px', height='750px'))
line2.add_xaxis(x1_line2)
line2.add_yaxis('真實年齡', y1_line2)
line2.add_yaxis('預測年齡', y2_line2) 
line2.set_global_opts(title_opts=opts.TitleOpts('選手的真實年齡和百度AI預測對比'), 
                      xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(rotate='30')),
                      yaxis_opts=opts.AxisOpts(min_=15, max_=30),
                     ) 
line2.set_series_opts(label_opts=opts.LabelOpts(is_show=False))
line2.render()

選手的身高分佈

通過上圖可以看出,選手的身高基本符合正態分佈。身高方面小姐姐們都在160以上,最高的是175cm,令人意外的是身高167cm的最多,共有34名。看來女團對身高的要求還挺高的。

 

選手籍貫分佈

 

 

那麼小姐姐們都來自哪些地區呢?

這裏我們只是關注了國內的情況,馬來西亞和俄羅斯等其他國家,並不在我們的統計範圍內。經過分析整理可以發現,來自四川的人數是最多的,看來四川當之無愧是個盛產美女之地,然後是廣東和湖南。

代碼如下:

city_num = df.region.value_counts()

# 數據對
data_pair2 = [list(z) for z in zip(city_num.index.tolist(), city_num.values.tolist())]

# 繪製地圖
map1 = Map(init_opts=opts.InitOpts(width='1350px', height='750px'))
map1.add('', data_pair2, maptype='china')
map1.set_global_opts(title_opts=opts.TitleOpts(title='選手的籍貫分佈'), 
                     visualmap_opts=opts.VisualMapOpts(max_=9))
map1.render()

 

選手所在經濟公司分佈

 

同時再看到選手的經濟公司。可以看到,其中絲芭傳媒推出的選手人數位居第一,最多共有7人,絲芭傳媒是中國大型女子偶像團體SNH48的運營公司,值得注意的是它在青春有你2中選送的選手數量也是最多的。

 

 代碼如下:

company_num = df.company.value_counts(ascending=False) 

# 柱形圖
bar1 = Bar(init_opts=opts.InitOpts(width='1350px', height='750px'))
bar1.add_xaxis(company_num.index.tolist())
bar1.add_yaxis('', company_num.values.tolist())
bar1.set_global_opts(title_opts=opts.TitleOpts(title='選手所在經濟公司分佈'), 
                     visualmap_opts=opts.VisualMapOpts(max_=7),
                     xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(rotate='60')),
                    )
bar1.render()

選手的顏值分佈

 

最後再看到大家最最關係的顏值問題啦,這次我們還調用百度智能雲的AI人臉識別接口,輸入選手照片,獲取選手顏值等信息。

通過AI接口,可以看到由百度AI預測的顏值最低爲57分,最高爲89分,我們對顏值進行了分箱操作,其中55-60對應低,60-70對應中,70-80對應較高,80以上對應高。可以計算,較高和高佔比76%,小姐姐們的顏值都是非常高的。

 

其中百度AI預測顏值最高的小姐姐是誰呢?她就是崔文美秀,很靈動清秀的一位小姐姐呢。

 

誰是你心中《創造營2020》中的顏值擔當呢?在留言區告訴我們吧!

歡迎點擊左上角關注小編,除了分享技術文章之外還有很多福利,私信學習資料可以領取包括不限於Python實戰演練、PDF電子文檔、面試集錦、學習資料等。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章