Construction d'histogramme un peu particulière

Postez ici vos questions, réponses, commentaires ou suggestions - Les sujets seront ultérieurement répartis dans les archives par les modérateurs

Modérateur : Groupe des modérateurs

Evan Alonso
Messages : 15
Enregistré le : 17 Juil 2017, 08:46

Construction d'histogramme un peu particulière

Messagepar Evan Alonso » 21 Aoû 2017, 08:39

Bonjour,

Je voudrais effectuer le test de Mann-Whitney. Afin de comparer les distributions de scores/probabilité conditionnellement aux classes d'appartenance des individus de ma variable expliquée afin d'évaluer la précision de mon modèle et de voir s'il est cohérent.

Voici un exemple de ce que je voudrais :

Image

Ma question est : comment construire un histogramme de cette façon avec R ? Ce n'est surement pas très compliqué mais je n'y arrive pas. Ma variable expliquée recensant l'appartenance des individus s'appelle "Position" et contient des "0" et des "1" et non "positif" et négatif" comme sur l'image ci-dessous. Dans mon cas, il s'agira donc de représenter la quantité d'individus ayant "0" ou 1" en fonction de ma distribution de probabilité.

Avez-vous des indications sur la façon de construire le code qui pourra me fournir un tel histogramme ?

J'espère être clair, si ce n'est pas le cas, n'hésitez pas à me le dire.

Je vous remercie et vous souhaite une bonne journée.

Respectueusement.

Alonso Evan.

Pierre-Yves Berrard
Messages : 1029
Enregistré le : 12 Jan 2016, 23:30

Re: Construction d'histogramme un peu particulière

Messagepar Pierre-Yves Berrard » 21 Aoû 2017, 08:49

Bonjour,

Pouvez-vous fournir un aperçu ou un extrait des données ?
PY

Evan Alonso
Messages : 15
Enregistré le : 17 Juil 2017, 08:46

Re: Construction d'histogramme un peu particulière

Messagepar Evan Alonso » 21 Aoû 2017, 09:13

Oui, je peux vous fournir cela.

Image

"Position" est ma variable expliqué, dans cet aperçu, on ne voit que "0" mais il y a aussi des "1". fit est la probabilité que j'ai obtenu avec predict.glm et que j'ai discrétisé avec "fit.d" afin de pouvoir construire un histogramme avec une abscisse propre et claire.

Est-ce que cela est suffisant ou il vous faut autre chose ?

Respectueusement.

Alonso Evan.

Pierre-Yves Berrard
Messages : 1029
Enregistré le : 12 Jan 2016, 23:30

Re: Construction d'histogramme un peu particulière

Messagepar Pierre-Yves Berrard » 21 Aoû 2017, 09:23

Le format image est difficilement exploitable.

Plus d'explications ici.
PY

Evan Alonso
Messages : 15
Enregistré le : 17 Juil 2017, 08:46

Re: Construction d'histogramme un peu particulière

Messagepar Evan Alonso » 21 Aoû 2017, 11:53

D'accord, je vais essayer de faire comme dans votre lien.

Je n'ai pas mis ma base de données entière, elle contient 60 000 observations, j'ai donc mis "Pred1" qui correspond à head(Pred).

Donc, je dispose d'un data.frame constitué d'environ 60 000 lignes structuré ainsi (Je n'ai mis que le "head" pour des raisons de clarté évidentes) :

Code : Tout sélectionner

   Position    Tranche.Age Sexe Mt.remboursé.RC.2016.Classe
1        0 80 ans ou plus    1                      Faible
2        0 80 ans ou plus    1                      Faible
3        0 80 ans ou plus    1                      Faible
4        0 80 ans ou plus    1                      Faible
5        0 80 ans ou plus    1                      Faible
6        0 80 ans ou plus    1                      Faible
  Appel.Cotisation.signé.2016.Classe Charge       fit      se.fit residual.scale
1                             Faible      0 0.1896933 0.007941483              1
2                             Faible      0 0.1896933 0.007941483              1
3                             Faible      0 0.1896933 0.007941483              1
4                             Faible      0 0.1896933 0.007941483              1
5                             Faible      0 0.1896933 0.007941483              1
6                             Faible      0 0.1896933 0.007941483              1
    IClower  ICupper PredictedProb
1 0.2052586 0.174128     0.1896933
2 0.2052586 0.174128     0.1896933
3 0.2052586 0.174128     0.1896933
4 0.2052586 0.174128     0.1896933
5 0.2052586 0.174128     0.1896933
6 0.2052586 0.174128     0.1896933



Le contenu de la data frame est représenté ici, les variables à partir de fit sont des observations que j'ai obtenue et ajoutée grâce à predict.glm.

Code : Tout sélectionner

Pred1 <- structure(list(Position = structure(c(1L, 1L, 1L, 1L, 1L, 1L), .Label = c("0",
"1"), class = "factor"), Tranche.Age = structure(c(1L, 1L, 1L,
1L, 1L, 1L), .Label = c("80 ans ou plus", "Entre 0 et 19", "Entre 20 et 39",
"Entre 40 et 59 ans", "Entre 60 et 79 ans"), class = "factor"),
    Sexe = c(1L, 1L, 1L, 1L, 1L, 1L), Mt.remboursé.RC.2016.Classe = structure(c(2L,
    2L, 2L, 2L, 2L, 2L), .Label = c("Elevé", "Faible"), class = "factor"),
    Appel.Cotisation.signé.2016.Classe = structure(c(4L, 4L,
    4L, 4L, 4L, 4L), .Label = c("Assez élevé", "Assez faible",
    "Elevé", "Faible"), class = "factor"), Charge = c(0L, 0L,
    0L, 0L, 0L, 0L), fit = c(0.189693319557024, 0.189693319557024,
    0.189693319557024, 0.189693319557024, 0.189693319557024,
    0.189693319557024), se.fit = c(0.00794148332983344, 0.00794148332983344,
    0.00794148332983344, 0.00794148332983344, 0.00794148332983344,
    0.00794148332983344), residual.scale = c(1, 1, 1, 1, 1, 1
    ), IClower = c(0.205258626883497, 0.205258626883497, 0.205258626883497,
    0.205258626883497, 0.205258626883497, 0.205258626883497),
    ICupper = c(0.17412801223055, 0.17412801223055, 0.17412801223055,
    0.17412801223055, 0.17412801223055, 0.17412801223055), PredictedProb = c(0.189693319557024,
    0.189693319557024, 0.189693319557024, 0.189693319557024,
    0.189693319557024, 0.189693319557024)), .Names = c("Position",
"Tranche.Age", "Sexe", "Mt.remboursé.RC.2016.Classe", "Appel.Cotisation.signé.2016.Classe",
"Charge", "fit", "se.fit", "residual.scale", "IClower", "ICupper",
"PredictedProb"), row.names = c("1", "2", "3", "4", "5", "6"), class = "data.frame")



J’espère que c'est plus clair pour vous.

Respectueusement.

Alonso Evan.

Pierre-Yves Berrard
Messages : 1029
Enregistré le : 12 Jan 2016, 23:30

Re: Construction d'histogramme un peu particulière

Messagepar Pierre-Yves Berrard » 21 Aoû 2017, 12:27

C'est clair, mais pas exploitable.
Il aurait fallu :
- qu'il y ait la variable fit.d dans la table (puisque c'est ça qu'on veut représenter)
- avoir des lignes comportant des Position valant 0 et 1
- supprimer éventuellement les colonnes qui ne servent pas au graphique

Du coup, je vous propose une solution non testée sur des données :

Code : Tout sélectionner

library(ggplot2)
ggplot(Pred) +
  geom_bar(
    aes(x = fit.d, fill = Position),
    stat = "count",
    position = "dodge"
  )
PY

Evan Alonso
Messages : 15
Enregistré le : 17 Juil 2017, 08:46

Re: Construction d'histogramme un peu particulière

Messagepar Evan Alonso » 21 Aoû 2017, 12:47

C'est parfait, ça me donne exactement ce que je voulais. Merci !

Evan Alonso
Messages : 15
Enregistré le : 17 Juil 2017, 08:46

Re: Construction d'histogramme un peu particulière

Messagepar Evan Alonso » 22 Aoû 2017, 09:17

Bonjour c'est encore moi,

Toujours dans le cadre de vérification de la qualité de mon modèle, je voudrais faire un diagramme de fiabilité comme ci-dessous :

Image

Pour cela, il faut suivre ces étapes :

a.Trier le fichier selon le score croissant. -> ça je sais faire, pas de soucis

b. Sur la base du score, subdiviser les données en intervalles (ex. 0.0-0.2, 0.2-0.4, etc.). -> Pareil, je l'ai fait pour mon histogramme précédent (avec des paliers de 0.1 et non 0.2 mais ça ne change pas grand chose).

c. Dans chaque intervalle, calculer la proportion de positifs. -> ça, je ne sais pas comment le faire dans R.

d. Dans le même temps, toujours dans chaque intervalle, calculer la moyenne des scores. -> Pareillement, je ne sais pas comment procéder, je saurais le faire dans Excel mais je ne veux plus me servir d'Excel, je veux manipuler R et tout faire avec R.

Voila, j'aurais besoin d'indications pour les deux dernières étapes, je "débute" dans R et je suis loin de savoir tout faire. Mais ce logiciel est fantastique et je compte bien en apprendre le plus possible.

Il est possible que je revienne vers vous ensuite pour le graphique mais normalement je devrais pouvoir me débrouiller seul pour cette partie, nous n'en sommes pas encore rendu la.

Respectueusement.

Alonso Evan.

P.S : J'ai préféré ne pas poster de nouveau sujet et continuer ici afin que vous puissiez avoir accès aux informations sur ma base de données présenté dans les messages antérieurs.

Pierre-Yves Berrard
Messages : 1029
Enregistré le : 12 Jan 2016, 23:30

Re: Construction d'histogramme un peu particulière

Messagepar Pierre-Yves Berrard » 22 Aoû 2017, 12:01

Bonjour,

Vous pouvez regarder du côté de la fonction tapply pour les points c et d.
PY

Evan Alonso
Messages : 15
Enregistré le : 17 Juil 2017, 08:46

Re: Construction d'histogramme un peu particulière

Messagepar Evan Alonso » 22 Aoû 2017, 13:26

J'ai réussi pour la c, j'ai entrer cette ligne de code et ça m'as donné la moyenne des scores pour chaque intervalles :

Code : Tout sélectionner

MeanScore <- tapply(Pred$fit, fit.d, mean)


Mais pour la d, je bloque. Je ne dois pas assez connaitre tapply pour visualiser comment elle peux faire des proportions de la modalité "1" en fonction de mon intervalle.

Merci pour votre réponse en tout cas, mais je n'ai réussi qu'à faire la moitié du travail.

Respectueusement.

Alonso Evan.

Pierre-Yves Berrard
Messages : 1029
Enregistré le : 12 Jan 2016, 23:30

Re: Construction d'histogramme un peu particulière

Messagepar Pierre-Yves Berrard » 22 Aoû 2017, 14:13

Il faut passer en argument une fonction ad hoc.

Code : Tout sélectionner

tapply(positif, intervalle, function(x) mean(x == "1"))

(remplacer positif et intervalle par les noms réels)
PY

Evan Alonso
Messages : 15
Enregistré le : 17 Juil 2017, 08:46

Re: Construction d'histogramme un peu particulière

Messagepar Evan Alonso » 23 Aoû 2017, 07:37

Bonjour,

Merci pour votre aide, ça a marché !

J'ai donc créer un nouveau data.frame avec mes deux vecteurs mais j'aimerais créer un graphique similaire à celui présenté au dessus.

J'ai rentré cette ligne de code

Code : Tout sélectionner

p <- ggplot(data=Diagramme, aes(x = MeanScore, y = Proportiondes1)) + geom_point()
print(p)


Mais je ne sais pas comment faire pour avoir des losanges (ça encore je pense pouvoir trouver) mais surtout je en sais pas comment faire les petits pointillés entre les losanges. Est-ce que vous avez des indications ?

Respectueusement.

Alonso Evan

Pierre-Yves Berrard
Messages : 1029
Enregistré le : 12 Jan 2016, 23:30

Re: Construction d'histogramme un peu particulière

Messagepar Pierre-Yves Berrard » 23 Aoû 2017, 08:00

Code : Tout sélectionner

ggplot(data = Diagramme, aes(x = MeanScore, y = Proportiondes1)) +
  geom_point(shape = 18, size = 4) +
  geom_line(linetype = "dotted", colour = "blue")
PY

Evan Alonso
Messages : 15
Enregistré le : 17 Juil 2017, 08:46

Re: Construction d'histogramme un peu particulière

Messagepar Evan Alonso » 23 Aoû 2017, 08:07

Par-fait !

Juste une dernière chose, comment changer l'axe des abscisses ? J'ai trouvé comment modifier les valeurs prises par l'axe des abscisses mais pas comment le changer complétement. Car la j'ai -> 0.25 ; 0.5 ; 0.75 et je voudrais les intervalles que j'ai crée précédemment : [0,0.1] ; [0.1,0.2] ; [0.2,0.3] .... [0.9,1], mon fit.d quoi.

Respectueusement.

Alonso Evan

Pierre-Yves Berrard
Messages : 1029
Enregistré le : 12 Jan 2016, 23:30

Re: Construction d'histogramme un peu particulière

Messagepar Pierre-Yves Berrard » 23 Aoû 2017, 08:23

Voir l'aide ?scale_continuous pour les axes.
PY


Retourner vers « Questions en cours »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 1 invité