前言
本文的文字及圖片來源於網絡,僅供學習、交流使用,不具有任何商業用途,版權歸原作者所有,如有問題請及時聯繫我們以作處理。
最近可以追的綜藝真是太多了,特別是女團選秀節目。之前我們剛聊過《青春有你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電子文檔、面試集錦、學習資料等。