Usando R nas Ciências Sociais
IFPB
Encontre esses slides em:
Transformar
Visualizar
Modelar
data.frame
Um tipo especial de objeto é o data.frame
:
data.frame
Um tipo especial de objeto é o data.frame
:
mpg cyl disp hp drat wt qsec vs am gear carb
Mazda RX4 21.0 6 160.0 110 3.90 2.620 16.46 0 1 4 4
Mazda RX4 Wag 21.0 6 160.0 110 3.90 2.875 17.02 0 1 4 4
Datsun 710 22.8 4 108.0 93 3.85 2.320 18.61 1 1 4 1
Hornet 4 Drive 21.4 6 258.0 110 3.08 3.215 19.44 1 0 3 1
Hornet Sportabout 18.7 8 360.0 175 3.15 3.440 17.02 0 0 3 2
Valiant 18.1 6 225.0 105 2.76 3.460 20.22 1 0 3 1
Duster 360 14.3 8 360.0 245 3.21 3.570 15.84 0 0 3 4
Merc 240D 24.4 4 146.7 62 3.69 3.190 20.00 1 0 4 2
Merc 230 22.8 4 140.8 95 3.92 3.150 22.90 1 0 4 2
Merc 280 19.2 6 167.6 123 3.92 3.440 18.30 1 0 4 4
Merc 280C 17.8 6 167.6 123 3.92 3.440 18.90 1 0 4 4
Merc 450SE 16.4 8 275.8 180 3.07 4.070 17.40 0 0 3 3
Merc 450SL 17.3 8 275.8 180 3.07 3.730 17.60 0 0 3 3
Merc 450SLC 15.2 8 275.8 180 3.07 3.780 18.00 0 0 3 3
Cadillac Fleetwood 10.4 8 472.0 205 2.93 5.250 17.98 0 0 3 4
Lincoln Continental 10.4 8 460.0 215 3.00 5.424 17.82 0 0 3 4
Chrysler Imperial 14.7 8 440.0 230 3.23 5.345 17.42 0 0 3 4
Fiat 128 32.4 4 78.7 66 4.08 2.200 19.47 1 1 4 1
Honda Civic 30.4 4 75.7 52 4.93 1.615 18.52 1 1 4 2
Toyota Corolla 33.9 4 71.1 65 4.22 1.835 19.90 1 1 4 1
Toyota Corona 21.5 4 120.1 97 3.70 2.465 20.01 1 0 3 1
Dodge Challenger 15.5 8 318.0 150 2.76 3.520 16.87 0 0 3 2
AMC Javelin 15.2 8 304.0 150 3.15 3.435 17.30 0 0 3 2
Camaro Z28 13.3 8 350.0 245 3.73 3.840 15.41 0 0 3 4
Pontiac Firebird 19.2 8 400.0 175 3.08 3.845 17.05 0 0 3 2
Fiat X1-9 27.3 4 79.0 66 4.08 1.935 18.90 1 1 4 1
Porsche 914-2 26.0 4 120.3 91 4.43 2.140 16.70 0 1 5 2
Lotus Europa 30.4 4 95.1 113 3.77 1.513 16.90 1 1 5 2
Ford Pantera L 15.8 8 351.0 264 4.22 3.170 14.50 0 1 5 4
Ferrari Dino 19.7 6 145.0 175 3.62 2.770 15.50 0 1 5 6
Maserati Bora 15.0 8 301.0 335 3.54 3.570 14.60 0 1 5 8
Volvo 142E 21.4 4 121.0 109 4.11 2.780 18.60 1 1 4 2
data.frame
data.frame
data.frame
Vamos trabalhar com dados no R no formato tidy
:
data.frame
Sugestão de fontes de dados:
Importando dados de consumo de energia usando a função read_csv()
:
Importando dados de consumo de energia usando a função read_csv()
:
Importando dados de consumo de energia usando a função read_csv()
:
# A tibble: 34,992 × 6
ano mes sigla_uf tipo_consumo numero_consumidores consumo
<dbl> <dbl> <chr> <chr> <dbl> <dbl>
1 2004 1 RO Total NA 112812
2 2004 1 AC Total NA 34840.
3 2004 1 AM Total NA 274773
4 2004 1 RR Total NA 31696.
5 2004 1 PA Total NA 1011353.
6 2004 1 AP Total NA 43084
7 2004 1 TO Total NA 65877.
8 2004 1 MA Total NA 737033.
9 2004 1 PI Total NA 131052
10 2004 1 CE Total NA 518714
# … with 34,982 more rows
dplyr
filter()
filtra apenas observações com valores específicos
arrange()
reordena as linhas da base
select()
seleciona apenas variáveis de interesse
mutate()
cria novas variáveis como função das demais
summarise()
cria estatísticas descritivas
filter
select()
mutate()
arrange()
summarise()
group_by()
“Apresentar dados com gráficos pode ajudar você a comunicar informações com clareza.”
ggplot2
ggplot2
Vamos criar nosso primeiro gráfico:
ggplot2
Vamos criar nosso primeiro gráfico:
ggplot2
Vamos criar nosso primeiro gráfico:
ggplot2
geom é o objeto geométrico que um gráfico usa para representar dados.
Gráficos de barras são construídos com geom_bar
.
Gráficos de linhas são construídos com geom_line
.
Assim, para mudar a geometria, só alterar o termo geom_*
.
geom_point()
geom_line()
geom_smooth()
geom_hist
geom_boxplot
geom_qq
geom_*
Dplyr
+ ggplot
facet_wrap
Uma lista (não exaustiva) de modelagem de dados que podem ser desenvolvidos nas ciências sociais:
# A tibble: 6 × 9
id salario idade mun_trab mun_res escolaridade sexo meso_trab semia…¹
<chr> <dbl> <dbl> <int> <int> <dbl> <dbl> <chr> <chr>
1 1 678 49 250375 250375 1 1 Sertão Paraib… S
2 2 1352. 36 251030 251030 1 1 Borborema S
3 3 2859. 39 251140 251140 1 1 Borborema S
4 4 1800. 46 251140 251140 1 1 Borborema S
5 5 712. 36 251140 251140 1 1 Borborema S
6 6 960. 41 251140 251140 1 1 Borborema S
# … with abbreviated variable name ¹semiarido_trab
id salario idade mun_trab
Length:865841 Min. : 203.4 Min. : 0.00 Min. :240810
Class :character 1st Qu.: 731.7 1st Qu.:27.00 1st Qu.:250400
Mode :character Median : 881.4 Median :34.00 Median :250750
Mean : 1422.8 Mean :36.37 Mean :250730
3rd Qu.: 1328.3 3rd Qu.:45.00 3rd Qu.:250750
Max. :81597.3 Max. :98.00 Max. :251740
mun_res escolaridade sexo meso_trab
Min. :250010 Min. : 1.000 Min. :1.000 Length:865841
1st Qu.:250400 1st Qu.: 5.000 1st Qu.:1.000 Class :character
Median :250750 Median : 7.000 Median :1.000 Mode :character
Mean :250731 Mean : 6.286 Mean :1.395
3rd Qu.:250750 3rd Qu.: 7.000 3rd Qu.:2.000
Max. :251740 Max. :11.000 Max. :2.000
semiarido_trab
Length:865841
Class :character
Mode :character
salario_pb |>
summarise(across(c(salario, idade, escolaridade),
list(media = ~ mean(., na.rm = TRUE),
mediana = ~ median(., na.rm = TRUE),
dp = ~ sd(., na.rm = TRUE)))) |>
pivot_longer(cols = everything(),
names_to = c("Variável", ".value"),
names_sep = "_") |>
rename("Média" = media,
"Mediana" = mediana,
"Desvio-Padrão" = dp) |>
knitr::kable()
Variável | Média | Mediana | Desvio-Padrão |
---|---|---|---|
salario | 1422.765775 | 881.4 | 1823.80258 |
idade | 36.374189 | 34.0 | 11.49324 |
escolaridade | 6.285835 | 7.0 | 1.99408 |
Calcular correlação pode ser executada com a função cor()
:
salario_pb |>
sample_n(size = 1000) |>
ggplot(aes(sample = salario)) +
geom_qq() +
geom_qq_line() +
labs(x = "Salário", y = "", title = "QQ-Plot do Salário Nominal na Paraíba (2013)",
subtitle = "A distribuição de salário não parece seguir uma distribuição Normal",
caption = "Fonte: Elaborado pelo autor a partir de dados da RAIS (2013)")
salario_pb |>
mutate(sexo = case_when(
sexo == 2 ~ "Mulher",
sexo == 1 ~ "Homem")) |>
filter(salario < 3000) |>
ggplot(aes(salario, fill = fct_rev(as.factor(sexo)))) +
geom_density(position = 'identity', alpha = 0.5) +
facet_wrap(~sexo) +
guides(fill = "none") +
labs(x = "Salário (R$)", y = "",
title = "Distribuição de Salários na Paraíba por Gênero, 2013",
subtitle = "Salários abaixo de R$ 3000",
caption = "Fonte: Elaboração do autor a partir de dados da RAIS (2013)")
Welch Two Sample t-test
data: salario_mulheres and salario_homens
t = 8.0402, df = 783668, p-value = 8.984e-16
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
23.83628 39.20365
sample estimates:
mean of x mean of y
1435.205 1403.685
Retornos salariais da educação segundo a equação de Mincer (1974):
\[ Y (\text{Salário}) = \beta_0 + \beta_1 \text{educação} + \beta_2 \text{exp} + \beta_3 \text{exp}^2 + u \]
# A tibble: 8 × 5
term estimate std.error statistic p.value
<chr> <dbl> <dbl> <dbl> <dbl>
1 (Intercept) 5.79 0.00416 1391. 0
2 sexo -0.137 0.00121 -113. 0
3 idade 0.0165 0.0000499 330. 0
4 escolaridade 0.105 0.000297 352. 0
5 meso_trabBorborema -0.0743 0.00342 -21.7 2.07e-104
6 meso_trabMata Paraibana 0.197 0.00313 63.0 0
7 meso_trabSertão Paraibano -0.0889 0.00215 -41.4 0
8 semiarido_trabS 0.0772 0.00329 23.5 1.36e-121
\[ \log(\text{salário} ) = 5,78 - 0,13 \text{ Mulher} + 0,02 \text{ Idade} + 0.10 \text{ Escolaridade} \\[0.1in] - 0,07 \text{ Borborema} + 0.20 \text{ Zona Mata} - 0,09 \text{ Sertão} + 0,08 \text{Semiarido} \]
O modelo sugere que a renda dessa pessoa deve ser de R$ 1298,13:
Vamos prever o valor futuro do consumo de energia residencial na Paraíba.
Base de Treinamento e Base de Teste
set.seed(123)
# base de teste (20%) e treinamento (80%)
energia_treinamento_teste <- energia |>
initial_time_split(prop = 0.8)
tbl_energia_treinamento <- training(energia_treinamento_teste)
tbl_energia_teste <- testing(energia_treinamento_teste)
energia_treinamento_teste |>
tk_time_series_cv_plan() |>
plot_time_series_cv_plan(data, consumo)
set.seed(123)
# base de teste (20%) e treinamento (80%)
energia_treinamento_teste <- energia |>
initial_time_split(prop = 0.8)
tbl_energia_treinamento <- training(energia_treinamento_teste)
tbl_energia_teste <- testing(energia_treinamento_teste)
energia_treinamento_teste |>
tk_time_series_cv_plan() |>
plot_time_series_cv_plan(data, consumo)
set.seed(123)
# base de teste (20%) e treinamento (80%)
energia_treinamento_teste <- energia |>
initial_time_split(prop = 0.8)
tbl_energia_treinamento <- training(energia_treinamento_teste)
tbl_energia_teste <- testing(energia_treinamento_teste)
energia_treinamento_teste |>
tk_time_series_cv_plan() |>
plot_time_series_cv_plan(data, consumo)
set.seed(123)
# base de teste (20%) e treinamento (80%)
energia_treinamento_teste <- energia |>
initial_time_split(prop = 0.7)
tbl_energia_treinamento <- training(energia_treinamento_teste)
tbl_energia_teste <- testing(energia_treinamento_teste)
energia_treinamento_teste |>
tk_time_series_cv_plan() |>
plot_time_series_cv_plan(data, consumo)
Agora vamos informar quem são nossas variáveis explicativas: o consumo de energia residencial será explicado apenas pelos seus valores passados. Poderiamos incluir outras variáveis, como feriados, tarifa de energia, etc.
Por fim, definir o modelo, rodar e gerar previsões:
# definir o modelo a ser rodado (ARIMA)
modelo_arima <- arima_reg() %>%
set_engine("auto_arima")
# Rodar o modelo na base de treinamento
workflow_arima <- workflow() %>%
add_recipe(receita_energia) %>%
add_model(modelo_arima) %>%
fit(tbl_energia_treinamento)
# Gerar uma previsão e comparar com o que realmente
# aconteceu no período de teste
tbl_energia_calibracao <- workflow_arima |>
modeltime_calibrate(new_data = tbl_energia_teste)
# gerar os valores previstos
tbl_energia_previsao <- tbl_energia_calibracao |>
modeltime_forecast(new_data = tbl_energia_teste,
actual_data = energia)
Por fim, definir o modelo, rodar e gerar previsões:
# definir o modelo a ser rodado (ARIMA)
modelo_arima <- arima_reg() %>%
set_engine("auto_arima")
# Rodar o modelo na base de treinamento
workflow_arima <- workflow() %>%
add_recipe(receita_energia) %>%
add_model(modelo_arima) %>%
fit(tbl_energia_treinamento)
# Gerar uma previsão e comparar com o que realmente
# aconteceu no período de teste
tbl_energia_calibracao <- workflow_arima |>
modeltime_calibrate(new_data = tbl_energia_teste)
# gerar os valores previstos
tbl_energia_previsao <- tbl_energia_calibracao |>
modeltime_forecast(new_data = tbl_energia_teste,
actual_data = energia)
Por fim, definir o modelo, rodar e gerar previsões:
# definir o modelo a ser rodado (ARIMA)
modelo_arima <- arima_reg() %>%
set_engine("auto_arima")
# Rodar o modelo na base de treinamento
workflow_arima <- workflow() %>%
add_recipe(receita_energia) %>%
add_model(modelo_arima) %>%
fit(tbl_energia_treinamento)
# Gerar uma previsão e comparar com o que realmente
# aconteceu no período de teste
tbl_energia_calibracao <- workflow_arima |>
modeltime_calibrate(new_data = tbl_energia_teste)
# gerar os valores previstos
tbl_energia_previsao <- tbl_energia_calibracao |>
modeltime_forecast(new_data = tbl_energia_teste,
actual_data = energia)
Por fim, definir o modelo, rodar e gerar previsões:
# definir o modelo a ser rodado (ARIMA)
modelo_arima <- arima_reg() %>%
set_engine("auto_arima")
# Rodar o modelo na base de treinamento
workflow_arima <- workflow() %>%
add_recipe(receita_energia) %>%
add_model(modelo_arima) %>%
fit(tbl_energia_treinamento)
# Gerar uma previsão e comparar com o que realmente
# aconteceu no período de teste
tbl_energia_calibracao <- workflow_arima |>
modeltime_calibrate(new_data = tbl_energia_teste)
# gerar os valores previstos
tbl_energia_previsao <- tbl_energia_calibracao |>
modeltime_forecast(new_data = tbl_energia_teste,
actual_data = energia)
Gráfico da previsão comparada com o que ocorreu de fato:
É possível ainda criar uma série de medidas de performance. Elas são úteis para nos guiar sobre qual o melhor modelo:
# A tibble: 6 × 2
.model_desc mape
<chr> <dbl>
1 SEASONAL DECOMP: ETS(M,A,N) 3.95
2 ARIMA(0,1,2)(0,1,1)[12] W/ XGBOOST ERRORS 4.17
3 ARIMA(0,1,1)(0,1,1)[12] 4.21
4 REGRESSION WITH ARIMA(0,1,0) ERRORS 4.71
5 PROPHET W/ REGRESSORS 4.91
6 TBATS(0, {0,0}, 1, {<12,5>}) 6.32
Para mais informações sobre séries temporais:
A partir de informações dos clientes, podemos prever a probabilidade que um cliente abandone (churn) a empresa, nos permitindo desenvolver programas focados em retenção de clientes.
A matriz de confusão:
# A tibble: 6 × 2
Medida Estimativa
<chr> <dbl>
1 accuracy 0.807
2 sens 0.469
3 spec 0.929
4 precision 0.707
5 recall 0.469
6 f_meas 0.564
cliente_ficticio <- data.frame(
female = 1, # mulher
senior_citizen = 0, # não idosa
partner = 1, # com parceiro(a)
dependents = 0, # sem dependentes
tenure = 2, # contrato a 2 anos
phone_service = 0, # sem telefone
multiple_lines = "No", # sem multiplas linhas
internet_service = "DSL", # internet tipo DSL
online_security = "No", # sem serviço de segurança online
online_backup = "No", # sem serviço de backup online
device_protection = "No", # sem serviço de seguro de roteador (?)
tech_support = "No", # suporte técnico
streaming_tv = "Yes", # usa streaming de tv
streaming_movies = "Yes", # faz uso de streaming de filmes
contract = "One year", # contrato anual
paperless_billing = 1, # não recebe a conta fisicamente
payment_method = "Bank transfer (automatic)", # débito automático
monthly_charges = 70, # paga $70 por mes
total_charges = 1680 # cobrança total 1400
)
O modelo nos informa que provavelmente este cliente não deve cancelar sua assinatura em breve.
Para mais informações:
O objetivo da clusterização é agrupar pontos em subgrupos distintos. Uma das principais aplicações de clusterização é a segmentação de clientes. Com ela podemos separar certos grupos de clientes, para oferecer descontos, ofertas, códigos promocionais, etc.
# A tibble: 6 × 5
id_cliente genero idade renda_anual_mil score_gastos
<dbl> <chr> <dbl> <dbl> <dbl>
1 1 Masculino 19 15 39
2 2 Masculino 21 15 81
3 3 Feminino 20 16 6
4 4 Feminino 23 16 77
5 5 Feminino 31 17 40
6 6 Feminino 22 17 76
# Uma inspeção visual parece indicar
# 5 grupos distintos de pontos.
clientes_shopping |>
ggplot(aes(renda_anual_mil, score_gastos, color = genero)) +
geom_point() +
labs(x = "Renda Anual (em mil R$)",
y = "Score de Gastos",
title = "Relação entre Gastos e Renda dos Clientes",
color = "") +
theme_light()
Vamos construir os clusters usando o score de gastos e renda anual. Para o número de clusters, vamos usar cinco:
# A tibble: 5 × 5
score_gastos renda_anual_mil size withinss cluster
<dbl> <dbl> <int> <dbl> <fct>
1 49.5 55.3 81 9875. 1
2 79.4 25.7 22 3519. 2
3 20.9 26.3 23 5099. 3
4 82.1 86.5 39 13444. 4
5 17.1 88.2 35 12511. 5
Podemos repetir o gráfico de dispersão renda por gastos, mas usando como cor a classificação produzida pelo K-means.
Escolhendo outros valores de K
, rodando para vários valores de K
e
kclusts <-
tibble(k = 1:9) %>%
mutate(
kclust = map(k, ~ kmeans(select(clientes_shopping, score_gastos, renda_anual_mil), .x)),
glanced = map(kclust, glance)
)
kclusts %>%
unnest(cols = c(glanced)) %>%
ggplot(aes(k, tot.withinss)) +
geom_line(alpha = 0.5, size = 1.2, color = "midnightblue") +
geom_point(size = 2, color = "midnightblue")
Clusterização:
Marketing: Segmentação de Clientes
Clusterizar mensagens de redes sociais (twitters)
Ra %>%
group_by(symbol) %>%
mutate(retorno_acumulado = cumsum(Ra)) %>%
ggplot(aes(x = date, y = retorno_acumulado, color = symbol)) +
geom_line() +
geom_hline(yintercept = 0, linetype = 2) +
scale_y_continuous(labels = scales::percent) +
labs(x = "",
y = "Retorno acumulado",
title = "Retorno acumulado por empresa selecionada, 2021-2022",
caption = "Fonte: Elaborado pelo autor.") +
facet_wrap(~symbol, scales = "free_y", ncol = 2) +
theme(legend.position = "none",
axis.text.x = element_text(angle=45, size = 8))
A Razão de Sharpe é comumente utilizada como uma medida de retorno por unidade de risco, e tem a seguinte fórmula:
\[ \text{Sharpe} = \frac{r_P - r_F}{\sigma_P} \]
Uma razão de Sharpe maior, indica uma melhor combinação risco-retorno.
# A tibble: 6 × 4
# Groups: symbol [6]
symbol `ESSharpe(Rf=0%,p=95%)` `StdDevSharpe(Rf=0%,p=95%)` VaRSharpe(Rf=0%…¹
<chr> <dbl> <dbl> <dbl>
1 ITSA3.SA -0.0376 -0.0765 -0.0445
2 PETR3.SA 0.0879 0.152 0.106
3 VALE3.SA -0.0260 -0.0562 -0.0316
4 ABEV3.SA 0.0122 0.0213 0.0175
5 BBAS3.SA 0.0428 0.0752 0.0490
6 JBSS3.SA 0.0515 0.0896 0.0625
# … with abbreviated variable name ¹`VaRSharpe(Rf=0%,p=95%)`
Podemos estimar o modelo CAPM para as ações. No modelo CAPM podemos fatorar a taxa livre de risco e calcular a seguinte equação:
\[ r_p - r_F = \alpha + \beta(b - r_F) + \epsilon\]
onde o \(\beta\) representa a volatilidade de uma ação comparada com o risco sistêmico do mercado:
\(\beta = 1: \text{ação relacionada com o mercado}\)
\(\beta < 1: \text{ação menos volátil que a média do mercado}\)
\(\beta<1: \text{ativo mais volátil que o mercado}\)
\(\beta <0: \text{ativo tende a aumentar de preço quando o mercado cai}\)
Rb <- "^BVSP" |>
tq_get(get = "stock.prices",
from = "2021-01-02",
to = "2022-10-11") |>
tq_transmute(adjusted, periodReturn,
period = "monthly",
col_rename = "Rb")
Rb |>
ggplot(aes(x = date, y = Rb)) +
geom_line(size = 1) +
labs(title = "Retorno Mensal da Bovespa, 2021 - 2022",
y = "Retorno Mensal (%)", x = "")
Para mais informações
https://robsonolima.com.br/post/analise-de-portfolio-com-r/
https://robsonolima.com.br/post/tidyquant-analise-financeira-no-r/
Var | Descrição | Fator 1 (Dem60) | Fator 2 (Dem65) | Ind60 |
---|---|---|---|---|
y1 | Score dado por experts em liberdade de imprensa (1960) | x | ||
y2 | Liberdade dos partidos políticos (1960) | x | ||
y3 | Eleições livres e justas (1960) | x | ||
y4 | Efetividade do congresso eleito (1960) | x | ||
y5 | Score dado por experts em liberdade de imprensa (1965) | x | ||
y6 | Liberdade dos partidos políticos (1965) | x |
Var | Descrição | Fator 1 (Dem60) | Fator 2 (Dem65) | Ind60 |
---|---|---|---|---|
y7 | Eleições livres e justas (1965) | x | ||
y8 | Eleições livres e justas (1965) | x | ||
x1 | PIB per capita (1960) | x | ||
x2 | Consumo de energia per capita (1960) | x | ||
x3 | % da força de trabalho na industrial (1960) | x |
# A tibble: 34 × 9
term op estimate std.error stati…¹ p.value std.lv std.all std.nox
<chr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 ind60 =~ x1 =~ 1 0 NA NA 0.670 0.920 0.920
2 ind60 =~ x2 =~ 2.18 0.139 15.7 0 1.46 0.973 0.973
3 ind60 =~ x3 =~ 1.82 0.152 12.0 0 1.22 0.872 0.872
4 dem60 =~ y1 =~ 1 0 NA NA 2.22 0.850 0.850
5 dem60 =~ y2 =~ 1.26 0.182 6.89 5.64e-12 2.79 0.717 0.717
6 dem60 =~ y3 =~ 1.06 0.151 6.99 2.81e-12 2.35 0.722 0.722
7 dem60 =~ y4 =~ 1.26 0.145 8.72 0 2.81 0.846 0.846
8 dem65 =~ y5 =~ 1 0 NA NA 2.10 0.808 0.808
9 dem65 =~ y6 =~ 1.19 0.169 7.02 2.16e-12 2.49 0.746 0.746
10 dem65 =~ y7 =~ 1.28 0.160 8.00 1.33e-15 2.69 0.824 0.824
# … with 24 more rows, and abbreviated variable name ¹statistic
https://www.escolavirtual.gov.br/curso/325
https://livro.curso-r.com/index.html
https://www.bigbookofr.com/index.html
robsonolima.com.br