Powered by AppSignal & Oban Pro

Habitación 4: Visualización de Combate

oaks_lab/05.livemd

Habitación 4: Visualización de Combate

Mix.install([
  {:explorer, "~> 0.11.1"},
  {:kino, "~> 0.19.0"},
  {:kino_explorer, "~> 0.1.25"},
  {:kino_vega_lite, "~> 0.1.13"},
  {:helpers, path: Path.expand("./helpers", __DIR__)}
])

defmodule Room do
  require Explorer.DataFrame, as: DF

  def verify(answer) do
    if answer == "AggronMega Aggron" do
        Helpers.Messages.correct(
          "06.livemd",
          "Has dominado la visualización y el análisis de datos"
        )
    else
        Helpers.Messages.error(
          "Revisa bien... parece que no sumaste correctamente o elegiste mal el Pokémon."
        )
    end
    |> Kino.Markdown.new()
  end
end

Contexto

La sala está llena de pantallas mostrando batallas Pokémon.

El Profesor Oak te deja un nuevo mensaje:

> Antes de elegir al Pokémon más fuerte, un buen Científico de Datos debe visualizar los datos. > No siempre sumar estadísticas tiene sentido… ¡Primero observa, luego decide!

Recuerda

El gráfico de dispersión nos permite observar:

  • Si las estadísticas están relacionadas.
  • Si sumar tiene sentido o si las variables son muy distintas.

Luego de observar, podemos ordenar la tabla y tomar una mejor decisión.

Desafío de la habitación

  1. Elegir dos estadísticas de combate (col_x y col_y) — por ejemplo Attack y Defense.
  2. Crear un gráfico de dispersión para ver cómo se relacionan.
  3. Crear una nueva columna llamada suma sumando esas dos estadísticas.
  4. Mostrar los 5 mejores Pokémon con mayor suma.
  5. Definir en respuesta el nombre del Pokémon con la mayor suma.

Crear DataFrame

require Explorer.DataFrame, as: DF
alias Explorer.Series
alias VegaLite, as: Vl

file = Path.expand("../files/pokemon.csv", __DIR__) # "pokemon.csv"

df = file
  # |> Kino.FS.file_path()
  |> DF.from_csv!()

Elegir columnas

Elegir dos estadísticas de combate (col_x y col_y) — por ejemplo Attack y Defense.

col_x = nil  # Por ejemplo: 'Attack', 'Defense', 'HP', 'Speed'
col_y = nil  # Por ejemplo: 'Attack', 'Defense', 'HP', 'Speed'

Columna suma

Crear una nueva columna llamada Suma, sumando esas dos estadísticas. Usando DF.mutate(df, Suma: col(^col_x) + col(^col_y)).

df = nil

Gráfico de dispersión

Crear un gráfico de dispersión para ver cómo se relacionan las columnas seleccionadas

color = "green"  # Por ejemplo: 'orange', 'green', 'blue', 'red'

Vl.new(width: 700, height: 400, title: "#{col_x} vs #{col_y} de Pokémon")
|> Vl.data_from_values(df)
|> Vl.mark(:point, color: color)
|> Vl.encode_field(:x, col_x, type: :quantitative)
|> Vl.encode_field(:y, col_y, type: :quantitative)

Top 5 Pokémon

Mostrar los 5 mejores Pokémon con mayor suma.

df
|> DF.select(["Name", col_x, col_y, "Suma"])
|> DF.sort_by(desc: col("Suma"))
|> DF.head(5)

Definir respuesta

Definir en respuesta el nombre del Pokémon con la mayor suma.

  • DF.sort_by(desc: col("Suma")): Ordena descendente según la columna “Suma”.
  • DF.pull("Name"): Obtiene solamente el valor de la columna “Name”.
  • Series.first(): Obtiene solamente el primer resultado.
respuesta = nil

Verificar tu respuesta

Room.verify(respuesta)