De forma análoga a otras entradas sobre análisis gráficos básicos empezamos a trabajar con las posibilidades gráficas del lenguaje Julia. A continuación se recogerán el 80% de los gráficos que un científico de datos realizará en su vida profesional, el 20% restante se abordará en otras entradas. Emplearemos el conjunto de datos penguins para ilustrar los ejemplos:
using CSV using DataFrames using HTTP url="https://raw.githubusercontent.com/mwaskom/seaborn-data/master/penguins.csv" res = HTTP.get(url) penguins = DataFrame(CSV.File(res.body))
En esta entrada se emplearán las librerías Plots y StatsPlots que podremos instalar con:
using Pkg; Pkg.add("Plots"); Pkg.add("StatsPlots")
Descripción univariable
Variables cuantitativas
Histogramas con Julia:
# Histograma using Plots gr() pinta = map(!ismissing, penguins.flipper_length_mm) histogram(penguins.flipper_length_mm[pinta])
El primer gráfico con una sintaxis muy sencilla, histogram(vector) Comentarios relevantes, para estas representaciones gráficas empleamos el framework GR, no podemos pintar datos missing y por ello hacemos un filtrado previo mediante map, como sólo deseamos pintar el histograma de una variable trabajamos con vectores, si deseamos variar el número de grupos empleamos nbins. Sentamos las bases del método de trabajo.
Gráficos de densidades:
# Densidades using StatsPlots pinta = map(!ismissing, penguins.flipper_length_mm) density(penguins.flipper_length_mm[pinta])
Sintaxis muy similar a la empleada con el histograma pero en este caso se usa la función density
Gráfico Boxplot:
# Boxplot using StatsPlots pinta = map(!ismissing, penguins.flipper_length_mm) boxplot(penguins.flipper_length_mm[pinta])
Variables cualitativas
Gráficos de barras:
# Variables cualitativas using DataFramesMeta using Query using StatsPlots agr = penguins |> @groupby(_.species) |> @map({species=key(_), conteo=length(_)}) |> DataFrame bar(agr.species, agr.conteo, label = "Número de pinguinos", title = "Conteo por especie", xticks =:all, size = [600, 400], legend =:topright)
Para la realización de gráficos de barras se ha realizado una agregación previa, realizamos el groupby por el campo que deseamos realizar el gráfico y contamos registros. Aprovechamos el ejemplo para introducir etiquetas con label, títulos con title, ver las líneas de división, especificar el tamaño y establecer la posición de la leyenda. Se observa que las opciones del gráfico no son complejas.
Del mismo modo si deseamos la representación en porcentaje podemos calcularlo previamente:
#En porcentaje agr = penguins |> @groupby(_.species) |> @map({species=key(_), conteo=length(_)}) |> DataFrame total = nrow(penguins) agr = agr |> @mutate(pct = _.conteo/total) |> DataFrame bar(agr.species, agr.pct, label = "% de pinguinos", title = "% por especie", xticks =:all, size = [600, 400], legend =:topright)
Descripción bivariable
Gráfico de puntos:
# Gráfico de puntos grafico = @from i in penguins begin @where !isna(i.flipper_length_mm) & !isna(i.bill_length_mm) @select i @collect DataFrame end scatter(grafico.flipper_length_mm, grafico.bill_length_mm, group = grafico.species, legend =:topleft)
Anotaciones, se eliminan aquellos registros con valores perdidos para evitar problemas en la representación gráfica, esa selección se lleva a cabo mediante una query y en este caso vamos a identificar cada punto con un color por la especie. La situación es similar a los gráficos de barras, preparamos un data frame con la estructura que deseamos representar gráficamente.
Gráfico de densidad comparando un factor:
# Comparación de densidades pinta = map(!ismissing, penguins.flipper_length_mm) density(penguins.flipper_length_mm[pinta], group=penguins.species[pinta])
Boxplot comparando distribuciones por factor:
# Comparación boxplot pinta = map(!ismissing, penguins.flipper_length_mm) boxplot(penguins.species[pinta] ,penguins.flipper_length_mm[pinta], legend=false)
Gráficos de barras de dos factores:
# Gráfico de barras tabla = combine(groupby(penguins, [:species, :island]), :bill_length_mm => length) groupedbar(tabla.species, tabla.bill_length_mm_length, group=tabla.island, legend =:topleft )
Para estos gráficos es necesario emplear la función groupedbar.
Gráfico de barras apiladas:
# Barras apiladas tabla = combine(groupby(penguins, [:species, :island]), :bill_length_mm => length) groupedbar(tabla.species, tabla.bill_length_mm_length, group=tabla.island, bar_position = :stack, bar_width=0.7)
Del mismo modo empleamos groupedbar pero con la opción bar_position= :stack
De un vistazo los 8 gráficos más habituales en el trabajo diario. Mi opinión personal, código muy sencillo pero siguen sin gustarme las agregaciones con Julia, en esta entrada se exploran varias posibilidades. El siguiente paso será replicar esta entrada con plotly.