一、简介

matplotlib用于绘制图形,支持2D和3D。
步骤:
- 创建画布 plt.figure()
- 绘制图像 plt.plot(x, y)
- 显示图像 plt.show()
示例:
Examples(https://matplotlib.org/stable/gallery/index.html) 支持多种2D和3D图形,日常常用图形有:
- 折线图:plot,以折线的上升或下降来表示统计数量的增减变化的统计图。特点:能够显示数据的变化趋势,反映事物的变化情况。(变化)
- 柱状图:bar,排列在工作表的列或行中的数据可以绘制到柱状图中。特点:绘制连离散的数据,能够一眼看出各个数据的大小,比较数据之间的差别。(统计/对比)
- 饼图: pie,用于表示不同分类的占比情况,通过弧度大小来对比各种分类。特点:分类数据的占比情况(占比)
- 直方图: hist,由一系列高度不等的纵向条纹或线段表示数据分布的情况。一般用横轴表示数据范围,纵轴表示分布情况。绘制连续性的数据展示一组或者多组数据的分布状况(统计)
- 散点图:scatter,用两组数据构成多个坐标点,考察坐标点的分布,判断两变量之间是否存在某种关联或总结坐标点的分布模式。特点:判断变量之间是否存在数量关联趋势,展示离群点(分布规律)
二、示例 matplotlib
python
# 解决中文显示问题,下面的代码只需运行一次即可
import matplotlib as plt
# 如果足Mac本,不文持SimHei的时候,可以修改为其它字体,如 'Microsoft YaHei'或者'Arial Unicode MS'
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus']= False
折线图 plot
基础示例
python
import matplotlib.pyplot as plt
# 1.创建画布,figsize画布大小(宽,高)dpi是分辨率
plt.figure(figsize=(10, 5), dpi=80)
# 2.准备数据(X轴,Y轴)
x= [1, 2, 3, 4]
y = [2, 4, 3, 6]
plt.plot(x, y)
# 3.显示
plt.show()
python
import matplotlib.pyplot as plt
from matplotlib.lines import lineStyles
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus']= False
# 1.创建画布,figsize画布大小(宽,高)dpi是分辨率
plt.figure(figsize=(10, 5), dpi=80)
# 2.准备数据(X轴,Y轴)
x= [1, 2, 3, 4]
y = [2, 4, 3, 6]
'''
一个画布上可以画多个图形
color: 折现颜色,g表示green
'''
plt.plot(x, y, color='red')
# x轴刻度信息
x_ticks = list(range(0, 6))
x_ticks_label = [ f'{i} 月' for i in x_ticks]
plt.xticks(x_ticks, x_ticks_label)
# y轴刻度信息
y_ticks = list(range(0, 10, 2))
plt.yticks(y_ticks)
plt.title('标题', fontsize=20)
plt.xlabel('时间', fontsize=12)
plt.ylabel('温度', fontsize=12)
# 添加网格
plt.grid(linestyle='--', alpha=0.5)
# 添加图例,0表示自动(best),2表示左上(upper left),4(upper right)
plt.legend(loc=0)
plt.savefig('./xxx.png')
# 3.显示(必须放到最后)
plt.show()


在一个画布中绘制多个图形。
python
import matplotlib.pyplot as plt
from matplotlib.lines import lineStyles
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus']= False
# 1.创建画布,绘制2套坐标轴,figsize画布大小(宽,高)dpi是分辨率
# axes表示整个,通过axes[0]获取第一个坐标轴,axes[1]获取第二个坐标轴
fig, axes = plt.subplots(nrows=1, ncols=2, figsize=(20, 8), dpi=80)
# 2.准备数据(X轴,Y轴)
x= [1, 2, 3, 4]
y = [2, 4, 3, 6]
'''
一个画布上可以画多个图形
color: 折现颜色,g表示green
'''
axes[0].plot(x, y, color='g')
axes[1].plot(x * 2, y * 2)
# set_xxx
x_ticks = list(range(0, 6))
x_ticks_label = [ f'{i} 月' for i in x_ticks]
axes[0].set_xticks(x_ticks, x_ticks_label)
y_ticks = list(range(0, 12, 2))
axes[0].set_yticks(y_ticks)
axes[0].set_title('标题', fontsize=20)
axes[0].set_xlabel('时间', fontsize=12)
axes[0].set_ylabel('温度', fontsize=12)
# 添加网格
axes[0].grid(linestyle='--', alpha=0.5)
# 添加图例,0表示自动(best),2表示左上(upper left),4(upper right)
axes[0].legend(loc=0)
plt.savefig('./xxx.png')
# 3.显示(必须放到最后)
plt.show()

柱状图 bar
python
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus']= False
# 0.准备数据
x = ['A', 'B', 'C', 'D']
y = [10, 20, 30, 40]
# 1.创建画布
fig = plt.figure(figsize=(10, 5), dpi=80)
# 2.绘制柱状图
plt.bar(x, y)
plt.grid(linestyle='--', alpha=0.5)
plt.title('柱状图', fontsize=20)
plt.xlabel('分类名', fontsize=15)
plt.ylabel('数量', fontsize=15)
# 3.显示图像
plt.show()

饼图 pie
python
import matplotlib.pyplot as plt
sizes = [25, 35, 25, 15]
labels = ['Category A', 'Category B', 'Category C', 'Category D']
# 创建画布,绘制饼图.
plt.pie(sizes, labels=labels, autopct='%1.1f%%') # 绘制饼图,autopct=1.1f表示保留一位小数
plt.title("Simple Pie Chart") #设置图表标题
plt.show()

直方图 hist
python
import matplotlib.pyplot as plt
import numpy as np
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus']= False
# 0.准备数据
data = np.random.randn(500)
# 1.创建画布
fig = plt.figure(figsize=(10, 5), dpi=80)
# 2.绘制直方图(bins:分类数量)
plt.hist(data, bins=5)
plt.grid(linestyle='--', alpha=0.5)
plt.title('直方图', fontsize=20)
plt.xlabel('分类名', fontsize=15)
plt.ylabel('数量', fontsize=15)
# 3.显示图像
plt.show()

散点图 scatter
python
import matplotlib.pyplot as plt
# 适用于散点数据的统计,或者统计两列值之间的关系....
x= [1,2,3,4,5]
y= [2, 3, 5, 7, 11]
plt.scatter(x, y, color='red') #绘制红色散点图
plt.title("Simple Scatter Plot") #设置图表标题
plt.xlabel("X-axis") #设置X轴标签
plt.ylabel("Y-axis") #设置Y轴标签
plt.show() #显示图表

三、pyecharts
RFM会员价值度模型
会员价值度用来评估用户的价值情况,是区分会上员价值的重要模型和参考依据,也是衡量不同营销效果的关键指标。
价值度模型一般基于交易行为产生,衡量的是有实体转化价值的行为。常用的价值度模型是RFM。
RFM模型是根据会员
- 最近一次购买时间R(Recency)
- 购买频率F(Frequency)
- 购买金额M(Monetary)计算得出RFM得分
通过这3个维度来评估客户的订单活跃价值,常用来做客户分群或价值区分。
RFM模型基于一个固定时间点来做模型分析,不同时间计算的的RFM结果可能不一样。

RFM模型的基本实现过程
- 设置要做计算时的截止时间节点(例如2017-5-30),用来做基于该时间的数据选取和计算。
- 在会员数据库中,以今天为时间界限向前推固定周期(例如1年),得到包含每个会员的会员ID、订单时间、订单金额的原始数据集。一个会员可能会产生多条订单记录。
- 数据预计算。从订单时间中找到各个会员距离截止时间节点最近的订单时间作为最近购买时间:以会员ID为维度统计每个用户的订单数量作为购买频率;将用户多个订单的订单金额求和得到总订单金额。由此得到R、F、M三个原始数据量。
- R、F、M分区。对于F和M变量来讲,值越大代表购买频率越高、订单金额越高;但对R来讲,值越小代表离截止时间节点越近,因此值越好。对R、F、M分别使用五分位(.三分位也可以,分位数越多划分得越详细)法做数据分区。需要注意的是,对于R来讲需要倒过来划分,离截止时间越的值划分越大。这样就得到每个用户的R、F、M三个变量的分位数值。
- 将3个值组合或相加得到总的RFM得分。对于RFM总得分的勺计算有两种方式,一种是直接将3个值拼接到一起,例如RFM得分为312、333、132;另一种是直接将3个值相加求得一个新的汇总值,例如RFM得分为6、9、6。
以某电商公司为例
- R:例如:正常新用户注册1周内交易,7天是重要的值,日用品采购周期是1个月,30天是重要的值
- F:例如:1次购买,2次购买,3次购买,410次,10次以上:
- M:例如:客单价300,热销单品价格240等
常见的确定RFM划分区间的套路:
- 业务实际判断
- 平均值或中位数
- 二八法则
在得到不同会员的RFM之后,根据步骤5产生的两种结果有两种应用思路
- 思路1:基于3个维度值做用户群体划分和解读,对用户的价值度做分析
- 得分为212的会员往购买频率较低,针对购买频率低的客户应定期发送促销活动邮件
- 得分为321的会员虽然购买频率高但是订单金额低等,这些客户往往具有较高的购买黏性,可以考虑通过关联或搭配销售的方式提升订单金额。
- 思路2:基于RFM的汇总得分评估所有会员的价值度价值,并可以做价值度排名。同时,该得分还可以作为输入维度与其他维度一起作为其他数据分析和挖掘模型的输入变量,为分析建模提供基础。
规划目标将RFM的3个维度分别做3个区间的离散化
- 用户群体最大有3X3X3=27个
- 划分区间过多则不利于用户群体的拆分
- 区间过少则可能导致每个特征上的用户区分不显著
python
pip install pyecharts
数据分析过程
1. 加载数据
加载指定日期范围的数据。
2. 数据清洗
-
过滤异常数据:订单金额的分布是不均匀的,里面有明显的极大值例如2016年的数据中,最大值为174900,最小值仅为0.1,极大极小值相差过大,数据会受极值影响。订单金额中的最小值包括0、0.1这样的金额,可能为非正常订单,与业务方沟通后确认,所有低于1元的订单均有这个问题,因此需要在后续处理中去掉。
-
处理缺少数据: 有的表中存在缺失值记录,但数量不多,选择丢弃或填充均可。
3. 确定RFM划分区间
f的分布情况说明
- r和m本身能较好地区分用户特征,而f则无法区分(大量的用户只有1个订单)
- 行业属性(家电)原因,1年购买1次比较普遍(其中包含新客户以及老客户在当年的第1次购买)
- 与业务部门沟通,划分时可以使用2和5来作为边界
- 业务部门认为当年购买>=2次可被定义为复购勾用户(而非累计订单的数量计算复购用户)
- 业务部门认为普通用户购买5次已经是非常高的次数,超过该次数就属于非常高价值用户群体
- 该值是基于业务经验和日常数据报表获得的
4. 示例
python
import os
import time
import numpy as np
import pandas as pd
from sqlalchemy import create_engine
from pyecharts.charts import Bar3D
from pyecharts.commons.utils import JsCode
from pyecharts import options as opts
os.chdir('D:/AI/demo-agent')
# 1.数据加载
sheet_names = ['2015', '20216', '2017', '2018', '会员等级']
sheet_dict = pd.read_excel('./data/sales.xlsx', sheet_name=sheet_names)
# 2.数据清洗
for i in sheet_names[:-1]:
# 删除空值
sheet_dict[i].dropna(inplace=True)
# 过滤异常数据
sheet_dict[i] = sheet_dict[i][sheet_dict[i]['订单金额'] > 1]
# 删除辅助列
sheet_dict[i].drop(columns=['max_year_date'], inplace=True)
# 查看清洗后的统计信息
print(sheet_dict[i].info())
print(sheet_dict[i].describe())
# 3.数据预处理(将多个sheet合并成一个dataframe),合并并重置索引,新增辅助列
df_merge = pd.concat(list(sheet_dict.values()[:-1]), ignore_index=True)
df_merge['max_year_date'] = df_merge['提交日期'].max()
df_merge['year'] = df_merge['提交日期'].dt.year()
df_merge['data_interval'] = df_merge['max_year_date'] - sheet_dict[i]['提交日期']
# 4.数据统计分析
rfm_gb = df_merge.groupby(['year', '会员ID'], as_index=False).agg({
'data_interval': 'min',
'订单号': 'count',
'订单金额': 'sum'
})
rfm_gb.columns = ['year', '会员ID', 'r', 'f', 'm']
# 定义区间边界
print(rfm_gb.iloc[:, 2].describe().T)
# 参考上面的统计信息,将r,f,m划分为3个区间
r_bins = [-1, 79, 255, 365]
f_bins = [0, 2, 5, 130]
m_bins = [1, 69, 1199, 206252]
pd.cut(rfm_gb['r'], bins=r_bins).unique() # 划分3个区间,包右不包左
rfm_gb['r_label'] = pd.cut(rfm_gb['r'], bins=r_bins, labels=[i for i in range(len(r_bins) - 1, 0, -1)])
rfm_gb['f_label'] = pd.cut(rfm_gb['f'], bins=f_bins, labels=[i for i in range(1, len(f_bins))])
rfm_gb['m_label'] = pd.cut(rfm_gb['m'], bins=m_bins, labels=[i for i in range(1, len(m_bins))])
rfm_gb['r_label'] = rfm_gb['r_label'].astype(np.str)
rfm_gb['f_label'] = rfm_gb['f_label'].astype(np.str)
rfm_gb['m_label'] = rfm_gb['m_label'].astype(np.str)
rfm_gb['rfm_group'] = rfm_gb['r_label'] + rfm_gb['f_label'] + rfm_gb['m_label']
rfm_gb.info()
rfm_gb.to_excel('./data/rfm_gb.xlsx', index=False)
engine = create_engine('mysql+pymysql://root:123456@localhost:3306/rfm_db?charset=utf8')
#参3:忽略索引.
#参4:如果表存在,则替换数据.
rfm_gb.to_sql('rfm_table', engine, index=False, if_exists='replace')
pd.read_sql('select * from rfm_table', engine)
# 5.数据可视化
display_data = rfm_gb.groupby(['rfm_group', 'year'], as_index=False).agg({'会员ID': 'count'})
display_data.columns = ['rfm_group', 'year', 'number']
display_data['number'] = display_data['number'].astype(np.int64)
range_color =['#313695', '#4575b4','#74add1','#fee090','#fdae61','#f46d43','#abd9e9','#e0f3f8','#ffffbf','#d73027','#a50026']
range_max = int(display_data['number'].max())
c = Bar3D().add(
"", #图例
[d.tolist() for d in display_data.values],#数据
yaxis3d_opts=opts.Axis3D0pts(type_="category",name='年份'),#y数据类型,名称,year
xaxis3d_opts=opts.Axis30opts(type_="category",name='分组名称'),#x轴数据类型,名称,rfm_group
Zaxis3d_opts=opts.Axis3D0pts(type_="value",name='会员数量'),#z数据类型,名称,numben
).set_global_opts(#全局设置
visualmap_opts=opts.VisualMapopts (max_=range_max,range_color=range_color),#设置颜色,及不同取对应的颜色
title_opts=opts.Title0pts(title="RFM分组结果"),#设置标题
)
c.render() #数据保存到本地的网页中.
# c.render_notebook() #在notebook中显示

5.RFM 用户特征分析
◆ 第 1 类人群:占比超过 10% 的群体。由于这类人群基数大,必须采取批量操作和运营的方式落地运营策略,一般需要通过系统或产品实现,而不能主要依赖于人工
➤ 212:可发展的一般性群体。这类群体购买新近度和订单金额一般,且购买频率低。考虑到其最大的群体基础,以及在新近度和订单金额上都可以,因此可采取常规性的礼品兑换和赠送、购物社区活动、签到、免运费等手段维持并提升其消费状态。
➤ 211:可发展的低价值群体。这类群体相对于 212 群体在订单金额上表现略差,因此在 211 群体策略的基础上,可以增加与订单相关的刺激措施,例如组合商品优惠券发送、积分购买商品等
➤ 312:有潜力的一般性群体。这类群体购买新近度高,说明最近一次购买发生在很短时间之前,群体对于公司尚有比较熟悉的接触渠道和认知状态;购物频率低,说明对网站的忠诚度一般;订单金额处于中等层级,说明其还具有可提升的空间。因此,可以借助其最近购买的商品,为其定制一些与上次购买相关的商品,通过向上销售等策略提升购买频次和订单金额
➤ 112:可挽回的一般性群体。这类群体购买新近度较低,说明距离上次购买时间较长,很可能用户已经处于沉默或预流失、流失阶段;购物频率低,说明对网站的忠诚度一般;订单金额处于中等层级,说明其还可能具有可提升的空间。因此,对这部分群体的策略首先是通过多种方式(例如邮件、短信等)触达客户并挽回,然后通过针对流失客户的专享优惠(例如流失用户专享优惠券)措施促进其消费。在此过程中,可通过增加接触频次和刺激力度的方式,增加用户的回访、复购以及订单价值回报
➤ 213:可发展的高价值群体。这类人群发展的重点是提升购物频率,因此可指定不同的活动或事件来触达用户,促进其回访和购买,例如不同的节日活动、每周新品推送、高价值客户专享商品等。
第 2 类人群:占比为 1%~10% 的群体。这部分人群数量适中,在落地时无论是产品还是人工都可接入
➤ 311:有潜力的低价值群体。这部分用户与 211 群体类似,但在购物新近度上更好,因此对其可采取相同的策略。除此以外,在这类群体的最近接触渠道上可以增加营销或广告资源投入,通过这些渠道再次将客户引入网站完成消费。
➤ 111:这是一类在各个维度上都比较差的客户群体。一般情况下,会在其他各个群体策略和管理都落地后才考虑他们。主要策略是先通过多种策略挽回客户,然后为客户推送与其类似的其他群体,或者当前热销的商品或折扣非常大的商品。在刺激消费时,可根据其消费水平、品类等情况,有针对性地设置商品暴露条件,先在优惠券及优惠商品的综合刺激下使其实现消费,再考虑消费频率以及订单金额的提升。
➤ 313:有潜力的高价值群体。这类群体的消费新近度高且订单金额高,但购买频率低,因此只要提升其购买频次,用户群体的贡献价值就会倍增。提升购买频率上,除了在其最近一次的接触渠道上增加曝光外,与最近一次渠道相关的其他关联访问渠道也要考虑增加营销资源。另外,213 中的策略也要组合应用其中
➤ 113:可挽回的高价值群体。这类群体与 112 群体类似,但订单金额贡献更高,因此除了应用 112 中的策略外,可增加部分人工的参与来挽回这些高价值客户,例如线下访谈、客户电话沟通等
◆ 第 3 类群体:占比非常少,但却是非常重要的群体
➤ 333:绝对忠诚的高价值群体。虽然用户绝对数量只有 355,但由于其各方面表现非常突出,因此可以倾斜更多的资源,例如设计 VIP 服务、专享服务、绿色通道等。另外,针对这部分人群的高价值附加服务的推荐也是提升其价值的重点策略
➤ 233、223 和 133:一般性的高价值群体。这类群体的主要着手点是提升新近购买度,即促进其实现最近一次的购买,可通过 DM、电话、客户拜访、线下访谈、微信、电子邮件等方式直接建立用户挽回通道,以挽回这部分高价值用户
➤ 322、323 和 332:有潜力的普通群体。这类群体最近刚完成购买,需要提升的是购买频次及购买金额。因此可通过交叉销售、个性化推荐、向上销售、组合优惠券、打包商品销售等策略,提升其单次购买的订单金额及促进其重复购买
| 大类分类 | 标签编码 | 用户分层定位 | 核心运营目标 |
|---|---|---|---|
| 第1类(通用体量群体) | 112 | 可挽回一般性群体 | 短信/邮件召回,流失专属券激活回访复购 |
| 第1类(通用体量群体) | 113 | 可挽回高价值群体 | 复用112方案+人工电话/线下访谈深度挽回 |
| 第1类(通用体量群体) | 213 | 可发展高价值潜力群体 | 节日活动、新品推送、专属商品拉高下单频次 |
| 第1类(通用体量群体) | 311 | 有潜力低价值群体 | 加大活跃渠道广告投放,引流回平台消费 |
| 第1类(通用体量群体) | 313 | 有潜力高价值群体 | 多关联渠道曝光+复用213策略,翻倍提升复购 |
| 第1类(通用体量群体) | 111 | 全维度弱势低效群体 | 超大折扣+优惠券撬动首单,运营优先级最低 |
| 第2类(中等体量1%~10%) | 112/113/213/311/313/111 | 数量适中,产品/人工均可承接 | 对应各标签细分策略落地执行 |
| 第3类(极小体量核心用户) | 333 | 绝对忠诚高价值群体 | VIP专属服务、增值服务推荐,深度锁客提收益 |
| 第3类(极小体量核心用户) | 233/223/133 | 一般性高价值流失群体 | 多渠道人工触达,唤醒用户近期下单 |
| 第3类(极小体量核心用户) | 322/323/332 | 刚消费潜力普通群体 | 交叉/向上销售、套装优惠,同步提升客单与复购 |
不同品类、行业对于 RFM 的依赖度是有差异的,即使是一个公司在不同的发展阶段和周期下,3 个维度的优先级上也会有调整
➤ 大家电等消费周期较长的行业,R 和 M 会更重要一些
➤ 快消等消费周期短且快的行业,更看重 R 和 F
➤ 具体要根据当前运营需求与业务部门沟通
◆ 对 R、F、M 区间的划分是一个离散化的过程,具体需要划分为几个区间需要与业务方确认
➤ 本案例划分为 3 个区间,结果对于业务分析而言有些多,意味着业务方需要制定十几套甚至更多的策略
➤ 如果业务方要求简化,也可以划分为 2 个区间,这样出来的分组数最多有 8 组,策略制定更加简单
➤ 具体是划分为 2 个还是 3 个,取决于当前业务方有多少资源可以投入到这个事情中来。
四、pandas绘图
pandas已经集成了绘图,可以快速方便的绘制常用图形。
python
import os
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
os.chdir('D:/AI/demo-agent')
df = pd.read_csv('./data/xxx.csv', index_col=0)
df.info()
df.describe()
df.head()
df.groupby('province', as_index=False).points.count().sort_values(by='points', ascending=False).head(10)
# value_counts = groupby + count + sort_values,效果同上一行代码(但只能用于单列)
df['province'].value_counts().head(10)
# 折线图
df['province'].value_counts().head(10).plot()
# 折线图
df['province'].value_counts().head(10).plot().line()
# 柱状图
df['province'].value_counts().head(10).plot().bar(figsize=(10, 5), color=['r', 'g', 'b', 'y', 'c', 'm', 'k', 'pink', 'gray'], fontsize=14)
polt_kwargs = {'figsize': (10, 5), 'color': ['r', 'g', 'b', 'y', 'c', 'm', 'k', 'pink', 'gray'], 'fontsize': 14}
(df['province'].value_counts().head(10) / len(df)).plot.bar(**polt_kwargs)
# 面积图
df.points.value_counts().head(10).plot.area(**polt_kwargs)
五、seaborn
seaborn 底层用的就是 matplotlib
直方图 histplot
要想设置画布,还需要显式创建画布。
python
import seaborn as sns
# sns自带一些数据集,可以直接使用(需要联网)
df = sns.load_dataset('tips')
df.head()
# x: x轴的列名, hue: 按照某个列名进行分组
sns.histplot(data=df, x='total_bill', hue='sex')
python
import seaborn as sns
from matplotlib import pyplot as plt
# sns自带一些数据集,可以直接使用(需要联网)
df = sns.load_dataset('tips')
# 对画布进行精细设置
fig, ax = plt.subplot(figsize(10, 5))
# 直方图:x: x轴的列名, hue: 按照某个列名进行分组
sns.histplot(data=df, x='total_bill', hue='sex')
ax.set_title('男女总账单分布', fontsize=16)
plt.show()
散点图 scatterplot
python
import seaborn as sns
from IPython.core.pylabtools import figsize
from matplotlib import pyplot as plt
# sns自带一些数据集,可以直接使用(需要联网)
df = sns.load_dataset('tips')
fig, ax = plt.subplots(figsize=(10, 5))
# 散点图
sns.scatterplot(data=df, x='total_bill', y='tip', hue='sex')
散点图 + 回归线 regplot
python
import seaborn as sns
from IPython.core.pylabtools import figsize
from matplotlib import pyplot as plt
# sns自带一些数据集,可以直接使用(需要联网)
df = sns.load_dataset('tips')
fig, ax = plt.subplots(figsize=(10, 5))
# regplot 可以绘制散点图,同时可以绘制回归线(底层是线性回归)
sns.regplot(data=df, x='total_bill', y='tip')
ax.set_title('散点图+回归线')
plt.show()
python
import seaborn as sns
from matplotlib import pyplot as plt
df = sns.load_dataset('tips')
fig, ax = plt.subplots(figsize=(10, 5))
sns.jointplot(data=df, x='total_bill', y='tip', kind='hex')
ax.set_title('散点图+回归线')
plt.show()
箱线图
python
import seaborn as sns
from matplotlib import pyplot as plt
df = sns.load_dataset('tips')
fig, ax = plt.subplots(figsize=(10, 5))
# 箱线图
sns.boxplot(data=df, x='time', y='total_bill', hue='sex', split=True)
plt.show()