Estadística Descriptiva

Gráficos de barras

Este tutorial de R describe cómo crear un gráfico de barras utilizando el software R y el paquete ggplot2. Se puede utilizar la función geom_bar().

Datos: Ranking de empresas en Florida central 2003

¿Qué empresas ocuparon los primeros puestos en Florida central en 2003?
library(ggplot2)
df <- data.frame(Empresa = 
                   c("Disney World", 
                      "Florida Hospital", 
                      "Publix Supermarkets Inc",
                      "Walmart Stores Ind",
                      "Univaersal Orlando"), 
                 Asalariados = 
                   c(51600,
                     19283,
                     14995,
                     14995,
                     12000))
knitr::kable(df)
Empresa Asalariados
Disney World 51600
Florida Hospital 19283
Publix Supermarkets Inc 14995
Walmart Stores Ind 14995
Univaersal Orlando 12000
Para visualizar los datos en formato dataframe puede usar el comando View() o también head() para visualizar las primeras filas en consola
head(df)
##                   Empresa Asalariados
## 1            Disney World       51600
## 2        Florida Hospital       19283
## 3 Publix Supermarkets Inc       14995
## 4      Walmart Stores Ind       14995
## 5      Univaersal Orlando       12000

Creación de gráficos de barras

ggplot2 es un sistema para crear gráficos de forma declarativa, basado en la Gramática de los Gráficos. Se deben proporcionar los datos, indicar a ggplot2 cómo asignar las variables a la estética y qué tipo de gráficas utilizar. La función geom_bar() se utiliza para producir gráficos de área 1d: gráficos de barras para x categóricas, e histogramas para y continuas
library(ggplot2)
ggplot(data=df, aes(x=Empresa, y=Asalariados)) + geom_bar(stat="identity")

El histograma puede ser dibujado en forma horizontal usando la función coord_flip()
ggplot(data=df, aes(x=Empresa, y=Asalariados)) + geom_bar(stat="identity") + coord_flip()

Podemos cambiar el ancho, así como también el color de las barras y bordes. Nótese que se puede hacer una copia de la gráfica en una variable, en este ejemplo en p para que luego pueda ser usada para presentar el grafico o realizar más transformaciones
ggplot(data=df, aes(x=Empresa, y=Asalariados)) + geom_bar(stat="identity", width=0.5)

ggplot(data=df, aes(x=Empresa, y=Asalariados)) + geom_bar(stat="identity", color="blue", fill="white")

p <- ggplot(data=df, aes(x=Empresa, y=Asalariados)) + geom_bar(stat="identity", fill="steelblue") + theme_minimal()
p

Gráfico de barras agrupado

Un gráfico de barras agrupado muestra un valor numérico para un conjunto de entidades divididas en grupos y subgrupos.
El conjunto de datos para el presente ejemplo proporciona 3 columnas: el valor numérico (value), y 2 variables categóricas para los niveles de grupo (specie) y subgrupo (condition). En el llamada aes(), x es el grupo (specie), y el subgrupo (condition) se da al argumento fill. En la función geom_bar(), debe especificarse position=“dodge” para que las barras estén una al lado de la otra.
library(ggplot2)
library(dplyr)
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
specie <- c(rep("sorgho" , 3), 
            rep("poacee" , 3), 
            rep("banana" , 3), 
            rep("triticum" , 3))
condition <- rep(c("normal" , "stress" , "Nitrogen") , 4)
value <- abs(rnorm(12 , 0 , 15))
data <- data.frame(specie, condition, value)

knitr::kable(data)
specie condition value
sorgho normal 10.0305514
sorgho stress 13.6581473
sorgho Nitrogen 11.9804859
poacee normal 22.7171202
poacee stress 3.6559661
poacee Nitrogen 0.5526182
banana normal 12.0870279
banana stress 16.7395930
banana Nitrogen 17.3048092
triticum normal 3.0288642
triticum stress 9.0109272
triticum Nitrogen 0.0456306
head(data)
##   specie condition      value
## 1 sorgho    normal 10.0305514
## 2 sorgho    stress 13.6581473
## 3 sorgho  Nitrogen 11.9804859
## 4 poacee    normal 22.7171202
## 5 poacee    stress  3.6559661
## 6 poacee  Nitrogen  0.5526182
El siguiente llamado es utilizado para el gráfico de barras agrupado
ggplot(data, aes(fill=condition, y=value, x=specie)) +
  geom_bar(position="dodge", stat="identity")

Gráfico de barras apilado

Un gráfico de barras apilado es muy similar al gráfico de barras agrupado anterior. Los subgrupos sólo se muestran uno encima del otro, no al lado.
Lo único que hay que cambiar para obtener esta figura es cambiar el argumento de posición por el de apilado
ggplot(data, aes(fill=condition, y=value, x=specie)) + 
  geom_bar(position="stack", stat="identity")

Considere ahora el Ejemplo 13 de las notas de clase. Número de estudiantes matriculados en tres especialidades de administración de empresas, 2000 y 2005. Creamos un data frame a partir de la tabla de frecuencias que contenga tres columnas, cada una representando la especialidad, el año, y el número de matriculados.
df <- data.frame(Especialidad = c(rep("Finanzas", 2), 
                                  rep("Marketing", 2), 
                                  rep("Contabilidad", 2)),
                 Año = rep(c(2000, 2005), 3),
                 Matriculados = c(160, 250,
                                  140, 200,
                                  100, 150))
knitr::kable(df)
Especialidad Año Matriculados
Finanzas 2000 160
Finanzas 2005 250
Marketing 2000 140
Marketing 2005 200
Contabilidad 2000 100
Contabilidad 2005 150
Los siguientes son los gráficos de barras agrupados y apilados respectivamente
ggplot(df, aes(fill = Especialidad, y = Matriculados, x = Año)) +
  geom_bar(position="dodge", stat="identity")

ggplot(df, aes(fill = Especialidad, y = Matriculados, x = Año)) +
  geom_bar(position="stack", stat="identity")

Gráfico circular

ggplot2 no ofrece ningún geom específica para construir diagramas circulares (piecharts). El truco es el siguiente: El marco de datos de entrada tiene 2 columnas: los nombres de los grupos (group here) y su valor (value here), se construye un gráfico de barras apilado con una sola barra utilizando la función geom_bar(), luego se hace circular con coord_polar()
Dataset Ejemplo 14: El gerente de una universidad pidió una desagregación de los gastos de viaje de los profesores que asistían a diversas reuniones profesionales. Se observó que el 31 por ciento de los gastos estaba representado por los costes de transporte, el 25 por ciento por los costes de alojamiento, el 12 por ciento por los gastos de alimentación, el 20 por ciento por los gastos de matrícula y el resto por costes varios. Represente gráficamente estos datos.
library(ggplot2)
library(dplyr)

data <- data.frame(group = 
                     c("Transporte", 
                       "Alojamiento", 
                       "Alimentaión", 
                       "Gastos de matricula",
                       "Varios"), 
                   value = c(31, 25, 12, 20, 12))
knitr::kable(data)
group value
Transporte 31
Alojamiento 25
Alimentaión 12
Gastos de matricula 20
Varios 12
ggplot(data, aes(x = "", y = value, fill=group)) +
  geom_bar(stat = "identity", width = 1) +
  coord_polar("y", start = 0)

Renombrar etiquetas: La parte complicada es calcular la posición y de las etiquetas utilizando la transformación coord_polar. Para esto procedemos de la siguiente manera
library(ggplot2)
library(dplyr)

data <- data %>% 
  arrange(desc(group)) %>%
  mutate(prop = value / sum(data$value) *100) %>%
  mutate(ypos = cumsum(prop)- 0.5*prop )
require(scales)
## Loading required package: scales
ggplot(data, aes(x="", y = prop, fill=group)) +
  geom_bar(stat="identity", width=1, color="white") +
  coord_polar("y", start=0) +
  theme_void() + 
  theme(legend.position="none") +
  
  geom_text(aes(y = ypos, label = percent(value/100)), color = "white", size=6) +
  scale_fill_brewer(palette="Set1")

Diagrama de pareto

Un gráfico de Pareto, llamado así por Vilfredo Pareto, es un tipo de gráfico que contiene barras y una línea, donde los valores individuales se representan en orden descendente mediante barras, y el total acumulado se representa mediante la línea. Para realizar este gráfico utilizamos la función stat_pareto y ggplot de la siguiente forma:
Primero creamos un dataset y cargamos las librerias necesarias. Ejemplo 14: Identificar las principales causas de los problemas e intentar corregirlas rápidamente con un coste mínimo a menudo.
df <- data.frame(Error =
                   c("Códigos de procedimientos y diagnósticos",
                     "Información de proveedor", 
                     "Información del paciente",
                     "Tablas de precios",
                     "Solicitudes de contratos",
                     "Ajustes de los proveedores",
                     "Otros"), 
                 Frecuencia = 
                   c(40, 9, 6, 17, 37, 7, 4))
knitr::kable(df)
Error Frecuencia
Códigos de procedimientos y diagnósticos 40
Información de proveedor 9
Información del paciente 6
Tablas de precios 17
Solicitudes de contratos 37
Ajustes de los proveedores 7
Otros 4
head(df)
##                                      Error Frecuencia
## 1 Códigos de procedimientos y diagnósticos         40
## 2                 Información de proveedor          9
## 3                 Información del paciente          6
## 4                        Tablas de precios         17
## 5                 Solicitudes de contratos         37
## 6               Ajustes de los proveedores          7
El siguiente llamado nos entregará el gráfico de pareto para el dataframe df
library(ggQC)
library(ggplot2)

ggplot(df, aes(x = Error, y = Frecuencia)) +
  stat_pareto(point.color = "red",
              point.size = 3,
              line.color = "black",
              bars.fill = c("blue", "orange")) +
  theme(axis.text.x = element_text(angle = 10))

Diagrama de tallo y hojas

La sintaxis básica para dibujar el gráfico de tallos y hojas en R es la siguiente:

stem(x, scale = 1, width = 80, atom = 1e-08)

La siguiente es la lista de argumentos soportados por el gráfico de tallo y hoja en el lenguaje de programación R: / x: Especifique los datos sobre los que desea dibujar el gráfico tallo y hojas. En este caso, debe utilizar el vector numérico, o una lista que contenga el vector numérico. / scale: Especifique la escala que desea utilizar para su gráfico. / width: Es opcional, pero puede usarla para especificar la anchura deseada de la parcela. Por defecto, es 80. / atom: Es la tolerancia.
Consideremos el Ejemplo 17: de los apuntes de clase relacionado con la colección de 25 calificaciones en un examen de álgebra. Nótese que el resultado es similar al de los apuntes, las única diferencia es que stem() organiza las hojas de menor a mayor
df <- data.frame(calificaciones = c(78, 67, 65, 87, 75, 65, 71, 54, 94, 64, 84, 82, 81, 
                                    68, 85, 76, 89, 98, 59, 57, 79, 65, 59, 80, 67))
head(df)
##   calificaciones
## 1             78
## 2             67
## 3             65
## 4             87
## 5             75
## 6             65
knitr::kable(head(df))
calificaciones
78
67
65
87
75
65
Creación del gráfico de tallo y hoja en R
stem(df$calificaciones)
## 
##   The decimal point is 1 digit(s) to the right of the |
## 
##   5 | 4799
##   6 | 4555778
##   7 | 15689
##   8 | 0124579
##   9 | 48
Al observar el d. de t. h. anterior podemos concluir que: / La calificación más alta es 98. / La menor es 54. / Las calificaciones varían de 54 a 98. / El tallo 9 tiene menos hojas. / Los tallos 6 y 8 contienen más hojas, siete en cada uno. / El número total de hojas representa el tamaño de la muestra.
En el siguiente ejemplo, mostramos cómo hacer un gráfico de tallo y hoja en R utilizando el conjunto de datos ChickWeight, que proporciona R Studio. Mantenemos por defecto cada uno de los argumentos
head(ChickWeight)
##   weight Time Chick Diet
## 1     42    0     1    1
## 2     51    2     1    1
## 3     59    4     1    1
## 4     64    6     1    1
## 5     76    8     1    1
## 6     93   10     1    1
knitr::kable(head(ChickWeight))
weight Time Chick Diet
42 0 1 1
51 2 1 1
59 4 1 1
64 6 1 1
76 8 1 1
93 10 1 1
Creación del gráfico de tallo y hoja en R
stem(ChickWeight$weight)
## 
##   The decimal point is 1 digit(s) to the right of the |
## 
##    2 | 599999999
##    4 | 00000111111111111111111112222222222222223333456678888888899999999999+38
##    6 | 00111111122222222333334444455555666677777888888900111111222222333334+8
##    8 | 00112223344444455555566777788999990001223333566666788888889
##   10 | 0000111122233333334566667778889901122223445555667789
##   12 | 00002223333344445555667788890113444555566788889
##   14 | 11123444455556666677788890011234444555666777777789
##   16 | 00002233334444466788990000134445555789
##   18 | 12244444555677782225677778889999
##   20 | 0123444555557900245578
##   22 | 0012357701123344556788
##   24 | 08001699
##   26 | 12344569259
##   28 | 01780145
##   30 | 355798
##   32 | 12712
##   34 | 1
##   36 | 13
Se puede observar que la salida no es igual a los datos del ejemplo. Esto se debe a que los tallos están agrupados (el primer tallo es para 2 y 3, el segundo para 4 y 5, etc.). Para resolver este problema, se debe cambiar la altura del diagrama con el argumento scale de la siguiente manera:
stem(ChickWeight$weight, scale = 2)
## 
##   The decimal point is 1 digit(s) to the right of the |
## 
##    3 | 599999999
##    4 | 00000111111111111111111112222222222222223333456678888888899999999999
##    5 | 000000111111112222333334445555566667778888899999
##    6 | 001111111222222223333344444555556666777778888889
##    7 | 0011111122222233333444444446667778889999
##    8 | 0011222334444445555556677778899999
##    9 | 0001223333566666788888889
##   10 | 00001111222333333345666677788899
##   11 | 01122223445555667789
##   12 | 0000222333334444555566778889
##   13 | 0113444555566788889
##   14 | 1112344445555666667778889
##   15 | 0011234444555666777777789
##   16 | 0000223333444446678899
##   17 | 0000134445555789
##   18 | 1224444455567778
##   19 | 2225677778889999
##   20 | 01234445555579
##   21 | 00245578
##   22 | 00123577
##   23 | 01123344556788
##   24 | 08
##   25 | 001699
##   26 | 12344569
##   27 | 259
##   28 | 0178
##   29 | 0145
##   30 | 35579
##   31 | 8
##   32 | 127
##   33 | 12
##   34 | 1
##   35 | 
##   36 | 1
##   37 | 3

Gráfico de series temporales

Considere la siguiente serie de tiempo correspondiente a la evolución de la temperatura global en superficie con respecto a las temperaturas medias de 1951-1980, fuente NASA/GISS.
La función geom_line() de ggplot2 se encarga de conectar las observaciones en orden de la variable en el eje x. La siguientes instrucciones son usada para representar la gráfica de serie de tiempo, primero cargamos los datos usando read_csv()
library(readr)
## 
## Attaching package: 'readr'
## The following object is masked from 'package:scales':
## 
##     col_factor
library(knitr)  

df <- read_csv("https://raw.githubusercontent.com/lihkir/AnalisisEstadisticoUN/main/Data/annual_csv.csv")
## Rows: 274 Columns: 3
## -- Column specification --------------------------------------------------------
## Delimiter: ","
## chr (1): Source
## dbl (2): Year, Mean
## 
## i Use `spec()` to retrieve the full column specification for this data.
## i Specify the column types or set `show_col_types = FALSE` to quiet this message.
knitr::kable(head(df))
Source Year Mean
GCAG 2016 0.9363
GISTEMP 2016 0.9900
GCAG 2015 0.8998
GISTEMP 2015 0.8700
GCAG 2014 0.7408
GISTEMP 2014 0.7400
library(ggplot2)
library(dplyr)

ggplot(df, aes(x = Year, y = Mean)) +
  geom_line(color="#69b3a2", size = 1) +
  xlab("Year")