In [40]:
from __future__ import print_function, division
import thinkbayes2
import thinkplot
%matplotlib inline
Ignore the first few cells for now -- they are experiments I am working on related to the prior.
In [41]:
mu = 1
pmf = thinkbayes2.MakeExponentialPmf(mu, high=1.0)
thinkplot.Pdf(pmf)
In [42]:
mu = 5
pmf = thinkbayes2.MakeExponentialPmf(mu, high=1.0)
thinkplot.Pdf(pmf)
In [43]:
metapmf = thinkbayes2.Pmf()
for lam, prob in pmf.Items():
if lam==0: continue
pmf = thinkbayes2.MakeExponentialPmf(lam, high=30)
metapmf[pmf] = prob
interarrival = thinkbayes2.MakeMixture(metapmf)
thinkplot.Pdf(interarrival)
Ok, let's start here. Suppose we know $\lambda$. We can compute the distribution of interarrival times (times between logins).
In [44]:
lam = 0.1 # average arrival rate in logins per day
interarrival = pmf = thinkbayes2.MakeExponentialPmf(lam, high=90)
thinkplot.Pdf(interarrival)
If we observe someone, we are more likely to land during a longer interval.
In [45]:
observed = interarrival.Copy()
for val, prob in observed.Items():
observed[val] *= val
observed.Normalize()
print(interarrival.Mean(), observed.Mean())
thinkplot.Pdf(observed)
If we land during an intererval of duration $x$, the time since last login is uniform between 0 and $x$. So the distribution of time since last login (timesince
) is a mixture of uniform distributions.
In [46]:
metapmf = thinkbayes2.Pmf()
for time, prob in observed.Items():
if time == 0:
continue
pmf = thinkbayes2.MakeUniformPmf(0, time, 101)
metapmf[pmf] = prob
timesince = thinkbayes2.MakeMixture(metapmf)
print(timesince.Mean())
thinkplot.Pdf(timesince)
The data is in the form of "time since last login", so we need to be able to look up a time, $t$, and get the probability density at $t$. But we have a PMF with lots of discrete times in it, so we can't just look it up. One option: Compute the CDF, generate a sample, and estimate the PDF by KDE:
In [47]:
cdf = thinkbayes2.Cdf(timesince)
thinkplot.Cdf(cdf)
Out[47]:
Get a sample:
In [48]:
sample = cdf.Sample(10000)
Estimate the PDF:
In [49]:
pdf = thinkbayes2.EstimatedPdf(sample)
thinkplot.Pdf(pdf)
Second option: use numerical differentiation to compute the derivative of the CDF, which is the PDF:
In [50]:
import scipy
import numpy
xs = numpy.linspace(0, 90, 101)
ys = [scipy.misc.derivative(cdf.Prob, x) for x in xs]
Numerical differentiation is more accurate, especially near zero. The value at zero is wrong: there are ways we could fix it, but it's not necessary because we won't get zero as data.
In [51]:
thinkplot.plot(xs, ys)
In [51]: