Prática Avançada de Data Science e Visualization

Laboratórios

Meu papel

Meu papel nessa disciplina será ajudar no aprendizado da parte técnica – códigos etc.

Também posso dar pitacos nas apresentações e salvá-los em situações de desespero (atendimentos extras).

Lab 01

Lab 01

Nesse lab, nosso objetivo será construir soluções em R e/ou python para problemas comuns de transformação e visualização de dados.

  • 4 equipes de 4 ou 5 pessoas:

  • Vamos utilizar o ChatGPT para exercícios mais difíceis.

  • Eu tenho acesso ao GPT-4, vocês podem pedir para eu usar.

  • No final de cada exercício, discutiremos aspectos teóricos sobre as ferramentas.

Prêmios

  • As melhores resoluções receberão stickers. A quantidade de stickers depende da dificuldade do exercício.

Vamos lá!

Exercício 1.1 (transformação) 🛑

glimpse(match_min)
Rows: 25,979
Columns: 12
$ id               <int> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16…
$ country_name     <chr> "Belgium", "Belgium", "Belgium", "Belgium", "Belgium"…
$ country_id       <int> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,…
$ league_id        <int> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,…
$ season           <chr> "2008/2009", "2008/2009", "2008/2009", "2008/2009", "…
$ stage            <int> 1, 1, 1, 1, 1, 1, 1, 1, 1, 10, 10, 10, 10, 10, 10, 10…
$ date             <chr> "2008-08-17 00:00:00", "2008-08-16 00:00:00", "2008-0…
$ match_api_id     <int> 492473, 492474, 492475, 492476, 492477, 492478, 49247…
$ home_team_api_id <int> 9987, 10000, 9984, 9991, 7947, 8203, 9999, 4049, 1000…
$ away_team_api_id <int> 9993, 9994, 8635, 9998, 9985, 8342, 8571, 9996, 9986,…
$ home_team_goal   <int> 1, 0, 0, 5, 1, 1, 2, 1, 1, 4, 1, 0, 0, 2, 1, 0, 1, 1,…
$ away_team_goal   <int> 1, 0, 3, 0, 3, 1, 2, 2, 0, 1, 2, 2, 0, 2, 2, 1, 3, 3,…
  • Selecionar as colunas country_id, country_name, home_team_goal, away_team_goal.
  • Filtrar para os campeonatos dos maiores países (Espanha, Inglaterra, Itália, França e Alemanha).
  • Criar uma coluna total_goals, com o total de gols.
  • Calcular a média, a mediana e o desvio padrão de gols por país
  • Ordenar o resultado de forma decrescente pela média
# A tibble: 5 × 4
  country_name media desvio_padrao mediana
  <chr>        <dbl>         <dbl>   <dbl>
1 Germany       2.90          1.70       3
2 Spain         2.77          1.73       3
3 England       2.71          1.69       3
4 Italy         2.62          1.64       2
5 France        2.44          1.55       2
                  mean  median       std
country_name                            
Germany       2.901552     3.0  1.704974
Spain         2.767105     3.0  1.731111
England       2.710526     3.0  1.691127
Italy         2.616838     2.0  1.640327
France        2.443092     2.0  1.551799

Exercício 1.2 (barras exploratório) 🛑

Exercício 1.3 (barras otimizado) 🛑🛑

  • Utilize case_when() ou case_match() para mudar os nomes dos países.

  • Utilize fct_reorder() para ordenar a coluna country_name adequadamente.

  • Utilize scale_fill_manual() com os valores cores <- c("#C4161C", "#009491")

  • Utilize o ChatGPT para os aspectos estéticos.

Discussão

Exercício 2.1 (join e pivotagem) 🛑🛑🛑

Rows: 1,458
Columns: 25
$ id                                <int> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 1…
$ team_fifa_api_id                  <int> 434, 434, 434, 77, 77, 77, 77, 77, 7…
$ team_api_id                       <int> 9930, 9930, 9930, 8485, 8485, 8485, …
$ date                              <chr> "2010-02-22 00:00:00", "2014-09-19 0…
$ build_up_play_speed               <int> 60, 52, 47, 70, 47, 58, 62, 58, 59, …
$ build_up_play_speed_class         <chr> "Balanced", "Balanced", "Balanced", …
$ build_up_play_dribbling           <int> NA, 48, 41, NA, NA, NA, NA, 64, 64, …
$ build_up_play_dribbling_class     <chr> "Little", "Normal", "Normal", "Littl…
$ build_up_play_passing             <int> 50, 56, 54, 70, 52, 62, 45, 62, 53, …
$ build_up_play_passing_class       <chr> "Mixed", "Mixed", "Mixed", "Long", "…
$ build_up_play_positioning_class   <chr> "Organised", "Organised", "Organised…
$ chance_creation_passing           <int> 60, 54, 54, 70, 53, 45, 40, 56, 51, …
$ chance_creation_passing_class     <chr> "Normal", "Normal", "Normal", "Risky…
$ chance_creation_crossing          <int> 65, 63, 63, 70, 48, 70, 50, 68, 72, …
$ chance_creation_crossing_class    <chr> "Normal", "Normal", "Normal", "Lots"…
$ chance_creation_shooting          <int> 55, 64, 64, 70, 52, 55, 55, 57, 63, …
$ chance_creation_shooting_class    <chr> "Normal", "Normal", "Normal", "Lots"…
$ chance_creation_positioning_class <chr> "Organised", "Organised", "Organised…
$ defence_pressure                  <int> 50, 47, 47, 60, 47, 40, 42, 41, 49, …
$ defence_pressure_class            <chr> "Medium", "Medium", "Medium", "Mediu…
$ defence_aggression                <int> 55, 44, 44, 70, 47, 40, 42, 42, 45, …
$ defence_aggression_class          <chr> "Press", "Press", "Press", "Double",…
$ defence_team_width                <int> 45, 54, 54, 70, 52, 60, 60, 60, 63, …
$ defence_team_width_class          <chr> "Normal", "Normal", "Normal", "Wide"…
$ defence_defender_line_class       <chr> "Cover", "Cover", "Cover", "Cover", …
  • Unir a base team_attributes com a base team
  • Filtrar para os times “Real Madrid”, “Bayern”, “Milan”, “PSG” e “Manchester United”
  • Retirar as colunas que acabam com _class
  • Transformar a coluna date em year, contendo o ano
  • Calcular a média das estatísticas por tipo (build_up_play_*, chance_creation_*, defence_*) e empilhar as estatísticas por tipo (não necessariamente nessa ordem).
# A tibble: 90 × 5
    year type    team_short_name team_long_name value
   <dbl> <chr>   <chr>           <chr>          <dbl>
 1  2010 build   ACM             Milan           37.5
 2  2010 chance  ACM             Milan           56.7
 3  2010 defence ACM             Milan           41.7
 4  2011 build   ACM             Milan           57.5
 5  2011 chance  ACM             Milan           53.3
 6  2011 defence ACM             Milan           50  
 7  2012 build   ACM             Milan           47.5
 8  2012 chance  ACM             Milan           45  
 9  2012 defence ACM             Milan           46.7
10  2013 build   ACM             Milan           51  
# ℹ 80 more rows

Vou tentar durante a aula usando o ChatGPT 😅

Exercício 2.2 (linhas exploratório) 🛑🛑

Exercício 2.3 (linhas otimizado) 🛑🛑🛑

  • Utilize case_when() ou case_match() para mudar os nomes da coluna categoria.

  • Utilize o parâmetro legend.position= da função theme()

  • Utilize geom_smooth() para montar a banda de confiança no fundo.

  • Utilize as cores anteriores + um cinza

  • Utilize o ChatGPT para os aspectos estéticos.

Discussão

Lab 02

Lab 02

Nesse lab, nosso objetivo será explorar extensões do ggplot2 e htmlwidgets. Vamos montar visualizações mais sofisticadas e também vamos ver gráficos interativos.

  • Grupos serão os mesmos do trabalho final

  • Aqui o ChatGPT não vai conseguir ajudar tanto assim, mas vocês podem tentar

  • Eu darei uma introdução na primeira 1h

  • No final de cada exercício, discutiremos aspectos teóricos sobre as ferramentas.

Prêmios

  • As melhores resoluções receberão doces. A quantidade de doces depende da dificuldade do exercício.

Vamos lá!

Exercício 1 (htmlwidget) 🍪

  • Utilize o código do Lab01.

  • Utilize plotly::ggplotly().

  • Utilize o parâmetro legend.position= da função theme() para remover a legenda.

Exercício 2 (animate) 🍪🍪🍪

  • Juntar a base de jogos com a base de times
  • Filtrar para jogos na liga espanhola.
  • Criar uma base com o total de jogos por time e por temporada (existem várias formas).
  • Filtrar para times que estiveram em todas as temporadas.

  • Utilize gghighlight para destacar os times
  • Utilize gganimate com transition_time(). A temporada deve ser um valor numérico.

Discussão