Pour illustrer notre discussion de ce matin, Je génère un échantillon qui ressemble à notre exemple.

Illustration du package sdcMicro

data=data.table("dp"=c(rep("DP1",36)),
                "dr"=c(rep("DR1",3),rep("DR2",5),rep("DR3",20),rep(NA,8)),
                "ghm"=c(rep("GHM1'",36)),
                stringsAsFactors = F)


data[,.N,by=c("dp","dr","ghm")]
##     dp   dr   ghm  N
## 1: DP1  DR1 GHM1'  3
## 2: DP1  DR2 GHM1'  5
## 3: DP1  DR3 GHM1' 20
## 4: DP1 <NA> GHM1'  8
  • Je définis les paramètres de l’algorithme, QI désigne les quasi-identifiants à retravailler pour assurer la k-anonymisation.
  • QI.important classe les QI en terme de priorité de conservation. 1 est très conservateur, 3 est le plus flexible. Donc j’indique que je souhaite en priorité modifier DR, puis GHM et le moins possible DP.
  • alpha est un paramètre un peu surprenant, il indique à l’algorithme quelle fraction des NA doit être prise en compte. Je vous monte les extrêmes alpha = 0 et alpha = 1 puis j’explique.
alpha.value<-1
QI<-c(1,2,3)
QI.importance<-c(1,3,2)
k.value<-11

Je mets les données au format demandé par le package

sdc1<-createSdcObj(data.frame(data),
                  keyVars=QI, alpha=alpha.value)
sdc0<-createSdcObj(data.frame(data),
                  keyVars=QI, alpha=0)

On applique la méthode de “suppression locale” pour obtenir des classes k-anonymes

data_anon1<-kAnon(sdc1,k=k.value,importance=QI.importance)
data_anon0<-kAnon(sdc0,k=k.value,importance=QI.importance)

Stratégie alpha == 1 Il ne se passe rien parce qu’il y a déjà des NA (cf interprétation)

extractManipData(data_anon1)%>%data.table%>%.[,.N,by=c("dp","dr","ghm")]
##     dp   dr   ghm  N
## 1: DP1  DR1 GHM1'  3
## 2: DP1  DR2 GHM1'  5
## 3: DP1  DR3 GHM1' 20
## 4: DP1 <NA> GHM1'  8

Stratégie alpha == 0 On supprime le DR des lignes ayant moins de 10 observations

extractManipData(data_anon0)%>%data.table%>%.[,.N,by=c("dp","dr","ghm")]
##     dp   dr   ghm  N
## 1: DP1 <NA> GHM1' 16
## 2: DP1  DR3 GHM1' 20

Interprétation

  • Si alpha = 0, alors les dr NA pourraient être des DR1 ou des DR2, donc il y a suffisamment de NA pour assurer le k-anonymats de toutes les classes (3 + 8 > 10 et 5 + 8 > 10)
  • Si alpha = 1, alors les dr NA ne sont pas pris en compte, il faut donc qu’il y ait strictement plus de 10 observations par combinaisons de dp x dr x ghm

Information complémentaire : - J’ai jeté un oeil aux résultats qu’obtient Matthias, je ne suis pas 100% sûr d’être sur les dernières simulations en date, mais la priorisation par QI.importance, la présence de 50% de NA dans DR et l’utilisation d’un alpha = 1 font qu’on ne touche pas aux DP et assez peu aux GHM, mais ça pose problème parce que les NA de DR ne représentent pas une incertitude mais la certitude qu’il n’y a pas de DR !

Conclusion

  • [mauvaise nouvelle] Les calculs pour PA ont été lancés avec alpha == 1, or les NA de DR (pour GHM je ne suis pas sûr) ne sont pas des incertitudes mais des “vraies” absences de diagnostic relié, on ne peut donc pas voir les NA comme du flou (comme des jokers). Donc il faut relancer avec alpha = 0, ce qui va supprimer beaucoup plus de lignes. C’est mentionné dans le rapport de PA qui explique que la stratégie R (sdcMicro) est trop permissive et qu’il faut creuser… Parce qu’avec Python ils ont fait l’équivalent alpha=0 qui était trop stricte selon eux.

  • Une autre [mauvaise nouvelle] associée c’est qu’avec la stratégie alpha = 1, DR à flouter en priorité (ce qui est bien) et beaucoup de NA dans DR, on a l’impression que DP et GHM sont peu floutés, il faudrait voir ce que ça donne avec alpha = 0.

  • La [bonne nouvelle] c’est que les stratégies de création de joker ne sont pas si alambiquées que je le pensais, c’est à dire que l’algorithme ne va pas flouter quelques observations de DR3 dans le but de conserver des observations de DR1 et DR2. Une telle stratégie aurait tendance à flouter moins de ligne mais comme on se le disait ce matin, elle rendrait les données illisibles.

Proposition

  • A mon avis la prise en compte des NA comme des flous est une erreur méthodologique. Pour se donner un peu de marge on pourrait prendre un alpha autour de .5, mais surtout pas 1. Maintenant que je comprends comment fonctionne sdcMicro, je peux relancer avec alpha = 0 (ou autre alpha petit) et voir les résultats.
  • Actuellement la solution avec alpha = 1 ne crée pas des “jokers croisés” comme on l’imaginait ce matin. Une fois qu’on aura les résultats avec alpha = 0, on pourra regarder les proportions de jokers par variable et donc avoir un meilleur “contre-argument” des “jokers croisés”.
  • D’après le rapport de PA, avec leur algo Python (alpha = 0 et manifestement absence de priorisation des variables à supprimer) ils suppriment 30% de DP, 15% de DR (en plus de 55% initialement manquants) et 34% de GHM. Avec sdcMicro alpha = 0 on va sans doute supprimer les DR en priorité. Je me demande si on ne va pas aboutir à supprimer tous les DR et donc produire une base FINESS x GHM x DP…