我如何解释这个散点图?

机器算法验证 数据可视化 中位数 散点图 熊猫
2022-02-27 00:41:31

我有一个散点图,其样本大小等于 x 轴上的人数和 y 轴上的工资中位数,我试图找出样本大小是否对工资中位数有任何影响。

这是情节:

在此处输入图像描述

我如何解释这个情节?

4个回答

“找出”表示您正在探索数据。正式的测试将是多余的和可疑的。相反,应用标准探索性数据分析 (EDA) 技术来揭示数据中可能包含的内容。

这些标准技术包括重新表达残差分析稳健技术(EDA 的“三个 R”)以及John Tukey 在其经典著作EDA (1977)中描述的数据平滑。我在 Box-Cox 的帖子中概述了如何进行其中的一些,例如自变量的转换?在线性回归中,什么时候适合使用自变量的对数而不是实际值?除其他外

结果是,通过更改对数轴(有效地重新表达两个变量),不要过于激进地平滑数据,并检查平滑的残差以检查它可能遗漏的内容,可以看到很多,正如我将说明的那样。

以下是平滑显示的数据——在检查了几个对数据保真度不同的平滑之后——似乎是平滑过多和过少之间的一个很好的折衷。它使用黄土,一种众所周知的稳健方法(它不受垂直外围点的严重影响)。

对数散点图

垂直网格的步长为 10,000。平滑确实暗示了样本大小的一些变化Grad_median:它似乎随着样本大小接近 1000 而下降。(平滑的末端是不可信的——尤其是对于小样本,预计抽样误差会相对较大——所以不要不要过多地解读它们。)这种真实下降的印象得到了软件在平滑周围绘制的(非常粗糙的)置信带的支持:它的“摆动”大于带的宽度。

要查看此分析可能遗漏了什么,下图查看残差。(这些是自然对数的差异,直接测量前一个平滑数据之间的垂直差异。因为它们是小数字,所以可以解释为比例差异;例如, $-0.2$ 反映的数据值大约低于 $20\%$相应的平滑值。)

我们感兴趣的是(a)随着样本量的变化是否存在额外的变化模式,以及(b)响应的条件分布——点位置的垂直分布——在所有样本量值中是否看似相似,或者它们的某些方面(例如它们的散布或对称性)是否会改变。

![图2残差图

这种平滑尝试比以前更紧密地跟踪数据点。尽管如此,它基本上是水平的(在置信带范围内,始终覆盖 0.0 美元的 y 值),表明无法检测到进一步的变化。如果正式测试,中间附近垂直分布的轻微增加(样本量为 2000 到 3000)不会显着,因此在这个探索阶段肯定是不起眼的。在任何单独的类别中都没有明显的、系统性的偏离这种整体行为(区分,不太好,按颜色——我在这里没有显示的图中单独分析了它们)。

因此,这个简单的总结:

对于接近 1000 的样本量,工资中位数大约低 10,000

充分捕捉数据中出现的关系,并且似乎在所有主要类别中都保持一致。这是否重要——也就是说,当面对额外的数据时它是否会站起来——只能通过收集这些额外的数据来评估。


对于那些想要检查这项工作或进一步研究的人,这里是R代码。

library(data.table)
library(ggplot2)
#
# Read the data.
#
infile <- "https://raw.githubusercontent.com/fivethirtyeight/\
data/master/college-majors/grad-students.csv"
X <- as.data.table(read.csv(infile))
#
# Compute the residuals.
#
span <- 0.6 # Larger values will smooth more aggressively
X[, Log.residual := 
      residuals(loess(log(Grad_median) ~ I(log(Grad_sample_size)), X, span=span))]
#
# Plot the data on top of a smooth.
#
g <- ggplot(X, aes(Grad_sample_size, Grad_median)) + 
  geom_smooth(span=span) + 
  geom_point(aes(fill=Major_category), alpha=1/2, shape=21) + 
  scale_x_log10() + scale_y_log10(minor_breaks=seq(1e4, 5e5, by=1e4)) + 
  ggtitle("EDA of Median Salary vs. Sample Size",
          paste("Span of smooth is", signif(span, 2)))
print(g)

span <- span * 2/3 # Look for a little more detail in the residuals
g.r <- ggplot(X, aes(Grad_sample_size, Log.residual)) + 
  geom_smooth(span=span) + 
  geom_point(aes(fill=Major_category), alpha=1/2, shape=21) + 
  scale_x_log10() + 
  ggtitle("EDA of Median Salary vs. Sample Size: Residuals",
          paste("Span of smooth is", signif(span, 2)))
print(g.r)

Glen_b 建议您采用 sample_size 和中位数薪水的对数来查看重新调整数据是否有意义。

我不知道我是否同意您的看法,即一旦样本量超过 1,000,工资中位数就会下降。我更倾向于说根本没有关系。你的理论是否预测应该存在关系?

评估可能关系的另一种方法是将回归线拟合到数据中。或者,您也可以使用 lowess 曲线。将两条线都绘制到您的数据中,看看是否可以梳理出任何内容(但是,我怀疑是否有任何过于实质性的内容)。

我也同意没有关系。我复制了您的原始散点图(左)并制作了 glen_b 建议的对数散点图(右)。

在此处输入图像描述

好像两者都没有关系。对数转换数据之间的相关性较弱(Pearson R = -.13)且不显着(p = .09)。根据您拥有多少额外信息,可能有理由看到一些微弱的负相关,但这似乎有点牵强。我猜您看到的任何明显模式都与此处看到的效果相同。

编辑:查看@famargar 的图表后,我意识到我绘制了毕业生样本量与毕业生工资中位数的关系。我相信@sameed 想要样本量与毕业生中位数工资,尽管还不完全清楚。对于后者,我复制了@famargar 的数字,即 $R = 0.0022$ ($p = 0.98$),我们的图看起来相同。

正如第一个答案中所建议的那样,尝试线性回归会教你一些关于这种关系的知识。由于看起来您正在使用 python 和 matplotlib 来绘制此图,因此您离解决方案只有一行代码。

您可以使用 seaborn 联合图,它还将显示线性回归线、皮尔逊相关系数及其 p 值:

sns.jointplot("Grad_sample_size", "Grad_median", data=df, kind="reg")

在此处输入图像描述

如您所见,没有相关性。查看最后一个图,对 x 变量进行对数转换似乎很有用。让我们尝试一下:

df['log_size'] = np.log(df['Grad_sample_size'])
sns.jointplot("log_size", "Grad_median", data=df, kind="reg")

在此处输入图像描述

您可以清楚地看到 - 是否进行对数转换 - 相关性很小,并且 p 值和置信区间都表明它没有统计意义。