数据可视化之箱线图(boxplot)

图的类型有很多,常见的有折线图(plot或kind='line')、散点图(scatter)、条线图(或叫柱状图 bar)、直方图(histplot)、箱线图(boxplot) 区域块图(areaplot)、饼状图(pie)等

 

另外画图的常用工具主要有两个即 matplotlib 和 seaborn 这两个通常也会结合使用。

个人感觉简单的画图可以用 matplotlib的入门api ,但我个人更喜欢用seaborn画图,一是因为它的api更统一,用起来顺手,同时它的作图功能和画图效果更强大。

 

这里主要介绍小 box即箱线图的理解,因为我开始总是对它理解的似懂非懂,不透彻,同时它在观察数据异常点方面非常直观。

形状如下:

sns.catplot(x='species',y='sepal_length',kind='box',data=data)

具体的api我就不细说了,不是重点。主要讲概念:

首先,图中的五条关键线,从上到下依次为,上限值(也称上猫须)、上四分位(Q3),中位数(Q2)、下四分位(Q1)、下限值(也称下猫须)

Q1/Q2/Q3好理解,大概意思就是一组数值排序后,1/4位置的数、 1/2位置的数以及3/4位置的数

上下限这里稍微有点tricky

因为它是相对灵活变化的,我先定义一组概念:

IQR = Q3 -Q1

观察最大值: Q3+1.5*IQR 

观察最小值 :Q1-1.5*IQR

上猫须的值 = min(观察最大值,实际最大值)

下猫须的值 = max(观察最小值,实际最小值)

所以有时候,猫须是最大最小值,有时候是观察最大最小值。超出猫须的点,我们认为是异常点。

### Python 数据可视化箱线图 #### 使用 Matplotlib 绘制简单箱线图 Matplotlib 是一个非常流行的 Python 可视化库,适合创建静态图形。下面是一个简单的箱线图绘制实例: ```python import matplotlib.pyplot as plt import numpy as np # 创建随机数作为样本数据 np.random.seed(0) data = [np.random.normal(loc=mu, scale=1, size=100) for mu in range(-2, 3)] plt.figure(figsize=(8, 6)) plt.boxplot(data) # 添加标题和标签 plt.title('Simple Box Plot Example') plt.xlabel('Groups') plt.ylabel('Values') # 显示图像 plt.show() ``` 此代码片段展示了如何使用 `boxplot` 函数来快速生成一组正态分布数据的箱形图[^1]。 #### 利用 Seaborn 进行高级定制 Seaborn 建立在 Matplotlib 的基础上,提供了更加美观且易于使用的接口。这里有一个基于真实世界数据集的例子: ```python import seaborn as sns import pandas as pd # 加载内置的小费数据集 tips = sns.load_dataset("tips") sns.set_theme(style="whitegrid") # 设置主题样式 ax = sns.boxplot(x="day", y="total_bill", data=tips) # 自定义图表外观 ax.set_title('Total Bill by Day of Week', pad=20) ax.set_xlabel('Day') ax.set_ylabel('Total Bill ($)') plt.show() ``` 这段代码不仅实现了按星期几分类的日营业额箱线图,还通过设置不同的参数调整了图表的整体风格[^2]。 #### 实战案例:二手房价格分析 针对特定应用场景如房地产市场研究,可以通过如下方式构建更为复杂的分组箱线图。考虑到不同地区房源数量差异较大,在实际操作中可能需要先整理好数据再进行绘图[^3]: ```python from collections import defaultdict import matplotlib.pyplot as plt def preprocess_data(df): """预处理原始 DataFrame""" grouped_prices = defaultdict(list) df_sorted = df.sort_values(by='average_price', ascending=False).groupby('district')['price'] for district, prices in df_sorted: grouped_prices[district].extend(prices.tolist()) return list(grouped_prices.values()), list(grouped_prices.keys()) df = ... # 假设这是已经加载好的包含 'district' 和 'price' 字段的数据框 prices_by_district, districts = preprocess_data(df) fig, ax = plt.subplots(figsize=(10,7)) bp = ax.boxplot(prices_by_district, patch_artist=True) for box in bp['boxes']: # 更改箱子颜色 box.set(facecolor ='lightblue') ax.set_xticklabels(districts, rotation=45) ax.set_title('Second-hand House Prices Distribution Across Districts') ax.set_xlabel('District') ax.set_ylabel('Price (RMB/sq.m)') plt.tight_layout() plt.show() ``` 上述代码首先对各个区县内的房价进行了排序并重新组织成适用于 `boxplot()` 方法输入的形式;接着设置了更丰富的视觉效果,比如旋转 X 轴上的文字标签以便阅读、改变箱体填充色等特性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值