In this extract, we’ll learn how to estimate population means, variances and other statistics using the Point Estimation method. For the code samples, we’ve used Python 2.7.
A point estimate is an estimate of a population parameter based on sample data. To obtain these estimates, we simply apply the function that we wish to measure for our population to a sample of the data.
For example, suppose there is a company of 9,000 employees and we are interested in ascertaining the average length of breaks taken by employees in a single day. As we probably cannot ask every single person, we will take a sample of the 9,000 people and take a mean of the sample. This sample mean will be our point estimate.
The following code is broken into three parts:
We will use the probability distribution, known as the Poisson distribution, to randomly generate 9,000 answers to the question: for how many minutes in a day do you usually take breaks? This will represent our “population”.
We will take a sample of 100 employees (using the Python random sample method) and find a point estimate of a mean (called a sample mean).
Compare our sample mean (the mean of the sample of 100 employees) to our population mean.
Let’s take a look at the following code:
np.random.seed(1234) long_breaks = stats.poisson.rvs(loc=10, mu=60, size=3000) # represents 3000 people who take about a 60 minute break
The long_breaks variable represents 3000 answers to the question: how many minutes on an average do you take breaks for?, and these answers will be on the longer side. Let’s see a visualization of this distribution, shown as follows:
We see that our average of 60 minutes is to the left of the distribution. Also, because we only sampled 3000 people, our bins are at their highest around 700-800 people.
Now, let’s model 6000 people who take, on an average, about 15 minutes’ worth of breaks. Let’s again use the Poisson distribution to simulate 6000 people, as shown:
short_breaks = stats.poisson.rvs(loc=10, mu=15, size=6000) # represents 6000 people who take about a 15 minute break pd.Series(short_breaks).hist()
Okay, so we have a distribution for the people who take longer breaks and a distribution for the people who take shorter breaks. Again, note how our average break length of 15 minutes falls to the left-hand side of the distribution, and note that the tallest bar is about 1600 people.
breaks = np.concatenate((long_breaks, short_breaks)) # put the two arrays together to get our "population" of 9000 people
The breaks variable is the amalgamation of all the 9000 employees, both long and short break takers. Let’s see the entire distribution of people in a single visualization:
We see how we have two humps. On the left, we have our larger hump of people who take about a 15 minute break, and on the right, we have a smaller hump of people who take longer breaks. Later on, we will investigate this graph further.
We can find the total average break length by running the following code:
breaks.mean() # 39.99 minutes is our parameter
Our average company break length is about 40 minutes. Remember that our population is the entire company’s employee size of 9,000 people, and our parameter is 40 minutes. In the real world, our goal would be to estimate the population parameter because we would not have the resources to ask every single employee in a survey their average break length for many reasons. Instead, we will use a point estimate.
So, to make our point, we want to simulate a world where we ask 100 random people about the length of their breaks. To do this, let’s take a random sample of 100 employees out of the 9,000 employees we simulated, as shown:
sample_breaks = np.random.choice(a = breaks, size=100) # taking a sample of 100 employees
Now, let’s take the mean of the sample and subtract it from the population mean and see how far off we were:
breaks.mean() - sample_breaks.mean() # difference between means is 4.09 minutes, not bad!
This is extremely interesting, because with only about 1% of our population (100 out of 9,000), we were able to get within 4 minutes of our population parameter and get a very accurate estimate of our population mean. Not bad!
Here, we calculated a point estimate for the mean, but we can also do this for proportion parameters. By proportion, I am referring to a ratio of two quantitative values.
Let’s suppose that in a company of 10,000 people, our employees are 20% white, 10% black, 10% Hispanic, 30% Asian, and 30% identify as other. We will take a sample of 1,000 employees and see if their race proportions are similar.
employee_races = (["white"]*2000) + (["black"]*1000) + (["hispanic"]*1000) + (["asian"]*3000) + (["other"]*3000)
employee_races represents our employee population. For example, in our company of 10,000 people, 2,000 people are white (20%) and 3,000 people are Asian (30%).
Let’s take a random sample of 1,000 people, as shown:
demo_sample = random.sample(employee_races, 1000) # Sample 1000 values for race in set(demo_sample): print( race + " proportion estimate:" ) print( demo_sample.count(race)/1000. ) The output obtained would be as follows: hispanic proportion estimate: 0.103 white proportion estimate: 0.192 other proportion estimate: 0.288 black proportion estimate: 0.1 asian proportion estimate: 0.317
We can see that the race proportion estimates are very close to the underlying population’s proportions. For example, we got 10.3% for Hispanic in our sample and the population proportion for Hispanic was 10%.
To summarize we can say that you’re familiar with point estimation method to estimate population means, variances and other statistics, and implement them in Python.
If you found our post useful, you can check out Principles of Data Science for more interesting Data Science tips and techniques.