Skip to content

Instantly share code, notes, and snippets.

@mnguyenngo
Last active April 12, 2022 04:55
Show Gist options
  • Star 12 You must be signed in to star a gist
  • Fork 2 You must be signed in to fork a gist
  • Save mnguyenngo/3e0695c138c567852cff966c19ea0354 to your computer and use it in GitHub Desktop.
Save mnguyenngo/3e0695c138c567852cff966c19ea0354 to your computer and use it in GitHub Desktop.
Code to calculate and plot the z-score
import numpy as np
import matplotlib.pyplot as plt
import scipy.stats as scs
def z_val(sig_level=0.05, two_tailed=True):
"""Returns the z value for a given significance level"""
z_dist = scs.norm()
if two_tailed:
sig_level = sig_level/2
area = 1 - sig_level
else:
area = 1 - sig_level
z = z_dist.ppf(area)
return z
def zplot(area=0.95, two_tailed=True, align_right=False):
"""Plots a z distribution with common annotations
Example:
zplot(area=0.95)
zplot(area=0.80, two_tailed=False, align_right=True)
Parameters:
area (float): The area under the standard normal distribution curve.
align (str): The area under the curve can be aligned to the center
(default) or to the left.
Returns:
None: A plot of the normal distribution with annotations showing the
area under the curve and the boundaries of the area.
"""
# create plot object
fig = plt.figure(figsize=(12, 6))
ax = fig.subplots()
# create normal distribution
norm = scs.norm()
# create data points to plot
x = np.linspace(-5, 5, 1000)
y = norm.pdf(x)
ax.plot(x, y)
# code to fill areas for two-tailed tests
if two_tailed:
left = norm.ppf(0.5 - area / 2)
right = norm.ppf(0.5 + area / 2)
ax.vlines(right, 0, norm.pdf(right), color='grey', linestyle='--')
ax.vlines(left, 0, norm.pdf(left), color='grey', linestyle='--')
ax.fill_between(x, 0, y, color='grey', alpha='0.25',
where=(x > left) & (x < right))
plt.xlabel('z')
plt.ylabel('PDF')
plt.text(left, norm.pdf(left), "z = {0:.3f}".format(left), fontsize=12,
rotation=90, va="bottom", ha="right")
plt.text(right, norm.pdf(right), "z = {0:.3f}".format(right),
fontsize=12, rotation=90, va="bottom", ha="left")
# for one-tailed tests
else:
# align the area to the right
if align_right:
left = norm.ppf(1-area)
ax.vlines(left, 0, norm.pdf(left), color='grey', linestyle='--')
ax.fill_between(x, 0, y, color='grey', alpha='0.25',
where=x > left)
plt.text(left, norm.pdf(left), "z = {0:.3f}".format(left),
fontsize=12, rotation=90, va="bottom", ha="right")
# align the area to the left
else:
right = norm.ppf(area)
ax.vlines(right, 0, norm.pdf(right), color='grey', linestyle='--')
ax.fill_between(x, 0, y, color='grey', alpha='0.25',
where=x < right)
plt.text(right, norm.pdf(right), "z = {0:.3f}".format(right),
fontsize=12, rotation=90, va="bottom", ha="left")
# annotate the shaded area
plt.text(0, 0.1, "shaded area = {0:.3f}".format(area), fontsize=12,
ha='center')
# axis labels
plt.xlabel('z')
plt.ylabel('PDF')
plt.show()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment