summaryrefslogtreecommitdiffhomepage
path: root/pt-br/pythonstatcomp-pt.html.markdown
blob: bf6412235b86e1c10f8f5663ed80c941db06d20a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
---
category: tool
tool: Statistical Computing with Python
contributors:
    - ["e99n09", "https://github.com/e99n09"]
translators:
    - ["waltercjunior", "https://github.com/waltercjunior"]
filename: pythonstatcomp-pt.py
lang: pt-br
---

Este é um tutorial sobre como fazer algumas tarefas típicas de programação estatística usando Python.
É destinado basicamente à pessoas familizarizadas com Python e experientes com programação estatística em linguagens como R,
Stata, SAS, SPSS ou MATLAB.

```python
# 0. Preparando-se ====

"""  Para começar, instale o seguinte : jupyther, numpy, scipy, pandas, 
    matplotlib, seaborn, requests.
    Certifique-se de executar este tutorial utilizando o Jupyther notebook para
    que você utilize os gráficos embarcados e ter uma fácil consulta à 
    documentação.
    O comando para abrir é simplesmente '`jupyter notebook`, quando abrir então
    clique em 'New -> Python'.
"""

# 1. Aquisição de dados ====

""" A única razão das pessoas optarem por Python no lugar de R é que pretendem
    interagir com o ambiente web, copiando páginas diretamente ou solicitando
    dados utilizando uma API. Você pode fazer estas coisas em R, mas no 
    contexto de um projeto já usando Python, há uma vantagem em se ater uma
    linguágem única.
"""

import requests  # para requisições HTTP (web scraping, APIs)
import os

# web scraping
r = requests.get("https://github.com/adambard/learnxinyminutes-docs")
r.status_code  # se retornou código 200, a requisição foi bem sucedida
r.text  # código fonte bruto da página
print(r.text)  # formatado bonitinho
# salve a o código fonte d apágina em um arquivo:
os.getcwd()  # verifique qual é o diretório de trabalho
with open("learnxinyminutes.html", "wb") as f:
    f.write(r.text.encode("UTF-8"))

# Baixar um arquivo csv
fp = "https://raw.githubusercontent.com/adambard/learnxinyminutes-docs/master/"
fn = "pets.csv"
r = requests.get(fp + fn)
print(r.text)
with open(fn, "wb") as f:
    f.write(r.text.encode("UTF-8"))

""" para mais informações sobre o módulo de solicitações, incluindo API's, veja em
    http://docs.python-requests.org/en/latest/user/quickstart/
"""

# 2. Lendo um arquivo formato CSV ====

""" Um pacote de pandas da Wes McKinney lhe dá um objeto 'DataFrame' em Python.
    Se você já usou R, já deve estar familiarizado com a ideia de "data.frame".
"""

import pandas as pd
import numpy as np
import scipy as sp
pets = pd.read_csv(fn)
pets
#        name  age  weight species
# 0    fluffy    3      14     cat
# 1  vesuvius    6      23    fish
# 2       rex    5      34     dog

""" Usuários R: observe que o Python, como a maioria das linguagens de programação 
    influenciada pelo C, a indexação começa de 0. Em R, começa a indexar em 1
    devido à influência do Fortran.
"""

# duas maneiras diferentes de imprimir uma coluna
pets.age
pets["age"]

pets.head(2)  # imprima as 2 primeiras linhas
pets.tail(1)  # imprima a última linha

pets.name[1]  # 'vesuvius'
pets.species[0]  # 'cat'
pets["weight"][2]  # 34

# Em R, você esperaria obter 3 linhas fazendo isso, mas aqui você obtem 2:
pets.age[0:2]
# 0    3
# 1    6

sum(pets.age) * 2  # 28
max(pets.weight) - min(pets.weight)  # 20

""" Se você está fazendo alguma álgebra linear séria e processamento de 
    números você pode desejar apenas arrays, não DataFrames. DataFrames são
    ideais para combinar colunas de diferentes tipos de dados.
"""

# 3. Gráficos ====

import matplotlib as mpl
import matplotlib.pyplot as plt
%matplotlib inline

# Para fazer a visualiação de dados em Python, use matplotlib

plt.hist(pets.age);

plt.boxplot(pets.weight);

plt.scatter(pets.age, pets.weight)
plt.xlabel("age")
plt.ylabel("weight");

# seaborn utiliza a biblioteca do matplotlib e torna os enredos mais bonitos

import seaborn as sns

plt.scatter(pets.age, pets.weight)
plt.xlabel("age")
plt.ylabel("weight");

# também existem algumas funções de plotagem específicas do seaborn
# observe como o seaborn automaticamenteo o eixto x neste gráfico de barras
sns.barplot(pets["age"])

# Veteranos em R ainda podem usar o ggplot
from ggplot import *
ggplot(aes(x="age",y="weight"), data=pets) + geom_point() + labs(title="pets")
# fonte: https://pypi.python.org/pypi/ggplot

# há até um d3.js veja em: https://github.com/mikedewar/d3py

# 4. Limpeza de dados simples e análise exploratória ====

""" Aqui está um exemplo mais complicado que demonstra dados básicos
    fluxo de trabalho de limpeza levando à criação de algumas parcelas
    e a execução de uma regressão linear.
        O conjunto de dados foi transcrito da Wikipedia à mão. Contém
    todos os sagrados imperadores romanos e os marcos importantes em suas vidas
    (birth, death, coronation, etc.).
        O objetivo da análise será explorar se um relacionamento existe
    entre o ano de nascimento (birth year) e a expectativa de vida (lifespam)
    do imperador.
    Fonte de dados: https://en.wikipedia.org/wiki/Holy_Roman_Emperor
"""

# carregue alguns dados dos sagrados imperadores romanos
url = "https://raw.githubusercontent.com/adambard/learnxinyminutes-docs/master/hre.csv"
r = requests.get(url)
fp = "hre.csv"
with open(fp, "wb") as f:
    f.write(r.text.encode("UTF-8"))

hre = pd.read_csv(fp)

hre.head()
"""
   Ix      Dynasty        Name        Birth             Death
0 NaN  Carolingian   Charles I  2 April 742    28 January 814
1 NaN  Carolingian     Louis I          778       20 June 840
2 NaN  Carolingian   Lothair I          795  29 September 855
3 NaN  Carolingian    Louis II          825     12 August 875
4 NaN  Carolingian  Charles II  13 June 823     6 October 877

       Coronation 1   Coronation 2 Ceased to be Emperor
0   25 December 800            NaN       28 January 814
1  11 September 813  5 October 816          20 June 840
2       5 April 823            NaN     29 September 855
3        Easter 850     18 May 872        12 August 875
4   29 December 875            NaN        6 October 877
"""

# limpar as colunas Birth e Death

import re  # módulo para expressões regulares

rx = re.compile(r'\d+$')  # conincidir com os códigos finais

""" Esta função aplia a expressão reguar a uma coluna de entrada (here Birth,
    Death), nivela a lista resultante, converte-a em uma lista de objetos, e
    finalmente converte o tipo do objeto da lista de String para inteiro. para
    mais informações sobre o que as diferentes partes do código fazer, veja em:
      - https://docs.python.org/2/howto/regex.html
      - http://stackoverflow.com/questions/11860476/how-to-unlist-a-python-list
      - http://pandas.pydata.org/pandas-docs/stable/generated/pandas.Series.html
"""

from functools import reduce

def extractYear(v):
    return(pd.Series(reduce(lambda x, y: x + y, map(rx.findall, v), [])).astype(int))

hre["BirthY"] = extractYear(hre.Birth)
hre["DeathY"] = extractYear(hre.Death)

# faça uma coluna infomrnado a idade estimada ("EstAge")
hre["EstAge"] = hre.DeathY.astype(int) - hre.BirthY.astype(int)

# gráfico de dispersão simples, sem linha de tendência, cor representa dinastia
sns.lmplot("BirthY", "EstAge", data=hre, hue="Dynasty", fit_reg=False)

# use o scipy para executar uma regrassão linear
from scipy import stats
(slope, intercept, rval, pval, stderr) = stats.linregress(hre.BirthY, hre.EstAge)
# código fonte: http://wiki.scipy.org/Cookbook/LinearRegression

# varifique o declive (slope)
slope  # 0.0057672618839073328

# varifique o valor R^2:
rval**2  # 0.020363950027333586

# varifique o valor p-value
pval  # 0.34971812581498452

# use o seaborn para fazer um gráfico de dispersão e traçar a linha de tendência de regrassão linear
sns.lmplot("BirthY", "EstAge", data=hre)

""" Para mais informações sobre o seaborn, veja
      - http://web.stanford.edu/~mwaskom/software/seaborn/
      - https://github.com/mwaskom/seaborn
    Para mais informações sobre o SciPy, veja
      - http://wiki.scipy.org/SciPy
      - http://wiki.scipy.org/Cookbook/
    Para ver uma versão da análise dos sagrados imperadores romanos usando R, consulte
      - http://github.com/e99n09/R-notes/blob/master/holy_roman_emperors_dates.R
"""
```

Se você quiser saber mais, obtenha o Python para análise de dados de Wes McKinney. É um excelente recurso e usei-o como referência ao escrever este tutorial.

Você também pode encontrar muitos tutoriais interativos de IPython sobre assuntos específicos de seus interesses, como Cam Davidson-Pilon's <a href="http://camdavidsonpilon.github.io/Probabilistic-Programming-and-Bayesian-Methods-for-Hackers/" Title="Programação Probabilística e Métodos Bayesianos para Hackers">Programação Probabilística e Métodos Bayesianos para Hackers</a>.

Mais alguns módulos para pesquisar:
   - análise de texto e processamento de linguagem natural: nltk, http://www.nltk.org
   - análise de rede social: igraph, http://igraph.org/python/