二. Pandas可视化
Pandas绘图介绍
概述
-
pandas库是Python数据分析的核心库
-
它不仅可以加载和转换数据,还可以做更多的事情:它还可以可视化
-
pandas绘图API简单易用,是pandas流行的重要原因之一
可视化小技巧
如果是类别型
-
柱状
-
饼图 (类别相对较少 5-6个 或者更少), 所有的类别加起来是1个整体
如果是数值型
-
看变化趋势 折线 plot.line()
-
看分布直方plot.hist()
直方图技巧
-
绘制直方图的时候,需要注意, 如果数据分布不均匀(倾斜的数据, 有取值数量较少的极大, 极小值) 这个时候如果不做数据的处理, 直接绘制直方图, 不能反映出数据的分布来, 只能得到一个柱子
-
可以把极值单独取出来讨论
-
把去掉极值的部分再绘制直方图
案例-葡萄酒数据集
数据介绍
数据使用葡萄酒评论数据集
,来自葡萄酒爱好者杂志,包含10个字段,150929行,每一行代表一款葡萄酒
数据准备
import pandas as pd import os import matplotlib.pyplot as plt plt.rcParams['font.sans-serif'] = ['SimHei'] # 正常显示汉字 plt.rcParams['axes.unicode_minus'] = False # 正常显示负号 os.chdir(r'D:\CodeProject\03data_processing_analysis\my_project') os.getcwd() reviews = pd.read_csv('data/winemag-data_first150k.csv') reviews # 定义绘图参数变量 kwargs_dict = dict(figsize=(12, 6), color=['r', 'g', 'b', 'y', 'k', 'c', 'pink', 'purple', 'gray', 'orange'], fontsize=20)
条形图(柱状图)
所有葡萄酒按产区分类
# 需求1: 所有葡萄酒按产区分类 reviews.province.value_counts().head(10).plot.bar(figsize=(12, 6), color=['r', 'g', 'b', 'y', 'k', 'c', 'pink', 'purple', 'gray', 'orange'])
计算产葡萄酒最多的10个产区, 产出葡萄酒的比例
# 需求2: 计算产葡萄酒最多的10个产区, 产出葡萄酒的比例 (reviews.province.value_counts().head(10) / len(reviews)).plot.bar(**kwargs_dict)
评分数量的分布
# 需求3: 评分数量的分布 reviews.points.value_counts().sort_index().plot.bar(**kwargs_dict)
折线图
# 查看葡萄酒评分情况分布 reviews.points.value_counts().sort_index().plot.line(**kwargs_dict)
面积图
# 查看葡萄酒评分情况分布 reviews.points.value_counts().sort_index().plot.area(**kwargs_dict)
饼图(适合少量信息)
# 查看葡萄酒评分情况分布 # reviews.points.value_counts().sort_index().plot.pie(**kwargs_dict) # 数据条目较多, 显示效果不好 reviews.province.value_counts().head(10).plot.pie(**kwargs_dict)
三. Seaborn可视化
数据准备:
import pandas as pd import os import seaborn as sns import matplotlib.pyplot as plt plt.rcParams['font.sans-serif'] = ['SimHei'] # 正常显示汉字 plt.rcParams['axes.unicode_minus'] = False # 正常显示负号 os.chdir(r'D:\CodeProject\03data_processing_analysis\my_project') os.getcwd() tips = pd.read_csv('data/tips.csv') tips
介绍
概述
-
Seaborn是基于matplotlib的图形可视化python包。
-
它提供了一种高度交互式界面,便于用户能够做出各种有吸引力的统计图表。
-
Seaborn是在matplotlib的基础上进行了更高级的API封装,从而使得作图更加容易,在大多数情况下使用seaborn能做出很具有吸引力的图,而使用matplotlib就能制作具有更多特色的图。
-
Seaborn和Pandas的API配合的很好,使用DataFrame/Series的数据就可以绘图seaborn: statistical data visualization — seaborn 0.13.2 documentation
通用参数
-
data 传入一个df 对象
-
x , y df中的列名
-
hue 传入一个类别型的列名, 同样的图会按照这个类别, 分组, 分别绘制一份绘制到一起方便进行对比
调整图的大小
-
plt.subplots(figsize=())
-
如果plt.subplots(figsize=()) 不行, 都会有一个height的参数, 指定图片的高度 可以通过height 调整图片大小
-
height 高度 aspect 宽高比例
绘图类型
单变量
直方图: histplot()
核密度图: kdeplot()
计数图: countplot()
散点图: scatterplot(hue=多变量分组字段)
regplot(fit_reg=是否绘制回归线)
jointplot(height=宽高)
双变量与多变量
2D核密度图-双变量: kedplot(fill=是否填充, cbar=是否显示图例)
箱线图-双变量: boxplot()
小提琴图-双变量: violinplot(hue=多变量分组字段, split: 是否拆分, 一般结合hue属性使用)
Seaborn样式风格
格式:sns.set_style('风格') 该函数只要运行一次,后续绘图的样式都会发生变化
常用风格:
white(白色无网格)
whitegrid(白色有网格)dark(黑色无网格)
darkgrid(黑色有网格)
ticks(刻度线)
直方图-单变量
histplot代码
fig, ax = plt.subplots(figsize=(10, 5)) # data: 要操作的df对象 或者 Series对象 # x: x轴数据 # y: y轴数据 # bins: 划分的区间 # hue: 分组字段, 默认为None, 按照该字段进行分组, 把相同分组数据画到一起 # kde: 绘制 核密度预估曲线 # 写法1: 传图df对象(掌握) sns.histplot(data=tips, x='total_bill', bins=10, hue='sex', kde=True) # # 写法2: 直接传入Series对象(了解) # sns.histplot(tips.total_bill, bins=10) ax.set_title('直方图-总消费金额分布情况') plt.show()
histplot结果图
核密度预估图-单变量
KDE图: 用于估计未知随机变量的概率分布. x轴: 样本数据, y轴: 概率分布.
KDE图可以理解为是对直方图的加窗平滑. 它解决了一个基本的数据平滑问题, 即: 根据有限的数据样本对总体进行推断.
kdeplot代码
# 密度图 和 直方图的区别: 密度图是连续的 => 概率分布, 直方图是离散的 => 样本数据. # 应用场景: 基于少量的样本数据, 去推理总体数据的概率分布情况. fig, ax = plt.subplots(figsize=(10, 5)) # x轴: 总消费金额(样本数据), y: 密度值(概率分布) sns.kdeplot(data=tips, x='total_bill') ax.set_title('密度图-总消费金额分布情况') plt.show()
kdeplot结果图
计数柱状图-单变量
计数图和直方图很像,直方图通过
对数据分组
来描述分布,计数图(条形图)是对
离散变量(分类变量)
计数。
countplot代码1
# 按照星期几分组, 统计消费次数 # 方式1: 计数图 # 计数图 = 按照某个字段分组, 统计每个分组的数量, 绘制成条形图 fig, ax = plt.subplots(figsize=(10, 5)) sns.countplot(data=tips, x='day', color='b') ax.set_title('消费次数分布') plt.show()
countplot结果图1
代码2
# 按照星期几分组, 统计消费次数 # 方式2: 手动分组 # tips.groupby('day').total_bill.count().plot.bar(figsize=(10, 5), color=['r', 'g', 'b', 'y']) # 方式3: 直接分组统计day的数量, value_counts()函数 tips.day.value_counts().plot.bar(figsize=(10, 5), color=['r', 'g', 'b', 'y']) plt.title('消费次数分布') plt.show()
结果图2
散点图-双变量
scatterplot代码
# 1. 获取画布, 坐标轴对象. fig, ax = plt.subplots(figsize=(10, 5)) # 2. 绘制散点图, 分析: 总消费金额, 小费 之间的关系. # sns.scatterplot(data=tips, x='total_bill', y='tip') # 2. 绘制散点图, 分析: 总消费金额, 小费, 性别 之间的关系. sns.scatterplot(data=tips, x='total_bill', y='tip', hue='sex') # 3. 设置标题 ax.set_title('散点图-总消费金额和小费之间的关系') # 4. 绘图 plt.show()
scatterplot结果图
regplot代码
# 1. 获取画布, 坐标轴对象. fig, ax = plt.subplots(figsize=(10, 5)) # 2. 绘制散点图, 分析: 总消费金额, 小费 之间的关系. # fit_reg: 是否绘制回归线, True(默认) => 绘制, False => 不绘制. # 拟合回归线: 就是基于数据点(散点), 拟合出一条直线, 底层跑了: 线性回归. # sns.regplot(data=tips, x='total_bill', y='tip', fit_reg=False) sns.regplot(data=tips, x='total_bill', y='tip', fit_reg=True) # 3. 设置标题 ax.set_title('散点图-总消费金额和小费之间的关系') # 4. 绘图 plt.show()
regplot结果图
蜂巢图
jointplot代码
# 细节: 某些函数在绘图的时候, 是直接绘制的, 无需指定画板等, 也没有figsize属性设置: 图形宽高. # 这类函数一般都有 height属性, 设置图形宽高. # 可以把 jointplot()理解为: 散点图 + 直方图(每行每列都会绘制直方图) # 1. 绘制散点图, 分析: 总消费金额, 小费 之间的关系. # sns.jointplot(data=tips, x='total_bill', y='tip', height=10) # 如果设定了kind属性值, 可以将去绘制成: 蜂巢图. sns.jointplot(data=tips, x='total_bill', y='tip', height=10, kind='hex') # 2. 设置标题 plt.title('散点图-总消费金额和小费之间的关系') # 3. 绘图 plt.show()
jointplot结果图
2D密度图-双变量
kdeplot代码
# 需求: 通过 2D 密度图, 分析: 总消费金额, 小费 之间的关系. # 1. 获取画布, 坐标轴对象. fig, ax = plt.subplots(figsize=(10, 5)) # 2. 绘制 2D 密度图 # cbar: 是否绘制颜色条 # fill: 是否填充颜色 sns.kdeplot(data=tips, x='total_bill', y='tip', fill=True, cbar=True) # 3. 设置标题 ax.set_title('2D Kde TotalBill & Tip') # 4. 绘图 plt.show()
kdeplot结果图
箱线图-双变量
箱线图: 用于显示多种统计信息:最小值,1/4分位,中位数,3/4分位,最大值,以及离群值(如果有)
boxplot代码
# 需求: 通过 箱线图(盒须图, 箱子图), 分析: 总消费金额, 时间 之间的关系. # IQR: Interquantile Range, 四分位距表示法, IQR = Q3 - Q1 # 1. 获取画布, 坐标轴对象. fig, ax = plt.subplots(figsize=(10, 5)) # 2. 绘制 箱线图 sns.boxplot(data=tips, x='time', y='total_bill') # 3. 设置标题 ax.set_title('箱线图-分析就餐时间和消费总金额之间的关系') # 4. 绘图 plt.show()
boxplot结果图
箱线图解释
-
箱子的中间有一条线,代表了数据的中位数
-
箱子的上下底,分别是数据的上四分位数(Q3)和下四分位数(Q1)
-
箱体包含了50%的数据。因此,箱子的高度在一定程度上反映了数据的波动程度
-
上下边缘则代表了该组数据的最大值和最小值
-
IQR = 上四分位数(Q3) - 下四分位数(Q1)
四分位距(interquartile range, *IQR*),又称四分差
-
判断异常值时最大值(上边界) = 上四分位数(Q3) + 1.5 IQR 大于这个值的就是异常值
-
判断异常值时最小值(下边界) = 下四分位数(Q1)- 1.5 IQR 小于这个值的就是异常值
-
-
有时候箱子外部会有一些点,可以理解为数据中的“异常值”
小提琴图-双变量
介绍
小提琴图, 它是经典的可视化方法,但可能会掩盖数据的分布
小提琴图能显示与箱线图相同的值, 小提琴图把"箱线"绘成核密度估计,
有助于保留数据的更多可视化信息
优势
-
小提琴图同时展示了数据的统计分布和概率密度,能够更好地揭示数据的形态和特征。
-
小提琴图可以通过分组变量进行比较分析,方便观察不同类别间的差异。
-
小提琴图能够显示数据的离散程度,通过观察图形的宽度可以了解数据的散布情况。
violinplot代码
# 小提琴图就是在箱线图的基础上, 加入了密度图, 即: 把箱线图的箱线 替换成 核密度曲线. # 需求: 通过 箱线图(盒须图, 箱子图), 分析: 总消费金额, 时间 之间的关系. # 1. 获取画布, 坐标轴对象. fig, ax = plt.subplots(figsize=(10, 5)) # 2. 绘制 箱线图 # hue: 可以理解为分组字段, 会按照该字段进行分组, 把相同分组数据画到一张图上. 这里是按照 性别分组 # split: 是否拆分, True => 拆分, False => 不拆分, 它一般要结合hue属性一起使用. sns.violinplot(data=tips, x='time', y='total_bill') # sns.violinplot(data=tips, x='time', y='total_bill', hue='sex', split=True) # 3. 设置标题 ax.set_title('小提琴图-分析就餐时间和消费总金额之间的关系') # 4. 绘图 plt.show()
violinplot结果图
violinplot多变量图
violinplot多变量代码
# 细节: 在Seaborn中, 绘制多变量没有固定的套路, 都是通过属性传参即可. # 需求: 查看 时间(就餐类型, time) 和 总消费金额, 性别之间的关系. # 1. 获取画布, 坐标轴对象. fig, ax = plt.subplots(figsize=(10, 5)) # 2. 绘制图形 => 小提琴图 sns.violinplot(data=tips, x='time', y='total_bill', hue='sex', split=True) # 3. 设置标题. ax.set_title('小提琴图-多变量-时间, 金额, 性别') # 4. 具体的绘制动作 plt.show()