Python Seaborn 类别内的数据分布和统计估计

Seaborn 是一个基于 matplotlib 的 Python 数据可视化库,提供了一系列优雅且高级的数据可视化接口。可以使用多种图形来显示类别内的数据分布和进行统计估计。Seaborn提供了一系列绘图函数,用于处理分类数据,以便更好地理解数据集中不同类别的分布情况。

1、使用 barplot() 绘制条形图

条形图用于显示一个或多个分类变量的中心趋势(如均值)。它可以展示每个类别的估计值及其置信区间。使用barplot()绘制条形图的函数,可以用于可视化类别内的数据分布和统计估计。常用参数如下,

参数

描述

x

指定数据的横轴变量

y

指定数据的纵轴变量

hue

在同一图中添加另一个类别维度

data

要使用的数据集,通常是 pandas 的 DataFrame

order

控制条形的顺序

hue_order

使用 hue 时控制不同 hue 类别的顺序

estimator

用于聚合的统计函数,默认是平均值

ci

置信区间的大小,默认是 95%

n_boot

计算置信区间的引导样本的数量

orient

控制条形图的方向,'v' 垂直,'h' 水平

color

设置所有条形的颜色

palette

为不同的类别指定不同的颜色

saturation

设置颜色的饱和度

errcolor

错误条的颜色

errwidth

错误条的宽度

capsize

错误条两端的横杠大小

dodge

使用 hue 时,控制条形是否应该分开

使用代码:

import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np

# 示例数据
np.random.seed(0)
data = pd.DataFrame({
    'Category': np.random.choice(['A', 'B', 'C'], 100),
    'Value': np.random.rand(100),
    'Subcategory': np.random.choice(['X', 'Y'], 100)
})

# 设置 seaborn 样式
sns.set(style="whitegrid")

# 创建一个 barplot
plt.figure(figsize=(10, 6))
bar_plot = sns.barplot(
    x='Category',       # 类别变量
    y='Value',          # 数值变量
    hue='Subcategory',  # 子类别变量
    data=data,          # 数据源
    estimator=np.mean,  # 使用平均值作为估计量
    errorbar=('ci', 95),              # 置信区间设为 95%
    palette='deep',     # 调色板
    capsize=0.05        # 错误条横杠大小
)

# 添加图表标题和标签
plt.title('cjavapy')
plt.xlabel('Category')
plt.ylabel('Average Value')

plt.draw()

# 展示图表
plt.show()

2、使用 countplot() 绘制计数图

计数图用于显示每个类别的观察数量,是条形图的一种特殊形式。使用 countplot() 绘制计数图用于显示类别变量中每个类别的观察数量。这个函数特别有用于数据探索和可视化,因为它可以直观地展示类别数据的分布。常用参数如下,

参数名称

描述

data

输入数据,可以是 DataFrame、数组、列表等。

x, y

数据中的变量,用于沿 x 轴或 y 轴绘制计数。

hue

分类变量名,用于数据分组,以不同颜色区分。

order

控制主分类的顺序。

hue_order

控制

hue

分类的顺序。

orient

设置图的方向,"v" 为垂直,"h" 为水平。

color

设置所有条形的颜色。

palette

设置不同的颜色,常用于

hue

参数。

saturation

调整颜色的饱和度。

dodge

设置条形是否分开或堆叠,用于

hue

参数。

ax

指定在哪个 matplotlib 的 Axes 对象上绘图。

kwargs

传递给底层 matplotlib 函数的其他关键字参数,用于自定义图表。

使用代码:

import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd

# 示例数据集
data = {
    "category": ["A", "B", "A", "C", "B", "A", "C", "C", "B", "A", "C", "B"],
    "value": [10, 20, 15, 10, 25, 30, 5, 25, 20, 15, 10, 15]
}

df = pd.DataFrame(data)

# 使用 seaborn 绘制 countplot
plt.figure(figsize=(8, 6))
sns.countplot(x='category', data=df, color='blue', saturation=0.75)

# 添加标题和标签
plt.title("cjavapy")
plt.xlabel("Category")
plt.ylabel("Count")

plt.draw()

plt.show()

3、使用 boxplot() 绘制箱线图

箱线图显示了分布的四分位数,以及异常值。一种很好的方式来可视化数据的分布范围和中心趋势。使用 boxplot() 函数绘制箱形图,非常适合于展示类别内的数据分布和统计估计。常用参数如下,

参数

描述

data

数据源,可以是 DataFrame、数组、列表或数组列表

x

数据的变量名,用于水平轴上的数据

y

数据的变量名,用于垂直轴上的数据

hue

用于在数据内进一步分类的变量名

order

控制箱形图的顺序

hue_order

控制在 hue 分类中的顺序

orient

控制箱形图的方向,'v' 表示垂直,'h' 表示水平

color

控制箱形图的主要颜色

palette

给不同级别的 hue 变量设置不同的颜色

saturation

控制颜色的饱和度,介于0和1之间

width

控制箱形图的宽度

linewidth

控制线条的宽度

fliersize

控制异常值标记的大小

whis

控制 IQR(四分位距)的比例

notch

如果设置为 True,箱形图将会带有一个缺口

dodge

当使用 hue 参数时,设置为 True 可以将不同的 hue 类别分开显示

showmeans

控制是否显示均值线

showcaps

控制是否显示上下边界线

showbox

控制是否显示箱体

showfliers

控制是否显示异常值

使用代码:

import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np

# 创建虚构数据
np.random.seed(0)
data = {
    'Category': np.random.choice(['Electronics', 'Clothing', 'Furniture'], size=300),
    'Sales': np.random.gamma(shape=2., scale=100., size=300),
    'Year': np.random.choice(['2019', '2020', '2021'], size=300)
}

df = pd.DataFrame(data)

# 创建箱形图
plt.figure(figsize=(10, 6))
sns.boxplot(x='Category', y='Sales', hue='Year', data=df, palette="Set3", showfliers=False)

# 添加标题和标签
plt.title('cjavapy')
plt.xlabel('Category')
plt.ylabel('Sales')

plt.draw()
# 显示图形
plt.show()

4、使用 violinplot() 绘制小提琴图

小提琴图结合了箱线图和核密度估计的特点,提供了关于分布的更多信息。使用 violinplot() 绘制小提琴图用于显示类别内的数据分布和统计估计。可以帮助你理解不同类别内的数据分布情况。常用参数如下,

参数

描述

data

代表数据集,可以是 DataFrame、数组、列表或类似数组的对象。

x

用于绘图的数据中的变量,x 是横轴。

y

用于绘图的数据中的变量,y 是纵轴。

hue

用于分类的变量,决定了数据如何着色。

order

指定 x 变量的类别顺序。

hue_order

指定 hue 变量的类别顺序。

bw

控制小提琴内部核密度估计的带宽,可以是标量或 'scott'、'silverman' 等。

scale

控制小提琴的宽度,可选 'area'、'count'、'width'。

inner

控制小提琴内部数据点的表示方式,如 'box'、'quartile'、'point'、'stick'、None。

split

当使用 hue 参数时,设为 True 可以将不同的 hue 类别画在同一个小提琴内。

palette

用于为不同的 hue 类别指定颜色。

scale_hue

当 scale 为 'count' 时,决定是否分别为每个 hue 类别缩放宽度。

gridsize

用于计算核密度估计的网格大小。

width

整个小提琴图的最大宽度。

使用代码:

import seaborn as sns
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

# 创建示例数据
np.random.seed(10)
data = pd.DataFrame({
    'group': np.repeat(['A', 'B', 'C'], 100),
    'value': np.concatenate([np.random.normal(0, 1, 100), 
                             np.random.normal(5, 2, 100), 
                             np.random.normal(10, 3, 100)])
})
# 绘制小提琴图
plt.figure(figsize=(10, 6))
sns.violinplot(x='group', y='value', data=data, 
               palette='Set2', inner='quartile', bw=0.8)

plt.title('cjavapy')
plt.draw()
plt.show()

5、使用 pointplot() 绘制点图

点图用于显示点估计和置信区间,提供了一种估计分类数据的另一种视角。使用 pointplot() 绘制点图用于显示数据点的集中趋势,并使用误差条提供关于数据变化范围的一些估计。适合于展示和比较数值变量在一个或多个分类变量的不同水平下的效果。常用参数如下,

参数

描述

data

要绘制的数据

x, y

在数据中指定变量的名称,

x 用于横轴,y 用于纵轴

hue

用于分组的变量名称,生成不同颜色的点以区分不同组

palette

设置不同级别的 hue 变量的颜色

order, hue_order

控制 x 变量或 hue 变量的级别顺序

ci

指定置信区间的大小,"sd" 表示绘制标准差

estimator

应用于每个组的 y 值数组的函数,估计中心趋势(默认为平均值)

markers

控制点的标记样式

linestyles

控制线的样式

dodge

当使用 hue 参数并且只有一个观测值时,沿分类轴分开绘制点

使用代码:

import seaborn as sns
import matplotlib.pyplot as plt

# 生成示例数据集
tips =  pd.DataFrame({
    'total_bill': [16.99, 10.34, 21.01, 23.68, 24.59],
    'tip': [1.01, 1.66, 3.50, 3.31, 3.61],
    'sex': ['Female', 'Male', 'Male', 'Male', 'Female'],
    'smoker': ['No', 'Yes', 'No', 'Yes', 'No'],
    'day': ['Sun', 'Thur', 'Sat', 'Sun', 'Fri'],
    'size': [2, 3, 3, 2, 4]
})

# 创建点图
sns.pointplot(x='day', y='tip', hue='sex', data=tips, palette='deep', ci=95, markers=["o", "s"], linestyles=["-", "--"])

# 增加标题和标签
plt.title('cjavapy')
plt.xlabel('Day of the Week')
plt.ylabel('Average Tip ($)')

plt.draw()
plt.show()

6、使用 catplot() 绘制分类回归图

分类回归图是用于绘制分类数据的接口,可以结合不同类型的图形。catplot() 是一个非常灵活的函数,它可以用来绘制多种类型的分类图表,包括 pointplot、barplot、countplot 等。常用参数如下,

参数

描述

data

输入的数据集,通常是 Pandas 的 DataFrame。

x, y

数据中的变量名,用于绘图的横轴和纵轴。

hue

用于分组的变量名,通常用于在同一图中显示不同类别的数据。

row, col

用于创建多面板图,可以分别在行和列方向显示不同的变量。

kind

图表的类型,“strip”, “swarm”, “box”, 

“violin”, “boxen”, “point”, “bar”, 或 “count”。

height, aspect

控制每个面板的大小和纵横比。

palette

颜色方案,用于控制不同类别的颜色。

legend

是否显示图例以及其位置。

legend_out

当设置为 True 时,图例将被放置在整个图形的外部。

sharex, sharey

是否在多面板图中共享 x 轴或 y 轴。

facet_kws

传递给 FacetGrid 的额外参数。

kwargs

传递给底层绘图函数的其他关键字参数。

使用代码:

import seaborn as sns
import pandas as pd
import numpy as np

# 示例数据
np.random.seed(10)
data = pd.DataFrame({
    'category': np.random.choice(['Category A', 'Category B', 'Category C'], 100),
    'value': np.random.normal(10, 3, 100),
    'group': np.random.choice(['Group 1', 'Group 2'], 100)
})

# 箱形图
sns.catplot(x='category', y='value', kind='box', data=data)

# 小提琴图
sns.catplot(x='category', y='value', kind='violin', hue='group', data=data)

# 条形图
sns.catplot(x='category', y='value', kind='bar', hue='group', data=data)

plt.draw()
plt.show()

推荐阅读
cjavapy编程之路首页