数据处理与统计分析篇-day11-Pandas绘图与Seaborn绘图

二. Pandas可视化

Pandas绘图介绍

概述

  • pandas库是Python数据分析的核心库

  • 它不仅可以加载和转换数据,还可以做更多的事情:它还可以可视化

  • pandas绘图API简单易用,是pandas流行的重要原因之一

可视化小技巧

如果是类别型
  1. 柱状

  2. 饼图 (类别相对较少 5-6个 或者更少), 所有的类别加起来是1个整体

如果是数值型
  1. 看变化趋势 折线 plot.line()

  2. 看分布直方plot.hist()

直方图技巧
  1. 绘制直方图的时候,需要注意, 如果数据分布不均匀(倾斜的数据, 有取值数量较少的极大, 极小值) 这个时候如果不做数据的处理, 直接绘制直方图, 不能反映出数据的分布来, 只能得到一个柱子

  2. 可以把极值单独取出来讨论

  3. 把去掉极值的部分再绘制直方图

案例-葡萄酒数据集

数据介绍

数据使用葡萄酒评论数据集,来自葡萄酒爱好者杂志,包含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

介绍

概述

  1. Seaborn是基于matplotlib的图形可视化python包。

  2. 它提供了一种高度交互式界面,便于用户能够做出各种有吸引力的统计图表。

  3. Seaborn是在matplotlib的基础上进行了更高级的API封装,从而使得作图更加容易,在大多数情况下使用seaborn能做出很具有吸引力的图,而使用matplotlib就能制作具有更多特色的图。

  4. Seaborn和Pandas的API配合的很好,使用DataFrame/Series的数据就可以绘图seaborn: statistical data visualization — seaborn 0.13.2 documentation

通用参数

  1. data 传入一个df 对象

  2. x , y df中的列名

  3. hue 传入一个类别型的列名, 同样的图会按照这个类别, 分组, 分别绘制一份绘制到一起方便进行对比

调整图的大小

  1. plt.subplots(figsize=())

  2. 如果plt.subplots(figsize=()) 不行, 都会有一个height的参数, 指定图片的高度 可以通过height 调整图片大小

  3. 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结果图

箱线图解释

  1. 箱子的中间有一条线,代表了数据的中位数

  2. 箱子的上下底,分别是数据的上四分位数(Q3)和下四分位数(Q1)

  3. 箱体包含了50%的数据。因此,箱子的高度在一定程度上反映了数据的波动程度

  4. 上下边缘则代表了该组数据的最大值和最小值

    • IQR = 上四分位数(Q3) - 下四分位数(Q1)

      四分位距(interquartile range, *IQR*),又称四分差

    • 判断异常值时最大值(上边界) = 上四分位数(Q3) + 1.5 IQR 大于这个值的就是异常值

    • 判断异常值时最小值(下边界) = 下四分位数(Q1)- 1.5 IQR 小于这个值的就是异常值

  5. 有时候箱子外部会有一些点,可以理解为数据中的“异常值”

小提琴图-双变量

介绍

小提琴图, 它是经典的可视化方法,但可能会掩盖数据的分布

小提琴图能显示与箱线图相同的值, 小提琴图把"箱线"绘成核密度估计,

有助于保留数据的更多可视化信息

优势

  1. 小提琴图同时展示了数据的统计分布和概率密度,能够更好地揭示数据的形态和特征。

  2. 小提琴图可以通过分组变量进行比较分析,方便观察不同类别间的差异。

  3. 小提琴图能够显示数据的离散程度,通过观察图形的宽度可以了解数据的散布情况。

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()

violinplot多变量结果图

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值