diff options
| -rw-r--r-- | pt-br/pythonstatcomp.html.markdown | 248 | 
1 files changed, 248 insertions, 0 deletions
| diff --git a/pt-br/pythonstatcomp.html.markdown b/pt-br/pythonstatcomp.html.markdown new file mode 100644 index 00000000..36659cb0 --- /dev/null +++ b/pt-br/pythonstatcomp.html.markdown @@ -0,0 +1,248 @@ +--- +category: tool +tool: Computação estatística com Python +contributors: +    - ["e99n09", "https://github.com/e99n09"] +translators: +    - ["waltercjunior", "https://github.com/waltercjunior"] +filename: pythonstatcomp-py.py +--- + +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/ | 
