是否可以在 x 轴上创建一个 0% 到 100% 的图表形式,在 y 上创建一个单位,并从 y=0 累积到 y=max,所以我可以说“我的元素的 X 出现在第一个 Y 单位内” . ggplot2 中是否有预定义的统计数据允许我这样做?
这是一些数据:http ://sprunge.us/XYJK
是否可以在 x 轴上创建一个 0% 到 100% 的图表形式,在 y 上创建一个单位,并从 y=0 累积到 y=max,所以我可以说“我的元素的 X 出现在第一个 Y 单位内” . ggplot2 中是否有预定义的统计数据允许我这样做?
这是一些数据:http ://sprunge.us/XYJK
您可以在使用 ggplot 处理之前或在以下情况下应用它:
例如:
library(ggplot2)
library(scales)
library(XML)
x <- eval(parse(file("http://sprunge.us/XYJK"))) # Your data
d <- data.frame(x=x,y=1:length(x))
d$z <- cumsum(d$x) / sum(d$x) # As percent
ggplot(d, aes(z,y)) + geom_line() + scale_x_continuous(label=percent)
或者
library(ggplot2)
library(scales)
d <- data.frame(x=x,y=1:100)
ggplot(d, aes(cumsum(x)/sum(x),y) + geom_line() + scale_x_continuous(label=percent)
我假设这是销售数据或类似的东西。因此,在这种情况下,50% 的收入来自前 5000 笔交易。
在我看来,您好像在寻找经验 CDF。您的数据在许多地方都复制了值,因此我根据排序值的频率表创建了经验 CDF。我将您的数据复制到向量 x 中,然后执行以下操作:
tf <- as.data.frame(table(x), stringsAsFactors = FALSE)
tf <- within(tf, {
Var1 <- as.numeric(Var1)
pct <- 100 * cumsum(Freq)/sum(Freq)
} )
ggplot(tf, aes(x = Var1, y = pct)) +
geom_step(size = 1) +
labs(x = "Value", y = "Cumulative percentage")
问题是您的数据严重偏斜,以至于直方图模拟了一条双曲线,因此绝大多数数据都远低于 1000,并且有几个严重的异常值。给你个思路,
quantile(x, c(0.005, 0.01, 0.05, 0.10, 0.25, 0.5, 0.75, 0.9, 0.95, 0.99, 0.995))
0.5% 1% 5% 10% 25% 50%
1.64425 2.79850 7.54500 11.77500 21.76000 39.35000
75% 90% 95% 99% 99.5%
73.28000 398.05000 1695.78750 10499.99000 11638.55600
和
summary(tst$y)
Min. 1st Qu. Median Mean 3rd Qu. Max.
0.00 21.76 39.35 434.90 73.28 18520.00
平均值大于分布的第 90 个百分位!在这种情况下,我认为 ecdf 图不会提供非常丰富的信息。要找出向量中值的比例小于或等于给定值,请尝试以下小函数:
cumprop <- function(x, val) mean(x <= val)
cumprop(x, 1000)
cumprop(x, mean(x)) # proportion of values <= mean(x)