You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

同一数据在R与Python中生成的QQ图有差异,该依赖哪一个?

QQ图与QQ线选择问题

数据

x = c(2.42, 2.59, 3.5, 2.75, 2.78, 3.58, 2.95, 2.06, 2.36, 2.48, 3.33, 2.89)

R语言生成QQ图

使用以下代码生成QQ图:

qqnorm(x)
qqline(x)

对应的QQ图:
R生成的QQ图

Python语言生成不同参数的QQ图

先准备数据与导入依赖:

import pandas as pd

x = [2.42, 2.59, 3.5, 2.75, 2.78, 3.58, 2.95, 2.06, 2.36, 2.48, 3.33, 2.89]
df = pd.DataFrame(x, columns=['x'])

import statsmodels.api as sm
import matplotlib.pyplot as plt

参数line='s'

sm.qqplot(df['x'], line='s')
plt.show()

对应的QQ图:
Python line='s'的QQ图

参数line='r'

sm.qqplot(df['x'], line='r')
plt.show()

对应的QQ图:
Python line='r'的QQ图

参数line='q'

sm.qqplot(df['x'], line='q')
plt.show()

对应的QQ图:
Python line='q'的QQ图

差异解释与选择建议

这些QQ线的差异源于拟合逻辑不同:

  • R的qqline(x):默认通过第一、第三四分位数拟合直线,和Python中line='q'的逻辑完全一致,两者的QQ线几乎重合。
  • Python的line='s':用标准化样本分位数与理论分位数的最小二乘拟合生成直线,更侧重贴合整体样本分布。
  • Python的line='r':基于原点附近样本点做稳健拟合,对极端值的敏感度更低。

选择哪一种取决于你的分析需求:

  1. 若要和R的传统输出对齐,优先选line='q'(和R的qqline结果一致)。
  2. 若希望直线尽可能贴合多数样本点,选line='s'。
  3. 若数据存在极端值,担心其干扰拟合结果,line='r'的稳健性更合适。

实际上,QQ图的核心是观察样本点是否围绕直线分布,轻微的直线差异不会改变正态性判断——从你的所有图中能看到,样本点都大致贴近直线,说明数据的正态性表现较好。

内容的提问来源于stack exchange,提问作者Catherine

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 02:10:12