Statistics
==========

.. module:: sympy.statistics

The *statistics* module in SymPy implements standard probability distributions
and related tools. Its contents can be imported with the following statement::

    >>> from sympy import *
    >>> from sympy.statistics import *
    >>> import sys
    >>> sys.displayhook = pprint

Normal distributions
--------------------

``Normal(mu, sigma)`` creates a normal distribution with mean value ``mu`` and
standard deviation ``sigma``. The ``Normal`` class defines several
useful methods and properties. Various properties can be accessed directly as
follows:

    >>> N = Normal(0, 1)
    >>> N.mean
    0
    >>> N.median
    0
    >>> N.variance
    1
    >>> N.stddev
    1

You can generate random numbers from the desired distribution with the
``random`` method:

    >>> N = Normal(10, 5)
    >>> N.random() #doctest: +SKIP
    4.914375200829805834246144514
    >>> N.random() #doctest: +SKIP
    11.84331557474637897087177407
    >>> N.random() #doctest: +SKIP
    17.22474580071733640806996846
    >>> N.random() #doctest: +SKIP
    9.864643097429464546621602494

The probability density function (pdf) and cumulative distribution function
(cdf) of a distribution can be computed, either in symbolic form or for
particular values:

    >>> N = Normal(1, 1)
    >>> x = Symbol('x')
    >>> N.pdf(1)
       ___  
     \/ 2   
    --------
        ____
    2*\/ pi 
    >>> N.pdf(3).evalf()
    0.0539909665131881
    >>> N.cdf(x)
             /  ___        \
             |\/ 2 *(1 - x)|
          erf|-------------|
             \      2      /
    1/2 - ------------------
                  2         
    >>> N.cdf(-oo), N.cdf(1), N.cdf(oo)
    (0, 1/2, 1)
    >>> N.cdf(5).evalf()
    0.999968328758167

The method ``probability`` gives the total probability on a given interval (a
convenient alternative syntax for cdf(b)-cdf(a)):

    >>> N = Normal(0, 1)
    >>> N.probability(-oo, 0)
    1/2
    >>> N.probability(-1, 1)
       /  ___\
       |\/ 2 |
    erf|-----|
       \  2  /
    >>> N.probability(-1, 1).evalf()
    0.682689492137086

You can also generate a symmetric confidence interval from a given desired
confidence level (given as a fraction 0-1). For the normal distribution, 68%,
95% and 99.7% confidence levels respectively correspond to approximately 1, 2
and 3 standard deviations:

    >>> N = Normal(0, 1)
    >>> N.confidence(0.68)
    (-0.994457883209753, 0.994457883209753)
    >>> N.confidence(0.95)
    (-1.95996398454005, 1.95996398454005)
    >>> N.confidence(0.997)
    (-2.96773792534178, 2.96773792534178)

Plug the interval back in to see that the value is correct:

    >>> N.probability(*N.confidence(0.95)).evalf()
    0.950000000000000

Other distributions
-------------------

Besides the normal distribution, uniform continuous distributions are also
supported. ``Uniform(a, b)`` represents the distribution with uniform
probability on the interval [a, b] and zero probability everywhere else. The
``Uniform`` class supports the same methods as the ``Normal`` class.

Additional distributions, including support for arbitrary user-defined distributions, are planned for the future.
