# Stats¶

SymPy statistics module

Introduces a random variable type into the SymPy language.

Random variables may be declared using prebuilt functions such as Normal, Exponential, Coin, Die, etc... or built with functions like FiniteRV.

Queries on random expressions can be made using the functions

 Expression Meaning P(condition) Probability E(expression) Expectation value variance(expression) Variance density(expression) Probability Density Function sample(expression) Produce a realization where(condition) Where the condition is true

## Examples¶

>>> from sympy.stats import P, E, variance, Die, Normal
>>> from sympy import Eq, simplify
>>> X, Y = Die('X', 6), Die('Y', 6) # Define two six sided dice
>>> Z = Normal('Z', 0, 1) # Declare a Normal random variable with mean 0, std 1
>>> P(X>3) # Probability X is greater than 3
1/2
>>> E(X+Y) # Expectation of the sum of two dice
7
>>> variance(X+Y) # Variance of the sum of two dice
35/6
>>> simplify(P(Z>1)) # Probability of Z being greater than 1
-erf(sqrt(2)/2)/2 + 1/2


## Random Variable Types¶

### Finite Types¶

sympy.stats.DiscreteUniform(name, items)

Create a Finite Random Variable representing a uniform distribution over the input set.

Returns a RandomSymbol.

Examples

>>> from sympy.stats import DiscreteUniform, density
>>> from sympy import symbols

>>> X = DiscreteUniform('X', symbols('a b c')) # equally likely over a, b, c
>>> density(X)
{a: 1/3, b: 1/3, c: 1/3}

>>> Y = DiscreteUniform('Y', range(5)) # distribution over a range
>>> density(Y)
{0: 1/5, 1: 1/5, 2: 1/5, 3: 1/5, 4: 1/5}

sympy.stats.Die(name, sides=6)

Create a Finite Random Variable representing a fair die.

Returns a RandomSymbol.

>>> from sympy.stats import Die, density

>>> D6 = Die('D6', 6) # Six sided Die
>>> density(D6)
{1: 1/6, 2: 1/6, 3: 1/6, 4: 1/6, 5: 1/6, 6: 1/6}

>>> D4 = Die('D4', 4) # Four sided Die
>>> density(D4)
{1: 1/4, 2: 1/4, 3: 1/4, 4: 1/4}

sympy.stats.Bernoulli(name, p, succ=1, fail=0)

Create a Finite Random Variable representing a Bernoulli process.

Returns a RandomSymbol

>>> from sympy.stats import Bernoulli, density
>>> from sympy import S

>>> X = Bernoulli('X', S(3)/4) # 1-0 Bernoulli variable, probability = 3/4
>>> density(X)
{0: 1/4, 1: 3/4}

>>> X = Bernoulli('X', S.Half, 'Heads', 'Tails') # A fair coin toss
>>> density(X)

sympy.stats.Coin(name, p=1/2)

Create a Finite Random Variable representing a Coin toss.

Probability p is the chance of gettings “Heads.” Half by default

Returns a RandomSymbol.

>>> from sympy.stats import Coin, density
>>> from sympy import Rational

>>> C = Coin('C') # A fair coin toss
>>> density(C)
{H: 1/2, T: 1/2}

>>> C2 = Coin('C2', Rational(3, 5)) # An unfair coin
>>> density(C2)
{H: 3/5, T: 2/5}

sympy.stats.Binomial(name, n, p, succ=1, fail=0)

Create a Finite Random Variable representing a binomial distribution.

Returns a RandomSymbol.

Examples

>>> from sympy.stats import Binomial, density
>>> from sympy import S

>>> X = Binomial('X', 4, S.Half) # Four "coin flips"
>>> density(X)
{0: 1/16, 1: 1/4, 2: 3/8, 3: 1/4, 4: 1/16}

sympy.stats.Hypergeometric(name, N, m, n)

Create a Finite Random Variable representing a hypergeometric distribution.

Returns a RandomSymbol.

Examples

>>> from sympy.stats import Hypergeometric, density
>>> from sympy import S

>>> X = Hypergeometric('X', 10, 5, 3) # 10 marbles, 5 white (success), 3 draws
>>> density(X)
{0: 1/12, 1: 5/12, 2: 5/12, 3: 1/12}

sympy.stats.FiniteRV(name, density)

Create a Finite Random Variable given a dict representing the density.

Returns a RandomSymbol.

>>> from sympy.stats import FiniteRV, P, E

>>> density = {0: .1, 1: .2, 2: .3, 3: .4}
>>> X = FiniteRV('X', density)

>>> E(X)
2.00000000000000
>>> P(X>=2)
0.700000000000000


### Continuous Types¶

sympy.stats.Arcsin(name, a=0, b=1)

Create a Continuous Random Variable with an arcsin distribution.

The density of the arcsin distribution is given by

$f(x) := \frac{1}{\pi\sqrt{(x-a)(b-x)}}$

with $$x \in [a,b]$$. It must hold that $$-\infty < a < b < \infty$$.

Parameters : a : Real number, the left interval boundary b : Real number, the right interval boundary A RandomSymbol. :

References

Examples

>>> from sympy.stats import Arcsin, density
>>> from sympy import Symbol, simplify

>>> a = Symbol("a", real=True)
>>> b = Symbol("b", real=True)

>>> X = Arcsin("x", a, b)

>>> density(X)
Lambda(_x, 1/(pi*sqrt((-_x + b)*(_x - a))))

sympy.stats.Benini(name, alpha, beta, sigma)

Create a Continuous Random Variable with a Benini distribution.

The density of the Benini distribution is given by

$f(x) := e^{-\alpha\log{\frac{x}{\sigma}} -\beta\log\left[{\frac{x}{\sigma}}\right]^2} \left(\frac{\alpha}{x}+\frac{2\beta\log{\frac{x}{\sigma}}}{x}\right)$
Parameters : alpha : Real number, $$alpha$$ > 0 a shape beta : Real number, $$beta$$ > 0 a shape sigma : Real number, $$sigma$$ > 0 a scale A RandomSymbol. :

References

Examples

>>> from sympy.stats import Benini, density
>>> from sympy import Symbol, simplify, pprint

>>> alpha = Symbol("alpha", positive=True)
>>> beta = Symbol("beta", positive=True)
>>> sigma = Symbol("sigma", positive=True)

>>> X = Benini("x", alpha, beta, sigma)

>>> D = density(X)
>>> pprint(D, use_unicode=False)
/                                                             2       \
|   /                  /  x  \\             /  x  \            /  x  \|
|   |        2*beta*log|-----||  - alpha*log|-----| - beta*log |-----||
|   |alpha             \sigma/|             \sigma/            \sigma/|
Lambda|x, |----- + -----------------|*e                                     |
\   \  x             x        /                                       /

sympy.stats.Beta(name, alpha, beta)

Create a Continuous Random Variable with a Beta distribution.

The density of the Beta distribution is given by

$f(x) := \frac{x^{\alpha-1}(1-x)^{\beta-1}} {\mathrm{B}(\alpha,\beta)}$

with $$x \in [0,1]$$.

Parameters : alpha : Real number, $$alpha$$ > 0 a shape beta : Real number, $$beta$$ > 0 a shape A RandomSymbol. :

References

Examples

>>> from sympy.stats import Beta, density, E, variance
>>> from sympy import Symbol, simplify, pprint

>>> alpha = Symbol("alpha", positive=True)
>>> beta = Symbol("beta", positive=True)

>>> X = Beta("x", alpha, beta)

>>> D = density(X)
>>> pprint(D, use_unicode=False)
/    alpha - 1         beta - 1                    \
|   x         *(-x + 1)        *gamma(alpha + beta)|
Lambda|x, -----------------------------------------------|
\               gamma(alpha)*gamma(beta)           /

>>> simplify(E(X, meijerg=True))
alpha/(alpha + beta)

>>> simplify(variance(X, meijerg=True))
alpha*beta/((alpha + beta)**2*(alpha + beta + 1))

sympy.stats.BetaPrime(name, alpha, beta)

Create a continuous random variable with a Beta prime distribution.

The density of the Beta prime distribution is given by

$f(x) := \frac{x^{\alpha-1} (1+x)^{-\alpha -\beta}}{B(\alpha,\beta)}$

with $$x > 0$$.

Parameters : alpha : Real number, $$alpha$$ > 0 a shape beta : Real number, $$beta$$ > 0 a shape A RandomSymbol. :

References

Examples

>>> from sympy.stats import BetaPrime, density
>>> from sympy import Symbol, pprint

>>> alpha = Symbol("alpha", positive=True)
>>> beta = Symbol("beta", positive=True)

>>> X = BetaPrime("x", alpha, beta)

>>> D = density(X)
>>> pprint(D, use_unicode=False)
/    alpha - 1        -alpha - beta                    \
|   x         *(x + 1)             *gamma(alpha + beta)|
Lambda|x, ---------------------------------------------------|
\                 gamma(alpha)*gamma(beta)             /

sympy.stats.Cauchy(name, x0, gamma)

Create a continuous random variable with a Cauchy distribution.

The density of the Cauchy distribution is given by

$f(x) := \frac{1}{\pi} \arctan\left(\frac{x-x_0}{\gamma}\right) +\frac{1}{2}$
Parameters : x0 : Real number, the location gamma : Real number, $$gamma$$ > 0 the scale A RandomSymbol. :

References

Examples

>>> from sympy.stats import Cauchy, density
>>> from sympy import Symbol

>>> x0 = Symbol("x0")
>>> gamma = Symbol("gamma", positive=True)

>>> X = Cauchy("x", x0, gamma)

>>> density(X)
Lambda(_x, 1/(pi*gamma*(1 + (_x - x0)**2/gamma**2)))

sympy.stats.Chi(name, k)

Create a continuous random variable with a Chi distribution.

The density of the Chi distribution is given by

$f(x) := \frac{2^{1-k/2}x^{k-1}e^{-x^2/2}}{\Gamma(k/2)}$

with $$x \geq 0$$.

Parameters : k : Integer, $$k$$ > 0 the number of degrees of freedom A RandomSymbol. :

References

Examples

>>> from sympy.stats import Chi, density, E, std
>>> from sympy import Symbol, simplify

>>> k = Symbol("k", integer=True)

>>> X = Chi("x", k)

>>> density(X)
Lambda(_x, 2**(-k/2 + 1)*_x**(k - 1)*exp(-_x**2/2)/gamma(k/2))

sympy.stats.Dagum(name, p, a, b)

Create a continuous random variable with a Dagum distribution.

The density of the Dagum distribution is given by

$f(x) := \frac{a p}{x} \left( \frac{(\tfrac{x}{b})^{a p}} {\left((\tfrac{x}{b})^a + 1 \right)^{p+1}} \right)$

with $$x > 0$$.

Parameters : p : Real number, $$p$$ > 0 a shape a : Real number, $$a$$ > 0 a shape b : Real number, $$b$$ > 0 a scale A RandomSymbol. :

References

Examples

>>> from sympy.stats import Dagum, density
>>> from sympy import Symbol, simplify

>>> p = Symbol("p", positive=True)
>>> b = Symbol("b", positive=True)
>>> a = Symbol("a", positive=True)

>>> X = Dagum("x", p, a, b)

>>> density(X)
Lambda(_x, a*p*(_x/b)**(a*p)*((_x/b)**a + 1)**(-p - 1)/_x)

sympy.stats.Exponential(name, rate)

Create a continuous random variable with an Exponential distribution.

The density of the exponential distribution is given by

$f(x) := \lambda \exp(-\lambda x)$

with $$x > 0$$.

Parameters : rate : Real number, $$rate$$ > 0 the rate or inverse scale A RandomSymbol. :

References

Examples

>>> from sympy.stats import Exponential, density, cdf, E
>>> from sympy.stats import variance, std, skewness
>>> from sympy import Symbol

>>> l = Symbol("lambda", positive=True)

>>> X = Exponential("x", l)

>>> density(X)
Lambda(_x, lambda*exp(-_x*lambda))

>>> cdf(X)
Lambda(_z, Piecewise((1 - exp(-_z*lambda), _z >= 0), (0, True)))

>>> E(X)
1/lambda

>>> variance(X)
lambda**(-2)

>>> skewness(X)
2

>>> X = Exponential('x', 10)

>>> density(X)
Lambda(_x, 10*exp(-10*_x))

>>> E(X)
1/10

>>> std(X)
1/10

sympy.stats.Gamma(name, k, theta)

Create a continuous random variable with a Gamma distribution.

The density of the Gamma distribution is given by

$f(x) := \frac{1}{\Gamma(k) \theta^k} x^{k - 1} e^{-\frac{x}{\theta}}$

with $$x \in [0,1]$$.

Parameters : k : Real number, $$k$$ > 0 a shape theta : Real number, $$theta$$ > 0 a scale A RandomSymbol. :

References

Examples

>>> from sympy.stats import Gamma, density, cdf, E, variance
>>> from sympy import Symbol, pprint

>>> k = Symbol("k", positive=True)
>>> theta = Symbol("theta", positive=True)

>>> X = Gamma("x", k, theta)

>>> D = density(X)
>>> pprint(D, use_unicode=False)
/                     -x \
|                   -----|
|    k - 1      -k  theta|
|   x     *theta  *e     |
Lambda|x, ---------------------|
\          gamma(k)      /

>>> C = cdf(X, meijerg=True)
>>> pprint(C, use_unicode=False)
/   /                                   /     z  \            \
|   |                       k*lowergamma|k, -----|            |
|   |  k*lowergamma(k, 0)               \   theta/            |
Lambda|z, <- ------------------ + ----------------------  for z >= 0|
|   |     gamma(k + 1)           gamma(k + 1)                 |
|   |                                                         |
\   \                      0                        otherwise /

>>> E(X)
theta*gamma(k + 1)/gamma(k)

>>> V = variance(X)
>>> pprint(V, use_unicode=False)
2      2                     -k      k + 1
theta *gamma (k + 1)   theta*theta  *theta     *gamma(k + 2)
- -------------------- + -------------------------------------
2                           gamma(k)
gamma (k)

sympy.stats.Laplace(name, mu, b)

Create a continuous random variable with a Laplace distribution.

The density of the Laplace distribution is given by

$f(x) := \frac{1}{2 b} \exp \left(-\frac{|x-\mu|}b \right)$
Parameters : mu : Real number, the location b : Real number, $$b$$ > 0 a scale A RandomSymbol. :

References

Examples

>>> from sympy.stats import Laplace, density
>>> from sympy import Symbol

>>> mu = Symbol("mu")
>>> b = Symbol("b", positive=True)

>>> X = Laplace("x", mu, b)

>>> density(X)
Lambda(_x, exp(-Abs(_x - mu)/b)/(2*b))

sympy.stats.Logistic(name, mu, s)

Create a continuous random variable with a logistic distribution.

The density of the logistic distribution is given by

$f(x) := \frac{e^{-(x-\mu)/s}} {s\left(1+e^{-(x-\mu)/s}\right)^2}$
Parameters : mu : Real number, the location s : Real number, $$s$$ > 0 a scale A RandomSymbol. :

References

Examples

>>> from sympy.stats import Logistic, density
>>> from sympy import Symbol

>>> mu = Symbol("mu", real=True)
>>> s = Symbol("s", positive=True)

>>> X = Logistic("x", mu, s)

>>> density(X)
Lambda(_x, exp((-_x + mu)/s)/(s*(exp((-_x + mu)/s) + 1)**2))

sympy.stats.LogNormal(name, mean, std)

Create a continuous random variable with a log-normal distribution.

The density of the log-normal distribution is given by

$f(x) := \frac{1}{x\sqrt{2\pi\sigma^2}} e^{-\frac{\left(\ln x-\mu\right)^2}{2\sigma^2}}$

with $$x \geq 0$$.

Parameters : mu : Real number, the log-scale sigma : Real number, $$\sigma^2 > 0$$ a shape A RandomSymbol. :

References

Examples

>>> from sympy.stats import LogNormal, density
>>> from sympy import Symbol, simplify, pprint

>>> mu = Symbol("mu", real=True)
>>> sigma = Symbol("sigma", positive=True)

>>> X = LogNormal("x", mu, sigma)

>>> D = density(X)
>>> pprint(D, use_unicode=False)
/                         2\
|          -(-mu + log(x)) |
|          ----------------|
|                     2    |
|     ___      2*sigma     |
|   \/ 2 *e                |
Lambda|x, -----------------------|
|             ____         |
\       2*x*\/ pi *sigma   /

>>> X = LogNormal('x', 0, 1) # Mean 0, standard deviation 1

>>> density(X)
Lambda(_x, sqrt(2)*exp(-log(_x)**2/2)/(2*_x*sqrt(pi)))

sympy.stats.Maxwell(name, a)

Create a continuous random variable with a Maxwell distribution.

The density of the Maxwell distribution is given by

$f(x) := \sqrt{\frac{2}{\pi}} \frac{x^2 e^{-x^2/(2a^2)}}{a^3}$

with $$x \geq 0$$.

Parameters : a : Real number, $$a$$ > 0 A RandomSymbol. :

References

Examples

>>> from sympy.stats import Maxwell, density, E, variance
>>> from sympy import Symbol, simplify

>>> a = Symbol("a", positive=True)

>>> X = Maxwell("x", a)

>>> density(X)
Lambda(_x, sqrt(2)*_x**2*exp(-_x**2/(2*a**2))/(sqrt(pi)*a**3))

>>> E(X)
2*sqrt(2)*a/sqrt(pi)

>>> simplify(variance(X))
a**2*(-8 + 3*pi)/pi

sympy.stats.Nakagami(name, mu, omega)

Create a continuous random variable with a Nakagami distribution.

The density of the Nakagami distribution is given by

$f(x) := \frac{2\mu^\mu}{\Gamma(\mu)\omega^\mu} x^{2\mu-1} \exp\left(-\frac{\mu}{\omega}x^2 \right)$

with $$x > 0$$.

Parameters : mu : Real number, $$mu \geq \frac{1}{2}$$ a shape omega : Real number, $$omega$$ > 0 the spread A RandomSymbol. :

References

Examples

>>> from sympy.stats import Nakagami, density, E, variance
>>> from sympy import Symbol, simplify, pprint

>>> mu = Symbol("mu", positive=True)
>>> omega = Symbol("omega", positive=True)

>>> X = Nakagami("x", mu, omega)

>>> D = density(X)
>>> pprint(D, use_unicode=False)
/                                2   \
|                              -x *mu|
|                              ------|
|      2*mu - 1   mu      -mu  omega |
|   2*x        *mu  *omega   *e      |
Lambda|x, ---------------------------------|
\               gamma(mu)            /

>>> simplify(E(X, meijerg=True))
sqrt(mu)*sqrt(omega)*gamma(mu + 1/2)/gamma(mu + 1)

>>> V = simplify(variance(X, meijerg=True))
>>> pprint(V, use_unicode=False)
/                               2          \
omega*\gamma(mu)*gamma(mu + 1) - gamma (mu + 1/2)/
--------------------------------------------------
gamma(mu)*gamma(mu + 1)

sympy.stats.Normal(name, mean, std)

Create a continuous random variable with a Normal distribution.

The density of the Normal distribution is given by

$f(x) := \frac{1}{\sigma\sqrt{2\pi}} e^{ -\frac{(x-\mu)^2}{2\sigma^2} }$
Parameters : mu : Real number, the mean sigma : Real number, $$\sigma^2 > 0$$ the variance A RandomSymbol. :

References

Examples

>>> from sympy.stats import Normal, density, E, std, cdf, skewness
>>> from sympy import Symbol, simplify, pprint

>>> mu = Symbol("mu")
>>> sigma = Symbol("sigma", positive=True)

>>> X = Normal("x", mu, sigma)

>>> density(X)
Lambda(_x, sqrt(2)*exp(-(_x - mu)**2/(2*sigma**2))/(2*sqrt(pi)*sigma))

>>> C = simplify(cdf(X))
>>> pprint(C, use_unicode=False)
/      /  ___         \    \
|      |\/ 2 *(z - mu)|    |
|   erf|--------------|    |
|      \   2*sigma    /   1|
Lambda|z, ------------------- + -|
\            2            2/

>>> simplify(skewness(X))
0

>>> X = Normal("x", 0, 1) # Mean 0, standard deviation 1
>>> density(X)
Lambda(_x, sqrt(2)*exp(-_x**2/2)/(2*sqrt(pi)))

>>> E(2*X + 1)
1

>>> simplify(std(2*X + 1))
2

sympy.stats.Pareto(name, xm, alpha)

Create a continuous random variable with the Pareto distribution.

The density of the Pareto distribution is given by

$f(x) := \frac{\alpha\,x_\mathrm{m}^\alpha}{x^{\alpha+1}}$

with $$x \in [x_m,\infty]$$.

Parameters : xm : Real number, $$xm$$ > 0 a scale alpha : Real number, $$alpha$$ > 0 a shape A RandomSymbol. :

References

Examples

>>> from sympy.stats import Pareto, density
>>> from sympy import Symbol

>>> xm = Symbol("xm", positive=True)
>>> beta = Symbol("beta", positive=True)

>>> X = Pareto("x", xm, beta)

>>> density(X)
Lambda(_x, _x**(-beta - 1)*beta*xm**beta)

sympy.stats.Rayleigh(name, sigma)

Create a continuous random variable with a Rayleigh distribution.

The density of the Rayleigh distribution is given by

$f(x) := \frac{x}{\sigma^2} e^{-x^2/2\sigma^2}$

with $$x > 0$$.

Parameters : sigma : Real number, $$sigma$$ > 0 A RandomSymbol. :

References

Examples

>>> from sympy.stats import Rayleigh, density, E, variance
>>> from sympy import Symbol, simplify

>>> sigma = Symbol("sigma", positive=True)

>>> X = Rayleigh("x", sigma)

>>> density(X)
Lambda(_x, _x*exp(-_x**2/(2*sigma**2))/sigma**2)

>>> E(X)
sqrt(2)*sqrt(pi)*sigma/2

>>> variance(X)
-pi*sigma**2/2 + 2*sigma**2

sympy.stats.StudentT(name, nu)

Create a continuous random variable with a student’s t distribution.

The density of the student’s t distribution is given by

$f(x) := \frac{\Gamma \left(\frac{\nu+1}{2} \right)} {\sqrt{\nu\pi}\Gamma \left(\frac{\nu}{2} \right)} \left(1+\frac{x^2}{\nu} \right)^{-\frac{\nu+1}{2}}$
Parameters : nu : Real number, $$nu$$ > 0, the degrees of freedom A RandomSymbol. :

References

Examples

>>> from sympy.stats import StudentT, density, E, variance
>>> from sympy import Symbol, simplify, pprint

>>> nu = Symbol("nu", positive=True)

>>> X = StudentT("x", nu)

>>> D = density(X)
>>> pprint(D, use_unicode=False)
/             nu   1              \
|           - -- - -              |
|             2    2              |
|   / 2    \                      |
|   |x     |              /nu   1\|
|   |-- + 1|        *gamma|-- + -||
|   \nu    /              \2    2/|
Lambda|x, ------------------------------|
|        ____   ____      /nu\    |
|      \/ pi *\/ nu *gamma|--|    |
\                         \2 /    /

sympy.stats.Triangular(name, a, b, c)

Create a continuous random variable with a triangular distribution.

The density of the triangular distribution is given by

$\begin{split}f(x) := \begin{cases} 0 & \mathrm{for\ } x < a, \\ \frac{2(x-a)}{(b-a)(c-a)} & \mathrm{for\ } a \le x < c, \\ \frac{2}{b-a} & \mathrm{for\ } x = c, \\ \frac{2(b-x)}{(b-a)(b-c)} & \mathrm{for\ } c < x \le b, \\ 0 & \mathrm{for\ } b < x. \end{cases}\end{split}$
Parameters : a : Real number, $$a \in \left(-\infty, \infty\right)$$ b : Real number, $$a < b$$ c : Real number, $$a \leq c \leq b$$ A RandomSymbol. :

References

Examples

>>> from sympy.stats import Triangular, density, E
>>> from sympy import Symbol

>>> a = Symbol("a")
>>> b = Symbol("b")
>>> c = Symbol("c")

>>> X = Triangular("x", a,b,c)

>>> density(X)
Lambda(_x, Piecewise(((2*_x - 2*a)/((-a + b)*(-a + c)),
And(_x < c, a <= _x)),
(2/(-a + b), _x == c),
((-2*_x + 2*b)/((-a + b)*(b - c)),
And(_x <= b, c < _x)),
(0, True)))

sympy.stats.Uniform(name, left, right)

Create a continuous random variable with a uniform distribution.

The density of the uniform distribution is given by

$\begin{split}f(x) := \begin{cases} \frac{1}{b - a} & \text{for } x \in [a,b] \\ 0 & \text{otherwise} \end{cases}\end{split}$

with $$x \in [a,b]$$.

Parameters : a : Real number, $$-\infty < a$$ the left boundary b : Real number, $$a < b < \infty$$ the right boundary A RandomSymbol. :

References

Examples

>>> from sympy.stats import Uniform, density, cdf, E, variance, skewness
>>> from sympy import Symbol, simplify

>>> a = Symbol("a")
>>> b = Symbol("b")

>>> X = Uniform("x", a, b)

>>> density(X)
Lambda(_x, Piecewise((1/(-a + b), And(_x <= b, a <= _x)), (0, True)))

>>> cdf(X)
Lambda(_z, _z/(-a + b) - a/(-a + b))

>>> simplify(E(X))
a/2 + b/2

>>> simplify(variance(X))
a**2/12 - a*b/6 + b**2/12

>>> simplify(skewness(X))
0

sympy.stats.UniformSum(name, n)

Create a continuous random variable with an Irwin-Hall distribution.

The probability distribution function depends on a single parameter $$n$$ which is an integer.

The density of the Irwin-Hall distribution is given by

$f(x) := \frac{1}{(n-1)!}\sum_{k=0}^{\lfloor x\rfloor}(-1)^k \binom{n}{k}(x-k)^{n-1}$
Parameters : n : Integral number, $$n$$ > 0 A RandomSymbol. :

References

Examples

>>> from sympy.stats import UniformSum, density
>>> from sympy import Symbol, pprint

>>> n = Symbol("n", integer=True)

>>> X = UniformSum("x", n)

>>> D = density(X)
>>> pprint(D, use_unicode=False)
/   floor(x)                        \
|     ___                           |
|     \                            |
|      \         k         n - 1 /n\|
|       )    (-1) *(-k + x)     *| ||
|      /                         \k/|
|     /__,                          |
|    k = 0                          |
Lambda|x, --------------------------------|
\               (n - 1)!            /

sympy.stats.Weibull(name, alpha, beta)

Create a continuous random variable with a Weibull distribution.

The density of the Weibull distribution is given by

$\begin{split}f(x) := \begin{cases} \frac{k}{\lambda}\left(\frac{x}{\lambda}\right)^{k-1} e^{-(x/\lambda)^{k}} & x\geq0\\ 0 & x<0 \end{cases}\end{split}$
Parameters : lambda : Real number, $$\lambda > 0$$ a scale k : Real number, $$k$$ > 0 a shape A RandomSymbol. :

References

Examples

>>> from sympy.stats import Weibull, density, E, variance
>>> from sympy import Symbol, simplify

>>> l = Symbol("lambda", positive=True)
>>> k = Symbol("k", positive=True)

>>> X = Weibull("x", l, k)

>>> density(X)
Lambda(_x, k*(_x/lambda)**(k - 1)*exp(-(_x/lambda)**k)/lambda)

>>> simplify(E(X))
lambda*gamma(1 + 1/k)

>>> simplify(variance(X))
lambda**2*(-gamma(1 + 1/k)**2 + gamma(1 + 2/k))

sympy.stats.WignerSemicircle(name, R)

Create a continuous random variable with a Wigner semicircle distribution.

The density of the Wigner semicircle distribution is given by

$f(x) := \frac2{\pi R^2}\,\sqrt{R^2-x^2}$

with $$x \in [-R,R]$$.

Parameters : R : Real number, $$R$$ > 0 the radius A RandomSymbol. :

References

Examples

>>> from sympy.stats import WignerSemicircle, density, E
>>> from sympy import Symbol, simplify

>>> R = Symbol("R", positive=True)

>>> X = WignerSemicircle("x", R)

>>> density(X)
Lambda(_x, 2*sqrt(-_x**2 + R**2)/(pi*R**2))

>>> E(X)
0

sympy.stats.ContinuousRV(symbol, density, set=(-oo, oo))

Create a Continuous Random Variable given the following:

– a symbol – a probability density function – set on which the pdf is valid (defaults to entire real line)

Returns a RandomSymbol.

Many common continuous random variable types are already implemented. This function should be necessary only very rarely.

Examples

>>> from sympy import Symbol, sqrt, exp, pi
>>> from sympy.stats import ContinuousRV, P, E

>>> x = Symbol("x")

>>> pdf = sqrt(2)*exp(-x**2/2)/(2*sqrt(pi)) # Normal distribution
>>> X = ContinuousRV(x, pdf)

>>> E(X)
0
>>> P(X>0)
1/2


## Interface¶

sympy.stats.P(condition, given_condition=None, numsamples=None, **kwargs)

Probability that a condition is true, optionally given a second condition

Parameters : expr : Relational containing RandomSymbols The condition of which you want to compute the probability given_condition : Relational containing RandomSymbols A conditional expression. P(X>1, X>0) is expectation of X>1 given X>0 numsamples : int Enables sampling and approximates the probability with this many samples evalf : Bool (defaults to True) If sampling return a number rather than a complex expression evaluate : Bool (defaults to True) In case of continuous systems return unevaluated integral

Examples

>>> from sympy.stats import P, Die
>>> from sympy import Eq
>>> X, Y = Die('X', 6), Die('Y', 6)
>>> P(X>3)
1/2
>>> P(Eq(X, 5), X>2) # Probability that X == 5 given that X > 2
1/4
>>> P(X>Y)
5/12

sympy.stats.E(expr, condition=None, numsamples=None, **kwargs)

Returns the expected value of a random expression

Parameters : expr : Expr containing RandomSymbols The expression of which you want to compute the expectation value given : Expr containing RandomSymbols A conditional expression. E(X, X>0) is expectation of X given X > 0 numsamples : int Enables sampling and approximates the expectation with this many samples evalf : Bool (defaults to True) If sampling return a number rather than a complex expression evaluate : Bool (defaults to True) In case of continuous systems return unevaluated integral

Examples

>>> from sympy.stats import E, Die
>>> X = Die('X', 6)
>>> E(X)
7/2
>>> E(2*X + 1)
8

>>> E(X, X>3) # Expectation of X given that it is above 3
5

sympy.stats.density(expr, condition=None, **kwargs)

Probability density of a random expression

Optionally given a second condition

This density will take on different forms for different types of probability spaces. Discrete variables produce Dicts. Continuous variables produce Lambdas.

Examples

>>> from sympy.stats import density, Die, Normal
>>> from sympy import Symbol

>>> D = Die('D', 6)
>>> X = Normal('x', 0, 1)

>>> density(D)
{1: 1/6, 2: 1/6, 3: 1/6, 4: 1/6, 5: 1/6, 6: 1/6}
>>> density(2*D)
{2: 1/6, 4: 1/6, 6: 1/6, 8: 1/6, 10: 1/6, 12: 1/6}
>>> density(X)
Lambda(_x, sqrt(2)*exp(-_x**2/2)/(2*sqrt(pi)))

sympy.stats.given(expr, condition=None, **kwargs)

From a random expression and a condition on that expression creates a new probability space from the condition and returns the same expression on that conditional probability space.

Examples

>>> from sympy.stats import given, density, Die
>>> X = Die('X', 6)
>>> Y = given(X, X>3)
>>> density(Y)
{4: 1/3, 5: 1/3, 6: 1/3}

sympy.stats.where(condition, given_condition=None, **kwargs)

Returns the domain where a condition is True.

Examples

>>> from sympy.stats import where, Die, Normal
>>> from sympy import symbols, And

>>> D1, D2 = Die('a', 6), Die('b', 6)
>>> a, b = D1.symbol, D2.symbol
>>> X = Normal('x', 0, 1)

>>> where(X**2<1)
Domain: And(-1 < x, x < 1)

>>> where(X**2<1).set
(-1, 1)

>>> where(And(D1<=D2 , D2<3))
Domain: Or(And(a == 1, b == 1), And(a == 1, b == 2), And(a == 2, b == 2))

sympy.stats.variance(X, condition=None, **kwargs)

Variance of a random expression

Expectation of (X-E(X))**2

Examples

>>> from sympy.stats import Die, E, Bernoulli, variance
>>> from sympy import simplify, Symbol

>>> X = Die('X', 6)
>>> p = Symbol('p')
>>> B = Bernoulli('B', p, 1, 0)

>>> variance(2*X)
35/3

>>> simplify(variance(B))
p*(-p + 1)

sympy.stats.std(X, condition=None, **kwargs)

Standard Deviation of a random expression

Square root of the Expectation of (X-E(X))**2

Examples

>>> from sympy.stats import Bernoulli, std
>>> from sympy import Symbol

>>> p = Symbol('p')
>>> B = Bernoulli('B', p, 1, 0)

>>> std(B)
sqrt(-p**2 + p)

sympy.stats.sample(expr, condition=None, **kwargs)

A realization of the random expression

Examples

>>> from sympy.stats import Die, sample
>>> X, Y, Z = Die('X', 6), Die('Y', 6), Die('Z', 6)

>>> die_roll = sample(X+Y+Z) # A random realization of three dice

sympy.stats.sample_iter(expr, condition=None, numsamples=oo, **kwargs)

Returns an iterator of realizations from the expression given a condition

expr: Random expression to be realized condition: A conditional expression (optional) numsamples: Length of the iterator (defaults to infinity)

Sample, sampling_P, sampling_E, sample_iter_lambdify, sample_iter_subs

Examples

>>> from sympy.stats import Normal, sample_iter
>>> X = Normal('X', 0, 1)
>>> expr = X*X + 3
>>> iterator = sample_iter(expr, numsamples=3)
>>> list(iterator)
[12, 4, 7]


## Mechanics¶

SymPy Stats employs a relatively complex class hierarchy.

RandomDomains are a mapping of variables to possible values. For example we might say that the symbol Symbol(‘x’) can take on the values {1,2,3,4,5,6}.

class sympy.stats.rv.RandomDomain[source]

A PSpace, or Probability Space, combines a RandomDomain with a density to provide probabilistic information. For example the above domain could be enhanced by a finite density {1:1/6, 2:1/6, 3:1/6, 4:1/6, 5:1/6, 6:1/6} to fully define the roll of a fair die named ‘x’.

class sympy.stats.rv.PSpace[source]

A RandomSymbol represents the PSpace’s symbol ‘x’ inside of SymPy expressions.

class sympy.stats.rv.RandomSymbol[source]

The RandomDomain and PSpace classes are almost never directly instantiated. Instead they are subclassed for a variety of situations.

RandomDomains and PSpaces must be sufficiently general to represent domains and spaces of several variables with arbitrarily complex densities. This generality is often unnecessary. Instead we often build SingleDomains and SinglePSpaces to represent single, univariate events and processes such as a single die or a single normal variable.

class sympy.stats.rv.SinglePSpace[source]
class sympy.stats.rv.SingleDomain[source]

Another common case is to collect together a set of such univariate random variables. A collection of independent SinglePSpaces or SingleDomains can be brought together to form a ProductDomain or ProductPSpace. These objects would be useful in representing three dice rolled together for example.

class sympy.stats.rv.ProductDomain[source]
class sympy.stats.rv.ProductPSpace[source]

The Conditional adjective is added whenever we add a global condition to a RandomDomain or PSpace. A common example would be three independent dice where we know their sum to be greater than 12.

class sympy.stats.rv.ConditionalDomain[source]

We specialize further into Finite and Continuous versions of these classes to represent finite (such as dice) and continuous (such as normals) random variables.

class sympy.stats.frv.FiniteDomain[source]
class sympy.stats.frv.FinitePSpace[source]
class sympy.stats.crv.ContinuousDomain[source]
class sympy.stats.crv.ContinuousPSpace[source]

Additionally there are a few specialized classes that implement certain common random variable types. There is for example a DiePSpace that implements SingleFinitePSpace and a NormalPSpace that implements SingleContinuousPSpace.

class sympy.stats.frv_types.DiePSpace[source]
class sympy.stats.crv_types.NormalPSpace[source]

RandomVariables can be extracted from these objects using the PSpace.values method.

As previously mentioned SymPy Stats employs a relatively complex class structure. Inheritance is widely used in the implementation of end-level classes. This tactic was chosen to balance between the need to allow SymPy to represent arbitrarily defined random variables and optimizing for common cases. This complicates the code but is structured to only be important to those working on extending SymPy Stats to other random variable types.

Users will not use this class structure. Instead these mechanics are exposed through variable creation functions Die, Coin, FiniteRV, Normal, Exponential, etc.... These build the appropriate SinglePSpaces and return the corresponding RandomVariable. Conditional and Product spaces are formed in the natural construction of SymPy expressions and the use of interface functions E, Given, Density, etc....

sympy.stats.Die()
sympy.stats.Normal()

There are some additional functions that may be useful. They are largely used internally.

sympy.stats.rv.random_symbols(expr)[source]

Returns all RandomSymbols within a SymPy Expression.

sympy.stats.rv.pspace(expr)[source]

Returns the underlying Probability Space of a random expression.

For internal use.

Examples

>>> from sympy.stats import pspace, Normal
>>> from sympy.stats.rv import ProductPSpace
>>> X = Normal('X', 0, 1)
>>> pspace(2*X + 1) == X.pspace
True
`
sympy.stats.rv.rs_swap(a, b)[source]

Build a dictionary to swap RandomSymbols based on their underlying symbol.

i.e. if X = (‘x’, pspace1) and Y = (‘x’, pspace2) then X and Y match and the key, value pair {X:Y} will appear in the result

Inputs: collections a and b of random variables which share common symbols Output: dict mapping RVs in a to RVs in b