Powered by AppSignal & Oban Pro

Habitación 4: Visualización de Combate

oaks_lab/solutions/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 = "Attack"  # Por ejemplo: 'Attack', 'Defense', 'HP', 'Speed'
col_y = "Defense"  # Por ejemplo: 'Attack', 'Defense', 'HP', 'Speed'

Columna suma

Crear una nueva columna llamada Suma, sumando esas dos estadísticas.

df = 
  df
  |> DF.mutate(Suma: col(^col_x) + col(^col_y))

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.

respuesta = 
  df 
  |> DF.sort_by(desc: col("Suma"))
  |> DF.pull("Name")
  |> Series.first()

Verificar tu respuesta

Room.verify(respuesta)