Teste du khi-deux/chi-deux d'indépendance

Contenu du snippet

Définition wikipédia : Le test du khi2 (prononcer « khi-deux » ou « khi carré », qu'on écrit également à l'anglaise « chi-deux » ou « chi carré ») permet, partant d'une hypothèse et d'un risque supposé au départ, de rejeter l'hypothèse si la distance entre deux ensembles d'informations est jugée excessive. Un test d'indépendance porte sur des données qualitatives.
Plus d'infos : http://fr.wikipedia.org/wiki/Test_du_%CF%87%C2%B2

Lien en ligne : http://testchideux.awardspace.info
A ce même lien vous trouverez :
- Une classe PHP 5, plus facile à implanter
- Sinon, vous pourrez toujours faire un teste gratuit

Source / Exemple :


<?php
$_SESSION['temp'] = serialize(array('colonne'=>$_POST['colonne'], 'ligne'=>$_POST['ligne'], 'dec'=> $_POST['dec']));
?>

<?php

$temp = unserialize($_SESSION['temp']);

	$carre = 0;
	
	$chi2 = $totaux_contingent = $totaux_theorique  = 0;
	
	$total_colums_obs = $total_lines_obs = 0;
	$total_colums_theor = $total_lines_theor = 0;
	$total_colums_chi = $total_lines_chi = 0;
	
	$Save_total_colums_obs = $Save_total_lines_obs = array();
	$Save_total_colums_theor = $Save_total_lines_theor = array();
	$Save_total_colums_chi = $Save_total_lines_chi = array();
	
	$valeur_theorique = array();
	$valeur_chi = array();
	
/* Fournit le degré de liberté */	
$ddl = ($temp['ligne'] - 1)*($temp['colonne'] - 1); 
	
	
/* Attribue directement zéro au élément vide */	
	foreach($_POST['field'] as $key=> $value)
	{
		($value==null) ? $_POST['field'][$key]=0 : $_POST['field'][$key]=(int)$value;
	}
	

/* Fournit le Total des valeurs observés de chaque lignes */	
	$i=0;
	foreach($_POST['field'] as $value)
	{
		if($i<$temp['ligne'])
		{
			$total_lines_obs = $value + $total_lines_obs;
			$i++;
		}
			if($i==$temp['ligne'])
			{
				$Save_total_lines_obs[] = $total_lines_obs;
				$i = $total_lines_obs = 0;
			}
	}

	
/* Fournit le Total des valeurs observés de chaque colonnes*/	
	for($j=0; $j<$temp['colonne']; $j++)
	{
		$key = $j;
			for($i=0; $i<$temp['ligne']; $i++)
			{
				$total_colums_obs = $_POST['field'][$key] + $total_colums_obs;
				$key += $temp['colonne'];
			}	
		$Save_total_colums_obs[] = $total_colums_obs;
		$total_colums_obs = 0;
	}	
			
	
/* Fournit le Total des Totaux des valeurs observés */	
	if( array_sum($Save_total_lines_obs) == array_sum($Save_total_colums_obs) )
	{	
		$totaux_contingent = round(array_sum($Save_total_lines_obs), $temp['dec']);
	}	
	else
	{
		print 'Le Total des totaux par colonnes et par lignes des valeurs observés, semblent ne pas correspondre ! ';
		exit();
	}	
	
	
/* Fournit les valeurs théoriques */	
	if($totaux_contingent != 0)	
	{	
		for($j=0; $j<$temp['colonne']; $j++)
		{
			for($i=0; $i<$temp['ligne']; $i++)
			{
				$valeur_theorique[] = round((($Save_total_lines_obs[$j]*$Save_total_colums_obs[$i])/$totaux_contingent), $temp['dec']); 
			}
		}
	}
	else
	{ 
		print 'Le Total général des valeurs observés est null, la suite des calculs ne peut être effectuer ! '; 
		exit; 
	}

/* Fournit le Total des valeurs théoriques de chaque lignes */	
	$i=0;
	foreach($valeur_theorique as $value)
	{
		if($i<$temp['ligne'])
		{
			$total_lines_theor = $value + $total_lines_theor;
			$i++;
		}
			if($i==$temp['ligne'])
			{
				$Save_total_lines_theor[] = $total_lines_theor;
				$i = $total_lines_theor = 0;
			}
	}

	
/* Fournit le Total des valeurs théoriques de chaque colonnes*/	
	for($j=0; $j<$temp['colonne']; $j++)
	{
		$key = $j;
			for($i=0; $i<$temp['ligne']; $i++)
			{
				$total_colums_theor = $valeur_theorique[$key] + $total_colums_theor;
				$key += $temp['colonne'];
			}	
		$Save_total_colums_theor[] = $total_colums_theor;
		$total_colums_theor = 0;
	}	
	
	
/* Fournit le Total des Totaux des valeurs théoriques */	
	if( array_sum($Save_total_lines_theor) == array_sum($Save_total_colums_theor) )
	{	
		$totaux_theorique = round(array_sum($Save_total_lines_theor), $temp['dec']);
	}	
	else
	{
		print 'Le Total des totaux par colonnes et par lignes des valeurs théoriques, semblent ne pas correspondre ! ';
		exit();
	}	
	
/* Fournit les valeurs chis partiels */	
	foreach($_POST['field'] as $key => $value)
	{
		if($valeur_theorique[$key]!=0)
		{
			$carre = pow(($_POST['field'][$key] - $valeur_theorique[$key]),2)/$valeur_theorique[$key];
			$valeur_chi[] = round($carre, $temp['dec']);
		}
		else
		{
			$valeur_chi[] = 0;
		}
	}
	
	
/* Fournit le Total des valeurs chis de chaque lignes */	
	$i=0;
	foreach($valeur_chi as $value)
	{
		if($i<$temp['ligne'])
		{
			$total_lines_chi = $value + $total_lines_chi;
			$i++;
		}
			if($i==$temp['ligne'])
			{
				$Save_total_lines_chi[] = $total_lines_chi;
				$i = $total_lines_chi = 0;
			}
	}

	
/* Fournit le Total des valeurs chis de chaque colonnes*/	
	for($j=0; $j<$temp['colonne']; $j++)
	{
		$key = $j;
			for($i=0; $i<$temp['ligne']; $i++)
			{
				$total_colums_chi = $valeur_chi[$key] + $total_colums_chi;
				$key += $temp['colonne'];
			}	
		$Save_total_colums_chi[] = $total_colums_chi;
		$total_colums_chi = 0;
	}	
	
	
/* Fournit le Total des Totaux des valeurs chis soit le CHI2 */	
	if( array_sum($Save_total_lines_chi) == array_sum($Save_total_colums_chi) )
	{	
		$chi2 = round(array_sum($Save_total_lines_chi), $temp['dec']);
	}	
	else
	{
		print 'Le Total des totaux par colonnes et par lignes des valeurs chis, semblent ne pas correspondre ! ';
		exit();
	}	
?>

Conclusion :


Les éléments nécessaires aux calculs du chi2 sont :
- Nombre de ligne du tableau '$_POST['ligne']'
- Nombre de colonne du tableau '$_POST['colonne']'
- Nombre de décimale '$_POST['dec']'
Vous devrez donc les fournir et les serialisés dans une $_SESSION['temp'] ou pas selon vos préférences

Vous aurez le degré de liberté '$ddl' calculer en début de script et le chi2 '$chi2' calculer en fin de script

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.