Compartilhe esta página

Aprenda X em Y Minutos

Onde X=Statistical Computing with Python

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.

# 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 Programação Probabilística e Métodos Bayesianos para Hackers.

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/


Sugestões ou correções? Abra uma issue no repositório do GitHub, ou faça um pull request você mesmo!

Originalmente contribuído por e99n09 e atualizado por 2 colaborador(es).