• 一. Python数据可视化概述
    • 1. 了解数据与数据可视化
      • 1.1 了解数据与数据可视化
      • 1.2 了解数据
      • 1.3 了解数据可视化
    • 2.熟悉常用的数据可视化图形
      • 2.1 熟悉基础图形的种类及作用
      • 2.2 掌握高级图形的种类及作用
    • 3. 了解与比较Python与其他可视化工具
      • 3.1 比较常用数据可视化工具
      • 3.2 了解Python数据可视化工具库
    • 4. 熟悉Python集成开发环境Jupyter
      • 4.1 掌握Jupyter的基础操作
      • 4.2 熟悉Jupyter的高级操作
    • 5. 小结
  • 二. 数据的读取与处理
    • 1. 读取数据
      • 1.1 读取CSV数据
      • 1.2 读取Excel文件数据
    • 2. 处理不符合可视化要求的数据
      • 2.1 校验数据
      • 2.2 清洗数据
      • 2.3 合并数据
      • 2.4 小结
  • 三. Matplotlib数据可视化基础
    • 1. 基础语法与常用参数
      • 1.1 基础语法和绘图风格
      • 1.2 动态rc参数
    • 2. 分析特征间的关系
      • 2.1 绘制散点图
      • 2.2 绘制折线图
      • 2.3 分析特征内部数据分布与分散状况
      • 2.4 绘制饼图
      • 2.5 绘制柱形图
      • 2.6 绘制箱线图
      • 2.7 小结
  • 四. seaborn绘制进阶图形
    • 1.熟悉seaborn绘图基础
      • 1.1 了解seaborn中的基础图形
      • 1.2 了解seaborn的绘图风格
      • 1.3 熟悉seaborn的调色板
    • 2. 绘制关系图
      • 2.1 绘制散点图
      • 2.2 绘制折线图
      • 2.3 绘制热力图
      • 2.4 绘制矩阵网格图
    • 3. 绘制分类图
      • 3.1 绘制条形图
      • 3.2 绘制单变量分布图
      • 3.3 绘制分类散点图
      • 3.4 绘制增强箱线图
      • 3.5 绘制分类网格组合图
    • 4.绘制回归图
      • 4.1 绘制线性回归拟合图
      • 4.2 绘制线性回归网格组合图
    • 5. 小结
  • 五. pyecharts交互式图形绘制
    • 1. pyecharts绘图基础
      • 1.1 初始配置项
      • 1.2 系列配置项
      • 1.3 全局配置项
    • 2. 绘制交互式基础图形
      • 2.1 绘制条形图
      • 2.2 绘制散点图
      • 2.3 绘制折线图
      • 2.4 绘制箱线图
      • 2.5 绘制3D散点图
      • 2.6 绘制饼图
    • 3. 绘制交互式高级图形
      • 3.1 绘制层叠多图
      • 3.2 绘制漏斗图
      • 3.3 绘制热力图
      • 3.4 绘制词云图
      • 3.5 绘制关系图
      • 3.6 绘制桑基图
    • 4. 绘制组合图形
      • 4.1 绘制并行多图
      • 4.2 绘制顺序多图
      • 4.3 绘制时间线轮播多图
    • 5. 小结
  • 六. 广电大数据可视化项目实战
    • 1. 了解项目背景与目标
      • 1.1 了解项目背景
      • 1.2 熟悉项目流程
    • 2. 读取与处理广播电视数据
      • 2.1 读取数据
      • 2.2 清洗数据
    • 3. 绘制可视化图形
      • 3.1 绘制用户分析图
      • 3.2 绘制频道分析图
      • 3.3 绘制时长分析图
      • 3.4 绘制周时长分析图
      • 3.5 绘制用户支付方式分析图
    • 4. 项目分析报告
      • 4.1 分析思路
      • 4.2 总结与建议
    • 5. 小结
  • 七. 新零售智能销售数据可视化实战
    • 1. 了解项目背景与目标
      • 1.1 了解项目背景
      • 1.2 熟悉数据情况
      • 1.3 熟悉数据情况
      • 1.4 熟悉项目流程
    • 2. 读取与处理新零售智能数据
      • 2.1 读取数据
      • 2.2 清洗数据
      • 2.3 规约数据
    • 3. 绘制可视化图形
      • 3.1 绘制销售分析图
      • 3.2 绘制库存分析图
      • 3.3 绘制用户分析图
    • 4. 项目分析报告
      • 4.1 分析思路
      • 4.2 分析结果
      • 4.3 总结和建议
      • 4.4 小结
  • 八.基于TipDM大数据挖掘建模平台
    • 1.学习目标
    • 2.平台简介
      • 2.1 实训库
      • 2.2 数据管理
      • 2.3 我的实训
      • 2.4 系统算法
    • 3. 实现广电大数据可视化项目
      • 3.1 数据源配置
      • 3.2 数据可视化
  • 九.函数速查
    • 1.pandas相关函数:
    • 2.Matplotlib相关函数:
    • 3.seaborn相关函数:
    • 4.pyecharts相关函数:
  • 十. 思维导图
    • 1. 老师总结
    • 2. 自己总结

一. Python数据可视化概述

1. 了解数据与数据可视化

1.1 了解数据与数据可视化

  • 数据是对客观事物的性质、状态以及相互关系等进行记载的物理符号或这些物理符号的组合。它是可识别的、抽象的符号。数据不仅指狭义上的数字,还可以是具有一定意义的文字、字母、数字符号的组合、图形、图像、视频、音频等,也是客观事物的属性、数量、位置及其相互关系的抽象表示。如“0、1、

    2......”“阴、雨、下降、气温”“学生的档案记录、货物的运输情况”等都是数据。

  • 数据可视化主要旨在借助于图形化手段,清晰有效地传达与沟通信息。为了有效地传达思想概念,美学形式与功能需要齐头并进,通过直观地传达关键的方面与特征,从而实现对于相当稀疏而又复杂的数据集的深入洞察。

1.2 了解数据

  • 数据的来源众多,科学研究、企业应用和Web应用等都在源源不断地生成新的数据。生物大数据、交通大数据、医疗大数据、电信大数据、电力大数据、金融大数据等都呈现出“井喷式”增长,所涉及的数量十分巨大,已经从TB级别跃升到PB级别。

  • 数据的数据类型丰富,包括结构化数据和非结构化数据。

    • 结构化数据包括信用卡号码、日期、财务金额、电话号码、地址、产品名称等。
    • 非结构化数据种类繁多,主要包括邮件、音频、视频、微信、微博、位置信息、链接信息、手机呼叫信息、网络日志、天气数据、地震图像、交通、天气、海洋传感器数据等。如此类型繁多的异构数据,对数据处理分析、可视化技术提出了新的挑战,也带来了新的机遇。
  • 人们无时不刻都在和数据打交道,信息化时代,可视化的意义是更好的对业务进行分析和决策。信息的质量很大程度上依赖于表达方式,科学表明,人对视觉的理解能力比其他途径更敏感,更易于理解。

  • 数据可视化的本质是视觉的对话,借助图形化的手段,清晰有效地传达所要沟通的信息,一方面,数据赋予可视化价值,另一方面,可视化赋予数据灵性,两者相辅相成,帮助企业从数据价值中“掘金”!

1.3 了解数据可视化

1. 概念

  • 数据可视化(Data Visualization)是研究图形展现数据中隐含关系的信息并发掘其中规律的学科。数据可视化涉及计算机视觉、图像处理、计算机辅助设计、计算机图形学等多个领域,成为了一项研究数据表示、数据处理、决策分析等问题的综合技术。
  • 数据可视化通过图表直观地展示数据间的量级关系,其目的是将抽象信息转换为具体的图形,将隐藏于数据中的规律直观地展现出来。图表是数据分析可视化最重要的工具,通过点的位置、曲线的走势、图形的面积等形式,直观地呈现研究对象间的数量关系。不同类型的图表展示数据的侧重点不同,选择合适的图表可以更好地进行数据可视化。

2. 流程

数据可视化尽管涉及到的数据量大,业务复杂,分析繁琐,但是总遵循着一定的流程进行。如图所示。

image-20240310210546368

数据可视化流程说明如表所示。

步骤 说明
需求分析 需求分析的主要内容是基于对商业的理解,明确目标,整理分析框架和分析思路,确定数据分析的目的和方法
数据获取 数据获取是根据分析的目的,收集、整合、提取相关的数据,是数据分析工作的基础
数据处理 数据处理是指通过工具对数据中的噪声数据进行处理,并将数据转换为适用分析的形式。数据处理主要包括数据清洗、数据合并等处理方法
分析与可视化 数据分析通过分析手段、方法和技巧对准备好的数据进行探索、分析,从中发现因果关系、内部联系和业务规律。可视化是指对具体数据指标的计算和分析,发现数据中潜在的规律,并借助图表等可视化的方式直观的展示数据之间的关联信息,使得抽象的数据变得更加清晰、具体,易于观察,便于决策
分析报告 分析报告是指以特定的形式将数据分析的过程、结果、方案完整呈现出来,图文并茂,层次明晰,直观地看清楚问题和结论,便于需求者了解情况。分析报告包括了背景与目的、分析思路、分析结果、总结和建议

项目分析报告模块如图所示。

2.熟悉常用的数据可视化图形

2.1 熟悉基础图形的种类及作用

  • 可视化通常以直观的图形呈现出来,用户所见即所得。在Python中,可以利用Matplotlib、seaborn、 pyecharts等可视化库,绘制多种形式的图形,包括基础图形和高级图形。
  • Python作为一门流行的编程语言,不仅能基于自带的库函数完成基本的程序逻辑功能,而且随着第三方库的发展,更加丰富了Python的功能和计算生态,比较有代表性的就是Python便捷的绘图,它可以绘制的基础图形有散点图、折线图、柱形图、饼状图、箱线图等。

1. 散点图
散点图将数据显示为一组点,用两组数据构成多个坐标点,通过观察坐标点的分布,判断两变量之间是否存在某种关联或总结坐标点的分布模式。如图所示,显示体重与身高之间的关系。

2. 折线图
折线图用于显示随时间或有序类别而变化的趋势。在折线图中,通常沿横轴标记类别,沿纵轴标记数值。如图所示,显示商家A和商家B的各类商品的销售变化的趋势。

3. 条形图
条形图是以宽度相等的条形长度的差异显示统计指标数值大小的一种图形,它通常显示多数项目之间的比较情况。在条形图中,通常沿纵轴标记类别,沿横轴标记数值。柱形图是以宽度相等的柱形高度的差异显示统计指标数值大小的一种图形,它用于显示一段时间内的数据变化或显示各项之间的比较情况。与条形图不同的是,在柱形图中,通常沿横轴组织类别,沿纵轴组织数值,可认为是条形图的坐标轴的转置。如图所示,显示商家A和商家B的各类商品的销售分布。

当条目较多时,柱形图会显得较拥挤不堪,可以通过翻转X轴和Y轴显示图形,即条形图。如图所示,显示商家A和商家B的各类商品的销售分布。

同时,也可以将柱形图堆叠,用于显示单个项目与整体之间的关系。如图所示,显示商家A和商家B的各类商品的销售分布。

4. 饼图


饼图以一个完整的圆表示数据对象的全体,其中扇形面积表示各个组成部分。饼图常用于描述百分比构成,其中每一个扇形代表一类数据所占的比例。
如图所示,显示商家各类商品的销售占比。

5. 箱线图

  • 箱线图是利用数据的统计量描述数据的一种图形,一般包括上界、上四分位数、中位数、下四分位数、下界和异常值这6个统计量,提供有关数据位置和分散情况的关键信息。如图所示,显示4个班的上界、上四分位数、中位数、下四分位数、下界和异常值。

2.2 掌握高级图形的种类及作用

  • 随着一些第三方库的扩展,Python语言越来越丰富,功能也越来越强大。
  • 尤其在图形可视化交互方面也是如此,不仅能完成基础绘图,而且还能绘制一些高级图形,如仪表盘、漏斗图、雷达图、热力图、词云图、关系图、桑基图。

1. 仪表盘
仪表盘也称为拨号图表或速度表图,其显示类似于拨号/速度计上的读数的数据,是一种拟物化的展示形式。仪表盘的颜色可以用于划分指示值的类别,使用刻度标示数据,指针指示维度,指针角度表示数值。仪表盘只需分配最小值和最大值,并定义一个颜色范围,指针(指数)将显示出关键指标的数据或当前进度。仪表盘可用于显示速度、体积、温度、进度、完成率、满意度等。如图所示,显示销售任务的完成情况。

2. 漏斗盘
漏斗图也称倒三角图,漏斗图将数据呈现为几个阶段,每个阶段的数据都是整体的一部分,从一个阶段到另一个阶段数据自上而下逐渐下降。漏斗图适用于业务流程比较规范、周期长、环节多的流程分析,通过漏斗图对各环节业务数据进行比较,能够直观地发现和说明问题。如图所示,显示某淘宝店铺的订单转化各环节中哪些环节出了问题。

3. 雷达图
雷达图也称戴布拉图、蜘蛛网图。雷达图将多个维度的数据映射到坐标轴上,这些坐标轴起始于同一个圆心点,通常结束于圆周边缘,将同一组的点使用线连接起来即成为了雷达图。在坐标轴设置恰当的情况下,雷达图所围面积能表现出一些信息量。雷达图将纵向和横向的分析比较方法结合起来,可以展示出数据集中各个变量的权重高低情况,非常适用于展示性能数据。如图所示,显示某位销售经理的各项能力。

4. 热力图
热力图通过颜色的深浅表示数据的分布,颜色越浅数据越大,可以一眼就分辨出数据的分布情况,非常方便。如图所示,显示某网站某周一天24小时的点击量的分布情况。

5. 词云图
词云图可对文字中出现频率较高的“关键词”予以视觉上的突出,形成“关键词云层”或“关键词渲染”。词云图过滤掉大量的文本信息,使浏览网页者只要一眼扫过文本即可领略文本的主旨。词云图提供了某种程度的“第一印象”,最常使用的词会一目了然。如图所示,显示宋词中各词汇的出现频率。

6. 关系图
关系图又称关联图,可用于分析事物之间“原因与结果”“目的与手段”等复杂关系,它能够帮助人们从事物之间的逻辑关系中,寻找出解决问题的办法。关系图应用范围很广,如人物关系图、零件关系图、交通网络图等。如图所示,显示微信好友关系。

7. 桑基图
桑基图又称桑基能量分流图、桑基能量平衡图,是一种特定类型的流程图,图中延伸的分支的宽度对应数据流量的大小,常应用于能源、材料成分、金融等数据的可视化分析。桑基图的作用是展示数据的流动,最明显的特征是,始末端的分支宽度总和相等,保持能量的平衡。如图所示,显示生活开支的流动。

3. 了解与比较Python与其他可视化工具

大数据时代,数据对企业和组织的重要性不言而喻,企业和组织也对数据的需求变得纷繁多样。目前数据可视化工具很多,它们各有差异。其中,常见的可视化工具对比如表所示。

工具名称 难易程度 是否免费 用户体验 支持平台
Excel 简单易学 收费授权 一般 以Windows为主
Tableau 灵活易用 收费授权 精美直观 以Windows为主
Power BI 集成度高 免费版、专业版 动态交互式 以Windows为主
JavaScript 有一定难度 免费开源 扩展库丰富 跨终端、跨平台
Python 简单容易 免费开源 组件丰富 跨平台

3.1 比较常用数据可视化工具

1. Excel

  • Excel是办公室自动化中非常重要的一款软件,大量的国际企业都依靠Excel进行数据管理。它不仅能够方便的处理表格和进行图形分析,而且拥有强大的功能,如对数据进行自动处理和计算。Excel是微软公司的办公软件Microsoft office的组件之一,是由Microsoft为Windows和Apple Macintosh操作系统的电脑编写和运行的一款试算表软件。
  • Excel的学习成本低,且容易上手。在Excel的图表库中,用户可绘制基本的可视化图形。

2. Tableau

  • Tableau是桌面系统中最简单的商业智能工具之一,它不强迫用户编写自定义代码,新的控制台可由用户自定义配置。Tableau的灵活易用让业务人员能够一同参与报表开发与数据分析进程,通过自助式可视化分析深入挖掘商业洞察与见解。
  • Tableau Desktop是基于斯坦福大学突破性技术的软件应用程序。它可以生动地分析实际存在的任何结构化数据,并在几分钟内生成美观的图表、坐标图、仪表盘与报告。利用Tableau简便的拖拽操作,用户可以自定义视图、布局、形状、颜色等,帮助用户展现自己的数据视角。

3. Power BI

  • Power BI是一个商业分析工具,用于在组织中提供见解。可连接数百个数据源、简化数据准备并提供即席分析。生成美观的报表并进行发布,供组织在Web和移动设备上使用。每个人都可创建个性化仪表板,获取针对其业务的全方位独特见解。在企业内实现扩展,内置管理和安全性。

  • Power BI整合了Power Query、Power Privot、Power View、Power Map等一系列工具,使得用过

    Excel做报表和BI分析的从业人员可以快速上手Power BI,甚至可以直接使用以前的模型。此外,

    Excel 2016也提供了Power BI插件。

4. JavaScript

  • JavaScript是一种脚本语言,已经被广泛用于Web应用开发,常用于为网页添加各式各样的动态功能,为用户提供更流畅美观的浏览效果。通常JavaScript脚本是通过嵌入在HTML中实现自身的功能的。随

    着JavaScript在数据可视化领域的不断普及,市场上也出现多款能够为Web创建图表的开源库,如

    HighCharts、D3、ECharts等。

  • HighCharts是一个界面美观、时下非常流行的的纯Javascript图表库。Data-Driven Documents

    (D3)译为一个被数据驱动的文档,利用现有的Web标准,通过数据驱动的方式实现数据可视化。

    ECharts一个纯Javascript的企业级数据图表库,一款免费开源的数据可视化产品,可以流畅的运行在 PC和移动设备上,兼容当前绝大部分浏览器,提供直观、生动、可交互、可高度个性化定制的数据可视化图表。

5. Python

  • Python是一种跨平台的计算机程序设计语言,也是一种解释性、编译性、互动性和面向对象的脚本语言。
  • Python作为一门应用十分广泛的计算机编程语言,在数据科学领域具有独特地优势。不仅语法简单精炼、简单易学,还拥有NumPy、pandas、Matplotlib、seaborn等功能齐全、高效易用、接口统一的科学计算库和可视化库。用户使用其可视化库,不仅可以绘制传统的2D图形,而且可以绘制3D立体图形。

3.2 了解Python数据可视化工具库

随着Python的不断发展,扩展了很多第三方开源库。其中,常用的可视化工具库有pandas、Mathplotlib、 seaborn、pyecharts等。

1. pandas

  • pandas是Python的数据分析核心库,最初被作为金融数据分析工具而开发出来,因此pandas为时间

    序列分析提供了很好的支持。pandas提供了一系列能够快速便捷地处理结构化数据的数据结构和函数。

  • pandas兼具NumPy高性能的数组计算功能、电子表格和关系型数据库(如SQL)灵活的数据处理功能,还提供了复杂精细的索引功能,以便于便捷地完成重塑、切片、切块和聚合,以及选取数据子集等操作。pandas库中有两种数据结构,分别为Series和DataFrame。

2. Matplotlib

  • Matplotlib是最流行的用于绘制数据图表的Python库,是Python的2D绘图库。最初由John

    D.Hunter(JDH)创建,目前由一个庞大的开发人员团队维护。Matplotlib操作简单容易,用户只需几行代码即可生成直方图、散点图、条形图、饼图等图形。

  • Matplotlib提供了pylab的模块,其中包括了许多NumPy库和pyplot函数中常用的函数,方便用户快速进行计算和绘图。Matplotlib跟IPython相结合,提供了一种交互式数据绘图环境,可实现交互式的绘图,实现利用绘图窗口中的工具栏放大图表中的某个区域或对整个图表进行平移浏览。Matplotlib 是众多Python可视化库的鼻祖,也是Python最常用的标准可视化库,其功能非常强大。

3. seaborn

  • seaborn是基于Matplotlib的图形可视化python库,它提供了一种高度交互式界面,便于用户能够做出各种有吸引力的统计图表。

  • seaborn是在Matplotlib的基础上进行了更高级的API封装,从而使得作图更加容易。它不需要了解大量的底层代码,即可使图形变得精致。在大多数情况下,使用seaborn能做出很具有吸引力的图,而使用Matplotlib能制作具有更多特色的图。因此,可将seaborn视为Matplotlib的补充,而不是替代物。

    同时,seaborn能高度兼容NumPy与pandas数据结构以及scipy与statsmodels等统计模式,可以在很大程度上帮助用户实现数据可视化。

4. pyecharts

  • Echarts是一个由百度开源的数据可视化工具,凭借着良好的交互性,精巧的图表设计,得到了众多开发者的认可。而Python是一门富有表达力的语言,很适合用于数据处理。当数据分析遇上数据可视化时,当Python遇到Echarts时,即产生了pyecharts。

  • pyecharts可以展示动态交互图,对于展示数据更方便,当鼠标悬停在图上时,即可显示数值、标签等。

    pyecharts支持主流Notebook环境,如Jupyter Notebook、JupyterLab等;可轻松集成至Flask、

    Django等主流Web框架;高度灵活的配置项,可轻松搭配出精美的图表;囊括了30多种常见图表,如

    Bar(柱形图/条形图)、Boxplot(箱形图)、Funnel(漏斗图)、Gauge(仪表盘)、Graph(关系图)、HeatMap(热力图)、Radar(雷达图)、Sankey(桑基图)、Scatter(散点图)、

    WordCloud(词云图)等。

4. 熟悉Python集成开发环境Jupyter

4.1 掌握Jupyter的基础操作

  • Jupyter Notebook(此前被称为IPyton Notebook)是一个交互式笔记本,它本质上是一个支持实时代码、数学方程、可视化和Markdown的Web应用程序。

  • 对于数据分析,Jupyter Notebook最大的优点是可以重现整个分析过程,并将说明文字、代码、图表、公式和结论都整合在一个文档中。用户可以通过电子邮件、Dropbox、GitHub和Jupyter Notebook

    Viewer将分析结果分享给其他人。

    Jupyter作为一个便捷的交互式开发工具,使得用户只要在开始菜单启动,便可打开使用。相比其他开发工具,它的窗口界面非常简洁,基于输入输出的单元格模式,尤其是在数据文件的读取、图标呈现等,实现了快速所见所得的开发模式。

1. 启动Jupyter Notebook

在安装完成Python,配置好环境变量并安装了Jupyter Notebook后,在Windows系统下的命令行,或Linux系统下的终端中输入命令“jupyter notebook”,即可启动Jupyter Notebook,如图所示。


2. 新建一个Notebook

  • 当打开Jupyter Notebook后,将会在浏览器中出现如上图的界面。

  • 单击上图右上方的“New”,即可出现下拉菜单,如下图所示。

    下拉菜单中选择需要创建的Notebook类型。其中,“Python 3”表示Python运行脚本,“Text File”为纯文本型,“Folder”为文件夹,灰色字体表示不可用项目。单击“Python 3”,进入Python脚本编辑状态界面

3. Jupyter Notebook的界面及其构成

  • 代码单元。这里是读者编写代码的地方,通过按“shift+Enter”组合键运行代码,其结果显示在本单元下方。代码单元左边有“In [ ]:”编号,方便使用者查看代码的执行次序。

  • Markdown单元。在这里对文本进行编辑,采用Markdown的语法规范,可以设置文本格式,插入链接,图片甚至数学公式。同样按“shift+Enter”组合键运行Markdown单元显示格式化的文本。

Jupyter Notebook编辑界面类似于Linux的Vim编辑器,在Notebook中也有两种模式。

  • 编辑模式。编辑文本和代码。选中单元并按“Enter”键进入编辑模式,此时单元左侧显示绿色竖线。

  • 命令模式。用于执行键盘输入的快捷命令。通过“Esc”键进入命令模式,此时单元左侧显示蓝色竖线。

  • 如果要使用快捷键,首先按“Esc”键进入命令模式,然后按相应的键实现对文档的操作。例如,切换成代码单元“Y”或Markdown单元“M”键,或在本单元的下方增加一单元“B”键,查看所有快捷命令可以按“H”键。

4. Jupyter实现数据的可视化

  • 基于IPython实现的Jupyter Notebook具有交互式操作,能给数据分析、建模过程、检验中间结果和可视化带来了极大的方便。当完成一个Jupyter单元时,如果是一个变量名或是一个没有将输出赋值的语句,Jupyter在没有print语句的情况下依然会展示该变量。这一点在处理pandas的DataFrames时尤其有用,对应的输出会被整齐的展示为一个表格。

  • 在Jupyter Notebook中生成绘图有许多选项,pandas在绘制基本图表比较擅长,seaborn绘制统计图表比较方便,这两个工具都是基于Matplotlib的基础上搭建的。通过import导入pandas、

    Matplotlib、seaborn库,即可进行快速绘制交互图。

    使用经典的鸢尾花数据,进行数据读取和可视化,如图所示。

image-20240310213132222

4.2 熟悉Jupyter的高级操作

Jupyter不仅能完成一些简单的文件编译运行等基础操作,还有一些高级操作,如:文档的排版标记、文件的导出、扩展插件等功能。


1. Markdown

  1. 标题的引用

    标题是标明文章和作品等内容的简短语句,读者写报告或写论文,标题的引用是不可或缺的,尤其论文的章节等需要使用不同级别的标题。Markdown作为一个的排版工具,一般使用类Atx形式,在首行前加1个

    “#”字符代表一级标题,前加2个“#”字符代表二级标题,以此类推。

  2. 列表

  • 列表是一种数据项构成的有限序列,即按照一定的线性顺序,排列而成的数据项的集合。

  • 列表一般被分为两种,一种是无序列表,使用一些图标标记,没有序号,没有顺序排列;另一种是有序列表,使用数字标记,有顺序排列。Markdown对于无序列表,使用星号,加号或减号作为列表标记;

    Markdown对于有序列表则是使用数字+“.”+“ ”(即1个空格)表示。

    image-20240310213316551

(3)加粗/斜体

  • 文档中为了凸显部分内容,一般对文字使用加粗或斜体,使得该部分内容变得更加醒目。
  • 对于Markdown排版工具而言,通常使用星号“*”和底线“_”作为标记字词的符号。两个星号或底线包围表示被加粗,3个星号或底线包围表示斜体。

image-20240310213332639

(4)表格

Markdown同样也可以绘制表格,代码的第一行表示表头,第二行分隔表头和主体部分,从第三行开始每一行代表一个表格行;列与列之间用管道符号“|”隔开,原生方式的表格每一行的两边也要有管道符。


(5)数学公式编辑

LaTeX是写科研论文的必备工具,不但能实现严格的文档排版,而且能编辑复杂的数学公式。在Jupyter Notebook的Markdown单元中也可以使用LaTeX的语法插入数学公式。在文本行中插入数学公式,使用两个“$”符号,比如质能方程“$E = mc^2$”。如果要插入一个数学区块,则使用两个“$$”符号,在输入表达式后运行结果,如图所示。

2. 导出功能

Notebook还有一个强大的特性,即其导出功能,可以将Notebook导出为多种格式,如HTML、

Markdown、ReST、PDF(通过LaTeX)和Raw

Python等。其中导出PDF功能,可以让读者不用写

LaTex即可创建漂亮的PDF文档。读者还可以将

Notebook作为网页发布在自己的网站上。甚至,可以导出为ReST格式,作为软件库的文档。导出功能可通过选择“File”→“Download as”级联菜单中的命令实现,如图所示。

3. 插件

Jupyter Notebook是当前一种十分流行的基于网页的开发环境,它灵活、高度可扩展,不仅允许用户创建和共享含有代码的文档,还可以植入公式、可视化图片和描述性的文本等。

扩展插件是扩展Notebook环境基本功能的简单插件,它们用Python语言编写,能自动套用代码格式或在单元格完成后发送浏览器通知。安装Jupyter Nbextensions

Configurator扩展插件,重启Jupyter Notebook,并导航至新的Nbextensions选项卡,里面有很多插件可供选择,如图所示。

这里只需勾选相应插件即可自动载入,从而帮助开发人员减少工作量。下面将分别介绍Hinterland、Table of

Contents、Execute Time等插件。

(1)Hinterland

代码补全是大部分IDE都具备的常见功能,如


PyCharm。Jupyter Notebook虽然自带补全功能,但是每次都需要单击tab键补全,这样效率相对较低。
Hinterland是一款代码自动补全插件,可在Jupyter Notebook内完成代码时自动补全。当输入几个包含字母后它能够快速补全需要的函数,补全速度堪比 pycharm。代码提示功能也很强大,如图所示。

(2)Table of Contents

Table of Contents可以基于Notebook中创建的标题自动生成目录。当创建了标题后,界面的左侧将会生成目录。双击标题,即可链接至对应章节内容,如图所示。

(3)Execute Time

可用于统计每个cel的执行时间。在企业项目中,为了查找程序耗时的位置,提高效率。因此,需要统计代码的运行时间,最初级的用法是在每个函数开始和结尾处写一个计时语句,这样相对繁琐。如果使用

Execute Time插件统计每个单元的运行耗费时间,那么将会相对简单,如图所示。

5. 小结

数据与数据可视化的概念;
数据可视化流程;
常用的数据可视化图形的种类及作用;
常用的可视化工具和Python数据可视化库;
Python数据可视化集成开发环境Jupyter的操作使用方法。

二. 数据的读取与处理

1. 读取数据

  • 数据的读取是进行数据预处理、数据建模和分析的基础。对于不同的数据文件,pandas提供了不同函数进行读取。
  • pandas内置了10余种读写函数。常见的数据文件格式有3种形式,分别是CSV文件、Excel文件和数据库。

1.1 读取CSV数据

文本文件CSV读取

  • CSV文件是以纯文本形式存储表格数据(数字和文本)。

  • CSV文件由任意数目的记录组成,记录间以某种换行符分隔。每条记录由字段组成,字段间的分隔符是其他字符或字符串,最常见的是逗号或制表符。

  • CSV文件是一种通用的、相对简单的文件格式,被用户、商业和科学广泛应用。

  • pandas提供了read_csv函数来读取csv文件。

    pandas.read_csv(filepath_or_buffer, sep='\t', header='infer', names=None, index_col=None, dtype=None, engine=None, nrows=None)
    
参数名称 说明
filepath 接收str,代表文件路径。无默认值
sep 接收str,代表分隔符。默认为“,”
header 接收int或sequence,表示将某行数据作为列名。默认为infer,表示自动识别
names 接收array,表示列名。默认为None
index_col 接收int、sequence或False,表示索引列的位置,取值为sequence则代表多重索引。默认为None
dtype 接收dict,代表写入的数据类型(列名为key,数据格式为values)。默认为None
engine 接收C或Python,代表数据解析引擎。默认为C
nrows 接收int,表示读取前n行。默认为None

文本文件CSV存储

文本文件的存储和读取类似,结构化数据可以通过pandas中的to_csv函数实现以csv文件格式存储文件。

DataFrame.to_csv(path_or_buf=None, sep=',', na_rep='', columns=None, header=True, index=True, index_label=None, mode='w', encoding=None)
参数名称 说明
path_or_buf 接收str,表示文件路径。无默认值
sep 接收str,表示分隔符。默认为“,”
na_rep 接收str,表示缺失值。默认为“”
columns 接收list,表示写出的列名。默认为None
header 接收boolean,表示是否将列名写出。默认为True
index 接收boolean,表示是否将行名(索引)写出。默认为True
index_labels 接收sequence,表示索引名。默认为None
mode 接收特定str,表示数据写入模式。默认为w
encoding 接收特定str,表示存储文件的编码格式。默认为None

1.2 读取Excel文件数据

Excel文件读取

pandas提供了read_excel函数来读取“xls”“xlsx”两种Excel文件。

pandas.read_excel(io, sheetname=0, header=0, index_col=None, names=None, dtype=None)
参数名称 说明
io 接收str,表示文件路径。无默认值
sheetname 接收str、int,表示Excel表内数据的分表位置。默认为0
header 接收int或sequence,表示将某行数据作为列名。默认为infer,表示自动识别
names 接收int、sequence或False,表示索引列的位置,取值为sequence则代表多重索引。默认为None
index_col 接收int、sequence或False,表示索引列的位置,取值为sequence则代表多重索引。默认为None
dtype 接收dict,表示写入的数据类型(列名为key,数据格式为values)。默认为None

Excel文件存储

  • 将文件存储为Excel文件,可以使用to_excel方法。其语法格式如下。

    
    

DataFrame.to_excel(excel_writer=None, sheetname=None, na_rep='', header=True, index=True, index_label=None, mode='w', encoding=None)

- to_excel函数和to_csv函数的常用参数基本一致,区别之处在于指定存储文件的文件路径参数名称为

excel_writer,并且没有sep参数。此外,还增加了一个sheetnames参数,用于指定存储的Excel Sheet 的名称,默认为sheet1。

### 1.3 读取数据库数据

**数据库数据读取**

- pandas提供了读取与存储关系型数据库数据的函数与方法。除了pandas库外,还需要使用SQLAlchemy库建立对应的数据库连接。SQLAlchemy配合相应数据库的Python连接工具,使用create_engine函数,建立一个数据库连接。

- creat_engine中填入的是一个连接字符串。在使用Python的SQLAlchemy时,MySQL和Oracle数据库连接字符串的格式如下:

```txt
数据库产品名+连接工具名://用户名:密码@数据库IP地址:数据库端口号/数据库名称?charset = 数据库数据编码
  • read_sql_table只能够读取数据库的某一个表格,不能实现查询的操作。

    pandas.read_sql_table(table_name, con, schema=None, index_col=None, coerce_float=True, columns=None)
    
  • read_sql_query则只能实现查询操作,不能直接读取数据库中的某个表。

    pandas.read_sql_query(sql, con, index_col=None, coerce_float=True)
    
  • read_sql是两者的综合,既能够读取数据库中的某一个表,也能够实现查询操作。

    pandas.read_sql(sql, con, index_col=None, coerce_float=True, columns=None)
    
参数名称 说明
sql or table_name 接收str,表示读取的数据的表名或sql语句。无默认值
con 接收数据库连接,表示数据库连接信息。无默认值
index_col 接收int、sequence或False,表示设定的列作为行名,如果是一个数列,那么是多重索引。默认为None
coerce_float 接收boolean,表示将数据库中的decimal类型的数据转换为pandas中的 float64类型的数据。默认为True
columns 接收list,表示读取数据的列名。默认为None

数据库存储

将DataFrame数据写入数据库中,同样也要依赖SQLAlchemy的数据库连接。数据库数据读取有3个函数,但数据存储则只有一个to_sql()方法。

DataFrame.to_sql(name, con, schema=None, if_exists='fail', index=True, index_label=None, dtype=None)
参数名称 说明
name 接收str,表示数据库表名。无默认值
con 接收数据库连接,表示数据库连接信息。无默认值
if_exists 接收fail、replace、append。fail表示如果表名存在那么不执行写入操作;replace表示如果存在,那么将原数据库表删除,再重新创建;append则表示在原数据库表的基础上追加数据。默认为fail
index 接收boolean,表示是否将行索引作为数据传入数据库。默认True
index_label 接收str或sequence,表示是否引用索引名称,如果index参数为True,此参数为None,那么使用默认名称。如果为多重索引,那么必须使用sequence形式。默认为None
dtype 接收dict,表示写入的数据类型(列名为key,数据格式为values)。默认为None

2. 处理不符合可视化要求的数据

2.1 校验数据

1. 一致性校验

1时间校验

  • 时间不一致是指数据在合并或联立后时间字段出现时间范围、时间粒度、时间格式和时区不一致等情况。
  • 时间范围不一致通常是不同表的时间字段中所包含的时间的取值范围不一致。如下两张表的时间字段的取值范围分别为2020年3月2日至2020年3月29日和2020年3月15日至2020年4月18日,此时如果需要联立两张表,那么需要对时间字段进行补全,否则将会产生大量的空值或导致报错。
create_time_1 create_time_2
2020-03-02 09:36:00 2020-03-15 11:37:00
2020-03-03 10:31:00 2020-03-16 10:43:00
…… ……
2020-03-28 14:15:00 2020-04-17 18:23:00
2020-03-29 20:28:00 2020-04-18 22:45:00

(1)时间校验

时间粒度不一致通常是由于在数据采集时没有设置统一的采集频率,如系统升级后采集频率发生了改变,或不同系统间的采集频率不一致,导致采集到的数据的时间粒度不一致。

cresat_time_1 cresat_time_2
2020/07/20 12:44:00 2020/8/7 15:11:30
2020/07/20 12:45:00 2020/8/7 15:12:00
2020/07/20 12:46:00 2020/8/7 15:12:30
2020/07/20 12:47:00 2020/8/7 15:13:00
2020/07/20 12:49:00 2020/8/7 15:13:30
2020/07/20 12:50:00 2020/8/7 15:14:00

(1)时间校验

时间格式不一致通常是不同系统之间设置时间字段时的采用的格式不一致导致时间格式不一致的情况,尤其是当系统中的时间字段使用字符串格式的时候。

order_time1 order_time2
2020-09-01 11:25:00 20201003122600
2020-09-01 11:30:00 20201003123100
2020-09-01 11:34:00 20201003123600
2020-09-01 11:41:00 20201003125100
2020-09-01 11:45:00 20201003125500

(1)时间校验

时区不一致通常是由于在数据传输时的设置不合理,所以导致时间字段出现不一致的情况,如由于在设置海外的服务器时没有修改时区,所以导致数据在传输回本地的服务器时因时区差异造成时间不一致。

local_sever_time global_sever_time
2020/08/07 12:12:30 2020/08/07 17:12:30
2020/08/07 12:13:00 2020/08/07 17:13:00
2020/08/07 12:13:30 2020/08/07 17:13:30
2020/08/07 12:14:00 2020/08/07 17:14:00
2020/08/07 12:14:30 2020/08/07 17:14:30

(2) 字段信息校验

同名异义:两个名称相同的字段所代表的实际意义不一致。

如下表所示,数据源A中的ID字段和数据源B中的ID字段分别描述的是商品编号和订单编号,即描述的是不同的实体。

ID_A ID_B
2003117399 1014000141
2003117402 1014000141
2003117403 4722000342
2003117407 4722000342
2003117412 4722000342

(2) 字段信息校验

异名同义:两个名称不同的字段所代表的实际意义是一致的。

如下表所示,数据源A中的sales_dt字段和数据源B中的sales_date字段都描述的为销售日期,即

A.sales_dt=B.sales_date。

A.sales_dt B.sales_date
2020/3/02 2020/3/02
2020/3/04 2020/3/04
2020/3/11 2020/3/11
2020/3/19 2020/3/19
2020/3/24 2020/3/24

2. 缺失值校验

  • 缺失值是指数据中由于缺少信息而造成的数据的聚类、分组或截断。缺失值按缺失的分布模式可以分为完全随机缺失、随机缺失和完全非随机缺失。
  • 完全随机缺失(Missing Completely At Random,MCAR)指的是数据的缺失是随机的,数据的缺失不依赖于任何不完全变量或完全变量;
  • 随机缺失(Missing At Random,MAR)指的是数据的缺失不是完全随机的,即该类数据的缺失依赖于其他完全变量;
  • 完全非随机缺失(Missing Not At Random,MNAR)指的是数据的缺失依赖于不完全变量自身。

在Python中,可以利用下表所示的缺失值校验函数检测数据中是否存在缺失值。

函数名 函数功能 所属扩展库 格式 参数及返回值
isnull 判断是否空值 pandas D.isnull() 或 pandas.isnull(D) 参数为DataFrame或pandas的Series对象,返回的是一个布尔类型的DataFrame或Series
notnull 判断是否非空值 pandas D.notnull() 或 pandas.notnull(D) 参数为DataFrame或pandas的Series对象,返回的是一个布尔类型的DataFrame或Series
count 非空元素计算 D.count() 参 数 为 DataFrame 或 pandas 的 Series 对 象 , 返 回 的 是 DataFrame中每一列非空值个数或Series对象的非空值个数

3. 异常值校验

  • 异常值是指样本中的个别值,其数值明显偏离所属样本的其余观测值。
  • 假设数据服从正态分布,一组数据中若与平均值的偏差超过两倍标准差的数据则为异常值,称为四分位距准则(IQR);与平均值的偏差超过3倍标准差的数据则为高度异常的异常值,称为3σ 原则。
  • 在实际测量中,异常值的产生一般是由于疏忽、失误或突然发生的不该发生的原因造成的,如读错、记错、仪器示值突然跳动、突然震动、操作失误等。因为异常值的存在会歪曲测量结果,所以需要检测数据中是否存在异常值。

在Python中可以利用下表中的函数进行异常值检测。

函数名 函数功能 所属扩展库 格式 参数及返回值
percentile 计算百分位数 NumPy numpy.percentile(a,q,axis =None) 参数a,接收array或类似arrary的对象,表示输入的数组。无默认值 参数q,接收float或类似arrary的对象,表示计算的百分位数,必须介于0~100。无默认值 参数axis,接收int,表示计算百分位数的轴,可选0或1。默认为None
mean 计算平均值 pandas pandas.DataFrame.mean() 接收DataFrame或pandas的Series对象
std 计算标准差 pandas pandas.DataFrame.std() 接收DataFrame或pandas的Series对象

2.2 清洗数据

  • 数据重复会导致数据的方差变小,数据分布发生较大变化。

  • 数据缺失会导致样本信息减少,不仅增加了数据分析的难度,而且会导致数据分析的结果产生偏差。

  • 异常值则会产生“伪回归”。

  • 因此需要对数据进行检测,观察数据种是否含有重复值、缺失值和异常值,并且需要对这些数据进行相应的处理。

    1. 重复值处理

    (1) 记录重复

  • 记录重复是指一个或多个特征的某条记录的值完全相同。可以通过列表(list)和集合(set)进行去重。

  • pandas提供了一个名为drop_duplicates()的去重方法。该方法只对DataFrame或Series类型有效。这种方法不会改变数据原始排列。且兼具代码简洁和运行稳定的特点,drop_duplicates()方法的基本使用格式如下:

    pandas.DataFrame(Series).drop_duplicates(self, subset=None, keep='first', inplace=False)
    
参数名称 说明
subset 接收str或sequence,表示进行去重的列。默认为None,表示全部列
keep 接收特定str,表示重复时保留第几个数据。first:保留第一个;last:保留最后一个; false:只要有重复都不保留;默认为first
inplace 接收boolean,表示是否在原表上进行操作。默认为False

(2) 特征重复

特征重复是指存在一个或多个特征名称不同,但数据完全相同的情况。结合相关的数学和统计学知识,去除连续型特征重复可以利用特征间的相似度将两个相似度为1的特征去除一个。在pandas中相似度的计算方法为corr,使用该方法计算相似度时,默认为“pearson”法,可以通过“method”参数调节。目前,还支持“spearman”法和“kendall”法。

2. 缺失值处理

(1)删除法

删除法是指将含有缺失值的特征或记录删除。删除法分为删除观测记录和删除特征两种,它属于利用减少样本量换取信息完整度的一种方法,是一种最简单的缺失值处理方法。pandas中提供了简便的删除缺失值的方法dropna()。该方法的基本使用格式如下。

pandas.DataFrame.dropna(self, axis=0, how='any', thresh=None, subset=None, inplace=False)
参数名称 说明
axis 接收0或1,表示轴向,0为删除观测记录(行),1为删除特征(列)。默认为0
how 接收特定str,表示删除的形式。any表示只要有缺失值存在就执行删除操作。all表示当且仅当全部为缺失值时执行删除操作。默认为any
subset 接收类array数据,表示进行去重的列∕行。默认为None,表示所有列∕行
inplace 接收boolean,表示是否在原表上进行操作。默认为False

(2)替换法

是指用一个特定的值替换缺失值。特征可分为数值型和类别型,两者出现缺失值时的处理方法也是不同的。

缺失值所在特征为数值型时,通常利用其均值、中位数和众数等描述其集中趋势的统计量代替缺失值;缺

失值所在特征为类别型时,则选择使用众数替换缺失值。pandas库中提供了缺失值替换的方法名为 fillna(),其基本使用格式如下。

pandas.DataFrame.fillna(value=None, method=None, axis=None, inplace=False, limit=None)
参数名称 说明
value 接收scalar、dict、Series或DataFrame,表示用于替换缺失值的值。无默认值
method 接收特定str,backfill或bfill表示使用下一个非缺失值填补缺失值;pad或ffill表示使用上一个非缺失值填补缺失值。默认为None
axis 接收0或1,表示轴向。默认为1
inplace 接收boolean,表示是否在原表上进行操作。默认为False
limit 接收int,表示填补缺失值个数上限,超过则不进行填补。默认为None

(3) 插值法

  • 删除法简单易行,但是会引起数据结构变动,样本减少;
  • 替换法使用难度较低,但是会影响数据的标准差,导致信息量变动。
  • 在面对数据缺失问题时,除了这两种方法之外,还有一种常用的方法——插值法。

常用的插值法有线性插值、多项式插值和样条插值等。

  • 线性插值是一种较为简单的插值方法,它针对已知的值求出线性方程,通过求解线性方程得到缺失值;

  • 多项式插值是利用已知的值拟合一个多项式,使得现有的数据满足这个多项式,再利用这个多项式求解缺失值,常见的多项式插值法有拉格朗日插值和牛顿插值等;

  • 样条插值是以可变样条作出一条经过一系列点的光滑曲线的插值方法,插值样条由一些多项式组成,每一个多项式都是由相邻两个数据点决定,这样可以保证两个相邻多项式及其导数在连接处连续。

  • pandas提供了对应的名为interpolate的插值方法,能够进行上述部分插值操作,但是SciPy的interpolate模块更加全面。

    3. 异常值处理

  • 异常值的存在对数据分析十分危险,如果计算分析过程的数据有异常值,那么会对结果会产生不良影响,从而导致分析结果产生偏差乃至错误。异常值的处理通常有4种方式:

    • 删除含有异常值的记录;
    • 将异常值视为缺失值,按缺失值的处理方式进行处理;
    • 用平均值修正异常值;
    • 某些情况下,异常值恰恰体现了非常重要的信息,这时,可以不处理,保留异常值。
  • 数据可视化的实际开发中,数据种类比较繁多,并频繁出现用不同的表存储不同类型的数据,但表和表之间又有联系;

  • 当数据量大时,将会使用不同的表收集不同时段的数据,这样随着数据量的增加,表的数量也会增加。

  • 如果将有关联的数据整合在一张表中,那么在对数据进行可视化和分析工作时,将会大大提高工作效率。

  • 合并数据的方法可分为堆叠合并、主键合并和重叠合并。

2.3 合并数据

1. 堆叠合并数据

  • 堆叠就是简单地将两个表拼在一起,也被称作轴向连接、绑定或连接。依照连接轴的方向,数据堆叠可分为横向堆叠和纵向堆叠。

(1)横向堆叠

  • 横向堆叠,即将两个表在X轴向拼接在一起,可以使用concat函数完成。concat函数的基本使用格式如下:

    pandas.concat(objs, axis=0, join='outer', join_axes=None, ignore_index=False, keys=None, levels=None, names=None, verify_integrity=False, copy=True)
    
参数名称 说明
objs 接收多个Series、DataFrame、Panel的组合,表示参与链接的pandas对象的列表的组合。无默认值
axis 接收0或1,表示连接的轴向。默认为0
join 接收inner或outer,表示其他轴向上的索引是按交集(inner)还是并集(outer)进行合并。默认为outer
join_axes 接收Index对象,表示用于其他n-1条轴的索引,不执行并集/交集运算
ignore_index 接收boolean,表示是否不保留连接轴上的索引,产生一组新索引range(total_length)。默认为False
keys 接收sequence,表示与连接对象有关的值,用于形成连接轴向上的层次化索引。默认为None
levels 接收包含多个sequence的list,表示在指定keys参数后,指定用作层次化索引各级别上的索引。默认为None
names 接收list,表示在设置了keys和levels参数后,用于创建分层级别的名称。默认为None
verify_integrity 接收boolearn,表示是否检查结果对象新轴上的重复情况,如果发现则引发异常。默认为False
  • 当axis=1时,concat做行对齐,然后将不同列名称的两张或多张表合并。当两个表索引不完全一样时,可以使用join参数选择是内连接还是外连接。在内连接的情况下,仅仅返回索引重叠部分。在外连接的情况下,则显示索引的并集部分数据,不足的地方则使用空值填补,其原理示意如图所示。

image-20240311125421693

(2)纵向堆叠

  • 对比横向堆叠,纵向堆叠是将两个数据表在Y轴向上拼接。append()方法和concat函数两者都可以实现纵向堆叠。

  • append()方法用于纵向合并两张表。但是append()方法实现纵向表堆叠有一个前提条件,那就是两张表的列名需要完全一致。append()方法的基本使用格式如下。

    pandas.DataFrame.append(self, other, ignore_index=False, verify_integrity=False)
    
参数名称 说明
other 接收DataFrame或Series,表示要添加的新数据。无默认值
ignore_index 接收boolean。如果输入True,会对新生成的DataFrame使用新的索引(自动产生)而忽略原来数据的索引。默认为False
verify_integrity 接收boolean。如果输入True,那么当ignore_index为False时,会检查添加的数据索引是否冲突,如果冲突,则会添加失败。默认为False
  • 使用concat函数时,在默认情况下,即axis=0时,concat做列对齐,将不同行索引的两张或多张表纵向合并。在两张表的列名并不完全相同的情况下,可join参数取值为inner时,返回的仅仅是列名交集所代表的列,取值为outer时,返回的是两者列名的并集所代表的列,其原理示意如图所示。

image-20240311125534373

(2) 主键合并

  • 主键合并,即通过一个或多个键将两个数据集的行连接起来,类似于SQL中的join。针对同一个主键存在两张包含不同字段的表,将其根据某几个字段一一对应拼接起来,结果集列数为两个元数据的列数和减去连接键的数量,如图所示。

image-20240311125604188

  • pandas库中的merge函数和join()方法都可以实现主键合并,但两者的实现方式并不相同。

  • merge函数的基本使用格式如下。

    pandas.merge(left, right, how='inner', on=None, left_on=None, right_on=None, left_index=False, right_index=False,sort=False, suffixes=('_x', '_y'), copy=True, indicator=False)
    
  • 和数据库的join一样,merge函数也有左连接(left)、右连接(right)、内连接(inner)和外连接(outer),但比起数据库SQL语言中的join和merge函数还有其自身独到之处,如可以在合并过程中对数据集中的数据进行排序等。

参数名称 说明
left 接收DataFrame或Series,表示要添加的新数据。无默认值
right 接收DataFrame或Series,表示要添加的新数据。无默认值
how 接收inner、outer、left、right,表示数据的连接方式。默认为inner
on 接收str或sequence,表示两个数据合并的主键(必须一致)。默认为None
left_on 接收str或sequence,表示left参数接收数据用于合并的主键。默认为None
right_on 接收str或sequence,表示right参数接收数据用于合并的主键。默认为None
left_index 接收boolean,表示是否将left参数接收数据的index作为连接主键。默认为False
right_index 接收boolean,表示是否将right参数接收数据的index作为连接主键。默认为False
sort 接收boolean,表示是否根据连接键对合并后的数据进行排序。默认为False
suffixes 接收接收tuple,表示用于追加到left和right参数接收数据重叠列名的尾缀默认为('_x', '_y')
  • 主键合并除了使用merge函数以外,join()方法也可以实现部分主键合并的功能,但是join()方法使用时,两个主键的名字必须相同,其基本使用格式如下。

    pandas.DataFrame.join(self, other, on=None, how='left', lsuffix='', rsuffix='', sort=False)
    
参数名称 说明
left 接收DataFrame或Series,表示要添加的新数据。无默认值
other 接收DataFrame、Series或包含了多个DataFrame的list,表示参与连接的其他DataFrame。无默认值
on 接收列名或包含列名的list或tuple,表示用于连接的列名。默认为None
how 接收特定str。inner代表内连接;outer代表外连接;left和right分别代表左连接和右连接。默认为inner
lsuffix 接收str,表示用于追加到左侧重叠列名的末尾。无默认值
rsuffix 接收str,表示用于追加到右侧重叠列名的末尾。无默认值
sort 根据连接键对合并后的数据进行排序,默认为True

(3) 重叠合并数据

  • 数据分析和处理过程中偶尔会出现两份数据的内容几乎一致的情况,但是某些特征在其中一张表上是完整的,而在另外一张表上的数据则是缺失的。这时除了将数据一对一比较,然后进行填充的方法外,还有一种方法就是重叠合并。pandas库提供了combine_first()方法进行重叠数据合并,其原理如图所示。

image-20240311125954463

combine_first()方法的基本使用格式:pandas.DataFrame.combine_first(other)
参数名称 说明
other 接收DataFrame,表示参与重叠合并的另一个DataFrame。无默认值

2.4 小结

本章主要以销售流水记录表数据为例子,实现了读取数据、处理不符合可视化要求的数据,即校验数据、清洗数据、合并数据等内容。

  • 读取数据,主要介绍了借助Pandas库,读取csv,Excel,mysql三种常见的数据文件。
  • **校验数据,**主要介绍了一致性检验、缺失值检验以及异常值的检验。
  • **清洗数据,**主要介绍了重复值、缺失值以及异常值的常见处理方式。
  • **合并数据,**主要介绍了堆叠合并数据、主键合并数据以及重叠合并数据。

三. Matplotlib数据可视化基础

1. 基础语法与常用参数

1.1 基础语法和绘图风格

在Matplotlib库中,pyplot模块基本绘图流程主要分为3个部分,如图所示。

image-20240311130214249

1. 创建画布与创建子图

  • 构建出一张空白的画布,并可以选择是否将整个画布划分为多个部分,以便于在同一幅图上绘制多个图形。
  • 当只需要绘制一幅简单图形时,创建子图这部分内容可以省略。
  • 在pyplot模块中创建画布,创建并选中子图的函数如表所示。
函数名称 函数作用
plt.figure 用于创建一个空白画布,可以指定画布大小、像素
figure.add_subplot 用于创建并选中子图,可以指定子图的行数、列数,并选中图片编号

2. 添加画布内容

  • 添加画布内容是绘图的主体部分。其中添加标题、坐标轴名称、绘制图形等步骤是并列的,没有先后顺序。
  • 读者可以先绘制图形,也可以先添加各类标签。
  • 图例只有在绘制图形之后才可进行添加。

在pyplot模块中添加各类标签和图例的函数如表所示。

函数名称 函数作用
plt.title 用于在当前图形中添加标题,可以指定标题的名称、位置、颜色、字体大小等参数
plt.xlabel 用于在当前图形中添加x轴名称,可以指定位置、颜色、字体大小等参数
plt.ylabel 用于在当前图形中添加y轴名称,可以指定位置、颜色、字体大小等参数
plt.xlim 用于指定当前图形x轴的范围,只能确定一个数值区间,而无法使用字符串标识
plt.ylim 用于指定当前图形y轴的范围,只能确定一个数值区间,而无法使用字符串标识
plt.xticks 用于指定x轴刻度的数量与取值
plt.yticks 用于指定y轴刻度的数量与取值
plt.legend 用于指定当前图形的图例,可以指定图例的大小、位置、标签等

3. 保存与展示图形

  • 保存和显示图形常用函数如表所示。
函数名称 函数作用
plt.savafig 用于保存绘制的图片,可以指定图片的分辨率、边缘的颜色等参数
plt.show 用于在本机显示图形
  • 子图绘制本质上是多个基础图形绘制过程的叠加,只是分别在同一幅画布上的不同子图上绘制图形。

4. 绘图风格

  • 在Matplotlib库中,pyplot模块的一个子模块style里面定义了很多预设风格,以便于进行风格转换。
  • 每一个预设的风格style都储存在一个以.mplstyle为后缀的style文件。读者可以在stylelib文件夹中查看。
  • 通过print(plt.style.available)命令可以查看所有预设风格的名称,使用use函数即可直接设置预设风格。
  • 读者也可以新建mplstyle文件用于自定义绘图风格。
  • 在stylelib文件夹下创建好文件并按照规范配置属性,同样能够使用use函数调用该风格,即可使用自定义的风格。

1.2 动态rc参数

  • pyplot模块使用rc配置文件自定义图形的各种默认属性,称之为rc配置或rc参数。
  • 通过修改rc参数可以修改默认的属性,包括窗体大小、每英寸的点数、线条宽度、颜色、样式、坐标轴、坐标与网络属性、文本、字体等。
  • 在Matplotlib库载入时会调用rc_params函数,并将得到的配置字典保存到rcParams变量中。
  • 可通过修改字典的方式或用matplotlib.rc()函数修改rc参数。
  • 修改默认rc参数后,图形对应属性将会发生改变。
  1. 线条常用的rc参数

    针对线条常用的rc参数名称及其说明如表所示。

rc参数名称 说明
lines.linewidth 接收0~10之间的数值,表示线条宽度。默认为1.5
lines.linestyle 接收“-”“--”“-.”“:”4种,表示线条样式。默认为“-”
lines.marker 接收“o” “D” “h” “.” “,” “S”等20种,表示线条上点的形状。无默认值
lines.markersize 接收0~10之间的数值,表示点的大小。默认为1

lines.linestyle参数4种取值的意义如表所示。

linestyle取值 意义
- 实线
-- 长虚线
-. 点线
: 短虚线

lines.marker参数的20种取值及其所代表的意义如表所示。

marker取值 意义 marker取值 意义 marker取值 意义
o 圆圈 像素 v 一角朝下的三角形
D 菱形 + 加号 < 一角朝左的三角形
h 六边形1 None > 一角朝右的三角形
H 六边形2 . ^ 一角朝上的三角形
- 水平线 s 正方形 \ 竖线
8 八边形 * 星号 x X
p 五边形 d 小菱形
  1. 坐标轴常用的rc参数

坐标轴常用rc参数名称及其说明如表所示。

rc参数名称 说明
axes.facecolor 接收颜色简写字符,表示背景颜色。默认为w
axes.edgecolor 接收颜色简写字符,表示边线颜色。默认为k
axes.linewidth 接收0~1的float,表示轴线宽度。默认为0.8
axes.grid 接收bool,表示添加网格。默认为False
axes.titlesize 接收small、medium、large,表示标题大小。默认为large

坐标轴常用rc参数名称及其说明如表所示。

rc参数名称 说明
axes.labelsize 接收small、medium、large,表示标题大小。默认为medium
axes.labelcolor 接收颜色简写字符,表示轴标颜色。默认为k
axes.spines.{left,bottom,top,tight} 接收bool,表示添加坐标轴。默认为True
axes.{x,y}margin 接收float,表示轴余留。默认为0.05
  1. 字体常用的rc参数

    字体常用rc参数名称及其说明如表所示。

rc参数名称 说明
font.family 接收serif、sans-serif、cursive、fantasy、monospace这5种str,表示字体族,每一个族对应多种字体。默认为sans-serif
font.style 接收normal(roman)、italic、oblique这3种str,表示字体风格,正常或罗马体及斜体。默认为normal
font.variant 接收normal或small-caps,表示字体变化。默认为normal
font.weight 接收normal、bold、bolder、lighter这4种str及100、200、…、900,表示字体重量。默认为normal
font.stretch 接收ultra-condensed、extra-condensed、condensed、semi-condensed、normal、semiexpanded、expanded、extra-expanded、ultra-expanded、wider、narrower这11种str, 表示字体延伸。默认为normal
font.size 接收float,表示字体大小。默认为10
  • 默认的pyplot字体并不支持中文字符的显示,可通过修改font.sans-serif参数来修改绘图时的字体,使得图形可以正常显示中文。
  • 修改字体后,将会导致坐标轴中负号“-”无法正常显示,所以需要同时修改axes.unicode_minus参数。
  • 除字体与符号编码参数外,如果希望rc参数恢复到缺省的配置,可以调用matplotlib.rcdefaults函数。

2. 分析特征间的关系

  • 散点图和折线图是数据分析最常用的两种图形。
  • 这两种图形都能够分析不同数值型特征间的关系。
  • 散点图主要用于分析特征间的相关关系。
  • 折线图则用于分析自变量特征和因变量特征之间的趋势关系。

2.1 绘制散点图

在pyplot中可以使用scatter函数绘制散点图,其使用格式如下。

matplotlib.pyplot.scatter(x, y, s=None, c=None, marker=None, cmap=None, norm=None, vmin=None, vmax=None, alpha=None, linewidths=None, verts=None, edgecolors=None, hold=None, data=None, **kwargs)

函数常用参数及其说明如下表所示。

参数名称 说明
x,y 接收array,表示x轴和y轴对应的数据。无默认值
s 接收数值或一维的array。表示指定点的大小,若传入一维array则表示每个点的大小。无默认值
c 接收颜色或一维的array。表示指定点的颜色,若传入一维array则表示每个点的颜色。无默认值
marker 接收特定str,表示绘制的点的类型。无默认值
alpha 接收0~1的float,表示点的透明度。无默认值

2.2 绘制折线图

在pyplot中可以使用plot函数绘制折线图,其基本使用格式如下。

matplotlib.pyplot.plot(*args, **kwargs)

plot函数在官方文档的语法中只要求填入不定长参数,实际可以填入的主要参数如表所示。

参数名称 说明
x,y 接收array,表示x轴和y轴对应的数据。无默认值
color 接收特定str,表示指定线条的颜色。无默认值
linestyle 接收特定str,表示指定线条类型。默认为“-”
marker 接收特定str,表示绘制的点的类型。无默认值
alpha 接收0~1的float,表示点的透明度。无默认值

  • color参数的8种常用颜色的缩写如表所示。
颜色缩写 代表的颜色 颜色缩写 代表的颜色
b 蓝色 m 品红
g 绿色 y 黄色
r 红色 k 黑色
c 青色 w 白色
  • plot函数一次可以接收多组数据,添加多条折线图,同时还可以分别定义每条折线的颜色、点的形状和类型,将折线的颜色、点的形状和类型连接在一起用一个字符串表示。

2.3 分析特征内部数据分布与分散状况

饼图、柱形图和箱线图是另外三种数据分析常用的图形,主要用于分析数据内部的分布状态和分散状态。

  • 饼图倾向于查看各分组数据在总数据中的占比。
  • 柱形主要用于查看各分组数据的数量分布,以及各个分组数据之间的数量比较。
  • 箱线图的主要作用是发现整体数据分布分散情况。

2.4 绘制饼图

在pyplot中可以使用pie函数绘制饼图,其基本使用格式如下。

matplotlib.pyplot.pie(x, explode=None, labels=None, colors=None, autopct=None, pctdistance=0.6, shadow=False, labeldistance=1.1, startangle=None, radius=None, counterclock=True, wedgeprops=None, textprops=None, center=(0, 0), frame=False, hold=None, data=None)

pie函数常用参数及其说明如表所示。

参数名称 说明
x 接收array,表示用于绘制撇的数据。无默认值
explode 接收array,表示指定每一项距离饼图圆心为n个半径 。无默认值
labels 接收array,表示指定每一项的名称。无默认值
color 接收特定str或包含颜色字符串的array,表示饼图颜色。无默认值
autopct 接收特定str,表示指定数值的显示方式。无默认值
pctdistance 接收float,表示指定每一项的比例和距离饼图圆心n个半径。默认为0.6
labeldistance 接收float,表示指定每一项的名称和距离饼图圆心n个半径 。默认为1.1
radius 接收float,表示饼图的半径。默认为1

2.5 绘制柱形图

在pyplot中可以使用bar函数绘制柱形图,其基本使用格式如下。

matplotlib.pyplot.bar(*args, **kwargs)

bar函数在官方文档中只要求输入不定长参数,但其主要参数如表所示。

参数名称 说明
x 接收array,表示x轴的位置序列。无默认值
height 接收array,表示x轴所代表数据的数量(长方形长度)。无默认值
width 接收0~1之间的float,表示指定直方图宽度。默认为0.8
color 接收特定str或包含颜色字符串的array,表示颜色。无默认值

2.6 绘制箱线图

在图pyplot中可以使用boxplot函数绘制箱线图,其基本使用格式如下。

matplotlib.pyplot.boxplot(x, notch=None, sym=None, vert=None, whis=None, positions=None, widths=None, patch_artist=None, bootstrap=None, usermedians=None, conf_intervals=None, meanline=None, showmeans=None, showcaps=None, showbox=None, showfliers=None, boxprops=None, labels=None, flierprops=None, medianprops=None, meanprops=None, capprops=None, whiskerprops=None, manage_xticks=True, autorange=False, zorder=None, hold=None, data=None)

boxplot函数常用参数及其说明如表所示。

参数名称 说明
x 接收array,表示用于绘制箱线图的数据。无默认值
notch 接收bool,表示中间箱体是否有缺口。无默认值
sym 接收特定str,指定异常点形状。无默认值
vert 接收bool,表示图形是横向纵向或横向。无默认值
positions 接收array,表示图形位置。无默认值
widths 接收scalar或array,表示每个箱体的宽度。无默认值
labels 接收array,指定每一个箱线图的标签。无默认值
meanline 接收bool,表示是否显示均值线。默认为False

2.7 小结

本章介绍了Matplotlib库的基础语法与常用参数。

  • 分析特征间相关关系的散点图的绘制方法。
  • 分析特征间趋势关系的折线图的绘制方法。
  • 分析特征内部数据分布的饼图、条形图和柱形图的绘制方法。
  • 分析特征内部数据分散情况的箱线图的绘制方法。

四. seaborn绘制进阶图形

1.熟悉seaborn绘图基础

1.1 了解seaborn中的基础图形

  • seaborn库绘制的图形色彩、视觉令人耳目一新,通常将它视为Matplotlib库的补充,而不是替代物。

    seaborn库绘制的常用图形有散点图、折线图、热力图、条形图、箱线图、网格图等,在绘制这些图形之前需要掌握seaborn库的绘图基础,其中包括基础图形、绘图风格和调色板等。

  • 在seaborn库中包含了大量常用的基础图形。以某企业人员离职率数据为例,分别使用Matplotlib库与 seaborn库绘图不同薪资分布的散点图。

    image-20240323111145068

image-20240323111121613

1.2 了解seaborn的绘图风格

  • 一个引人入胜、赏心悦目的图形不仅更容易挖掘数据中的细节,而且能有利于向读者交流分析,并使读者更容易被记住。

  • 虽然Matplotlib库是高度可定制的,但是很难根据需求确定需要调整的参数,且调整比较复杂。而 seaborn库包含了许多自定义主题和高级界面,可以用于控制Matplotlib图形的外观。例如,自定义一个偏移直线图像,用于展示绘图风格。

    image-20240323111302550

    image-20240323111313510

    1. 主题样式

  • seaborn库中含有darkgrid(灰色背景+白网格)、whitegrid (白色背景+黑网格)、dark(仅灰色背景)、white(仅白色背景)和ticks(坐标轴带刻度)5种预设的主题。其中,darkgrid与 whitegrid主题有助于在绘图时进行定量信息的查找,dark与

    white主题有助于防止网格与表示数据的线条混淆,ticks主题有助于体现少量特殊的数据元素结构。

  • seaborn图形的默认主题为darkgrid。读者可以使用set_style函数修改主题及其默认参数。set_style函数的使用格式如下。

    seaborn.set_style(style=None, rc=None)
    

image-20240323111423332

2. 元素缩放

  • 在seaborn库中通过set_context函数可以设置输出图片元素的大小尺寸。set_context函数的使用格式如下。

    seaborn.set_context(context=None, font_scale=1, rc=None)
    
  • context参数可选择paper、notebook、talk和poster类型,默认为notebook。使用set_context函数只能修改 plotting_context函数显示的参数,plotting_context函数通过调整参数改变图中标签、线条或其他元素的大小,但不会影响整体样式。

3. 边框控制

  • 在seaborn库中,可以使用despine函数移除任意位置的边框,调节边框的位置,修剪边框的长短。despine 函数的基本使用格式如下。

    seaborn.despine(fig=None, ax=None, top=True, right=True, left=False, bottom=False, offset=None, trim=False)
    
  • despine函数的主要参数及其说明如表所示。

参数名称 说明
top 接收bool,表示删除顶部边框。默认为True
right 接收bool,表示删除右侧边框。默认为True
left 接收bool,表示删除左侧边框。默认为False
bottom 接收bool,表示删除底部边框。默认为False
offset 接收int或dict,表示边框与轴的距离。无默认值
trim 接收bool,表示将边框限制为每个非扭曲轴上的最小和最大主刻度。默认为False

使用despine函数可以绘制不同边框的图形以及改变坐标轴的距离。

image-20240323111944529

1.3 熟悉seaborn的调色板

  • 颜色在可视化中非常重要,可用于代表各种特征,并且提高整个图的观赏性。如果有效地使用颜色,那么可以显示数据中的图案;如果颜色使用不当,那么将会隐藏数据中图案。由此可见,调色板是seaborn库中绘制图形的基础。
  • 通常在不知道数据具体特征的情况下,将无法知道使用什么类型的调色板或颜色映射最优。因此,将使用定性调色板、连续调色板和离散调色板3种不同类型的调色板,用于区分使用color_palette函数。

常用于调色板的函数及其作用如表所示。

函数 作用
hls_palette 用于控制调色板颜色的亮度和饱和
xkcd_palette 使用xkcd颜色中的颜色名称创建调色板
cubehelix_palette 用于创建连续调色板
light_palette 用于创建颜色从浅色或深色的连续调色板
dark_palette 用于创建颜色从深色到深色混合的连续调色板
choose_light_palette 启动一个交互式小部件以创建一个浅色连续调色板
choose_dark_palette 启动一个交互式小部件以创建一个深色连续调色板
diverging_palette 用于创建离散调色板
choose_diverging_palette 启动交互式小部件选择不同的调色板,与diverging_palette函数功能相对应
color_palette 用于返回定义调色板的颜色列表或连续颜色图
set_palette 用于设置调色板,为所有图设置默认颜色周期

1. 定性调色板

(1)使用圆形颜色系统

  • 当有一个任意数量的类别需要区分时,最简单的方法是在圆形颜色空间中绘制均匀间隔的颜色(色调在保持亮度和饱和度不变的同时变化)。在需要使用比默认颜色循环中设置的颜色更多时,常使用圆形颜色系统设置图案颜色。最常用的方法是使用HLS(H表示色调、L表示亮度、S表示饱和度)颜色空间,这是一个RGB(R代表红色、G代表绿色、B代表蓝色)值的简单转换。
  • 由于人类视觉系统的工作方式,会导致在RGB度量上强度一致的颜色在视觉中并不平衡。例如,人们认为黄色和绿色是相对较亮的颜色,而蓝色则相对较暗,这可能会出现视觉系统与HLS系统不一致的问题。
  • 为了解决这一问题,seaborn库提供了一个HUSL系统的接口,也使得选择均匀间隔的色彩变得更加容易,同时保持亮度和饱和度更加一致。

(2)使用xkcd颜色

xkcd是对随机的RGB颜色空间的命名,产生了954个颜色,可以随时通过xkcd_rgb字典装饰器调用,也可以通过xkcd_palette函数自定义调色板。

2. 连续调色板

(1)Color Brewer库

  • 在Color Brewer库中含有大量的连续调色板,以调色板中的主色(或颜色)命名。如果需要反转亮度渐变,那么可以为调色板名称添加后缀“_r”,即可实现。如果颜色鲜艳的线难以区分,那么seaborn库增加了一个允许创建没有动态范围的“dark”面板,只需在名称添加后缀“_d”,即可切换至“dark”面板。
  • 在Color Brewer库中,连续调色板名称及渐变顺序如表所示。
名称 渐变顺序 名称 渐变顺序 名称 渐变顺序
YlOrRd 黄橙红 Purples Greys 白色
YlOrBr 黄橙棕 PuRd 紫红 Greens 绿
YlGnBu 黄绿蓝 PuBuGn 紫蓝绿 GnBu 绿蓝
YlGn 黄绿 PuBu 紫蓝 Bupu 蓝紫
Reds OrRd 黄色 BuGn 蓝绿
RdPu 红紫 Oranges 黑色 Blues

(2)cubehelix调色板

  • 从cubehelix制作连续调色板,将产生一个具有线性增加或降低亮度的色图,这意味着映射信息会在保存为黑色和白色(为印刷)时或被一个色盲的人浏览时可以得以保留显示。在seaborn库中,可使用 cubehelix_palette函数制作cubehelix调色板。 cubehelix_palette函数的使用格式如下。

    seaborn.cubehelix_palette(n_colors=6, start=0, rot=0.4, gamma=1.0, hue=0.8, light=0.85, dark=0.15, reverse=False, as_cmap=False)
    
  • cubehelix_palette函数的常用参数及其说明如表所示。

**参数名称 ** 说明
n_color 接收int,表示调色板中颜色数目。默认为6
start 接收0~3的float,表示指定开始时的色调。默认为0
rot 接收float。表示指定在调色板旋转范围(次数)。默认为0.4
light 接收0~1的float,表示颜色明亮程度。默认为0.85
dark 接收0~1的float,表示颜色深暗程度。默认为0.15
as_cmap 接收bool,表示是否返回Matplotlib颜色映射对象。默认为False

(3)自定义连续调色板

  • 对于自定义连续调色板,可以调用light_palette函数和dark_palette函数进行单一颜色“播种”,种子可以产生单一颜色从浅色或深色的调色板。如果使用的是IPython notebook(供Jupyter notebooks使用的一个Jupyter内核组件),light_palette函数和dark_palette函数还可以分别与choose_light_palette 函数和choose_dark_palette函数启动交互式小部件创建单一颜色的调色板。
  • 任何有效的Matplotlib颜色都可以传递给light_palette函数和dark_palette函数,包括HLS颜色空间或 HUSL颜色空间的RGB元组和xkcd颜色。

3. 离散调色板

(1)默认中较好的离散调色板

  • 离散调色板在用于大的、低的值和大的、高的值上都有非常重要的数据。数据中通常有一个定义明确的中点。例如,如果需要绘制某个基线时间点的温度变化,那么使用偏差色图显示相对减少的区域和相对增加的区域将会相对较好。
  • 选择离散调色板的规则是,起始色调具有相似的亮度和饱和度,并且经过色调偏移后在中点处和谐的相遇。同时,需要尽量避免使用红色与绿色。
  • 在Color Brewer库中有一组精心设计的离散颜色映射,在Matplotlib库中内置了coolwarm离散调色板。

(2)自定义离散调色板

在seaborn库中可以使用diverging_palette函数(及choose_diverging_palette函数交互式小部件)为离散数据创建自定义调色板。diverging_palette函数可使用HULS颜色空间创建不同的调色板。

diverging_palette函数的使用格式如下。

seaborn.diverging_palette(h_neg, h_pos, s=75, l=50, sep=1, n=6, center='light', as_cmap=False)

diverging_palette函数的常用参数及其说明如表所示。

参数名称 说明
h_neg 接收0~359之间的float,表示调色板负面范围色调。无默认值
h_pos 接收0~359之间的float,表示调色板正面范围色调。无默认值
s 接收0~100之间的float,表示两个范围色调饱和度。默认为75
l 接收0~100之间的float,表示两个范围色调亮度。默认为50
n 接收int,表示调色板颜色数目。默认值为6
center 接收light或dark,表示调色板中心是明或暗。默认为light
as_cmap 接收bool,表示是否返回Matplotlib颜色映射对象。默认为False

4. 设置默认调色板

color_palette函数还有一个与之相对应的函数,即set_palette函数。set_palette函数接受与color_palette函数相同的参数,可更改默认的Matplotlib参数,更改后所有的调色板将变为设置调色板配置。使用set_palette 函数设置调色板。

image-20240323112414931

image-20240323112426429

2. 绘制关系图

2.1 绘制散点图

  • 关系图可用于了解数据集中变量间的相互关联,探查一个变量与另外一个或几个变量的相关关系。其中,最基本的关系图是散点图、折线图和热力图,使用简单且易于理解的数据表示方法,但可以表示复杂的数据集结构。

  • 在seaborn库中提供了scatterplot函数、lineplot函数、heatmap函数、relplot函数,在Matplotlib库的基础上优化了绘制散点图、折线图和热力图,并且通过色调、大小、样式增强显示。

    在seaborn库中,可以使用scatterplot函数绘制散点图。scatterplot函数的使用格式如下:

    seaborn.scatterplot(x=None, y=None, hue=None, style=None, size=None, data=None, palette=None, hue_order=None, hue_norm=None, sizes=None, size_order=None, size_norm=None, markers=True, style_order=None, x_bins=None, y_bins=None, units=None, estimator=None, ci=95, n_boot=1000, alpha=None, x_jitter=None, y_jitter=None, legend='auto', ax=None, **kwargs)
    

scatterplot函数的主要参数及其说明如表所示。

参数名称 说明
x,y 接收array、str、series,表示输入变量、字符串应该是data中对应变量名,使用series将会在轴上显示名称。无默认值
data 接收DataFrame,表示用于绘图的数据集。默认为None
hue 接收data中变量名,表示传入分类变量,以颜色分类。默认为None
size 接收data中变量名,表示传入分类变量,以标记大小分类。默认为None
sizes 接收list、dict、tuple,表示确定不同级别的size,可以一一映射,也可以设置最大最小范围。默认为None
style 接收data中变量名,表示传入分类变量,以标记形状分类。默认为None
markers 接收bool、list、dict,表示确定不同级别的style。默认为None
alpha 接收float、auto,表示点的透明度。默认为auto
legend 接收brief、full、False,表示图形图例绘制形式。默认为auto
palette 接收调色板,表示改变默认绘图颜色。默认为None
  • 离职率(Dimission Rate)是企业用于衡量企业内部人力资源流动状况的一个重要指标,通过对离职率的分析,可以了解企业对员工的吸引和满意情况。而企业、评价分数、平均工作时间等各种因素都会对人员流动造成一定的影响。
  • 人员离职率数据的字段说明如表所示。
字段名称 字段含义 示例
满意度 员工满意程度,取值为0~1之间,得分越高代表员工对企业越满意 0.38
评分 最近一次的员工表现度评分,取值为为0~1之间,得分越高代表员工表现越好) 0.53
总项目数 员工做过的总项目数 2
每月平均工作小时数 每月的平均工作时长(单位:小时) 157
工龄 员工在公司的时间(单位:年) 3
工作事故 员工是否在职期间有过工伤(0表示没有,1表示有) 0
离职 是否离职(0表示在职,1表示离职) 1
5年内升职 最近5年是否有过升职(0表示没有,1表示有) 0
部门 员工所属的部门,包括销售部、财务部、人力资源部、IT部、管理部、技术部、支持部、产品开发部、市场部、研发部 销售部
薪资 薪资的水平,包括低、中、高
  • 基于人员离职率数据,绘制散点图分析产品开发部已离职的员工的评分与平均工作时间。当添加第3个分类变量时,可以通过对点着色(故称色调语义)和改变标记来显示分类变量,以突显每个类别。如图所示。
  • 由图可知,在产品开发部已经离职的员工中,员工平均每个月工作时间越短,对员工的评价分数较低,员工薪水也相对较低;对员工评价分数较高,员工薪水大多数处于中薪阶段,高薪的人员较少。说明员工平均月工作时间不仅影响企业对员工的评分高低,也可能影响员工薪水的高低。除此之外,读者还可以使用markers参数根据自身的需求为分组点设置自定义的标记。

2.2 绘制折线图

在seaborn库中,可以使用lineplot函数绘制折线图。默认情况下,会使用每个x值对应的多个y值的均值绘制折线,并显示该估计值的置信区间带。lineplot函数的使用格式如下。

seaborn.lineplot(x=None, y=None, hue=None, size=None, style=None, data=None, palette=None, hue_order=None, hue_norm=None, sizes=None, size_order=None, size_norm=None, dashes=True, markers=None, style_order=None, units=None, estimator='mean', ci=95,n_boot=1000, seed=None, sort=True, err_style='band', err_kws=None, legend='auto', ax=None, **kwargs)

lineplot函数的部分参数及其说明如表所示。

参数名称 说明
x,y 接收array、str、series,表示输入变量、字符串应该是data中对应变量名,使用 series将会在轴上显示名称。无默认值
data 接收DataFrame,表示用于绘图的数据集。默认为None
dashes 接收bool、list、dict,表示确定不同级别的style。默认为True
estimator 接收pandas方法、可调用函数、None。表示y在同一x级别的聚合方法。默认为 mean
ci 接收int、sd、None,表示使用estimator参数聚合的置信区间大小,sd表示数据标准差。默认为95
n_boot 接收int,表示计算置信区间的数。默认为1000
sort 接收bool,表示按照x和y变量排序或出现顺序排序。默认为True
err_style 接收band、bars,表示是否用半透明误差带或离散误差棒绘制置信区间。默认为 band
err_band 接收dict,表示用于控制误差线条的参数。默认为None

波士顿房价数据的字段说明如表所示。

字段名称 字段含义 示例
犯罪率 波士顿城镇人均犯罪率 0.00632
居住面积占比 住房占地面积超过25000平方英尺的住宅用地比例 18.0
商业用地占比 每个城镇非零售业务的比例 2.31
河流穿行 是否被Charles河流穿过,1表示是,0表示否 0
一氧化氮含量 一氧化氮浓度(每千万份) 0.538
房间数 每间住宅的平均房间数 6.575
住宅占比 早于1940年建造的住宅单位比例 65.2
平均距离 距离5个就业中心区域的加权平均距离 4.0900
可达性指数 径向高速公路的可达性指数 1
财产税 每1万美元的全额物业税率 296
学生与老师占比 城镇中的学生与教师比例 15.3
黑人指标 城镇中的黑人比例指标 396.90
低收入人群 反映当地低收入人群占总人口的比例 4.98
房屋价格 自住房屋价格的中位数(单位:1000美元) 24.0

基于波士顿房价数据,绘制房间数和房屋价格的折线图。

  • 由图可知,折线具有较大的波动性,但整体呈现向上的趋势,可以大致认为当房间数相对较少时,房屋价格也相对较低;当房间数相对较多时,房屋价格逐渐升高。

  • 为分析IT部部门中员工工龄与评分的关系,基于人员离职率数据,绘制IT部部门员工工龄和年度评分折线图。

  • 由图可知,在离职为1的员工中,工龄在2~3时,评分逐渐降低;工龄在3~5时,员工评分随着工龄的增大而增大;工龄在5以上时,评分又相对降低。在离职为0的员工中,工龄在6到7之间的员工评分有大幅度的变动,其余工龄阶段的员工评分在0.7上下。

2.3 绘制热力图

矩阵图是一种通过多因素综合思考,探索问题的方法。从问题事项中寻找成对的因素群,分别排列成行和列,从而找出其中行与列的相关性或相关程度大小。使用矩阵图可以同时评估多个变量之间的相关关系,常见的矩阵图为热力图。

  • 在seaborn库中,可以使用heatmap函数绘制热力图。heatmap函数的使用格式如下。

    seaborn.heatmap(data, vmin=None, vmax=None, cmap=None, center=None, robust=False, annot=None, fmt='.2g', annot_kws=None, linewidths=0, linecolor='white', cbar=True, cbar_kws=None, cbar_ax=None, square=False, xticklabels='auto', yticklabels='auto', mask=None, ax=None, **kwargs)
    

heatmap函数的主要参数及说明如表所示。

参数名称 说明
data 接收可转换为ndarray的二维矩形数据集,表示用于绘图的数据集。无默认值
vmin,vmax 接收float,表示颜色映射的值得范围。默认为None
cmap 接收色彩映射或颜色列表,表示数值到颜色空间的映射。默认为None
center 接收float,表示以0为中心发散颜色。默认为None
robust 接收bool,如果为True且vmin或vmax不存在,则使用鲁棒分位数表示映射范围。 默认为False
annot 接收bool或矩形数据集,表示是否在每个单元格显示数值。默认为None
fmt 接收str,表示传递给FacetGrid的其他参数。默认为.2g
linewidths 接收float,表示划分每个单元的线宽。默认为0
linecolor 接收颜色str,表示划分每个单元的线条颜色。默认为white
square 接收bool,表示是否使每个单元格为方形。默认为False

基于波士顿房价数据绘制热力图。为了更加细节的显示出数据特点,可以添加数据标记,即设置参数annot=True,辅助增强显示效果。如图所示。

热力图添加数据显示,可以清晰的观察到不同变量之间的相关性大小。
image-20240323113538716

2.4 绘制矩阵网格图

  • 当数据增加到中等维度甚至更多时,在一个绘图面绘制图形会显得相对“拥挤”。而将数据分成不同子集,在多个绘图面分别绘制图形将是一个较好的方法,这种绘图方式被称为网格图。Matplotlib库能够较好的使用子图,用于“手动”分组数据并绘制多个面图形,seaoren库在Matplotlib库的基础上直接使用数据集 “自动”分组绘制网格图。但是,seaoren库绘制网格图要求数据必须是整洁的数据框形式。

  • PairGrid类可用于绘制数据中程度关系的网格图。PairGrid类将数据集中的每个变量映射到多个网格中的列和行,并可以使用不同的绘图函数绘制上三角和下三角的双变量图,显示数据集中每个变量的两两之间的相关关系。此外,还可以在对角线上显示每个变量的边缘分布。PairGrid类的基础使用格式如下。

    seaborn.PairGrid(data, hue=None, hue_order=None, palette=None, hue_kws=None, vars=None, x_vars=None, y_vars=None, corner=False, diag_sharey=True, height=2.5, aspect=1, layout_pad=0.5, despine=True, dropna=True, size=None)
    

PairGrid类的部分参数及其说明如表所示。

参数名称 说明
hue_kws 接收param dict,表示设置每个子图绘图元素的颜色变化(如散点图的标记颜色)。默认为None
vars 接收list,表示data中使用变量,否则使用所用numeric类型变量。默认为None
{x,y}_vars 接收list,表示选择行和列变量,即自定义图形。默认为None
dropna 接收bool,表示是否在删除含有缺失值得样本。默认为True
  • PairGrid类同样在创建完网格图对象后,需要在每个绘图面绘制子图。PairGrid类中可使用以下5种函数进行区域绘图。

    • map函数可在所有区域绘制图形。
    • map_lower与map_upper函数可分别在下三角与上三角区域绘制图形。
    • map_diag函数与map_offdiag函数可分别在对角线和非对角线区域绘制图形。

基于波士顿房价数据绘制犯罪率、一氧化氮含量、房间数与房屋价格两两之间的相关性。

  • 由图可知,房间数目与房价呈正相关,犯罪率与房价呈负相关。

image-20240323113930027

类可以用hue参数表示第3个类别变量。基于人员离职率数据,对销售部已离职的员工数据绘制不同颜色的数据子集。

  • 由图可知,在网格图中满意度和评分表示了行和列,并使用不同的灰度展示了薪资的不同类别。

image-20240323113958441

2.5 绘制关系网格组合图

relplot函数是基于FacetGrid类的,可以实现统一访scatterplot函数和lineplot函数绘制多图网格的关系图。 relplot函数的使用格式如下:

seaborn.relplot(x=None, y=None, hue=None, size=None, style=None, data=None, row=None, col=None, col_wrap=None, row_order=None, col_order=None, palette=None, hue_order=None, hue_norm=None, sizes=None, size_order=None, size_norm=None, markers=None, dashes=None, style_order=None, legend='auto', kind='scatter', height=5, aspect=1, facet_kws=None, units=None, **kwargs)

relplot函数通过kind参数选择要使用的绘图函数,通过col和row参数控制网格图的行列。relplot函数的部分参数及说明如表所示。

参数名称 说明
x,y 接收data中变量名。只能是定量变量。默认为None
data 接收DataFrame,表示用于绘图的数据集。默认为None
row,col 接收data中变量名,表示传入分类变量,决定网格图的分面。默认为None
row_order,col_order 接收list,表示传入分类变量类别名称列表并以此为顺序。默认为None
kind 接收scatter、line,表示选择绘图函数。默认为scatter
height 接收scalar,表示网格图的高度。默认为5
aspect 接收scalar,表示网格图的宽度。默认为1
facet_kws 接收dict,表示传递给FacetGrid的其他参数。默认为None

人员离职率数据,根据销售部已离职的员工数据,通过relplot函数绘制单构面散点图。

  • 由图可知,在销售部部门且已经离职的员工中,人员评估分数越高,员工对公司的满意度越高。

image-20240323114237617

根据部门为IT部的数据,传入分类变量薪资和工作事故到col和row中,绘制网格图,设置col_wrap 参数可以控制列数

  • 由图可知,五年内是否有晋升和工作是否出现事故,以及员工的薪水,都影响着IT部部门的人员流动。

image-20240323114259249

image-20240323114307203

3. 绘制分类图

3.1 绘制条形图

在seaborn库中的分类图将分类变量每个级别的每个观察结果显示出来,显示每个观察分布的抽象表示,即使用分类数据进行绘图。分类图包括了条形图、单变量分布图、分类散点图、增强箱线图和分类网格组合图。

  • 在seaborn库中,可以使用barplot函数绘制条形图。barplot函数的基本使用格式如下:

    seaborn.barplot(x=None, y=None, hue=None, data=None, order=None, hue_order=None, estimator=\<function mean\>, ci=95, n_boot=1000, units=None, seed=None, orient=None, color=None, palette=None, saturation=0.75, errcolor='.26', errwidth=None, capsize=None, dodge=True, ax=None, **kwargs)
    

barplot函数的常用参数及其说明如表所示。

参数名称 说明
x,y 接收array、str、series,表示输入变量、字符串应该是data中对应变量名,使用 series将会在轴上显示名称。无默认值
hue 接收data中变量名,表示传入分类变量,以颜色分类。默认为None
data 接收DataFrame、array或list of arrays,表示用于绘图的数据集。默认为None
order 接收lists of strings,表示绘制分类级别。默认值为None
color 接收特定str或包含颜色字符串的array,表示所有元素的颜色或渐变调色板的种子。 默认为None
palette 接收调色板、list或dict,表示用于改变默认绘图颜色。默认为None

基于人员离职率数据,使用barplot函数绘制各部门人员总数条形图。 由图可知,销售部部门的人数相对较多,管理部部门的人数相对较少。

当条形图需要显示每个类别中的观察数量,而不是计算第二个变量的统计量时,可以使用计数图实现。

计数图可以认为是应用于到分类变量,比较类别间计数差的直方图。

在seaborn库中,可以使用countplot函数绘制计数图。countplot函数的使用格式如下。

seaborn.countplot(x=None, y=None, hue=None, data=None, order=None, hue_order=None, orient=None, color=None, palette=None, saturation=0.75, dodge=True, ax=None, **kwargs)

countplot函数的常用参数及其说明如表所示。

参数名称 说明
x,y 接收array、str、series,表示输入变量、字符串应该是data中对应变量名,使用series将会在轴上显示名称。无默认值
hue 接收data中变量名,表示传入分类变量,以颜色分类。默认为None
data 接收DataFrame,表示用于绘图的数据集。默认为None
color 接收特定str或包含颜色字符串的array,表示图形的颜色。默认为None
palette 接收调色板,表示用于改变默认绘图颜色。默认为None

countplot函数不能同时输入x与y参数,只能分开输入在不同轴上显示,且计数图没有误差棒。基于人员离职率数据绘制x轴与y轴显示数据的计数图。

由图可知,不同工龄的员工数量,其中工龄为3的员工数量最多,其次是工龄为2和4的,工龄为7、8、10的员工数量都相对较少,说明了公司员工在工作到一定时间后有离职的情况。

3.2 绘制单变量分布图

  • 直方图是一种对数据分布情况的图形表示,是一种二维统计图表,它的两个坐标分别是统计样本和该样本对应的某个属性的度量,以长条图(bar)的形式具体表现。直方图即为单变量分布图。在seaborn库中,可以使用distplot函数绘制单变量分布。distplot函数的使用格式如下。

    seaborn.distplot(a=None, bins=None, hist=True, kde=True, rug=False, fit=None, hist_kws=None, kde_kws=None, rug_kws=None, fit_kws=None, color=None, vertical=False, norm_hist=False, axlabel=None, label=None, ax=None, x=None)
    
  • distplot函数的部分参数及其说明如表所示。

参数名称 说明
a 接收series、list、array,表示观察的数据。如果是具有name属性的series对象则该名称将用于标记数据轴。默认为None
bins 接收int,表示长方形数目,如hist函数bins参数。默认为None
hist 接收bool,表示是否绘制直方图。默认为True
kde 接收bool,表示是否绘制高斯核密度估计。默认为True
rug 接收bool,表示是否添加分布观测刻度。默认为False
fit 接收随机变量对象,用于拟合分布。默认为None
color 接收特定str,表示除拟合曲线外的所有内容颜色。默认为None
{hist,kde,rug,fit}_kws 接收字典,表示底层绘图函数的关键字参数。默认为None
  • 基于波士顿房价数据绘制单变量分布图。

  • 由图可知,每1万美元的全额物业税率,即财产税,主要集中在200~400和600~700区间,且在200~400区间的数量相关较大。

3.3 绘制分类散点图

1. Stripplot函数

  • 使用stripplot函数绘制分布散点图,是显示分类变量级别中某些定量变量的值的一种简单方法。分类散点图可以单独的显示,但是有时候也可以作为其他分类图的辅助,用于显示所有的观察结果和基本分布。 stripplot函数的使用格式如下。

    seaborn.stripplot(x=None, y=None, hue=None, data=None, order=None, hue_order=None, jitter=True, dodge=False, orient=None, color=None, palette=None, size=5, edgecolor='gray', linewidth=0, ax=None, **kwargs)
    
  • stripplot函数的部分参数及说明如表所示。

参数名称 说明
x,y,hue 接收data中变量名,表示选入的绘图变量,hue传入分类变量,以颜色分类。默认为None
data 接收DataFrame、array、list、series,表示用于绘图的数据集。默认为None
order hue_order 接收str、list,表示指定绘图分类级别。默认为None
jitter 接收float、True、1,表示添加均匀随机噪声(仅改变图形)优化图形显示。默认为True
dodge 接收bool,表示当使用分类嵌套时是否沿着分类轴分离。默认为False
orient 接收v、h,表示图形的方向。默认为None
  • 基于人员离职率数据,绘制简单水平分布散点图分析销售部已离职的员工每月平均工作小时。
  • 由图可知,在销售部且已离职的员工中,员工每个月工作时间大致可为两个时间段,分别是125~165小时和210~325小时。

image-20240323115200429

2. swarmplot函数

  • stripplot函数添加随机噪声增加图形抖动以及将变量沿着分类轴绘制后,仍然有重叠的可能。而使用 swarmplot函数可以避免这种情况,能够绘制出具有非重叠点的分类散点图。swarmplot函数的使用格式如下。

    seaborn.swarmplot(x=None, y=None, hue=None, data=None, order=None, hue_order=None, dodge=False, orient=None, color=None, palette=None, size=5, edgecolor='gray', linewidth=0, ax=None, **kwargs)
    
  • swarmplot函数和stripplot函数在参数上基本一致,只是swarmplot函数缺少了jitter函数。因为 swarmplot函数显示的是分布密度,所以不需要添加抖动项。

  • 基于人员离职率数据,根据高薪在职的员工数据,使用swarmplot函数绘制简单的分布密度散点图,传入hue参数添加多个嵌套的分类变量,如图所示。

  • 由图可知,在高薪在职的员工数据中,不同部门每个月平均工作时长和近五年是否得到提升。其中,销售部部门、管理部部门、市场部部门和财务部部门有少数员工提升,其他部门基本没有得到提升。

image-20240323115248733

3.4 绘制增强箱线图

  • 传统的箱线图对四分位数以外的数据信息提供很少,当数据量变得很大时,会显示大量极端值,忽略了部分信息,使用增强箱线图能较好解决这两个问题。增强箱线图类似于绘制分布的非参数表示的箱形图,其中所有特征对应于实际值。它通过绘制更多的分位数,提供了有关分布形状的更多信息,特别是在尾部。

  • 在seaborn库中,可以使用boxenplot函数绘制增强箱线图。boxenplot函数的使用格式如下。

    seaborn.boxenplot(x=None, y=None, hue=None, data=None, order=None, hue_order=None, orient=None, color=None, palette=None, saturation=0.75, width=0.8, dodge=True, k_depth='tukey', linewidth=None, scale='exponential', outlier_prop=0.007, trust_alpha=0.05, showfliers=True, ax=None, **kwargs)
    
  • boxenplot函数的常用参数及其说明如表所示。

参数名称 说明
x,y 接收array、str、series,表示输入变量、字符串应该是data中对应变量名,使用series将会在轴上显示名称。无默认值
data 接收DataFrame,表示用于绘图的数据集。默认为None
orient 接收v或h,表示绘图的方向(垂直或水平),默认为None
k_depth 接收proportion、tukey、trustworthy,表示不同的箱盒数量,被扩展的比例。默认为tukey
scale 接收linear、exponential、area,表示显示箱盒宽度的方法。默认为exponential
ax 接收series,表示轴对象以绘制图形,否则使用当前轴。默认为None
  • 波士顿房价数据绘制普通箱线图与增强箱线图。

  • 由图可知,房间数目与房价有密切关系,房间数目少,房价低;房间数目多,则房价就明显升高。增强箱线图显示了更广的分位数,并通过宽度展示出对应的分布,从而接纳了更多的异常值信息,减少了信息损失。

    image-20240323115412046

3.5 绘制分类网格组合图

分类网格组合图可在数据集中绘制成对关系。pairplot函数将构建一个轴网络,以便于每一个数值变量映射到多个轴的网格中的列和行。

  • pairplot函数的使用格式如下。

    seaborn.pairplot(data, hue=None, hue_order=None, palette=None, vars=None, x_vars=None, y_vars=None, kind='scatter', diag_kind='auto', markers=None, height=2.5, aspect=1, corner=False, dropna=False, plot_kws=None, diag_kws=None, grid_kws=None, size=None)
    

    pairplot函数通过kind参数选择要使用的绘图函数,通过col和row参数控制网格图的行列。其部分参数及说明如表所示。

参数名称 说明
data 接收DataFrame,表示用于绘图的数据集。默认为None
hue 接收str,表示使用指定变量为分类变量画图。默认为None
hue_order 接收str,表示在调色板中订购色调变量的级别,默认为None
palette 接收dict、调色板,表示映射hue变量的颜色集。如果是字典,则键应为hue变量中的值默认为None
vars 接收numeric类型的变量list,表示data需要使用的变量。默认为None
x_vars,y_vars 接收numeric类型的变量list,表示用于图的行和列。默认为None
kind 接收scatter、kde、hist、reg,表示选择绘图函数。默认为scatter
height 接收scalar,表示网格图的高度。默认为2.5
aspect 接收scalar,表示网格图的宽度。默认为1
dropna 接收bool、optional,表示是否剔除缺失值。默认为False

基于波士顿房价数据,通过pairplot函数绘制多变量之间的关系图。

  • 由图可知,犯罪率、一氧化氮含量、房间数、低收入人群、房屋价格几个字段的两两之间的相关关系,以及在对角线上显示了犯罪率、一氧化氮含量、房间数、低收入人群、房屋价格的分布情况。

image-20240323115617132

4.绘制回归图

4.1 绘制线性回归拟合图

线性回归是利用数理统计中回归分析确定两种或两种以上变量间相互依赖的定量关系的一种统计分析方法。

在seaborn库中,常见的回归图包括线性回归拟合图、线性回归网格组合图。

  • 在seaborn库中,可以使用regplot函数绘制线性回归拟合图。regplot函数的基本使用格式如下。

    seaborn.regplot(x=None, y=None, data=None, x_estimator=None, x_bins=None, x_ci='ci', scatter=True, fit_reg=True, ci=95, n_boot=1000, units=None, order=1, logistic=False, lowess=False, robust=False, logx=False, x_partial=None, y_partial=None, truncate=False, dropna=True, x_jitter=None, y_jitter=None, label=None, color=None, marker='o', scatter_kws=None, line_kws=None, ax=None)
    

    regplot主要参数及说明如表所示。

参数名称 说明
x,y 接收array、str、series,表示输入变量、字符串应该是data中对应列名,使用series将会在轴上显示名称。默认为None
data 接收DataFrame,表示传入数据,列为特征。默认为None
x_estimator 接收可调用的映射向量。应用于每一个x值并绘制估计图形,如果输入x_ci,将会绘制一个置信区间。默认为None
x_ci 接收ci、sd、0到100的int,表示离散值集中趋势的置信区间大小。默认为ci
ci 接收0到100的int,表示y轴置信区间大小。默认为95
scatter 接收bool,表示是否绘制散点图。默认为True
logistic 接收bool,表示是否使用逻辑回归。默认为False
lowess 接收bool,表示是否使用局域回归。默认为False
robust 接收bool,表示是否使用稳定回归。默认为False
logx 接收bool,表示是否使用对数回归。默认为False
{x,y}_jitter 接收float,表示设置均匀随机噪声添加到x或y变量中,只改变图形外观。默认为None

基于波士顿房价数据,利用regplot函数绘制修改置信区间ci参数前后的线性回归拟合图。

由图可知,房间数和房屋价格成线性相关关系。其中,修改置信区间ci参数前后得到的线性回归拟合图一致,准确度也不相同。

image-20240323115805268

4.2 绘制线性回归网格组合图

在seaborn库中,可以使用lmplot函数绘制线性回归网格组合图。lmplot函数与regplot函数有相似的使用格式, lmplot函数的使用格式如下。

seaborn.lmplot(x=None, y=None, data=None, hue=None, col=None, row=None, palette=None, col_wrap=None, height=5, aspect=1, markers='o', sharex=True, sharey=True, hue_order=None, col_order=None, row_order=None, legend=True, legend_out=True, x_estimator=None, x_bins=None, x_ci='ci', scatter=True, fit_reg=True, ci=95, n_boot=1000, units=None, seed=None, order=1, logistic=False, lowess=False, robust=False, logx=False, x_partial=None, y_partial=None, truncate=True, x_jitter=None, y_jitter=None, scatter_kws=None, line_kws=None, size=None)

lmplot函数是将regplot函数与FacetGrid类结合,能够绘制3变量的图形及修改全局高宽比,但是lmplot函数输入数据只能是数据的特征名。lmplot函数的常用参数及其说明如表所示。

参数名称 说明
hue, col, row 接收str,表示定义数据子集变量,将在不同构面绘图。默认为None
data 接收DataFrame,表示传入数据,列为特征。默认为None
palette 接收调色板名称、list、dict,表示用于hue变量不同类别的颜色。默认为None
height 接收float,表示每个刻面的高度。默认为5
aspect 接收float,表示每个刻面的宽度。默认为1
share{x, y} 接收bool、col、row,表示是否共享x轴或y轴。默认为True

基于波士顿房价数据,以河流穿行为类别绘制低收入人群与房屋价格两个变量的回归网格组合图。

由图可知,无论是否被河流穿过,变量低收入人群与变量房屋价格呈现较密切的线性拟合趋势,且绝大部分都是分布在未被河流穿过的情况下。

image-20240323115915711

5. 小结

  • seaborn库的基础图形、绘图风格和调色板。
  • 并以各种数据为例,介绍了关系图、分类图、回归图的绘制方法。
    • 关系图包括了散点图、折线图、热力图、矩阵网格图、关系网格组合图;
    • 分类图包括了条形图、单变量分布图、分类散点图、增强箱线图、分类网格组合图;
    • 回归图包括了线性回归拟合图、线性回归网格组合图。

五. pyecharts交互式图形绘制

1. pyecharts绘图基础

1.1 初始配置项

初始配置项是在初始化对象中进行配置的,可以设置画布的长与宽、网页标题、图表主题、背景色等。初始配置项是通过options模块中的InitOpts类实现的,可以使用init_opts作为参数传递。InitOpts类的使用格式如下。

class InitOpts(width='900px', height='500px',chart_id=None,renderer=RenderType.CANVAS, p age_title='Awesome-pyecharts', theme='white', bg_color=None, js_host='',animation_opts=Ani mationOpts())
参数名称 说明
width 接收str,表示图表画布宽度。默认为900px
height 接收str,表示图表画布高度。默认为500px
chart_id 接收str,表示图表ID,图表唯一标识,可用于在多个图表合并时进行图表之间的区分。默认为None
renderer 接收str,表示渲染风格,可选canvas或svg。默认为canvas
page_title 接收str,表示网页标题。默认为Awesome-pyecharts
theme 接收str,表示图表主题。默认为white
bg_color 接收str,表示图表背景颜色。默认为None

1.2 系列配置项

1. 文字样式配置项

文字样式配置项是通过options模块中的TextStyleOpts类实现的,可以使用text_style_opts作为参数传递给set_series_opts()方法。TextStyleOpts类的基本使用格式如下。

class TextStyleOpts(color=None, font_style=None, font_weight=None, font_family=None, font_s ize=None, align=None, vertical_align=None, line_height=None, background_color=None, bord er_color=None, border_width=None,border_radius=None, padding=None, shadow_color=N one, shadow_blur=None, width=None, height=None, rich=None)
参数名称 说明
color 接收str,表示文字颜色。默认为None
font_style 接收str,表示文字字体风格,可选normal、italic、oblique。默认为None
font_weight 接收str,表示主标题字体的粗细,可选normal、bold、bolder、lighter。默认为None
font_family 接收str,表示文字的字体系列。默认为None
font_size 接收numeric,表示文字的字体大小。默认为None
align 接收str,表示文字水平对齐方式。默认为None
vertical_align 接收str,表示文字垂直对齐方式。默认为None
line_height 接收str,表示行高。默认为None
background_col or 接收str,表示文字块背景色。默认为None
border_color 接收str,表示文字块边框颜色。默认为None
border_width 接收numeric,表示文字块边框宽度。默认为None

2. 标签配置项

标签配置项是通过options模块中的LabelOpts类实现的,可以使用label_opts作为参数传递给 set_series_opts()方法。LabelOpts类的基本使用格式如下。

class LabelOpts(is_show=True, position='top', color=None, distance=None, font_size=12, font\_ style=None, font_weight=None, font_family=None, rotate=None, margin=8, interval=None, hor izontal_align=None vertical_align=None, formatter=None, rich=None)
参数名称 说明
is_show 接收bool,表示是否显示标签。默认为True
position 接收str、Sequence,表示标签的位置。默认为top
color 接收str,表示文字的颜色。默认为None
font_family 接收str,表示文字的字体系列。默认为None
font_size 接收numeric,表示文字的字体大小。默认为12
font_weight 接收str,表示文字字体的粗细,可选normal、bold、bolder、lighter。默认为None
rotate 接收numeric,表示标签旋转角度,从-90度到90度。默认为None
horizontal_align 接收str,表示文字水平对齐方式,默认None

3. 线样式配置项

线样式配置项是通过options模块中的LineStyleOpts类实现的,可以使用line_style_opts作为参数传递给 set_series_opts()方法。LineStyleOpts类的基本使用格式如下。

class LineStyleOpts(is_show=True, width=1, opacity=1, curve=0, type_='solid', color=None)
参数名称 说明
is_show 接收bool,表示是否显示线。默认为True
width 接收numeric,表示线的宽度。默认为1
opacity 接收numeric,表示图形透明度,支持从0到1的数字。默认为1
curve 接收numeric,表示线的弯曲度,0表示完全不弯曲。默认为0
type_ 接收str,表示线的类型,常用solid、dashed、dotted。默认为solid
color 接收str,表示线的颜色。默认为None

4. 标记点配置项

  • 标记点配置项是通过options模块中的MarkPointOpts类实现的,可以使用markpoint_opts作为参数传递给 set_series_opts()方法。MarkPointOpts类的基本使用格式如下。

    class MarkPointOpts(data=None, symbol=None, symbol_size=None, label_opts=opts.LabelOpts (position='inside', color='\#fff')
    
参数名称 说明
data 接收Sequence对象,表示标记点数据。默认为None
symbol 接收str,表示标记的图形,提供的标记类型包括circle、rect、roundrect、triangle、diamond、 pin、arrow、None。默认为None
symbol_size 接收numeric,表示标记的大小,可以设置成单一的数字,如10;也可以使用数组分开表示宽和高例如,[20, 10]表示标记宽为20,高为10。默认为None
label_opts 表示标签配置项

1.3 全局配置项

1.标题配置项

  • 标题配置项是通过options模块中的TitleOpts类实现的,可以使用title_opts作为参数传递给 set_global_opts()方法。TitleOpts类的基本使用格式如下。
class TitleOpts(title=None, title_link=None, title_target=None, subtitle=None, subtitle_link= None, subtitle_target=None, pos_left=None, pos_right=None, pos_top=None, pos_bottom=N one, padding=5, item_gap=10, title_textstyle_opts=None, subtitle_textstyle_opts=None)
参数名称 说明
title 接收str,表示主标题文本,支持使用\n换行。默认为None
title_link 接收str,表示主标题跳转URL链接。默认为None
title_target 接收str,表示主标题跳转链接方式,可选self、blank,self表示当前窗口打开,blank表示新窗口打开。默认为blank
subtitle 接收str,表示副标题文本,支持使用\n换行。默认为None
subtitle_link 接收str,表示副标题跳转URL链接。默认为None
subtitle_target 接收str,表示副标题跳转链接方式。默认为blank
item_gap 接收numeric,表示主副标题之间的间距。默认为10
title_textstyle_opts 表示主标题字体样式配置项
subtitle_textstyle_opts 表示副标题字体样式配置项

2.图例配置项

  • 图例配置项是通过options模块中的LegendOpts类实现的,可以使用legend_opts作为参数传递给 set_global_opts()方法。LegendOpts类的基本使用格式如下。

    class LegendOpts(type_=None, selected_mode=None, is_show=True, pos_left=None, pos_right=N one, pos_top=None, pos_bottom=None, orient=None, align=None, padding=5, item_gap=10, item
    
    \_width=25, item_height=14, inactive_color=None, textstyle_opts=None, legend_icon=None)
    
参数名称 说明
type_ 接收str,表示图例的类型。可选plain、scroll,plain表示普通图例,scroll表示可滚动翻页的图例。 默认为None
is_show 接收bool,表示是否显示图例组件,默认为True
orient 接收str,表示图例列表的布局朝向,可选horizontal、vertical。默认为None
item_gap 接收int,表示图例每项之间的间隔。默认为10
inactive_color 接收str,表示图例关闭时的颜色。默认为#ccc
pos_left 接收str、numeric,表示图例组件离容器左侧的距离。默认为None
pos_right 接收str、numeric,表示图例组件离容器右侧的距离。默认为None
pos_top 接收str、numeric,表示图例组件离容器上侧的距离。默认为None
pos_bottom 接收str、numeric,表示图例组件离容器下侧的距离。默认为None

3.坐标轴配置项

  • 坐标轴配置项是通过options模块中的AxisOpts类实现的,可以使用xaxis_opts或yaxis_opts作为参数传递给 set_global_opts()方法。AxisOpts类的基本使用格式如下。

    class AxisOpts(type_=None, name=None, is_show=True, is_scale=False, is_inverse=False, name_l ocation='end', name_gap=15, name_rotate=None, interval=None, grid_index =0, position=None, offset=0, split_number=5, boundary_gap=None, min_=None, max_=None, min_interval=0, max_i nterval=None, axisline_opts=None, axistick_opts=None, axislabel_opts=None, axispointer_opts=N one, name_textstyle_opts=None, splitarea_opts=None, splitline_opts= SplitLineOpts(), minor_tick\_ opts=None, minor_split_line_opts=None)
    
参数名称 说明
type_ 接收str,表示坐标轴类型。可选value、category、time、log,value表示数值轴,适用于连续数据; category表示类目轴,适用于离散的类目数据;time表示时间轴,适用于连续的时序数据;log表示对数轴,适用于对数数据。默认为None
name 接收str,表示坐标轴名称。默认为None
is_show 接收bool,表示是否显示X坐标轴。默认为True
is_inverse 接收bool,表示是否反向坐标轴。默认为False
name_gap 接收numeric,表示坐标轴名称与轴线之间的距离。默认为15
name_rotate 接收numeric,表示坐标轴名字旋转角度值。默认为None
position 接收str,表示X轴的位置,可选top、bottom,top表示在上侧,bottom表示在下侧。默认为None
split_number 接收numeric,表示坐标轴的分割段数。默认为5
min_ 接收str、numeric,表示坐标轴刻度最小值。默认为None
max_ 接收str、numeric,表示坐标轴刻度最大值。默认为None

2. 绘制交互式基础图形

2.1 绘制条形图

在pyecharts库中,可使用Bar类绘制条形图或柱形图。Bar类的基本使用格式如下。

class Bar(init_opts=opts.InitOpts()) .add_xaxis(xaxis_data)

.add_yaxis(series_name, y_axis, is_selected=True, xaxis_index=None, yaxis_index=None, is_legen d_hover_link=True, color=None, is_show_background=False, background_style=None, stack=No ne, bar_width=None, bar_max_width=None, bar_min_width=None, bar_min_height=0, category\_ gap='20%', gap='30%', is_large=False, large_threshold=400, dimensions=None, series_layout_by ='column', dataset_index=0, is_clip=True, z_level=0, z=2, label_opts=opts.LabelOpts(), markpoint*

\_opts=None, markline_opts=None, tooltip_opts=None, itemstyle_opts=None, encode=None) .set_series_opts()

.set_global_opts()
参数名称 说明
init_opts=opts.InitOpts() 表示设置初始配置项,参考5.1.1小节
add_xaxis() 表示添加X轴数据项
xaxis_data 接收Sequence,表示X轴数据项。无默认值
add_yaxis() 表示添加Y轴数据项
series_name 接收str,表示系列名称,用于tooltip的显示,legend的图例筛选。无默认值
y_axis 接收numeric、opts.BarItem、dict型序列数据,表示系列数据。无默认值
is_selected 接收bool,表示是否选中图例。默认为True
xaxis_index 接收numeric,表示使用的x轴的index,在单个图表实例中存在多个x轴的时候有用。默认为None
yaxis_index 接收numeric,表示使用的y轴的index,在单个图表实例中存在多个y轴的时候有用。默认为None
is_legend_hover_link 接收bool,表示是否启用图例在hover时的联动高亮。默认为True
color 接收str,表示系列label颜色。默认为None
参数名称 说明
is_show_background 接收bool,表示是否显示柱条的背景色。默认为False
stack 接收str,表示数据堆叠,同个类目轴上系列配置相同的stack值可以堆叠放置。默认为None
bar_width 接收types.numeric、str,表示柱条的宽度,不设置时为自适应。可以是绝对值或百分数,如40、 60%。在同一坐标系上,此属性会被多个bar系列共享。此属性应设置于此坐标系中最后一个bar系列上才会生效,并且是对此坐标系中所有bar系列生效。默认为None
bar_max_width 接收types.numeric、str,表示柱条的最大宽度。默认为None
bar_min_width 接收types.numeric、str,表示柱条的最小宽度。在直角坐标系中,默认为1。否则,默认为null
bar_min_height 接收types.numeric,表示柱条最小高度,可用于防止某数据项的值过小而影响交互。默认为0
category_gap 接收numeric、str,表示同一系列的柱间距离。默认为20%
set_series_opts() 表示设置系列配置项,参考5.1.2小节
set_global_opts() 表示设置全局配置项,参考5.1.3小节

1. 柱形图

  • 商家A和商家B的各类商品的销售数据,如下表所示
商家 衬衫 毛衣 领带 裤子 风衣 高跟鞋 袜子
商家A 120 56 28 98 129 28 107
商家B 60 140 153 145 160 70 54
  • 绘制的柱形图可以直观展示商家A和商家B的销售情况,并便于对比同一类商品不同商家的销售差距。

2. 条形图

  • 当条目较多时,使用柱形图展示数据时将会显得较拥挤。此时,可以通过翻转X轴和Y轴来显示图形,即使用条形图展示数据。

3.堆叠柱形图

  • 可以将柱形图堆叠起来显示,即堆叠柱形图。

  • 通过设置系列配置项,可以在柱形图上显示最大值、最小值以及平均值等标注。

  • 如使用前图的数据绘制标注最大值、最小值、平均值的柱形图。

2.2 绘制散点图

  • 在pyecharts库中,可使用Scatter类绘制散点图。Scatter类的基本使用格式如下。

    class Scatter(init_opts=opts.InitOpts())
    
    .add_xaxis(xaxis_data)
    
    .add_yaxis(series_name, y_axis, is_selected=True, xaxis_index=None, yaxis_index=None, color =None, symbol=None, symbol_size=10, symbol_rotate=None, label_opts=opts.LabelOpts(positi on='right'), markpoint_opts=None, markline_opts=None, markarea_opts=None, tooltip_opts=N one, itemstyle_opts=None, encode=None)
    
    .set_series_opts()
    
    .set_global_opts()
    
参数名称 说明
init_opts=opts.InitOpts() 表示设置初始配置项,参考5.1.1小节
add_xaxis() 表示添加X轴数据项
xaxis_data 接收Sequence,表示X轴数据项。无默认值
add_yaxis() 表示添加Y轴数据项
series_name 接收str,表示系列名称,用于tooltip的显示,legend的图例筛选。无默认值
y_axis 接收Sequence序列数据,表示系列数据。无默认值
is_selected 接收bool,表示是否选中图例。默认为True
xaxis_index 接收numeric,表示使用的x轴的index,在单个图表实例中存在多个x轴的时候有用。默认为None
yaxis_index 接收numeric,表示使用的y轴的index,在单个图表实例中存在多个y轴的时候有用。默认为None
参数名称 说明
color 接收str,表示系列label颜色。默认为None
symbol 接收str,表示标记的图形,可选的标记类型包括circle、rect、roundrect、triangle、diamond、 pin、arrow、None。默认为None
symbol_size 接收numeric,表示标记的大小,可以设置成单一的数字,如10;也可以用数组分开表示宽和高,例如,[20, 10]表示标记宽为20,高为10。默认为10
symbol_rotate 接收types.numeric,表示标记的旋转角度。默认为None
set_series_opts() 表示设置系列配置项,参考5.1.2小节
set_global_opts() 表示设置全局配置项,参考5.1.3小节
  • 某小学部分学生的身高和体重的数据,如下表所示
身高 0.75 0.85 0.95 1.08 1.12 1.16 1.35 1.51 1.55 1.6 1.63 1.67
体重 10 12 15 17 20 22 35 42 48 50 51 54
  • 散点图可知,体重和身高成正比关系,身高越高,体重越重

2.3 绘制折线图

  • 在pyecharts库中,可使用Line类绘制折线图。Line类的基本使用格式如下。

    class Line(init_opts=opts.InitOpts())
    
    .add_xaxis(xaxis_data)
    
    .add_yaxis(series_name, y_axis, is_selected=True, is_connect_nones=False, xaxis_index=None, y axis_index=None, color=None, is_symbol_show=True, symbol=None, symbol_size=4, stack=Non e, is_smooth=False, is_clip=True, is_step=False,is_hover_animation=True,z_level=0,z=0, markpoint_opts=None,markline_opts=None,tooltip_opts=None,label_opts=opts.LabelOpt s(),linestyle_opts=opts.LineStyleOpts(),areastyle_opts=opts.AreaStyleOpts(),itemstyle_opts =None)
    
    .set_series_opts()
    
    .set_global_opts()
    
参数名称 说明
init_opts=opts.InitOpts() 表示设置初始配置项,参考5.1.1小节
add_xaxis() 表示添加X轴数据项
xaxis_data 接收Sequence,表示X轴数据项。无默认值
add_yaxis() 表示添加Y轴数据项
series_name 接收str,表示系列名称,用于tooltip的显示,legend的图例筛选。无默认值
y_axis 接收types.Sequence序列,表示系列数据。无默认值
is_selected 接收bool,表示是否选中图例。默认为True
is_connect_nones 接收bool,表示是否连接空数据。当含有空数据时,使用None填充。默认使False
xaxis_index 接收numeric,表示使用的x轴的index,在单个图表实例中存在多个x轴的时候有用。默认为None
yaxis_index 接收numeric,表示使用的y轴的index,在单个图表实例中存在多个y轴的时候有用。默认为None
color 接收str,表示系列label颜色。默认为None
参数名称 说明
is_symbol_show 接收bool,表示是否显示symbol。如果为false,那么只有在tooltip hover的时候显示。默认为你 True
symbol 接收str,表示标记的图形,可选标记类型包括circle、rect、roundrect、triangle、diamond、pin arrow、None。默认为None
symbol_size 接收numeric、Sequence,表示标记的大小,可以设置成单一的数字,如10;也可以用数组分开表示宽和高,例如,[20, 10]表示标记宽为20,高为10。默认为4
stack 接收str,表示数据堆叠,同个类目轴上系列配置相同的stack值可以堆叠放置。默认为None
is_smooth 接收bool,表示是否平滑曲线。默认为Flase
is_clip 接收bool,表示是否裁剪超出坐标系部分的图形。默认为True
is_step 接收bool,表示是否显示成阶梯图。默认为False
set_series_opts() 表示设置系列配置项,参考5.1.2小节
set_global_opts() 表示设置全局配置项,参考5.1.3小节

1. 折线图

  • 商家A和商家B的各类商品的销售数据,如下表所示
商家 衬衫 毛衣 领带 裤子 风衣 高跟鞋 袜子
商家A 120 56 28 98 129 28 107
商家B 60 140 153 145 160 70 54
  • 商家A的曲线设置了参数is_smooth=True,在显示时为光滑的折线,而商家B的曲线没有进行设置,在

显示时为不光滑的折线。

2. 面积图

  • 面积图又称区域图,强调数量随时间而变化的程度,也可用于引起人们对总值趋势的注意。Line类也可以绘制面积图,主要是在add_yaxis参数中配置区域填充样式配置项,即options.AreaStyleOpts(opacity

    =0, color=None),其中opacity参数为图形透明度,支持从0到1的数字,为0时不绘制该图形,color 参数为填充的颜色。

2.4 绘制箱线图

  • 在pyecharts库中,可使用Boxplot类绘制箱线图。Boxplot类的基本使用格式如下。

    class Boxplot(init_opts=opts.InitOpts())
    
    .add_xaxis(xaxis_data)
    
    .add_yaxis(series_name, y_axis, is_selected=True, xaxis_index=None, yaxis_index=None,labe l_opts=opts.LabelOpts(), markpoint_opts=opts.MarkPointOpts(), markline_opts=opts.MarkLine Opts(), tooltip_opts=None, itemstyle_opts=None)
    
    .set_series_opts()
    
    .set_global_opts()
    
参数名称 说明
init_opts=opts.InitOpts() 表示设置初始配置项,参考5.1.1小节
add_xaxis() 表示添加X轴数据项
xaxis_data 接收Sequence,表示X轴数据项。无默认值
add_yaxis() 表示添加Y轴数据项
series_name 接收str,表示系列名称,用于tooltip的显示,legend的图例筛选。无默认值
y_axis 接收types.Sequence序列数据,表示系列数据。无默认值
is_selected 接收bool,表示是否选中图例。默认为True
xaxis_index 接收numeric,表示使用的x轴的index,在单个图表实例中存在多个x轴的时候有用。默认为None
yaxis_index 接收numeric,表示使用的y轴的index,在单个图表实例中存在多个y轴的时候有用。默认为None
set_series_opts() 表示设置系列配置项,参考5.1.2小节
set_global_opts() 表示设置全局配置项,参考5.1.3小节
  • 例:某学校3年级1班、2班、3班、4班的语文考试成绩,如表所示。
班级 成绩
1班 68,99,46,77,94,40,79,20,88,89,76,92,95
2班 79,88,35,57,78,69,78,99,75,46,88,87,89
3班 91,82,63,86,77,78,32,96,80,86,64,67,96
4班 72,82,45,100,67,89,90,90,89,69,79,91,92
  • 箱线图可知,1、2、3班的平均分差不多,而4班的平均分要明显高于其他3个班;1班的极差要明显大于其他3个班;4个班的最高分基本上接近。

2.5 绘制3D散点图

  • 3D散点图(3D Scatter)与基本散点图类似,区别主要是3D散点图是在三维空间的点图,基本散点图是在二维平面上的点图。

  • 在pyecharts库中,可使用Scatter3D类绘制3D散点图,Scatter3D类的基本使用格式如下。

    class Scatter3D(init_opts=opts.InitOpts())
    
    .add(series_name, data, grid3d_opacity=1, shading=None, itemstyle_opts=None, xaxis3d_op ts=opts.Axis3DOpts(), yaxis3d_opts=opts.Axis3DOpts(), zaxis3d_opts=opts.Axis3DOpts(), gr id3d_opts=opts.Grid3DOpts(), encode=None)
    
    .set_series_opts()
    
    .set_global_opts()
    
参数名称 说明
init_opts=opts.InitOpts() 表示设置初始配置项,参考5.1.1小节
add() 表示添加数据方法
name 接收str,表示图例名称。无默认值
data 接收Sequence,表示系列数据,每一行是一个数据项,每一列属于一个维度。无默认值
grid3d_opacity 3D笛卡尔坐标系组的透明度(点的透明度),默认为1,完全不透明
xaxis3d_opts 表示添加X轴数据项
yaxis3d_opts 表示添加Y轴数据项
zaxis3d_opts 表示添加Z轴数据项
set_series_opts() 表示设置系列配置项,参考5.1.2小节
set_global_opts() 表示设置全局配置项,参考5.1.3小节
  • 例:某运动会各运动员的最大携氧能力、体重和运动后心率部分数据如下表,详见“运动员的最大携氧能力、体重和运动后心率数据.xlsx”。
最大携氧能力 体重 运动后心率
55.79 70.47 150
35.00 70.34 144
42.93 87.65 162
28.30 89.80 129
40.56 103.02 143

2.6 绘制饼图

  • 在pyecharts库中,可使用Pie类绘制饼图。Pie类的基本使用格式如下。

    class Pie(init_opts=opts.InitOpts())
    
    .add(series_name, data_pair, color=None, radius=None, center=None, rosetype=None, is_cl ockwise=True,label_opts=opts.LabelOpts(),tooltip_opts=None,itemstyle_opts=None,e ncode=None)
    
    .set_series_opts()
    
    .set_global_opts()
    
参数名称 说明
init_opts=opts.InitOpts() 表示设置初始配置项,参考5.1.1小节
add() 表示添加数据
series_name 接收str,表示系列名称,用于tooltip的显示,legend的图例筛选。无默认值
data_pair 接types.Sequence序列,表示系列数据项,格式为[(key1, value1), (key2, value2)]。无默认值
color 接收str,表示系列label颜色。默认为None
radius 接收Sequence,表示饼图的半径,数组的第一项是内半径,第二项是外半径。默认为None
center 接收Sequence,表示饼图的中心(圆心)坐标,数组的第一项是横坐标,第二项是纵坐标,默认设置成百分比。当设置成百分比时第一项是相对于容器宽度,第二项是相对于容器高度。默认为None
rosetype 接收str,表示是否展示成南丁格尔图,通过半径区分数据大小,有radius和area两种模式。radius表示扇区圆心角展现数据的百分比,半径展现数据的大小,area表示所有扇区圆心角相同,仅通过半径展现数据大小。默认为None
is_clockwise 接收bool,表示饼图的扇区是否是顺时针排布。默认值是True
set_series_opts() 表示设置系列配置项,参考5.1.2小节
set_global_opts() 表示设置全局配置项,参考5.1.3小节

1. 绘制饼图

  • 利用绘制折线图中的数据,绘制商家B销售数据的饼图。

  • 由饼图可知,商家B的各类商品销量中风衣的数量占比最多,占到为20.46%,而袜子只占了6.91%。

2. 环形图

环形图(Circular Sector Graph)与饼图类似,但又有区别。环形图中间有一个空洞,每个样本用一个环来表示,样本中的每一部分数据用环中的一段表示。可以通过add函数中增加radius参数设置绘制环形图。

3. 玫瑰图

  • 玫瑰图(Rose Graph)又称为极面积图,使用圆弧的半径长短表示数据量。读者可以通过Pie类绘制玫瑰图,只需要在add函数中增加rosetype参数设置即可完成玫瑰图的绘制。

  • 虽然玫瑰图反映的比例关系与饼图、环形饼图是一致的,但通过扇区圆心角展现数据的百分比的直观显示,可以一目了然的看出各组成部分所占的比例关系。

3. 绘制交互式高级图形

3.1 绘制层叠多图

  • 在同一个绘图区域,绘制不同类型的图表,即层叠多图,如同时绘制散点图和折线图、条形图和折线图等。
月份 蒸发量 降水量 平均温度
1月 2 2.6 2
2月 4.9 5.9 2.2
3月 7 9 3.3
4月 23.2 26.4 4.5
5月 25.6 28.7 6.3

在pyecharts库中,使用overlap()方法将多个图形叠加在一个视图区。

  • 例:某省份1~12月份的降水量、蒸发量、平均温度部分数据如表所示。详见“1~12月份的降水量、蒸发量、平均温度数据.xlsx”

  • 叠加条形图和折线图中,左边的坐标轴显示的是蒸发量和降水量,而右边的坐标轴显示的一年中的平均温度,可以直观地展示了三者随时间的变化而变化的情况。

3.2 绘制漏斗图

  • 在pyecharts库中,可使用Funnel类绘制漏斗图。Funnel类的基本使用格式如下。

    class Funnel(init_opts=opts.InitOpts())
    
    .add(series_name, data_pair, is_selected=True, color=None, sort_='descending', gap=0, label_opts=opts.LabelOpts(), tooltip_opts=None, itemstyle_opts=None)
    
    .set_series_opts()
    
    .set_global_opts()
    
参数名称 说明
init_opts=opts.InitOpts() 表示设置初始配置项,参考5.1.1小节
add() 表示添加数据
series_name 接收str,表示系列名称,用于tooltip的显示,legend的图例筛选。无默认值
data_pair 接收Sequence,表示数据项,格式为[(key1, value1), (key2, value2)]。无默认值
is_selected 接收bool,表示是否选中图例。默认为True
color 接收str,表示系列label颜色。默认为None
sort_ 接收str,表示数据排序,可以取ascending、descending、None(按data顺序)。默认为descending
gap 接收numeric,表示数据图形间距。默认为0
set_series_opts() 表示设置系列配置项,参考5.1.2小节
set_global_opts() 表示设置全局配置项,参考5.1.3小节
  • 下表是某淘宝店铺的订单转化率统计数据,根据数据绘制漏斗图。
网购环节 人数
浏览商品 2000
加入购物车 900
生成订单 400
支付订单 320
完成交易 300
  • 由漏斗图可以直观地查看各个网购环节人数的转化率情况。

3.3 绘制热力图

  • 在pyecharts库中,可使用HeatMap类绘制热力图。HeatMap类的基本使用格式如下。

    class HeatMap(init_opts=opts.InitOpts())
    
    .add_xaxis()
    
    .add_yaxis(series_name, yaxis_data, value, is_selected=True, xaxis_index=None, yaxis_index=
    
    None, label_opts=opts.LabelOpts(), markpoint_opts=None, markline_opts=None, tooltip_opts=
    
    None, itemstyle_opts=None)
    
    .set_series_opts()
    
    .set_global_opts()
    
参数名称 说明
init_opts=opts.InitOpts() 表示设置初始配置项,参考5.1.1小节
add_xaxis() 表示添加x轴数据
add_yaxis() 表示添加y轴数据
series_name 接收str,表示系列名称,用于tooltip的显示,legend的图例筛选。无默认值
yaxis_data 接收types.Sequence,表示y坐标轴数据项。无默认值
value 接收types.Sequence,表示系列数据项。无默认值
is_selected 接收bool,表示是否选中图例。默认为True
xaxis_index 接收numeric,表示使用的x轴的index,在单个图表实例中存在多个x轴的时候有用。默认为None
yaxis_index 接收numeric,表示使用的y轴的index,在单个图表实例中存在多个y轴的时候有用。默认为None
set_series_opts() 表示设置系列配置项,参考5.1.2小节
set_global_opts() 表示设置全局配置项,参考5.1.3小节
  • 某网站某周一天24小时的点击量部分数据,详见数据文件(heatmap.xlsx),请根据数据绘制热力图。
时间 星期一 星期二 星期三 星期四 星期五 星期六 星期日
1 3 63 3 50 78 74 92
2 43 40 5 39 9 32 46
3 57 55 71 39 26 3 48
4 43 73 86 37 36 96 52
5 99 58 80 97 30 53 37
  • 热力图可以直观地展现了数据的差异性。特别是,当面对庞大的数据时,通过热力图可视化可以一目了然的查看数据的分布情况或差异情况。

3.4 绘制词云图

  • 在pyecharts库中,可使用WordCloud类绘制词云图。WordCloud类的基本使用格式如下。

    class WordCloud(init_opts=opts.InitOpts())
    
    .add(series_name, data_pair, shape='circle', mask_image=None, word_gap=20, word_size_r ange=None, rotate_step=45, pos_left=None, pos_top=None, pos_right=None, pos_bottom= None, width=None, height=None, is_draw_out_of_bound=False, tooltip_opts=None, textstyl e_opts=None, emphasis_shadow_blur=None, emphasis_shadow_color=None) .set_series_opts()
    
    .set_global_opts()
    
参数名称 说明
init_opts=opts.InitOpts() 表示设置初始配置项,参考5.1.1小节
add() 表示添加数据
series_name 接收str,表示系列名称,用于tooltip的显示,legend的图例筛选。无默认值
data_pair 接收Sequence,表示系列数据项,形如[(word1, count1), (word2, count2)]。无默认值
shape 接收str,表示词云图轮廓,可选circle、cardioid、diamond、triangle-forward triangle、pentagon。默认是circle
mask_image 接收str,表示自定义的图片(目前支持jpg、jpeg、png、ico的格式)。默认为 None
word_gap 接收numeric,表示单词间隔。默认为20
word_size_range 接收numeric序列,表示单词字体大小范围。默认为None
rotate_step 接收numeric,表示旋转单词角度。默认为45

参数名称 说明
pos_left 接收str,表示距离左侧的距离。默认为None
pos_top 接收str,表示距离顶部的距离。默认为None
pos_right 接收str,表示距离右侧的距离。默认为None
pos_bottom 接收str,表示距离底部的距离。默认为None
width 接收str,表示词云图的宽度。默认为None
height 接收str,表示词云图的高度。默认为None
is_draw_out_of_bound 接收bool,表示是否允许词云图的数据展示在画布范围之外。默认为False
set_series_opts() 表示设置系列配置项,参考5.1.2小节
set_global_opts() 表示设置全局配置项,参考5.1.3小节
  • 在绘制词云图前,需要统计各词的词频。例如,附件worldcloud.csv统计的部分宋词词频数据,绘制的词云图。

  • 由词云图可知,宋词中使用“东风”“人间”“何处”的次数相对较多。

3.5 绘制关系图

  • 在pyecharts库中,可使用Graph类绘制关系图。Graph类的基本使用格式如下。

    class Graph(init_opts=opts.InitOpts())
    
    .add(series_name, nodes, links, categories=None, is_selected=True, is_focusnode=True, is_r oam=True, is_draggable=False, is_rotate_label=False, layout='force', symbol=None, symbo l_size=10, edge_length=50, gravity=0.2, repulsion=50, edge_label=None, edge_symbol=No ne, edge_symbol_size=10, label_opts=opts.LabelOpts(), linestyle_opts=opts.LineStyleOpts(), tooltip_opts=None, itemstyle_opts=None)
    
    .set_series_opts()
    
    .set_global_opts()
    
参数名称 说明
init_opts=opts.InitOpts() 表示设置初始配置项,参考5.1.1小节
add() 表示添加数据
series_name 接收str,表示系列名称,用于tooltip的显示,legend的图例筛选。无默认值
nodes 接收Sequence,表示关系图节点数据项列表。无默认值
links 接收Sequence,表示关系图节点间关系数据项列表。无默认值
categories 接收Sequence,表示关系图节点分类的类目列表。默认为None
is_selected 接收bool,表示是否选中图例。默认为True
is_roam 接收bool,表示是否开启鼠标缩放和平移漫游。默认值是True
is_draggable 接收bool,表示节点是否可拖拽,只在使用力引导布局的时候有用。默认为False
is_rotate_label 接收bool,表示是否旋转标签。默认值False
layout 接收str,表示图的布局,可选none、circular、force。None表示不采用任何布局,使用节点中提供的x、y作为节点的位置;circular表示采用环形布局;force表示采用力引导布局。默认为force
参数名称 说明
symbol 接收str,表示关系图节点标记的图形,提供的标记类型包括circle、rect、roundrect、triangle、diamond pin、arrow、None。默认为None
symbol_size 接收types.numeric,表示关系图节点标记的大小,可以设置单一的数字,如10;也可以用数组分开表示宽和高,例如,[20, 10]表示标记宽为20,高为10。默认为10
edge_length 接收numeric,表示边的两个节点之间的距离。默认为50
gravity 接收numeric,表示节点受到的向中心的引力因子,该值越大节点越往中心点靠拢。默认为0.2
repulsion 接收numeric,表示节点之间的斥力因子。默认为50
edge_label 接收types.Label,表示Graph图节点边的Label配置(即在边上显示数据或标注的配置)。默认为None
edge_symbol 接收str,表示边两端的标记类型,可以是一个数组分别指定两端,也可以是单个统一指定。默认为None
edge_symbol_size 接收numeric,表示边两端的标记大小,可以是一个数组分别指定两端,也可以是单个统一指定。默认为10
set_series_opts() 表示设置系列配置项,参考5.1.2小节
set_global_opts() 表示设置全局配置项,参考5.1.3小节
  • 某公司销售部的部分员工微信好友关系数据如下表所示。
目标人物 其它人物 关系
周建 [贺芳, 吴大, 张三, 刘霞] [夫妻,同事,同学,同学]
黄婧 [张三, 刘霞] [朋友,同事]
文华 [刘霞, 吴大] [夫妻,同事]
  • 由关系图可以直观地看出每个人之间的关系。

3.6 绘制桑基图

  • 在pyecharts库中,可使用Sankey类绘制桑基图。Sankey类的基本使用格式如下。

    class Sankey(init_opts=opts.InitOpts())
    
    .add(series_name, nodes, links, is_selected=True, pos_left='5%', pos_top='5%', pos_right='20%', pos_bottom='5%', node_width=20, node_gap=8, node_align='justify', orient='horizontal', is_dra ggable=True, layout_iterations=32, focus_node_adjacency=False, levels=None, label_opts=opts. LabelOpts(), linestyle_opt=opts.LineStyleOpts(), tooltip_opts=None)
    
    .set_series_opts()
    
    .set_global_opts()
    
参数名称 说明
init_opts=opts.InitOpts() 表示设置初始配置项,参考5.1.1小节
add() 表示添加数据
series_name 接收str,表示系列名称,用于tooltip的显示,legend的图例筛选。无默认值
nodes 接收Sequence,表示节点数据项列表。无默认值
links 接收Sequence,表示节点间关系数据项列表。无默认值
is_selected 接收bool,表示是否选中图例。默认为True
pos_left 接收str、types.numeric,表示Sankey组件离容器左侧的距离。默认为5%
pos_top 接收str、types.numeric,表示Sankey组件离容器上侧的距离。默认为5%
pos_right 接收str、types.numeric,表示Sankey组件离容器右侧的距离。默认为20%
pos_bottom 接收str、types.numeric,表示Sankey组件离容器下侧的距离。默认为5%
node_width 接收numeric,表示桑基图中每个矩形节点的宽度。默认为20
参数名称 说明
node_gap 接收numeric,表示桑基图中每一列任意两个矩形节点之间的间隔。默认为8
node_align 接收str,表示桑基图中节点的对齐方式,可选justify、left、right。justify表示节点双端对齐, left表示节点左对齐,right表示节点右对齐。默认为justify
orient 接收str,表示桑基图中节点的布局方向,可选horizontal、vertical。horizontal表示水平的从左往右,vertical表示垂直的从上往下。默认为horizontal
is_draggable 接收bool,表示当控制节点拖拽的交互开启后,用户可以将图中任意节点拖拽到任意位置。默认为True
set_series_opts() 表示设置系列配置项,参考5.1.2小节
set_global_opts() 表示设置全局配置项,参考5.1.3小节
  • 附件sanky.csv是某家庭一个月的生活开支明细数据,绘制桑基图。

  • 由桑基图可以直观地看出商品的开支情况,

    以及各商品小类、大类的开支情形。

4. 绘制组合图形

4.1 绘制并行多图

  • 为了进行不同数据的比较,有时需要在同一个视图区域同时绘制不同的图形,即并行多图。在pyecharts 库中,可使用Grid类绘制并行多图。Grid类的基本使用格式如下。

    class Grid(init_opts=opts.InitOpts())
    
    .add(chart, grid_opts, grid_index=0, is_control_axis_index=False)
    
参数名称 说明
init_opts=opts.InitOpts() 表示设置初始配置项,参考5.1.1小节
add() 表示添加图形信息
chart 接收char对象,表示图表实例,仅Chart类或其子类。无默认值
grid_opts 接收options.GridOpts、dict,表示直角坐标系网格配置项。无默认值
grid_index 接收int,表示直角坐标系网格索引。默认为0
is_control_axis_index 接收bool,表示是否由自己控制Axis索引。默认为False
  • Chart参数主要用于显示的图形对象。
  • 为了显示正确,需要配置直角坐标系网格配置项。在pyecharts库中,可使用GridOpts类配置直角坐标系网格配置项。GridOpts类的基本使用格式如下。
pyecharts.options.GridOpts(is_show=False, z_level=0,z=2,pos_left=None, pos_top=None, p os_right=None, pos_bottom=None, width=None, height=None, is_contain_label=False, backgr ound_color='transparent', border_color='\#ccc', border_width=1, tooltip_opts=None)
参数名称 说明
is_show 接收bool,表示是否显示直角坐标系网格。默认为False
pos_left 接收str、numeric,表示grid组件离容器左侧的距离。默认为None
pos_top 接收str、numeric,表示grid组件离容器上侧的距离。默认为None
pos_right 接收str、numeric,表示grid组件离容器右侧的距离。默认为None
pos_bottom 接收str、numeric,表示grid组件离容器下侧的距离。默认为None
width 接收str、numeric,表示grid组件的宽度。默认None
height 接收str、numeric,表示grid组件的高度。默认None
is_contain_label 接收bool,表示grid区域是否包含坐标轴的刻度标签。默认是False
background_color 接收str,表示网格背景色。默认为transparent
border_color 接收str,表示网格的边框颜色。默认为#ccc
border_width 接收numeric,表示网格的边框线宽。默认为1
  • 通常并行多图有左右布局和上下布局两种方式。基于的商家A的销售数据,采取左右布局的方式,绘制条形图和饼图。

  • 由并行多图可知,左边的柱形图展示了商家A销售的各种商品数量,右边的饼图展示了各商品销售数量的占比情况。

4.2 绘制顺序多图

  • 如果对相关数据源,根据不同的目的进行了不同的数据可视化,进一步将所有图片集中到一个页面就显得非常完善,这样即可对不同的情况进行同时交互展示。在pyecharts库中,可使用Page类绘制顺序多图。Page类的基本使用格式如下。
class Page(page_title='Awesome-pyecharts', js_host='',interval=1, layout=PageLayoutO pts())*

.add(\ charts)
参数名称 说明
page_title 接收str,表示HTML标题。默认为Awesome-pyecharts
interval 接收int,表示每个图例之间的间隔。默认为1
layout 接收PageLayoutOpts,表示布局配置项。
charts 接收charts对象,表示任意图表实例。无默认值
参数名称 说明
source 接收str,表示Page第一次渲染后的html文件。默认为render.html
cfg_file 接收str,表示布局配置文件的路径。无默认值
dest 接收str,表示重新生成的.html文件的存放路径以及文件名。默认为resize_render.html
  • PageLayoutOpts用于配置原生CSS样式。pyecharts内置了DraggablePageLayout布局,可以通过拖放的方式设置布局,同时提供了save_resize_html()方法用于保存通过拖拉设置布局的页面。save_resize_html()方法的基本使用格式如下。

    Page.save_resize_html(source='render.html', cfg_file=None, cfg_dict=None, dest='resize \_render.html')
    
  • 利用商家A和商家B的销售数据绘制柱形图、玫瑰图、环形图,并通过Page类实现顺序多图。

  • 在图形的的左上角存在Save_config按钮,此时可以通过拖放的方式调整页面显示效果,当拖放完成后,单击Save_config 按钮,将会下载一个名为“chart_config.json”的配置文件,即可保存设置的布局。

  • 当需要展示不同时间段、不同类别的数据时,如果同时在一个视图区域显示多个图形,将会显得较拥挤;

  • 如果在同一个页面显示多个图形,将会显得冗余。

  • 此时,可使用滚动重复的播放方式,展示所有需要显示的图形,即使用时间线轮播多图展示数据。

4.3 绘制时间线轮播多图

在pyecharts库中,可使用Timeline类绘制时间线轮播多图。Timeline类得基本使用格式如下。

class Timeline(init_opts=opts.InitOpts())

.add(chart, time_point)

.add_schema(axis_type='category', orient='horizontal', symbol=None, symbol_size=

*None, play_interval=None, control_position='left', is_auto_play=False, is_loop_play =True, is_rewind_play=False, is_timeline_show=True, is_inverse=False, pos_left=N one, pos_right=None, pos_top=None, pos_bottom='-5px', width=None, height=None, linestyle_opts=None, label_opts=None, itemstyle_opts=None, graphic_opts=None, c heckpointstyle_opts=None, controlstyle_opts=None)
参数名称 说明
init_opts=opts.InitOpts() 表示设置初始配置项,参考5.1.1小节
chart 接收chart对象,表示图表实例。无默认值
time_point 接收str,表示时间点。无默认值
add_schema() 表示添加轮播方案
axis_type 接收str,表示坐标轴类型,可选value、category、time、log。value表示数值轴,适用于连续数据; category表示类目轴,适用于离散的类目数据;time表示时间轴,适用于连续的时序数据;log表示对数轴,适用于对数数据。默认为category
orient 接收str,表示时间轴的类型,可选horizontal、vertical,horizontal表示水平,vertical表示垂直。默认horizontal
symbol 接收str,表示timeline标记的图形 ,可选的标记类型包括circle、rect 、roundrect 、triangle、 diamond、pin、arrow、None。默认为None
symbol_size 接收numeric,表示timeline标记的大小,可以设置成单一的数字,如10;也可以用数组分开表示宽和高,例如,[20, 10]表示标记宽为20,高为10。默认为None
play_interval 接收numeric,表示播放的速度(跳动的间隔),单位毫秒(ms)。默认为None
control_position 接收str,表示播放按钮的位置。可选left、right。默认为left
参数名称 说明
is_auto_play 接收bool,表示是否自动播放。默认为False
is_loop_play 接收bool,表示是否循环播放。默认为True
is_rewind_play 接收bool,表示是否反向播放。默认为False
is_timeline_show 接收bool,表示是否显示timeline组件,如果设置为False,不会显示,但是功能还存在。默认为True
is_inverse 接收bool,表示是否反向放置timeline,反向则首尾颠倒过来。默认为False
pos_left 接收str,表示Timeline组件离容器左侧的距离。默认为None
pos_right 接收str,表示Timeline组件离容器右侧的距离。默认为None
pos_top 接收str,表示Timeline组件离容器上侧的距离。默认为None
pos_bottom 接收str,表示Timeline组件离容器下侧的距离。默认为None
width 接收str,表示时间轴区域的宽度。默认为None
height 接收str,表示时间轴区域的高度。默认为None
  • 手机店A和手机店B在2019年部分的销售数据,如下表所示,具体见数据文件timeline.xlsx。
月份 三星 OPPO 苹果 华为 小米 中兴 VIVO 魅族
2019年1月 531 423 409 527 209 587 573 508
2019年2月 451 479 298 480 214 585 575 412
2019年3月 366 536 539 425 600 353 448 178
2019年4月 548 361 520 538 571 142 237 299
2019年5月 478 428 290 582 570 233 478 475
  • 由时间线轮播多图可知,从2019年1月到2019年12月两家手机店的销售情况。在柱形图下方显示的是时间轴,通过设置播放间隔时间和自动播放,可以直观的观看随时间变化,两家手机店每个月的销售情况

5. 小结

  • 本章介绍了pyecharts绘图的初始配置项、系列配置项、全局配置项;
  • 绘制交互式基础图形:条形图、散点图、折线图、箱线图、3D散点图、饼图;
  • 绘制交互式高级图形:层叠多图、漏斗图、热力图、词云图、关系图、桑基图;
  • 绘制组合图形:并行多图、顺序多图、时间线轮播多图。

六. 广电大数据可视化项目实战

1. 了解项目背景与目标

1.1 了解项目背景

  • 随着科技的发展,现在人们观看电视节目的方式越来越多,给人们带了很多便利。人们不仅可以使用传统的电视机观看电视节目,而且可以通过网络观看电视节目,这样使得运营商、用户、网络之间产生了一些交互关系。为了更改的为用户提供服务,并提高收益和收视率,需要对广电数据进行分析。

  • 目前某广播电视网络运营集团已建成完整覆盖广东省各区(县级市)的有线传输与无线传输互为延伸、互为补充的广电宽带信息网络,实现了城区全程全网的双向覆盖,为广大市民提供有线数字电视、互联网接入服务、高清互动电视、移动数字电视、手机电视、信息内容集成等多样化、跨平台的信息服务。

  • 每个家庭收看电视节目都需要通过机顶盒进行收视节目的接收和交互行为(如点播行为、回看行为)的发送,并将交互行为数据发送至每个区域的光机设备(进行数据传递的中介),光机设备会汇集该区域的信息数据,再发送至数据中心进行整合、存储。信息数据的收集过程如图所示。

  • 由于已建设的大数据平台积累了大量用户基础信息和用户观看记录信息等数据,所以在此基础上进一步挖掘出数据价值,可以提升客户体验,并提出精准的营销建议,采取有效应对措施,实现增加用户黏度,从而使用户与企业之间建立稳定交互关系,实现客户链式反应增值。

  • 在大数据平台中存有用户的基础信息(安装地址等)、订单数据(产品订购、退订信息)、工单数据(报装、故障、投诉、咨询等工单信息)、收费数据(缴费、托收等各渠道支付信息)、账单数据(月租账单收入数据)、双向互动电视平台收视行为数据(直播、点播、回看、广告的收视数据)、用户上网设备的指标状态数据(上下行电平、信噪比、流量等),共7种数据。

  • 由于每个用户收视习惯、兴趣爱好存在差异性,本次抽取了2000个样本用户在2018年5月12日至2018年

    6月12日的收视行为信息数据和收费数据,并对两份数据表进行脱敏处理。

各数据表及特征说明如表所示。

表名 字段 含义
收视 phone_no 用户名
行为 duration 观看时长
信息 station_name 直播频道名称
数据 origin_time 开始观看时间
(me end_time 结束观看时间
di res_name 设备名称
a_ owner_code 用户等级号
in owner_name 用户等级名称
de category_name 节目分类
x) res_type 节目类型
表名 字段 含义
vod_title 节目名称(点播、回看)
program_title 节目名称(直播)
phone_no 用户名
owner_name 用户等级名称
payment_name 支付方式
event_time 支付时间
( mmconsume login_group_name 支付渠道
_payevents) owner_code 用户等级号

1.2 熟悉项目流程

如何将丰富的电视产品与用户个性化需求实现最优匹配,是广电行业急需解决的重要问题。用户对电视产品

的需求不同,在挑选搜寻想要的信息过程中,需要花费大量的时间,这种情况的出现造成了用户的不断流失,对企业造成巨大的损失。广电大数据可视化的主要步骤如下。

  • 抽取2000个用户在2018年5月12日至2018年6月12日的收视行为信息数据、和收费数据。
  • 对抽取的数据进行数据清洗。
  • 对清洗后的数据进行可视化分析,包括用户分析、频道分析、时长分析、周时长分析和用户支付方式分析等。
  • 撰写项目分析报告。

广电大数据可视化的总体流程如图所示。

image-20240501184914216

2. 读取与处理广播电视数据

2.1 读取数据

  • 在项目的原始数据中可能会出现部分噪声数据,如重复值、异常值、冗余数据等,将会对后续的可视化分析结果造成影响。因此,需要在Python中读取广播电视数据,并对数据进行清洗。
  • 通过pandas库中的read_csv()函数读取用户收视行为数据和收费数据。结果如表所示。
表名
用户收视行为数据 4246720 12
收费数据 154667 6

2.2 清洗数据

  • 通过读取数据的运行结果可知,用户收视行为数据和收费数据存在的数据量相对较多,其中可能存在一定的缺少值、异常值等数据,且不同的数据存在的问题可能会不一致。
  • 因此需要根据不同数据中存在的不同情况,分别对收视行为信息数据和收费数据进行清洗处理。

1.收视行为信息数据

  • 在用户的收视行为信息数据(media_index)中存在直播频道名称(station_name)中含有“-高清”字段,如“江苏卫视-高清”与“江苏卫视”等。由于本项目中暂不分开考虑是否为高清频道的情况,所以需要将直播频道名称中“-高清”字段替换为空。
  • 从业务角度分析,该广电运营商主要面向的对象是众多的普通家庭,而收视行为信息数据中存在特殊线路和政企类的用户,即用户等级号(owner_code)为02、09、10的数据与用户等级名称(owner_name)为EA级、EB级、EC级、ED级、EE级的数据。因为特殊线路主要是起到演示、宣传等作用,这部分数据对于分析用户行为意义不大,并且会影响分析结果的准确性,所以需要将这部分数据删除。而政企类数据暂时不做分析,同样也需要删除。在收视行为信息数据中存在有同一用户开始观看时间(origin_time)和结束观看时间(end_time)重复的记录数据,而且观看的节目不同,如图所示,这可能是由于数据收集设备导致的。经过与广电运营商的业务人员沟通之后,默认保留第一条收视记录,因此需要基于数据中开始观看时间(origin_time)和结束观看时

在收视行为信息数据中存在跨夜的记录数据,如开始观看时间和结束观看时间分别为05-12 23:45:00和05-

13 00:31:00,如图所示。

在对用户收视行为信息数据进行分析时发现,存在用户的观看时间极短的现象,如图所示,这部分观看时间过短可能是因为用户在观看中换频道。经过与广电运营商的业务人员沟通之后,选择观看时长小于4秒作为时间极短的判断阈值,将小于阈值的数据称为异常行为数据,统一进行删除处理。

  • 此外,还存在用户较长时间观看同一频道的现象,这部分观看时间过长可能是因为用户在收视行为结束后,未能及时关闭机顶盒或其他原因造成。这类用户在广电运营大数据平台中数据记录中,未进行收视互动的情况下,节目开始观看时间和结束观看时间的单位秒为00的整点(秒)播放。经过与广电运营商的业务人员沟通之后,选择将直播收视数据中开始观看时间和结束观看时间的单位秒为00的记录删除。
  • 最后,发现数据有下次观看的开始观看时间小于上一次观看的结束观看时间的记录,这种异常数据的产生是由于数据收集设备异常导致的,需要进行删除处理。综合上述业务数据处理方法,清洗收视行为信息数据的具体步骤如下。
  • 将直播频道名称(station_name)中“-高清”替换为空。
  • 删除特殊线路的用户,用户等级号(owner_code)为02、09、10的数据。
  • 删除政企用户,用户等级名称(owner_name)为EA级、EB级、EC级、ED级、EE级的数据。
  • 基于数据中开始观看时间(origin_time)和结束观看时间(end_time)的记录去重。
  • 隔夜处理,将跨夜的收视数据分成两天即两条收视数据。
  • 删除观看同一个频道累计连续观看小于4秒的记录。
  • 删除直播收视数据中开始观看时间和结束观看时间的单位秒为00的收视数据。
  • 删除下次观看记录的开始观看时间小于上一次观看记录的结束观看时间的记录。

2.收费数据

对于收费数据(mmconsume-payevents),只需要删除特殊线路和政企类的用户即可,具体步骤如下。

  • 删除特殊线路的用户,用户等级号(owner_code)为02、09、10的数据。
  • 删除政企用户,用户等级名称(owner_name)为EA级、EB级、EC级、ED级、EE级的数据。

3. 绘制可视化图形

  • 根据读取与处理广播电视数据只能简单的对数据进行了解,并不能明确的看出数据中蕴含的信息。
  • 因此,需要对清洗后的数据进行可视化分析,清晰的展示出广播电视数据中用户的观看信息,为运营商的决策提供一定的参考。

3.1 绘制用户分析图

  • 分布分析是用户在特定指标下的频次、总额等的归类展现,它可以展现出单个用户对产品(电视)的依赖程度,从而分析出客户观看电视的总时长、所购买不同类型的产品数量等情况,帮助运营人员了解用户的当前状态。如观看时长(20 小时以下、20小时~50小时、50小时以上等区间)等分布情况。
  • 三网融合让人们可以便捷的获取新闻资讯,各种平台终端更是触手可及,同时工作节奏的加快,忙碌的人们是否还花时间订购收看广电节目?因此需要探索用户的观看总时长分布情况。计算所有用户在一个月内的观看总时长并且排序,从而对用户观看总时长分布进行可视化分析。

3.2 绘制频道分析图

贡献度分析又称帕累托分析,它的原理是帕累托法则又称20/80定律。同样的投入放在不同的地方会产生不同的效益。例如,对一个公司而言,80%的利润常来自于20%最畅销的产品,而其他80%的产品只产生了20% 的利润。为更好的了解观众最热衷哪些节目或哪些频道最受欢迎,提高收视率,因此需要对所有收视频道名称的观看时长与观看次数进行贡献度分析。

image-20240501185546307

image-20240501185552198

3.3 绘制时长分析图

  • 对比分析是指将两个相互联系的指标进行比较,从数量上展示和说明研究对象规模的大小、水平的高低、速度的快慢和各种关系是否协调,特别适用于指标间的横纵向比较、时间序列的比较分析。在对比分析中,选择合适的对比标准是十分关键的步骤。当选择合适的对比标准时,才能做出客观的评价;当选择不合适的对比标准时,评价可能得出错误的结论。
  • 对比分析主要有两种形式:静态对比和动态对比。静态对比,是指在同一时间条件下对不同总体指标进行比较,如不同部门、不同地区、不同国家的比较,也称为“横比”;动态对比,是指在同一总体条件下对不同时期指标数据的比较,也称为“纵比”。


将工作日(5天)与周末(2天)进行划分,使用饼图展示所有用户的观看总时长的占比分布(计算观看总时长时需要除以天数),并对所有用户在工作日和周末的观看总时长的分布使用柱状图进行对比。

3.4 绘制周时长分析图

为了使运营商清楚的了解在一周时间内每天的观看时长,从而有针对性的投放受欢迎的节目,增加用户的使用粘度。需要分别绘制了频道周观看时长分布图以及付费频道与点播回看的周观看时长分布图。

image-20240501185703031

image-20240501185709379

3.5 绘制用户支付方式分析图


传统广播电视企业如果在互联网时代脱颖而出,那么不仅要在电视节目以及电视节目投放安排上进行分析,还要开发一些产品的周边服务,为用户带来全新的体验。通过绘制用户支付方式分析图,观察用户的支付方式情况,从而方便传统广播电视企业为用户开展一些便民服务,吸引更多的用户使用,增加收益。

4. 项目分析报告

  • 通过对收视行为信息数据和收费数据的进行清洗和可视化分析,已经初观察出用户的观看时长走势分布、收视频道的排名、工作日与周末收视观看占比、点播回看的总体情况以及用户付费方式。
  • 了解更清晰的展示项目的结果,需要撰写项目分析报告,帮助开发者掌握广电大数据可视化的项目分析结果,给决策部门提供一个完整规范的方案,并帮助企业灵活调整经营决策。
  • 分析报告包括了背景与目的、分析思路、分析结果、总结与建议,其模板如第1章撰写项目分析报告示例图所示。由于前面已经介绍过本项目的背景与目的,所以此处将不再重复介绍。

4.1 分析思路

  • 收集大数据平台上的数据进行读取,清楚的熟悉数据的结构。
  • 根据项目的分析目的对收集到的数据进行清洗,包括对收视行为信息数据、账单与收费数据、订单数据和用户状态数据进行清洗处理。
  • 根据清洗后数据进行可视化分析,包括用户分析、频道分析、时长分析、周时长分析和用户支付方式分析。

由图可知,大部分用户的观看总时长主要集中在100小时~400小时之间。且随着收视用户的增多,电视节目的观看时长也在稳步增长。一个月平均每天观看10小时左右,这说明用户对广电节目有一定的依赖性,同时也说明了广电节目对用户有一定的吸引力,但仍然有一定的增长空间。由图可知,随着观看各频道次数增多,观看时长也在随之增多,且后面近28%的频道带来了80%的观看时长贡献度。出现这种情况的原因可能是也部分频道具有地方特色,或播放的节目比较受欢迎。

由图可知,排名前15的频道名称为翡翠台、中央3台、中央新闻、广东体育、中央8台、CCTV5+体育赛事、广东珠江、广东南方卫视、江苏卫视、中央6台、凤凰中文、中央4台、广州电视、中央1台、中央5台。其中,广东体育、广东珠江、广东南方卫视、广州电视都相对具有地方特色,而翡翠台则是广东话(粤语)广播为主的综合娱乐频道,也相对符合广东人民的喜好。同时这也从侧面证明了所有收视频道名称的观看时长与观看次数图的分析结果。由图可知,周末的观看时长占观看总时长的52.5%,而工作日的观看时长的占比为47.5%;周末观看的用户时长集中在20 小时~100小时之间,工作日观看的用户时长集中在50小时

~250小时之间。虽然在比例图中,周末与工作日的比例相差不大,但是在分布图中工作日的观看总时长仍比周末的观看总时长多,并且两者分布图形状相似。出现这种情况的原因可能是因为周末用户可支配的时间更多,有更多的时间可用于观看电视节目。但是周末只有2天,工作日有5天,所以工作日的观看总时长会比周末的观看总时长多。由以下两图可知,在一周中,周一、周六、周日的观看时间较长,其中周日观看时间最长。这说明人们更喜欢在周末且倾向于付费观看,在周二到周五忙于工作,无暇顾及电视节目,可能在周末点播回看。

由图可知,大多数用户选择现金支付,其次是翼支付托收、人行托收,选择网厅网银、短信支付、支付宝、支票、建行龙支付、微信等方式的用户极少。说明用户还是受传统思想影响,倾向于使用现金支付,但是现金携带不便,也带来一定的安全隐患。同时加强宣传,引导用户选择掌上支付,业务也加强集成,方便终端绑定,一键式便捷支付。

4.2 总结与建议

通过对广电大数据可视化分析,提出以下总结和建议。

  • 大部分用户的观看总时长主要集中在100小时~300小时之间且随着用户观看各频道次数增多,观看时长也在随之增多。因此,可以适当的更改不同频道的节目单,添加频道的吸引力,从而增多用户观看各频道次数和时长。
  • 用户观看时长前15名的频道分别为翡翠台、中央3台、中央新闻、广东体育、中央8台、CCTV5+体育赛事、广东珠江、广东南方卫视、江苏卫视、中央6台、凤凰中文、中央4台、广州电视、中央1台、中央5 台。针对这个现象,并且周末的观看时长略高于工作日。针对这个现象,经营者可以在用户观看时长前15 名的频道中将用户喜好的节目投放时间把控在周末进行播放,从而提高用户的观看兴趣,增加用户黏度。从而增加收视率。
  • 大多数用户选择现金支付。针对这个现象,经营者可以加大线上缴费服务推广宣传,吸引更多的用户,付费频道可以在周日提供更多的节目吸引用户消费,增加收益。

5. 小结

  • 本章基于广播电视数据,包括用户的收视行为信息数据和收费数据,介绍了数据清洗的方法。
  • 并从用户分析、频道分析、时长分析、周时长分析和用户支付方式分析5个方面对广播电视数据进行可视化分析。
  • 从而根据可视化结果,撰写项目分析报告。

七. 新零售智能销售数据可视化实战

1. 了解项目背景与目标

1.1 了解项目背景

  • 由新零售智能销售设备的发展趋势可知,它的出现是由劳动密集型的产业构造向技术密集型转变的产物。大量生产、大量消费以及消费模式和销售环境的变化,要求出现新的流通渠道。而超市、百货购物中心等流通渠道的人工费用不断上升,再加上场地的局限性以及购物的便利性等这些因素的制约,新零售智能销售设备作为一种必须的机器便应运而生了。
  • 某公司在广东省8个市部署了376台新零售智能销售设备,为了分析新零售智能销售设备数量与销售收入的情况,获取近6个月的新零售智能销售设备数据,结合销售背景从销售、库存、用户3个方向进行分析,并利用pyecharts可视化库展现销售现状。

1.2 熟悉数据情况

目前新零售智能销售设备后台管理系统已经积累了大量用户的购买记录,包含2018年4月至2018年9月的购买商品信息,以及所有的子类目信息。数据主要包括“商品表.xlsx” 和“订单表.xlsx” ,对应的数据字典分别下面两表所示。

字段 含义 示例
商品名称 商品名称 黑人牙膏
销售数量 售货机商品的销售数量 5
销售金额 售货机商品的销售金额 25
利润 商品利润 10
库存数量 库存数量 14
进货数量 进货数量 52
存货周转天数 存货周转天数 7
月份 月份 4

1.3 熟悉数据情况

字段 含义 示例
订单编号 每笔订单的编号 112531qr15251001151105
购买数量(个) 用户下单购买的商品个数 1
手续费(元) 第三方平台收取的手续费 0.05
总金额(元) 用户实际付款金额 2.5
支付状态 用户选择的支付方式 微信
出货状态 是否出货成功 出货成功
收款方 实际收款方 鑫零售结算
退款金额(元) 退款给用户的金额 0.00000
购买用户 用户在平台的用户名 oo-CjVwGlFQbkRohFqp3RvbouV5yQ
商品详情 商品详细信息 可口可乐X1;
机器地址 售货机摆放地址 广东省广州市天河区
软件版本 售货机软件版本号 V2.1.55/1.2;rk3288(Root)

1.4 熟悉项目流程

  • 新零售智能销售数据可视化项目的总体流程如图所示,主要步骤如下。
  • 从新零售智能销售设备后台管理系统获取原始数据。
  • 对原始数据进行数据预处理,包括数据清洗、降维、字段规约。
  • 根据行业背景,从销售、库存和用户3个方向对处理后的新零售智能销售数据进行数据分析与可视化。
  • 完成新零售智能销售项目分析报告。

image-20240501200810847

2. 读取与处理新零售智能数据

  • 当对原始数据进行观察后,发现数据中存在一定的噪声数据,如“商品详情”字段中存“158X1;”“0401X1” 等多余的信息;
  • 商品名称不一致,如“罐装芬达原味x1”“罐装芬达原味X1;”;
  • 部分销售记录数据项缺失等。
  • 这些噪声数据将会对后续数据的统计和分析造成一定的影响,所以需要进行数据清洗和数据规约。

2.1 读取数据

  • 新零售智能销售的数据文件主要有订单表2018-4.csv、订单表2018-5.csv、订单表2018-6.csv、订单表 2018-7.csv、订单表2018-8.csv、订单表2018-9.csv和商品表.xlsx。在Python中导入新零售智能销售数据。
  • 由结果可知,4月~9月的订单表中分别含有2081、46431、52682、79450、88670、90006条记录,商品表中有3756条记录。

2.2 清洗数据

  • **合并数据:**由于订单表的数据是按月份分开存放的,为了方便后续对数据进行处理和可视化,所以需要对订单数据进行合并处理。

  • **缺失值检测:**当合并订单表的数据后,为了了解订单表的数据的基本情况,需要进行缺失值检测。

  • **缺失值处理:**订单表中含有缺失值的记录总共有278条,相对较少,可直接使用删除法对其中的缺失值进行处理。

  • **增加字段:**为了满足后续的数据可视化需求,需要在订单表中增加“市”字段。

  • **统一商品名称:**通过浏览订单表数据发现,在“商品详情”字段中存在有异名同义的情况,即两个名称不同的字段所代表的实际意义是一致的,如“维他柠檬茶X1;”“维他柠檬茶x1;”等。因为这种情况会对后面的可

    视化分析结果造成一定的影响,所以需要对订单表中的“商品详情”字段进行处理,增加“商品名称”字段,

  • **异常值处理:**通过浏览订单表数据发现,在“总金额(元)”字段中,存在极少订单的金额很小,如0、0.01等。

    在现实生活中,这种记录存在情况的极少,并且这部分数据不具有分析意义。因此,在本项目中,对订单的金额小于0.5的记录进行删除处理

2.3 规约数据

1. 属性选择

因为订单表中的“手续费(元)”“收款方”“软件版本”“省市区”“商品详情”“退款金额(元)”等字段对本项目的分析没有意义,所以需要对其进行删除处理,实现数据的降维。

2. 字段规约

**时间段规约:**在订单表“下单时间”字段中含有的信息量多,并且存在概念分层,需要对字段进行数据规约,提取需要的信息。提取相应的“小时”字段和“月份”字段,进一步泛化“小时”字段为“下单时间段”字段。当小时≤5时,为“凌晨”;当5<小时≤8时,为“早晨”;当8<小时≤11时,为“上午”;当11<小时≤13时,为“中午”;当13<小时≤16时,为“下午”;当16<小时≤19时,为“傍晚”;当19<小时≤24,为“晚上”。

3. 绘制可视化图形

3.1 绘制销售分析图

  • 在销售数据中含有的数据量较多,作为企业管理人员以及决策制定者,无法直观了解目前新零售智能销售设备的销售状况。因此需要利用处理好的数据进行可视化分析,直观地展示销售走势以及各区销售情况,为决策者提供参考。
  • 商品销售情况在一定程度上可反映商品的销售数量、销售额等,通过对商品销售额、订单数量和各市销售额等销售情况进行分析,可以促进生产的发展,做好销售工作。从销售额与新零售智能销售设备的数量、订单数量与新零售智能销售设备数量、每个市的总销售额、畅销与滞销商品等角度,对新零售智能销售设备的销售进行分析,并进行可视化展示,从而使企业管理人员了解新零售智能销售设备的基本销售情况。

1. 销售额与新零售智能销售设备数量的关系

  • 探索近6个月销售额和新零售智能销售设备数量之间的关系,并按时间走势进行可视化分析。
  • 由上图可知,在4月到7月这段时间,随着新零售智能设备数量增加,销售额也在增加,但8月相对7月而言,设备数量减少了,但销售额还保持了一定的增长。

2. 订单数量与新零售智能销售设备数量的关系

  • 探索近6个月订单数量和新零售智能销售设备数量之间的关系,并按时间走势进行可视化分析。
    由上图可知,订单数量随着新零售智能设备数量增加而增加,随着新零售智能设备数量减少而减少,存在一定的相关性。
  • 由于各市的设备数量并不一致,所以探索各市新零售智能设备平均销售总额进行对比。
  • 由上图可知,深圳市的平均销售总额领先于其他城市,达到了8840.78元,清远市销售额是最少的,只有418.6元。

3. 畅销和滞销商品

  • 查找近6个月销售额前10和后10的商品,从而找出畅销商品和滞销商品,并对其销售金额进行可视化分析。


由上图可知,销售金额排在第一的是芙蓉王,销售额达到了76850元,其次是东鹏和红牛等商品。

由上图可知,销售金额排在最后的商品是道和、绿茶薯条和鱼仔,其销售金额只有1元。

4. 各市商品销售占比情况

  • 探索近6个月各城市销售金额前10的商品占比情况,并对其进行可视化分析。

image-20240501201408968

image-20240501201440770

  • 由各市图形可知,在东莞市、广州市、深圳市和佛山市销售额最高的都是芙蓉王,而中山市销售额最高的是雪碧,清远市销售额最高的是无穷鸡爪,韶关市销售额最高的是日本百佳果肉橙汁,珠海市销售额最高的是孖髻山矿泉水。

image-20240501201501478

5. 新零售智能销售设备的销售情况

  • 探索6个月销售额前10以及销售额后10的设备以及所在的城市,并进行可视化分析。
  • 由下图可知,销售额靠前的城市主要集中在中山市、东莞市和广州市,销售前3的设备都集中在中山市。

  • 由下图可知,广州市的设备113024、112719、
  • 112748的销售额只有1元,而销售金额后10的设备全部在广州市和中山市。

  • 统计各城市销售金额小于100的设备数量,并进行可视化分析。
  • 广州市销售金额小于100元的设备数量达到了49台,中山市有20台,深圳市和韶关市各有1台。而在图中并没有出现珠海市,这是因为珠海市中所有的新零售智能销售设备的销售金额都大于100元。

3.2 绘制库存分析图

  • 在库存管理中,需要对库存进行分析,实现库存合理配置,从而保证在正常的销售货源供应的同时,最大程度减少库存积压,提高资金的流通性。从库存角度出发,利用售罄率、库存成本、进货量、库存量和销售量等指标对库存进行分析,并进行可视化展示。

1. 售罄率分析

  • **售罄率:**是指产品的累计销售占总进货的比例,可用于反应商品的销售速度。其中销售和进货可以是数量,也可以是金额。售罄率的计算如下式所示。

    售罄率=销售量/进货量

  • 分析近6个月商品整体的售罄率,并进行可视化分析。

  • 由右图可知,售罄率从5月到达0.3198后就开始一直下降,

    处于一个较低的水平,仍有很大的提升空间。

2. 库存成本分析

  • **库存成本:**是指在储存的仓库的商品所需的正本,其计算如下式所示。

    库存成本=销售单价×库存量

  • 分析各个月库存成本走势,并进行可视化分析。

  • 由右图可知,4月~9月的库存成本在逐渐上升。

3. 进货数量、库存数量和销售数量走势分析

  • 分析近6个月内进货量、库存量和销售量数据的走势,并进行可视化分析。
  • 由下图可知,库存量、进货量的走势基本保持一致,其中库存量与进货量的最高点为8月,最低点为4月。

3.3 绘制用户分析图

对用户的购买行为进行分析,有助于了解用户的消费特点,提供个性化的服务,从而提升用户的忠诚度和商家的利润。从用户角度出发,利用支付状态、市、下单时间段等字段,对用户进行分析,并进行可视化展示。

1. 用户支付方式分析

  • 对用户在新零售智能销售设备上购买商品时使用的支付方式进行统计,并进行可视化分析。

  • 由下图可知,主要的支付方式有4种,即微信、支付

    宝、会员余额和现金,其中微信是最用户常用支付方式,占了总用户人数的89%。

2. 用户所在城市分析

  • 对各城市的用户数进行统计分析并进行可视化分析。
  • 由下图可知,使用新零售智能销售设备购买商品的用户最多的是广州市,其次是中山市和东莞市,而这3个城市的占比达到了86.35%。

3. 用户消费时段分析

  • 用户在新零售智能销售设备上购买的时间段进行统计分析,并进行可视化分析。
  • 由下图可知,近6个月,下午时间段消费的人数最多,占了21.26%,其次是晚上、上午和傍晚。早晨和凌晨的人数差不多,但是都比较少,只有7%左右。

4. 项目分析报告

通过对新零售智能销售数据的可视化分析,已经初步了解其销售、库存和用户情况。为了更加清晰的展示项目的结果,为决策者提供意见和建议,需要撰写项目分析报告。分析报告包括了背景与目的、分析思路、分析结果、总结与建议,其模板如第1章图1-2所示。

4.1 分析思路

  • 对新零售智能销售数据进行清洗、降维和字段规约。
  • 分别分析销售金额、订单数量与新零售智能销售设备数量的关系。
  • 分析各城市的销售情况、以及畅销商品和滞销商品。
  • 从城市的角度出发,分析各商品在不同城市的销售情况。
  • 从设备的角度出发,分析各设备的销售情况以及各城市销售金额偏少的设备数量。
  • 分析月售罄率、库存成本、月进货量、库存量、销售量情况。
  • 分析用户的支付方式、所在城市以及消费时间段。

4.2 分析结果

  • 4月至7月,新零售智能销售设备的数量在增加,销售额也随着新零售智能销售设备的数量增加而增加;8 月,虽然新零售智能销售设备数量减少了5台,但是销售额还是在增加;9月,相比8月的新零售智能销售设备数量减少了6台,销售额也随着减少。出现这种情况的原因可能是因为广东处于亚热带,气候相对炎热,而8、9月的气温也相对较高,人们外出次数减少造成的。从而可以看出,销售总额与新零售智能销售设备的数量存在一定的相关性,增加新零售智能销售设备的数量将会带来销售总额的增长。

  • 4月至7月,新零售智能销售设备的数量在增加,订单数量也随着新零售智能销售设备的数量增加而增加,而8月至9月,新零售智能销售设备的数量在减少,订单数量也在减少。这说明订单数量与新零售智能销售设备的数量是严格相关的,增加新零售智能销售设备会给用户带来便利,从而提高订单数量。同时,结合图可知,订单数量和销售额的变化趋势基本保持一样的变化趋势,这也说明了订单数量和销售额存在一定的相关性。

深圳市新零售智能销售设备平均销售总额最高,达到了8840.78元,排在其后的是东莞市和珠海市。而最少的是清远市,其销售金额只有418.6元,显得非常少。出现这种情况的原因可能是因为不同区域的人流量不同,而深圳市相对于其他区域的人流量相对较大,清远市相对于其他区域的人流量相对较小。此外,广州市的人流量也相对较大,但是其销售额却相对较少,出现这种情况的原因可能是因为新零售智能销售设备放置的不合理。

销售的最好的商品是芙蓉王,销售额达到了76850元,其次是东鹏和和红牛。后面7个商品的销售额基本差距不大,可以说明这10种商品是人们最愿意在新零售智能销售设备上购买的商品。而由左图可知,销售额最少的商品是道和、绿茶薯条和鱼仔,其销售额只有1元。因此,可以加大芙蓉王、东鹏、红牛等商品的供货量,减少道和、绿茶薯条和鱼仔等商品的供货量。从而增大销售额,减少商品滞留。

  • 由各市的销售额前10的商品及其占比图可知,佛山市、东莞市、广州市和深圳市销售最好的都是芙蓉王,其销售占比也都达到10%以上,在珠海市,虽然销售最好的是孖髻山矿泉水,但是芙蓉王也占到了13.25%,这也反应了这些市销售较好的都是芙蓉王。中山市销售金额排名前10的都是饮料类商品,清远市销售金额前3 都是零食类商品,韶关销售靠前的基本上都是进口饮料。

销售额前3的设备都在中山市,设备编号分别是112866、112667和112669。且销售额前10的设备中,中山市有4台,广州市有2台,东莞市有3台,深圳市有1台。销售金额后10的设备全部集中在广州市和中山市,广州市有8台,中山市有2台。这也从侧面反映了广州的人流量相对较大,但是其销售额却相对较少,是由于设备的放置不合理造成的。

  • 销售额小于100的设备在广州市有49台,中山市有20台,佛山市有10台。出现这种情况的原因可能是设备放置位置的不合理,或设备放置过多造成的,因此可以适当调整新零售智能销售设备放置的位置和数量,减少设备和人员的浪费。

  • 售罄率在5月达到0.32,达到最高。其余月基本都维持在0.14上下,说明销售还有相当大的提升空间,从而提高售罄率。

  • 每个月的库存成本在逐渐提升,9月达到了最高,其金额是1440816.45元。结合售罄率走势图可知,8月的售罄率较低,造成商品库存积压,从而导致库存成本过多。

  • 销售数量在5月之后,基本维持在一个较低的水平。在8月,库存数量和进货数量达到了最高水平,9月相较8月的进货数量和库存数量都有了一定的下降。结合各个月库存成本走势图可知,进货数量和库存数量过多,但销售数量较少,这就导致商品库存的积压,从而造成库存成本的过高。

  • 用户最喜欢的支付方式是微信支付,在所有支付方式中占到了89%。其次是支付宝支付,其占比为9.92%,而现金支付的比例不到1%。因此,经营者可以联合移动支付(如微信、支付宝等)做一些推广活动,增大用户的购买率。
  • 用户占比较高是的主要是广州市、东莞市和中山市,其中广州的人数达到了139280人。最少的是清远市,只占了0.04%。结合各市新零售智能设备平均销售总额图可知,清远市的人流量较少,所以用户较少,这也证明了各市新零售智能设备平均售总额图的结论是成立的。

  • 在下午购买的次数是最多的,占比达到了21.26%,其次是晚上,占比是17.47%,上午和傍晚的占比也都有有16%以上,其余时间段就相对较少了,这也符合人们购物习惯。因此,经营者可以在早上或凌晨进行商品的补充,避免在购买高峰期进行,保证商品供给充足。

4.3 总结和建议

  • 通过对商品销售情况、库存和用户行为的分析,提出以下总结和建议。
  • 新零售智能销售设备的数量和销售额、订单数量存在一定的相关系,并且新零售智能销售设备在各个市的销售是十分不平衡的,而相同市的新零售智能销售设备也存在销售金额的差异,部分新零售智能销售设备的销售额较少,即完全没有带来效益,因此可以适当调整各市的设备数量,合理利用设备,减少设备的浪费;在佛山市、东莞市、广州市、深圳市、珠海市中芙蓉王销售较好,而中山市饮料类商品销售较好,清远市零食类商品的销售较好,韶关市进口饮料的较好,经营者可以结合这个特点为不同的地区投放不同的商品,从而增加销售额。
  • 商品的库存结构总体上不太合理,售罄率较低,库存成本的增加,进货数量、库存数量、销售数量的不平衡,造成了商品的积压,经营者可以对于销售情况不佳的商品(如道和、绿茶薯条和鱼仔等),适当降低商品的价格或举办一些促销的活动,进一步提高商品的销售数量,提高售罄率。

用户偏向于使用微信支付和支付宝,并且偏向于在上午、下午、傍晚和晚上这四个时间段进行商品的购买。针对这一特点,经营者联合移动支付(如微信、支付宝等)在其他几个时间段发放部分优惠券,促使用户增加单次购买商品的数量,促进消费,增加消费额。

4.4 小结

  • 本章基于新零售智能销售数据介绍数据可视化分析以及项目分析报告的撰写。
  • 介绍了数据清洗、降维、字段规约的处理方法。
  • 从销售、库存、用户3个方面对新零售智能销售数据进行可视化分析。
  • 根据可视化结果,撰写项目分析报告。

八.基于TipDM大数据挖掘建模平台

1.学习目标

  • 了解TipDM大数据挖掘建模平台的相关概念和特点。
  • 熟悉使用TipDM大数据挖掘建模平台实现广电大数据可视化项目的总体流程。
  • 掌握使用TipDM大数据挖掘建模平台获取数据的方法。
  • 掌握使用TipDM大数据挖掘建模平台进行数据筛选、分组聚合等操作的方法。
  • 掌握使用TipDM大数据挖掘建模平台绘制柱形图、折线图、饼图等图形的方法。

2.平台简介

  • TipDM大数据挖掘建模平台是由广东泰迪智能科技股份有限公司研发、面向大数据挖掘项目的工具。
  • 平台使用Java语言开发,采用B/S结构,用户不需要下载客户端,可通过浏览器进行访问。
  • 平台提供了基于Python、R以及Hadoop/Spark分布式引擎的大数据分析功能。
  • 用户可在没有编程语言基础的情况下使用平台达到大数据可视化分析的目的。

使用平台实现广电大数据可视化项目的流程之前,需要引入平台的几个概念。

  • 算法:将数据可视化过程涉及的代码分别进行封装,每一个封装好的模块称为一个算法。
  • 实训:为实现某个项目目标,将各算法通过流程化的方式进行连接,整个流程称为一个实训。
  • 实训库:实训库中存放平台所有用户公开的实训,这些实训已经配置好可以直接使用。

2.1 实训库

当登录平台后,用户即可看到实训库模块提供的实训(模板)示例,如下图所示。

  • 通过实训库模块,用户可以创建一个无须导入数据及配置参数就能够快速运行的实训。
  • 用户可以将自己搭建的实训公开至实训库模块,作为实训模板,供其他用户一键创建实训。
  • 每一个模板的创建者都具有该模板的所有权,能够对该模板进行管理。

2.2 数据管理

数据连接模块主要用于数据可视化实训中数据库数据的导入与管理,支持从DB2、SQL Server、MySQL、Oracle、 PostgreSQL等常用关系数据库中导入数据。“新建连接” 对话框如右图所示。

实训数据模块主要用于数据可视化实训中文件类型数据的导入与管理,支持从本地导入任意类型的数据。“新增数据集”对话框如上图所示。

2.3 我的实训

我的实训模块主要用于数据可视化分析流程化的创建与管理,如下图所示。通过我的实训模块,用户可以创建空白实训,进行实训的配置,将数据输入/输出、数据预处理、数据可视化等环节通过流程化的方式进行连接,达到数据分析与可视化的目的。对于质量比较好的实训,可以将其公开到实训库中作为模板,让其他用户学习和借鉴。

2.4 系统算法

系统算法模块中提供了大量的数据分析与可视化算法,主要用于内置常用算法的管理,如下图所示。

3. 实现广电大数据可视化项目

在TipDM大数据挖掘建模平台上配置广电大数据可视化项目主要包括以下两个步骤。

  • 导入数据。在TipDM大数据挖掘建模平台导入预处理后的数据。
  • 数据分析与可视化。对清洗后的数据进行可视化分析。

3.1 数据源配置

本章数据为将用户收视行为数据和收费数据进行预处理后得到的数据,各数据集的详细信息如下表所示。

数据集名称 处理代码 数据表
用户分析数据 代码6-4 用户观看总时长.csv
频道分析数据 代码6-5 观看时长与次数.csv
收视前15频道名称.csv
时长分析数据 代码6-6 工作日用户观看总时长.csv
周末用户观看总时长.csv
周末与工作日观看时长占比.csv
周时长分析数据 代码6-7 周观看时长.csv
付费频道与点播回看的周观看时长.csv
用户支付方式分析数据 代码6-8 用户支付方式总数对比.csv

1. 数据导入

  • 单击“实训数据”,在“我的数据集”中单击“新增数据集”。
  • 设置新增数据集参数。输入带有红色星号的必要信息,单击“确定”按钮上传。
  • 上传成功后,单击“操作”中的眼睛图标,可以预览上传后的数据。

2.创建工程模板并配置数据源

  • 新建空白实训。单击“我的实训”,单击“实训”右侧的“+”按钮,新建一个空白实训。
  • 在“新建实训”对话框中填写实训的信息,包括实训名称和实训描述,并根据需求设置访问权限。
  • 在算法栏中找到“系统算法”下的“输入/输出”类,将“输入源”算法至实训画布中。
  • 单击画布中的“输入源”算法,选择需要导入的数据,并根据数据名称修改算法名称。

3.2 数据可视化

1.绘制用户分析图

  • 拖曳 “柱形图”算法至实训画布中,并与“用户观看总时长”算法相连接。
  • 对“柱状图”算法进行设置。设置好“x轴刻度”与“选择绘图字段”,其余设置保持默认。
  • 运行“柱形图”算法。运行成功后,右击“柱形图”算法,选择“查看日志”命令可查看柱形图效果。

1.绘制用户分析图

使用“柱形图”算法实现用户观看总时长分布图的绘制,其效果图如下。

2.绘制频道分析图

  • 拖曳 “折线柱形组合图”算法至实训画布中,并与“观看时长与次数”算法相连接。
  • 对“折线柱形组合图”算法进行设置。设置“x轴刻度字段”、“折线绘图字段”、“柱形绘图字段”。
  • 运行“折线柱形组合图”算法。运行成功后,右击算法选择“查看日志”命令查看图片效果。

2.绘制频道分析图

使用“折线柱形组合图”算法可以对所有收视频道的观看时长与观看次数进行可视化展示,其效果图如下。

2.绘制频道分析图

  • 拖曳 “柱形图”算法至实训画布中,与“收视前15频道名称”算法相连接。
  • 对“柱形图”算法进行设置。设置“x轴刻度字段”、“绘图字段”,其余设置保持默认。
  • 运行“柱形图”算法。运行成功后,右击算法选择“查看日志”命令查看柱形图效果。

2.绘制频道分析图

对收视前15频道的观看时长进行柱形图绘制,其效果图如下。

3.绘制时长分析图

  • 拖曳 “饼图”算法至实训画布中,并与“周末与工作日观看时长占比”算法相连接。
  • 对“饼图”算法进行设置。设置“标签”、“绘图字段(数值)”,其余设置保持默认。
  • 运行“饼图”算法。运行成功后,右击算法选择“查看日志”命令,查看饼图效果。

3.绘制时长分析图

将工作日(5天)与周末(2天)进行划分,使用饼图展示所有用户的观看总时长的占比分布(计算观看总时长时需要除以天数)情况,其效果图如下。

3.绘制时长分析图

  • 拖曳 “柱形图”算法至实训画布中,并与“工作日用户观看总时长”算法相连接。
  • 对“柱形图”算法进行设置。设置“x轴刻度字段”、“绘图字段”,其余设置保持默认。
  • 运行“柱形图”算法。运行成功后,右击算法选择“查看日志”命令,查看柱形图效果。

3.绘制时长分析图

对所有用户在工作日的观看总时长的分布情况使用柱形图进行可视化展示,其效果图如下。

3.绘制时长分析图

  • 拖曳 “柱形图”算法至实训画布中,并与“周末用户观看总时长”算法相连接。
  • 对“柱形图”算法进行设置。设置“x轴刻度字段”、“绘图字段”,其余设置保持默认。
  • 运行“柱形图”算法。运行成功后,右击算法选择“查看日志”命令,查看柱形图效果。

3.绘制时长分析图

对所有用户在周末的观看总时长的分布情况使用柱形图进行可视化展示,其效果图如下。

4.绘制周时长分析图

  • 拖曳 “折线图”算法至实训画布中,并与“周观看时长”算法相连接。
  • 对“折线图”算法进行设置。设置“x轴刻度字段”、 “绘图字段”,其余设置保持默认。
  • 运行“折线图”算法。运行成功后,右击算法选择“查看日志”命令,查看折线图效果。

4.绘制周时长分析图

使用“折线图”算法实现频道周观看时长分布图的绘制,其效果图如下。

4.绘制周时长分析图

  • 拖曳 “折线图”算法至实训画布中,并与“付费频道与点播回看的周观看时长”算法相连接。
  • 对“折线图”算法进行设置。设置“x轴刻度字段”、 “绘图字段”,其余设置保持默认。
  • 运行“折线图”算法。运行成功后,右击算法选择“查看日志”命令,查看折线图效果。

4.绘制周时长分析图

使用“折线图”算法实现付费频道与点播回看的周观看时长分布图的绘制,其效果图如下。

5.绘制用户支付方式分析图

  • 拖曳 “柱形图”算法至实训画布中,并与“用户支付方式总数对比”算法相连接。
  • 对“柱形图”算法进行设置。设置“x轴刻度字段”、“绘图字段”,其余设置保持默认。
  • 运行“柱形图”算法。运行成功后,右击算法选择“查看日志”命令,查看柱形图效果。

5.绘制用户支付方式分析图

使用“柱形图”算法可以实现用户支付方式分析图的绘制,其效果图如下。

九.函数速查

1.pandas相关函数:

  • pandas.read_csv: 读取CSV文件
  • DataFrame.to_csv: 将DataFrame写入CSV文件
  • pandas.read_excel: 读取Excel文件
  • DataFrame.to_excel: 将DataFrame写入Excel文件
  • pandas.read_sql_table: 从SQL数据库表读取数据
  • pandas.read_sql_query: 执行SQL查询读取数据
  • pandas.read_sql: 读取SQL数据
  • DataFrame.to_sql: 将DataFrame写入SQL数据库表

2.Matplotlib相关函数:

  • plt.figure: 创建画布
  • figure.add_subplot: 添加子图
  • plt.title: 添加标题
  • plt.xlabel: 添加x轴标签
  • plt.ylabel: 添加y轴标签
  • plt.xlim: 设置x轴范围
  • plt.ylim: 设置y轴范围
  • plt.xticks: 设置x轴刻度
  • plt.yticks: 设置y轴刻度
  • plt.legend: 添加图例
  • plt.savefig: 保存图像
  • plt.show: 显示图像
  • matplotlib.pyplot.scatter: 绘制散点图
  • matplotlib.pyplot.plot: 绘制折线图
  • matplotlib.pyplot.bar: 绘制柱形图
  • matplotlib.pyplot.pie: 绘制饼图
  • matplotlib.pyplot.boxplot: 绘制箱线图
  • matplotlib.pyplot.imshow: 绘制热力图

3.seaborn相关函数:

  • seaborn.scatterplot: 绘制散点图
  • seaborn.lineplot: 绘制折线图
  • seaborn.heatmap: 绘制热力图
  • seaborn.barplot: 绘制条形图
  • seaborn.countplot: 绘制计数图
  • seaborn.distplot: 绘制分布图
  • seaborn.boxplot: 绘制箱线图
  • seaborn.pairplot: 绘制成对关系图
  • seaborn.relplot: 绘制关系图

4.pyecharts相关函数:

  • Bar.add_xaxis: 添加X轴数据(条形图)
  • Bar.add_yaxis: 添加Y轴数据(条形图)
  • Scatter.add_xaxis: 添加X轴数据(散点图)
  • Scatter.add_yaxis: 添加Y轴数据(散点图)
  • Line.add_xaxis: 添加X轴数据(折线图)
  • Line.add_yaxis: 添加Y轴数据(折线图)
  • Boxplot.add_xaxis: 添加X轴数据(箱线图)
  • Boxplot.add_yaxis: 添加Y轴数据(箱线图)
  • Pie.add: 添加数据(饼图)
  • Funnel.add: 添加数据(漏斗图)
  • HeatMap.add_xaxis: 添加X轴数据(热力图)
  • HeatMap.add_yaxis: 添加Y轴数据(热力图)
  • WordCloud.add: 添加数据(词云图)
  • Graph.add: 添加数据(关系图)
  • Sankey.add: 添加数据(桑基图)
  • Grid.add: 添加图表(网格图)
  • Page.add: 添加图表(页面图)
  • Timeline.add: 添加数据(时间线轮播图)

十. 思维导图

1. 老师总结

未命名文件

2. 自己总结

未命名文件