Goodness of fit evaluation in SciPy - Time & Space Complexity
Start learning this pattern below
Jump into concepts and practice - no test required
We want to know how the time needed to check how well a model fits data changes as the data size grows.
How does the cost of evaluating goodness of fit grow when we have more data points?
Analyze the time complexity of the following code snippet.
import numpy as np
from scipy.stats import chisquare
observed = np.array([20, 30, 50])
expected = np.array([25, 25, 50])
chi2_stat, p_value = chisquare(f_obs=observed, f_exp=expected)
print(f"Chi-square statistic: {chi2_stat}, p-value: {p_value}")
This code calculates the chi-square test statistic and p-value to see how well observed data matches expected data.
Identify the loops, recursion, array traversals that repeat.
- Primary operation: Element-wise subtraction, division, and squaring for each data point.
- How many times: Once for each data point in the observed and expected arrays.
Each data point requires a fixed number of calculations. More data points mean more calculations.
| Input Size (n) | Approx. Operations |
|---|---|
| 10 | About 10 sets of calculations |
| 100 | About 100 sets of calculations |
| 1000 | About 1000 sets of calculations |
Pattern observation: The number of operations grows directly with the number of data points.
Time Complexity: O(n)
This means the time to evaluate goodness of fit grows linearly with the number of data points.
[X] Wrong: "The test runs in constant time no matter how much data there is."
[OK] Correct: Each data point must be checked, so more data means more work and more time.
Understanding how time grows with data size helps you explain your code choices clearly and shows you think about efficiency.
"What if we used a more complex goodness of fit test that compares pairs of data points? How would the time complexity change?"
Practice
scipy.stats.chisquare primarily evaluate?Solution
Step 1: Understand the purpose of chi-square test
The chi-square goodness of fit test compares observed data frequencies to expected frequencies to check if they match.Step 2: Identify what
This function calculates the chi-square statistic and p-value to evaluate the fit between observed and expected counts.scipy.stats.chisquaredoesFinal Answer:
How well observed data matches expected frequencies -> Option BQuick Check:
Goodness of fit = observed vs expected match [OK]
- Confusing goodness of fit with correlation
- Thinking it measures mean differences
- Mixing variance analysis with goodness of fit
Solution
Step 1: Recall the module structure of scipy
The chi-square test function is inside the stats submodule of scipy.Step 2: Identify correct import syntax
The correct import isfrom scipy.stats import chisquareto directly access the function.Final Answer:
from scipy.stats import chisquare -> Option CQuick Check:
Correct import = from scipy.stats import chisquare [OK]
- Trying to import chisquare directly from scipy
- Using incorrect module paths
- Using alias without import
from scipy.stats import chisquare observed = [20, 30, 50] expected = [25, 25, 50] result = chisquare(f_obs=observed, f_exp=expected) print(round(result.statistic, 2), round(result.pvalue, 3))
Solution
Step 1: Calculate chi-square statistic manually
Chi-square = sum((observed - expected)^2 / expected) = ((20-25)^2/25) + ((30-25)^2/25) + ((50-50)^2/50) = (25/25)+(25/25)+0 = 1+1+0 = 2.0Step 2: Interpret p-value from scipy output
Using scipy.stats.chisquare with these values gives a p-value around 0.368, indicating moderate fit.Final Answer:
2.0 0.368 -> Option AQuick Check:
Chi-square stat = 2.0, p-value ≈ 0.368 [OK]
- Forgetting to square differences
- Dividing by wrong expected values
- Mixing up statistic and p-value
from scipy.stats import chisquare observed = [15, 25, 35] expected = [20, 20] result = chisquare(f_obs=observed, f_exp=expected) print(result)
Solution
Step 1: Check input array lengths
The observed array has 3 elements, but expected has only 2 elements, which is invalid for chi-square test.Step 2: Understand scipy requirement
Both observed and expected arrays must be the same length to compare frequencies correctly.Final Answer:
Observed and expected arrays have different lengths -> Option AQuick Check:
Array length mismatch causes error [OK]
- Ignoring length mismatch
- Assuming expected must be integers
- Thinking import or print is the error
scipy.stats.chisquare, what is the p-value indicating if the observed data fits the equal distribution? (Hint: expected counts are equal for all categories.)Solution
Step 1: Calculate expected counts for equal distribution
Total counts = 40+35+25 = 100. Expected counts = [100/3, 100/3, 100/3] ≈ [33.33, 33.33, 33.33].Step 2: Perform chi-square test with scipy
Usingchisquare(f_obs=[40,35,25], f_exp=[33.33,33.33,33.33])gives a chi-square statistic ≈ 3.5 and p-value ≈ 0.174.Final Answer:
0.174 -> Option DQuick Check:
Unequal counts vs equal expected gives p-value ≈ 0.174 [OK]
- Using observed counts as expected
- Not dividing total counts equally
- Misinterpreting p-value significance
