Capítulo 3.4
Índice
- 1. O que é Ciência de Dados?
- 2. Causalidade e Experimentos
- 3. Progamando em Python
- 4. Tipos de Dados
- 5. Sequências
- 6. Tabelas
- 7. Visualização
- 8. Funções e Tabelas
- 9. Aleatoriedade
- 10. Amostragem e Distribuições Empíricas
- 11. Testando Hipóteses
- 12. Comparando Duas Amostras
- 13. Estimação
- 14. Por que a Média é Importante
- 15. Previsão
from datascience import *
path_data = '../../../assets/data/'
import numpy as np
%matplotlib inline
import matplotlib.pyplot as plots
plots.style.use('fivethirtyeight')
cones = Table.read_table(path_data + 'cones.csv')
nba = Table.read_table(path_data + 'nba_salaries.csv').relabeled(3, 'SALARY')
movies = Table.read_table(path_data + 'movies_by_year.csv')
Introdução às Tabelas
Agora podemos aplicar o Python para analisar dados. Trabalharemos com dados armazenados em estruturas de Tabela.
As Tabelas são uma forma fundamental de representar conjuntos de dados. Uma tabela pode ser vista de duas maneiras:
- uma sequência de colunas nomeadas que descrevem cada uma um único atributo de todas as entradas em um conjunto de dados, ou
- uma sequência de linhas que contêm todas as informações sobre um único indivíduo em um conjunto de dados.
Estudaremos as tabelas em grande detalhe nos próximos capítulos. Por enquanto, apenas introduziremos alguns métodos sem entrar em detalhes técnicos.
A tabela cones foi importada para nós; mais tarde veremos como, mas aqui vamos apenas trabalhar com ela. Primeiro, vamos dar uma olhada nela.
cones
| Flavor | Color | Price |
|---|---|---|
| strawberry | pink | 3.55 |
| chocolate | light brown | 4.75 |
| chocolate | dark brown | 5.25 |
| strawberry | pink | 5.25 |
| chocolate | dark brown | 5.25 |
| bubblegum | pink | 4.75 |
A tabela tem seis linhas. Cada linha corresponde a um cone de sorvete. Os cones de sorvete são os indivíduos.
Cada cone tem três atributos: sabor, cor e preço. Cada coluna contém os dados de um desses atributos, e assim todas as entradas de qualquer coluna única são do mesmo tipo. Cada coluna tem um rótulo. Nos referiremos às colunas pelos seus rótulos.
Um método de tabela é como uma função, mas deve operar em uma tabela. Então a chamada parece
nome_da_tabela.método(argumentos)
Por exemplo, se você quiser ver apenas as duas primeiras linhas de uma tabela, você pode usar o método da tabela show.
cones.show(2)
| Flavor | Color | Price |
|---|---|---|
| strawberry | pink | 3.55 |
| chocolate | light brown | 4.75 |
Você pode substituir 2 por qualquer número de linhas. Se você pedir mais do que seis, você só obterá seis, porque cones tem apenas seis linhas.
Escolhendo Conjuntos de Colunas
O método select cria uma nova tabela consistindo apenas das colunas especificadas.
cones.select('Flavor')
| Flavor |
|---|
| strawberry |
| chocolate |
| chocolate |
| strawberry |
| chocolate |
| bubblegum |
Isso deixa a tabela original inalterada.
cones
| Flavor | Color | Price |
|---|---|---|
| strawberry | pink | 3.55 |
| chocolate | light brown | 4.75 |
| chocolate | dark brown | 5.25 |
| strawberry | pink | 5.25 |
| chocolate | dark brown | 5.25 |
| bubblegum | pink | 4.75 |
Você pode selecionar mais de uma coluna, separando os rótulos das colunas por vírgulas.
cones.select('Flavor', 'Price')
| Flavor | Price |
|---|---|
| strawberry | 3.55 |
| chocolate | 4.75 |
| chocolate | 5.25 |
| strawberry | 5.25 |
| chocolate | 5.25 |
| bubblegum | 4.75 |
Você também pode remover colunas que não deseja. A tabela acima pode ser criada removendo a coluna Color.
cones.drop('Color')
| Flavor | Price |
|---|---|
| strawberry | 3.55 |
| chocolate | 4.75 |
| chocolate | 5.25 |
| strawberry | 5.25 |
| chocolate | 5.25 |
| bubblegum | 4.75 |
Você pode nomear esta nova tabela e olhar para ela novamente apenas digitando seu nome.
no_colors = cones.drop('Color')
no_colors
| Flavor | Price |
|---|---|
| strawberry | 3.55 |
| chocolate | 4.75 |
| chocolate | 5.25 |
| strawberry | 5.25 |
| chocolate | 5.25 |
| bubblegum | 4.75 |
Assim como select, o método drop cria uma tabela menor e deixa a tabela original inalterada. Para explorar seus dados, você pode criar qualquer número de tabelas menores escolhendo ou removendo colunas. Isso não causará nenhum dano à sua tabela de dados original.
Ordenando Linhas
O método sort cria uma nova tabela arranjando as linhas da tabela original em ordem crescente dos valores na coluna especificada. Aqui, a tabela cones foi ordenada em ordem crescente do preço dos cones.
cones.sort('Price')
| Flavor | Color | Price |
|---|---|---|
| strawberry | pink | 3.55 |
| chocolate | light brown | 4.75 |
| bubblegum | pink | 4.75 |
| chocolate | dark brown | 5.25 |
| strawberry | pink | 5.25 |
| chocolate | dark brown | 5.25 |
Para ordenar em ordem decrescente, você pode usar um argumento opcional para sort. Como o nome indica, argumentos opcionais não precisam ser usados, mas podem ser usados se você quiser alterar o comportamento padrão de um método.
Por padrão, sort ordena em ordem crescente dos valores na coluna especificada. Para ordenar em ordem decrescente, use o argumento opcional descending=True.
cones.sort('Price', descending=True)
| Flavor | Color | Price |
|---|---|---|
| chocolate | dark brown | 5.25 |
| strawberry | pink | 5.25 |
| chocolate | dark brown | 5.25 |
| bubblegum | pink | 4.75 |
| chocolate | light brown | 4.75 |
| strawberry | pink | 3.55 |
Assim como select e drop, o método sort deixa a tabela original inalterada.
Selecionando Linhas que Satisfazem uma Condição
O método where cria uma nova tabela consistindo apenas das linhas que satisfazem uma determinada condição. Nesta seção, trabalharemos com uma condição muito simples, que é que o valor em uma coluna especificada deve ser igual a um valor que também especificamos. Assim, o método where tem dois argumentos.
O código na célula abaixo cria uma tabela consistindo apenas das linhas correspondentes a cones de chocolate.
cones.where('Flavor', 'chocolate')
| Flavor | Color | Price |
|---|---|---|
| chocolate | light brown | 4.75 |
| chocolate | dark brown | 5.25 |
| chocolate | dark brown | 5.25 |
Os argumentos, separados por vírgula, são o rótulo da coluna e o valor que estamos procurando nessa coluna. O método where também pode ser usado quando a condição que as linhas devem satisfazer é mais complicada. Nessas situações, a chamada também será um pouco mais complicada.
É importante fornecer o valor exatamente. Por exemplo, se especificarmos Chocolate em vez de chocolate, então where encontrará corretamente nenhuma linha em que o sabor seja Chocolate.
cones.where('Flavor', 'Chocolate')
| Flavor | Color | Price |
|---|
Assim como todos os outros métodos de tabela desta seção, where deixa a tabela original inalterada.
Exemplo: Salários na NBA
“A NBA é a liga esportiva profissional que mais paga no mundo,” informou a CNN em março de 2016. A tabela nba contém os salários de todos os jogadores da National Basketball Association em 2015-2016.
Cada linha representa um jogador. As colunas são:
| Column Label | Description |
|---|---|
| PLAYER | Player’s name |
| POSITION | Player’s position on team |
| TEAM | Team name |
| SALARY | Player’s salary in 2015-2016, in millions of dollars |
O código para as posições é PG (Armador), SG (Ala-armador), PF (Ala-pivô), SF (Ala) e C (Pivô). Mas o que segue não envolve detalhes sobre como o basquete é jogado.
A primeira linha mostra que Paul Millsap, Ala-pivô do Atlanta Hawks, teve um salário de quase $\$18.7$ milhões em 2015-2016.
nba
| PLAYER | POSITION | TEAM | SALARY |
|---|---|---|---|
| Paul Millsap | PF | Atlanta Hawks | 18.6717 |
| Al Horford | C | Atlanta Hawks | 12 |
| Tiago Splitter | C | Atlanta Hawks | 9.75625 |
| Jeff Teague | PG | Atlanta Hawks | 8 |
| Kyle Korver | SG | Atlanta Hawks | 5.74648 |
| Thabo Sefolosha | SF | Atlanta Hawks | 4 |
| Mike Scott | PF | Atlanta Hawks | 3.33333 |
| Kent Bazemore | SF | Atlanta Hawks | 2 |
| Dennis Schroder | PG | Atlanta Hawks | 1.7634 |
| Tim Hardaway Jr. | SG | Atlanta Hawks | 1.30452 |
| … (407 rows omitted) | |||
Os fãs de Stephen Curry podem encontrar sua linha usando where.
nba.where('PLAYER', 'Stephen Curry')
| PLAYER | POSITION | TEAM | SALARY |
|---|---|---|---|
| Stephen Curry | PG | Golden State Warriors | 11.3708 |
Também podemos criar uma nova tabela chamada ‘warriors’, que consiste apenas nos dados dos Golden State Warriors.
warriors = nba.where('TEAM', 'Golden State Warriors')
warriors
| PLAYER | POSITION | TEAM | SALARY |
|---|---|---|---|
| Klay Thompson | SG | Golden State Warriors | 15.501 |
| Draymond Green | PF | Golden State Warriors | 14.2609 |
| Andrew Bogut | C | Golden State Warriors | 13.8 |
| Andre Iguodala | SF | Golden State Warriors | 11.7105 |
| Stephen Curry | PG | Golden State Warriors | 11.3708 |
| Jason Thompson | PF | Golden State Warriors | 7.00847 |
| Shaun Livingston | PG | Golden State Warriors | 5.54373 |
| Harrison Barnes | SF | Golden State Warriors | 3.8734 |
| Marreese Speights | C | Golden State Warriors | 3.815 |
| Leandro Barbosa | SG | Golden State Warriors | 2.5 |
| … (4 rows omitted) | |||
Por padrão, as primeiras 10 linhas de uma tabela são exibidas. Você pode usar show para exibir mais ou menos. Para exibir a tabela inteira, use show sem nenhum argumento entre parênteses.
warriors.show()
| PLAYER | POSITION | TEAM | SALARY |
|---|---|---|---|
| Klay Thompson | SG | Golden State Warriors | 15.501 |
| Draymond Green | PF | Golden State Warriors | 14.2609 |
| Andrew Bogut | C | Golden State Warriors | 13.8 |
| Andre Iguodala | SF | Golden State Warriors | 11.7105 |
| Stephen Curry | PG | Golden State Warriors | 11.3708 |
| Jason Thompson | PF | Golden State Warriors | 7.00847 |
| Shaun Livingston | PG | Golden State Warriors | 5.54373 |
| Harrison Barnes | SF | Golden State Warriors | 3.8734 |
| Marreese Speights | C | Golden State Warriors | 3.815 |
| Leandro Barbosa | SG | Golden State Warriors | 2.5 |
| Festus Ezeli | C | Golden State Warriors | 2.00875 |
| Brandon Rush | SF | Golden State Warriors | 1.27096 |
| Kevon Looney | SF | Golden State Warriors | 1.13196 |
| Anderson Varejao | PF | Golden State Warriors | 0.289755 |
A tabela nba está ordenada em ordem alfabética dos nomes dos times. Para ver como os jogadores foram pagos em 2015-2016, é útil ordenar os dados por salário. Lembre-se que por padrão, a ordenação é em ordem crescente.
nba.sort('SALARY')
| PLAYER | POSITION | TEAM | SALARY |
|---|---|---|---|
| Thanasis Antetokounmpo | SF | New York Knicks | 0.030888 |
| Jordan McRae | SG | Phoenix Suns | 0.049709 |
| Cory Jefferson | PF | Phoenix Suns | 0.049709 |
| Elliot Williams | SG | Memphis Grizzlies | 0.055722 |
| Orlando Johnson | SG | Phoenix Suns | 0.055722 |
| Phil Pressey | PG | Phoenix Suns | 0.055722 |
| Keith Appling | PG | Orlando Magic | 0.061776 |
| Sean Kilpatrick | SG | Denver Nuggets | 0.099418 |
| Erick Green | PG | Utah Jazz | 0.099418 |
| Jeff Ayres | PF | Los Angeles Clippers | 0.111444 |
| … (407 rows omitted) | |||
Esses números são um tanto difíceis de comparar, pois alguns desses jogadores mudaram de time durante a temporada e receberam salários de mais de um time; apenas o salário do último time aparece na tabela.
O relatório da CNN é sobre o outro extremo da escala salarial – os jogadores que estavam entre os mais bem pagos do mundo. Para identificar estes jogadores podemos classificá-los por ordem decrescente de salário e olhar para as primeiras linhas.
nba.sort('SALARY', descending=True)
| PLAYER | POSITION | TEAM | SALARY |
|---|---|---|---|
| Kobe Bryant | SF | Los Angeles Lakers | 25 |
| Joe Johnson | SF | Brooklyn Nets | 24.8949 |
| LeBron James | SF | Cleveland Cavaliers | 22.9705 |
| Carmelo Anthony | SF | New York Knicks | 22.875 |
| Dwight Howard | C | Houston Rockets | 22.3594 |
| Chris Bosh | PF | Miami Heat | 22.1927 |
| Chris Paul | PG | Los Angeles Clippers | 21.4687 |
| Kevin Durant | SF | Oklahoma City Thunder | 20.1586 |
| Derrick Rose | PG | Chicago Bulls | 20.0931 |
| Dwyane Wade | SG | Miami Heat | 20 |
| … (407 rows omitted) | |||
O falecido Kobe Bryant foi o jogador da NBA que mais ganhou em 2015-2016.
| ← Capítulo 3.3 – Chamadas | Capítulo 4 – Tipos de Dados → |
