郑州那里能设计网站,公司网站备案是什么意思,国外移动端网站模板,网页设计成片#x1f935;♂️ 个人主页#xff1a;艾派森的个人主页 ✍#x1f3fb;作者简介#xff1a;Python学习者 #x1f40b; 希望大家多多支持#xff0c;我们一起进步#xff01;#x1f604; 如果文章对你有帮助的话#xff0c; 欢迎评论 #x1f4ac;点赞#x1f4… ♂️ 个人主页艾派森的个人主页 ✍作者简介Python学习者 希望大家多多支持我们一起进步 如果文章对你有帮助的话 欢迎评论 点赞 收藏 加关注 喜欢大数据分析项目的小伙伴希望可以多多支持该系列的其他文章
大数据分析案例合集 大数据分析案例-基于随机森林算法预测人类预期寿命大数据分析案例-基于随机森林算法的商品评价情感分析大数据分析案例-用RFM模型对客户价值分析(聚类)大数据分析案例-对电信客户流失分析预警预测大数据分析案例-基于随机森林模型对北京房价进行预测大数据分析案例-基于RFM模型对电商客户价值分析大数据分析案例-基于逻辑回归算法构建垃圾邮件分类器模型大数据分析案例-基于决策树算法构建员工离职预测模型 大数据分析案例-基于KNN算法对茅台股票进行预测 大数据分析案例-基于多元线性回归算法构建广告投放收益模型大数据分析案例-基于随机森林算法构建返乡人群预测模型大数据分析案例-基于决策树算法构建金融反欺诈分类模型 目录
1.项目背景
2.项目简介
2.1项目说明
2.2数据说明
2.3技术工具
3.算法原理
4.项目实施步骤
4.1理解数据
4.2数据预处理
4.3探索性数据分析
4.4特征工程
4.5模型构建
4.6模型评估
5.实验总结
源代码 1.项目背景 电影票房预测一直是电影产业中的一个重要问题对于制片方、发行方和影院等利益相关者而言准确地预测电影票房可以帮助他们做出更明智的决策。在电影产业中投资决策、市场营销策略、排片安排等方面的决策都受到电影票房预测的影响。因此构建一种准确可靠的电影票房预测模型对于电影产业的发展具有重要意义。
研究背景主要包括以下几个方面 市场竞争激烈 电影市场竞争激烈每年推出大量新片。在这种竞争环境下能够提前了解一部电影可能取得的票房情况对于选择上映时机、进行市场宣传、确定投资规模等方面至关重要。 复杂多变的影响因素 影响电影票房的因素众多包括但不限于演员阵容、导演水平、电影类型、上映时间、市场宣传、观众口碑等。这些因素之间存在复杂的相互关系传统的分析方法难以全面考虑这些因素的综合影响。 数据科学的应用需求 随着数据科学和机器学习技术的发展利用大量的电影数据进行建模和预测成为可能。随机森林算法是一种集成学习方法具有高准确性和强大的泛化能力特别适用于处理大规模、高维度的数据因此成为构建电影票房预测模型的理想选择。
2.项目简介
2.1项目说明 本研究旨在利用随机森林算法构建一种高效的电影票房预测模型通过综合考虑各种影响因素提高预测准确性为电影产业相关方提供科学的决策依据。通过该研究可以更好地理解影响电影票房的关键因素为电影从业者提供更全面的市场分析和预测服务。
2.2数据说明 该数据集来源于kaggle该数据集包含1995年至2018年上映的电影类型统计数据原始数据集共有300条9个变量各变量含义解释如下
Genre电影的类别或类型。分类
Year电影发行的年份。数字
Movies Released 特定类型和年份发行的电影数量。数字
Gross该类型和年份的电影产生的总收入。数字
Tickets Sold该类型和年份的电影售出门票总数。数字
Inflation-Adjusted Gross考虑到货币价值随时间的变化根据通货膨胀进行调整的总收入。数字
Top Movie该类型和年份中票房最高的电影的标题。文本
Top Movie Gross (That Year)该类型和年份中票房最高的电影产生的总收入。数字
Top Movie Inflation-Adjusted Gross (That Year)根据该类型和年份的通货膨胀调整后票房最高的电影的总收入。数字
2.3技术工具
Python版本:3.9
代码编辑器jupyter notebook
3.算法原理 随机森林是一种有监督学习算法。就像它的名字一样它创建了一个森林并使它拥有某种方式随机性。所构建的“森林”是决策树的集成大部分时候都是用“bagging”方法训练的。bagging 方法即 bootstrapaggregating采用的是随机有放回的选择训练数据然后构造分类器最后组合学习到的模型来增加整体的效果。简而言之随机森林建立了多个决策树并将它们合并在一起以获得更准确和稳定的预测。其一大优势在于它既可用于分类也可用于回归问题这两类问题恰好构成了当前的大多数机器学习系统所需要面对的。 随机森林分类器使用所有的决策树分类器以及 bagging 分类器的超参数来控制整体结构。与其先构建 bagging分类器并将其传递给决策树分类器我们可以直接使用随机森林分类器类这样对于决策树而言更加方便和优化。要注意的是回归问题同样有一个随机森林回归器与之相对应。 随机森林算法中树的增长会给模型带来额外的随机性。与决策树不同的是每个节点被分割成最小化误差的最佳指标在随机森林中我们选择随机选择的指标来构建最佳分割。因此在随机森林中仅考虑用于分割节点的随机子集甚至可以通过在每个指标上使用随机阈值来使树更加随机而不是如正常的决策树一样搜索最佳阈值。这个过程产生了广泛的多样性通常可以得到更好的模型。
4.项目实施步骤
4.1理解数据
导入数据分析常用的第三方库并加载数据
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import plotly.express as px
import plotly.graph_objects as go
from plotly.subplots import make_subplots
import plotly.subplots as spdf pd.read_csv(movies_data.csv)
df.head() 查看数据大小 查看数据基本信息 查看数值型变量的描述性统计 查看非数值型变量的描述性统计 4.2数据预处理
统计缺失值情况 从结果来看不存在缺失值
检测是否存在重复值 结果为False说明不存在
4.3探索性数据分析
基于门票销售和发行数量的流行类型
# 基于门票销售和发行数量的流行类型
# 根据上映的电影数量找到受欢迎的类型
genre_movies_released df.groupby(Genre)[Movies Released].sum().sort_values(ascendingFalse)
print(Popular genres based on Movies Released:)
print(genre_movies_released.head())
# 根据售出的门票总数来查找受欢迎的类型
genre_tickets_sold df.groupby(Genre)[Tickets Sold].sum().sort_values(ascendingFalse)
print(\nPopular genres based on Tickets Sold:)
print(genre_tickets_sold.head())
fig, axes plt.subplots(2, 1, figsize(10, 8))
genre_movies_released.head().plot(kindbar, axaxes[0], colorskyblue)
axes[0].set_title(Top Genres by Movies Released)
axes[0].set_ylabel(Total Movies Released)
genre_tickets_sold.head().plot(kindbar, axaxes[1], colorlightcoral)
axes[1].set_title(Top Genres by Tickets Sold)
axes[1].set_ylabel(Total Tickets Sold)
plt.tight_layout()
plt.show() 类型和收益分析
# 类型和收益分析
genre_gross df.groupby(Genre)[Gross].sum().sort_values(ascendingFalse).head()
genre_inflation_adjusted_gross df.groupby(Genre)[Inflation-Adjusted Gross].sum().sort_values(ascendingFalse).head()
genre_top_movie_gross df.groupby(Genre)[Top Movie Gross (That Year)].max().sort_values(ascendingFalse).head()
fig make_subplots(rows3, cols1, subplot_titles[Top Genres by Gross Revenue, Top Genres by Inflation-Adjusted Gross Revenue, Top Genres by Top Movie Gross (That Year)])
fig.add_trace(go.Bar(xgenre_gross.index, ygenre_gross.values, nameGross Revenue, marker_colorskyblue), row1, col1)
fig.add_trace(go.Bar(xgenre_inflation_adjusted_gross.index, ygenre_inflation_adjusted_gross.values, nameInflation-Adjusted Gross Revenue, marker_colorlightcoral), row2, col1)
fig.add_trace(go.Bar(xgenre_top_movie_gross.index, ygenre_top_movie_gross.values, nameTop Movie Gross (That Year), marker_colorlightgreen), row3, col1)
fig.update_layout(height900, showlegendFalse, title_textFinancial Success of Genres)
fig.update_xaxes(title_textGenres, row3, col1)
fig.update_yaxes(title_textTotal Gross Revenue, row1, col1)
fig.update_yaxes(title_textTotal Inflation-Adjusted Gross Revenue, row2, col1)
fig.update_yaxes(title_textTop Movie Gross (That Year), row3, col1)
fig.show() 多年来的类型趋势和分析
# 多年来的类型趋势和分析
selected_genres [Action, Comedy, Drama, Adventure]
filtered_df df[df[Genre].isin(selected_genres)]
fig px.line(filtered_df, xYear, yMovies Released, colorGenre,titleMovie Releases Over Time for Selected Genres,labels{Movies Released: Number of Movies Released},line_shapelinear)
fig.show()# 为不同年份的总收入创建一个交互式折线图
fig px.line(filtered_df, xYear, yGross, colorGenre,titleGross Revenue Over Time for Selected Genres,labels{Gross: Total Gross Revenue},line_shapelinear)
fig.show() 一段时间内选定类型中票房最高的电影
# 一段时间内选定类型中票房最高的电影
selected_genres [Action, Comedy, Drama, Adventure]
filtered_df df[df[Genre].isin(selected_genres)]
# 创建一个交互式条形图来显示每种类型和年份中票房最高的电影
fig px.bar(filtered_df, xYear, yTop Movie Gross (That Year), colorGenre,titleHighest-Grossing Movies in Selected Genres Over Time,labels{Top Movie Gross (That Year): Gross Revenue},textTop Movie, height500)
fig.update_traces(textpositionoutside)
fig.show() 多年来的类型分布
# 多年来的类型分布
# 多年来类型分布的堆叠区域图
fig px.area(df, xYear, yMovies Released, colorGenre,titleGenre Distribution Over the Years,labels{Movies Released: Number of Movies Released},height500)
fig.show() 受众参与分析
# 受众参与分析
# 观众参与的散点图
fig px.scatter(df, xTickets Sold, yGross, colorGenre,titleAudience Engagement by Genre,labels{Tickets Sold: Number of Tickets Sold, Gross: Total Gross Revenue},height500)
fig.show() 历年最佳电影表现
# 历年最佳电影表现
# 随时间变化的顶级电影表现的折线图
fig px.line(df, xYear, yTop Movie Gross (That Year), colorGenre,titleTop Movie Performance Over Time,labels{Top Movie Gross (That Year): Gross Revenue},height500)
fig.show() 按类型划分的每部电影平均收入
# 按类型划分的每部电影平均收入
# 按类型计算每部电影的平均收入
df[Average Revenue per Movie] df[Gross] / df[Movies Released]
# 按类型划分的每部电影平均收入柱状图
fig px.bar(df, xGenre, yAverage Revenue per Movie,titleAverage Revenue per Movie by Genre,labels{Average Revenue per Movie: Average Revenue per Movie},height500)
fig.show() 不同类型的门票销售和发行
# 不同类型的门票销售和发行
fig px.violin(df, xGenre, yTickets Sold,titleGenre-wise Ticket Sales Distribution,labels{Tickets Sold: Number of Tickets Sold},height500)
fig.show() 通货膨胀调整后总收益的类型趋势
# 通货膨胀调整后总收益的类型趋势
fig px.line(df, xYear, yInflation-Adjusted Gross, colorGenre,titleGenre Trends in Inflation-Adjusted Gross Revenue,labels{Inflation-Adjusted Gross: Inflation-Adjusted Gross Revenue},height500)
fig.show() 每个类型和收入的顶级电影
# 每个类型和收入的顶级电影
unique_top_movies_count df.groupby(Genre)[Top Movie].nunique().sort_values(ascendingFalse)
top_movies_gross df.groupby(Top Movie)[Top Movie Gross (That Year)].max().sort_values(ascendingFalse).head(10)
fig sp.make_subplots(rows3, cols1, subplot_titles[Count of Unique Top Movies per Genre, Top Movies with the Highest Gross Revenue, Distribution of Gross Revenue for Top Movies])
fig.add_trace(go.Bar(xunique_top_movies_count.index, yunique_top_movies_count.values),row1, col1)
fig.add_trace(go.Bar(xtop_movies_gross.index, ytop_movies_gross.values),row2, col1)
fig.add_trace(go.Box(xdf[Top Movie], ydf[Top Movie Gross (That Year)]),row3, col1)
fig.update_layout(height1000, showlegendFalse, title_textTop Movie Analysis)
fig.show() 4.4特征工程
导入第三方库并准备建模需要的数据
from sklearn.model_selection import KFold, cross_val_predict
from sklearn.ensemble import RandomForestRegressor
from sklearn.preprocessing import OneHotEncoder
from sklearn.compose import ColumnTransformer
from sklearn.pipeline import Pipeline
from sklearn.metrics import mean_squared_error
dff df.copy()
categorical_features [Genre] # 假设“类型”是一个分类变量
numerical_features [Year, Movies Released]
target_variable Tickets Sold# 筛选DataFrame以仅包含相关列
data df[[Year, Movies Released, Genre, Tickets Sold, Gross]]# 将数据拆分为特征和目标变量
X data[[Year, Movies Released, Genre, Gross]]
y data[target_variable]
4.5模型构建
初始化模型创建管道
# 定义分类编码的预处理器
preprocessor ColumnTransformer(transformers[(cat, OneHotEncoder(), categorical_features),],remainderpassthrough
)# 初始化随机森林回归模型
model RandomForestRegressor(n_estimators100, random_state42)# 创建带有预处理和模型的管道
pipeline Pipeline([(preprocessor, preprocessor),(model, model)
])
交叉验证
# 初始化KFold以进行交叉验证
kf KFold(n_splits5, shuffleTrue, random_state42)
# 进行k-fold交叉验证并进行预测
predictions cross_val_predict(pipeline, X, y, cvkf)
# 评估模型性能
mse mean_squared_error(y, predictions)
print(fMean Squared Error: {mse}) 4.6模型评估
# 可视化实际值和预测值
plt.scatter(y, predictions)
plt.xlabel(Actual Tickets Sold)
plt.ylabel(Predicted Tickets Sold)
plt.title(Actual vs. Predicted Tickets Sold)
plt.show() 5.实验总结 本实验通过对电影数据进行数据可视化、特征工程、建模分析使用随机森林算法构建预测模型。总的来说基于随机森林算法构建的电影票房预测模型为电影产业提供了一种强大的工具。然而对于实际应用还需要综合考虑业务背景、市场趋势等因素将模型预测结果与实际情况相结合形成更全面的决策依据。
心得与体会
通过这次Python项目实战我学到了许多新的知识这是一个让我把书本上的理论知识运用于实践中的好机会。原先学的时候感叹学的资料太难懂此刻想来有些其实并不难关键在于理解。
在这次实战中还锻炼了我其他方面的潜力提高了我的综合素质。首先它锻炼了我做项目的潜力提高了独立思考问题、自我动手操作的潜力在工作的过程中复习了以前学习过的知识并掌握了一些应用知识的技巧等
在此次实战中我还学会了下面几点工作学习心态
1继续学习不断提升理论涵养。在信息时代学习是不断地汲取新信息获得事业进步的动力。作为一名青年学子更就应把学习作为持续工作用心性的重要途径。走上工作岗位后我会用心响应单位号召结合工作实际不断学习理论、业务知识和社会知识用先进的理论武装头脑用精良的业务知识提升潜力以广博的社会知识拓展视野。
2努力实践自觉进行主角转化。只有将理论付诸于实践才能实现理论自身的价值也只有将理论付诸于实践才能使理论得以检验。同样一个人的价值也是透过实践活动来实现的也只有透过实践才能锻炼人的品质彰显人的意志。
3提高工作用心性和主动性。实习是开端也是结束。展此刻自我面前的是一片任自我驰骋的沃土也分明感受到了沉甸甸的职责。在今后的工作和生活中我将继续学习深入实践不断提升自我努力创造业绩继续创造更多的价值。
这次Python实战不仅仅使我学到了知识丰富了经验。也帮忙我缩小了实践和理论的差距。在未来的工作中我会把学到的理论知识和实践经验不断的应用到实际工作中为实现理想而努力。
源代码
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import plotly.express as px
import plotly.graph_objects as go
from plotly.subplots import make_subplots
import plotly.subplots as spdf pd.read_csv(movies_data.csv)
df.head()
df.shape
df.info()
df.describe()
df.describe(includeO)
df.isnull().sum()
any(df.duplicated())
# 基于门票销售和发行数量的流行类型
# 根据上映的电影数量找到受欢迎的类型
genre_movies_released df.groupby(Genre)[Movies Released].sum().sort_values(ascendingFalse)
print(Popular genres based on Movies Released:)
print(genre_movies_released.head())
# 根据售出的门票总数来查找受欢迎的类型
genre_tickets_sold df.groupby(Genre)[Tickets Sold].sum().sort_values(ascendingFalse)
print(\nPopular genres based on Tickets Sold:)
print(genre_tickets_sold.head())
fig, axes plt.subplots(2, 1, figsize(10, 8))
genre_movies_released.head().plot(kindbar, axaxes[0], colorskyblue)
axes[0].set_title(Top Genres by Movies Released)
axes[0].set_ylabel(Total Movies Released)
genre_tickets_sold.head().plot(kindbar, axaxes[1], colorlightcoral)
axes[1].set_title(Top Genres by Tickets Sold)
axes[1].set_ylabel(Total Tickets Sold)
plt.tight_layout()
plt.show()
# 类型和收益分析
genre_gross df.groupby(Genre)[Gross].sum().sort_values(ascendingFalse).head()
genre_inflation_adjusted_gross df.groupby(Genre)[Inflation-Adjusted Gross].sum().sort_values(ascendingFalse).head()
genre_top_movie_gross df.groupby(Genre)[Top Movie Gross (That Year)].max().sort_values(ascendingFalse).head()
fig make_subplots(rows3, cols1, subplot_titles[Top Genres by Gross Revenue, Top Genres by Inflation-Adjusted Gross Revenue, Top Genres by Top Movie Gross (That Year)])
fig.add_trace(go.Bar(xgenre_gross.index, ygenre_gross.values, nameGross Revenue, marker_colorskyblue), row1, col1)
fig.add_trace(go.Bar(xgenre_inflation_adjusted_gross.index, ygenre_inflation_adjusted_gross.values, nameInflation-Adjusted Gross Revenue, marker_colorlightcoral), row2, col1)
fig.add_trace(go.Bar(xgenre_top_movie_gross.index, ygenre_top_movie_gross.values, nameTop Movie Gross (That Year), marker_colorlightgreen), row3, col1)
fig.update_layout(height900, showlegendFalse, title_textFinancial Success of Genres)
fig.update_xaxes(title_textGenres, row3, col1)
fig.update_yaxes(title_textTotal Gross Revenue, row1, col1)
fig.update_yaxes(title_textTotal Inflation-Adjusted Gross Revenue, row2, col1)
fig.update_yaxes(title_textTop Movie Gross (That Year), row3, col1)
fig.show()
# 多年来的类型趋势和分析
selected_genres [Action, Comedy, Drama, Adventure]
filtered_df df[df[Genre].isin(selected_genres)]
fig px.line(filtered_df, xYear, yMovies Released, colorGenre,titleMovie Releases Over Time for Selected Genres,labels{Movies Released: Number of Movies Released},line_shapelinear)
fig.show()# 为不同年份的总收入创建一个交互式折线图
fig px.line(filtered_df, xYear, yGross, colorGenre,titleGross Revenue Over Time for Selected Genres,labels{Gross: Total Gross Revenue},line_shapelinear)
fig.show()
# 一段时间内选定类型中票房最高的电影
selected_genres [Action, Comedy, Drama, Adventure]
filtered_df df[df[Genre].isin(selected_genres)]
# 创建一个交互式条形图来显示每种类型和年份中票房最高的电影
fig px.bar(filtered_df, xYear, yTop Movie Gross (That Year), colorGenre,titleHighest-Grossing Movies in Selected Genres Over Time,labels{Top Movie Gross (That Year): Gross Revenue},textTop Movie, height500)
fig.update_traces(textpositionoutside)
fig.show()
# 多年来的类型分布
# 多年来类型分布的堆叠区域图
fig px.area(df, xYear, yMovies Released, colorGenre,titleGenre Distribution Over the Years,labels{Movies Released: Number of Movies Released},height500)
fig.show()
# 受众参与分析
# 观众参与的散点图
fig px.scatter(df, xTickets Sold, yGross, colorGenre,titleAudience Engagement by Genre,labels{Tickets Sold: Number of Tickets Sold, Gross: Total Gross Revenue},height500)
fig.show()
# 历年最佳电影表现
# 随时间变化的顶级电影表现的折线图
fig px.line(df, xYear, yTop Movie Gross (That Year), colorGenre,titleTop Movie Performance Over Time,labels{Top Movie Gross (That Year): Gross Revenue},height500)
fig.show()
# 按类型划分的每部电影平均收入
# 按类型计算每部电影的平均收入
df[Average Revenue per Movie] df[Gross] / df[Movies Released]
# 按类型划分的每部电影平均收入柱状图
fig px.bar(df, xGenre, yAverage Revenue per Movie,titleAverage Revenue per Movie by Genre,labels{Average Revenue per Movie: Average Revenue per Movie},height500)
fig.show()
# 不同类型的门票销售和发行
fig px.violin(df, xGenre, yTickets Sold,titleGenre-wise Ticket Sales Distribution,labels{Tickets Sold: Number of Tickets Sold},height500)
fig.show()
# 通货膨胀调整后总收益的类型趋势
fig px.line(df, xYear, yInflation-Adjusted Gross, colorGenre,titleGenre Trends in Inflation-Adjusted Gross Revenue,labels{Inflation-Adjusted Gross: Inflation-Adjusted Gross Revenue},height500)
fig.show()
# 每个类型和收入的顶级电影
unique_top_movies_count df.groupby(Genre)[Top Movie].nunique().sort_values(ascendingFalse)
top_movies_gross df.groupby(Top Movie)[Top Movie Gross (That Year)].max().sort_values(ascendingFalse).head(10)
fig sp.make_subplots(rows3, cols1, subplot_titles[Count of Unique Top Movies per Genre, Top Movies with the Highest Gross Revenue, Distribution of Gross Revenue for Top Movies])
fig.add_trace(go.Bar(xunique_top_movies_count.index, yunique_top_movies_count.values),row1, col1)
fig.add_trace(go.Bar(xtop_movies_gross.index, ytop_movies_gross.values),row2, col1)
fig.add_trace(go.Box(xdf[Top Movie], ydf[Top Movie Gross (That Year)]),row3, col1)
fig.update_layout(height1000, showlegendFalse, title_textTop Movie Analysis)
fig.show()
from sklearn.model_selection import KFold, cross_val_predict
from sklearn.ensemble import RandomForestRegressor
from sklearn.preprocessing import OneHotEncoder
from sklearn.compose import ColumnTransformer
from sklearn.pipeline import Pipeline
from sklearn.metrics import mean_squared_error
dff df.copy()
categorical_features [Genre] # 假设“类型”是一个分类变量
numerical_features [Year, Movies Released]
target_variable Tickets Sold# 筛选DataFrame以仅包含相关列
data df[[Year, Movies Released, Genre, Tickets Sold, Gross]]# 将数据拆分为特征和目标变量
X data[[Year, Movies Released, Genre, Gross]]
y data[target_variable]
# 定义分类编码的预处理器
preprocessor ColumnTransformer(transformers[(cat, OneHotEncoder(), categorical_features),],remainderpassthrough
)# 初始化随机森林回归模型
model RandomForestRegressor(n_estimators100, random_state42)# 创建带有预处理和模型的管道
pipeline Pipeline([(preprocessor, preprocessor),(model, model)
])
# 初始化KFold以进行交叉验证
kf KFold(n_splits5, shuffleTrue, random_state42)
# 进行k-fold交叉验证并进行预测
predictions cross_val_predict(pipeline, X, y, cvkf)
# 评估模型性能
mse mean_squared_error(y, predictions)
print(fMean Squared Error: {mse})
# 可视化实际值和预测值
plt.scatter(y, predictions)
plt.xlabel(Actual Tickets Sold)
plt.ylabel(Predicted Tickets Sold)
plt.title(Actual vs. Predicted Tickets Sold)
plt.show()