L'histoire de la réalisation d'un test du chi carré pour tester l'indépendance entre des variables discrètes dans un tableau croisé a été précédemment expliquée.
Plus la valeur du chi carré χ ^ 2 est élevée, plus la relation entre les deux variables est forte. Cependant, la valeur χ ^ 2 dépend de la taille du tableau croisé et du nombre d'observations, et la valeur maximale est également différente. Un autre aspect est qu'il est difficile de comparer des tableaux croisés avec différents nombres de lignes et de colonnes.
Dans le coefficient V de Cramer, χ ^ 2 est converti par la formule suivante, et l'état qui n'a aucun rapport avec aucun tableau croisé est 0. , Dérive une valeur avec l'état entièrement lié comme 1.
\Phi_c = \sqrt{\frac {\chi^2} {N(k-1)}}
Où N est la fréquence totale et k est le plus petit nombre de lignes ou de colonnes dans le tableau croisé.
L'effet du nombre d'observations est corrigé en utilisant la fréquence totale, et l'effet du nombre de matrices est corrigé en prenant le plus petit du nombre de colonnes et du nombre de lignes. De plus, comme l'original est la valeur du chi carré, il prend la racine carrée.
Ici a un code de référence, je vais donc le citer.
import numpy as np
def det2x2(A, v=False):
if v: print('compute 2 x 2 det of')
if v: print(A)
assert A.shape == (2,2)
return A[0][0]*A[1][1] - A[0][1]*A[1][0]
def det3x3(A):
print('compute 3 x 3 det of')
print(A)
assert A.shape == (3,3)
a,b,c = A[0]
c1 = a * det2x2(A[1:3,[1,2]])
c2 = b * det2x2(A[1:3,[0,2]])
c3 = c * det2x2(A[1:3,[0,1]])
return c1 - c2 + c3
def solve(A):
print('solve')
print(A, '\n')
assert A.shape == (3,4)
D = det3x3(A[:,:3])
print('D = ', D, '\n')
if D == 0:
print('no solution')
return
Dx = det3x3(A[:,[3,1,2]])
print('Dx = ', Dx, '\n')
Dy = det3x3(A[:,[0,3,2]])
print('Dy = ', Dy, '\n')
Dz = det3x3(A[:,[0,1,3]])
print('Dz = ', Dz, '\n')
return Dx*1.0/D, Dy*1.0/D, Dz*1.0/D
def check(A,x,y,z):
print('check')
for i,r in enumerate(A):
print('row', i, '=', r)
pL = list()
for coeff,var in zip(r[:3],(x,y,z)):
c = str(round(coeff,2))
v = str(round(var,2))
pL.append(c + '*' + v)
print(' + '.join(pL), end=' ')
print(' =', r[0]*x + r[1]*y + r[2]*z, '\n')
Une fois exécuté, ce sera comme ça.
import numpy as np
import cramer
def run_cramer():
L = [2, 3, 0, 5,
1, 1, 1, 3,
2,-1, 3, 7]
A = np.array(L)
A.shape = (3,4)
result = cramer.solve(A)
if result:
x,y,z = result
print('solution')
print('x =', x)
print('y =', y)
print('z =', z, '\n')
cramer.check(A,x,y,z)
run_cramer()
# =>
# solve
# [[ 2 3 0 5]
# [ 1 1 1 3]
# [ 2 -1 3 7]]
#
# compute 3 x 3 det of
# [[ 2 3 0]
# [ 1 1 1]
# [ 2 -1 3]]
# D = 5
#
# compute 3 x 3 det of
# [[ 5 3 0]
# [ 3 1 1]
# [ 7 -1 3]]
# Dx = 14
#
# compute 3 x 3 det of
# [[2 5 0]
# [1 3 1]
# [2 7 3]]
# Dy = -1
#
# compute 3 x 3 det of
# [[ 2 3 5]
# [ 1 1 3]
# [ 2 -1 7]]
# Dz = 2
#
# solution
# x = 2.8
# y = -0.2
# z = 0.4
#
# check
# row 0 = [2 3 0 5]
# 2*2.8 + 3*-0.2 + 0*0.4 = 5.0
#
# row 1 = [1 1 1 3]
# 1*2.8 + 1*-0.2 + 1*0.4 = 3.0
#
# row 2 = [ 2 -1 3 7]
# 2*2.8 + -1*-0.2 + 3*0.4 = 7.0
#
Il existe également un calculateur en ligne sur ici, comme mentionné dans l'article source.
Recommended Posts