Probability to z-score and vice versa

PythonStatistics

Python Problem Overview


How do I calculate the z score of a p-value and vice versa?

For example if I have a p-value of 0.95 I should get 1.96 in return.

I saw some functions in scipy but they only run a z-test on an array.

I have access to numpy, statsmodel, pandas, and scipy (I think).

Python Solutions


Solution 1 - Python

>>> import scipy.stats as st
>>> st.norm.ppf(.95)
1.6448536269514722
>>> st.norm.cdf(1.64)
0.94949741652589625

Default Python Probabilities

As other users noted, Python calculates left/lower-tail probabilities by default. If you want to determine the density points where 95% of the distribution is included, you have to take another approach:

>>>st.norm.ppf(.975)
1.959963984540054
>>>st.norm.ppf(.025)
-1.960063984540054

Density between two points

Solution 2 - Python

Starting in Python 3.8, the standard library provides the NormalDist object as part of the statistics module.

It can be used to get the zscore for which x% of the area under a normal curve lies (ignoring both tails).

We can obtain one from the other and vice versa using the inv_cdf (inverse cumulative distribution function) and the cdf (cumulative distribution function) on the standard normal distribution:

from statistics import NormalDist

NormalDist().inv_cdf((1 + 0.95) / 2.)
# 1.9599639845400536
NormalDist().cdf(1.9599639845400536) * 2 - 1
# 0.95

An explanation for the '(1 + 0.95) / 2.' formula can be found in this wikipedia section.

Solution 3 - Python

If you are interested in T-test, you can do similar:

  • z-statistics (z-score) is used when the data follows a normal distribution, population standard deviation sigma is known and the sample size is above 30. Z-Score tells you how many standard deviations from the mean your result is. The z-score is calculated using the formula:
    z_score = (xbar - mu) / sigma
  • t-statistics (t-score), also known as Student's T-Distribution, is used when the data follows a normal distribution, population standard deviation (sigma) is NOT known, but the sample standard deviation (s) is known or can be calculated, and the sample size is below 30. T-Score tells you how many standard deviations from the mean your result is. The t-score is calculated using the formula:
    t_score = (xbar - mu) / (s/sqrt(n))

Summary: If the sample sizes are larger than 30, the z-distribution and the t-distributions are pretty much the same and either one can be used. If the population standard deviation is available and the sample size is greater than 30, t-distribution can be used with the population standard deviation instead of the sample standard deviation.

test
statistics
lookup
table
lookup
values
critical
value
normal
distribution
population
standard
deviation (sigma)
sample
size
z-statistics z-table z-score z-critical is z-score at a specific confidence level yes known > 30
t-statistics t-table t-score t-critical is t-score at a specific confidence level yes not known < 30



Python Percent Point Function is used to calculate the critical values at a specific confidence level:

  • z-critical = stats.norm.ppf(1 - alpha) (use alpha = alpha/2 for two-sided)
  • t-critical = stats.t.ppf(alpha/numOfTails, ddof)

Codes

import numpy as np
from scipy import stats


# alpha to critical
alpha = 0.05
n_sided = 2 # 2-sided test
z_crit = stats.norm.ppf(1-alpha/n_sided)
print(z_crit) # 1.959963984540054

# critical to alpha
alpha = stats.norm.sf(z_crit) * n_sided
print(alpha) # 0.05

Solution 4 - Python

Z-score to probability :

enter image description here

The code snippet below maps the negative of the absolute value of the z-score to cdf of a Std Normal Distribution and multiplies by 2 . This will give the prob of finding the probability of Area1 + Area2 shaded in the picture here : enter image description here

import numpy as np
from scipy.stats import norm 


norm(0, 1).cdf(-np.absolute(zscore)) * 2 

Ref: https://mathbitsnotebook.com/Algebra2/Statistics/STzScores.html

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
Questionuser3084006View Question on Stackoverflow
Solution 1 - PythonMyles BakerView Answer on Stackoverflow
Solution 2 - PythonXavier GuihotView Answer on Stackoverflow
Solution 3 - PythonBhishanPoudelView Answer on Stackoverflow
Solution 4 - PythonGaurav ChawlaView Answer on Stackoverflow