import%20marimo%0A%0A__generated_with%20%3D%20%220.24.0%22%0Aapp%20%3D%20marimo.App(width%3D%22medium%22)%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%20import%20scipy.stats%20as%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%2016%3A%20Point-Biserial%20Correlation%20and%20Continuous-Binary%20Association%0A%0A%20%20%20%20%26larr%3B%20Previous%20Note%3A%20%5B15%20Mutual%20Information%5D(15_mutual_information.py)%20%7C%20Next%20Note%3A%20%5B17%20Jensen%20Inequality%5D(17_jensen_inequality.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%20Real-world%20datasets%20rarely%20consist%20exclusively%20of%20continuous%20numerical%20variables.%20In%20machine%20learning%2C%20medical%20diagnostics%2C%20A%2FB%20testing%2C%20and%20psychometrics%2C%20analysts%20frequently%20encounter%20mixed%20data%20where%20a%20continuous%20feature%20(e.g.%2C%20patient%20blood%20pressure%2C%20annual%20income%2C%20model%20inference%20latency)%20must%20be%20tested%20for%20association%20with%20a%20binary%20variable%20(e.g.%2C%20disease%20presence%2C%20subscription%20churn%2C%20experimental%20treatment%20vs%20control).%0A%0A%20%20%20%20The%20**Point-Biserial%20Correlation%20Coefficient%20(%24r_%7Bpb%7D%24)**%20is%20the%20foundational%20metric%20for%20measuring%20association%20between%20a%20continuous%20variable%20and%20a%20binary%20indicator%3A%0A%20%20%20%201.%20**Direct%20Bridge%20to%20Pearson's%20Correlation**%3A%20Point-biserial%20correlation%20is%20not%20a%20different%20mathematical%20creature%3B%20it%20is%20mathematically%20identical%20to%20Pearson's%20product-moment%20correlation%20calculated%20between%20a%20continuous%20variable%20and%20a%20%240%2F1%24%20indicator%20dummy%20variable.%0A%20%20%20%202.%20**Direct%20Equivalence%20to%20Student's%20Two-Sample%20t-Test**%3A%20Testing%20whether%20%24r_%7Bpb%7D%20%3D%200%24%20is%20exactly%20equivalent%20to%20running%20an%20independent%20two-sample%20Student's%20t-test%20comparing%20group%20means%20(%24H_0%3A%20%5Cmu_1%20%3D%20%5Cmu_0%24).%20The%20test%20statistic%20satisfies%20%24t%20%3D%20r_%7Bpb%7D%20%5Csqrt%7B%5Cfrac%7Bn%20-%202%7D%7B1%20-%20r_%7Bpb%7D%5E2%7D%7D%24.%0A%20%20%20%203.%20**Fast%20Feature%20Screening%20for%20Binary%20Classification**%3A%20Computing%20%24r_%7Bpb%7D%24%20across%20hundreds%20of%20continuous%20features%20provides%20a%20computationally%20efficient%2C%20scale-invariant%20filter%20for%20ranking%20features%20by%20linear%20discriminative%20power%20prior%20to%20training%20models%20(e.g.%2C%20Logistic%20Regression%2C%20SVMs%2C%20or%20Gradient%20Boosted%20Trees).%0A%20%20%20%204.%20**Psychometric%20Item%20Discrimination**%3A%20In%20test%20design%20and%20Item%20Response%20Theory%20(IRT)%2C%20the%20point-biserial%20correlation%20between%20an%20individual%20question%20score%20(%240%20%3D%20%5Ctext%7Bincorrect%7D%2C%201%20%3D%20%5Ctext%7Bcorrect%7D%24)%20and%20overall%20test%20score%20measures%20whether%20a%20question%20effectively%20discriminates%20high-performing%20students%20from%20low-performing%20students.%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%20Mathematical%20Formulation%20of%20Point-Biserial%20Correlation%0A%0A%20%20%20%20Let%20%24Y%20%5Cin%20%5C%7B0%2C%201%5C%7D%24%20be%20a%20naturally%20dichotomous%20binary%20variable%2C%20and%20let%20%24X%20%5Cin%20%5Cmathbb%7BR%7D%24%20be%20a%20continuous%20random%20variable.%0A%20%20%20%20Let%20%24n_1%24%20and%20%24n_0%24%20denote%20the%20sample%20counts%20of%20the%20two%20subgroups%20(%24Y%20%3D%201%24%20and%20%24Y%20%3D%200%24)%2C%20with%20total%20sample%20size%20%24n%20%3D%20n_0%20%2B%20n_1%24.%0A%20%20%20%20Let%20%24M_1%20%3D%20%5Cbar%7BX%7D_1%24%20and%20%24M_0%20%3D%20%5Cbar%7BX%7D_0%24%20denote%20the%20sample%20means%20of%20%24X%24%20within%20each%20subgroup%3A%0A%0A%20%20%20%20%24%24%0A%20%20%20%20M_1%20%3D%20%5Cfrac%7B1%7D%7Bn_1%7D%20%5Csum_%7Bi%3A%20Y_i%20%3D%201%7D%20X_i%2C%20%5Cquad%20M_0%20%3D%20%5Cfrac%7B1%7D%7Bn_0%7D%20%5Csum_%7Bi%3A%20Y_i%20%3D%200%7D%20X_i%0A%20%20%20%20%24%24%0A%0A%20%20%20%20The%20**point-biserial%20correlation%20coefficient**%20%24r_%7Bpb%7D%24%20is%20defined%20as%3A%0A%0A%20%20%20%20%24%24%0A%20%20%20%20r_%7Bpb%7D%20%3D%20%5Cfrac%7BM_1%20-%20M_0%7D%7Bs_X%7D%20%5Csqrt%7B%5Cfrac%7Bn_1%20n_0%7D%7Bn(n%20-%201)%7D%7D%0A%20%20%20%20%24%24%0A%0A%20%20%20%20where%20%24s_X%24%20is%20the%20pooled%20sample%20standard%20deviation%20across%20all%20%24n%24%20observations%3A%0A%0A%20%20%20%20%24%24%0A%20%20%20%20s_X%20%3D%20%5Csqrt%7B%5Cfrac%7B1%7D%7Bn%20-%201%7D%20%5Csum_%7Bi%3D1%7D%5En%20(X_i%20-%20%5Cbar%7BX%7D)%5E2%7D%0A%20%20%20%20%24%24%0A%0A%20%20%20%20In%20terms%20of%20the%20population%20standard%20deviation%20%24%5Csigma_X%24%20and%20subgroup%20proportion%20%24p%20%3D%20n_1%20%2F%20n%24%3A%0A%0A%20%20%20%20%24%24%0A%20%20%20%20r_%7Bpb%7D%20%3D%20%5Cfrac%7BM_1%20-%20M_0%7D%7B%5Csigma_X%7D%20%5Csqrt%7Bp%20(1%20-%20p)%7D%0A%20%20%20%20%24%24%0A%0A%20%20%20%20---%0A%0A%20%20%20%20%23%23%23%20Exact%20Equivalence%20to%20Pearson's%20Product-Moment%20Correlation%0A%0A%20%20%20%20If%20we%20encode%20the%20binary%20variable%20as%20a%20numeric%20vector%20%24Y_i%20%5Cin%20%5C%7B0%2C%201%5C%7D%24%20and%20evaluate%20the%20standard%20Pearson%20correlation%20formula%3A%0A%0A%20%20%20%20%24%24%0A%20%20%20%20r_%7BXY%7D%20%3D%20%5Cfrac%7B%5Csum_%7Bi%3D1%7D%5En%20(X_i%20-%20%5Cbar%7BX%7D)(Y_i%20-%20%5Cbar%7BY%7D)%7D%7B%5Csqrt%7B%5Csum_%7Bi%3D1%7D%5En%20(X_i%20-%20%5Cbar%7BX%7D)%5E2%20%5Csum_%7Bi%3D1%7D%5En%20(Y_i%20-%20%5Cbar%7BY%7D)%5E2%7D%7D%0A%20%20%20%20%24%24%0A%0A%20%20%20%20Algebraic%20substitution%20of%20%24%5Cbar%7BY%7D%20%3D%20p%24%20and%20%24%5Csum%20(Y_i%20-%20%5Cbar%7BY%7D)%5E2%20%3D%20n%20p%20(1%20-%20p)%24%20reveals%20that%3A%0A%0A%20%20%20%20%24%24%0A%20%20%20%20r_%7BXY%7D%20%5Cequiv%20r_%7Bpb%7D%0A%20%20%20%20%24%24%0A%0A%20%20%20%20Thus%2C%20point-biserial%20correlation%20is%20a%20specialized%20algebraic%20simplification%20of%20Pearson's%20%24r%24.%0A%0A%20%20%20%20---%0A%0A%20%20%20%20%23%23%23%20Exact%20Correspondence%20with%20Student's%20Two-Sample%20t-Test%0A%0A%20%20%20%20Testing%20the%20null%20hypothesis%20of%20zero%20point-biserial%20correlation%20(%24H_0%3A%20r_%7Bpb%7D%20%3D%200%24)%20is%20mathematically%20identical%20to%20testing%20for%20equality%20of%20group%20means%20(%24H_0%3A%20%5Cmu_1%20%3D%20%5Cmu_0%24)%20in%20an%20independent%20two-sample%20t-test%3A%0A%0A%20%20%20%20%24%24%0A%20%20%20%20t%20%3D%20%5Cfrac%7Br_%7Bpb%7D%20%5Csqrt%7Bn%20-%202%7D%7D%7B%5Csqrt%7B1%20-%20r_%7Bpb%7D%5E2%7D%7D%20%5Csim%20t(n%20-%202)%0A%20%20%20%20%24%24%0A%0A%20%20%20%20Squaring%20both%20sides%20connects%20point-biserial%20correlation%20directly%20to%20the%20Analysis%20of%20Variance%20(ANOVA)%20F-statistic%3A%0A%0A%20%20%20%20%24%24%0A%20%20%20%20F%20%3D%20t%5E2%20%3D%20%5Cfrac%7Br_%7Bpb%7D%5E2%20(n%20-%202)%7D%7B1%20-%20r_%7Bpb%7D%5E2%7D%0A%20%20%20%20%24%24%0A%0A%20%20%20%20Consequently%2C%20%24r_%7Bpb%7D%5E2%24%20represents%20the%20exact%20coefficient%20of%20determination%20(%24R%5E2%24)%2C%20measuring%20the%20proportion%20of%20total%20variance%20in%20continuous%20variable%20%24X%24%20accounted%20for%20by%20group%20membership%20%24Y%24.%0A%0A%20%20%20%20---%0A%0A%20%20%20%20%23%23%23%20Sensitivity%20to%20Class%20Imbalance%0A%0A%20%20%20%20A%20critical%20consideration%20in%20machine%20learning%20is%20that%20%24r_%7Bpb%7D%24%20scales%20proportionally%20with%20%24%5Csqrt%7Bp(1%20-%20p)%7D%24.%0A%20%20%20%20*%20When%20classes%20are%20balanced%20(%24p%20%3D%200.5%24)%2C%20%24%5Csqrt%7Bp(1%20-%20p)%7D%20%3D%200.5%24%20(maximum%20possible%20value).%0A%20%20%20%20*%20When%20severe%20class%20imbalance%20exists%20(e.g.%2C%20fraud%20detection%20where%20%24p%20%3D%200.01%24)%2C%20%24%5Csqrt%7Bp(1%20-%20p)%7D%20%5Capprox%200.0995%24.%0A%0A%20%20%20%20Even%20if%20the%20underlying%20standardized%20mean%20difference%20(Cohen's%20%24d%20%3D%20%5Cfrac%7BM_1%20-%20M_0%7D%7B%5Csigma_%7B%5Ctext%7Bpooled%7D%7D%7D%24)%20remains%20massive%2C%20severe%20class%20imbalance%20substantially%20compresses%20%24r_%7Bpb%7D%24.%20Analysts%20must%20account%20for%20class%20proportions%20when%20using%20%24r_%7Bpb%7D%24%20for%20feature%20ranking.%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%5Bc%5D%20Interactive%20Visualizations%3A%20Group%20Separation%20and%20Proportion%20Sensitivity%0A%0A%20%20%20%20The%20interactive%20subplots%20below%20display%20the%20mechanics%20of%20Point-Biserial%20Correlation%3A%0A%20%20%20%20*%20**Left%20Panel**%3A%20Distribution%20of%20continuous%20variable%20%24X%24%20stratified%20by%20binary%20indicator%20%24Y%20%5Cin%20%5C%7B0%2C%201%5C%7D%24%20(%24N%20%3D%20120%24%20samples).%20Box%20plots%20with%20jittered%20data%20points%20illustrate%20group%20mean%20separation%20(%24%5CDelta%20M%20%3D%20M_1%20-%20M_0%20%3D%203.0%24)%2C%20yielding%20%24r_%7Bpb%7D%20%5Capprox%200.53%24.%0A%20%20%20%20*%20**Right%20Panel**%3A%20Sensitivity%20of%20%24r_%7Bpb%7D%24%20to%20the%20subgroup%20proportion%20%24p%20%3D%20n_1%20%2F%20n%24%20across%20varying%20effect%20sizes%20(Cohen's%20%24d%20%5Cin%20%5C%7B0.5%2C%201.0%2C%201.5%2C%202.0%5C%7D%24).%20The%20parabolic%20shape%20reveals%20how%20class%20imbalance%20dampens%20correlation%20even%20when%20true%20group%20separation%20remains%20unchanged.%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(go%2C%20make_subplots%2C%20np)%3A%0A%20%20%20%20rng_vis%20%3D%20np.random.default_rng(42)%0A%20%20%20%20n0_size%20%3D%2060%0A%20%20%20%20n1_size%20%3D%2060%0A%0A%20%20%20%20%23%20Continuous%20values%20for%20group%200%20and%20group%201%0A%20%20%20%20x0_data%20%3D%20rng_vis.normal(loc%3D10.0%2C%20scale%3D2.0%2C%20size%3Dn0_size)%0A%20%20%20%20x1_data%20%3D%20rng_vis.normal(loc%3D13.0%2C%20scale%3D2.0%2C%20size%3Dn1_size)%0A%0A%20%20%20%20%23%20Class%20proportion%20grid%20p%20in%20%5B0.01%2C%200.99%5D%0A%20%20%20%20p_values_grid%20%3D%20np.linspace(0.01%2C%200.99%2C%20120)%0A%20%20%20%20cohen_d_values%20%3D%20%5B0.5%2C%201.0%2C%201.5%2C%202.0%5D%0A%20%20%20%20palette_colors%20%3D%20%5B%22%2394a3b8%22%2C%20%22%232563eb%22%2C%20%22%2316a34a%22%2C%20%22%23dc2626%22%5D%0A%0A%20%20%20%20fig%20%3D%20make_subplots(%0A%20%20%20%20%20%20%20%20rows%3D1%2C%0A%20%20%20%20%20%20%20%20cols%3D2%2C%0A%20%20%20%20%20%20%20%20subplot_titles%3D%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20%22Continuous%20Feature%20Stratified%20by%20Binary%20Groups%20(r_pb%20%E2%89%88%200.53)%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22Effect%20of%20Class%20Proportion%20(p)%20on%20Point-Biserial%20r_pb%22%2C%0A%20%20%20%20%20%20%20%20%5D%2C%0A%20%20%20%20)%0A%0A%20%20%20%20%23%20Left%3A%20Group%200%20Box%20Plot%0A%20%20%20%20fig.add_trace(%0A%20%20%20%20%20%20%20%20go.Box(%0A%20%20%20%20%20%20%20%20%20%20%20%20y%3Dx0_data%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20name%3D%22Group%20Y%20%3D%200%20(Control)%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20marker_color%3D%22%232563eb%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20boxpoints%3D%22all%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20jitter%3D0.3%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20pointpos%3D-1.6%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%20Left%3A%20Group%201%20Box%20Plot%0A%20%20%20%20fig.add_trace(%0A%20%20%20%20%20%20%20%20go.Box(%0A%20%20%20%20%20%20%20%20%20%20%20%20y%3Dx1_data%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20name%3D%22Group%20Y%20%3D%201%20(Treatment)%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20marker_color%3D%22%23ea580c%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20boxpoints%3D%22all%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20jitter%3D0.3%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20pointpos%3D-1.6%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%20Right%3A%20Sensitivity%20curves%20for%20different%20Cohen's%20d%0A%20%20%20%20for%20idx_d%2C%20d_effect%20in%20enumerate(cohen_d_values)%3A%0A%20%20%20%20%20%20%20%20%23%20Formula%3A%20r%20%3D%20(d%20*%20sqrt(p(1-p)))%20%2F%20sqrt(1%20%2B%20d%5E2%20*%20p(1-p))%0A%20%20%20%20%20%20%20%20pq_factor%20%3D%20p_values_grid%20*%20(1.0%20-%20p_values_grid)%0A%20%20%20%20%20%20%20%20r_pb_theoretical%20%3D%20(d_effect%20*%20np.sqrt(pq_factor))%20%2F%20np.sqrt(1.0%20%2B%20(d_effect**2)%20*%20pq_factor)%0A%0A%20%20%20%20%20%20%20%20fig.add_trace(%0A%20%20%20%20%20%20%20%20%20%20%20%20go.Scatter(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20x%3Dp_values_grid%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20y%3Dr_pb_theoretical%2C%0A%20%20%20%20%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%20%20%20%20%20line%3Ddict(color%3Dpalette_colors%5Bidx_d%5D%2C%20width%3D2.5)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20name%3Df%22Effect%20Size%20d%20%3D%20%7Bd_effect%3A.1f%7D%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20row%3D1%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20col%3D2%2C%0A%20%20%20%20%20%20%20%20)%0A%0A%20%20%20%20fig.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%3D520%2C%0A%20%20%20%20%20%20%20%20margin%3Ddict(l%3D40%2C%20r%3D40%2C%20t%3D60%2C%20b%3D40)%2C%0A%20%20%20%20%20%20%20%20xaxis%3Ddict(gridcolor%3D%22%23f1f5f9%22)%2C%0A%20%20%20%20%20%20%20%20yaxis%3Ddict(title%3D%22Continuous%20Variable%20(X)%22%2C%20gridcolor%3D%22%23f1f5f9%22)%2C%0A%20%20%20%20%20%20%20%20xaxis2%3Ddict(%0A%20%20%20%20%20%20%20%20%20%20%20%20title%3D%22Class%20Proportion%20p%20%3D%20n%E2%82%81%20%2F%20n%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20range%3D%5B0.0%2C%201.0%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20gridcolor%3D%22%23f1f5f9%22%2C%0A%20%20%20%20%20%20%20%20)%2C%0A%20%20%20%20%20%20%20%20yaxis2%3Ddict(%0A%20%20%20%20%20%20%20%20%20%20%20%20title%3D%22Point-Biserial%20r_pb%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20range%3D%5B0.0%2C%200.85%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20gridcolor%3D%22%23f1f5f9%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.26%2C%20xanchor%3D%22center%22%2C%20x%3D0.5)%2C%0A%20%20%20%20)%0A%20%20%20%20return%20(fig%2C)%0A%0A%0A%40app.cell%0Adef%20_(fig%2C%20mo)%3A%0A%20%20%20%20mo.ui.plotly(fig)%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%20%23%23%23%20Example%201%3A%20Mathematical%20Equivalence%20of%20Point-Biserial%2C%20Pearson%2C%20and%20Student's%20t-Test%0A%0A%20%20%20%20In%20this%20example%2C%20we%20generate%20an%20empirical%20dataset%20(%24n%20%3D%20100%24)%20and%20compute%3A%0A%20%20%20%201.%20The%20Point-Biserial%20correlation%20%24r_%7Bpb%7D%24%20using%20%60scipy.stats.pointbiserialr%60.%0A%20%20%20%202.%20The%20Pearson%20correlation%20%24r_%7BXY%7D%24%20using%20%60scipy.stats.pearsonr%60.%0A%20%20%20%203.%20The%20independent%20two-sample%20Student's%20t-test%20statistic%20using%20%60scipy.stats.ttest_ind%60.%0A%20%20%20%204.%20The%20transformed%20t-statistic%20derived%20analytically%20from%20correlation%3A%0A%0A%20%20%20%20%24%24t%20%3D%20%5Cfrac%7Br_%7Bpb%7D%20%5Csqrt%7Bn%20-%202%7D%7D%7B%5Csqrt%7B1%20-%20r_%7Bpb%7D%5E2%7D%7D%24%24%0A%0A%20%20%20%20We%20verify%20that%20all%20three%20formulations%20yield%20identical%20test%20statistics%20down%20to%20machine%20floating-point%20precision%20(%24%3C%2010%5E%7B-14%7D%24).%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(np%2C%20stats)%3A%0A%20%20%20%20rng_ex1%20%3D%20np.random.default_rng(101)%0A%20%20%20%20n0_count%20%3D%2060%0A%20%20%20%20n1_count%20%3D%2040%0A%20%20%20%20n_total%20%3D%20n0_count%20%2B%20n1_count%0A%0A%20%20%20%20%23%20Sample%20draws%0A%20%20%20%20sample_group0%20%3D%20rng_ex1.normal(10.0%2C%202.0%2C%20n0_count)%0A%20%20%20%20sample_group1%20%3D%20rng_ex1.normal(12.5%2C%202.0%2C%20n1_count)%0A%0A%20%20%20%20continuous_array%20%3D%20np.concatenate(%5Bsample_group0%2C%20sample_group1%5D)%0A%20%20%20%20binary_array%20%3D%20np.concatenate(%5Bnp.zeros(n0_count)%2C%20np.ones(n1_count)%5D)%0A%0A%20%20%20%20%23%201.%20Point-Biserial%0A%20%20%20%20r_pb_val%2C%20p_pb_val%20%3D%20stats.pointbiserialr(binary_array%2C%20continuous_array)%0A%0A%20%20%20%20%23%202.%20Pearson%20Correlation%0A%20%20%20%20r_pearson_val%2C%20p_pearson_val%20%3D%20stats.pearsonr(binary_array%2C%20continuous_array)%0A%0A%20%20%20%20%23%203.%20Two-Sample%20Student's%20t-test%0A%20%20%20%20ttest_res%20%3D%20stats.ttest_ind(sample_group1%2C%20sample_group0%2C%20equal_var%3DTrue)%0A%20%20%20%20t_stat_ind%20%3D%20float(ttest_res.statistic)%0A%20%20%20%20p_val_ind%20%3D%20float(ttest_res.pvalue)%0A%0A%20%20%20%20%23%204.%20Transformed%20t%20from%20r_pb%0A%20%20%20%20t_from_r%20%3D%20float(r_pb_val%20*%20np.sqrt(n_total%20-%202)%20%2F%20np.sqrt(1.0%20-%20r_pb_val**2))%0A%0A%20%20%20%20discrepancy_r%20%3D%20abs(r_pb_val%20-%20r_pearson_val)%0A%20%20%20%20discrepancy_t%20%3D%20abs(t_stat_ind%20-%20t_from_r)%0A%0A%20%20%20%20equivalence_summary_records%20%3D%20%5B%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%22Statistical%20Test%20%2F%20Metric%22%3A%20%22Point-Biserial%20Correlation%20r_pb%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22Calculated%20Statistic%22%3A%20f%22%7Br_pb_val%3A.6f%7D%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22Calculated%20p-value%22%3A%20f%22%7Bp_pb_val%3A.2e%7D%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22Equivalence%20Condition%22%3A%20%22Reference%20Metric%22%2C%0A%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%22Statistical%20Test%20%2F%20Metric%22%3A%20%22Pearson%20Product-Moment%20r_XY%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22Calculated%20Statistic%22%3A%20f%22%7Br_pearson_val%3A.6f%7D%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22Calculated%20p-value%22%3A%20f%22%7Bp_pearson_val%3A.2e%7D%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22Equivalence%20Condition%22%3A%20f%22Exact%20Match%20(%7CDiff%7C%20%3D%20%7Bdiscrepancy_r%3A.1e%7D)%22%2C%0A%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%22Statistical%20Test%20%2F%20Metric%22%3A%20%22Two-Sample%20Student's%20t-test%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22Calculated%20Statistic%22%3A%20f%22t%20%3D%20%7Bt_stat_ind%3A.6f%7D%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22Calculated%20p-value%22%3A%20f%22%7Bp_val_ind%3A.2e%7D%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22Equivalence%20Condition%22%3A%20%22Two-Group%20Hypothesis%20Test%22%2C%0A%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%22Statistical%20Test%20%2F%20Metric%22%3A%20%22t%20Derived%20from%20r_pb%20Formula%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22Calculated%20Statistic%22%3A%20f%22t%20%3D%20%7Bt_from_r%3A.6f%7D%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22Calculated%20p-value%22%3A%20f%22%7Bp_pb_val%3A.2e%7D%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22Equivalence%20Condition%22%3A%20f%22Exact%20Match%20(%7CDiff%7C%20%3D%20%7Bdiscrepancy_t%3A.1e%7D)%22%2C%0A%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%5D%0A%20%20%20%20return%20(equivalence_summary_records%2C)%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(equivalence_summary_records%2C%20mo%2C%20pd)%3A%0A%20%20%20%20df_equiv%20%3D%20pd.DataFrame(equivalence_summary_records)%0A%20%20%20%20mo.ui.table(df_equiv)%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%23%20Example%202%3A%20Impact%20of%20Severe%20Class%20Imbalance%20on%20Feature%20Screening%20in%20Machine%20Learning%0A%0A%20%20%20%20When%20screening%20features%20for%20binary%20classification%20tasks%20(such%20as%20credit%20fraud%20or%20rare%20disease%20detection)%2C%20class%20distributions%20are%20heavily%20imbalanced.%0A%0A%20%20%20%20Below%2C%20we%20simulate%20a%20constant%20true%20underlying%20group%20separation%20(%24%5Cmu_0%20%3D%200.0%2C%20%5Cmu_1%20%3D%201.5%2C%20%5Csigma%20%3D%201.0%24%2C%20corresponding%20to%20a%20fixed%20Cohen's%20%24d%20%3D%201.5%24)%20across%20five%20imbalance%20ratios%20ranging%20from%20%2450%3A50%24%20to%20%2499%3A1%24.%0A%0A%20%20%20%20We%20compare%20the%20Point-Biserial%20correlation%20%24r_%7Bpb%7D%24%20against%20class-invariant%20metrics%20(Cohen's%20%24d%24%20and%20Area%20Under%20the%20ROC%20Curve)%3A%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(np%2C%20stats)%3A%0A%20%20%20%20rng_ex2%20%3D%20np.random.default_rng(202)%0A%20%20%20%20total_obs%20%3D%201000%0A%20%20%20%20true_mu0%20%3D%200.0%0A%20%20%20%20true_mu1%20%3D%201.5%0A%20%20%20%20true_sd%20%3D%201.0%0A%0A%20%20%20%20imbalance_ratios%20%3D%20%5B%0A%20%20%20%20%20%20%20%20(%22Balanced%20(50%3A50)%22%2C%200.50)%2C%0A%20%20%20%20%20%20%20%20(%22Moderate%20(70%3A30)%22%2C%200.30)%2C%0A%20%20%20%20%20%20%20%20(%22High%20(90%3A10)%22%2C%200.10)%2C%0A%20%20%20%20%20%20%20%20(%22Severe%20(95%3A5)%22%2C%200.05)%2C%0A%20%20%20%20%20%20%20%20(%22Extreme%20(99%3A1)%22%2C%200.01)%2C%0A%20%20%20%20%5D%0A%0A%20%20%20%20imbalance_records%20%3D%20%5B%5D%0A%0A%20%20%20%20for%20name_scen%2C%20prop_1%20in%20imbalance_ratios%3A%0A%20%20%20%20%20%20%20%20n1_pts%20%3D%20int(total_obs%20*%20prop_1)%0A%20%20%20%20%20%20%20%20n0_pts%20%3D%20total_obs%20-%20n1_pts%0A%0A%20%20%20%20%20%20%20%20pts_g0%20%3D%20rng_ex2.normal(true_mu0%2C%20true_sd%2C%20size%3Dn0_pts)%0A%20%20%20%20%20%20%20%20pts_g1%20%3D%20rng_ex2.normal(true_mu1%2C%20true_sd%2C%20size%3Dn1_pts)%0A%0A%20%20%20%20%20%20%20%20all_x%20%3D%20np.concatenate(%5Bpts_g0%2C%20pts_g1%5D)%0A%20%20%20%20%20%20%20%20all_y%20%3D%20np.concatenate(%5Bnp.zeros(n0_pts)%2C%20np.ones(n1_pts)%5D)%0A%0A%20%20%20%20%20%20%20%20%23%20Calculate%20r_pb%0A%20%20%20%20%20%20%20%20r_pb_emp%2C%20_%20%3D%20stats.pointbiserialr(all_y%2C%20all_x)%0A%0A%20%20%20%20%20%20%20%20%23%20Empirical%20Cohen's%20d%0A%20%20%20%20%20%20%20%20s_pooled%20%3D%20np.sqrt(((n0_pts%20-%201)%20*%20np.var(pts_g0%2C%20ddof%3D1)%20%2B%20(n1_pts%20-%201)%20*%20np.var(pts_g1%2C%20ddof%3D1))%20%2F%20(total_obs%20-%202))%0A%20%20%20%20%20%20%20%20emp_cohen_d%20%3D%20(np.mean(pts_g1)%20-%20np.mean(pts_g0))%20%2F%20s_pooled%0A%0A%20%20%20%20%20%20%20%20%23%20Theoretical%20r_pb%20from%20d%20and%20p%0A%20%20%20%20%20%20%20%20theo_r_pb%20%3D%20(1.5%20*%20np.sqrt(prop_1%20*%20(1.0%20-%20prop_1)))%20%2F%20np.sqrt(1.0%20%2B%201.5**2%20*%20prop_1%20*%20(1.0%20-%20prop_1))%0A%0A%20%20%20%20%20%20%20%20imbalance_records.append(%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%22Imbalance%20Scenario%22%3A%20name_scen%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22Positive%20Class%20%25%22%3A%20f%22%7Bprop_1%20*%20100%3A.1f%7D%25%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22True%20Cohen's%20d%22%3A%20%221.500%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22Empirical%20Cohen's%20d%22%3A%20f%22%7Bemp_cohen_d%3A.3f%7D%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22Theoretical%20r_pb%22%3A%20f%22%7Btheo_r_pb%3A.3f%7D%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22Empirical%20r_pb%22%3A%20f%22%7Br_pb_emp%3A.3f%7D%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22Correlation%20Degradation%22%3A%20f%22%7B(1.0%20-%20theo_r_pb%20%2F%200.600)%20*%20100.0%3A.1f%7D%25%20drop%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20)%0A%20%20%20%20return%20(imbalance_records%2C)%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(imbalance_records%2C%20mo%2C%20pd)%3A%0A%20%20%20%20df_imbalance%20%3D%20pd.DataFrame(imbalance_records)%0A%20%20%20%20mo.ui.table(df_imbalance)%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
77dfe05c364b3f5d612375194a7cc92f