Capítulo 9
Í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
import matplotlib
matplotlib.use('Agg')
%matplotlib inline
import matplotlib.pyplot as plots
plots.style.use('fivethirtyeight')
Aleatoriedade
Nos capítulos anteriores, desenvolvemos habilidades necessárias para fazer descrições perspicazes de dados. Cientistas de dados também precisam ser capazes de entender a aleatoriedade. Por exemplo, eles precisam ser capazes de atribuir indivíduos a grupos de tratamento e controle aleatoriamente e, em seguida, tentar dizer se quaisquer diferenças observadas nos resultados dos dois grupos são simplesmente devido à atribuição aleatória ou genuinamente devido ao tratamento.
Neste capítulo, começamos nossa análise da aleatoriedade. Para começar, usaremos Python para fazer escolhas aleatórias. No numpy, há um sub-módulo chamado random que contém muitas funções que envolvem seleção aleatória. Uma dessas funções é chamada choice. Ela escolhe um item aleatoriamente de um array, e é igualmente provável escolher qualquer um dos itens. A chamada da função é np.random.choice(array_name), onde array_name é o nome do array de onde se fará a escolha.
Assim, o código a seguir avalia treatment com 50% de chance e control com 50% de chance.
two_groups = make_array('treatment', 'control')
np.random.choice(two_groups)
| Out[1]: | ‘treatment’ |
A grande diferença entre o código acima e todo o outro código que executamos até agora é que o código acima não sempre retorna o mesmo valor. Ele pode retornar treatment ou control, e não sabemos de antemão qual ele escolherá. Podemos repetir o processo fornecendo um segundo argumento, o número de vezes para repetir o processo.
np.random.choice(two_groups, 10)
| Out[2]: | array([‘control’, ‘control’, ‘treatment’, ‘treatment’, ‘control’, ‘control’, ‘control’, ‘control’, ‘control’, ‘control’], dtype=’ <U9 ‘) |
Uma questão fundamental sobre eventos aleatórios é se eles ocorrem ou não. Por exemplo:
- Um indivíduo foi designado para o grupo de tratamento ou não?
- Um jogador vai ganhar dinheiro ou não?
- Uma pesquisa fez uma previsão precisa ou não?
Uma vez que o evento ocorreu, você pode responder “sim” ou “não” a todas essas perguntas. Em programação, é convencional fazer isso rotulando declarações como True ou False. Por exemplo, se um indivíduo foi designado para o grupo de tratamento, então a declaração “O indivíduo foi designado para o grupo de tratamento” seria True. Caso contrário, seria False.
Booleans e Comparação
Em Python, valores Booleanos, nomeados em homenagem ao lógico George Boole, representam a verdade e assumem apenas dois valores possíveis: True e False. Quer os problemas envolvam aleatoriedade ou não, os valores Booleanos surgem mais frequentemente de operadores de comparação. Python inclui uma variedade de operadores que comparam valores. Por exemplo, 3 é maior que 1 + 1.
3 > 1 + 1
| Out[3]: | True |
O valor True indica que a comparação é válida; Python confirmou esse simples fato sobre a relação entre 3 e 1+1. O conjunto completo de operadores de comparação comuns está listado abaixo.
| Comparação | Operador | Exemplo True | Exemplo False |
|---|---|---|---|
| Menor que | < | 2 < 3 | 2 < 2 |
| Maior que | > | 3 > 2 | 3 > 3 |
| Menor ou igual | <= | 2 <= 2 | 3 <= 2 |
| Maior ou igual | >= | 3 >= 3 | 2 >= 3 |
| Igual | == | 3 == 3 | 3 == 2 |
| Diferente | != | 3 != 2 | 2 != 2 |
Note os dois sinais de igual == na comparação para determinar a igualdade. Isso é necessário porque Python já usa = para significar atribuição a um nome, como vimos. Não pode usar o mesmo símbolo para um propósito diferente. Portanto, se você quiser verificar se 5 é igual a 10/2, precisa ser cuidadoso: 5 = 10/2 retorna uma mensagem de erro porque Python assume que você está tentando atribuir o valor da expressão 10/2 a um nome que é o numeral 5. Em vez disso, você deve usar 5 == 10/2, que avalia para True.
5 = 10/2
| Out[4]: | File ” <ipython-input-5-e8c755f5e450>”, line 1 5 = 10/2 ^ SyntaxError: can’t assign to literal |
5 == 10/2
| Out[5]: | True |
Uma expressão pode conter várias comparações, e todas elas devem ser verdadeiras para que a expressão inteira seja True. Por exemplo, podemos expressar que 1+1 está entre 1 e 3 usando a seguinte expressão.
1 < 1 + 1 < 3
| Out[6]: | True |
A média de dois números está sempre entre o número menor e o número maior. Expressamos essa relação para os números x e y abaixo. Você pode tentar valores diferentes de x e y para confirmar esta relação.
x = 12
y = 5
min(x, y) <= (x+y)/2 <= max(x, y)
| Out[7]: | True |
Comparando Strings
Strings também podem ser comparadas, e sua ordem é alfabética. Uma string mais curta é menor que uma string mais longa que começa com a string mais curta.
'Dog' > 'Catastrophe' > 'Cat'
| Out[8]: | True |
Vamos voltar à seleção aleatória. Lembre-se do array two_groups que consiste em apenas dois elementos, treatment e control. Para ver se um indivíduo designado aleatoriamente foi para o grupo de tratamento, você pode usar uma comparação:
np.random.choice(two_groups) == 'treatment'
| Out[9]: | True |
Como antes, a escolha aleatória não será sempre a mesma, então o resultado da comparação também não será sempre o mesmo. Dependerá se treatment ou control foi escolhido. Com qualquer célula que envolva seleção aleatória, é uma boa ideia executar a célula várias vezes para ter uma ideia da variabilidade no resultado.
Comparando um Array e um Valor
Lembre-se de que podemos realizar operações aritméticas em muitos números em um array de uma vez. Por exemplo, make_array(0, 5, 2)*2 é equivalente a make_array(0, 10, 4). De maneira semelhante, se compararmos um array e um valor, cada elemento do array será comparado a esse valor, e a comparação resultará em um array de Booleanos.
tosses = make_array('Tails', 'Heads', 'Tails', 'Heads', 'Heads')
tosses == 'Heads'
| Out[10]: | array([False, True, False, True, True]) |
O método numpy count_nonzero avalia o número de elementos diferentes de zero (ou seja, True) da matriz.
np.count_nonzero(tosses == 'Heads')
| Out[11]: | 3 |
| ← Capítulo 8.4 – Unindo Tabelas por Colunas | Capítulo 9.1 – Declarações Condicionais → |
