公司动态

Python数据分析实战:全球票房TOP1000电影数据挖掘

📅 2026/7/26 14:58:26
Python数据分析实战:全球票房TOP1000电影数据挖掘
1. 项目概述这个数据分析项目源于我对电影行业数据的好奇。作为一名Python数据分析爱好者我决定对全球票房TOP1000的电影数据进行深度挖掘。这个数据集包含了从20世纪50年代至今的票房冠军影片涵盖了电影名称、上映年份、全球票房、制作成本、导演、主演、IMDb评分等关键字段。选择这个主题主要基于三个考虑首先电影数据具有天然的趣味性和大众吸引力其次票房数据包含了丰富的时间序列和分类变量适合练习各种数据分析技术最后通过分析可以揭示电影行业的商业规律和观众偏好变化。2. 数据准备与清洗2.1 数据来源与获取我使用的数据集来自Kaggle上的Top 1000 Highest Grossing Movies数据集。这个数据集相对完整但依然需要进行清洗和预处理。获取数据的方式有两种直接从Kaggle下载CSV文件使用Kaggle API获取import pandas as pd # 方法一直接读取本地CSV df pd.read_csv(top_1000_movies.csv) # 方法二使用Kaggle API from kaggle.api.kaggle_api_extended import KaggleApi api KaggleApi() api.authenticate() api.dataset_download_files(suraj520/top-1000-highest-grossing-movies, unzipTrue)2.2 数据清洗关键步骤原始数据存在缺失值、格式不一致等问题需要进行以下清洗处理缺失值对数值型字段用中位数填充分类字段用众数或Unknown填充格式统一化将票房和成本统一转换为同一货币单位美元和数值格式异常值处理识别并处理明显不合理的极端值类型转换将日期字段转换为datetime类型分类字段转换为category类型# 示例清洗票房数据 df[Worldwide Gross] df[Worldwide Gross].str.replace($, ).str.replace(,, ).astype(float) df[Domestic Gross] df[Domestic Gross].str.replace($, ).str.replace(,, ).astype(float) # 处理缺失值 df[Runtime] df[Runtime].fillna(df[Runtime].median()) df[Director] df[Director].fillna(Unknown)注意数据清洗阶段往往占整个数据分析项目的60-70%时间务必耐心细致。建议保存原始数据和清洗后数据两个版本。3. 探索性数据分析(EDA)3.1 票房分布特征首先分析票房的基本分布情况import matplotlib.pyplot as plt import seaborn as sns plt.figure(figsize(12, 6)) sns.histplot(df[Worldwide Gross], bins30, kdeTrue) plt.title(Global Box Office Distribution) plt.xlabel(Box Office Revenue (in billions)) plt.ylabel(Number of Movies) plt.show()通过分布图可以发现全球票房呈现明显的右偏分布大多数电影集中在5亿美元以下少数超级大片拉高了整体水平。3.2 票房与评分关系分析IMDb评分与票房的关系plt.figure(figsize(10, 6)) sns.scatterplot(xIMDb Rating, yWorldwide Gross, datadf, alpha0.6) plt.title(Relationship between IMDb Rating and Box Office) plt.show()有趣的是评分与票房之间并没有明显的线性关系。一些高票房电影的评分中等而一些高评分电影的票房表现平平。3.3 导演与票房表现分析哪些导演的作品在TOP1000中出现最多top_directors df[Director].value_counts().head(10) plt.figure(figsize(12, 6)) sns.barplot(xtop_directors.values, ytop_directors.index) plt.title(Top 10 Directors by Number of Movies in Top 1000) plt.xlabel(Number of Movies) plt.show()史蒂文·斯皮尔伯格、克里斯托弗·诺兰等知名导演名列前茅。进一步分析这些导演作品的平均票房表现director_stats df.groupby(Director)[Worldwide Gross].agg([mean, count]).sort_values(mean, ascendingFalse) director_stats[director_stats[count] 5].head(10)4. 深入分析时间趋势与类型比较4.1 票房随时间的变化分析票房随时间的变化趋势df[Year] pd.to_datetime(df[Release Date]).dt.year yearly_stats df.groupby(Year)[Worldwide Gross].agg([mean, median, count]) plt.figure(figsize(14, 6)) plt.plot(yearly_stats.index, yearly_stats[mean], labelAverage) plt.plot(yearly_stats.index, yearly_stats[median], labelMedian) plt.title(Box Office Trends Over Time) plt.xlabel(Year) plt.ylabel(Box Office Revenue (in billions)) plt.legend() plt.show()结果显示电影票房的平均值和中位数都呈现上升趋势特别是2000年后增长明显但中位数增长幅度小于平均值说明头部电影的票房增长更为显著。4.2 电影类型分析分析不同电影类型的票房表现# 首先需要将Genre字段拆分为多个类型 df[Genres] df[Genre].str.split(, ) genre_exploded df.explode(Genres) genre_stats genre_exploded.groupby(Genres)[Worldwide Gross].agg([mean, median, count]).sort_values(mean, ascendingFalse) plt.figure(figsize(12, 8)) sns.barplot(xmean, ygenre_stats.index, datagenre_stats) plt.title(Average Box Office by Genre) plt.xlabel(Average Box Office Revenue (in billions)) plt.show()冒险、动作和科幻类电影的平均票房最高而纪录片和音乐类电影的平均票房较低。5. 投资回报率分析5.1 成本与票房关系分析制作成本与票房的关系df[Budget] df[Budget].str.replace($, ).str.replace(,, ).astype(float) df[ROI] (df[Worldwide Gross] - df[Budget]) / df[Budget] plt.figure(figsize(10, 6)) sns.scatterplot(xBudget, yWorldwide Gross, datadf, hueROI, palettecoolwarm, sizeROI) plt.title(Budget vs Box Office Revenue) plt.show()结果显示高预算电影通常能获得高票房但投资回报率(ROI)最高的往往是中等预算电影。5.2 最高ROI电影找出投资回报率最高的电影top_roi df.sort_values(ROI, ascendingFalse).head(10)[[Title, Year, Budget, Worldwide Gross, ROI]] print(top_roi)这些电影大多是小成本制作的恐怖片或独立电影如《灵动鬼影实录》等它们的制作成本极低但票房表现惊人。6. 高级分析多元回归模型6.1 构建预测模型尝试构建一个简单的票房预测模型from sklearn.linear_model import LinearRegression from sklearn.model_selection import train_test_split from sklearn.metrics import mean_squared_error, r2_score # 准备特征 features [Budget, Runtime, IMDb Rating, Year] X df[features] y df[Worldwide Gross] # 处理缺失值 X X.fillna(X.median()) y y.fillna(y.median()) # 划分训练测试集 X_train, X_test, y_train, y_test train_test_split(X, y, test_size0.2, random_state42) # 训练模型 model LinearRegression() model.fit(X_train, y_train) # 评估模型 y_pred model.predict(X_test) print(R-squared:, r2_score(y_test, y_pred)) print(RMSE:, mean_squared_error(y_test, y_pred, squaredFalse))6.2 模型结果解读初步模型结果显示预算(Budget)是最重要的预测因子其次是上映年份。IMDb评分和片长对票房的预测能力相对较弱。这印证了商业电影中大投入大产出的基本规律。7. 可视化仪表板7.1 使用Plotly创建交互可视化import plotly.express as px fig px.scatter(df, xBudget, yWorldwide Gross, colorROI, hover_data[Title, Director, Year], titleBudget vs Worldwide Gross with ROI) fig.show() fig px.treemap(df, path[Genres], valuesWorldwide Gross, titleBox Office Share by Genre) fig.show()7.2 使用Dash构建完整仪表板from dash import Dash, dcc, html, Input, Output import dash_bootstrap_components as dbc app Dash(__name__, external_stylesheets[dbc.themes.BOOTSTRAP]) app.layout html.Div([ html.H1(Top 1000 Movies Dashboard), dcc.Graph(idscatter-plot), dcc.Dropdown( idx-axis, options[{label: col, value: col} for col in [Budget, Runtime, IMDb Rating, Year]], valueBudget ) ]) app.callback( Output(scatter-plot, figure), Input(x-axis, value) ) def update_graph(x_axis): return px.scatter(df, xx_axis, yWorldwide Gross, hover_data[Title]) if __name__ __main__: app.run_server(debugTrue)8. 分析结论与商业洞察通过对全球票房TOP1000电影的分析我们得出以下主要结论预算与票房高预算电影通常能获得高票房但最高投资回报率往往来自中等预算电影类型趋势冒险、动作和科幻类电影的商业表现最佳时间趋势电影票房整体呈上升趋势特别是2000年后头部电影的票房增长显著评分与票房电影质量(IMDb评分)与票房之间没有强相关性导演影响少数顶级导演的作品在TOP1000中占据显著比例这些发现对电影投资和制作有以下启示大制作电影仍然是票房保障但需要平衡预算与预期回报类型选择对商业成功至关重要冒险/动作类更易获得高票房电影质量(评分)与商业成功(票房)是两个不同的维度需要分别考量9. 项目总结与经验分享完成这个数据分析项目后我总结了以下几点经验数据清洗是关键电影数据中存在各种格式不一致和缺失值问题需要投入大量时间进行清洗可视化先行在复杂分析前先通过可视化了解数据分布和基本关系业务理解很重要单纯的技术分析不够需要结合电影行业的背景知识解读数据模型不是万能的简单的线性模型已经能揭示主要规律不必过度追求复杂模型实用技巧处理电影数据时导演和演员字段经常包含多个值如合拍电影使用pandas的str.split()和explode()方法可以方便地进行拆分和分析。这个项目完整展示了从数据获取、清洗、探索分析到建模可视化的全流程涵盖了Python数据分析的核心技能。对于想学习数据分析的新手电影数据是一个既有趣又有挑战性的好选择。