Gráficos Básicos con Julia

21 Ago

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.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *