Tipos de gráficos

library(ggplot2)
datos = read.csv("Ofertas laborales.csv", sep = ";", dec = ",", header = T)
print(head(datos))
                     cargo vacantes salario_honorarios        sexo
1                 contador        3            2200000 indiferente
2                 contador        1            2500000 indiferente
3                 contador        1            2000000 indiferente
4    analista de mercados         3            1500000 indiferente
5 coodinador de planeacion        1            2200000 indiferente
6           administradora        1            1500000    femenino
  nivel_educativo años_experiencia idiomas
1     profesional             5.00 no dato
2     profesional             2.00 no dato
3     profesional             2.00 no dato
4     profesional             1.00 no dato
5     profesional             0.25 no dato
6     profesional             1.00 no dato
str(datos)
'data.frame':       86 obs. of  7 variables:
 $ cargo             : Factor w/ 44 levels "administración de compras ",..: 21 21 21 9 23 5 17 6 7 38 ...
 $ vacantes          : int  3 1 1 3 1 1 1 1 1 1 ...
 $ salario_honorarios: int  2200000 2500000 2000000 1500000 2200000 1500000 1500000 2000000 2000000 1500000 ...
 $ sexo              : Factor w/ 3 levels "femenino","indiferente",..: 2 2 2 2 2 1 1 2 2 3 ...
 $ nivel_educativo   : Factor w/ 2 levels "especialización",..: 2 2 2 2 2 2 2 2 2 2 ...
 $ años_experiencia  : num  5 2 2 1 0.25 1 0.5 2 2 3 ...
 $ idiomas           : Factor w/ 2 levels "inglés","no dato": 2 2 2 2 2 2 2 2 2 2 ...

Barras:

Las variables categóricas en R tienen el formato de Factor. Estas variables permiten clasificar los datos asociando una etiqueta a cada dato.

El gráfico de barras calcula la frecuencia relativa de cada variable categórica. Podemos identificar los factores de mayor y menor frecuencia. Se analiza cómo están los datos clasificando en función de una variable, por ejemplo, ¿existen mayores ofertas laborales para los especialistas?

En ggplot2se utiliza la capa geom_bar()

Una variable categórica:

ggplot(data = datos) +
    geom_bar(aes(x = nivel_educativo))
../../_images/output_9_01.png
ggplot(data = datos) +
    geom_bar(aes(x = cargo)) +
    coord_flip()  # Para girar el gráfico
../../_images/output_10_0.png

Para cambiar el color de cada barra (cada factor), se agrega fill = nivel_educativo dentro de aes().

Las etiquetas del eje \(X\) se cambian con scale_x_discrete(labels = c("Especialización", "Profesional"))

ggplot(data = datos) +
    geom_bar(aes(x = nivel_educativo, fill = nivel_educativo), width = 0.3) +
    labs(title = "Ofertar laborales",
        subtitle = "Clasificación por nivel educativo",
        x = "Nivel educativo",
        y = "Cantidad",
        fill = "Nivel educativo") +
    scale_x_discrete(labels = c("Especialización", "Profesional"))
../../_images/output_12_01.png

Más de una variable categórica:

El anterior gráfico clasifica los datos en una sola variable categórica haciendo que la clasificación por fill = se hiciera con la misma variable x =, para clasificar dos variables categóricas, en estos dos argumentos se debe poner variables distintas, por ejemplo, x = nivel_educativo y en fill = sexo.

ggplot(data = datos) +
    geom_bar(aes(x = nivel_educativo, fill = sexo), width = 0.3) +
    labs(title = "Ofertar laborales",
        subtitle = "Clasificación por nivel educativo y sexo",
        x = "Nivel educativo",
        y = "Cantidad",
        fill = "Sexo") +
    scale_x_discrete(labels = c("Especialización", "Profesional"))
../../_images/output_15_0.png

Para clasificar con una tercera variable se puede agregar facet_grid ()

ggplot(data = datos) +
    geom_bar(aes(x = nivel_educativo, fill = sexo), width = 0.3) +
    facet_grid(. ~ idiomas) +
    labs(title = "Ofertar laborales",
        subtitle = "Clasificación por nivel educativo, sexo e idioma",
        x = "Nivel educativo",
        y = "Cantidad",
        fill = "Sexo") +
    scale_x_discrete(labels = c("Especialización", "Profesional"))
../../_images/output_17_0.png

Note que aparecen unos colores por defecto, pero podemos crear nuestra propia paleta de colores e ingresarlos manualmente.

Cuando clasificamos los datos por colores podemos cambiar los colores que la librería muestra por defecto.

Primero, se crea una variable con los colores: colores <- c("steelblue1", "turquoise", "wheat").

Luego, se agregan en el gráfico como una capa adicional así: + scale_color_manual(values = colores, aesthetics = "fill")

En este ejemplo la clasificación se está haciendo cambiando los colores en fill, por esto se pone aesthetics = "fill", pero si la clasificación se hiciera por color, entonces se pone aesthetics = "colour"

colores <- c("steelblue1", "turquoise", "wheat")
ggplot(data = datos) +
    geom_bar(aes(x = nivel_educativo, fill = sexo), width = 0.3) +
    facet_grid(. ~ idiomas) +
    labs(title = "Ofertar laborales",
        subtitle = "Clasificación por nivel educativo, sexo e idioma",
        x = "Nivel educativo",
        y = "Cantidad",
        fill = "Sexo") +
    scale_x_discrete(labels = c("Especialización", "Profesional")) +
    scale_color_manual(values = colores, aesthetics = "fill")
../../_images/output_20_0.png

Torta (pie):

Primero se debe hacer un gráfico de barras, pero todas las barras apiladas en una sola, luego se transforma el gráfico con coord_polar() para cambiar las alturas de las barras por ángulos.

El gráfico de barras apiladas se hace solo pasando una variable en \(y\) y se deja la \(X\) vacía así: x = "", y = nivel_educativo.

Se agrega stat = "identity" para que no se realice un conteo para la altura de las barras porque ya se especificó con y = nivel_educativo

ggplot(data = datos) + aes(x = "", y = nivel_educativo, fill = nivel_educativo) +
    geom_bar(stat = "identity", width = 0.3)
../../_images/output_23_01.png

Después, el gráfico de torta o pie se hace transformando el gráfico anterior con coord_polar(theta = "y").

theta = "y" es para cambiar la geometría de la altura de las barras.

ggplot(data = datos) + aes(x = "", y = nivel_educativo, fill = nivel_educativo) +
    geom_bar(stat = "identity") +
    coord_polar(theta = "y")
../../_images/output_25_0.png

Histograma:

Se usa para variables numéricas.

Una variable:

ggplot(data = datos, aes(x = años_experiencia)) +
    geom_histogram(bins = 15, fill = "steelblue1", color = "black") +
    labs(title = "Ofertas laborales",
        subtitle = "Años de experiencia",
        x = "Años de experiencie",
        y = "Cantidad")
../../_images/output_29_0.png

Clasificación con una variable:

Clasificación por años de experiencia y por sexo. Solo es agregar la clasificación dentro de aes() ya sea con color, fill o shape.

colores <- c("steelblue1", "turquoise", "wheat")
ggplot(data = datos, aes(x = años_experiencia, fill = sexo)) +
    geom_histogram(bins = 15, color = "black") +
    labs(title = "Ofertas laborales",
        subtitle = "Años de experiencia por sexo",
        x = "Años de experiencie",
        y = "Cantidad") +
    scale_color_manual(values = colores, aesthetics = "fill")
../../_images/output_33_0.png

Clasificación con dos o más variables:

La segunda variable categórica que clasifica se agrega con facet_grid()

ggplot(data = datos, aes(x = años_experiencia,  fill = sexo)) +
    geom_histogram(bins = 15, color = "black") +
    facet_grid(. ~ idiomas) +
    labs(title = "Ofertas laborales",
        subtitle = "Años de experiencia por sexo e idiomas",
        x = "Años de experiencie",
        y = "Cantidad") +
    scale_color_manual(values = colores, aesthetics = "fill")
../../_images/output_36_0.png

Para una tercera variable para clasificar se llena el otro campo de facet_grid().

ggplot(data = datos, aes(x = años_experiencia,  fill = sexo)) +
    geom_histogram(bins = 15, color = "black") +
    facet_grid(vacantes ~ idiomas) +
    labs(title = "Ofertas laborales",
        subtitle = "Años de experiencia",
        x = "Años de experiencie",
        y = "Cantidad") +
    scale_color_manual(values = colores, aesthetics = "fill")
../../_images/output_38_0.png

Dispersión:

Los gráficos de dispersión son bivariados, se necesita una \(X\) y una \(y\).

ggplot(data = datos, aes(x = sexo,  y = salario_honorarios)) +
    geom_point(size = 4)
../../_images/output_41_0.png
ggplot(data = datos, aes(x = sexo,  y = salario_honorarios)) +
    geom_point(size = 4) +
    labs(title = "Ofertas laborales",
        subtitle = "Salario y sexo",
        x = "Sexo",
        y = "Salario")
../../_images/output_42_0.png
ggplot(data = datos, aes(x = nivel_educativo,  y = salario_honorarios)) +
    geom_point(size = 4) +
    labs(title = "Ofertas laborales",
        subtitle = "Salario y nivel educativo",
        x = "Sexo",
        y = "Salario",
        color = "Nivel educativo")
../../_images/output_43_0.png

Las observaciones se pueden clasificar en el gráfico indicando las variables en aes() en los argumentos color, fill, size o shape. Adiciomalmente, si se usa facet_grid() se puede hacer clasificaciones con una o dos variables adicionales.

ggplot(data = datos, aes(x = nivel_educativo,  y = salario_honorarios, color = sexo)) +
    geom_point(size = 4) +
    labs(title = "Ofertas laborales",
        subtitle = "Salario y nivel educativo por sexo",
        x = "Nivel educativo",
        y = "Salario",
        color = "Sexo")
../../_images/output_45_0.png
ggplot(data = datos, aes(x = nivel_educativo,  y = salario_honorarios, color = sexo, shape = idiomas)) +
    geom_point(size = 4) +
    labs(title = "Ofertas laborales",
        subtitle = "Salario y nivel educativo por sexo e idiomas",
        x = "Nivel educativo",
        y = "Salario",
        color = "Sexo",
        shape = "Idiomas")
../../_images/output_46_01.png

La clasificación anterior por sexo e idiomas se puede hacer de la siguiente manera:

ggplot(data = datos, aes(x = nivel_educativo,  y = salario_honorarios, color = sexo)) +
    geom_point(size = 4) +
    facet_grid(. ~ idiomas) +
    labs(title = "Ofertas laborales",
        subtitle = "Salario y nivel educativo por sexo e idiomas",
        x = "Nivel educativo",
        y = "Salario",
        color = "Sexo")
../../_images/output_48_0.png

Salario y años de experiencia por sexo.

ggplot(data = datos, aes(x = años_experiencia,  y = salario_honorarios, color = sexo)) +
    geom_point(size = 4) +
    labs(title = "Ofertas laborales",
        subtitle = "Salario y años de experiencia por sexo",
        x = "Años de experiencia",
        y = "Salario",
        color = "Sexo")
../../_images/output_50_0.png
ggplot(data = datos, aes(x = años_experiencia,  y = salario_honorarios, color = sexo, shape = idiomas)) +
    geom_point(size = 4) +
    labs(title = "Ofertas laborales",
        subtitle = "Salario y años de experiencia por sexo",
        x = "Años de experiencia",
        y = "Salario",
        color = "Sexo")
../../_images/output_51_0.png
ggplot(data = datos, aes(x = años_experiencia,  y = salario_honorarios, color = idiomas)) +
    geom_point(size = 4) +
        facet_grid(sexo ~ .) +
    labs(title = "Ofertas laborales",
        subtitle = "Salario y años de experiencia por sexo e idiomas",
        x = "Años de experiencia",
        y = "Salario",
        color = "Idiomas")
../../_images/output_52_0.png
ggplot(data = datos, aes(x = años_experiencia,  y = salario_honorarios, color = idiomas)) +
    geom_point(size = 4) +
        facet_grid(sexo ~ vacantes) +
    labs(title = "Ofertas laborales",
        subtitle = "Salario y años de experiencia por sexo, idiomas y vacantes",
        x = "Años de experiencia",
        y = "Salario",
        color = "Idiomas")
../../_images/output_53_0.png

A veces a útil crear un gráfico de dispersión y al mismo tiempo mostrar la forma de los datos con histogramas, boxplots o densidades. Para hacer esto se usará el siguiente paquete:

install.packages("ggExtra")

library(ggExtra)

Con la función ggMarginal() de la librería ggExtra podemos agregar gráficos “marginales” como histogramas, boxplots, etc. sobre los gráficos de ggplot2.

Primero se crea el gráfico con ggplot2, pero se almacena en una variable, por ejemplo, en p, luego se usa la función ggMarginal() indicando en el primer argumento el gráfico de ggplot2 que lo llamamos p y en el segundo argumento el tipo de gráfico entre comillas.

p <- ggplot(data = datos, aes(x = años_experiencia,  y = salario_honorarios)) +
        geom_point(size = 4) +
        labs(title = "Ofertas laborales",
            subtitle = "Salario y años de experiencia",
            x = "Años de experiencia",
            y = "Salario")

ggMarginal(p, type = "histogram")
../../_images/output_58_0.png
p <- ggplot(data = datos, aes(x = años_experiencia,  y = salario_honorarios)) +
        geom_point(size = 4) +
        labs(title = "Ofertas laborales",
            subtitle = "Salario y años de experiencia",
            x = "Años de experiencia",
            y = "Salario")

ggMarginal(p, type = "boxplot")
../../_images/output_59_0.png
p <- ggplot(data = datos, aes(x = años_experiencia,  y = salario_honorarios)) +
        geom_point(size = 4) +
        labs(title = "Ofertas laborales",
            subtitle = "Salario y años de experiencia",
            x = "Años de experiencia",
            y = "Salario")

ggMarginal(p, type = "density")
../../_images/output_60_0.png

Gráfico marginal solo para la \(X\): margins = "x".

p <- ggplot(data = datos, aes(x = años_experiencia,  y = salario_honorarios)) +
        geom_point(size = 4) +
        labs(title = "Ofertas laborales",
            subtitle = "Salario y años de experiencia",
            x = "Años de experiencia",
            y = "Salario")

ggMarginal(p, margins = "x", type = "histogram", fill = "darkred")
../../_images/output_62_0.png

Gráfico marginal solo para la \(y\): margins = "y".

p <- ggplot(data = datos, aes(x = años_experiencia,  y = salario_honorarios)) +
        geom_point(size = 4) +
        labs(title = "Ofertas laborales",
            subtitle = "Salario y años de experiencia",
            x = "Años de experiencia",
            y = "Salario")

ggMarginal(p, margins = "y", type = "histogram", fill = "darkred")
../../_images/output_64_0.png

Boxplot (diagrama de caja y bigotes):

Útiles para analizar los datos e identificar datos atípicos ( outliers ).

Boxplot

Boxplot

Diagrama

Diagrama

Boxplot-Nomal

Boxplot-Nomal

Distribución de los años de experiencia por cada sexo.

ggplot(data = datos, aes(x = sexo,  y = años_experiencia)) +
    geom_boxplot()
../../_images/output_71_0.png
ggplot(data = datos, aes(x = sexo,  y = años_experiencia)) +
    geom_boxplot() +
    labs(title = "Ofertas laborales",
        subtitle = "Años de experiencia y sexo",
        x = "Sexo",
        y = "Años de experiencia")
../../_images/output_72_0.png

Distribución del salario por cada sexo.

ggplot(data = datos, aes(x = sexo,  y = salario_honorarios)) +
    geom_boxplot() +
    labs(title = "Ofertas laborales",
        subtitle = "Salario y sexo",
        x = "Sexo",
        y = "Salario")
../../_images/output_74_0.png

Distribución del salario por cada nivel educativo.

ggplot(data = datos, aes(x = nivel_educativo,  y = salario_honorarios)) +
    geom_boxplot() +
    labs(title = "Ofertas laborales",
        subtitle = "Salario y nivel educativo",
        x = "Nivel educativo",
        y = "Salario")
../../_images/output_76_0.png

Gráfico Boxplot con observaciones individuales como puntos. Se agrega la capa de geom_point()

ggplot(data = datos, aes(x = nivel_educativo,  y = salario_honorarios)) +
    geom_boxplot() +
    geom_point() +
    labs(title = "Ofertas laborales",
        subtitle = "Salario y nivel educativo",
        x = "Nivel educativo",
        y = "Salario")
../../_images/output_78_0.png

Gráfico Boxplot con observaciones individuales como puntos y clasificación de los puntos por una variable. En la capa de geom_point se agrega aes(color = sexo).

ggplot(data = datos, aes(x = nivel_educativo,  y = salario_honorarios)) +
    geom_boxplot() +
    geom_point(aes(color = sexo)) +
    labs(title = "Ofertas laborales",
        subtitle = "Salario y nivel educativo",
        x = "Nivel educativo",
        y = "Salario")
../../_images/output_80_0.png

Distribución del salario por cada cargo.

ggplot(data = datos, aes(x = cargo,  y = salario_honorarios)) +
    geom_boxplot() +
    labs(title = "Ofertas laborales",
        subtitle = "Salario y cargo",
        x = "Cargo",
        y = "Salario") +
    coord_flip()
../../_images/output_82_0.png

Distribución del salario por nivel de educación e idioma adicional requerido.

ggplot(data = datos, aes(x = nivel_educativo,  y = salario_honorarios)) +
    geom_boxplot() +
    facet_grid(. ~ idiomas) +
    labs(title = "Ofertas laborales",
        subtitle = "Salario y nivel educativo por idioma",
        x = "Nivel educativo",
        y = "Salario")
../../_images/output_84_0.png

El siguiente gráfico tiene las variables anteriores, pero con diferente orden en la clasificación.

ggplot(data = datos, aes(x = idiomas,  y = salario_honorarios)) +
    geom_boxplot() +
    facet_grid(. ~ nivel_educativo) +
    labs(title = "Ofertas laborales",
        subtitle = "Salario e idioma por nivel educativo",
        x = "Idiomas",
        y = "Salario")
../../_images/output_86_0.png

Distribución del salario por idioma adicional requerido y adicionalmente, por nivel educativo y años de experiencia.

ggplot(data = datos, aes(x = idiomas,  y = salario_honorarios)) +
    geom_boxplot() +
    facet_grid(vacantes ~ nivel_educativo) +
    labs(title = "Ofertas laborales",
        subtitle = "Salario e idioma por nivel educativo y años de experiencia",
        x = "Idiomas",
        y = "Salario")
../../_images/output_88_0.png