Abstract
This is an undergrad student level instruction for class use.This work is licensed under the Creative Commons Attribution-ShareAlike 4.0 International License. To view a copy of this license, visit http://creativecommons.org/licenses/by-sa/4.0/ or send a letter to Creative Commons, PO Box 1866, Mountain View, CA 94042, USA.
License: CC BY-SA 4.0
Sugestão de citação: FIGUEIREDO, Adriano Marcos Rodrigues. Python no RStudio. Campo Grande-MS,Brasil: RStudio/Rpubs, 2020. Disponível em http://rpubs.com/amrofi/python_rstudio.
Por que usaria o Python no RStudio?
As vezes alguém precisará utilizar o Python em algum procedimento e prefira realizá-lo por meio do RStudio (por exemplo por ter maior familiaridade com o RStudio e o RMarkdown). Ou não queira por algum motivo usar outras ferramentas tipo Jupyter ou PyCharm ou Spyder, comuns em aplicações para o Python.
Farei um uso misto entre R e Python neste RMarkdown. Esta aplicação usa o dataset (parte do pacote AER
, data("CollegeDistance")
) o qual contém dados de seção transversal da pesquisa High School and Beyond, realizada pelo Departamento de Educação em 1980, com acompanhamento em 1986. A pesquisa incluiu estudantes de aproximadamente 1.100 escolas secundárias. São dados contendo 4.739 observações em 14 variáveis - detalhes em https://rdrr.io/cran/AER/man/CollegeDistance.html. Portanto, inicio obtendo os dados pelo R, farei um modelo para comparação com a função lm
e depois farei o mesmo pelo Python.
Detalhamento do dataset CollegeDistance
do pacote AER. Fonte: https://rdrr.io/cran/AER/man/CollegeDistance.html
# ver em
suppressMessages(suppressWarnings(library(AER)))
data("CollegeDistance")
cd.d <- CollegeDistance
reg1 <- lm(education ~ score + unemp + wage + distance, data = cd.d)
summary(reg1)
Call:
lm(formula = education ~ score + unemp + wage + distance, data = cd.d)
Residuals:
Min 1Q Median 3Q Max
-3.7295 -1.1892 -0.2394 1.2238 5.4598
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 9.377593 0.203510 46.079 < 2e-16 ***
score 0.095719 0.002663 35.949 < 2e-16 ***
unemp 0.017818 0.009048 1.969 0.04899 *
wage -0.050365 0.017924 -2.810 0.00498 **
distance -0.054219 0.010498 -5.165 2.5e-07 ***
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Residual standard error: 1.579 on 4734 degrees of freedom
Multiple R-squared: 0.2218, Adjusted R-squared: 0.2211
F-statistic: 337.2 on 4 and 4734 DF, p-value: < 2.2e-16
# vou exportar o dataset do R para Excel
writexl::write_xlsx(cd.d, "cd.d.xlsx")
Agora farei com o Python chamando o pacote reticulate
.
Primeiro instale e carregue o pacote reticulate
. Esta rotina estará baseada em Deepanshu Bhalla (2018): https://www.r-bloggers.com/run-python-from-r/.
# chunk em R Instalação do `reticulate`
if (!require(reticulate)) {
install.packages("reticulate")
library(reticulate)
}
use_python("/usr/local/bin/python")
os <- import("os")
os$listdir(".")
[1] ".RData" ".Rhistory" ".Rproj.user"
[4] "cd.d.xlsx" "fig1.jpg" "regressao_python.html"
[7] "regressao_python.Rmd" "regressao_python.Rproj" "regressao_python_cache"
# Checar a existência do Python em seu sistema
py_available()
[1] TRUE
# chunk em python
import os
import numpy as np
import pandas as pd
import statsmodels.api as sm
import statsmodels as st
Agora carregue os pacotes numpy
e pandas
:
# chunk em R
numpy <- import("numpy")
pd <- import("pandas")
st <- import("statsmodels")
sm <- import("statsmodels.api")
Faremos algumas operações com o numpy
:
# chunk em R matriz 2x2
y <- array(1:4, c(2, 2))
x <- numpy$array(y)
# transposta de x
numpy$transpose(x)
[,1] [,2]
[1,] 1 2
[2,] 3 4
# Eigenvalues e eigen vectors
numpy$linalg$eig(x)
[[1]]
[1] -0.3722813 5.3722813
[[2]]
[,1] [,2]
[1,] -0.9093767 -0.5657675
[2,] 0.4159736 -0.8245648
# Raiz quadrada e exponencial de x observe que nesse caso ele faz célula a célula
# da matriz
numpy$sqrt(x)
[,1] [,2]
[1,] 1.000000 1.732051
[2,] 1.414214 2.000000
numpy$exp(x)
[,1] [,2]
[1,] 2.718282 20.08554
[2,] 7.389056 54.59815
# Load Python packages
# chunk em Python
import numpy as np
import pandas as pd
import statsmodels.api as sm
import statsmodels as st
# Importing Dataset
dados = pd.read_excel("cd.d.xlsx")
# Number of rows and columns
dados.shape
# selecionar as 5 primeiras linhas do dataset para checar
(4739, 14)
dados.head(n = 5)
# Group By
gender ethnicity score fcollege ... tuition education income region
0 male other 39.150002 yes ... 0.88915 12 high other
1 female other 48.869999 no ... 0.88915 12 low other
2 male other 48.740002 no ... 0.88915 12 low other
3 male afam 40.400002 no ... 0.88915 12 low other
4 female other 40.480000 no ... 0.88915 13 low other
[5 rows x 14 columns]
dados.groupby("gender").mean()
# Filter
score unemp wage distance tuition education
gender
female 50.256335 7.668346 9.467362 1.810038 0.811829 13.791923
male 51.658083 7.510753 9.540795 1.794156 0.817986 13.827022
t = dados.loc[(dados.score >= 65) & (dados.education >= 17),:]
Muito bem, agora vamos rodar a regressão que fizemos pelo R (reg1
), mas agora pelo Python em um chunk de R usando o reticulate.
# chunk em Python
# Load Pandas package
import pandas as pd
# Importing Dataset
dados = pd.read_excel("cd.d.xlsx")
df = pd.DataFrame(dados,columns=['score','unemp','wage','distance','education'])
X = df[['score','unemp','wage','distance']] # 4 variaveis para regressao multipla
X = sm.add_constant(X)
Y = df['education']
import statsmodels as st
import statsmodels.api as sm
mod1 = sm.OLS(df['education'], X)
res = mod1.fit()
print(res.summary())
OLS Regression Results
==============================================================================
Dep. Variable: education R-squared: 0.222
Model: OLS Adj. R-squared: 0.221
Method: Least Squares F-statistic: 337.2
Date: Sat, 22 Aug 2020 Prob (F-statistic): 9.94e-256
Time: 19:02:12 Log-Likelihood: -8886.5
No. Observations: 4739 AIC: 1.778e+04
Df Residuals: 4734 BIC: 1.782e+04
Df Model: 4
Covariance Type: nonrobust
==============================================================================
coef std err t P>|t| [0.025 0.975]
------------------------------------------------------------------------------
const 9.3776 0.204 46.079 0.000 8.979 9.777
score 0.0957 0.003 35.949 0.000 0.090 0.101
unemp 0.0178 0.009 1.969 0.049 7.9e-05 0.036
wage -0.0504 0.018 -2.810 0.005 -0.086 -0.015
distance -0.0542 0.010 -5.165 0.000 -0.075 -0.034
==============================================================================
Omnibus: 175.689 Durbin-Watson: 1.897
Prob(Omnibus): 0.000 Jarque-Bera (JB): 125.836
Skew: 0.296 Prob(JB): 4.73e-28
Kurtosis: 2.464 Cond. No. 472.
==============================================================================
Warnings:
[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.
Chamarei o chunk em R mas executarei os comandos de regressão do Python para Y~X sendo que criarei as matrizes Y e X antes de rodar o modelo.
# chunk em R
numpy <- import("numpy")
pd <- import("pandas")
st <- import("statsmodels")
sm <- import("statsmodels.api")
# Fit and summarize OLS model
dados = pd$read_excel("cd.d.xlsx")
# regressores
attach(dados)
X = dados[, c("score", "unemp", "wage", "distance")]
X = sm$add_constant(X)
# regressando
Y = dados[, "education"]
mod1 = sm$OLS(Y, X)
res = mod1$fit()
print(res$summary())
OLS Regression Results
==============================================================================
Dep. Variable: y R-squared: 0.222
Model: OLS Adj. R-squared: 0.221
Method: Least Squares F-statistic: 337.2
Date: Sat, 22 Aug 2020 Prob (F-statistic): 9.94e-256
Time: 19:02:13 Log-Likelihood: -8886.5
No. Observations: 4739 AIC: 1.778e+04
Df Residuals: 4734 BIC: 1.782e+04
Df Model: 4
Covariance Type: nonrobust
==============================================================================
coef std err t P>|t| [0.025 0.975]
------------------------------------------------------------------------------
const 9.3776 0.204 46.079 0.000 8.979 9.777
score 0.0957 0.003 35.949 0.000 0.090 0.101
unemp 0.0178 0.009 1.969 0.049 7.9e-05 0.036
wage -0.0504 0.018 -2.810 0.005 -0.086 -0.015
distance -0.0542 0.010 -5.165 0.000 -0.075 -0.034
==============================================================================
Omnibus: 175.689 Durbin-Watson: 1.897
Prob(Omnibus): 0.000 Jarque-Bera (JB): 125.836
Skew: 0.296 Prob(JB): 4.73e-28
Kurtosis: 2.464 Cond. No. 472.
==============================================================================
Warnings:
[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.
É possível criar um console temporário do Python dentro da sessão R. Os objetos criados no Python estarão disponíveis na sessão R assim como os objetos do R para o Python. Utilizando a função repl_python()
ela ficará interativa. Ver abaixo. A função exit
é para retornar e fechar o console Python.
# chunk em R
# não rodei, pois a ideia é que execute esses códigos no console digitando diretamente
repl_python()
# Load Pandas package
import pandas as pd
# Importing Dataset
dados = pd.read_excel("cd.d.xlsx")
# Number of rows and columns
dados.shape
# Select random no. of rows
dados.sample(n = 10)
# Group By
dados.groupby("gender").mean()
# Filter
t = dados.loc[(dados.score >= 65) & (dados.education >= 17),:]
# Return to R
exit
Allaire,JJ; Ushey, Kevin; Tang, Yuan. reticulate: Interface to ‘Python’. R package version 1.11.1. 2019. Disponível em: https://CRAN.R-project.org/package=reticulate.
Bhalla, Deepanshu. Run Python from R. 2018. Disponível em: https://www.r-bloggers.com/run-python-from-r/.
Schwendinger, Florian. PythonInR: Use ‘Python’ from Within ‘R’. R package version 0.1-6. 2018. Disponível em: https://CRAN.R-project.org/package=PythonInR.