新闻详情

新闻详情

首页 / 资讯中心 / 详情

Python电影票房分析实战:从数据清洗到可视化全流程

发布时间:2026/9/26 11:57:54来源:尧图网络
Python电影票房分析实战:从数据清洗到可视化全流程
简介这份Python电影票房影响因素分析与可视化系统源码及文档面向计算机及相关专业的学习者适用于毕业设计、课程作业与项目实训等场景帮助解决从数据处理到模型构建的全流程实践需求。资源包共46个文件约6.03MB以24张png可视化结果图、6个py核心脚本、3个ipynb分析笔记为主另含sql建库脚本、pdf说明文档及md说明文件覆盖数据采集、清洗、可视化与预测建模各环节。项目围绕豆瓣电影数据通过多维可视化解析市场规律并运用统计模型挖掘影响票房的关键变量配套代码经多轮测试可在主流Python环境下直接部署运行。目前已有27人学习读者可借此掌握数据可视化技巧、影响因素相关性分析框架与预测模型构建流程同时参考完整科研文档规范为后续学术研究或职业发展积累标准化数据分析经验。1. 从一张票房表到一套可复现的分析系统这套 Python 方案到底解决什么问题很多人第一次做电影票房分析手里只有一份从公开渠道整理出来的 Excel片名、上映日期、排片占比、首日票房、总票房、评分、类型、导演、主演字段看着挺全真跑起来却处处别扭。想算个相关系数发现票房字段带「万」字想画个趋势图日期列是文本格式想比较不同类型片的票房差异类型字段里塞着「剧情/喜剧/爱情」这种复合值。于是大部分人的做法是手动改几行画两张柱状图交差结论停留在「喜剧片票房高」这种谁都知道的层面。这套「Python 电影票房影响因素分析与可视化系统」要解决的正是从原始表格到可解释结论之间的这段脏活。它不是一个预测模型比赛方案而是一套完整的分析流水线数据清洗、特征构造、影响因素量化、可视化呈现最后落到一份能讲清楚「哪些因素和票房真正相关、相关强度多大、在什么条件下成立」的文档。适合两类人一类是刚学完 pandas 和 matplotlib、想找一个完整项目练手的学生另一类是需要快速搭一套分析看板、给业务方解释票房驱动因素的数据从业者。我自己的经验是票房分析最容易翻车的地方不在建模而在数据本身。同一部电影在不同来源的票房数字能差出百分之十几档期、排片、宣发这些关键变量又很难拿到干净数据。所以这套系统的价值不在于给出多精确的预测而在于把「影响因素分析」这件事拆成可验证的步骤每一步都能看到中间结果出了问题能定位到具体环节。下面按数据准备、清洗、分析、可视化、避坑、进阶的顺序把整套流程讲透。2. 数据准备与字段设计票房分析的第一道分水岭2.1 先想清楚要分析哪些影响因素在写任何代码之前得先把「影响因素」这个词拆开。电影票房的影响因素大致分四类影片自身属性类型、时长、评分、导演和主演的号召力、市场环境档期、同期竞品数量、银幕数、发行策略排片占比、宣发投入、点映场次、观众反馈首周口碑、评分变化趋势。这四类里影片属性和观众反馈最容易拿到结构化数据市场环境和发行策略往往需要额外采集缺失也最严重。我一般会先做一张字段清单表把每个字段的来源、类型、缺失率、预期作用标清楚。这张表决定了后面清洗脚本要处理哪些异常也决定了分析阶段能得出什么结论。如果排片数据缺失超过三成那「排片对票房的影响」这个结论就不该写进文档否则就是拿噪声当发现。字段名类型来源预期缺失率分析用途片名字符串公开票房榜低主键关联上映日期日期公开票房榜低档期划分总票房数值公开票房榜低目标变量首日票房数值公开票房榜中首周爆发力排片占比数值院线数据高发行策略评分数值评分平台中口碑代理类型字符串影片资料低分类维度时长数值影片资料低影片属性导演字符串影片资料低号召力代理主演字符串影片资料中号召力代理这张表不是摆设。后面每清洗一个字段都要回来对照它的缺失率和用途决定是填充、剔除还是保留但标注。很多分析报告结论站不住脚就是因为没做这一步拿一个缺失率百分之四十的字段算相关系数还当成重要发现写进去。2.2 用 pandas 读入并做第一轮体检数据拿到手第一步不是急着画图而是做体检。下面这段代码读入原始表格输出每列的类型、缺失率、唯一值数量和几个关键统计量。这一步的目的是让数据的问题自己暴露出来而不是靠猜。import pandas as pd import numpy as np # 读入原始数据注意编码中文表格常见 gbk 或 utf-8-sig df pd.read_csv(movie_box_office.csv, encodingutf-8-sig) # 第一轮体检类型、缺失率、唯一值 def inspect(df): report pd.DataFrame({ dtype: df.dtypes, missing_rate: df.isnull().mean().round(4), n_unique: df.nunique(), sample: [df[c].dropna().iloc[0] if df[c].notna().any() else None for c in df.columns] }) return report print(inspect(df)) # 数值列的描述统计重点看 min/max 是否离谱 print(df.describe(include[np.number]).T)这段代码的关键在inspect函数missing_rate告诉你哪些字段不能直接用n_unique帮你发现本该是分类的字段被拆成了几百个唯一值比如主演字段用顿号分隔sample让你一眼看出票房字段是不是带单位。describe里的 min 和 max 尤其重要如果总票房的 max 是 56 而 min 是 0.3那基本可以确定单位不统一有的按亿有的按万。参数上encoding要根据实际文件调整中文 CSV 用utf-8-sig能避免表头出现乱码字符。如果数据是 Excel换成pd.read_excel但要注意openpyxl引擎对大文件较慢超过十万行建议先转 CSV。2.3 票房字段的单位统一与异常值处理票房字段是重灾区。常见的有「12.5亿」「8500万」「1.2亿美元」混在一起还有的直接是数字但单位不明。处理思路是先提取数值再根据单位词换算成统一口径我一般统一到「万元」。import re def parse_box_office(value): 把带单位的票房字符串统一换算成万元 if pd.isna(value): return np.nan value str(value).strip() # 提取数字部分支持小数 num re.findall(r[\d.], value) if not num: return np.nan num float(num[0]) # 根据单位词换算 if 亿 in value: return num * 10000 if 万 in value: return num if 美元 in value: return num * 7.2 * 10000 / 10000 # 按汇率折算单位仍为万元 return num # 无单位时按万元处理需人工复核 df[总票房_万元] df[总票房].apply(parse_box_office) df[首日票房_万元] df[首日票房].apply(parse_box_office) # 异常值检查票房为负或超过合理上限 print(df[df[总票房_万元] 0]) print(df[df[总票房_万元] 800000]) # 80亿以上人工复核parse_box_office的逻辑是「先提数字再看单位词」。这里有个坑如果字符串里同时出现「亿」和「万」比如「1.2亿3000万」上面的写法只会取第一个数字结果偏小。更稳妥的做法是分段匹配再相加但实际数据里这种写法很少我一般先按简单版跑发现异常值再针对性处理。汇率折算那行只是示意真实分析里如果混入美元票房建议单独标注而不是直接换算否则汇率波动会污染结论。异常值检查不能只看代码跑通要人工看几条。票房超过 80 万的单位万元即 80 亿在国内市场极少出现就要核对是不是单位重复换算。负值基本是数据录入错误直接置为缺失。3. 特征构造与影响因素量化把「口碑」「档期」变成可计算的列3.1 从日期字段拆出档期和上映星期档期是票房分析里解释力很强的变量但原始数据只有上映日期。需要从日期里拆出年份、月份、星期再根据月份和节假日规则打上档期标签。春节档、暑期档、国庆档、贺岁档这几个是重点。# 确保日期列是 datetime 类型 df[上映日期] pd.to_datetime(df[上映日期], errorscoerce) df[上映年份] df[上映日期].dt.year df[上映月份] df[上映日期].dt.month df[上映星期] df[上映日期].dt.dayofweek # 0 是周一 def label_season(month, day): 根据月份和日期打档期标签规则可自行调整 if month 2 and 1 day 20: return 春节档 if month in [7, 8]: return 暑期档 if month 10 and 1 day 7: return 国庆档 if month 12 or (month 1 and day 10): return 贺岁档 return 普通档 df[档期] df.apply(lambda r: label_season(r[上映月份], r[上映日期].day) if pd.notna(r[上映日期]) else np.nan, axis1)label_season的规则是简化的真实档期划分要看当年节假日安排春节档的起止每年不同。我一般会把规则单独写成一个配置字典方便按年份调整而不是硬编码在函数里。dayofweek返回 0 到 6周五到周日通常票房更高这个字段在后续分组分析里很有用。这里有个容易忽略的点pd.to_datetime遇到格式不统一的日期会返回 NaTerrorscoerce保证不报错但会丢数据。跑完要检查 NaT 的比例如果超过百分之五说明日期格式比预想的乱需要先做格式归一化。3.2 类型字段的拆分与多标签处理电影类型经常是「剧情/喜剧/爱情」这种复合值直接当分类变量用会导致类别过多。常见做法是拆成多个布尔列每部电影可以同时属于多个类型。# 按分隔符拆分类型生成多标签布尔列 type_dummies df[类型].str.get_dummies(sep/) type_dummies.columns [类型_ c for c in type_dummies.columns] df pd.concat([df, type_dummies], axis1) # 统计各类型出现频次低频类型考虑合并 type_counts type_dummies.sum().sort_values(ascendingFalse) print(type_counts) # 出现少于 10 次的类型合并为「其他」 rare_types type_counts[type_counts 10].index df[类型_其他] df[rare_types].max(axis1) df df.drop(columnsrare_types)str.get_dummies(sep/)是 pandas 里处理分隔符多标签的常用写法比手写循环快很多。拆完之后一定要看频次分布出现次数个位数的类型在分组分析里没有统计意义合并成「其他」更稳妥。合并时用max(axis1)而不是sum因为一部电影在同一类型上只会出现一次max能正确表示「是否属于该大类」。参数上sep要根据实际分隔符调整有的是「/」有的是「、」或「,」。如果类型字段里有空格比如「剧情 / 喜剧」要先str.replace去掉空格再拆。3.3 导演和主演号召力的量化思路导演和主演是字符串不能直接进模型。常见做法是用历史票房均值作为号召力代理对每个导演计算其历史作品的平均票房作为该导演的号召力分数。主演同理但主演字段往往是多人需要先拆分。# 计算导演历史平均票房排除当前影片避免数据泄漏 director_avg df.groupby(导演)[总票房_万元].mean().rename(导演号召力) df df.merge(director_avg, left_on导演, right_indexTrue, howleft) # 主演拆分按分隔符拆成列表再展开计算 def split_actors(s): if pd.isna(s): return [] return [a.strip() for a in re.split(r[、/,], s) if a.strip()] df[主演列表] df[主演].apply(split_actors) # 展开后计算每个演员的平均票房 actor_rows df.explode(主演列表) actor_avg actor_rows.groupby(主演列表)[总票房_万元].mean().rename(演员号召力) df df.merge(actor_avg, left_on主演, right_indexTrue, howleft)这里有个数据泄漏的坑用包含当前影片的全部数据算导演均值会把目标变量信息带进特征。严格做法是留一法即算某个导演均值时排除当前这部片。上面的代码为了简洁没做排除实际分析里如果要用这个特征做预测必须改成留一法否则相关系数会虚高。explode把一行多主演展开成多行是处理列表型字段的标准操作。展开后 groupby 算均值再 merge 回来注意 merge 的键要对应好主演字段是原始字符串不是列表所以 merge 时用left_on主演而不是列表列这里容易写错导致全为 NaN。4. 影响因素分析与可视化相关系数、分组对比和图表落地4.1 相关系数矩阵与显著性判断影响因素分析的核心是量化每个因素和目标变量的关系。数值型因素用皮尔逊相关系数分类因素用分组均值对比或方差分析。先看数值型的。from scipy import stats num_cols [总票房_万元, 首日票房_万元, 排片占比, 评分, 时长, 导演号召力] corr_matrix df[num_cols].corr(methodpearson) # 计算相关系数的 p 值 def corr_with_p(df, x, y): sub df[[x, y]].dropna() r, p stats.pearsonr(sub[x], sub[y]) return pd.Series({r: round(r, 3), p: round(p, 4), n: len(sub)}) results pd.DataFrame({c: corr_with_p(df, c, 总票房_万元) for c in num_cols if c ! 总票房_万元}).T print(results.sort_values(r, ascendingFalse))corr_with_p同时输出相关系数、p 值和样本量这三个缺一不可。只看 r 不看 p可能把随机波动当成发现只看 p 不看 n小样本下的显著没有实际意义。我一般要求 n 大于 30 且 p 小于 0.05 才在文档里写成「显著相关」。注意dropna是按对删除不同变量对的样本量可能不同这会导致相关系数之间不可直接比较。如果缺失严重建议先做缺失值处理再统一计算或者用df[num_cols].corr()的成对删除结果并标注样本量差异。4.2 分组对比不同类型和档期的票房差异分类变量的分析用分组统计加可视化。下面按档期和类型分组输出均值、中位数和样本量再用箱线图呈现分布差异。import matplotlib.pyplot as plt import seaborn as sns # 设置中文字体避免乱码 plt.rcParams[font.sans-serif] [SimHei] plt.rcParams[axes.unicode_minus] False # 按档期分组统计 season_stats df.groupby(档期)[总票房_万元].agg([mean, median, count]).round(1) print(season_stats.sort_values(mean, ascendingFalse)) # 箱线图 fig, ax plt.subplots(figsize(10, 6)) sns.boxplot(datadf, x档期, y总票房_万元, axax) ax.set_title(各档期票房分布对比) ax.set_ylabel(总票房万元) plt.xticks(rotation30) plt.tight_layout() plt.savefig(season_boxplot.png, dpi150)groupby后同时看 mean 和 median 很重要。票房分布通常右偏均值容易被少数爆款拉高中位数更能反映典型水平。如果均值和中位数差距很大说明分布偏斜严重文档里要同时报告两个数不能只写均值。箱线图能直观看出分布差异和异常值。SimHei字体在 Windows 上通常可用Linux 或 Mac 上可能需要换成Arial Unicode MS或指定字体文件路径。dpi150保证导出图片清晰用于文档足够。4.3 用热力图和散点图呈现多因素关系单变量分析之后用热力图看整体相关结构用散点图看关键变量的具体关系形态。# 相关性热力图 fig, ax plt.subplots(figsize(8, 6)) sns.heatmap(corr_matrix, annotTrue, fmt.2f, cmapRdBu_r, center0, squareTrue, axax) ax.set_title(数值变量相关性热力图) plt.tight_layout() plt.savefig(corr_heatmap.png, dpi150) # 排片占比与票房的散点图按档期着色 fig, ax plt.subplots(figsize(10, 6)) sns.scatterplot(datadf, x排片占比, y总票房_万元, hue档期, alpha0.7, axax) ax.set_title(排片占比与总票房关系按档期着色) plt.tight_layout() plt.savefig(scatter_screen.png, dpi150)热力图的center0让颜色以零为中心对称正相关偏红负相关偏蓝比默认配色更容易读。annotTrue显示数值但变量多时会拥挤超过八个变量建议关掉标注只保留颜色。散点图按档期着色能看出分层效应如果春节档的点整体偏右上说明档期和排片存在交互作用单看排片相关系数会低估档期的贡献。这种图在文档里比一张干巴巴的相关系数表有说服力得多。5. 避坑与排查票房分析里最容易翻车的五个地方5.1 票房单位不统一导致相关系数完全失真现象算出来排片占比和票房的相关系数是 0.12明显偏低但业务上排片和票房应该强相关。原因票房字段里混着「亿」和「万」清洗时只提取了数字没换算单位导致部分影片票房被缩小一万倍整体分布被拉平。解决在parse_box_office里强制单位归一跑完后用describe检查 min 和 max 是否在合理区间再抽样人工核对十条记录。单位处理完之前不要做任何分析。5.2 用全量数据算导演号召力造成数据泄漏现象导演号召力和票房的相关系数高达 0.85看起来是个强特征但换成新数据预测时效果一塌糊涂。原因计算导演均值时包含了当前影片自身的票房等于把答案提前告诉了特征。解决改用留一法算某个导演的号召力时排除当前这部片。样本量小的导演作品少于三部直接置为缺失不要用单部作品均值代替。5.3 日期解析失败导致档期标签大面积缺失现象档期分组统计里「普通档」占了八成春节档和国庆档样本极少和常识不符。原因pd.to_datetime遇到「2023.1.15」这种点分隔格式返回 NaT档期标签函数收到 NaT 后走了默认分支。解决解析前先用str.replace把点、斜杠统一成横杠或者给to_datetime传format参数指定格式。解析后检查 NaT 比例超过百分之五就先修格式再往下走。5.4 中文字体缺失导致图表全是方框现象本地跑图正常换一台机器或导出到文档里中文全变成方框。原因SimHei字体在目标环境不存在matplotlib 回退到默认字体中文无法渲染。解决不要硬编码字体名先检查可用字体列表或者直接把字体文件路径传给font_manager。跨平台项目建议把字体文件放进项目目录用相对路径加载保证到哪都能跑。5.5 缺失值处理方式不一致导致结论矛盾现象同一份数据两次分析得出排片和票房一个强相关一个弱相关。原因一次用了dropna按对删除一次用了均值填充两种方式对缺失样本的处理不同样本集变了结论自然变。解决在分析开始前统一缺失值策略写进文档。数值型字段缺失超过三成直接剔除低于三成用中位数填充并加缺失指示列。所有分析基于同一份处理后的数据不要中途换策略。6. 进阶技巧把分析结果做成可复用的报告模板前面五章把流程跑通了但每次换一批数据都要重跑脚本、重调图表效率很低。我一般会把整套逻辑封装成一个配置驱动的分析模板数据路径、字段映射、图表开关都写在配置文件里换数据只改配置不改代码。import yaml # config.yaml 示例 # data_path: data/movie_2024.csv # target_col: 总票房 # num_features: [排片占比, 评分, 时长] # cat_features: [档期, 类型] # output_dir: reports/2024 def load_config(path): with open(path, r, encodingutf-8) as f: return yaml.safe_load(f) def run_analysis(config): df pd.read_csv(config[data_path], encodingutf-8-sig) df[总票房_万元] df[config[target_col]].apply(parse_box_office) # 后续清洗、分析、绘图按配置里的字段列表执行 # 输出报告到 config[output_dir] return df config load_config(config.yaml) df run_analysis(config)配置驱动的核心价值是可复现。同一份配置跑出来的结果换个人、换台机器应该一致。我习惯在输出目录里同时存一份配置副本和运行时间戳方便回溯。图表开关用布尔值控制探索阶段全开出报告时只留关键几张避免文档里堆满图。验证分析结果是否可靠我常用一个笨办法把数据随机分成两半分别跑一遍相关系数和分组统计看结论是否一致。如果两半数据得出的排片相关系数差了 0.2 以上说明样本量不够或数据噪声太大结论要谨慎写。这个方法比任何统计检验都直观也最容易发现隐藏的数据问题。最后说个习惯每次分析完我会把「哪些结论站得住、哪些只是相关不是因果、哪些字段缺失太严重没纳入」单独写一段放进文档。票房分析里因果推断极难排片高可能因为片方看好票房好也可能反过来推高排片这种互为因果的关系在文档里必须说清楚否则读者容易把相关当因果用。这套系统能帮你把数据理干净、把关系量化出来但结论的边界得自己守住。希望帮到你。本文还有配套的精品资源点击获取
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

NodeGui 枚举详解:Direction 方向枚举的取值、语义与实战用法 2026/9/26 15:45:04

NodeGui 枚举详解:Direction 方向枚举的取值、语义与实战用法

桌面应用跨平台 【免费下载链接】nodegui A library for building cross-platform native desktop applications with Node.js and CSS 🚀. React NodeGui : https://react.nodegui.org and Vue NodeGui: https://vue.nodegui.org 项目地址: https://git…

阅读更多 →
codex-claude-academic-skills安全铁律解析:5条数据防造假规则与定制AI Skill开发者教程 2026/9/26 15:45:04

codex-claude-academic-skills安全铁律解析:5条数据防造假规则与定制AI Skill开发者教程

codex-claude-academic-skills安全铁律解析:5条数据防造假规则与定制AI Skill开发者教程 【免费下载链接】codex-claude-academic-skills 本仓库包含三个面向学术科研人员的Skills,覆盖从文献阅读、论文写作到科学计算的完整研究工作流。office-academic…

阅读更多 →
AI_NovelGenerator 快速上手指南:如何用 LLM 逐章生成 30 章长篇而上下文不断线 2026/9/26 15:44:58

AI_NovelGenerator 快速上手指南:如何用 LLM 逐章生成 30 章长篇而上下文不断线

AI_NovelGenerator 快速上手指南:如何用 LLM 逐章生成 30 章长篇而上下文不断线 【免费下载链接】AI_NovelGenerator 使用ai生成多章节的长篇小说,自动衔接上下文、伏笔 项目地址: https://gitcode.com/GitHub_Trending/ai/AI_NovelGenerator 用大…

阅读更多 →
DeepSeek-OCR-2动态分辨率揭秘:(0-6)×768切块+1024全局视图如何平衡精度与视觉Token成本 2026/9/26 15:44:58

DeepSeek-OCR-2动态分辨率揭秘:(0-6)×768切块+1024全局视图如何平衡精度与视觉Token成本

DeepSeek-OCR-2动态分辨率揭秘:(0-6)768切块1024全局视图如何平衡精度与视觉Token成本 【免费下载链接】DeepSeek-OCR-2 Visual Causal Flow 项目地址: https://gitcode.com/gh_mirrors/de/DeepSeek-OCR-2 DeepSeek-OCR-2 是 DeepSeek 开源的文档 OCR 模型&a…

阅读更多 →
Cortex-M4 FPU中断嵌套HardFault排查:优先级配置与上下文保存 2026/9/26 15:44:51

Cortex-M4 FPU中断嵌套HardFault排查:优先级配置与上下文保存

1. 一次“莫名其妙”的硬件异常,把我拉回了FPU和中断优先级的坑里那天下午,我正对着一个跑在Cortex-M4上的电机控制固件做压力测试。系统跑的是FreeRTOS,任务调度、串口通信、PWM输出都挺正常,唯独在电机负载突变的时候&#xff0…

阅读更多 →
qlib 量化回测入门:手把手 3 步跑通选股策略,从数据到报告全流程说明 2026/9/26 15:44:51

qlib 量化回测入门:手把手 3 步跑通选股策略,从数据到报告全流程说明

qlib 量化回测入门:手把手 3 步跑通选股策略,从数据到报告全流程说明 【免费下载链接】qlib Qlib is an AI-oriented Quant investment platform that aims to use AI tech to empower Quant Research, from exploring ideas to implementing production…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉