Capítulo 6.2
Í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 *
import numpy as np
path_data = '../../../assets/data/'
np.set_printoptions(threshold=50)
nba_salaries = Table.read_table(path_data + 'nba_salaries.csv')
nba = nba_salaries.relabeled("'15-'16 SALARY", 'SALARY')
Selecionando Linhas
Frequentemente, gostaríamos de extrair apenas aquelas linhas que correspondem a entradas com uma característica específica. Por exemplo, podemos querer apenas as linhas correspondentes aos Warriors, ou aos jogadores que ganharam mais de $10 milhões. Ou podemos querer apenas os cinco principais ganhadores.
Linhas Específicas
O método da Tabela take faz exatamente isso – ele pega um conjunto especificado de linhas. Seu argumento é um índice de linha ou uma matriz de índices, e ele cria uma nova tabela consistindo apenas dessas linhas.
Por exemplo, se quisermos apenas a primeira linha de nba, poderíamos usar take da seguinte forma.
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) | |||
nba.take(0)
| PLAYER | POSITION | TEAM | SALARY |
|---|---|---|---|
| Paul Millsap | PF | Atlanta Hawks | 18.6717 |
Esta é uma nova tabela com apenas a única linha que especificamos.
Também poderíamos obter a quarta, quinta e sexta linhas especificando um intervalo de índices como argumento.
nba.take(np.arange(3, 6))
| PLAYER | POSITION | TEAM | SALARY |
|---|---|---|---|
| Jeff Teague | PG | Atlanta Hawks | 8 |
| Kyle Korver | SG | Atlanta Hawks | 5.74648 |
| Thabo Sefolosha | SF | Atlanta Hawks | 4 |
Se quisermos uma tabela dos 5 jogadores mais bem pagos, podemos primeiro ordenar a lista por salário e depois take as primeiras cinco linhas:
nba.sort('SALARY', descending=True).take(np.arange(5))
| 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 |
Linhas Correspondentes a uma Característica Específica
Com mais frequência, queremos acessar dados em um conjunto de linhas que possuem uma determinada característica, mas cujos índices não conhecemos antecipadamente. Por exemplo, podemos querer dados sobre todos os jogadores que ganharam mais de $10 milhões, mas não queremos gastar tempo contando as linhas na tabela classificada.
O método where faz o trabalho para nós. Sua saída é uma tabela com as mesmas colunas que o original, mas apenas as linhas onde a característica ocorre.
O primeiro argumento de where é o rótulo da coluna que contém as informações sobre se uma linha tem ou não a característica que queremos. Se a característica for “ganhou mais de $10 milhões”, a coluna é SALARY.
O segundo argumento de where é uma maneira de especificar a característica. Alguns exemplos tornarão mais fácil entender o método geral de especificação.
No primeiro exemplo, extraímos os dados de todos aqueles que ganharam mais de $10 milhões.
nba.where('SALARY', are.above(10))
| PLAYER | POSITION | TEAM | SALARY |
|---|---|---|---|
| Paul Millsap | PF | Atlanta Hawks | 18.6717 |
| Al Horford | C | Atlanta Hawks | 12 |
| Joe Johnson | SF | Brooklyn Nets | 24.8949 |
| Thaddeus Young | PF | Brooklyn Nets | 11.236 |
| Al Jefferson | C | Charlotte Hornets | 13.5 |
| Nicolas Batum | SG | Charlotte Hornets | 13.1253 |
| Kemba Walker | PG | Charlotte Hornets | 12 |
| Derrick Rose | PG | Chicago Bulls | 20.0931 |
| Jimmy Butler | SG | Chicago Bulls | 16.4075 |
| Joakim Noah | C | Chicago Bulls | 13.4 |
| … (59 rows omitted) | |||
O uso do argumento are.above(10) garantiu que cada linha selecionada tivesse um valor de SALARY maior que 10.
Existem 69 linhas na nova tabela, correspondentes aos 69 jogadores que ganharam mais de $10 milhões de dólares. Organizar essas linhas em ordem torna os dados mais fáceis de analisar. DeMar DeRozan do Toronto Raptors foi o “mais pobre” deste grupo, com um salário um pouco superior a $10 milhões de dólares.
nba.where('SALARY', are.above(10)).sort('SALARY')
| PLAYER | POSITION | TEAM | SALARY |
|---|---|---|---|
| DeMar DeRozan | SG | Toronto Raptors | 10.05 |
| Gerald Wallace | SF | Philadelphia 76ers | 10.1059 |
| Luol Deng | SF | Miami Heat | 10.1516 |
| Monta Ellis | SG | Indiana Pacers | 10.3 |
| Wilson Chandler | SF | Denver Nuggets | 10.4494 |
| Brendan Haywood | C | Cleveland Cavaliers | 10.5225 |
| Jrue Holiday | PG | New Orleans Pelicans | 10.5955 |
| Tyreke Evans | SG | New Orleans Pelicans | 10.7346 |
| Marcin Gortat | C | Washington Wizards | 11.2174 |
| Thaddeus Young | PF | Brooklyn Nets | 11.236 |
| … (59 rows omitted) | |||
Quanto ganhou Stephen Curry? Para responder, temos que acessar a linha onde o valor de PLAYER é igual a Stephen Curry. É colocada uma tabela composta por apenas uma linha:
nba.where('PLAYER', are.equal_to('Stephen Curry'))
| PLAYER | POSITION | TEAM | SALARY |
|---|---|---|---|
| Stephen Curry | PG | Golden State Warriors | 11.3708 |
Curry ganhou pouco menos de $11.4 milhões de dólares. Isso é muito dinheiro, mas é menos da metade do salário de LeBron James. Você encontrará esse salário na tabela “Top 5” mais cedo nesta seção, ou poderia encontrá-lo substituindo 'Stephen Curry' por 'LeBron James' na linha de código acima.
No código, are é usado novamente, mas desta vez com o predicado equal_to em vez de above. Assim, por exemplo, você pode obter uma tabela de todos os Warriors:
nba.where('TEAM', are.equal_to('Golden State 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 |
Essa parte da tabela já está ordenada por salário, porque a tabela original listava os jogadores ordenados por salário dentro do mesmo time. O .show() no final da linha garante que todas as linhas sejam mostradas, não apenas as primeiras 10.
É tão comum solicitar as linhas para as quais alguma coluna é igual a algum valor que a chamada are.equal_to é opcional. Em vez disso, o método where pode ser chamado apenas com o nome de uma coluna e um valor para alcançar o mesmo efeito.
nba.where('TEAM', 'Denver Nuggets') # equivalent to nba.where('TEAM', are.equal_to('Denver Nuggets'))
| PLAYER | POSITION | TEAM | SALARY |
|---|---|---|---|
| Danilo Gallinari | SF | Denver Nuggets | 14 |
| Kenneth Faried | PF | Denver Nuggets | 11.236 |
| Wilson Chandler | SF | Denver Nuggets | 10.4494 |
| JJ Hickson | C | Denver Nuggets | 5.6135 |
| Jameer Nelson | PG | Denver Nuggets | 4.345 |
| Will Barton | SF | Denver Nuggets | 3.53333 |
| Emmanuel Mudiay | PG | Denver Nuggets | 3.10224 |
| Darrell Arthur | PF | Denver Nuggets | 2.814 |
| Jusuf Nurkic | C | Denver Nuggets | 1.842 |
| Joffrey Lauvergne | C | Denver Nuggets | 1.70972 |
| … (4 rows omitted) | |||
Múltiplas Características
Você pode acessar linhas que têm várias características especificadas, usando o where repetidamente. Por exemplo, aqui está uma maneira de extrair todos os Armadores cujos salários eram superiores a $15 milhões de dólares.
nba.where('POSITION', 'PG').where('SALARY', are.above(15))
| PLAYER | POSITION | TEAM | SALARY |
|---|---|---|---|
| Derrick Rose | PG | Chicago Bulls | 20.0931 |
| Kyrie Irving | PG | Cleveland Cavaliers | 16.4075 |
| Chris Paul | PG | Los Angeles Clippers | 21.4687 |
| Russell Westbrook | PG | Oklahoma City Thunder | 16.7442 |
| John Wall | PG | Washington Wizards | 15.852 |
Forma Geral
Neste ponto, você já percebeu que a maneira geral de criar uma nova tabela selecionando linhas com uma determinada característica é usar where e are com a condição apropriada:
original_table_name.where(column_label_string, are.condition)
nba.where('SALARY', are.between(10, 10.3))
| PLAYER | POSITION | TEAM | SALARY |
|---|---|---|---|
| Luol Deng | SF | Miami Heat | 10.1516 |
| Gerald Wallace | SF | Philadelphia 76ers | 10.1059 |
| Danny Green | SG | San Antonio Spurs | 10 |
| DeMar DeRozan | SG | Toronto Raptors | 10.05 |
Observe que a tabela acima inclui Danny Green, que ganhou $10 milhões, mas não Monta Ellis, que ganhou $10.3 milhões. Como em outras partes do Python, o intervalo between inclui o extremo esquerdo, mas não o direito.
Se especificarmos uma condição que não seja satisfeita por nenhuma linha, obteremos uma tabela com rótulos de coluna, mas sem linhas.
nba.where('PLAYER', are.equal_to('Barack Obama'))
| PLAYER | POSITION | TEAM | SALARY |
|---|
Algumas Condições Adicionais
Aqui estão alguns predicados de are que você pode achar úteis. Observe que x e y são números, STRING é uma string e Z é ou um número ou uma string; você deve especificar isso dependendo da característica que você deseja.
| Predicado | Descrição |
|---|---|
are.equal_to(Z) |
Igual a Z |
are.above(x) |
Maior que x |
are.above_or_equal_to(x) |
Maior que ou igual a x |
are.below(x) |
Menor que x |
are.below_or_equal_to(x) |
Menor que ou igual a x |
are.between(x, y) |
Maior que ou igual a x, e menor que y |
are.strictly_between(x, y) |
Maior que x e menor que y |
are.between_or_equal_to(x, y) |
Maior que ou igual a x, e menor que ou igual a y |
are.containing(S) |
Contém a string S |
Você também pode especificar a negação de qualquer uma dessas condições, usando .not_ antes da condição:
| Predicado | Descrição |
|---|---|
are.not_equal_to(Z) |
Não igual a Z |
are.not_above(x) |
Não acima de x |
… e assim por diante. As regras habituais da lógica se aplicam – por exemplo, “não acima de x” é o mesmo que “abaixo ou igual a x”.
Encerramos a seção com uma série de exemplos.
O uso de are.containing pode ajudar a economizar digitação. Por exemplo, você pode simplesmente especificar Warriors em vez de Golden State Warriors:
nba.where('TEAM', are.containing('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 |
Você pode extrair dados de todos os guardas, tanto guardas de ponta quanto guardas de tiro:
nba.where('POSITION', are.containing('G'))
| PLAYER | POSITION | TEAM | SALARY |
|---|---|---|---|
| Jeff Teague | PG | Atlanta Hawks | 8 |
| Kyle Korver | SG | Atlanta Hawks | 5.74648 |
| Dennis Schroder | PG | Atlanta Hawks | 1.7634 |
| Tim Hardaway Jr. | SG | Atlanta Hawks | 1.30452 |
| Jason Richardson | SG | Atlanta Hawks | 0.947276 |
| Lamar Patterson | SG | Atlanta Hawks | 0.525093 |
| Terran Petteway | SG | Atlanta Hawks | 0.525093 |
| Avery Bradley | PG | Boston Celtics | 7.73034 |
| Isaiah Thomas | PG | Boston Celtics | 6.91287 |
| Marcus Smart | PG | Boston Celtics | 3.43104 |
| … (171 rows omitted) | |||
Você pode pegar todos os jogadores que não eram Cleveland Cavaliers e tinham um salário não inferior a $20 milhões:
other_than_Cavs = nba.where('TEAM', are.not_equal_to('Cleveland Cavaliers'))
other_than_Cavs.where('SALARY', are.not_below(20))
| PLAYER | POSITION | TEAM | SALARY |
|---|---|---|---|
| Joe Johnson | SF | Brooklyn Nets | 24.8949 |
| Derrick Rose | PG | Chicago Bulls | 20.0931 |
| Dwight Howard | C | Houston Rockets | 22.3594 |
| Chris Paul | PG | Los Angeles Clippers | 21.4687 |
| Kobe Bryant | SF | Los Angeles Lakers | 25 |
| Chris Bosh | PF | Miami Heat | 22.1927 |
| Dwyane Wade | SG | Miami Heat | 20 |
| Carmelo Anthony | SF | New York Knicks | 22.875 |
| Kevin Durant | SF | Oklahoma City Thunder | 20.1586 |
A mesma tabela pode ser criada de várias maneiras. Aqui está outra, e sem dúvida você pode pensar em mais.
other_than_Cavs.where('SALARY', are.above_or_equal_to(20))
| PLAYER | POSITION | TEAM | SALARY |
|---|---|---|---|
| Joe Johnson | SF | Brooklyn Nets | 24.8949 |
| Derrick Rose | PG | Chicago Bulls | 20.0931 |
| Dwight Howard | C | Houston Rockets | 22.3594 |
| Chris Paul | PG | Los Angeles Clippers | 21.4687 |
| Kobe Bryant | SF | Los Angeles Lakers | 25 |
| Chris Bosh | PF | Miami Heat | 22.1927 |
| Dwyane Wade | SG | Miami Heat | 20 |
| Carmelo Anthony | SF | New York Knicks | 22.875 |
| Kevin Durant | SF | Oklahoma City Thunder | 20.1586 |
Como você pode ver, o uso de where com are lhe dá grande flexibilidade para acessar linhas com recursos que lhe interessam. Não hesite em experimentar!
| ← Capítulo 6.1 – Ordenando Linhas | Capítulo 6.3 – Exemplo: Tendências Populacionais → |
