基于Pyecharts的电影数据集可视化分析实战

在数据分析领域,数据可视化是一种将复杂数据以直观图表形式展示的方法,能够帮助我们快速发现数据中的规律和趋势。本文将通过一个基于 Pyecharts 的电影数据可视化实战案例,展示如何分析电影类型与评分的关系,并通过多种图表形式呈现分析结果。

一、实验背景与目的

随着电影产业的蓬勃发展,电影数据的分析对于电影制作、发行以及观众选择都有着重要的意义。通过数据可视化,我们可以直观地了解不同类型电影的评分情况、历年电影产量的变化趋势等信息。本次实验旨在:

  1. 掌握使用Python的Pyecharts库进行数据可视化的基本方法。

  2. 分析电影数据集,探索电影类型与评分、时间之间的关系。

  3. 通过图表展示2000年以来评分前十的电影排名及电影类型分布。

二、实验环境与工具

  • 硬件环境:AMD Ryzen 7 6800H with Radeon Graphics 3.20 GHz

  • 软件环境:VScode

  • 主要工具

    • Pyecharts:基于ECharts的Python可视化库,支持动态交互图表。

    • Pandas:用于数据清洗、分组聚合(如按类型计算平均评分)。

三、实验内容与实现

(一)数据准备

本次实验使用的电影数据集包含电影名称、评分、上映时间、类型等信息。数据集的结构如下表所示:


(二)可视化任务实现

1. 电影类型与评分的双轴图表

任务描述:绘制电影类型与评分的双轴图表(柱状图+折线图),展示每种电影类型的平均评分以及该类型的电影数量。

实现过程

  • 读取电影数据集,提取电影类型和评分信息。

  • 对电影类型进行拆分(因一部电影可能属于多个类型),并计算每种类型的平均评分和出现次数。

  • 使用柱状图(评分)和折线图(电影类型次数)的双轴图表展示数据。

代码实现

复制代码
def category_rate():
    st.header("电影数据集分析")
    st.subheader("电影类型与评分的关系")
    data = pd.read_csv("C:/Users/J/Downloads/数据可视化实战/movie.csv", encoding="utf-8", usecols=[4, 8])
    data_split = data['category'].str.split('/', expand=True, n=7)
    data_line = data_split.stack()
    data_reindex = data_line.reset_index(level=1, drop=True).rename('new_category')
    data_recategory = data.drop(['category'], axis=1).join(data_reindex)
    data_recategory = data_recategory.fillna("类型的数据缺失")
    data_rate = data_recategory.groupby('new_category').rate.mean()
    data_recategory = data_recategory.join(pd.concat([data_rate], axis=1, keys=['Average_rate']), on='new_category')
    data_count_category = data_recategory.groupby('new_category').new_category.count()
    data_recategory = data_recategory.join(pd.concat([data_count_category], axis=1, keys=['Count_category']), on='new_category')
    data_recategory = data_recategory.drop_duplicates(subset='new_category', keep='last').sort_values(by='Average_rate', ascending=False)
    category = data_recategory['new_category'].values.tolist()
    rate = data_recategory['Average_rate'].values.tolist()
    count_category = data_recategory['Count_category'].values.tolist()

    bar = (
        Bar(init_opts=opts.InitOpts(width="800px", height="600px", theme=ThemeType.DARK))
            .add_xaxis(xaxis_data=category)
            .add_yaxis(
            series_name="评分",
            y_axis=rate,
            label_opts=opts.LabelOpts(is_show=False),
        )
            .extend_axis(
            yaxis=opts.AxisOpts(
                name="电影类型次数",
                type_="value",
                min_=0,
                max_=2500,
                interval=100,
                axislabel_opts=opts.LabelOpts(formatter="{value}"),
            )
        )
            .set_global_opts(
            tooltip_opts=opts.TooltipOpts(
                is_show=True, trigger="axis", axis_pointer_type="cross"
            ),
            xaxis_opts=opts.AxisOpts(
                type_="category",
                axispointer_opts=opts.AxisPointerOpts(is_show=True, type_="shadow"),
            ),
            yaxis_opts=opts.AxisOpts(
                name="评分值",
                type_="value",
                min_=6,
                max_=9,
                interval=0.3,
                axislabel_opts=opts.LabelOpts(formatter="{value}"),
                axistick_opts=opts.AxisTickOpts(is_show=True),
                splitline_opts=opts.SplitLineOpts(is_show=True),
            ),
        )
            .set_global_opts(
            title_opts=opts.TitleOpts(title="电影类型-评分"),
            datazoom_opts=opts.DataZoomOpts(),
            visualmap_opts=opts.VisualMapOpts(min_=6, max_=9),
        )
    )

    line = (
        Line()
            .add_xaxis(xaxis_data=category)
            .add_yaxis(
            series_name="电影类型次数",
            yaxis_index=1,
            y_axis=count_category,
            label_opts=opts.LabelOpts(is_show=False),
        )
    )
    html = bar.overlap(line).render_embed()
    st.components.v1.html(html, width=900, height=700, scrolling=False)

运行结果

评分分布:从柱状图中可以看出,战争、歌舞、音乐、家庭等类型的电影评分较高,接近8分,而动作、武侠等类型的电影评分相对较低,接近7分。这表明观众对某些类型的电影有更高的评价。

类型次数:折线图显示了每种电影类型的出现次数。例如,剧情类电影的出现次数最高,接近2500次,而武侠类电影的出现次数较少,接近800次。这表明剧情类电影在市场上更受欢迎,而武侠类电影相对较少。

2. 2000年以来评分前十的电影排名表格

任务描述:筛选2000年以来的电影数据,按评分排序并提取前10名,生成包含名次、电影名、评分和时间的表格。

代码实现

复制代码
def Table_category_rate() -> Table:
    data = pd.read_csv("C:/Users/J/Downloads/数据可视化实战/movie.csv", encoding="utf-8", usecols=[2, 4, 11])
    data = data[data['showtime'] >= 2000]
    data = data.sort_values('rate', ascending=False)
    data = data[:10]
    rank = data.columns.tolist()
    rank.insert(rank.index('title'), 'rank')
    data = data.reindex(columns=rank)
    data['rank'] = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
    data = data.values.tolist()

    table = Table()
    headers = ["名次", "电影名", "评分", "时间"]
    rows = data
    table.add(headers, rows)
    table.set_global_opts(title_opts=ComponentTitleOpts(title="2000年以来评分前十的电影排名"))

    return table

运行结果

  • 排名第一的是《灿烂人生》(9.3分,2003年),其次是《机器人总动员》(9.3分,2008年)。

结论:高评分电影多为剧情、动画类,且分布在不同年份。

3. 2010-2015年电影类型产量动态图

任务描述:按年份分组,统计每年电影类型的产量,提取每年产量前五的类型,生成横向柱状图,并使用Timeline组件实现时间轴切换效果。

代码实现

复制代码
def Timeline_category_showtime() -> Timeline:
    tl = Timeline()
    for i in range(2010, 2016):
        data = pd.read_csv("C:/Users/J/Downloads/数据可视化实战/movie.csv", encoding="utf-8", usecols=[8, 11])
        data = data[data['showtime'] >= 2010]
        data_split = data['category'].str.split('/', expand=True, n=7)
        data_line = data_split.stack()
        data_reindex = data_line.reset_index(level=1, drop=True).rename('new_category')
        data_recategory = data.drop(['category'], axis=1).join(data_reindex)
        data_recategory = data_recategory[data_recategory['showtime'] == i]
        data_count_showtime = data_recategory.groupby('new_category').new_category.count()
        data_recategory = data_recategory.join(pd.concat([data_count_showtime], axis=1, keys=['count']), on='new_category')
        data_recategory = data_recategory.drop_duplicates(subset='new_category', keep='last').sort_values(by='count', ascending=False)
        data_recategory = data_recategory[:5].sort_values(by='count', ascending=True)
        category = data_recategory['new_category'].values.tolist()
        count = data_recategory['count'].values.tolist()

        bar = (
            Bar()
                .add_xaxis(category)
                .add_yaxis("{}年".format(i), count, label_opts=opts.LabelOpts(position="right"))
                .reversal_axis()
                .set_global_opts(
                title_opts=opts.TitleOpts("{}年电影类型产量前五".format(i))
            )
        )
        tl.add(bar, "{}年".format(i))
    return tl

运行结果

  • 2013年:剧情、动作、喜剧、爱情、惊悚类型产量较高。

结论:剧情类型始终占据主导地位,动作和喜剧类型也较受欢迎。

4. 电影平均评分前五的类型的漏斗图

任务描述:计算每种类型的平均评分,提取评分最高的前五种类型,使用漏斗图展示类型与评分的关系。

代码实现

复制代码
def category_rate():
    # 省略部分代码
    data_recategory = data_recategory.sort_values('Average_rate', ascending=False)[:5]
    category_rank = data_recategory['new_category']
    y = [1, 2, 3, 4, 5]

    c = (
        Funnel()
            .add(
            "类型-名次:",
            [list(z) for z in zip(category_rank, y)],
            sort_="ascending",
            label_opts=opts.LabelOpts(position="inside"),
        )
            .set_global_opts(title_opts=opts.TitleOpts(title="电影平均评分前五的类型"))
    )
    html = c.render_embed()
    st.components.v1.html(html, width=900, height=700, scrolling=False)

运行结果

  • 平均评分前五的电影类型依次为"黑色电影"、"荒诞"、"动画"、"儿童"和"类型的数据缺失"。

结论:小众或特定类型(如"黑色电影")更易获得高分。

四、实验总结

特性/图表类型 双轴图表 漏斗图 动态柱状图
定义 一种在同一图表中使用两个垂直轴(Y轴)来展示两组数据的图表,通常用于比较不同量级或单位的数据。 一种用于展示数据在各个阶段的转化率流失或情况的图表,通常呈现为上宽下窄的形状,类似漏斗。 一种通过动态效果展示数据随时间变化或趋势的柱状图,可以实时更新数据或展示历史变化。
适用场景 比较不同量级的数据(如销售额与利润率) 展示销售流程中的转化率(如潜在客户到成交客户) 展示数据随时间的变化趋势(如月度销售额)
优点 节省空间,同时展示两组数据 直观展示数据的转化和流失情况 动态展示数据变化,增强视觉效果
缺点 可能导致图表过于复杂,难以理解 只能展示单向的转化过程,无法反映回流等情况 动态可能效果分散注意力,影响对数据的准确解读
常见数据类型 数值型数据(如金额、数量) 流程数据(如销售流程的各阶段人数) 时间序列数据(如月按、按年统计的数据)

(一)技术收获

  1. 掌握了Pyecharts的多图表联动和动态交互设计。

  2. 学会使用Pandas处理多值字段(如拆分电影类型)。

(二)扩展思考

  1. 可引入情感分析,探究评分与用户评论情感倾向的关系。

  2. 尝试用热力图展示类型与年份的交叉分布。

五、未来展望

本次实验通过Pyecharts和Pandas完成了对电影数据集的可视化分析,不仅掌握了数据可视化的技术,还对电影数据进行了深入的探索和分析。通过实验,我深刻体会到数据可视化在数据分析中的重要性,它能够帮助我们更直观地发现数据中的规律和趋势。未来,我将继续学习更多数据可视化工具和方法,提升数据分析能力,为解决实际问题提供更有力的支持。

相关推荐
蓝婷儿4 分钟前
Python 数据分析与可视化 Day 1 - Pandas 数据分析基础入门
python·数据分析·pandas
小馒头君君23 分钟前
近期GitHub热榜推荐
开发语言·windows·python·学习·github
LXJSWD41 分钟前
tensorflow GPU训练loss与val loss值差距过大问题
人工智能·python·tensorflow
Xiuxiu1 小时前
Doubao1.5,DeepseekV3,Qwen,hunyuna分析能力对比:以Aipy泡泡玛特商业分析为例
python·html
西猫雷婶2 小时前
python学智能算法(十四)|机器学习朴素贝叶斯方法进阶-CountVectorizer文本处理简单测试
人工智能·python·机器学习
电商API_180079052472 小时前
API 接口:程序世界的通用语言与交互基因
爬虫·python·数据挖掘·网络爬虫
AI浩2 小时前
DINO-R1:激励推理能力的视觉基础模型
python·目标检测·计算机视觉
失败又激情的man2 小时前
python爬虫关于多进程,多线程,协程的使用
开发语言·爬虫·python
橘子编程3 小时前
Python-循环结构解析
开发语言·python