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

📅 2026/7/26 15:12:26 👁️ 阅读次数 📝 编程学习
Python数据分析实战:全球票房TOP1000电影数据挖掘

1. 项目概述

这个数据分析项目源于我对电影行业数据的好奇。作为一名Python数据分析爱好者,我决定对全球票房TOP1000的电影数据进行深度挖掘。这个数据集包含了从20世纪50年代至今的票房冠军影片,涵盖了电影名称、上映年份、全球票房、制作成本、导演、主演、IMDb评分等关键字段。

选择这个主题主要基于三个考虑:首先,电影数据具有天然的趣味性和大众吸引力;其次,票房数据包含了丰富的时间序列和分类变量,适合练习各种数据分析技术;最后,通过分析可以揭示电影行业的商业规律和观众偏好变化。

2. 数据准备与清洗

2.1 数据来源与获取

我使用的数据集来自Kaggle上的"Top 1000 Highest Grossing Movies"数据集。这个数据集相对完整,但依然需要进行清洗和预处理。获取数据的方式有两种:

  1. 直接从Kaggle下载CSV文件
  2. 使用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', unzip=True)

2.2 数据清洗关键步骤

原始数据存在缺失值、格式不一致等问题,需要进行以下清洗:

  1. 处理缺失值:对数值型字段用中位数填充,分类字段用众数或"Unknown"填充
  2. 格式统一化:将票房和成本统一转换为同一货币单位(美元)和数值格式
  3. 异常值处理:识别并处理明显不合理的极端值
  4. 类型转换:将日期字段转换为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'], bins=30, kde=True) 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(x='IMDb Rating', y='Worldwide Gross', data=df, alpha=0.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(x=top_directors.values, y=top_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', ascending=False) 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'], label='Average') plt.plot(yearly_stats.index, yearly_stats['median'], label='Median') 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', ascending=False) plt.figure(figsize=(12, 8)) sns.barplot(x='mean', y=genre_stats.index, data=genre_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(x='Budget', y='Worldwide Gross', data=df, hue='ROI', palette='coolwarm', size='ROI') plt.title('Budget vs Box Office Revenue') plt.show()

结果显示,高预算电影通常能获得高票房,但投资回报率(ROI)最高的往往是中等预算电影。

5.2 最高ROI电影

找出投资回报率最高的电影:

top_roi = df.sort_values('ROI', ascending=False).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_size=0.2, random_state=42) # 训练模型 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, squared=False))

6.2 模型结果解读

初步模型结果显示,预算(Budget)是最重要的预测因子,其次是上映年份。IMDb评分和片长对票房的预测能力相对较弱。这印证了商业电影中"大投入大产出"的基本规律。

7. 可视化仪表板

7.1 使用Plotly创建交互可视化

import plotly.express as px fig = px.scatter(df, x='Budget', y='Worldwide Gross', color='ROI', hover_data=['Title', 'Director', 'Year'], title='Budget vs Worldwide Gross with ROI') fig.show() fig = px.treemap(df, path=['Genres'], values='Worldwide Gross', title='Box 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(id='scatter-plot'), dcc.Dropdown( id='x-axis', options=[{'label': col, 'value': col} for col in ['Budget', 'Runtime', 'IMDb Rating', 'Year']], value='Budget' ) ]) @app.callback( Output('scatter-plot', 'figure'), Input('x-axis', 'value') ) def update_graph(x_axis): return px.scatter(df, x=x_axis, y='Worldwide Gross', hover_data=['Title']) if __name__ == '__main__': app.run_server(debug=True)

8. 分析结论与商业洞察

通过对全球票房TOP1000电影的分析,我们得出以下主要结论:

  1. 预算与票房:高预算电影通常能获得高票房,但最高投资回报率往往来自中等预算电影
  2. 类型趋势:冒险、动作和科幻类电影的商业表现最佳
  3. 时间趋势:电影票房整体呈上升趋势,特别是2000年后头部电影的票房增长显著
  4. 评分与票房:电影质量(IMDb评分)与票房之间没有强相关性
  5. 导演影响:少数顶级导演的作品在TOP1000中占据显著比例

这些发现对电影投资和制作有以下启示:

  • 大制作电影仍然是票房保障,但需要平衡预算与预期回报
  • 类型选择对商业成功至关重要,冒险/动作类更易获得高票房
  • 电影质量(评分)与商业成功(票房)是两个不同的维度,需要分别考量

9. 项目总结与经验分享

完成这个数据分析项目后,我总结了以下几点经验:

  1. 数据清洗是关键:电影数据中存在各种格式不一致和缺失值问题,需要投入大量时间进行清洗
  2. 可视化先行:在复杂分析前,先通过可视化了解数据分布和基本关系
  3. 业务理解很重要:单纯的技术分析不够,需要结合电影行业的背景知识解读数据
  4. 模型不是万能的:简单的线性模型已经能揭示主要规律,不必过度追求复杂模型

实用技巧:处理电影数据时,导演和演员字段经常包含多个值(如合拍电影),使用pandas的str.split()和explode()方法可以方便地进行拆分和分析。

这个项目完整展示了从数据获取、清洗、探索分析到建模可视化的全流程,涵盖了Python数据分析的核心技能。对于想学习数据分析的新手,电影数据是一个既有趣又有挑战性的好选择。