数据分析案例源码级教程:TMDB-TOP100电影数据统计分析

1 项目需求

  • 需求 1:统计 TOP300 的电影中,每一年上映的电影数量的变化。(折线图)
  • 需求 2:统计对比不同语言电影数量。(柱状图)
  • 需求 3:统计对比不同类型电影数量。(柱状图)
  • 需求 4:统计对比各个电影评分的比例。(饼状图)

2 项目流程

  • 准备工作:导入依赖库、配置运行时参数、创建子图完成基本布局、加载数据
  • 统计 TOP100 的电影中,每一年上映的电影数量的变化(折线图)
  • 统计对比不同语言电影数量(柱状图)
  • 统计对比不同类型电影数量(柱状图)
  • 统计对比各个电影评分的比例(饼状图)

2.1 准备工作

导入依赖库、配置运行时参数、创建子图完成基本布局、加载数据.

相关代码操作如下:

复制代码
from matplotlib.axes import Axes
import pandas as pd
import matplotlib.pyplot as plt

#展示中文
plt.rcParams['font.sans-serif'] = ['SimHei']

#创建子图
fig,ax = plt.subplots(nrows=2, ncols=2, figsize=(20, 12), dpi=100)
fig.suptitle('TMDB-TOP100电影榜单数据统计', x=0.5, y=0.95, fontsize=23) #添加画布标题 x:X轴位置;y:Y轴位置

#获取子图
ax1: Axes = ax[0,0]
ax2: Axes = ax[0,1]
ax3: Axes = ax[1,0]
ax4: Axes = ax[1,1]

#加载数据
data = pd.read_csv('../Data/movie_list3.csv', usecols=['电影名', '年份', '上映时间', '类型', '时长', '评分', '语言'], dtype={'年份': 'Int64'})
data

输出结果如下:

2.2 统计 TOP100 的电影中,每一年上映的电影数量的变化

相关操作代码如下:

复制代码
from matplotlib.axes import Axes
import pandas as pd
import matplotlib.pyplot as plt

#展示中文
plt.rcParams['font.sans-serif'] = ['SimHei']

#创建子图
fig,ax = plt.subplots(nrows=2, ncols=2, figsize=(20, 12), dpi=100)
fig.suptitle('TMDB-TOP100电影榜单数据统计', x=0.5, y=0.95, fontsize=23) #添加画布标题 x:X轴位置;y:Y轴位置

#获取子图
ax1: Axes = ax[0,0]
ax2: Axes = ax[0,1]
ax3: Axes = ax[1,0]
ax4: Axes = ax[1,1]

#加载数据
data = pd.read_csv('../Data/movie_list3.csv', usecols=['电影名', '年份', '上映时间', '类型', '时长', '评分', '语言'])

#1.统计TOP100电影中每一年上映的电影数量的变化

#1.1 缺失值,异常值查询与处理
data.isnull().sum()   #查询缺失值
data[data['年份']>2027] #查询异常值

#1.2 分组统计
year_count = data.groupby('年份')['年份'].count()

#1.3 组装数据
#x轴数据
min_year = year_count.index.min()
max_year = year_count.index.max()
x = [i for i in range(min_year, max_year+1)]

#y轴数据
y = [int(year_count.get(i, 0)) for i in x] #get(i,0):获取i对应的值,如果不存在则返回0

#1.4 绘制折线图
ax1.plot(x, y, color='g')
ax1.set_title('TOP100电影中每一年上映的电影数量的变化', fontsize=18)
ax1.set_xlabel('年份', fontsize=12)
ax1.set_ylabel('电影数量', fontsize=12)
ax1.set_xticks(x[::5]) #设置x轴刻度
y_ticks = [i for i in range(0,10,2)]
ax1.set_yticks(y_ticks) #设置y轴刻度
ax1.grid(linestyle='--', alpha=0.5) #添加网格线

最终输出结果如下:

2.3 统计对比不同语言电影数量

相关操作代码如下:

复制代码
from matplotlib.axes import Axes
import pandas as pd
import matplotlib.pyplot as plt

#展示中文
plt.rcParams['font.sans-serif'] = ['SimHei']

#创建子图
fig,ax = plt.subplots(nrows=2, ncols=2, figsize=(20, 12), dpi=100)
fig.subplots_adjust(hspace=0.3, wspace=0.2) #调整子图间距,hspace:控制垂直间距;wspace:控制水平间距
fig.suptitle('TMDB-TOP100电影榜单数据统计', x=0.5, y=0.95, fontsize=23) #添加画布标题 x:X轴位置;y:Y轴位置

#获取子图
ax1: Axes = ax[0,0]
ax2: Axes = ax[0,1]
ax3: Axes = ax[1,0]
ax4: Axes = ax[1,1]

#加载数据
data = pd.read_csv('../Data/movie_list3.csv', usecols=['电影名', '年份', '上映时间', '类型', '时长', '评分', '语言'])

#1.统计TOP100电影中每一年上映的电影数量的变化(折线图)

#1.1 缺失值,异常值查询与处理
data.isnull().sum()   #查询缺失值
data[data['年份']>2027] #查询异常值

#1.2 分组统计
year_count = data.groupby('年份')['年份'].count()

#1.3 组装数据
#x轴数据
min_year = year_count.index.min()
max_year = year_count.index.max()
x = [i for i in range(min_year, max_year+1)]

#y轴数据
y = [int(year_count.get(i, 0)) for i in x] #get(i,0):获取i对应的值,如果不存在则返回0

#1.4 绘制折线图
ax1.plot(x, y, color='g')
ax1.set_title('TOP100电影中每一年上映的电影数量的变化', fontsize=18)
ax1.set_xlabel('年份', fontsize=12)
ax1.set_ylabel('电影数量', fontsize=12)
ax1.set_xticks(x[::5]) #设置x轴刻度
y_ticks = [i for i in range(0,10,2)]
ax1.set_yticks(y_ticks) #设置y轴刻度
ax1.grid(linestyle='--', alpha=0.5) #添加网格线

#2.不同语言电影数量统计(柱状图)

#2.1 获取不同语言对应的电影数量
language_count = data.groupby('语言')['语言'].count().sort_values(ascending=False)

#2.2 组装数据
x = language_count.index.tolist()
y = language_count.values.tolist()

#2.3 绘制柱状图
ax2.bar(x, y, color='g', width=0.6)
ax2.set_title('不同语言电影数量统计', fontsize=18) #添加子图标题
ax2.set_xlabel('语言', fontsize=12) #添加x轴标签
ax2.set_ylabel('电影数量', fontsize=12) #添加y轴标签
ax2.grid(linestyle='--', alpha=0.5) #添加网格线

ax2.tick_params(axis='x', rotation=45) #旋转x轴刻度标签

最终输出结果如下:

2.4 统计对比不同类型电影数量

相关操作代码如下:

复制代码
from matplotlib.axes import Axes
import pandas as pd
import matplotlib.pyplot as plt

#展示中文
plt.rcParams['font.sans-serif'] = ['SimHei']

#创建子图
fig,ax = plt.subplots(nrows=2, ncols=2, figsize=(20, 12), dpi=100)
fig.subplots_adjust(hspace=0.3, wspace=0.2) #调整子图间距,hspace:控制垂直间距;wspace:控制水平间距
fig.suptitle('TMDB-TOP100电影榜单数据统计', x=0.5, y=0.95, fontsize=23) #添加画布标题 x:X轴位置;y:Y轴位置

#获取子图
ax1: Axes = ax[0,0]
ax2: Axes = ax[0,1]
ax3: Axes = ax[1,0]
ax4: Axes = ax[1,1]

#加载数据
data = pd.read_csv('../Data/movie_list3.csv', usecols=['电影名', '年份', '上映时间', '类型', '时长', '评分', '语言'])

#1.统计TOP100电影中每一年上映的电影数量的变化(折线图)

#1.1 缺失值,异常值查询与处理
data.isnull().sum()   #查询缺失值
data[data['年份']>2027] #查询异常值

#1.2 分组统计
year_count = data.groupby('年份')['年份'].count()

#1.3 组装数据
#x轴数据
min_year = year_count.index.min()
max_year = year_count.index.max()
x = [i for i in range(min_year, max_year+1)]

#y轴数据
y = [int(year_count.get(i, 0)) for i in x] #get(i,0):获取i对应的值,如果不存在则返回0

#1.4 绘制折线图
ax1.plot(x, y, color='g')
ax1.set_title('TOP100电影中每一年上映的电影数量的变化', fontsize=18)
ax1.set_xlabel('年份', fontsize=12)
ax1.set_ylabel('电影数量', fontsize=12)
ax1.set_xticks(x[::5]) #设置x轴刻度
y_ticks = [i for i in range(0,10,2)]
ax1.set_yticks(y_ticks) #设置y轴刻度
ax1.grid(linestyle='--', alpha=0.5) #添加网格线

#2.不同语言电影数量统计(柱状图)

#2.1 获取不同语言对应的电影数量
language_count = data.groupby('语言')['语言'].count().sort_values(ascending=False)

#2.2 组装数据
x = language_count.index.tolist()
y = language_count.values.tolist()

#2.3 绘制柱状图
ax2.bar(x, y, color='g', width=0.6)
ax2.set_title('不同语言电影数量统计', fontsize=18) #添加子图标题
ax2.set_xlabel('语言', fontsize=12) #添加x轴标签
ax2.set_ylabel('电影数量', fontsize=12) #添加y轴标签
ax2.grid(linestyle='--', alpha=0.5) #添加网格线
ax2.tick_params(axis='x', rotation=45) #旋转x轴刻度标签

#3.统计对比不同类型电影数量(柱状图)

#3.1 获取不同类型对应的电影数量
type_count = {} #{'类型1':数量, '类型2':数量, ...}
for types in data['类型'].str.split(','):
    for type in types:
        if type in type_count:
            type_count[type] += 1
        else:
            type_count[type] = 1

#3.2 组装数据
x = list(type_count.keys())
y = list(type_count.values())

#3.3 绘制柱状图
ax3.bar(x, y, color='g', width=0.8)
ax3.set_title('不同类型电影数量统计', fontsize=18)
ax3.set_xlabel('类型', fontsize=12)
ax3.set_ylabel('电影数量', fontsize=12)
ax3.grid(linestyle='--', alpha=0.5)

最终输出结果如下:

2.5 统计对比各个电影评分的比例

相关操作代码如下:

复制代码
from matplotlib.axes import Axes
import pandas as pd
import matplotlib.pyplot as plt

#展示中文
plt.rcParams['font.sans-serif'] = ['SimHei']

#创建子图
fig,ax = plt.subplots(nrows=2, ncols=2, figsize=(20, 12), dpi=100)
fig.subplots_adjust(hspace=0.4, wspace=0.2) #调整子图间距,hspace:控制垂直间距;wspace:控制水平间距
fig.suptitle('TMDB-TOP100电影榜单数据统计', x=0.5, y=0.95, fontsize=23) #添加画布标题 x:X轴位置;y:Y轴位置

#获取子图
ax1: Axes = ax[0,0]
ax2: Axes = ax[0,1]
ax3: Axes = ax[1,0]
ax4: Axes = ax[1,1]

#加载数据
data = pd.read_csv('../Data/movie_list3.csv', usecols=['电影名', '年份', '上映时间', '类型', '时长', '评分', '语言'])

#1.统计TOP100电影中每一年上映的电影数量的变化(折线图)

#1.1 缺失值,异常值查询与处理
data.isnull().sum()   #查询缺失值
data[data['年份']>2027] #查询异常值

#1.2 分组统计
year_count = data.groupby('年份')['年份'].count()

#1.3 组装数据
#x轴数据
min_year = year_count.index.min()
max_year = year_count.index.max()
x = [i for i in range(min_year, max_year+1)]

#y轴数据
y = [int(year_count.get(i, 0)) for i in x] #get(i,0):获取i对应的值,如果不存在则返回0

#1.4 绘制折线图
ax1.plot(x, y, color='g')
ax1.set_title('TOP100电影中每一年上映的电影数量的变化', fontsize=18)
ax1.set_xlabel('年份', fontsize=12)
ax1.set_ylabel('电影数量', fontsize=12)
ax1.set_xticks(x[::5]) #设置x轴刻度
y_ticks = [i for i in range(0,10,2)]
ax1.set_yticks(y_ticks) #设置y轴刻度
ax1.grid(linestyle='--', alpha=0.5) #添加网格线

#2.不同语言电影数量统计(柱状图)

#2.1 获取不同语言对应的电影数量
language_count = data.groupby('语言')['语言'].count().sort_values(ascending=False)

#2.2 组装数据
x = language_count.index.tolist()
y = language_count.values.tolist()

#2.3 绘制柱状图
ax2.bar(x, y, color='g', width=0.6)
ax2.set_title('不同语言电影数量统计', fontsize=18) #添加子图标题
ax2.set_xlabel('语言', fontsize=12) #添加x轴标签
ax2.set_ylabel('电影数量', fontsize=12) #添加y轴标签
ax2.grid(linestyle='--', alpha=0.5) #添加网格线
ax2.tick_params(axis='x', rotation=45) #旋转x轴刻度标签

#3.统计对比不同类型电影数量(柱状图)

#3.1 获取不同类型对应的电影数量
type_count = {} #{'类型1':数量, '类型2':数量, ...}
for types in data['类型'].str.split(','):
    for type in types:
        if type in type_count:
            type_count[type] += 1
        else:
            type_count[type] = 1

#3.2 组装数据
x = list(type_count.keys())
y = list(type_count.values())

#3.3 绘制柱状图
ax3.bar(x, y, color='g', width=0.8)
ax3.set_title('不同类型电影数量统计', fontsize=18)
ax3.set_xlabel('类型', fontsize=12)
ax3.set_ylabel('电影数量', fontsize=12)
ax3.grid(linestyle='--', alpha=0.5)

#4.统计不同评分电影数量占比

#4.1 获取不同评分对应的电影数量
rating_count = data.groupby('评分')['评分'].count()

#4.2 组装数据
ratings = rating_count.index.tolist() #评分列表
rating_values = rating_count.values.tolist()

#4.2 绘制饼状图
ax4.pie(rating_values, labels=ratings, autopct='%1.2f%%', startangle=90) #startangle:起始角度
ax4.set_title('不同评分电影数量占比', fontsize=18) #添加子图标题
ax4.legend(loc='lower center', ncol=4, fontsize=10, bbox_to_anchor=(0.5, -0.1))

最终输出结果如下:

3 饼状图优化

由最终输出结果可以直观看出第 4 张饼状图部分数据展示过于密集而造成展示不清晰,本节将对该问题进行优化。

核心思路是:将小数据(比例小于5%)进行合并

复制代码
from matplotlib.axes import Axes
import pandas as pd
import matplotlib.pyplot as plt

#展示中文
plt.rcParams['font.sans-serif'] = ['SimHei']

#创建子图
fig,ax = plt.subplots(nrows=2, ncols=2, figsize=(20, 12), dpi=100)
fig.subplots_adjust(hspace=0.4, wspace=0.2) #调整子图间距,hspace:控制垂直间距;wspace:控制水平间距
fig.suptitle('TMDB-TOP100电影榜单数据统计', x=0.5, y=0.95, fontsize=23) #添加画布标题 x:X轴位置;y:Y轴位置

#获取子图
ax1: Axes = ax[0,0]
ax2: Axes = ax[0,1]
ax3: Axes = ax[1,0]
ax4: Axes = ax[1,1]

#加载数据
data = pd.read_csv('../Data/movie_list3.csv', usecols=['电影名', '年份', '上映时间', '类型', '时长', '评分', '语言'])

#1.统计TOP100电影中每一年上映的电影数量的变化(折线图)

#1.1 缺失值,异常值查询与处理
data.isnull().sum()   #查询缺失值
data[data['年份']>2027] #查询异常值

#1.2 分组统计
year_count = data.groupby('年份')['年份'].count()

#1.3 组装数据
#x轴数据
min_year = year_count.index.min()
max_year = year_count.index.max()
x = [i for i in range(min_year, max_year+1)]

#y轴数据
y = [int(year_count.get(i, 0)) for i in x] #get(i,0):获取i对应的值,如果不存在则返回0

#1.4 绘制折线图
ax1.plot(x, y, color='g')
ax1.set_title('TOP100电影中每一年上映的电影数量的变化', fontsize=18)
ax1.set_xlabel('年份', fontsize=12)
ax1.set_ylabel('电影数量', fontsize=12)
ax1.set_xticks(x[::5]) #设置x轴刻度
y_ticks = [i for i in range(0,10,2)]
ax1.set_yticks(y_ticks) #设置y轴刻度
ax1.grid(linestyle='--', alpha=0.5) #添加网格线

#2.不同语言电影数量统计(柱状图)

#2.1 获取不同语言对应的电影数量
language_count = data.groupby('语言')['语言'].count().sort_values(ascending=False)

#2.2 组装数据
x = language_count.index.tolist()
y = language_count.values.tolist()

#2.3 绘制柱状图
ax2.bar(x, y, color='g', width=0.6)
ax2.set_title('不同语言电影数量统计', fontsize=18) #添加子图标题
ax2.set_xlabel('语言', fontsize=12) #添加x轴标签
ax2.set_ylabel('电影数量', fontsize=12) #添加y轴标签
ax2.grid(linestyle='--', alpha=0.5) #添加网格线
ax2.tick_params(axis='x', rotation=45) #旋转x轴刻度标签

#3.统计对比不同类型电影数量(柱状图)

#3.1 获取不同类型对应的电影数量
type_count = {} #{'类型1':数量, '类型2':数量, ...}
for types in data['类型'].str.split(','):
    for type in types:
        if type in type_count:
            type_count[type] += 1
        else:
            type_count[type] = 1

#3.2 组装数据
x = list(type_count.keys())
y = list(type_count.values())

#3.3 绘制柱状图
ax3.bar(x, y, color='g', width=0.8)
ax3.set_title('不同类型电影数量统计', fontsize=18)
ax3.set_xlabel('类型', fontsize=12)
ax3.set_ylabel('电影数量', fontsize=12)
ax3.grid(linestyle='--', alpha=0.5)

#4.统计不同评分电影数量占比

#4.1 获取不同评分对应的电影数量
rating_count = data.groupby('评分')['评分'].count()

#4.2 合并小数据(比例小于5%的数据进行合并)
threshold = 0.05
total = rating_count.sum()
large_rating_count = rating_count.loc[rating_count >= total * threshold]  #大数据,比例 >= 5%
small_rating_count = rating_count.loc[rating_count < total * threshold]  #小数据,比例 < 5%

if small_rating_count.shape[0] > 0:
    large_rating_count['其他'] = small_rating_count.sum()

#4.3 组装数据
ratings = large_rating_count.index.tolist() #评分列表
rating_values = large_rating_count.values.tolist()

#4.4 绘制饼状图
ax4.pie(rating_values, labels=ratings, autopct='%1.2f%%', startangle=90) #startangle:起始角度
ax4.set_title('不同评分电影数量占比', fontsize=18) #添加子图标题
ax4.legend(loc='lower center', ncol=4, fontsize=10, bbox_to_anchor=(0.5, -0.1))

#5.保存图片
plt.savefig('../Data/02.png')

最终输出结果如下:

4.🎇更多干货

🥰关注我 学习更多AI知识~

🥰支持我,请 点赞 + 好评 + 收藏 三连,带来更多文章~

🥰有需要完整源码的同学可以留言、后台私信我

相关推荐
派小心.7 小时前
A/B测试工具免费版够用吗?
前端·数据分析
m0_587383008 小时前
深度解析24小时自助健身房系统开发:从架构设计到落地部署
人工智能·小程序·数据挖掘·系统架构·需求分析
haerapi8 小时前
RAPTOR 树不是把文档简单分组:递归聚类的层级检索
数据挖掘·php·聚类
估值探索者9 小时前
【Python量化策略实战 #02】多因子合成mom和vol两因子打分合成
开发语言·c++·python·数据挖掘·c#
Leo.yuan11 小时前
图表不够用、大屏不好看?FineBI 的报表可视化能力解析与落地实践:图表类型、美观度与大屏适配
信息可视化
data analyse 45612 小时前
埋点工具的私有化部署成本高吗?
前端·数据分析·github
data analyse 45613 小时前
埋点工具的埋点查询语言难学吗?
前端·数据分析
quantdash_cc14 小时前
Python 获取实时行情后如何进行批量筛选?从全市场快照到策略候选池
开发语言·python·数据分析·量化交易·股票数据·quantdash
派小心.15 小时前
多端数据分析平台的用户画像能跨端合并吗?原理、难点与落地方法
数据挖掘·数据分析
派小心.15 小时前
多端数据分析平台的事件中心对比:神策、GrowingIO、火山引擎、456数据怎么选
数据挖掘·数据分析