数据分析实战2——MDB电影数据分析

1.电影类型随时间的变化

(1)数据处理与分析

import pandas as pd
import json

# 读取CSV文件到DataFrame
df = pd.read_csv("./tmdb_5000_movies.csv")

# 将genres列中的JSON字符串转换为Python对象
df['genres'] = df['genres'].apply(json.loads)

# 定义一个函数,从genres字段中获取流派列表
def get_genre_list(genres):
    return [genre['name'] for genre in genres]

# 应用get_genre_list函数创建新列genre_list
df['genre_list'] = df['genres'].apply(get_genre_list)

# 将release_date列转换为日期类型
df['release_date'] = pd.to_datetime(df['release_date'])

# 对genre_list进行展开操作,并按年份和流派分组统计数量
genre_time_series = df.explode('genre_list').groupby([df['release_date'].dt.year, 'genre_list']).size().unstack(fill_value=0)

# 显示生成的时间序列数据
genre_time_series

(2)可视化

import matplotlib.pyplot as plt
import numpy as np

plt.figure(figsize=(15, 8)) # 创建一个图形窗口,并指定大小为15x8

for genre in genre_time_series.columns: # 针对每个电影类型
    plt.plot(np.array(genre_time_series.index), np.array(genre_time_series[genre]), label=genre) # 绘制折线图,x轴为年份,y轴为该类型电影数量

plt.title('电影类型随时间的变化趋势') # 设置标题
plt.xlabel('年份') # 设置x轴标签
plt.ylabel('电影数量') # 设置y轴标签
plt.rcParams["font.sans-serif"] = ['SimHei'] # 设置中文显示
plt.rcParams["axes.unicode_minus"] = False # 解决保存图像时负号'-'显示为方块的问题
plt.legend() # 显示图例
plt.grid(True) # 显示网格线
plt.show() # 显示图形

2.电影产出最少的那些国家

(1)数据处理与分析

# 将字符串类型的 production_countries 列转换为 Python 对象
df['production_countries'] = df['production_countries'].apply(json.loads)

# 定义函数,从列表中提取 iso_3166_1 字段
def get_country_list(countries):
    return [country['iso_3166_1'] for country in countries]

# 对 production_countries 列应用 get_country_list 函数,得到新列 country_list
df['country_list'] = df['production_countries'].apply(get_country_list)

# 对 country_list 列进行拆分,计算每个国家/地区的电影数量,并按数量升序排序
country_production_counts = df.explode('country_list')['country_list'].value_counts(ascending=True)

# 显示前34个国家/地区的电影制作数量统计
country_production_counts.head(34)

3.电影类型和电影利润之间的关系

(1)数据处理与分析

# 计算利润列
df['profit'] = df['revenue'] - df['budget']

# 对 genre_list 列进行拆分,按电影类型分组,并计算每个类型的平均利润
average_profit_by_genre = df.explode('genre_list').groupby('genre_list')['profit'].mean()

average_profit_by_genre

(2)可视化

plt.figure(figsize=(12, 8)) # 创建一个图形窗口,并指定大小为12x8

average_profit_by_genre.plot(kind='bar') # 绘制柱状图,x轴为电影类型,y轴为平均利润

plt.title('不同类型电影的平均利润') # 设置标题
plt.xlabel('电影类型') # 设置x轴标签
plt.ylabel('平均利润(美元)') # 设置y轴标签
plt.xticks(rotation=45) # 旋转x轴标签,使其更易读

plt.show() # 显示图形

4.影响电影票房和评价的因素

(1)选取几个可能相关的特征:

factors = df[['budget', 'popularity', 'runtime', 'revenue', 'vote_average']] # 筛选需要计算相关性的列,存储在变量 factors 中

correlation_matrix = factors.corr() # 计算 factors 列之间的相关系数矩阵,存储在变量 correlation_matrix 中

correlation_matrix

import seaborn as sns # 引入 seaborn 库,用于绘制热力图

plt.figure(figsize=(10, 8)) # 创建一个图形窗口,并指定大小为10x8

sns.heatmap(correlation_matrix, annot=True, cmap='coolwarm', fmt=".2f") # 绘制相关性热力图,annot=True 表示在每个格子里显示数值,cmap='coolwarm' 表示使用冷暖色调,fmt=".2f" 表示保留小数点后两位

plt.title('电影票房和评价的相关性热力图') # 设置标题

plt.show() # 显示图形

(2)所有特征:

all_factors = list(df.select_dtypes(include=[int, float]).columns) # 选择包含数字类型的所有列,并将它们存储在 all_factors 变量中

correlation_with_revenue = df[all_factors].corrwith(df['revenue']).sort_values(ascending=False) # 计算每个因素与票房收入的相关性,并按降序排列,存储在变量 correlation_with_revenue 中

correlation_with_vote_average = df[all_factors].corrwith(df['vote_average']).sort_values(ascending=False) # 计算每个因素与电影评分的相关性,并按降序排列,存储在变量 correlation_with_vote_average 中

correlations = pd.DataFrame({'Revenue Correlation': correlation_with_revenue, 'Vote Average Correlation': correlation_with_vote_average}) # 创建一个 Pandas DataFrame,其中包含两个列:Revenue Correlation 和 Vote Average Correlation

plt.figure(figsize=(10, 15)) # 创建一个图形窗口,并指定大小为10x15

sns.heatmap(correlations, annot=True, cmap='coolwarm', fmt=".2f") # 绘制相关性热力图,annot=True 表示在每个格子里显示数值,cmap='coolwarm' 表示使用冷暖色调,fmt=".2f" 表示保留小数点后两位

plt.title('所有特征与票房和评价的相关性') # 设置标题

plt.show() # 显示图形

从以上数据分析,可以看出:

  1. 1.从图表中可以看出,各种电影类型的流行度随时间有显著变化。例如,动作和冒险电影在20世纪末和21世纪初的数量急剧上升,可能反映出观众偏好和行业趋势的变化。另一方面,如西部片的电影数量逐渐减少,可能说明这类电影的受欢迎程度下降,但是在进入21世纪之后,许多类型的电影出现了峰值并在峰值附近波动。
  2. 2.分析结果列出了电影产出最少的国家,电影产出最少的国家为34个,这些国家在数据集中仅有一部电影作品,包括肯尼亚(KE)、尼日利亚(NG)、巴哈马(BA)等等。这可能指示这些国家的电影产业不如其他国家发达,或者他们的电影较少在国际市场上流通。
  3. 3.柱状图清晰地显示了不同电影类型的平均利润差异。动作和冒险类电影平均利润较高,这可能由于这些类型的电影具有更大的受众基础和较高的市场需求。而外国电影和电视电影显示为负利润,这可能是因为这些类型的电影通常预算较低,或者在全球市场上的分销和收益较少。
  4. 4.相关性热力图展示了不同因素与电影票房和评价的相关性。预算和人气与票房收入有较强的正相关,表明这些因素可能是电影商业成功的重要指标。运行时间与票房和评价的相关性相对较低。票房和评价之间的相关性不强,表明一个商业上成功的电影不一定会获得高评价,这可能反映了商业成功和艺术评价之间的差异。

说明:

以下是tmdb_5000_movies.csv中每个列的含义介绍:

  1. budget:电影预算。
  2. genres:风格列表。
  3. homepage:URL。
  4. id:标识号。
  5. keywords:电影关键字。
  6. original_language:原版语言。
  7. original_title:原版电影名称。
  8. overview:电影摘要。
  9. popularity:在 Movie Database 上的查看次数。
  10. production_companies:电影制作公司。
  11. production_countries:电影制作国家。
  12. release_date:首映日期。
  13. revenue:电影收入。
  14. runtime:电影时长。
  15. status:上映状态。
  16. spoken_languages:发行语言。
  17. tagline:电影标语。
  18. title:发行电影名称。
  19. vote_count:评分次数。
  20. vote_average:平均评分。
  • 18
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值