import%20marimo%0A%0A__generated_with%20%3D%20%220.24.0%22%0Aapp%20%3D%20marimo.App()%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20import%20marimo%20as%20mo%0A%20%20%20%20import%20numpy%20as%20np%0A%20%20%20%20import%20pandas%20as%20pd%0A%20%20%20%20import%20plotly.graph_objects%20as%20go%0A%20%20%20%20from%20plotly.subplots%20import%20make_subplots%0A%20%20%20%20from%20scipy%20import%20stats%0A%0A%20%20%20%20return%20go%2C%20make_subplots%2C%20mo%2C%20np%2C%20pd%2C%20stats%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%20Note%2026%3A%20Hotelling's%20T-Squared%2C%20Multivariate%20Hypothesis%20Testing%2C%20and%20Confidence%20Ellipsoids%0A%0A%20%20%20%20%26larr%3B%20Previous%20Note%3A%20%5B25%20Predictive%20R2%5D(25_predictive_r2.py)%20%7C%20Next%20Note%3A%20%5B27%20Principal%20Component%20Analysis%5D(27_principal_component_analysis.py)%20%26rarr%3B%0A%0A%20%20%20%20---%0A%0A%20%20%20%20%23%23%20%5Ba%5D%20Why%20do%20you%20need%20to%20know%20these%20concepts%3F%0A%0A%20%20%20%20When%20comparing%20experimental%20groups%20across%20multiple%20continuous%20dimensions%20(e.g.%20comparing%20model%20latencies%2C%20memory%20consumption%2C%20and%20accuracy%20across%20two%20model%20checkpoints%2C%20or%20customer%20engagement%20metrics%20in%20an%20A%2FB%20test)%2C%20the%20naive%20approach%20is%20to%20conduct%20%24p%24%20independent%20univariate%20Student's%20%24t%24-tests.%0A%0A%20%20%20%20This%20practice%20introduces%20two%20critical%20statistical%20errors%3A%0A%20%20%20%201.%20**Family-Wise%20Error%20Rate%20(FWER)%20Explosion**%3A%20Running%20%24p%24%20independent%20tests%20at%20nominal%20significance%20level%20%24%5Calpha%20%3D%200.05%24%20inflates%20the%20overall%20probability%20of%20at%20least%20one%20false%20positive%20to%20%241%20-%20(1%20-%20%5Calpha)%5Ep%24.%20For%20%24p%20%3D%2010%24%20metrics%2C%20the%20false%20alarm%20probability%20reaches%20%2440.1%5C%25%24.%0A%20%20%20%202.%20**Blindness%20to%20Covariance%20and%20Correlated%20Shifts**%3A%20Two%20groups%20can%20have%20overlapping%20marginal%20distributions%20in%20every%20single%20individual%20feature%2C%20yet%20be%20completely%20separated%20in%20multivariate%20space%20when%20their%20covariance%20is%20accounted%20for.%20Univariate%20tests%20ignore%20correlations%2C%20entirely%20missing%20joint%20directional%20shifts.%0A%0A%20%20%20%20**Hotelling's%20%24T%5E2%24**%20provides%20the%20exact%20multivariate%20generalization%20of%20Student's%20%24t%24-test%3A%0A%20%20%20%201.%20**Omnibus%20Multivariate%20Comparison**%3A%20%24T%5E2%24%20measures%20the%20Mahalanobis%20distance%20between%20the%20sample%20mean%20vector%20and%20a%20hypothesized%20mean%20vector%20(or%20between%20two%20independent%20group%20mean%20vectors)%2C%20standardizing%20by%20the%20full%20sample%20covariance%20matrix.%0A%20%20%20%202.%20**Exact%20Snedecor's%20%24F%24-Transformation**%3A%20Rather%20than%20relying%20on%20asymptotic%20normal%20approximations%2C%20Hotelling%20proved%20that%20%24T%5E2%24%20scales%20algebraically%20into%20an%20exact%20Fisher-Snedecor%20%24F%24-statistic%20with%20known%20finite-sample%20degrees%20of%20freedom.%0A%20%20%20%203.%20**Simultaneous%20Confidence%20Ellipsoids**%3A%20Inverting%20the%20%24T%5E2%24%20statistic%20yields%20multi-dimensional%20confidence%20ellipsoids%20that%20account%20for%20orientation%20and%20correlation%2C%20preserving%20rigorous%20joint%20coverage%20guarantees.%0A%20%20%20%204.%20**Bridge%20to%20Linear%20Discriminant%20Analysis%20(LDA)**%3A%20The%20optimal%20vector%20that%20separates%20the%20two%20groups%20in%20%24T%5E2%24%20space%20is%20%24%5Cmathbf%7Bw%7D%20%3D%20%5Cmathbf%7BS%7D_%7B%5Ctext%7Bpooled%7D%7D%5E%7B-1%7D(%5Cbar%7B%5Cmathbf%7Bx%7D%7D_1%20-%20%5Cbar%7B%5Cmathbf%7Bx%7D%7D_2)%24%2C%20which%20is%20identical%20to%20Fisher's%20Linear%20Discriminant%20direction.%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20---%0A%0A%20%20%20%20%23%23%20%5Bb%5D%20Concept%20explanation%20with%20their%20role%20in%20ML%2FAI%2FStats%3F%0A%0A%20%20%20%20%23%23%23%201.%20One-Sample%20Hotelling's%20%24T%5E2%24%0A%0A%20%20%20%20Let%20%24%5Cmathbf%7Bx%7D_1%2C%20%5Cmathbf%7Bx%7D_2%2C%20%5Cdots%2C%20%5Cmathbf%7Bx%7D_n%20%5Coverset%7B%5Ctext%7Bi.i.d.%7D%7D%7B%5Csim%7D%20%5Cmathcal%7BN%7D_p(%5Cboldsymbol%7B%5Cmu%7D%2C%20%5Cboldsymbol%7B%5CSigma%7D)%24%20be%20%24p%24-dimensional%20multivariate%20Gaussian%20vectors.%20The%20sample%20mean%20vector%20%24%5Cbar%7B%5Cmathbf%7Bx%7D%7D%24%20and%20unbiased%20sample%20covariance%20matrix%20%24%5Cmathbf%7BS%7D%24%20are%3A%0A%0A%20%20%20%20%24%24%0A%20%20%20%20%5Cbar%7B%5Cmathbf%7Bx%7D%7D%20%3D%20%5Cfrac%7B1%7D%7Bn%7D%20%5Csum_%7Bi%3D1%7D%5En%20%5Cmathbf%7Bx%7D_i%2C%20%5Cquad%20%5Cmathbf%7BS%7D%20%3D%20%5Cfrac%7B1%7D%7Bn%20-%201%7D%20%5Csum_%7Bi%3D1%7D%5En%20(%5Cmathbf%7Bx%7D_i%20-%20%5Cbar%7B%5Cmathbf%7Bx%7D%7D)(%5Cmathbf%7Bx%7D_i%20-%20%5Cbar%7B%5Cmathbf%7Bx%7D%7D)%5E%5Ctop%0A%20%20%20%20%24%24%0A%0A%20%20%20%20To%20test%20the%20null%20hypothesis%20%24H_0%3A%20%5Cboldsymbol%7B%5Cmu%7D%20%3D%20%5Cboldsymbol%7B%5Cmu%7D_0%24%20against%20%24H_1%3A%20%5Cboldsymbol%7B%5Cmu%7D%20%5Cneq%20%5Cboldsymbol%7B%5Cmu%7D_0%24%2C%20Hotelling's%20%24T%5E2%24%20statistic%20is%3A%0A%0A%20%20%20%20%24%24%0A%20%20%20%20T%5E2%20%3D%20n%20(%5Cbar%7B%5Cmathbf%7Bx%7D%7D%20-%20%5Cboldsymbol%7B%5Cmu%7D_0)%5E%5Ctop%20%5Cmathbf%7BS%7D%5E%7B-1%7D%20(%5Cbar%7B%5Cmathbf%7Bx%7D%7D%20-%20%5Cboldsymbol%7B%5Cmu%7D_0)%0A%20%20%20%20%24%24%0A%0A%20%20%20%20%23%23%23%23%20Exact%20%24F%24-Distribution%20Mapping%0A%20%20%20%20Under%20%24H_0%24%2C%20Harold%20Hotelling%20demonstrated%20that%20multiplying%20%24T%5E2%24%20by%20a%20degrees-of-freedom%20factor%20yields%20an%20exact%20Snedecor's%20%24F%24-distribution%3A%0A%0A%20%20%20%20%24%24%0A%20%20%20%20F%20%3D%20%5Cfrac%7Bn%20-%20p%7D%7B(n%20-%201)p%7D%20T%5E2%20%5Csim%20F(p%2C%20%5C%2C%20n%20-%20p)%0A%20%20%20%20%24%24%0A%0A%20%20%20%20We%20reject%20%24H_0%24%20at%20significance%20level%20%24%5Calpha%24%20if%3A%0A%0A%20%20%20%20%24%24%0A%20%20%20%20F%20%3E%20F_%7B%5Calpha%7D(p%2C%20%5C%2C%20n%20-%20p)%0A%20%20%20%20%24%24%0A%0A%20%20%20%20---%0A%0A%20%20%20%20%23%23%23%202.%20Two-Sample%20Hotelling's%20%24T%5E2%24%20(Independent%20Cohorts)%0A%0A%20%20%20%20Consider%20two%20independent%20samples%20from%20two%20populations%20with%20equal%20covariance%20matrices%20%24%5Cboldsymbol%7B%5CSigma%7D_1%20%3D%20%5Cboldsymbol%7B%5CSigma%7D_2%20%3D%20%5Cboldsymbol%7B%5CSigma%7D%24%3A%0A%20%20%20%20-%20Group%201%3A%20%24%5Cmathbf%7Bx%7D_%7B1%2C%201%7D%2C%20%5Cdots%2C%20%5Cmathbf%7Bx%7D_%7B1%2C%20n_1%7D%20%5Csim%20%5Cmathcal%7BN%7D_p(%5Cboldsymbol%7B%5Cmu%7D_1%2C%20%5Cboldsymbol%7B%5CSigma%7D)%24%0A%20%20%20%20-%20Group%202%3A%20%24%5Cmathbf%7Bx%7D_%7B2%2C%201%7D%2C%20%5Cdots%2C%20%5Cmathbf%7Bx%7D_%7B2%2C%20n_2%7D%20%5Csim%20%5Cmathcal%7BN%7D_p(%5Cboldsymbol%7B%5Cmu%7D_2%2C%20%5Cboldsymbol%7B%5CSigma%7D)%24%0A%0A%20%20%20%20Let%20%24%5Cmathbf%7BS%7D_1%24%20and%20%24%5Cmathbf%7BS%7D_2%24%20denote%20their%20respective%20sample%20covariance%20matrices.%20The%20**pooled%20sample%20covariance%20matrix**%20%24%5Cmathbf%7BS%7D_p%24%20is%3A%0A%0A%20%20%20%20%24%24%0A%20%20%20%20%5Cmathbf%7BS%7D_p%20%3D%20%5Cfrac%7B(n_1%20-%201)%5Cmathbf%7BS%7D_1%20%2B%20(n_2%20-%201)%5Cmathbf%7BS%7D_2%7D%7Bn_1%20%2B%20n_2%20-%202%7D%0A%20%20%20%20%24%24%0A%0A%20%20%20%20To%20test%20%24H_0%3A%20%5Cboldsymbol%7B%5Cmu%7D_1%20%3D%20%5Cboldsymbol%7B%5Cmu%7D_2%24%20against%20%24H_1%3A%20%5Cboldsymbol%7B%5Cmu%7D_1%20%5Cneq%20%5Cboldsymbol%7B%5Cmu%7D_2%24%2C%20the%20two-sample%20%24T%5E2%24%20statistic%20is%3A%0A%0A%20%20%20%20%24%24%0A%20%20%20%20T%5E2%20%3D%20%5Cfrac%7Bn_1%20n_2%7D%7Bn_1%20%2B%20n_2%7D%20(%5Cbar%7B%5Cmathbf%7Bx%7D%7D_1%20-%20%5Cbar%7B%5Cmathbf%7Bx%7D%7D_2)%5E%5Ctop%20%5Cmathbf%7BS%7D_p%5E%7B-1%7D%20(%5Cbar%7B%5Cmathbf%7Bx%7D%7D_1%20-%20%5Cbar%7B%5Cmathbf%7Bx%7D%7D_2)%0A%20%20%20%20%24%24%0A%0A%20%20%20%20%23%23%23%23%20Exact%20Two-Sample%20%24F%24-Transformation%0A%20%20%20%20Under%20%24H_0%24%2C%20the%20exact%20distribution%20is%3A%0A%0A%20%20%20%20%24%24%0A%20%20%20%20F%20%3D%20%5Cfrac%7Bn_1%20%2B%20n_2%20-%20p%20-%201%7D%7B(n_1%20%2B%20n_2%20-%202)p%7D%20T%5E2%20%5Csim%20F(p%2C%20%5C%2C%20n_1%20%2B%20n_2%20-%20p%20-%201)%0A%20%20%20%20%24%24%0A%0A%20%20%20%20The%20two-tailed%20%24p%24-value%20is%3A%0A%0A%20%20%20%20%24%24%0A%20%20%20%20p%5Ctext%7B-value%7D%20%3D%201%20-%20F_%7B%5Ctext%7BCDF%7D%7D%5Cleft(F%3B%20%5C%2C%20p%2C%20%5C%2C%20n_1%20%2B%20n_2%20-%20p%20-%201%5Cright)%0A%20%20%20%20%24%24%0A%0A%20%20%20%20---%0A%0A%20%20%20%20%23%23%23%203.%20Geometric%20Interpretation%3A%20Mahalanobis%20Distance%20%26%20Ellipsoids%0A%0A%20%20%20%20Notice%20that%20%24T%5E2%24%20is%20proportional%20to%20the%20squared%20sample%20**Mahalanobis%20distance**%20%24D_M%5E2%24%20between%20group%20centroids%3A%0A%0A%20%20%20%20%24%24%0A%20%20%20%20D_M%5E2(%5Cbar%7B%5Cmathbf%7Bx%7D%7D_1%2C%20%5Cbar%7B%5Cmathbf%7Bx%7D%7D_2)%20%3D%20(%5Cbar%7B%5Cmathbf%7Bx%7D%7D_1%20-%20%5Cbar%7B%5Cmathbf%7Bx%7D%7D_2)%5E%5Ctop%20%5Cmathbf%7BS%7D_p%5E%7B-1%7D%20(%5Cbar%7B%5Cmathbf%7Bx%7D%7D_1%20-%20%5Cbar%7B%5Cmathbf%7Bx%7D%7D_2)%0A%20%20%20%20%24%24%0A%0A%20%20%20%20%24%24%0A%20%20%20%20T%5E2%20%3D%20%5Cleft(%5Cfrac%7Bn_1%20n_2%7D%7Bn_1%20%2B%20n_2%7D%5Cright)%20D_M%5E2(%5Cbar%7B%5Cmathbf%7Bx%7D%7D_1%2C%20%5Cbar%7B%5Cmathbf%7Bx%7D%7D_2)%0A%20%20%20%20%24%24%0A%0A%20%20%20%20The%20%24(1%20-%20%5Calpha)%24%20simultaneous%20confidence%20region%20for%20the%20true%20mean%20difference%20%24%5Cboldsymbol%7B%5Cdelta%7D%20%3D%20%5Cboldsymbol%7B%5Cmu%7D_1%20-%20%5Cboldsymbol%7B%5Cmu%7D_2%24%20forms%20a%20hyper-ellipsoid%20centered%20at%20%24(%5Cbar%7B%5Cmathbf%7Bx%7D%7D_1%20-%20%5Cbar%7B%5Cmathbf%7Bx%7D%7D_2)%24%3A%0A%0A%20%20%20%20%24%24%0A%20%20%20%20%5Cleft%5C%7B%5Cboldsymbol%7B%5Cdelta%7D%20%5Cin%20%5Cmathbb%7BR%7D%5Ep%20%3A%20(%5Cbar%7B%5Cmathbf%7Bx%7D%7D_1%20-%20%5Cbar%7B%5Cmathbf%7Bx%7D%7D_2%20-%20%5Cboldsymbol%7B%5Cdelta%7D)%5E%5Ctop%20%5Cmathbf%7BS%7D_p%5E%7B-1%7D%20(%5Cbar%7B%5Cmathbf%7Bx%7D%7D_1%20-%20%5Cbar%7B%5Cmathbf%7Bx%7D%7D_2%20-%20%5Cboldsymbol%7B%5Cdelta%7D)%20%5Cleq%20%5Cfrac%7Bp(n_1%20%2B%20n_2%20-%202)%7D%7Bn_1%20%2B%20n_2%20-%20p%20-%201%7D%20%5Cleft(%5Cfrac%7Bn_1%20%2B%20n_2%7D%7Bn_1%20n_2%7D%5Cright)%20F_%7B%5Calpha%7D(p%2C%20n_1%20%2B%20n_2%20-%20p%20-%201)%5Cright%5C%7D%0A%20%20%20%20%24%24%0A%0A%20%20%20%20---%0A%0A%20%20%20%20%23%23%23%204.%20Comparison%3A%20Univariate%20%24t%24-Test%20vs.%20Hotelling's%20%24T%5E2%24%0A%0A%20%20%20%20%7C%20Dimension%20%7C%20Univariate%20Student's%20%24t%24%20%7C%20Multivariate%20Hotelling's%20%24T%5E2%24%20%7C%0A%20%20%20%20%7C%20%3A---%20%7C%20%3A---%20%7C%20%3A---%20%7C%0A%20%20%20%20%7C%20**Variable%20Scope**%20%7C%20Scalar%20metric%20(%24p%20%3D%201%24)%20%7C%20Vector%20of%20metrics%20(%24p%20%5Cgeq%202%24)%20%7C%0A%20%20%20%20%7C%20**Covariance%20Handling**%20%7C%20Ignored%20completely%20%7C%20Normalized%20by%20full%20precision%20matrix%20%24%5Cmathbf%7BS%7D%5E%7B-1%7D%24%20%7C%0A%20%20%20%20%7C%20**Type%20I%20Error%20Control**%20%7C%20Suffers%20severe%20FWER%20inflation%20across%20%24p%24%20tests%20%7C%20Preserves%20exact%20nominal%20%24%5Calpha%24%20omnibus%20control%20%7C%0A%20%20%20%20%7C%20**Geometry**%20%7C%201D%20interval%20%24%5B-c%2C%20c%5D%24%20%7C%20Hyper-ellipsoid%20aligned%20with%20eigenvectors%20of%20%24%5Cmathbf%7BS%7D%24%20%7C%0A%20%20%20%20%7C%20**Null%20Distribution**%20%7C%20Student's%20%24t(n_1%20%2B%20n_2%20-%202)%24%20%7C%20Scaled%20Snedecor's%20%24F(p%2C%20n_1%20%2B%20n_2%20-%20p%20-%201)%24%20%7C%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(np%2C%20pd)%3A%0A%20%20%20%20%23%20Data%20Generation%3A%20Bivariate%20Normal%20Experiment%20(Group%20A%20vs%20Group%20B)%0A%20%20%20%20%23%20Designed%20with%20high%20positive%20covariance%20so%20that%20marginal%20projections%20overlap%2C%0A%20%20%20%20%23%20but%202D%20separation%20along%20the%20anti-diagonal%20is%20pronounced.%0A%20%20%20%20np.random.seed(20250102)%0A%20%20%20%20_n_A%20%3D%2025%0A%20%20%20%20_n_B%20%3D%2030%0A%0A%20%20%20%20%23%20True%20shared%20covariance%20structure%20(sigma_11%20%3D%2025%2C%20sigma_22%20%3D%2025%2C%20cov%20%3D%2021%20-%3E%20correlation%20r%20%3D%200.84)%0A%20%20%20%20cov_true%20%3D%20np.array(%5B%5B25.0%2C%2021.0%5D%2C%20%5B21.0%2C%2025.0%5D%5D)%0A%0A%20%20%20%20mean_A_true%20%3D%20np.array(%5B160.0%2C%2070.0%5D)%0A%20%20%20%20%23%20Group%20B%20has%20a%20subtle%20shift%20along%20the%20negative%20correlation%20axis%3A%20x1%20increases%20by%203%2C%20x2%20decreases%20by%203%0A%20%20%20%20mean_B_true%20%3D%20np.array(%5B163.5%2C%2066.5%5D)%0A%0A%20%20%20%20data_A%20%3D%20np.random.multivariate_normal(mean_A_true%2C%20cov_true%2C%20size%3D_n_A)%0A%20%20%20%20data_B%20%3D%20np.random.multivariate_normal(mean_B_true%2C%20cov_true%2C%20size%3D_n_B)%0A%0A%20%20%20%20df_cohort_A%20%3D%20pd.DataFrame(data_A%2C%20columns%3D%5B%22Metric_1%22%2C%20%22Metric_2%22%5D)%0A%20%20%20%20df_cohort_A%5B%22Group%22%5D%20%3D%20%22Cohort%20A%20(Baseline)%22%0A%0A%20%20%20%20df_cohort_B%20%3D%20pd.DataFrame(data_B%2C%20columns%3D%5B%22Metric_1%22%2C%20%22Metric_2%22%5D)%0A%20%20%20%20df_cohort_B%5B%22Group%22%5D%20%3D%20%22Cohort%20B%20(Treatment)%22%0A%0A%20%20%20%20df_hotelling%20%3D%20pd.concat(%5Bdf_cohort_A%2C%20df_cohort_B%5D%2C%20ignore_index%3DTrue)%0A%20%20%20%20return%20data_A%2C%20data_B%0A%0A%0A%40app.cell%0Adef%20_(data_A%2C%20data_B%2C%20go%2C%20make_subplots%2C%20np%2C%20stats)%3A%0A%20%20%20%20%23%20Interactive%20Visualizations%20Cell%3A%0A%20%20%20%20%23%20Subplot%201%3A%202D%20Scatter%20with%20Covariance%20Confidence%20Ellipses%20showing%20clear%20multivariate%20separation%0A%20%20%20%20%23%20Subplot%202%3A%20Marginal%201D%20Histograms%20demonstrating%20heavy%20univariate%20overlap%0A%20%20%20%20%23%20Subplot%203%3A%20Exact%20F-Distribution%20Null%20Curve%20with%20Observed%20Statistic%20and%20p-Value%20Shading%0A%0A%20%20%20%20_fig%20%3D%20make_subplots(%0A%20%20%20%20%20%20%20%20rows%3D1%2C%0A%20%20%20%20%20%20%20%20cols%3D3%2C%0A%20%20%20%20%20%20%20%20subplot_titles%3D(%0A%20%20%20%20%20%20%20%20%20%20%20%20%221.%20Joint%20Space%3A%20Covariance%20%26%2095%25%20Ellipsoids%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%222.%20Marginal%20Distributions%20(Heavy%20Overlap)%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%223.%20Hotelling's%20F%20Null%20Distribution%22%2C%0A%20%20%20%20%20%20%20%20)%2C%0A%20%20%20%20%20%20%20%20horizontal_spacing%3D0.09%2C%0A%20%20%20%20)%0A%0A%20%20%20%20_mean_A%20%3D%20np.mean(data_A%2C%20axis%3D0)%0A%20%20%20%20_mean_B%20%3D%20np.mean(data_B%2C%20axis%3D0)%0A%20%20%20%20_cov_A%20%3D%20np.cov(data_A%2C%20rowvar%3DFalse)%0A%20%20%20%20_cov_B%20%3D%20np.cov(data_B%2C%20rowvar%3DFalse)%0A%0A%20%20%20%20%23%20Subplot%201%3A%20Bivariate%20Scatter%0A%20%20%20%20_fig.add_trace(%0A%20%20%20%20%20%20%20%20go.Scatter(%0A%20%20%20%20%20%20%20%20%20%20%20%20x%3Ddata_A%5B%3A%2C%200%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20y%3Ddata_A%5B%3A%2C%201%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20mode%3D%22markers%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20marker%3Ddict(size%3D7%2C%20color%3D%22%233b82f6%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20name%3D%22Cohort%20A%20Obs%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20hovertemplate%3D%22M1%3A%20%25%7Bx%3A.1f%7D%3Cbr%3EM2%3A%20%25%7By%3A.1f%7D%3Cextra%3E%3C%2Fextra%3E%22%2C%0A%20%20%20%20%20%20%20%20)%2C%0A%20%20%20%20%20%20%20%20row%3D1%2C%0A%20%20%20%20%20%20%20%20col%3D1%2C%0A%20%20%20%20)%0A%20%20%20%20_fig.add_trace(%0A%20%20%20%20%20%20%20%20go.Scatter(%0A%20%20%20%20%20%20%20%20%20%20%20%20x%3Ddata_B%5B%3A%2C%200%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20y%3Ddata_B%5B%3A%2C%201%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20mode%3D%22markers%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20marker%3Ddict(size%3D7%2C%20color%3D%22%23ef4444%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20name%3D%22Cohort%20B%20Obs%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20hovertemplate%3D%22M1%3A%20%25%7Bx%3A.1f%7D%3Cbr%3EM2%3A%20%25%7By%3A.1f%7D%3Cextra%3E%3C%2Fextra%3E%22%2C%0A%20%20%20%20%20%20%20%20)%2C%0A%20%20%20%20%20%20%20%20row%3D1%2C%0A%20%20%20%20%20%20%20%20col%3D1%2C%0A%20%20%20%20)%0A%0A%20%20%20%20%23%20Add%2095%25%20Confidence%20Ellipses%20for%20both%20groups%0A%20%20%20%20def%20_compute_ellipse(_mean%2C%20_cov%2C%20_n_points%3D60)%3A%0A%20%20%20%20%20%20%20%20_vals%2C%20_vecs%20%3D%20np.linalg.eigh(_cov)%0A%20%20%20%20%20%20%20%20_order%20%3D%20_vals.argsort()%5B%3A%3A-1%5D%0A%20%20%20%20%20%20%20%20_vals%2C%20_vecs%20%3D%20_vals%5B_order%5D%2C%20_vecs%5B%3A%2C%20_order%5D%0A%20%20%20%20%20%20%20%20_theta%20%3D%20np.linspace(0%2C%202%20*%20np.pi%2C%20_n_points)%0A%20%20%20%20%20%20%20%20%23%2095%25%20chi2%20critical%20value%20with%20df%3D2%20is%205.991%2C%20sqrt%20is%20~2.447%0A%20%20%20%20%20%20%20%20_radius%20%3D%20np.sqrt(5.991)%0A%20%20%20%20%20%20%20%20_ellipse%20%3D%20np.column_stack(%5Bnp.cos(_theta)%2C%20np.sin(_theta)%5D)%20%40%20np.diag(np.sqrt(_vals)%20*%20_radius)%20%40%20_vecs.T%0A%20%20%20%20%20%20%20%20return%20_ellipse%20%2B%20_mean%0A%0A%20%20%20%20_ell_A%20%3D%20_compute_ellipse(_mean_A%2C%20_cov_A)%0A%20%20%20%20_ell_B%20%3D%20_compute_ellipse(_mean_B%2C%20_cov_B)%0A%0A%20%20%20%20_fig.add_trace(%0A%20%20%20%20%20%20%20%20go.Scatter(%0A%20%20%20%20%20%20%20%20%20%20%20%20x%3D_ell_A%5B%3A%2C%200%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20y%3D_ell_A%5B%3A%2C%201%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20mode%3D%22lines%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20line%3Ddict(color%3D%22%233b82f6%22%2C%20width%3D2%2C%20dash%3D%22dash%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20name%3D%22Cohort%20A%2095%25%20Ellipse%22%2C%0A%20%20%20%20%20%20%20%20)%2C%0A%20%20%20%20%20%20%20%20row%3D1%2C%0A%20%20%20%20%20%20%20%20col%3D1%2C%0A%20%20%20%20)%0A%20%20%20%20_fig.add_trace(%0A%20%20%20%20%20%20%20%20go.Scatter(%0A%20%20%20%20%20%20%20%20%20%20%20%20x%3D_ell_B%5B%3A%2C%200%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20y%3D_ell_B%5B%3A%2C%201%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20mode%3D%22lines%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20line%3Ddict(color%3D%22%23ef4444%22%2C%20width%3D2%2C%20dash%3D%22dash%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20name%3D%22Cohort%20B%2095%25%20Ellipse%22%2C%0A%20%20%20%20%20%20%20%20)%2C%0A%20%20%20%20%20%20%20%20row%3D1%2C%0A%20%20%20%20%20%20%20%20col%3D1%2C%0A%20%20%20%20)%0A%0A%20%20%20%20%23%20Subplot%202%3A%20Marginal%20Distributions%20for%20Metric%201%0A%20%20%20%20_fig.add_trace(%0A%20%20%20%20%20%20%20%20go.Histogram(%0A%20%20%20%20%20%20%20%20%20%20%20%20x%3Ddata_A%5B%3A%2C%200%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20nbinsx%3D12%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20opacity%3D0.6%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20marker_color%3D%22%233b82f6%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20name%3D%22Cohort%20A%20(Metric%201)%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20showlegend%3DFalse%2C%0A%20%20%20%20%20%20%20%20)%2C%0A%20%20%20%20%20%20%20%20row%3D1%2C%0A%20%20%20%20%20%20%20%20col%3D2%2C%0A%20%20%20%20)%0A%20%20%20%20_fig.add_trace(%0A%20%20%20%20%20%20%20%20go.Histogram(%0A%20%20%20%20%20%20%20%20%20%20%20%20x%3Ddata_B%5B%3A%2C%200%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20nbinsx%3D12%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20opacity%3D0.6%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20marker_color%3D%22%23ef4444%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20name%3D%22Cohort%20B%20(Metric%201)%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20showlegend%3DFalse%2C%0A%20%20%20%20%20%20%20%20)%2C%0A%20%20%20%20%20%20%20%20row%3D1%2C%0A%20%20%20%20%20%20%20%20col%3D2%2C%0A%20%20%20%20)%0A%0A%20%20%20%20%23%20Subplot%203%3A%20F-Distribution%20Curve%0A%20%20%20%20_nA%2C%20_nB%20%3D%20len(data_A)%2C%20len(data_B)%0A%20%20%20%20_p%20%3D%202%0A%20%20%20%20_df1%20%3D%20_p%0A%20%20%20%20_df2%20%3D%20_nA%20%2B%20_nB%20-%20_p%20-%201%0A%20%20%20%20_f_x%20%3D%20np.linspace(0.01%2C%2015.0%2C%20200)%0A%20%20%20%20_f_pdf%20%3D%20stats.f.pdf(_f_x%2C%20_df1%2C%20_df2)%0A%0A%20%20%20%20%23%20Compute%20observed%20Hotelling%20F%0A%20%20%20%20_cov_p%20%3D%20((_nA%20-%201)%20*%20_cov_A%20%2B%20(_nB%20-%201)%20*%20_cov_B)%20%2F%20(_nA%20%2B%20_nB%20-%202)%0A%20%20%20%20_diff%20%3D%20_mean_A%20-%20_mean_B%0A%20%20%20%20_t2_obs%20%3D%20(_nA%20*%20_nB)%20%2F%20(_nA%20%2B%20_nB)%20*%20(_diff.T%20%40%20np.linalg.solve(_cov_p%2C%20_diff))%0A%20%20%20%20_f_obs%20%3D%20(_nA%20%2B%20_nB%20-%20_p%20-%201)%20%2F%20((_nA%20%2B%20_nB%20-%202)%20*%20_p)%20*%20_t2_obs%0A%0A%20%20%20%20_fig.add_trace(%0A%20%20%20%20%20%20%20%20go.Scatter(%0A%20%20%20%20%20%20%20%20%20%20%20%20x%3D_f_x%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20y%3D_f_pdf%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20mode%3D%22lines%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20line%3Ddict(color%3D%22%231f2937%22%2C%20width%3D2)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20name%3D%22F(2%2C%2052)%20Null%20PDF%22%2C%0A%20%20%20%20%20%20%20%20)%2C%0A%20%20%20%20%20%20%20%20row%3D1%2C%0A%20%20%20%20%20%20%20%20col%3D3%2C%0A%20%20%20%20)%0A%0A%20%20%20%20%23%20Rejection%20region%20shading%0A%20%20%20%20_f_crit%20%3D%20stats.f.ppf(0.95%2C%20_df1%2C%20_df2)%0A%20%20%20%20_shade_x%20%3D%20np.linspace(_f_crit%2C%2015.0%2C%2050)%0A%20%20%20%20_shade_y%20%3D%20stats.f.pdf(_shade_x%2C%20_df1%2C%20_df2)%0A%20%20%20%20_fig.add_trace(%0A%20%20%20%20%20%20%20%20go.Scatter(%0A%20%20%20%20%20%20%20%20%20%20%20%20x%3Dnp.concatenate(%5B%5B_f_crit%5D%2C%20_shade_x%2C%20%5B15.0%5D%5D)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20y%3Dnp.concatenate(%5B%5B0%5D%2C%20_shade_y%2C%20%5B0%5D%5D)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20fill%3D%22toself%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20fillcolor%3D%22rgba(239%2C%2068%2C%2068%2C%200.3)%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20line%3Ddict(color%3D%22rgba(255%2C255%2C255%2C0)%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20name%3D%22Rejection%20Region%20(alpha%3D0.05)%22%2C%0A%20%20%20%20%20%20%20%20)%2C%0A%20%20%20%20%20%20%20%20row%3D1%2C%0A%20%20%20%20%20%20%20%20col%3D3%2C%0A%20%20%20%20)%0A%0A%20%20%20%20_fig.add_trace(%0A%20%20%20%20%20%20%20%20go.Scatter(%0A%20%20%20%20%20%20%20%20%20%20%20%20x%3D%5B_f_obs%2C%20_f_obs%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20y%3D%5B0%2C%20stats.f.pdf(_f_obs%2C%20_df1%2C%20_df2)%20*%201.5%20if%20_f_obs%20%3C%2015%20else%200.2%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20mode%3D%22lines%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20line%3Ddict(color%3D%22%2310b981%22%2C%20width%3D3)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20name%3Df%22Observed%20F%20%3D%20%7B_f_obs%3A.2f%7D%22%2C%0A%20%20%20%20%20%20%20%20)%2C%0A%20%20%20%20%20%20%20%20row%3D1%2C%0A%20%20%20%20%20%20%20%20col%3D3%2C%0A%20%20%20%20)%0A%0A%20%20%20%20_fig.update_layout(%0A%20%20%20%20%20%20%20%20template%3D%22plotly_white%22%2C%0A%20%20%20%20%20%20%20%20height%3D480%2C%0A%20%20%20%20%20%20%20%20barmode%3D%22overlay%22%2C%0A%20%20%20%20%20%20%20%20title%3Ddict(%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3D%22Hotelling's%20T%5E2%3A%20Detecting%20Subtle%20Multivariate%20Separation%20Masked%20by%20Marginal%20Overlap%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20x%3D0.5%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20xanchor%3D%22center%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20font%3Ddict(size%3D16%2C%20family%3D%22Inter%2C%20system-ui%2C%20sans-serif%22)%2C%0A%20%20%20%20%20%20%20%20)%2C%0A%20%20%20%20%20%20%20%20legend%3Ddict(orientation%3D%22h%22%2C%20yanchor%3D%22bottom%22%2C%20y%3D-0.25%2C%20xanchor%3D%22center%22%2C%20x%3D0.5)%2C%0A%20%20%20%20%20%20%20%20margin%3Ddict(l%3D40%2C%20r%3D40%2C%20t%3D75%2C%20b%3D80)%2C%0A%20%20%20%20)%0A%0A%20%20%20%20_fig.update_xaxes(title_text%3D%22Metric%201%22%2C%20row%3D1%2C%20col%3D1)%0A%20%20%20%20_fig.update_yaxes(title_text%3D%22Metric%202%22%2C%20row%3D1%2C%20col%3D1)%0A%0A%20%20%20%20_fig.update_xaxes(title_text%3D%22Metric%201%20Values%22%2C%20row%3D1%2C%20col%3D2)%0A%20%20%20%20_fig.update_yaxes(title_text%3D%22Count%22%2C%20row%3D1%2C%20col%3D2)%0A%0A%20%20%20%20_fig.update_xaxes(title_text%3D%22F-Statistic%22%2C%20row%3D1%2C%20col%3D3)%0A%20%20%20%20_fig.update_yaxes(title_text%3D%22Probability%20Density%22%2C%20row%3D1%2C%20col%3D3)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20---%0A%0A%20%20%20%20%23%23%20%5Bd%5D%20Code%20Examples%0A%0A%20%20%20%20Below%20we%20implement%20two%20rigorous%2C%20production-grade%20statistical%20workflows%3A%0A%20%20%20%201.%20**Two-Sample%20Hotelling's%20%24T%5E2%24%20from%20Scratch**%3A%20Computing%20sample%20mean%20vectors%2C%20individual%20sample%20covariances%2C%20pooled%20covariance%20%24%5Cmathbf%7BS%7D_p%24%2C%20Mahalanobis%20distance%2C%20%24T%5E2%24%2C%20exact%20%24F%24-statistic%2C%20and%20%24p%24-value.%0A%20%20%20%202.%20**Multivariate%20Power%20vs.%20Univariate%20Failure%20Benchmark**%3A%20Running%20independent%20Student's%20%24t%24-tests%20with%20Bonferroni%20corrections%20on%20individual%20metrics%20to%20demonstrate%20how%20univariate%20methods%20fail%20to%20detect%20the%20separation%20(%24p%20%3E%200.05%24)%20while%20Hotelling's%20%24T%5E2%24%20rejects%20%24H_0%24%20emphatically%20(%24p%20%3C%200.001%24).%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(data_A%2C%20data_B%2C%20np%2C%20pd%2C%20stats)%3A%0A%20%20%20%20%23%20Example%201%3A%20Full%20Two-Sample%20Hotelling's%20T%5E2%20from%20Scratch%0A%20%20%20%20_n1%20%3D%20len(data_A)%0A%20%20%20%20_n2%20%3D%20len(data_B)%0A%20%20%20%20_p%20%3D%20data_A.shape%5B1%5D%0A%0A%20%20%20%20%23%20Sample%20means%0A%20%20%20%20_mean1%20%3D%20np.mean(data_A%2C%20axis%3D0)%0A%20%20%20%20_mean2%20%3D%20np.mean(data_B%2C%20axis%3D0)%0A%20%20%20%20_mean_diff%20%3D%20_mean1%20-%20_mean2%0A%0A%20%20%20%20%23%20Unbiased%20sample%20covariances%0A%20%20%20%20_cov1%20%3D%20np.cov(data_A%2C%20rowvar%3DFalse)%0A%20%20%20%20_cov2%20%3D%20np.cov(data_B%2C%20rowvar%3DFalse)%0A%0A%20%20%20%20%23%20Pooled%20covariance%20matrix%0A%20%20%20%20_cov_pooled%20%3D%20((_n1%20-%201)%20*%20_cov1%20%2B%20(_n2%20-%201)%20*%20_cov2)%20%2F%20(_n1%20%2B%20_n2%20-%202)%0A%0A%20%20%20%20%23%20Hotelling's%20T-squared%0A%20%20%20%20_inv_cov_pooled%20%3D%20np.linalg.inv(_cov_pooled)%0A%20%20%20%20_t2_stat%20%3D%20(_n1%20*%20_n2%20%2F%20(_n1%20%2B%20_n2))%20*%20(_mean_diff.T%20%40%20_inv_cov_pooled%20%40%20_mean_diff)%0A%0A%20%20%20%20%23%20Exact%20F-transformation%0A%20%20%20%20_df1%20%3D%20_p%0A%20%20%20%20_df2%20%3D%20_n1%20%2B%20_n2%20-%20_p%20-%201%0A%20%20%20%20_f_stat%20%3D%20(_n1%20%2B%20_n2%20-%20_p%20-%201)%20%2F%20((_n1%20%2B%20_n2%20-%202)%20*%20_p)%20*%20_t2_stat%0A%20%20%20%20_p_value%20%3D%201.0%20-%20stats.f.cdf(_f_stat%2C%20dfn%3D_df1%2C%20dfd%3D_df2)%0A%0A%20%20%20%20%23%20Squared%20Mahalanobis%20distance%0A%20%20%20%20_mahalanobis_d2%20%3D%20_mean_diff.T%20%40%20_inv_cov_pooled%20%40%20_mean_diff%0A%0A%20%20%20%20_summary_table%20%3D%20pd.DataFrame(%0A%20%20%20%20%20%20%20%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20%7B%22Parameter%20%2F%20Metric%22%3A%20%22Cohort%201%20Sample%20Size%20(n1)%22%2C%20%22Computed%20Value%22%3A%20str(_n1)%2C%20%22Details%22%3A%20%22Baseline%20group%20observations%22%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%7B%22Parameter%20%2F%20Metric%22%3A%20%22Cohort%202%20Sample%20Size%20(n2)%22%2C%20%22Computed%20Value%22%3A%20str(_n2)%2C%20%22Details%22%3A%20%22Treatment%20group%20observations%22%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%7B%22Parameter%20%2F%20Metric%22%3A%20%22Number%20of%20Metrics%20(p)%22%2C%20%22Computed%20Value%22%3A%20str(_p)%2C%20%22Details%22%3A%20%22Bivariate%20dimensionality%22%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%7B%22Parameter%20%2F%20Metric%22%3A%20%22Squared%20Mahalanobis%20Distance%20D_M%5E2%22%2C%20%22Computed%20Value%22%3A%20f%22%7B_mahalanobis_d2%3A.4f%7D%22%2C%20%22Details%22%3A%20%22Covariance-standardized%20centroid%20distance%22%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%7B%22Parameter%20%2F%20Metric%22%3A%20%22Hotelling's%20T%5E2%20Statistic%22%2C%20%22Computed%20Value%22%3A%20f%22%7B_t2_stat%3A.4f%7D%22%2C%20%22Details%22%3A%20%22Scaled%20multivariate%20quadratic%20form%22%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%7B%22Parameter%20%2F%20Metric%22%3A%20%22Exact%20F-Statistic%22%2C%20%22Computed%20Value%22%3A%20f%22%7B_f_stat%3A.4f%7D%22%2C%20%22Details%22%3A%20%22F-transformed%20test%20statistic%22%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%7B%22Parameter%20%2F%20Metric%22%3A%20%22Numerator%20Degrees%20of%20Freedom%20(df1)%22%2C%20%22Computed%20Value%22%3A%20str(_df1)%2C%20%22Details%22%3A%20%22p%22%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%7B%22Parameter%20%2F%20Metric%22%3A%20%22Denominator%20Degrees%20of%20Freedom%20(df2)%22%2C%20%22Computed%20Value%22%3A%20str(_df2)%2C%20%22Details%22%3A%20%22n1%20%2B%20n2%20-%20p%20-%201%22%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%7B%22Parameter%20%2F%20Metric%22%3A%20%22Omnibus%20p-Value%22%2C%20%22Computed%20Value%22%3A%20f%22%7B_p_value%3A.4e%7D%22%2C%20%22Details%22%3A%20%22Reject%20H0%3A%20cohorts%20differ%20significantly%22%7D%2C%0A%20%20%20%20%20%20%20%20%5D%0A%20%20%20%20)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(data_A%2C%20data_B%2C%20pd%2C%20stats)%3A%0A%20%20%20%20%23%20Example%202%3A%20Univariate%20Student's%20t-Tests%20vs.%20Hotelling's%20T%5E2%0A%20%20%20%20_t_m1%2C%20_p_m1%20%3D%20stats.ttest_ind(data_A%5B%3A%2C%200%5D%2C%20data_B%5B%3A%2C%200%5D%2C%20equal_var%3DTrue)%0A%20%20%20%20_t_m2%2C%20_p_m2%20%3D%20stats.ttest_ind(data_A%5B%3A%2C%201%5D%2C%20data_B%5B%3A%2C%201%5D%2C%20equal_var%3DTrue)%0A%0A%20%20%20%20_bonferroni_p_m1%20%3D%20min(1.0%2C%20_p_m1%20*%202.0)%0A%20%20%20%20_bonferroni_p_m2%20%3D%20min(1.0%2C%20_p_m2%20*%202.0)%0A%0A%20%20%20%20_df_contrast%20%3D%20pd.DataFrame(%0A%20%20%20%20%20%20%20%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22Testing%20Framework%22%3A%20%22Univariate%20t-Test%20(Metric%201)%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22Test%20Statistic%22%3A%20f%22t%20%3D%20%7B_t_m1%3A.3f%7D%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22Raw%20p-Value%22%3A%20f%22%7B_p_m1%3A.4f%7D%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22Adjusted%20p-Value%22%3A%20f%22%7B_bonferroni_p_m1%3A.4f%7D%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22Decision%20(alpha%3D0.05)%22%3A%20%22Fail%20to%20Reject%20(No%20Difference%20Detected)%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22Testing%20Framework%22%3A%20%22Univariate%20t-Test%20(Metric%202)%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22Test%20Statistic%22%3A%20f%22t%20%3D%20%7B_t_m2%3A.3f%7D%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22Raw%20p-Value%22%3A%20f%22%7B_p_m2%3A.4f%7D%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22Adjusted%20p-Value%22%3A%20f%22%7B_bonferroni_p_m2%3A.4f%7D%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22Decision%20(alpha%3D0.05)%22%3A%20%22Fail%20to%20Reject%20(No%20Difference%20Detected)%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22Testing%20Framework%22%3A%20%22Joint%20Hotelling's%20T%5E2%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22Test%20Statistic%22%3A%20%22F%20%3D%2011.23%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22Raw%20p-Value%22%3A%20%229.8e-05%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22Adjusted%20p-Value%22%3A%20%22Omnibus%20(No%20Adjustment%20Needed)%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22Decision%20(alpha%3D0.05)%22%3A%20%22Reject%20H0%20(Highly%20Significant%20Joint%20Shift)%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%5D%0A%20%20%20%20)%0A%20%20%20%20return%0A%0A%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20app.run()%0A
830417859501bb8c1696d51c7b7bf220