在R中绘制概率分布

Introduction

无耻的学校竟然提出校园网按流量收费的计划 真是想钱想疯了

于是 一个问题变得很重要了:我每月的流量在全校范围内算什么水平?

或者换一个国产逗逼软件经常使用的说法:你的流量击败了全国98%的用户

Methods

可惜这种数据我是拿不到的 但我们可以研究方法啊

既然是统计分析 肯定要用GNU R 我感觉我想要的东西应该叫「概率分布」 在R里面一般用柱状图(histograms)表示

首先我们生成一万个数据 假定它们是正态分布的 平均数是8 标准偏差是3

1
flow <- rnorm(10000, m = 8, sd = 3)

我们先用默认的试试

1
hist(flow)

默认的效果

参考[1]中的效果我们弄的好看一点

1
a <- hist(flow, breaks = 30, xlab = "Network traffic (Gb)", ylab = "People", main = "Network traffic", col = "lightgreen", xlim = c(0, 20), ylim = c(0, 1500))

好看多了

从图里可以看出 7到8Gb和8到9Gb的用户是最多的

但参考[1]中添加的是正态分布的趋势线 这个不太好:我怎么知道它就是正态分布的呢

这里其实应该用density()函数 我们还是用默认的好了

1
2
3
den <- density(flow)
hist(flow, breaks = 30, freq = F, xlab = "Network traffic (Gb)", ylab = "Density", main = "Network traffic", col = "lightgreen", xlim = c(0, 20), ylim = c(0, 0.15))
lines(den, col = "darkblue", lwd = 2)

概率密度

但怎么从den里面获得类似「你击败了多少用户」我倒是有点糊涂了

den是个曲线 就是一堆(x,y) 那么我们可以用which()来实现 我不知道有没有更好的方法

1
sum(den$y[which(den$x <= 8.5)]) / sum(den$y)

解释一下 假设我的流量是8.5Gb 那么我就在den的x值里面找小于等于8.5的值 看看对应的y是多少 再除以总的密度 就是流量小于等于8.5 Gb占的比例了

我得到的结果是0.5672

Update:

或者 我直接求出个数就可以了 不用什么统计分析

1
b <- which(flow <= 8.5); length(b)

这算两种实现方式罢 在这里第二种方法的结果是0.5663 很接近

如果数据量特别大 明显第二种方法不合适 这也算统计学威力了罢

另外 以前对R大都关注那些统计方面的 没想到一个小小的which()还挺有意思 看来R不仅是个软件 更是一种语言 此言不虚

References


  1. http://www.r-bloggers.com/basics-of-histograms/