For a meaningful interpolation, you would first need to define a 2D inperpolation function (bilinear, bicubic).
For better resutls directly use the scipy implementations of the percent point function (i.e. the inverse cumulative distribution function).
from scipy.stats import t alpha = 0.05 # significance level = 5% df = 5 # degrees of freedom v = t.ppf(1 - alpha/2, df) print(f'v: {v}')
Result is v: 2.57058
so the result is the same as the 2.571
from your table.
This code reproduces your student_t list:
def calc_v(alpha,df): v = t.ppf(1 - alpha/2, df) # t-critical value return v alphas = [ 0.5, 0.1, 0.05, 0.01] student_t = [[00, 50, 90, 95, 99]] for i in range(21): df = i+1 student_t.append([df]+[calc_v(alpha,df) for alpha in alphas]) for df in [30,40,50,60,61]: student_t.append([df]+[calc_v(alpha,df) for alpha in alphas])
As said above, the inverse of the ppf is the cdf. It can be calculated like this:
P = 1 - 2*(1 - t.cdf(2.571,df = 5))
Which gives P = 0.950025
.
Standard Normal
For standard normal distribution the ppf is also implemented in scipy:
from scipy.stats import norm norm.ppf(q, loc=0, scale=1)