style1

Procédurier - Utiliser R en mesure et évaluation

Section 08 B - Analyse du PISA à partir de la théorie classique des tests


À la section 02 du procédurier (Section 02) nous avons calculé différents coefficients. Nous allons donc refaire ces calculs pour les éléments tirés du PISA. Plus spécifiquement, nous allons utiliser le fichier de données booklet9_01a.dat créé dans la partie A de la section 08.


Si vous n'avez pas le fichier booklet9_01a.dat Enregistrer sous...



Dans cette section, nous allons nous attarder aux questions mathématiques contenues dans le livret 9. Cependant, nous allons d'abord faire quelques opérations avec le fichier de données.


##############################################################################
## Fichier: Section_08B_alpha.r date: décembre 2007
## Auteur: AndréSèb Aubin (andreseb.aubin@gmail.com)
##
## Dans ce script
## Analyse de données du PISA selon la théorie classique des tests.
##
## Fichier initial de donnée: booklet9_01a.dat
##
## Alpha de Cronbach, Coefficient de Guttman (L2)
##
##############################################################################

##############################################################################
## 00 - Fonctions permettant d'initialiser l'environnement R
##############################################################################

rm(list=ls(all=TRUE))

library("grDevices")

setwd("C:/Documents and Settings/André-Sébastien/Mes documents/doctorat/TDII_Omega/Activite_finale/bin")
# setwd(choose.dir()) # À activer si on veut choisir le répertoire à chaque fois
# setwd("F:/PISA/bin") # Autre choix de répertoire (pour une clé USB par exemple)

##############################################################################
## 01 - Importation du fichier booklet9_01a.dat dans la matrice donnees_brutes
##############################################################################

donnees_brutes <- read.table(file="booklet9_01a.dat", header = TRUE)

Dimension <- dim(donnees_brutes)

Dimension




Cela nous donne les dimensions du fichier de données.



> Dimension
[1] 3315 73


Pour mieux comprendre comment les résultats complets des étudiants sont répartis, nous allons réaliser deux histogrammes: un premier avec tous les répondants et un second avec seulement ceux qui n'ont pas de NA dans leurs réponses.




##############################################################################
## 02 - Quelques manipulations sur les données
## Sur tous les étudiants ayant répondu au livret 09
###############################################################################

temp1 <- donnees_brutes[,6:70]

Sommes_etudiants <- rowSums(temp1, na.rm = TRUE)
paste("Moyenne = ", mean(Sommes_etudiants))

windowsize = 5

windows(width=windowsize, height=windowsize, restoreConsole = TRUE)
xname = Dimension[1]
hist(Sommes_etudiants, freq = TRUE, xlim=c(0,70), main = paste("Note totale de tous les " , xname, " candidats"),ylim = NULL, xlab = "Note", ylab="Fréquence des résultats (sur 1)")
fenetre = dev.cur()


## Nbre de candidats ayant des notes dans une fourchette définie

fourchette = c(30,35)
X <- subset(Sommes_etudiants, Sommes_etudiants > fourchette[1])
X <- subset(X, X < fourchette[2])
length(X)

## Sur les étudiants sans NA

Etudiant_sans_NA <- na.omit(donnees_brutes)
Nbre_etu <- dim(Etudiant_sans_NA)

temp <- Etudiant_sans_NA[,6:70]

Sommes_sans_NA <- rowSums(temp)

paste("Moyenne = ",mean(Sommes_sans_NA))

windows(width=windowsize, height=windowsize, restoreConsole = FALSE)
xname = Nbre_etu[1]


hist(Sommes_sans_NA, freq = TRUE, xlim=c(0,70), main = paste("Note totale des " , xname, " candidats"),ylim = NULL, xlab = "Note", ylab="Fréquence des résultats (sur 1)")

## Nbre de candidats ayant des notes dans une fourchette définie plus tôt

X <- subset(Sommes_sans_NA, Sommes_sans_NA > fourchette[1])
X <- subset(X, X < fourchette[2])
length(X)



Cela donne les graphiques suivants





Nous allons maintenant extraire les questions du livret 9 touchant mathématiques et calculer l'alpha de Cronbach et le L2 de Guttman. Ces opérations sont les mêmes que celles décrites dans la section 03.


##############################################################################
## 03 - Extraction des questions mathématiques du livret 9
##
## Fichier de données initial: booklet9_01a.dat
## Fichier de sortie final: math_booklet9_01a.dat
##############################################################################

donnees_brutes <- read.table(file="booklet9_01a.dat", header = TRUE)

# Il est possible de tirer du CodeBook les questions du livret 09 les questions de mathématiques. La liste est placée dans une variable.
liste_question_math <- c("M033Q01", "M034Q01T", "M037Q01T", "M037Q02T", "M124Q01", "M124Q03T", "M144Q01T", "M144Q02T", "M144Q03", "M144Q04T", "M145Q01T", "M155Q01", "M155Q02T", "M155Q03T", "M155Q04T", "M192Q01T")

# On crée ensuite une matrice de données en extrayant des données complètes uniquement les questions de mathématiques
questions_math <- donnees_brutes[ ,liste_question_math]

questions_math[1:2,] # Cela ne change pas la matrice, mais affiche les 2 premières lignes.

write.table(questions_math, file="math_booklet9_01a.dat", row.names=FALSE, col.names=TRUE, sep="\t")

#colSums(questions_math) # ne fonctionne pas puisque la matrice comprend des NA

colSums(questions_math, na.rm = TRUE)
colMeans(questions_math, na.rm = TRUE)

dim_questions_math_omit <- dim(na.omit(questions_math))
dim_questions_math_omit # Nombre d'étudiants ayant répondu aux questions mathématiques.

##############################################################################
## 04 - Calculs de alpha et de L2
##
## Nous avons extrait une matrice de données qui ressemble à l'exercice
## fait à la section 02 (tableau 2.2)
##
## Inspiré du script tableau_2_7a.r
##
## Gestion des NA : Les répondants (lignes) contenant un NA ou plus sont
## omises pour le traitement.
##
## Matrice utilisée: questions_math sans NA
##
##############################################################################

questions_math_2 <- na.omit(questions_math)

questions_math_2[1:25,]

colSums(questions_math_2)
colMeans(questions_math_2)

## Calcul de l'alpha de Cronbach avec la fonction de R

cronbach(questions_math_2) # dans library(psy)

## Calcul de l'alpha de Cronbach avec le script fait à la main.

dim_questions_math_2 <- dim(questions_math_2)

nbre_item <- dim_questions_math_2[2]
nbre_item
nbre_individu <- dim_questions_math_2[1]
nbre_individu

colSums_questions_math_2 <- colSums(questions_math_2)
colSums_questions_math_2

rowSums_questions_math_2 <- rowSums(questions_math_2)
rowSums_questions_math_2

# Et la moyenne au test (fonction "mean()")
moyenne_questions_math_2 <- mean(rowSums_questions_math_2)
moyenne_questions_math_2

# Calculer la variance du test sX2_questions_math_2
sX2_questions_math_2 <- var(rowSums_questions_math_2)


# La variance calculée par "var()" est calculée en divisant par "n-1" et nous voulons
# la variance divisée par n, nous corrigeons en multipliant par "(n-1)/n" ou "15/16"
sX2_questions_math_2 <- sX2_questions_math_2*((nbre_individu - 1)/nbre_individu)
sX2_questions_math_2

cov_questions_math_2_a <- (cov(questions_math_2)*((nbre_individu - 1)/nbre_individu))
var_questions_math_2_a <- (var(questions_math_2)*((nbre_individu - 1)/nbre_individu))

for (i in 1:nbre_item) # mis à zéro de la diagonale
{
cov_questions_math_2_a[i,i] <- 0
var_questions_math_2_a[i,i] <- 0
}

var_questions_math_2_a # Covariance
cov_questions_math_2_a # Variance

sum(cov_questions_math_2_a)
sum(var_questions_math_2_a)

sum_si2 <- 0 # initialisation de la variable

for (i in 1:nbre_item)
{
sum_si2 = sum_si2 + ((colSums_questions_math_2[i] * (nbre_individu - colSums_questions_math_2[i])) / nbre_individu^2)
}

alpha <- ((nbre_item)/(nbre_item - 1))*(1 - (sum_si2 / sX2_questions_math_2))
sum_si2
alpha # Donne la même chose que l'autre méthode.

############################### Calcul de L2 ###################################

L2_questions_math_2_a <- c(0,0) # Initialisation
L2_questions_math_2_a[1] <- (sum(cov_questions_math_2_a))/(sX2_questions_math_2)
L2_questions_math_2_a[2] <- (sqrt((nbre_item)/(nbre_item - 1))) * (sqrt(sum(var_questions_math_2_a^2))/(sX2_questions_math_2))

sum(L2_questions_math_2_a) # Addition des deux termes de l'addition


> alpha # Donne la même chose que l'autre méthode.
M033Q01
0.6921613
>
> ############################### Calcul de L2 ###################################
>
> L2_questions_math_2_a <- c(0,0) # Initialisation
> L2_questions_math_2_a[1] <- (sum(cov_questions_math_2_a))/(sX2_questions_math_2)
> L2_questions_math_2_a[2] <- (sqrt((nbre_item)/(nbre_item - 1))) * (sqrt(sum(var_questions_math_2_a^2))/(sX2_questions_math_2))
>
> sum(L2_questions_math_2_a) # Addition des deux termes de l'addition
[1] 0.7014975

Il est étrange de constater qu'à la question M192Q01T, toutes les réponses (quand elles existent) sont 0. Voyons voir l'effet de cette question sur les coefficients.




################################################################################
##############################################################################
## 05 - Calculs de alpha et de L2 sans la question M192Q01T
##
## La question M192Q01T n'a aucune réponse à 1, elle ne discrimine donc pas.
## Voyons l'effet de son retrait
##
## Gestion des NA : Les répondants (lignes) contenant un NA ou plus sont
## omises pour le traitement.
##
## Matrice utilisée: questions_math sans NA (questions_math_2)
##
##############################################################################

questions_math_2b <- questions_math_2[,1:15]

questions_math_2b[1:25,] # Affichage des 25 premières lignes

colSums(questions_math_2b)
colMeans(questions_math_2b)

## Calcul de l'alpha de Cronbach avec la fonction de R

cronbach(questions_math_2b) # dans library(psy)

############################### Calcul de L2 ###################################
dim_questions_math_2b <- dim(questions_math_2b)

nbre_item2 <- dim_questions_math_2b[2]
nbre_item2
nbre_individu2 <- dim_questions_math_2b[1]
nbre_individu2

colSums_questions_math_2b <- colSums(questions_math_2b)
colSums_questions_math_2b

rowSums_questions_math_2b <- rowSums(questions_math_2b)
rowSums_questions_math_2b

# Et la moyenne au test (fonction "mean()")
moyenne_questions_math_2b <- mean(rowSums_questions_math_2b)
moyenne_questions_math_2b

# Calculer la variance du test sX2_questions_math_2
sX2_questions_math_2b <- var(rowSums_questions_math_2b)


# La variance calculée par "var()" est calculée en divisant par "n-1" et nous voulons
# la variance divisée par n, nous corrigeons en multipliant par "(n-1)/n" ou "15/16"
sX2_questions_math_2b <- sX2_questions_math_2b*((nbre_individu2 - 1)/nbre_individu2)
sX2_questions_math_2b

cov_questions_math_2b_a <- (cov(questions_math_2b)*((nbre_individu2 - 1)/nbre_individu2))
var_questions_math_2b_a <- (var(questions_math_2b)*((nbre_individu2 - 1)/nbre_individu2))

for (i in 1:nbre_item2) # mis à zéro de la diagonale
{
cov_questions_math_2b_a[i,i] <- 0
var_questions_math_2b_a[i,i] <- 0
}

var_questions_math_2b_a # Covariance
cov_questions_math_2b_a # Variance


L2_questions_math_2b_a <- c(0,0) # Initialisation
L2_questions_math_2b_a[1] <- (sum(cov_questions_math_2b_a))/(sX2_questions_math_2b)
L2_questions_math_2b_a[2] <- (sqrt((nbre_item2)/(nbre_item2 - 1))) * (sqrt(sum(var_questions_math_2b_a^2))/(sX2_questions_math_2b))

sum(L2_questions_math_2b_a) # Addition des deux termes de l'addition

################################################################################
####################### Fin du script Section_02A_alpha.r #####################




> cronbach(questions_math_2b) # dans library(psy)
$sample.size
[1] 1296

$number.of.items
[1] 15

$alpha
[1] 0.6952513




> sum(L2_questions_math_2b_a) # Addition des deux termes de l'addition
[1] 0.7016148



Les opérations qui viennent d'être présentées sont réunies dans le script suivant. Enregistrer sous...


Passons maintenant au coefficient de bissection, qui sont disponibles dans le script suivant. Enregistrer sous...



##############################################################################
## Fichier: Section_08B_beta.r date: décembre 2007
## Auteur: AndréSèb Aubin (andreseb.aubin@gmail.com)
##
## Dans ce script
## Analyse de données du PISA selon la théorie classique des tests.
##
## Fichier initial de donnée: math_booklet9_01a.dat (fait dans le script Section_02A_alpha.r)
##
## Coefficients de bissection
##
##############################################################################

##############################################################################
## 00 - Fonctions permettant d'initialiser l'environnement R
##############################################################################

rm(list=ls(all=TRUE))
library("grDevices")

setwd("C:/Documents and Settings/André-Sébastien/Mes documents/doctorat/TDII_Omega/Activite_finale/bin")
# setwd(choose.dir()) # À activer si on veut choisir le répertoire à chaque fois
# setwd("F:/PISA/bin") # Autre choix de répertoire (pour une clé USB par exemple)

##############################################################################
## 01 - Importation du fichier math_booklet9_01a.dat dans la matrice donnees_brutes
##############################################################################

questions_math <- read.table(file="math_booklet9_01a.dat", header = TRUE)
Dimension <- dim(questions_math)
Dimension

##############################################################################
## 02 - Calculs des coefficients de bissection
##
## Nous avons extrait une matrice de données qui ressemble à l'exercice
## fait à la section 03 (tableau 2.2)
##
## Inspiré du script tableau_2_7a.r
##
## Gestion des NA : Les répondants (lignes) contenant un NA ou plus sont
## omises pour le traitement.
##
## Matrice utilisée: questions_math sans NA
##
##############################################################################

questions_math_2 <- na.omit(questions_math)
questions_math_2[1:25,]

Dimension_2 <- dim(questions_math_2)
Dimension_2

nbre_individu <- Dimension_2[1]
nbre_individu

nbre_item <- Dimension_2[2]
nbre_item

# Premières opérations
# Additions des lignes pour valider la bonne saisie des données dans la matrice questions_math_2
# fonction "rowSums()"
# Cela donne le résultat du test de chaque sujet (étudiante ou étudiant)

rowsums_questions_math_2 <- rowSums(questions_math_2)
rowsums_questions_math_2

colsums_questions_math_2 <- colSums(questions_math_2)
colsums_questions_math_2

# Et la moyenne au test (fonction "mean()")
moyenne_questions_math_2 <- mean(questions_math_2)
moyenne_questions_math_2

# Faire deux matrices, chacune contenant la moitié des items.

y_1 <- matrix(0, nbre_individu, (nbre_item/2))
y_2 <- matrix(0, nbre_individu, (nbre_item/2))


# Même si cela est plus long et demandera un certain temps de compilation, par répartition aléatoire des items

nbre_iteration <- 10000 # Nombre d'itérations de la grande boucle.

rXX_G <- 0
rXX_G_Compil <- 0
rXX_SB_Compil <- 0

Compil <- matrix(0,nbre_iteration,(nbre_item+2))

for (m in 1:nbre_iteration) # Début de la grande boucle
{
h <- 1;
hasard <- 0
t <- as.integer(runif(1)*nbre_item+1)
hasard[h] <- t
h = h+1
OK <- 0

while (h != (nbre_item+1))
{
t <- as.integer(runif(1)*nbre_item+1)
hasard[h] <- t
for (h2 in 1:(h-1))
{
if (hasard[h] == hasard[h2])
{
OK <- 1
}
}
if (OK != 1)
{
h = h+1
}
OK <- 0
}
hasard

Compil[m,(1:nbre_item)] <- hasard[1:nbre_item]
y_1b <- matrix(0, nbre_individu, (nbre_item/2))
y_2b <- matrix(0, nbre_individu, (nbre_item/2))


for (k in 1:(nbre_item/2)) # Début de la petite boucle {
y_1b[,k] <- questions_math_2[,hasard[k]]
y_2b[,k] <- questions_math_2[,hasard[k+(nbre_item/2)]]
} # Fin de la petite boucle

lignes.y_1b <- rowSums(y_1b)
lignes.y_2b <- rowSums(y_2b)

rYY <- (cor(lignes.y_1b,lignes.y_2b, method = "pearson"))
#rYY <- mean(lignes.rYY)
rYY

rXX_SB <- (2*rYY)/(1+rYY)
rXX_SB_Compil[m] <- rXX_SB
Compil[m,(nbre_item+1)] <- round(rXX_SB,3)

# Calculer la variance du test sX2

sX2 <- var(rowsums_questions_math_2)

# La variance calculée par "var()" est calculée en divisant par "n-1" et nous voulons
# la variance divisée par n, nous corrigeons en multipliant par "(n-1)/n" ou "15/16"
sX2 <- sX2*((nbre_individu - 1)/nbre_individu)
sX2 # variance corrigée

lignes.y_1b <- rowSums(y_1b)
lignes.y_2b <- rowSums(y_2b)

sY2_1b <- var(lignes.y_1b)
sY2_1b <- sY2_1b*((nbre_individu - 1)/nbre_individu)
sY2_1b # variance corrigée

sY2_2b <- var(lignes.y_2b)
sY2_2b <- sY2_2b*((nbre_individu - 1)/nbre_individu)
sY2_2b # variance corrigée


rXX_G <- 2*(1-((sY2_1b + sY2_2b)/sX2))
rXX_G_Compil[m] <- rXX_G
Compil[m,(nbre_item+2)] <- round(rXX_G,3)

} # Fin de la grande boucle.

# Maximum de rXX_SB
max(Compil[,(nbre_item+1)])

# Maximum de rXX_G
max(Compil[,(nbre_item+2)])

write.table(Compil, "math_booklet9_splithalf.data", row.names=F, col.names=F, sep=" ")


################################################################################
####################### Fin du script Section_02A_beta.r #####################

Cela donne donc les deux coefficients de bissection.


> # Maximum de rXX_SB
> max(Compil[,(nbre_item+1)])
[1] 0.748
>
> # Maximum de rXX_G
> max(Compil[,(nbre_item+2)])
[1] 0.748
>
> write.table(Compil, "math_booklet9_splithalf.data", row.names=F, col.names=F, sep=" ")
>
>
> ################################################################################
> ####################### Fin du script Section_08B_beta.r #####################



Pour accéder à la suite des manipulations de la section 08 Cliquez ici (Section_08_C).


Retour à à la page précédente
Retour à la page principale

Dernière mise à jour faite le 21 janvier 2017 à 13:10 -0800 par AndréSèb

Get Firefox!