Skip to content

[R-es] Problema con Histograma con porcentajes usando ggplot

13 messages · Antonio Rodriguez Andres, Carlos J. Gil Bellosta, Javier Marcuzzi +3 more

#
Estimados

Soy un nuevo usario de R, y estoy usando como base de datos el European
Social Survey, que tiene datos de 40,000 individuos, y alrededor de 23
países europeos. Lo que he seleccionado es la útima  ola, el round 7, para
el año 2014.

He leido los datos, desde SPSS y aquí tienen la base de datos y que tipo de
objetos se han generado, y tambíen la distribución por pais de la muestra.
No he usado los weights del survey todavía, solo estoy explorando los datos.

class(ess)

## [1] "lbl_df"     "data.frame"

frq(ess$cntry)

## # Country
##
##  val          label  frq raw.prc valid.prc cum.prc
##    1        Austria 1795    4.47      4.47    4.47
##    2        Belgium 1769    4.40      4.40    8.87
##    3    Switzerland 1532    3.81      3.81   12.68
##    4 Czech Republic 2148    5.35      5.35   18.03
##    5        Germany 3045    7.58      7.58   25.60
##    6        Denmark 1502    3.74      3.74   29.34
##    7        Estonia 2051    5.10      5.10   34.45
##    8          Spain 1925    4.79      4.79   39.24
##    9        Finland 2087    5.19      5.19   44.43
##   10         France 1917    4.77      4.77   49.20
##   11 United Kingdom 2264    5.63      5.63   54.83
##   12        Hungary 1698    4.23      4.23   59.06
##   13        Ireland 2390    5.95      5.95   65.01
##   14         Israel 2562    6.38      6.38   71.38
##   15      Lithuania 2250    5.60      5.60   76.98
##   16    Netherlands 1919    4.78      4.78   81.76
##   17         Norway 1436    3.57      3.57   85.33
##   18         Poland 1615    4.02      4.02   89.35
##   19       Portugal 1265    3.15      3.15   92.50
##   20         Sweden 1791    4.46      4.46   96.95
##   21       Slovenia 1224    3.05      3.05  100.00
##   NA             NA    0    0.00        NA      NA
Ahora voy a hacer un histograma de la variable satisfaccion con la vida,
cuyo rango es de 0-10 (numeros enteros, donde mayor valor indica mayor
satisfacción con la vida.

get_labels(ess$stflife)


##  [1] "Extremely dissatisfied" "1"
##  [3] "2"                      "3"
##  [5] "4"                      "5"
##  [7] "6"                      "7"
##  [9] "8"                      "9"
## [11] "Extremely satisfied"    "Refusal"

## [13] "Don't know"             "No answer"

Lo que he hecho es hacer una tabla de la distribución de esa variable para
un sólo pais Dinamarca (DK)

flat_table(subset(ess, cntry %in% c("DK")), stflife, margin= "row")

## x     0     1     2     3     4     5     6     7     8     9    10
##

##    0.33  0.27  0.47  1.33  0.93  2.87  3.67  8.20 28.40 29.53 24.00


Sin embargo al hacer un histrogama para los paises con ggplot, anda algo
mal con los porcentajes. Por ejemplo sabemos que un 24 % respondió que
están muy satisfechos en DK. Sin embargo

los porcentajes son muy pequeños.


myplot = ggplot(ess, aes (stflife)) +
  geom_bar(aes(y = (..count..)/sum(..count..))) +
  scale_y_continuous(labels=scales::percent) +
  ylab("Relative frequencies") + facet_wrap(~cntry)

plot(myplot)

[image: Inline images 1]
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <https://stat.ethz.ch/pipermail/r-help-es/attachments/20170618/e9d08323/attachment-0001.html>
------------ próxima parte ------------
A non-text attachment was scrubbed...
Name: imagen.png
Type: image/png
Size: 79665 bytes
Desc: no disponible
URL: <https://stat.ethz.ch/pipermail/r-help-es/attachments/20170618/e9d08323/attachment-0001.png>
#
Los porcentajes que obtienes con tu código son sobre todas las facetas, no
país a país.

Calcula los porcentajes previamente a por país y representa esa columna en
las barras.

Un saludo,

Carlos J. Gil Bellosta
http://www.datanalytics.com



El 18 de junio de 2017, 18:23, Antonio Rodriguez Andres <
antoniorodriguezandres70 en gmail.com> escribió:
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <https://stat.ethz.ch/pipermail/r-help-es/attachments/20170618/63ba6dc7/attachment-0001.html>
------------ próxima parte ------------
A non-text attachment was scrubbed...
Name: imagen.png
Type: image/png
Size: 79665 bytes
Desc: no disponible
URL: <https://stat.ethz.ch/pipermail/r-help-es/attachments/20170618/63ba6dc7/attachment-0001.png>
#
Gracias. Alguna idea de que usar para calcular los porcentajes y
almacenarlos. Se puede usar flat table?

El 18/06/2017 4:50 p. m., "Carlos J. Gil Bellosta" <cgb en datanalytics.com>
escribió:
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <https://stat.ethz.ch/pipermail/r-help-es/attachments/20170618/bcb18f9b/attachment-0001.html>
------------ próxima parte ------------
A non-text attachment was scrubbed...
Name: imagen.png
Type: image/png
Size: 79665 bytes
Desc: no disponible
URL: <https://stat.ethz.ch/pipermail/r-help-es/attachments/20170618/bcb18f9b/attachment-0001.png>
#
1) Agrega por país y nivel (en freq).
2) Por país, haz algo así como pct = 100 * freq / sum(freq).

Con plyr, dos líneas.

El 19 de junio de 2017, 0:20, Antonio Rodriguez Andres <
antoniorodriguezandres70 en gmail.com> escribió:
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <https://stat.ethz.ch/pipermail/r-help-es/attachments/20170619/a416eb8f/attachment-0001.html>
------------ próxima parte ------------
A non-text attachment was scrubbed...
Name: imagen.png
Type: image/png
Size: 79665 bytes
Desc: no disponible
URL: <https://stat.ethz.ch/pipermail/r-help-es/attachments/20170619/a416eb8f/attachment-0001.png>
#
Gracias. Voy a estudiarlo. Soy neófito y me llevará algún tiempo.

El 18/06/2017 5:37 p. m., "Carlos J. Gil Bellosta" <cgb en datanalytics.com>
escribió:
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <https://stat.ethz.ch/pipermail/r-help-es/attachments/20170618/d51c05c8/attachment-0001.html>
------------ próxima parte ------------
A non-text attachment was scrubbed...
Name: imagen.png
Type: image/png
Size: 79665 bytes
Desc: no disponible
URL: <https://stat.ethz.ch/pipermail/r-help-es/attachments/20170618/d51c05c8/attachment-0001.png>
#
#Simple table con frecuencias absolutas y crear relativas

count =table(ess$stflife)
percent = 100* (count)/sum(count)

Carlos he creado a esto a nivel general en vez de usar prop.table. Según lo
que dices o entiendo, debo de usar la función
ddply para hacerlo a nivel de todos los paises, y entiendo que ddply (,
c(""), debo de indicar los paises?
Saludos

2017-06-18 17:37 GMT-05:00 Carlos J. Gil Bellosta <cgb en datanalytics.com>:

  
    
#
He conseguido el total para un país, pero no me deja usar percent = count()
/sum(count), alguna idea, entiendo que puedo esar la misma sintaxis para el
barplot

ess   %>%
  filter(cntry %in% c("DK")) %>%
count (stflife) %>%
    print


2017-06-18 18:07 GMT-05:00 Antonio Rodriguez Andres <
antoniorodriguezandres70 en gmail.com>:

  
    
#
Creo que esto me da para DK, y luego veré como aplicar el barplot

ess   %>%
  filter(cntry %in% c("DK")) %>%
count (stflife) %>%
    mutate (freq = (n /sum(n)*100))%>%
print

2017-06-18 19:01 GMT-05:00 Antonio Rodriguez Andres <
antoniorodriguezandres70 en gmail.com>:

  
    
#
Estimado Antonio Rodriguez Andres

Usted dice que está en sus inicios con R, y desea realizar un gráfico. Esto no es problema, el inconveniente es que está mezclando librerías, es lógico, se puede y facilita el trabajo, pero como usted no tiene la experiencia necesaria está mezclando conceptos y formas de trabajo distintas.

Le recomiendo que pare, busque un ejemplo o un libro de R donde hay algo semejante a lo que usted desea, realiza unos ejercicios y comienza otra vez.

Por ejemplo ggplot2 tiene algunos efectos gráficos de presentación vistosos, pero la forma de trabajo requiere conocer algo más el lenguaje, si intenta lo mismo pero con solo los paquetes básicos comprenderá cómo se realizan los cálculos, algo de trabajo con datos, algunas alternativas para realizar el mismo trabajo de distinta forma, y luego busca utilizar ggplot2 como pretende ahora. Creo que las posibilidades de obtener mejores resultados se incrementan si ahora se frena y puede replantear el problema en su mente.

Espere, descanse, el lunes comienza otra vez desde cero y el martes regresa a su problema, invertirá mejor su tiempo con R si aumenta el manejo de lo básico (antes de usar varias librerías o alternativas que aparecieron como sugerencias a su pregunta).

Javier Rubén Marcuzzi

De: Antonio Rodriguez Andres
Enviado: domingo, 18 de junio de 2017 21:20
Para: Carlos J. Gil Bellosta
CC: r-help-es
Asunto: Re: [R-es] Problema con Histograma con porcentajes usando ggplot

Creo que esto me da para DK, y luego veré como aplicar el barplot

ess   %>%
  filter(cntry %in% c("DK")) %>%
count (stflife) %>%
    mutate (freq = (n /sum(n)*100))%>%
print

2017-06-18 19:01 GMT-05:00 Antonio Rodriguez Andres <antoniorodriguezandres70 en gmail.com>:
He conseguido el total para un país, pero no me deja usar percent = count() /sum(count), alguna idea, entiendo que puedo esar la misma sintaxis para el barplot

ess   %>%
  filter(cntry %in% c("DK")) %>%
count (stflife) %>%
    print

2017-06-18 18:07 GMT-05:00 Antonio Rodriguez Andres <antoniorodriguezandres70 en gmail.com>:
#Simple table con frecuencias absolutas y crear relativas

count =table(ess$stflife)
percent = 100* (count)/sum(count)
Carlos he creado a esto a nivel general en vez de usar prop.table. Según lo que dices o entiendo, debo de usar la función
ddply para hacerlo a nivel de todos los paises, y entiendo que ddply (,  c(""), debo de indicar los paises?
Saludos

2017-06-18 17:37 GMT-05:00 Carlos J. Gil Bellosta <cgb en datanalytics.com>:
1) Agrega por país y nivel (en freq).
2) Por país, haz algo así como pct = 100 * freq / sum(freq).

Con plyr, dos líneas.

El 19 de junio de 2017, 0:20, Antonio Rodriguez Andres <antoniorodriguezandres70 en gmail.com> escribió:
Gracias. Alguna idea de que usar para calcular los porcentajes y almacenarlos. Se puede usar flat table?

El 18/06/2017 4:50 p. m., "Carlos J. Gil Bellosta" <cgb en datanalytics.com> escribió:
Los porcentajes que obtienes con tu código son sobre todas las facetas, no país a país. 

Calcula los porcentajes previamente a por país y representa esa columna en las barras.

Un saludo,

Carlos J. Gil Bellosta
http://www.datanalytics.com



El 18 de junio de 2017, 18:23, Antonio Rodriguez Andres <antoniorodriguezandres70 en gmail.com> escribió:
Estimados
Soy un nuevo usario de R, y estoy usando como base de datos el European Social Survey, que tiene datos de 40,000 individuos, y alrededor de 23 países europeos. Lo que he seleccionado es la útima  ola, el round 7, para el año 2014.
He leido los datos, desde SPSS y aquí tienen la base de datos y que tipo de objetos se han generado, y tambíen la distribución por pais de la muestra. No he usado los weights del survey todavía, solo estoy explorando los datos.
class(ess)
## [1] "lbl_df"     "data.frame"
frq(ess$cntry)
## # Country
## 
##  val          label  frq raw.prc valid.prc cum.prc
##    1        Austria 1795    4.47      4.47    4.47
##    2        Belgium 1769    4.40      4.40    8.87
##    3    Switzerland 1532    3.81      3.81   12.68
##    4 Czech Republic 2148    5.35      5.35   18.03
##    5        Germany 3045    7.58      7.58   25.60
##    6        Denmark 1502    3.74      3.74   29.34
##    7        Estonia 2051    5.10      5.10   34.45
##    8          Spain 1925    4.79      4.79   39.24
##    9        Finland 2087    5.19      5.19   44.43
##   10         France 1917    4.77      4.77   49.20
##   11 United Kingdom 2264    5.63      5.63   54.83
##   12        Hungary 1698    4.23      4.23   59.06
##   13        Ireland 2390    5.95      5.95   65.01
##   14         Israel 2562    6.38      6.38   71.38
##   15      Lithuania 2250    5.60      5.60   76.98
##   16    Netherlands 1919    4.78      4.78   81.76
##   17         Norway 1436    3.57      3.57   85.33
##   18         Poland 1615    4.02      4.02   89.35
##   19       Portugal 1265    3.15      3.15   92.50
##   20         Sweden 1791    4.46      4.46   96.95
##   21       Slovenia 1224    3.05      3.05  100.00
##   NA             NA    0    0.00        NA      NA
Ahora voy a hacer un histograma de la variable satisfaccion con la vida,  cuyo rango es de 0-10 (numeros enteros, donde mayor valor indica mayor satisfacción con la vida.
get_labels(ess$stflife)

##  [1] "Extremely dissatisfied" "1"                     
##  [3] "2"                      "3"                     
##  [5] "4"                      "5"                     
##  [7] "6"                      "7"                     
##  [9] "8"                      "9"                     
## [11] "Extremely satisfied"    "Refusal"               
## [13] "Don't know"             "No answer"
Lo que he hecho es hacer una tabla de la distribución de esa variable para un sólo pais Dinamarca (DK)
flat_table(subset(ess, cntry %in% c("DK")), stflife, margin= "row")
## x     0     1     2     3     4     5     6     7     8     9    10
##                                                                    
##    0.33  0.27  0.47  1.33  0.93  2.87  3.67  8.20 28.40 29.53 24.00

Sin embargo al hacer un histrogama para los paises con ggplot, anda algo mal con los porcentajes. Por ejemplo sabemos que un 24 % respondió que están muy satisfechos en DK. Sin embargo
los porcentajes son muy pequeños.

myplot = ggplot(ess, aes (stflife)) + 
  geom_bar(aes(y = (..count..)/sum(..count..))) +
  scale_y_continuous(labels=scales::percent) +
  ylab("Relative frequencies") + facet_wrap(~cntry)

plot(myplot)




_______________________________________________
R-help-es mailing list
R-help-es en r-project.org
https://stat.ethz.ch/mailman/listinfo/r-help-es





-- 
Member, Editorial Committee, The Economic and Labour Relations Review (a SAGE journal)
http://elr.sagepub.com/
Member, Editorial Committee, African Journal of Economic and Management Studies
http://emeraldgrouppublishing.com/products/journals/editorial_team.htm?id=ajems
https://www.researchgate.net/profile/Antonio_Andres (Research Gate profile)




-- 
Member, Editorial Committee, The Economic and Labour Relations Review (a SAGE journal)
http://elr.sagepub.com/
Member, Editorial Committee, African Journal of Economic and Management Studies
http://emeraldgrouppublishing.com/products/journals/editorial_team.htm?id=ajems
https://www.researchgate.net/profile/Antonio_Andres (Research Gate profile)
#
Muchas gracias. Me puede recomendar algún libro donde poder empezar.

Gracias

El 18/06/2017 9:46 p. m., <javier.ruben.marcuzzi en gmail.com> escribió:

  
  
#
2017-06-18 23:28 GMT-04:00 Antonio Rodriguez Andres <
antoniorodriguezandres70 en gmail.com>:
?De ggplot2, sin duda el libro de su (¿cismático?) creador es una
referencia obligada:

Wickham: ggplot2 Elegant Graphics for Data Analysis, 2016?
y uno muy bueno de

Chang: R Graphics Cookbook, 2012
¡
?Salud!?
#
Además del llibro de Wickham te recomiendo esta página:
http://www.r-graph-gallery.com/
Suele ayudar mucho a crear los gráficos como quieres.

El 19 de junio de 2017, 6:37, Freddy Omar López Quintero <
freddy.lopez.quintero en gmail.com> escribió:

  
  
#
Hola a todos.

Utilizando la sintaxis de dplyr (¿ya nadie usa tapply, ni aggregate, ni 
doby??), creo que buscas algo así, agrupando por país y por stlife..


ess_agrupado <- ess %>% group_by(cntry,stflife) %>%
     summarise (n = n()) %>%
     mutate(freq = n / sum(n))


ggplot(ess_agrupado, aes (x=as.factor(stflife))) +
     geom_bar(aes(y = freq), stat="identity") +
     scale_y_continuous(labels=scales::percent) +
     ylab("Relative frequencies") + facet_wrap(~cntry)


Saludos


El 19/06/17 a las 06:37, Freddy Omar López Quintero escribió: