# Elicited

Helper tools to construct probability distributions built from expert elicited data for use in monte carlo simulations.

Credit to Brett Hoover, packaging by @magoo

## Usage

```
pip install elicited
```

```
import elicited as e
```

`elicited`

is just a helper tool when using numpy and scipy, so you'll need these in your code.

```
import numpy as np
from scipy.stats import poisson, zipf, beta, pareto, lognorm
```

### Lognormal

See Occurance and Applications for examples of lognormal distributions in nature.

Expert: Most customers hold around $20K (`mode`

) but I could imagine a customer with $2.5M (`max`

)

```
mode = 20000
max = 2500000
mean, stdv = e.elicitLogNormal(mode, max)
asset_values = lognorm(s=stdv, scale=np.exp(mean))
asset_values.rvs(100)
```

### Pareto

The 80/20 rule. See Occurance and Applications

Expert: The legal costs of an incident could be devastating. Typically costs are almost zero (

`val_min`

) but a black swan could be $100M (`val_max`

).

```
b = e.elicitPareto(val_min, val_max)
p = pareto(b, loc=val_min-1., scale=1.))
```

### PERT

Expert: Our customers have anywhere from $500-$6000 (

`val_min`

/`val_max`

), but it's most typically around $4500 (`val_mod`

)

```
PERT_a, PERT_b = e.elicitPERT(val_min, val_mod, val_max)
pert = beta(PERT_a, PERT_b, loc=val_min, scale=val_max-val_min)
```

### Zipf's

See Applications

Expert: If we get sued, there will only be a few litigants (

`nMin`

). Very rarely it could be 30 or more litigants (`nMax`

), maybe once every thousand cases (`pMax`

) it would be more.

```
nMin = 1
nMax = 30
pMax = 1/1000
Zs = e.elicitZipf(nMin, nMax, pMax, report=True)
litigants = zipf(Zs, nMin-1)
litigants.rvs(100)
```

## Reference: Other Useful Elicitations

Listed as a courtesy, these distributions are simple enough to elicit data into directly without a helper function.

### Uniform

A "zero knowledge" distribution where all values within the range have equal probability of appearing. Similar to `random.randint(a, b)`

Expert: The crowd will be between 50 (

`min`

) and 500 (`max`

) due to fire code restrictions and the existing residents in the building.

```
from scipy.stats import uniform
min = 50
max = 500
range = max - min
crowd_size = uniform(min, range)
crowd_size.rvs(100)
```

### Poisson

Expert: About 3000 Customers (

`average`

) add a credit card to their account every quarter.

```
from scipy.stats import poisson
average = 3000
upsells = poisson(average)
upsells.rvs(100)
```