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))
ggplot(data = datos) +
    geom_bar(aes(x = cargo)) +
    coord_flip()  # Para girar el gráfico
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"))
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"))
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"))
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")
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)
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")
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")
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")
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")
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")
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)
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")
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")
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")
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")
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")
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")
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")
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")
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")
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")
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")
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")
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")
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")
Boxplot (diagrama de caja y bigotes):
Útiles para analizar los datos e identificar datos atípicos ( outliers ).
Boxplot
Diagrama
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()
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")
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")
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")
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")
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")
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()
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")
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")
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")