高 巍, 孙盼盼,李大舟
(沈阳化工大学 计算机科学与技术学院,辽宁 沈阳 110142)
近年来随着电影市场的繁荣,电影评分及趋势分析成为一个热点研究课题,其中的数据分析及可视化受到广泛关注.电影趋势分析可以通过用户对于不同电影类型评分的变化分析让影业公司了解到用户的喜好,有利于电影事业的发展.
目前,国外有很多基于Movielens和IMDB电影数据的可视化研究.Herr等[1]对428 440部电影做简单统计后,使用折线图来可视化电影的发展;Haughton等用网络图的方法分析电影与演员之间的关系[2];Nemeth等[3]推荐符合用户兴趣的电影,对每一个电影设计特征地图;许冰晗等[4]使用ThemeRiver技术[5]对电影数据进行可视化分析.这些工作大多是对国外电影网站数据的分析,或是从观众或演员的角度研究电影数据,或是用折线图来分析电影的发展趋势.本文针对国内电影网站数据进行研究,从电影类型与评分关系的角度分析电影的发展,并使用Python对数据进行可视化分析.通过数据爬虫技术获取用户的评分,分析用户对不同电影类型的钟爱程度,用分析结果帮助用户决策,帮助制片商提供调整营销策略[6].豆瓣作为互联网Web 2.0时代的一个奇迹,凭借独特的使用模式、持续的创新和对用户的尊重,成为最火热的用户发布、传播、共享信息的自媒体兴趣网络社区.其中豆瓣电影是中国最大最权威的电影评论与分享社区,收录了几百万条影片和电影人的资料,更汇聚了数千万热爱电影的人.豆瓣电影海量的信息存在着大量有价值的信息,豆瓣电影评分就是其中一类.用户借助豆瓣平台表达自己的观点并发表评分成为一种新的电影社交模式.本文依据豆瓣电影数据的特点,从豆瓣电影网站爬取所需数据,对爬取数据清洗和预处理并对数据进行可视化分析.整个过程均用 Python 语言实现[7],其中:数据的爬取用BeautifulSoup实现;数据预处理用Numpy和Pandas实现;数据可视化分析用Matplotlib和Seaborn实现.
Matplotlib是Python主要的绘图库,自动化程度非常高,其基于 numpy 的数组运算功能能够轻易地画出各种统计图形,如散点图、柱状图、饼图等,十分适合数据的可视化分析.
Seaborn是斯坦福大学出品的一个特别以数据可视化为目标的制图工具库,其在Matplotlib上构建,能够通过模块自带的定制主题和高级接口控制Matplotlib图表的外观,解决Matplotlib存在的问题,在默认情况下就可以创建出赏心悦目的图,并且支持Numpy和Pandas的数据结构可视化.Seaborn适用于比较各个变量的分布情况,可视化线性回归模型中的变量,并能够在分割区域制图.
本文的开发工作在 Windows 操作系统环境下完成,其中 Python 开发环境通过安装 Anaconda创建.Anaconda是一个用于科学计算的开源Python发行版本,其包含 Conda、Python等180多个科学包及依赖项,支持Windows、Linux、Mac系统,提供包管理及环境管理功能,方便地解决了多版本 Python并存及各种第三方包安装问题.Seaborn 与Matplotlib 均为 Anaconda 默认安装库,不用额外安装,比相似研究使用的ThemeRiver技术简单方便,可视化图片更加直观.
豆瓣电影上有很多关于每一部电影的信息,但豆瓣电影对数据爬虫的 IP 限制无法直接获取目标电影的全部数据,所以本文采用 Python 网络爬虫来爬取数据.由于豆瓣网是一个具有反爬虫功能的网站,所以在做网络数据爬虫时进行了浏览器访问模拟,通过分析网页的源代码,用BeautifulSoup获取所需要的数据.为了能够更好地分析不同电影类型热度及评分的分布情况,在获取数据时爬取豆瓣2016年公映的全部电影类型和评分数据进行分析[8].通过类型评分的对比分析,更能反映观众对不同类型电影的偏好.
在爬取数据过程中,不同网站的网页结构也不尽相同.爬取2016年公映电影,首先通过进入豆瓣网站进入2016年公映电影页面,获取该页面的 URL,通过查看网页源代码找到目标数据的位置,再使用urlopen把每部电影的整个
获取数据的主要代码如下:
def get_html(url): # 通过url获取网页内容
message = urllib2.urlopen(url)
return message.read()
def get_movie(html): #用soup提取每个电影的全部信息,以列表返回
soup = BeautifulSoup(html)
movie_list = soup.find_all(′div′,
class_=′bd doulist-subject′)
return movie_list
def get_movie_1(movie):
message=[] # 用于存储提取出来的电影信息
soup = BeautifulSoup(str(movie))
title = soup.find_all(′div′,class_=′title′)
soup_title = BeautifulSoup(str(title[0]))
for line in soup_title.stripped_strings:
#提取 里的内容
message.append(line)
num = soup.find_all(′span′)
message.append(num[1].contents[0])
soup_num = BeautifulSoup(str(num[0]))
for line in soup_num.stripped_strings:
#对获取到的里的内容进行提取
message = message + line
info = soup.find_all(′div′,class_=′abstract′)
soup_info = BeautifulSoup(str(info[0]))
message_str = “”
for line in soup_info.stripped_strings:
# 提取
message_str = message_str + line
message.append(message_str)
return message # 返回提取到的结果
为方便数据可视化分析,运用Python语言对数据进行预处理,清洗无用信息,去除无评分电影.整理后的部分数据格式如表1所示.
表1 整理后的部分数据格式
随着电影行业的蓬勃发展,电影市场的竞争越来越激烈,越来越多的影业公司想通过用户对于不同电影类型评分的变化了解用户的喜好.评分是观众从接受的角度对影片进行的评价和回馈,一方面取决于电影本身的艺术质量,另一方面则取决于观众本身的需求,即影片在多大程度上与观众的期待视域达到融合[9].那么如何了解影片类型、评分等因素对观众选择的影响呢?首先,从电影类型数量分析热门类型.其次,从平均评分的角度分析观众对不同影片类型的接受程度.再次,从评分的分布情况更真实地了解大部分观众对电影的满意程度.最后,结合评论人数与评分之间的关系进一步分析用户对电影的情感.
2016年公映电影数量超过30的主要电影类型有10种:剧情、喜剧、爱情、动作、冒险、动画、悬疑、惊悚、奇幻和犯罪.
从图1可以看出:剧情类影片的数量占比是19.41 %,是冒险类数量占比的两倍多,说明剧情类型电影最受制片商追捧.而喜剧、爱情两种类型电影的数量在总数量占比分列第2、第3位,并且这3类影片数量占总量的47.98 %.动作、冒险、动画、悬疑、惊悚、奇幻和犯罪类型的数量占总数量的 52.02 %,说明电影类型较多,但并没有很多制片商选择.
图1 电影类型数量饼图
从图2可以看出:冒险、犯罪、奇幻、动作、剧情和动画类影片评分均为5分以上,评分最高的是冒险类,此类影片剧情丰富,观赏性强,易被观众认可;第2名、第3名的犯罪和奇幻类影片平均评分相差非常小,具有刺激性效应的电影容易吸引观众;对于最后一名惊悚类型的影片平均评分仅有4.0分,本身类型小众,内容恐怖,如果影片品质很差,很难被观众接受.
图2 电影平均评分对比
图3~图5分别是散点图、小提琴图和箱型图的不同类型电影评分分布情况,对比其他研究的普通折线图、网络图,小提琴图及箱型图对数据可视化效果更好,能更加直观地表现数据分布.
图3 电影评分分布散点图
图4 电影评分分布小提琴图
图5 电影评分分布箱型图
从图3可以清楚地看出奇幻类、冒险类、动作类评分普遍较高.从图4可以看出奇幻和冒险类的评分多数高于6分,而动作类评分较多在5~6分之间.说明在动作类影片生产上还有品质提升空间,观众的口味多元化,并不是很喜欢单纯的动作片,相比之下,带有探索冒险、科幻奇妙剧情的电影更受观众追捧.如果此类型影片质量更好一些,那么观众认可度会更高.
由图4可以看出:动画类电影评分的分布两极化明显,与国外的动漫产业相比,国内在思想观念及技术水平方面均相对落后,还未完全打开市场,除了题材不够新颖外,剧本稀缺和整个电影工业跟不上也是重要因素;犯罪类评分普遍在5分以上,在2016年获得了较高的口碑,犯罪题材天生能够满足普通观众的猎奇和窥私欲望,而犯罪题材的深刻之处在于人性的集中爆发,一部好的犯罪片往往会触及到严峻的社会问题和人性的阴暗面,所以犯罪类型电影很有可能成为下一个爆发的热点.
结合图3和图5可以看出:作为好莱坞类型片市场一大支柱的喜剧类影片,虽然比较受制片商的追捧,但并没有得到观众的好评.近年来低成本、高回报的喜剧电影扎堆,其整体质量却令人堪忧,未来的国产喜剧电影创作亟需创新.从青春爱情片市场打开后,每年几十部主打青春和爱情的电影喷涌而出,形态纷呈,但却很难满足观众的要求.中国爱情片亟需跟上世界电影发展潮流,在爱情片的多元化和现代化方面做出努力,以更好地适应在大众文化的时代背景下高速增长的观影需求.惊悚类和悬疑类无论影片数量还是评分均明显低于其他类型电影,情况堪忧.
图6为评论人数与评分联合分布图,相对常见的其他分析可视化而言,Python的联合分布图在可视化的同时可以直接计算相关性并表现在图中,并不需要另行计算.
图6 评论人数与评分联合分布图
由图6可以看出:评论人数与评分之间呈现正相关关系,相关系数为0.52,属于中等程度相关(相关系数在-1~1之间,在统计学意义成立的基础上,相关系数越接近1,评价人数与票房之间的正相关性越大),表现为评价人数越多,则评分高的可能性越大,具有统计学意义.从总体来看,评论人数普遍在10万人以下,并且评论人数很多的电影评分也相对较高.评分与评价人数是用户观影参考的重要指标,它显露出票房的气息,能给消费者指示时下大众的观影潮流.人数与评价,在由外部环境、影片质量、个体心灵所编织的网络中相互牵扯,两者的关系暧昧不清、若即若离.
阐述了Python语言在数据爬取及可视化分析中的应用.通过对豆瓣网2016年公映电影的分析,可以给影业公司一些制片提示,也可以为用户观影提供重要的参考指标.通过实例可知:使用Python语言进行可视化分析可以更好地将大量而繁杂的数据应用起来,使可视化结果更形象,更直观地被大众接受理解,大大提高了工作效率.Matplotlib 和Seaborn作为 Python 著名的绘图库可以轻松绘制出各种统计图形,借助 Python 语言强大的数据处理和科学计算能力,在电影数据的分析处理方面有非常出色的表现.对比现有的ThemeRiver技术以及普通网络图、折线图可视化效果,Python数据爬取及可视化分析中具有简单、高效的特性,能够绘制出其他绘图工具无法绘制的统计图形,具有较好的发展前景.
然而,由于个人或企业因素电影评分可能不是出自评论者观影后的客观公正评价,评论者自身也会存在随机打星评级的现象,会造成分析结果不理想,需要改进.未来将针对这一现象深入研究,利用数据挖掘算法提升分析的效果,解决实际问题.