数据分析案例源码级教程: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知识~

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

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

相关推荐
EachYoungX4 小时前
Sleep-EDF 睡眠信号数据集深度解析:从 EDF 文件到可复现睡眠分期样本
深度学习·数据分析
土拨鼠不是老鼠5 小时前
python 使用 plotly 进行数据分析
python·plotly·数据分析
罗政6 小时前
零基础数据分析教程(2):对比与拆解
数据挖掘·数据分析
2601_9627809116 小时前
财务人员学数据分析考什么证?从入门到高阶实用证书清单
数据挖掘·数据分析
博、、16 小时前
社区家政平台开发实战指南:从需求分析到系统部署全流程解析
人工智能·数据挖掘·需求分析
NJCloud16 小时前
Ansible(三)——Zabbix 监控系统部署与敏感信息加密
linux·运维·chrome·信息可视化·ansible·zabbix
ctlover21 小时前
数据分析基础
数据挖掘·数据分析
babe小鑫1 天前
2026信管专业学习数据分析的价值
学习·数据挖掘·数据分析
2601_966871401 天前
Python 爬虫 + 数据挖掘实战:数据抓取与深度挖掘分析全流程
爬虫·python·数据挖掘