我用数据技术分析首播过亿火爆网络的《乘风破浪的姐姐》,发现了这些秘密
最近,由芒果TV推出的综艺节目《乘风破浪的姐姐》,可谓是火爆了全网,堪称年度综艺前几名的存在,首播播放量便过亿!相比青春有你,这些姐姐虽然在年龄上可能不具有优势,但是她们身上散发的个人魅力还是相当了得,个个都是实力牌。
方便大家更好的对选手们有一个全方位的了解,抓取了参赛姐姐们的信息进行分析。
数据说明
数据集是一个csv文件:爬取的是公开在百度百科和维基百科上的选手信息。 数据说明: 列名说明age年龄birth出生年月hometown出生地址names姓名primaryScore初始舞台分数jobs职业picUrl图片的下载地址

数据的获取
首先,我们需要做的就是抓取到选手们的信息,这里,我们爬取的是公开在百度百科和维基百科上的选手信息。
由于两个网站采用的都是静态的页面,所以抓取也相对简单,我们以较为复杂的百度百科抓取为例,来介绍一下程序的抓取。
我们利用GetPicSource函数首先提取了宣传照图片的下载地址;
然后利用BeautifulSoup库来解析网页源代码,由于不同的div标签数量不一致,所以需要格外自己的分析,并进行解析;
接着将我们提取到的信息进行保存即可。
对于维基百科的信息提取也是同样的操作,最终我们抓取到的信息,包括了选手们的姓名,年龄,出生年月,出生地以及图片的下载地址,职业以及初始舞台分数等信息。
读取数据
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]:

我们可以看到,我们已经抓取到了我们需要的数据,接下来我们就可以对数据进行简单的清晰,并进行分析。对于宣传照的抓取和保存,可以简单的利用五行代码即可搞定,程序和提取结果,如下图所示:

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
、数据的分析
我们对于选手的年龄进行一下分析,这里需要注意的是,小编采用的是pyecharts1.8.1版本进行的可视化展示。同时pyecharts1.x和pyecharts0.x版本之间存在较大的差异。如果大家在运行源码时出现找不到模块的错误,大多是版本不正确引起的,需要大家格外的注意。好了我们接着进行程序和结果的展示:
姐姐的年龄分布
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"]) # 对年龄进行分段划分
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="《乘风破浪的姐姐》", subtitle="年龄分布"))
.set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {d}%"))
)
pie.render_notebook()
Out [5]:

数据的分析
我们对于选手的年龄进行一下分析,这里需要注意的是,小编采用的是pyecharts1.8.1版本进行的可视化展示。同时pyecharts1.x和pyecharts0.x版本之间存在较大的差异。如果大家在运行源码时出现找不到模块的错误,大多是版本不正确引起的,需要大家格外的注意。好了我们接着进行程序和结果的展示:
姐姐的职业分布
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("《乘风破浪的姐姐》", [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="《乘风破浪的姐姐》", subtitle="职业分布"),)
)
funnel.render_notebook()
Out [6]:

对于选手的职业分布,我们可以看到,参赛的选手大多数演员和歌手出身,但是选手中存在许多身兼数职的现象,比如说某位参赛选手,既是歌手同时也是演员,可谓是演而优则唱的代表。
姐姐的省份分布
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, '台湾': 1, '河南': 1, '吉林': 1, '内蒙古': 1, '天津': 1, '云南': 1, '贵州': 1, '海南': 1, '加拿大': 1, '陕西': 1, '美国': 1, '浙江': 1, '香港': 1})
对于选手的出生地,我们只是选取了出生地在中国的选手,我们可以看到,选手中湖南选手是最多的,其次是四川的选手,从整体的南北方分布来看,南方的选手要多于北方。
Out[7]:

姐姐的年龄和初始舞台评分关系
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="《乘风破浪的姐姐》"),
yaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(formatter="{value}岁"), min_=0, max_=40),
)
)
line = Line().add_xaxis(names).add_yaxis("初舞台评分", scores, yaxis_index=1)
bar.overlap(line)
bar.render_notebook()
Out [8]:

姐姐的平均年龄
In [9]:
print(sum(ages) / 5)
36.8
最后,我们来看一下评分前五名的选手在年龄和初舞台评分上的关系,我们可以看到,前五名的选手得分都在86分以上,而她们的年龄则是分布在30岁左右。
对于参加比赛的整体选手,她们的平均年龄为35岁,而评分前五名的选手,她们的平均年龄仅为30.8岁,可见,年龄因素对于成绩存在一定的反比例影响。