Histogramme sous R

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

Ines akkari
Messages : 29
Enregistré le : 10 Avr 2013, 14:04

Histogramme sous R

Messagepar Ines akkari » 08 Juil 2014, 09:29

Bonjour,

Je voudrais implémenter sous Windev une fonction qui calcule l'histogramme donc j'ai utilisé la méthode de calcul des classes sur le site de wikipediahttp://fr.wikipedia.org/wiki/Histogramme

c'est à dire :
nbclasse= 1+10*log(N)/3
et l'amplitude des classes est égales à

Apm=(max(donnée)-min(donnée))/nbclasse

donc le vecteur des mes classes est le suivant( cas de 7 classes)
Classe<-c(lif,lif+Amp,lif+2*Amp,lif+3*Amp,lif+4*Amp,lif+5*Amp,lif+6*Amp,round(lif+7*Amp))
avec lif est calculé comme il est indiqué sur le site

Et pour s'assurer des résultats j'ai appliqué la fonction hist de R sur ces données et comparer ainsi les résultats

Image

Mais j'ai remarqué qu'on n'a pas le même effectif des données dans les 3 dernières classes ,aussi les classes ne sont pas les mêmes ( différence d'Amplitude!)
Ma question est donc comment R calcule l'histogramme et l'amplitude des classes?
j'ai commencé par essayer de comprendre le code source de la fonction hist mais j'avoue je n'ai pas pu comprendre grand chose sur le calcul d'amplitude des classes !

Merci d'avance pour vos réponses ,

cordialement,
Inès

Renaud Lancelot
Messages : 2484
Enregistré le : 16 Déc 2004, 08:01
Contact :

Messagepar Renaud Lancelot » 08 Juil 2014, 11:12

Voir l'aide de la fonction hist et en particulier l'argument breaks. Différentes méthodes sont disponibles pour déterminer le nombre de classes (Sturges, Scott, Fredmann-Diaconis) et l'utilisateur peut spécifier sa propre fonction. Exemple:

Code : Tout sélectionner

nclass.wikipedia <- function(x) ceiling(1 + 10 * log(length(x)) / 3)
y <- rnorm(1000)
hist(y, breaks = nclass.wikipedia)
Renaud

Ines akkari
Messages : 29
Enregistré le : 10 Avr 2013, 14:04

Messagepar Ines akkari » 08 Juil 2014, 13:30

Merci pour votre réponse,
Je remarque très bien la différence entre les deux méthode avec votre code
j'ai donc changé ma méthode de calcul de nombre de classes en la remplaçant avec la méthode de Sturge :

nbclasse=ceiling(1+log(N)/log(2))

et pour calculer les largeur des classes j'ai utilisé cette méthode

1- calcul des bornes supérieure et inférieure
binf=min(donne)-0.025*(max(donne)-min(donne))
bsup=max(donne)+0.025*(max(donne)-min(donne))

2- largeur classes

l=(bsup-binf)/nbclasse

mais je ne trouve toujours pas la même résultats qu'avec la fonction hist de R !

Renaud Lancelot
Messages : 2484
Enregistré le : 16 Déc 2004, 08:01
Contact :

Messagepar Renaud Lancelot » 09 Juil 2014, 14:21

Pour vous répondre précisément, il faut un exemple reproductible: merci de nous fournir votre jeu de données et votre code.
Renaud

Ines akkari
Messages : 29
Enregistré le : 10 Avr 2013, 14:04

Messagepar Ines akkari » 10 Juil 2014, 09:37

Le code est le suivant

Code : Tout sélectionner

nn=dim(Cotedurhone)[1]
 Et=max(Cotedurhone[,2])-min(Cotedurhone[,2])
 a=min(Cotedurhone[,2])
 b=max(Cotedurhone[,2])
 #on calcule le nombre de classe    : partie entiere superieure
#nbclass= round(1+(log(n,10)*10)/3)
  nbclass=ceiling(1+log(nn)/log(2)    )
orCr=Cotedurhone[order(Cotedurhone[,2]), ]

#on calcule l'echantillon
#on calcule la limite inferieure
# lif=a-(0.001/2)
lif0=orCr[1,2]-0.025*(orCr[nn,2]-orCr[1,2])
lifk=orCr[nn,2]+0.025*(orCr[nn,2]-orCr[1,2])
#on calcule l'amplitude
Amp=(lifk-lif0)/nbclass
#on cree un vecteur contenant
Classe<-c(lif0,lif0+Amp,lif0+2*Amp,lif0+3*Amp,lif0+4*Amp,lif0+5*Amp,lif0+6*Amp,lifk)

res <- matrix(0, nbclass, 1)
tota=0
for(i in 1:nn){
             tota=occurence(orCr[i,2],lif0,lifk,Amp,nbclass)
             res[tota,1]=res[tota,1]+1
              }
/*la fonction qui permet d'identifier si un élément appartient à un interval*/
occurence<-function(x,lif,lifk,Amp,nbclasse){ #lif limite inférieur , lifk limite superieur de tous le jeu de données
for(i in 1:(nbclasse-1)){
if((lif+(i-1)*Amp<=x)&&(x<lif+i*Amp)){
 res=i
}
}
if((lif+(nbclasse-1)*Amp<=x)&&(x<=lifk)){
 res=nbclasse
}
return(res)
      }





Le jeu de données est le suivant :
Idéchantillon Poids
1 1317 751.66
2 1317 753.68
3 1317 753.68
4 1317 753.68
5 1317 751.66
6 1317 751.66
7 1317 734.54
8 1317 751.66
9 1317 751.66
10 1317 751.66
11 1316 751.66
12 1316 751.66
13 1316 751.66
14 1316 751.66
15 1316 751.66
16 1316 751.66
17 1316 751.66
18 1316 751.66
19 1316 751.66
20 1316 754.68
21 1315 751.66
22 1315 751.66
23 1315 751.66
24 1315 751.66
25 1315 751.66
26 1315 751.66
27 1315 751.66
28 1315 751.66
29 1315 751.66
30 1315 754.68
31 1314 757.70
32 1314 757.70
33 1314 757.70
34 1314 757.70
35 1314 757.70
36 1314 757.70
37 1314 757.70
38 1314 757.70
39 1314 757.70
40 1314 758.71
41 1313 758.71
42 1313 757.70
43 1313 757.70
44 1313 758.71
45 1313 758.71
46 1313 758.71
47 1313 758.71
48 1313 761.73
49 1313 758.71
50 1313 758.71

Cordialement,
Inès


Retourner vers « Questions en cours »

Qui est en ligne

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