# How does $\chi^2$ feature selection work?

I can't find the information how $$\chi^2$$ are used to select numerical features for a model.

Fro instance, If I employ the sklearn library:

from sklearn.feature_selection import chi2

X, y = iris.data, iris.target # X contains 4 features, y does 3 classes


I can build the following table for the dataset

pivot_table = np.zeros((X.shape[1], len(np.unique(y))))
pivot_table[:, 0] = X[y==0].sum(axis=0)
pivot_table[:, 1] = X[y==1].sum(axis=0)
pivot_table[:, 2] = X[y==2].sum(axis=0)

print(pivot_table.T)
array([[250.3, 171.4,  73.1,  12.3],
[296.8, 138.5, 213. ,  66.3],
[329.4, 148.7, 277.6, 101.3]])


Then applying the contingency table to it:

from scipy.stats import chi2_contingency
chi2_contingency(pivot_table, correction=False)


Output:

125.58397740261773
1.0924329599765022e-24
6
[[213.82265358 301.31664021 361.36070621]
[111.8757204  157.6540915  189.0701881 ]
[137.51492279 193.78458652 232.40049069]
[ 43.88670323  61.84468177  74.168615  ]]


But this only provides the information about dependence of variables. And they are dependent because p-value is quite low.

Then I use the other function and I get what I want:

chi2(X,y)
(array([ 10.81782088,   3.7107283 , 116.31261309,  67.0483602 ]),
array([4.47651499e-03, 1.56395980e-01, 5.53397228e-26, 2.75824965e-15]))


But how does this work? What math lies at the heart of it?