社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

用Python解读票房数据 | 2019春节档各地影院哪家强

CDA数据分析师 • 6 年前 • 697 次点击  

作者:量化小白H 

本文转自公众号 量化小白上分记


今年春节档全国共有8部影片上映,对于影片的对比分析已经非常多,孰优孰劣,每个人心里都有一杆秤,不再赘述。本文着重分析影片票房的地域差别,爬取了年后两周各地万余家影院的票房数据,一起来看看各地影院今年春节档表现如何,非官方统计,数据一定不准确,看看就好。


1.数据说明


分影院的票房数据来自中国票房网:http://www.cbooo.cn/cinemaday


网站提供日票房排行榜的前100名和周票房的前一万余名,本文爬取包含更多样本的周票房数据,取年后两周的数据。



最终爬到的数据样式如下,数据从左往右依次为影院名称当周票房单荧幕票房场均人次 单日单厅票房单日单厅场次6个变量。



2.数据获取


使用Python获取数据,对于爬取过程不感兴趣的可以直接看下部分,需要数据/代码的请在后台回复“票房”。


在数据页面按F12打开开发者工具,选择NetWorkXHR,刷新页面后,依次点1,2,3,4页,接收到了一堆文件。



右键任意打开一个,显示如下(如果不是这种格式,说明你选错了)



是我们需要的数据,对比前后的变量关系,得到每个变量的含义。



再分析网址,从前面的截图能看出来,pindex后面跟的是页码,对页码进行循环就可以爬到所有的数据。dt = 1042看不出来什么意思,但改变日期范围重复上面的操作时,看到此时dt变成了1041,说明dt后面的值对应不同的日期范围



我们的目标是爬取0204-0210,0211-0217两周的数据,获取对应的dt分别是1040和1041,最终代码如下:


# -*- coding: utf-8 -*-
"""
Created on Fri Oct 19 18:50:03 2018

"""

import urllib
import requests
from fake_useragent import UserAgent
import json
import pandas as pd
import time
import datetime

# 发送get请求
comment_api = 'http://www.cbooo.cn/BoxOffice/getCBW?pIndex={}&dt={}'
"""
cinemaName:影院名称
amount:当周票房
avgPS:场均人次
avgScreen:单荧幕票房
screen_yield:单日单厅票房
scenes_time:单日单厅场次
"""



headers = { "User-Agent": UserAgent(verify_ssl=False).random}

#response_comment = requests.get(comment_api.format(1,1040),headers = headers)
#json_comment = response_comment.text
#json_comment = json.loads(json_comment)
col = ['cinemaName','amount','avgPS','avgScreen','scenes_time','screen_yield']

dataall = pd.DataFrame()


num = 1035
for i in range(1,num+1):
   

   response_comment = requests.get(comment_api.format(i,1041),headers = headers)
   json_comment = response_comment.text
   json_comment = json.loads(json_comment)        
   
   n = len(json_comment['data1'])
   datas = pd.DataFrame(index = range(n),columns = col)
   for  j in range(n):        
       datas.loc[j,'cinemaName'] = json_comment['data1'][j]['cinemaName']
       datas.loc[j,'amount'] = json_comment['data1'][j]['amount']
       datas.loc[j,'avgPS'] = json_comment['data1'][j]['avgPS']
       datas.loc[j,'avgScreen'] = json_comment['data1'][j]['avgScreen']
       datas.loc[j,'scenes_time'] = json_comment['data1'][j]['scenes_time']
       datas.loc[j,'screen_yield'] = json_comment['data1'][j]['screen_yield']

   dataall = pd.concat([dataall,datas],axis = 0)
   print('已完成 {}% !'.format(round(i/num*100,2)))
   time.sleep(0.5)
   
dataall = dataall.reset_index()


得到的两周数据里,第一周包含11295个样本,第二周包含11375个样本,将两周数据按影院合并后,最终得到10193个样本。


data1 = data1.drop_duplicates()
data2 = data2.drop_duplicates()

datas = pd.merge(data1,data2,left_on ='cinemaName',right_on = 'cinemaName').dropna()
datas = datas.reset_index(drop = True)

dataall = datas[['cinemaName']]

dataall['amount'] = datas['amount_x'] + datas['amount_y']
dataall['avgPS'] = (datas['avgPS_x'] + datas['avgPS_y'])/2
dataall['avgScreen'] = datas['avgScreen_x'] + datas['avgScreen_y']
dataall['screen_yield'] = (datas['screen_yield_x'] + datas['screen_yield_y'])/2
dataall['scenes_time'] = (datas['scenes_time_x'] + datas['scenes_time_y'])/2
dataall['avgprice'] = dataall.screen_yield/dataall.scenes_time/dataall.avgPS
dataall = dataall.dropna().reset_index(drop = True)



3.数据总览


先从各方面简单看看取到的数据。


票房TOP10影院



北京耀莱以860万的票房,远超第二名金逸北京的590万占据首位。并且票房前10名中,有5家都是北京的影院。


单变量分布


用单日单厅票房/单日单厅场次/场均人数估计平均票价,各个变量分布进如下 



可以看出,所有变量都呈现尖峰右拖尾的特征,大部分值低于中位数,但也不乏高于均值的点,考虑到各个影院数据存在规模、地域等因素差异,这一结果就很正常了。


票房影响因素


1. 从上图看出,场均人次与单荧幕票房正相关,观影人数增多票房收入增加,符合常理。


2. 单日单厅场次与票房之间有先升后降的关系,换句话说,排片少时,增加每日排片能增加票房收入,但排片过于密集,反而不利于票房增加


3. 票价,场均人次与票房之间关系如图,颜色越深,表明票房越高。票价影响场均人次,过高和过低都会使票房收入减少,平均票价40-70区间内,影院票房收入更高,符合实际情况。



4.票房地域特征


粗略看过数据之后,我们分析地域因素对于票房的影响,虽然爬取的数据中没有直接给出影院的地域特征,但可以用影院名称提取地域位置,python里有一个基于jieba分词的地域查询包cpca,可以直接返回中文地址对应的省市县。


result = cpca.transform(dataall.cinemaName.tolist(),cut = False)
dataall['province'] = result['省']
dataall['city'] = result['市']


用cpca查询各个影院所在的省市,但这个包也不是非常完善,加上有的影院名称地址非常模糊,最终有7581个影院查询到了省市。


未查询到的部分影院如下,一部分是没有地域信息,只有影院名称,一部分有地域信息,可能过于生僻,未能匹配到,之后的分析中删掉没匹配到的这部分影院。



匹配到影院所在省份后,按省份汇总数据,分析各省票房。


各省票房


各地区票房存在明显差异,广东省票房收入最高,远超其他省份去,西藏票房最少。


接下来从各省影院数、场均人次、平均票价三方面来看各省差异。


影院数


最终获取的有地域信息的影院中,广东省有1088个影院,远远超出平均水平,这也可以解释为何广东省票房总数能排到第一,而西藏地区仅有13个影院,绝大部分地区影院在200上下浮动。


场均人次-平均票价


平均票价整体差异不大,40元左右波动,场均人次来看,北京天津最多,但最高最低值差异不超过30人,因此这两项因素对于票房的影响远不如影院数大。


各市票房分布


最后将票房按市进行统计,得到全国各市票房分布如下:



图中标出了票房收入最高的5个市,分别是北京(3279万)、上海(3083万)、广州(2258万)、深圳(2205万)、成都(1856万)。



以上就是本文的内容啦,若想获取数据/代码,请在后台回复“票房”。



CDA 课程咨询丨赵老师

联系电话:13381275813
扫描二维码





更多精彩文章

· 免费!10本必读的机器学习书籍(附下载)

· 收藏 | 这可能是史上最全的 Python 算法集!

· 第九届CDA考试状元访谈 | 看看状元们都说了啥

· 猫眼5万条评论告诉你《飞驰人生》值不值得看?!

· 盘点 | 过去一年,AI 圈都发生了哪些事儿(附年度报告下载)

· Python程序员!变身!这有一张最高效成长路线图(附资源)


Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/29326
 
697 次点击