Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Create random numbers with left skewed probability distribution

I would like to pick a number randomly between 1-100 such that the probability of getting numbers 60-100 is higher than 1-59.

I would like to have the probability to be a left-skewed distribution for numbers 1-100. That is to say, it has a long tail and a peak.

Something along the lines:

pers = np.arange(1,101,1)
prob = <left-skewed distribution>
number = np.random.choice(pers, 1, p=prob)

I do not know how to generate a left-skewed discrete probability function. Any ideas? Thanks!

like image 330
Rohit Avatar asked Jul 20 '14 21:07

Rohit


1 Answers

This is the answer you are looking for using the SciPy function 'skewnorm'. It can make any positive set of integers either left or rightward skewed.

from scipy.stats import skewnorm
import matplotlib.pyplot as plt

numValues = 10000
maxValue = 100
skewness = -5   #Negative values are left skewed, positive values are right skewed.

random = skewnorm.rvs(a = skewness,loc=maxValue, size=numValues)  #Skewnorm function

random = random - min(random)      #Shift the set so the minimum value is equal to zero.
random = random / max(random)      #Standadize all the vlues between 0 and 1. 
random = random * maxValue         #Multiply the standardized values by the maximum value.

#Plot histogram to check skewness
plt.hist(random,30,density=True, color = 'red', alpha=0.1)
plt.show()

Please reference the documentation here: https://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.skewnorm.html

Histogram of left-skewed distribution

The code generates the following plot.

enter image description here

like image 171
Aaron Horvitz Avatar answered Sep 28 '22 10:09

Aaron Horvitz