我用數(shù)據(jù)技術(shù)分析首播過億火爆網(wǎng)絡(luò)的《乘風(fēng)破浪的姐姐》,發(fā)現(xiàn)了這些秘密
最近,由芒果TV推出的綜藝節(jié)目《乘風(fēng)破浪的姐姐》,可謂是火爆了全網(wǎng),堪稱年度綜藝前幾名的存在,首播播放量便過億!相比青春有你,這些姐姐雖然在年齡上可能不具有優(yōu)勢(shì),但是她們身上散發(fā)的個(gè)人魅力還是相當(dāng)了得,個(gè)個(gè)都是實(shí)力牌。
方便大家更好的對(duì)選手們有一個(gè)全方位的了解,抓取了參賽姐姐們的信息進(jìn)行分析。
數(shù)據(jù)說明
數(shù)據(jù)集是一個(gè)csv文件:爬取的是公開在百度百科和維基百科上的選手信息。 數(shù)據(jù)說明: 列名說明age年齡birth出生年月hometown出生地址names姓名primaryScore初始舞臺(tái)分?jǐn)?shù)jobs職業(yè)picUrl圖片的下載地址

數(shù)據(jù)的獲取
首先,我們需要做的就是抓取到選手們的信息,這里,我們爬取的是公開在百度百科和維基百科上的選手信息。
由于兩個(gè)網(wǎng)站采用的都是靜態(tài)的頁面,所以抓取也相對(duì)簡(jiǎn)單,我們以較為復(fù)雜的百度百科抓取為例,來介紹一下程序的抓取。
我們利用GetPicSource函數(shù)首先提取了宣傳照?qǐng)D片的下載地址;
然后利用BeautifulSoup庫(kù)來解析網(wǎng)頁源代碼,由于不同的div標(biāo)簽數(shù)量不一致,所以需要格外自己的分析,并進(jìn)行解析;
接著將我們提取到的信息進(jìn)行保存即可。
對(duì)于維基百科的信息提取也是同樣的操作,最終我們抓取到的信息,包括了選手們的姓名,年齡,出生年月,出生地以及圖片的下載地址,職業(yè)以及初始舞臺(tái)分?jǐn)?shù)等信息。
讀取數(shù)據(jù)
In [1]:
import pandas as pd import matplotlib.pyplot as plt
In [2]:
df = pd.read_csv("/home/kesci/input/sister5122/final_data.csv", encoding='gbk')
df.names = [i.strip('\r\n') for i in df.names]
df
Out [2]:

我們可以看到,我們已經(jīng)抓取到了我們需要的數(shù)據(jù),接下來我們就可以對(duì)數(shù)據(jù)進(jìn)行簡(jiǎn)單的清晰,并進(jìn)行分析。對(duì)于宣傳照的抓取和保存,可以簡(jiǎn)單的利用五行代碼即可搞定,程序和提取結(jié)果,如下圖所示:

In [3]:
df.age = [int(i.strip().replace('(', '').replace(')','').replace('歲','')) for i in df.age.values]
In [4]:
# from ?pyecharts import Pie, Bar, Line
from pyecharts.charts import Pie, Bar, Line, Funnel
from pyecharts.options.global_options import ThemeType
from pyecharts import options as opts
# from pyecharts.charts import Pie, Bar, line
、數(shù)據(jù)的分析
我們對(duì)于選手的年齡進(jìn)行一下分析,這里需要注意的是,小編采用的是pyecharts1.8.1版本進(jìn)行的可視化展示。同時(shí)pyecharts1.x和pyecharts0.x版本之間存在較大的差異。如果大家在運(yùn)行源碼時(shí)出現(xiàn)找不到模塊的錯(cuò)誤,大多是版本不正確引起的,需要大家格外的注意。好了我們接著進(jìn)行程序和結(jié)果的展示:
姐姐的年齡分布
In [5]:
attr = []
count = []
age_cut = pd.cut(df.age, [26,33,40,47,54], labels=[u"26-33",u"33-40",u"40-47",u"47-54"]) ?# 對(duì)年齡進(jìn)行分段劃分
for i, j in age_cut.value_counts().items():
? ?attr.append(i)
? ?count.append(j)
pie = (Pie(init_opts=opts.InitOpts(
? ? ? ?theme=ThemeType.CHALK
? ? ? ?)).add('', [list(z) for z in zip(attr, count)],
? ? ? ? ? ?radius=["30%", "75%"],rosetype="radius")
? ? ? ? .set_global_opts(title_opts=opts.TitleOpts(title="《乘風(fēng)破浪的姐姐》", subtitle="年齡分布"))
? ? ? ? ? .set_series_opts(label_opts=opts.LabelOpts(formatter=": s0sssss00s%"))
? ? ? )
pie.render_notebook()
Out [5]:

數(shù)據(jù)的分析
我們對(duì)于選手的年齡進(jìn)行一下分析,這里需要注意的是,小編采用的是pyecharts1.8.1版本進(jìn)行的可視化展示。同時(shí)pyecharts1.x和pyecharts0.x版本之間存在較大的差異。如果大家在運(yùn)行源碼時(shí)出現(xiàn)找不到模塊的錯(cuò)誤,大多是版本不正確引起的,需要大家格外的注意。好了我們接著進(jìn)行程序和結(jié)果的展示:
姐姐的職業(yè)分布
In [6]:
from collections import Counter
jobsClass = Counter(filter(None, ''.join(df.jobs.values).split(',')))
funnel = (Funnel(init_opts=opts.InitOpts(
? ? ? ?theme=ThemeType.CHALK
? ? ? ?))
? ? ? ? ?.add("《乘風(fēng)破浪的姐姐》", [list(z) for z in zip(jobsClass.keys(), jobsClass.values())],
? ? ? ? ? ? ? sort_='ascending',
? ? ? ? ? ? ? label_opts=opts.LabelOpts(position="inside"))
? ? ? ? ?.set_global_opts(title_opts=opts.TitleOpts(title="《乘風(fēng)破浪的姐姐》", subtitle="職業(yè)分布"),)
? ? ? ? )
funnel.render_notebook()
Out [6]:

對(duì)于選手的職業(yè)分布,我們可以看到,參賽的選手大多數(shù)演員和歌手出身,但是選手中存在許多身兼數(shù)職的現(xiàn)象,比如說某位參賽選手,既是歌手同時(shí)也是演員,可謂是演而優(yōu)則唱的代表。
姐姐的省份分布
In [7]:
from pyecharts.charts import Map
import random
provinces = Counter(df.hometown)
print(provinces)
area = [(i[0],i[1]) for i in provinces.items()]
maps = (
? ? ? ?Map(init_opts=opts.InitOpts(
? ? ? ?theme=ThemeType.ROMANTIC
? ? ? ?))
? ? ? ?.add("出生地", area, "china")
? ? ? ?.set_global_opts(
? ? ? ? ? ?title_opts=opts.TitleOpts(title="Map-基本示例"),
? ? ? ? ? ?legend_opts=opts.LegendOpts(is_show=False),
? ? ? ? ? ?visualmap_opts=opts.VisualMapOpts(max_=5, is_piecewise=True),
? ? ? ?)
? ?)
maps.render_notebook()
Counter({'上海': 5, '湖南': 5, '四川': 3, '山東': 2, '遼寧': 2, '臺(tái)灣': 1, '河南': 1, '吉林': 1, '內(nèi)蒙古': 1, '天津': 1, '云南': 1, '貴州': 1, '海南': 1, '加拿大': 1, '陜西': 1, '美國(guó)': 1, '浙江': 1, '香港': 1})
對(duì)于選手的出生地,我們只是選取了出生地在中國(guó)的選手,我們可以看到,選手中湖南選手是最多的,其次是四川的選手,從整體的南北方分布來看,南方的選手要多于北方。
Out[7]:

姐姐的年齡和初始舞臺(tái)評(píng)分關(guān)系
In [8]:
from pyecharts import options as opts
from pyecharts.charts import Bar, Line
top5 = df[:5]
names = top5.names.values.tolist()
ages = top5.age.values.tolist()
scores = top5.primaryScore.values.tolist()
bar = (
? ?Bar(init_opts=opts.InitOpts(
? ? ? ?theme=ThemeType.ROMANTIC
? ? ? ?))
? ?.add_xaxis(names)
? ?.add_yaxis("年齡", ages)
? ?.extend_axis(
? ? ? ?yaxis=opts.AxisOpts(
? ? ? ? ? ?axislabel_opts=opts.LabelOpts(formatter="{value}分"), interval=20
? ? ? ?)
? ?)
# ? ? .extend_axis(
# ? ? ? ? yaxis=opts.AxisOpts(
# ? ? ? ? ? ? axislabel_opts=opts.LabelOpts(formatter="{value}分"), interval=20
# ? ? ? ? )
# ? ? )
? ?.set_series_opts(label_opts=opts.LabelOpts(is_show=False))
? ?.set_global_opts(
? ? ? ?title_opts=opts.TitleOpts(title="《乘風(fēng)破浪的姐姐》"),
? ? ? ?yaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(formatter="{value}歲"), min_=0, max_=40),
? ?)
)
line = Line().add_xaxis(names).add_yaxis("初舞臺(tái)評(píng)分", scores, yaxis_index=1)
bar.overlap(line)
bar.render_notebook()
Out [8]:

姐姐的平均年齡
In [9]:
print(sum(ages) / 5)
36.8
最后,我們來看一下評(píng)分前五名的選手在年齡和初舞臺(tái)評(píng)分上的關(guān)系,我們可以看到,前五名的選手得分都在86分以上,而她們的年齡則是分布在30歲左右。
對(duì)于參加比賽的整體選手,她們的平均年齡為35歲,而評(píng)分前五名的選手,她們的平均年齡僅為30.8歲,可見,年齡因素對(duì)于成績(jī)存在一定的反比例影響。