【Python数据分析案例】——中国高票房电影分析(爬虫获取数据及分析可视化全流程)

这篇具有很好参考价值的文章主要介绍了【Python数据分析案例】——中国高票房电影分析(爬虫获取数据及分析可视化全流程)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

案例背景

最近总看到《消失的她》票房多少多少,《孤注一掷》票房又破了多少多少…

于是我就想自己爬虫一下获取中国高票房的电影数据,然后分析一下。

数据来源于淘票票:影片总票房排行榜 (maoyan.com)

for p in ax.patches: ax.annotate(f'{p.get_width():.2f}', (p.get_width(), p.g,python,数据分析,爬虫,Python编程,Python学习,网络爬虫

爬它就行。

代码实现

首先爬虫获取数据:

数据获取

导入包

import requests; import pandas as pd
from bs4 import BeautifulSoup

传入网页和请求头

url = 'https://piaofang.maoyan.com/rankings/year'
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36 Edg/116.0.1938.62'}
response1 = requests.get(url,headers=headers)
response.status_code

for p in ax.patches: ax.annotate(f'{p.get_width():.2f}', (p.get_width(), p.g,python,数据分析,爬虫,Python编程,Python学习,网络爬虫

200表示获取网页文件成功

然后解析网页文件,获取电影信息数据

%%time
soup = BeautifulSoup(response.text, 'html.parser')
soup=soup.find('div', id='ranks-list')
movie_list = []
 
for ul_tag in soup.find_all('ul', class_='row'):
    movie_info = {}
    li_tags = ul_tag.find_all('li')
    movie_info['序号'] = li_tags[0].text
    movie_info['标题'] = li_tags[1].find('p', class_='first-line').text
    movie_info['上映日期'] = li_tags[1].find('p', class_='second-line').text
    movie_info['票房(亿)'] = f'{(float(li_tags[2].text)/10000):.2f}'
    movie_info['平均票价'] = li_tags[3].text
    movie_info['平均人次'] = li_tags[4].text
    movie_list.append(movie_info)

数据获取完成了! 查看字典数据:

movie_list

for p in ax.patches: ax.annotate(f'{p.get_width():.2f}', (p.get_width(), p.g,python,数据分析,爬虫,Python编程,Python学习,网络爬虫

可以,很标准,没什么问题,然后把它变成数据框,查看前三行

movies=pd.DataFrame(movie_list)
movies.head(3)

for p in ax.patches: ax.annotate(f'{p.get_width():.2f}', (p.get_width(), p.g,python,数据分析,爬虫,Python编程,Python学习,网络爬虫

对数据进行一定的清洗,我们看到上映日期里面的数据有“上映”两个字,我们要去掉,然后把它变成时间格式,票房,票价,人次都要变成数值型数据。

我们只取票房前250的电影,对应豆瓣250.,中国票房250好叭

然后我们还需要从日期里面抽取年份和月份两列数据,方便后面分析。

#清洗
movies=movies.set_index('序号').loc[:'250',:]  
movies['上映日期']=pd.to_datetime(movies['上映日期'].str.replace('上映',''))
movies[['票房(亿)','平均票价','平均人次']]=movies.loc[:,['票房(亿)','平均票价','平均人次']].astype(float)
movies['年份']=movies['上映日期'].dt.year  ;   movies['月份']=movies['上映日期'].dt.month
movies.head(2)

for p in ax.patches: ax.annotate(f'{p.get_width():.2f}', (p.get_width(), p.g,python,数据分析,爬虫,Python编程,Python学习,网络爬虫

数据处理完毕,开始画图分析!

画图分析

导入画图包

import seaborn as sns
import matplotlib.pyplot as plt
plt.rcParams ['font.sans-serif'] ='SimHei'               #显示中文
plt.rcParams ['axes.unicode_minus']=False  

对票房排名前20的电影画柱状图

top_movies = movies.nlargest(20, '票房(亿)')
plt.figure(figsize=(7, 4),dpi=128)
ax = sns.barplot(x='票房(亿)', y='标题', data=top_movies, orient='h',alpha=0.5)
#plt.xticks(rotation=80, ha='center')
 
# 在柱子上标注数值
for p in ax.patches:
    ax.annotate(f'{p.get_width():.2f}', (p.get_width(), p.get_y() + p.get_height() / 2.),
                va='center', fontsize=8, color='gray', xytext=(5, 0),
                textcoords='offset points')
 
plt.title('票房前20的电影')
plt.xlabel('票房数量(亿)')
plt.ylabel('电影名称')
plt.tight_layout()
plt.show()

for p in ax.patches: ax.annotate(f'{p.get_width():.2f}', (p.get_width(), p.g,python,数据分析,爬虫,Python编程,Python学习,网络爬虫

还不错,很好看,可以看到中国历史票房前20 的电影名称和他们的票房数量。

对平均票价和平均人次进行分析:

plt.figure(figsize=(7, 6),dpi=128)
# 绘制第一个子图:平均票价点图
plt.subplot(2, 2, 1)
sns.scatterplot(y='平均票价', x='年份', data=movies,c=movies['年份'],cmap='plasma')
plt.title('平均票价点图')
plt.ylabel('平均票价')
#plt.xticks([])
 
plt.subplot(2, 2, 2)
sns.boxplot(y='平均票价', data=movies)
plt.title('平均票价箱线图')
plt.xlabel('平均票价')
 
plt.subplot(2, 2, 3)
sns.scatterplot(y='平均人次', x='年份', data=movies,c=movies['年份'],cmap='plasma')
plt.title('平均人次点图')
plt.ylabel('平均人次')
 
plt.subplot(2, 2, 4)
sns.boxplot(y='平均人次', data=movies)
plt.title('平均人次箱线图')
plt.xlabel('平均人次')
plt.tight_layout()
plt.show()

for p in ax.patches: ax.annotate(f'{p.get_width():.2f}', (p.get_width(), p.g,python,数据分析,爬虫,Python编程,Python学习,网络爬虫

先看柱状图,可以看到平均票价和平均人次都是有一些离群点的,然后我们在左边画了他们和年份的的散点图,可以明细看到,随着年份越大,电影的平均人次越来越低,平均票价越来越高…也就是最近的电影比起之前的电影来说,越来越贵,而且平均每场看的人越来越少…也侧面反映了我国电影业的一些“高票价”,‘幽灵剧场刷票房’ 等等乱象…

我注意到2000年之前有一个电影每场人次特别高,票价很低,它是什么电影我很好奇我就查看了一下:

movies[movies['年份']<2000]

for p in ax.patches: ax.annotate(f'{p.get_width():.2f}', (p.get_width(), p.g,python,数据分析,爬虫,Python编程,Python学习,网络爬虫

原来是国民级别的《泰坦尼克号》,那没事了,名副实归。

不同年份的高票房电影数量:

plt.figure(figsize=(7, 3), dpi=128)
year_count = movies['年份'].value_counts().sort_index()
sns.lineplot(x=year_count.index, y=year_count.values, marker='o', lw=1.5, markersize=3)
plt.fill_between(year_count.index, 0, year_count, color='lightblue', alpha=0.8)
plt.title('不同年份高票房电影数量')
plt.xlabel('年份')
plt.ylabel('电影数量')
# 在每个数据点上标注数值
for x, y in zip(year_count.index, year_count.values):
    plt.text(x, y+0.2, str(y), ha='center', va='bottom', fontsize=8)
 
plt.tight_layout()
plt.show()

for p in ax.patches: ax.annotate(f'{p.get_width():.2f}', (p.get_width(), p.g,python,数据分析,爬虫,Python编程,Python学习,网络爬虫

可以看到,我国高票房的电影,从2010年开始高速增长,到2017年到达峰值,著名的《战狼2》就是2017年上映的,然后2018和2019略微下降,2020年断崖下跌,,为什么,懂得懂得,疫情原因嘛。

对高票房电影不同月份的占比百分比分析:

plt.figure(figsize=(4, 4),dpi=128)
month_count = movies['月份'].value_counts(normalize=True).sort_index()
# 绘制饼图
sns.set_palette("Set3")
plt.pie(month_count, labels=month_count.index, autopct='%.1f%%', startangle=140, counterclock=False,
        wedgeprops={'alpha': 0.9})
plt.axis('equal')  # 保证饼图是正圆形
plt.text(-0.3,1.2,'不同月份高票房电影数量',fontsize=8)
plt.tight_layout()
plt.show()

for p in ax.patches: ax.annotate(f'{p.get_width():.2f}', (p.get_width(), p.g,python,数据分析,爬虫,Python编程,Python学习,网络爬虫

我们可以看到,高票房电影主要集中在2月,7月,12月,三个月份区间。

理由也很简单,2月春节,7月暑假,12月跨年…电影都喜欢这三个时间段上映。

自定义评价指标

我们上面都是之间拿票房进行分析的,我们发现,票房高的电影真的是反映了看的人多嘛?它真的是受观众喜欢的好电影嘛?

数据有限,虽然我们无法剔除宣传,时间热点,导演,社会风气等等影响因素,但是我们可以把票价进行一定的控制。因为票房高的电影也有可能是票价过高造成的,所以我们用‘票房/平均票价’,然后和‘平均人次’进行一个加权求和。

票房/平均票价 表示看电影的人群量,给7成权重,平均人次 给一个3层的权重,然后都进行标准化统一数据单位,加起来就成为我们自己的评价指标:

为了方便标准化我们先导入一个机器学习库里面sklearn的标准化函数

from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()

计算指标:

movies['我的评价指标']=(movies['票房(亿)'].astype(float)/movies['平均票价'].astype(float))
data1=scaler.fit_transform(movies[['我的评价指标', '平均人次']])
movies['我的评价指标']=0.7*data1[:,0]+0.3*data1[:,1]
movies=movies.sort_values(by='我的评价指标',ascending=False)

画图查看:

my_top_movies = movies.nlargest(20, '我的评价指标')
plt.figure(figsize=(7, 4),dpi=128)
ax = sns.barplot(x='我的评价指标', y='标题', data=my_top_movies, orient='h',alpha=0.6,palette='rainbow_r')
#plt.xticks(rotation=80, ha='center')
 
# 在柱子上标注数值
for p in ax.patches:
    ax.annotate(f'{p.get_width():.2f}', (p.get_width(), p.get_y() + p.get_height() / 2.),
                va='center', fontsize=8, color='gray', xytext=(5, 0),
                textcoords='offset points')
 
plt.title('前20电影')
plt.xlabel('我的评价指标')
plt.ylabel('电影名称')
plt.tight_layout()
plt.show()

for p in ax.patches: ax.annotate(f'{p.get_width():.2f}', (p.get_width(), p.g,python,数据分析,爬虫,Python编程,Python学习,网络爬虫

和之前的最高票房前20 的作对比,这样我们能比较哪些是票房过高的电影,哪些是可能被低估的电影。

def get_unique_elements(list1, list2):
    # 获取每个列表中的唯一元素
    set1 = set(list1) ; set2 = set(list2)
    unique_to_list1 = list(set1 - set2)
    unique_to_list2 = list(set2 - set1)
    common_elements = list(set1 & set2)
    return unique_to_list1, common_elements, unique_to_list2

票价过高的电影,确实是好电影,被低估的电影=get_unique_elements(top_movies[‘标题’].to_list(), my_top_movies[‘标题’].to_list())

这个函数的作用是选出第一个列表特有的元素,两个列表共有的元素,第二个列表特有的元素。

若这个电影在票房前20里面,也在我们的评价指标前20里面,那么就是好电影。若它在在票房前20里面,不在我们的评价指标前20里面,那可能就是票价过高的“水分电影”。

print(f'票价过高的电影:{票价过高的电影},\n\n确实是好电影:{确实是好电影},\n\n低估的电影:{被低估的电影}')

for p in ax.patches: ax.annotate(f'{p.get_width():.2f}', (p.get_width(), p.g,python,数据分析,爬虫,Python编程,Python学习,网络爬虫

票价过高的电影:[‘八佰’, ‘我和我的家乡’, ‘独行月球’, ‘流浪地球2’],emmmm

这几个电影,我都没怎么深入了解就不评价了…

词云图

加个词云图吧,好看些:

先自定义一个随机颜色函数:

import numpy as np
def randomcolor():
    colorArr = ['1','2','3','4','5','6','7','8','9','A','B','C','D','E','F']
    color ="#"+''.join([np.random.choice(colorArr) for i in range(6)])
    return color
[randomcolor() for i in range(3)]

然后画词云图:这里用了垫图掩码,原始图片形状为这样的六角星:——

for p in ax.patches: ax.annotate(f'{p.get_width():.2f}', (p.get_width(), p.g,python,数据分析,爬虫,Python编程,Python学习,网络爬虫

from wordcloud import WordCloud
from matplotlib import colors
from imageio.v2 import imread    #形状设置
mask = imread('词云.png')  

# 将’标题’和’票房’列合并为字典,以便生成词云图

word_freq = dict(zip(movies['标题'], movies['票房(亿)']))
color_list=[randomcolor() for i in range(20)]
 
wordcloud = WordCloud(width=1000, height=500, background_color='white',font_path='simhei.ttf',
                      max_words=50, max_font_size=50,random_state=42,mask = mask,
                          colormap=colors.ListedColormap(color_list)).generate_from_frequencies(word_freq)
 
plt.figure(figsize=(10, 5),dpi=256)
plt.imshow(wordcloud, interpolation='bilinear')
plt.axis('off')
plt.show()

for p in ax.patches: ax.annotate(f'{p.get_width():.2f}', (p.get_width(), p.g,python,数据分析,爬虫,Python编程,Python学习,网络爬虫

总结

本次演示了从数据爬虫获取,到清洗整理,再到计算和可视化分析的全流程,再多加点图和文字分析角度,加点模型,作为大多数的本科生的论文算是差不多的工作量了。

感兴趣的小伙伴,赠送全套Python学习资料,包含面试题、简历资料等具体看下方。

for p in ax.patches: ax.annotate(f'{p.get_width():.2f}', (p.get_width(), p.g,python,数据分析,爬虫,Python编程,Python学习,网络爬虫

一、Python所有方向的学习路线

Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照下面的知识点去找对应的学习资源,保证自己学得较为全面。

for p in ax.patches: ax.annotate(f'{p.get_width():.2f}', (p.get_width(), p.g,python,数据分析,爬虫,Python编程,Python学习,网络爬虫
for p in ax.patches: ax.annotate(f'{p.get_width():.2f}', (p.get_width(), p.g,python,数据分析,爬虫,Python编程,Python学习,网络爬虫

二、Python必备开发工具

工具都帮大家整理好了,安装就可直接上手!for p in ax.patches: ax.annotate(f'{p.get_width():.2f}', (p.get_width(), p.g,python,数据分析,爬虫,Python编程,Python学习,网络爬虫

三、最新Python学习笔记

当我学到一定基础,有自己的理解能力的时候,会去阅读一些前辈整理的书籍或者手写的笔记资料,这些笔记详细记载了他们对一些技术点的理解,这些理解是比较独到,可以学到不一样的思路。

for p in ax.patches: ax.annotate(f'{p.get_width():.2f}', (p.get_width(), p.g,python,数据分析,爬虫,Python编程,Python学习,网络爬虫

四、Python视频合集

观看全面零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。

for p in ax.patches: ax.annotate(f'{p.get_width():.2f}', (p.get_width(), p.g,python,数据分析,爬虫,Python编程,Python学习,网络爬虫

五、实战案例

纸上得来终觉浅,要学会跟着视频一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。

for p in ax.patches: ax.annotate(f'{p.get_width():.2f}', (p.get_width(), p.g,python,数据分析,爬虫,Python编程,Python学习,网络爬虫

六、面试宝典

for p in ax.patches: ax.annotate(f'{p.get_width():.2f}', (p.get_width(), p.g,python,数据分析,爬虫,Python编程,Python学习,网络爬虫

for p in ax.patches: ax.annotate(f'{p.get_width():.2f}', (p.get_width(), p.g,python,数据分析,爬虫,Python编程,Python学习,网络爬虫文章来源地址https://www.toymoban.com/news/detail-809535.html

简历模板for p in ax.patches: ax.annotate(f'{p.get_width():.2f}', (p.get_width(), p.g,python,数据分析,爬虫,Python编程,Python学习,网络爬虫
若有侵权,请联系删除

到了这里,关于【Python数据分析案例】——中国高票房电影分析(爬虫获取数据及分析可视化全流程)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 电影票房之数据分析(Hive)--第5关

    电影票房之数据分析(Hive) 第5关:统计2020年元旦节与国庆节放假后7天的观影人数 本关任务 基于EduCoder平台提供的初始数据集,统计 2020 年元旦节与国庆节放假后 7 天的观影人数。 编程要求 本实验环境已开启 Hadoop 服务 在 hive 中创建数据库  mydb ; 注意:在开始要求2之前

    2024年02月08日
    浏览(58)
  • Python数据分析案例31——中国A股的月份效应研究(方差分析,虚拟变量回归)

    本次案例是博主本科在行为金融学课程上做的一个小项目,最近看很多经管类的学生作业都很需要,我就用python来重新做了一遍。不弄那些复杂的机器学习模型了,经管类同学就用简单的统计学方法来做模型就好。 有效市场假说是现代金融证券市场的理论基础之一,根据这一

    2024年01月22日
    浏览(80)
  • 20亿票房但不好看?Python分析《孤注一掷》豆瓣评论数据

    环境使用 Python 3.8 解释器 Pycharm 编辑器 所需模块 一. 数据来源分析: 明确需求: 采集的网站是什么? 采集的数据是什么? 评论相关数据 抓包分析相关数据来源 通过浏览器自带开发者工具进行抓包分析 重点 打开开发者工具: F12 或者 鼠标右键点击检查选择network 刷新网页: 让本网

    2024年02月09日
    浏览(61)
  • 电影评分数据分析案例-Spark SQL

    1. 2. 3. 4. 5. 6.

    2024年02月08日
    浏览(72)
  • 【爬虫JS混淆分析】某网站票房响应数据加密(含JS补环境调用与Python解密算法)

    【作者主页】: 吴秋霖 【作者介绍】:Python领域优质创作者、阿里云博客专家、华为云享专家。长期致力于Python与爬虫领域研究与开发工作! 【作者推荐】:对JS逆向感兴趣的朋友可以关注《爬虫JS逆向实战》,对分布式爬虫平台感兴趣的朋友可以关注《分布式爬虫平台搭建

    2024年02月04日
    浏览(70)
  • Python爬取猫眼电影票房 + 数据可视化

    对猫眼电影票房进行爬取,首先我们打开猫眼 接着我们想要进行数据抓包,就要看网站的具体内容,通过按F12,我们可以看到详细信息。 通过两个对比,我们不难发现 User-Agent 和 signKey 数据是变化的(平台使用了数据加密) 所以我们需要对User-Agent与signKey分别进行解密。 通

    2024年04月24日
    浏览(67)
  • 基于Python的电影影片数据分析

    摘 要 数据分析与可视化是当今数据分析的发展方向。大数据时代,数据资源具有海量特征。数据分析和可视化主要通过Python数据分析来实现。基于Python的数据分析可视化和技术实现是目前Python数据分析的主要目的,Python可以为数据分析可视化提供思路,在体现数据价值方面

    2024年02月08日
    浏览(83)
  • 基于python大数据的电影可视化分析及电影推荐

    随着信息技术和互联网技术的快速发展,利用数据采集技术实现用户感兴趣的数据收集分析成为很多互联网公司研究讨论的热门话题。通过对基于Python的大数据的电影可视化分析与电影推荐,采集进行电影热度动态变化的需求进行调查分析,发现作为研究电影热度波动变化的

    2023年04月23日
    浏览(63)
  • 大数据可视化——基于Python豆瓣电影数据可视化分析

    本项目旨在通过对豆瓣电影数据进行综合分析与可视化展示,构建一个基于Python的大数据可视化系统。通过数据爬取收集、清洗、分析豆瓣电影数据,我们提供了一个全面的电影信息平台,为用户提供深入了解电影产业趋势、影片评价与演员表现的工具。项目的关键步骤包括

    2024年02月04日
    浏览(82)
  • 用Python爬取电影数据并可视化分析

      🤵‍♂️ 个人主页:@艾派森的个人主页 ✍🏻作者简介:Python学习者 🐋 希望大家多多支持,我们一起进步!😄 如果文章对你有帮助的话, 欢迎评论 💬点赞👍🏻 收藏 📂加关注+ 目录 一、获取数据 1.技术工具 2.爬取目标 3.字段信息 二、数据预处理 1.加载数据 2.异常值

    2024年02月06日
    浏览(72)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包