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.