set.seed(12345)
lastfm = read_csv(here::here("data/experimento-lastfm.csv"),
col_types = cols(.default = col_double(),
user = col_character()))
lastfm = lastfm %>%
sample_n(300) %>%
select(news, old, mediana_pop)
glimpse(lastfm)
## Observations: 300
## Variables: 3
## $ news <dbl> 28, 35, 13, 24, 14, 17, 13, 21, 34, 55, 10, 33, 10, 217...
## $ old <dbl> 61, 194, 70, 96, 130, 67, 106, 123, 76, 78, 76, 116, 11...
## $ mediana_pop <dbl> 6.105585, 5.376812, 5.713082, 4.564335, 5.782320, 5.532...
Utilizaremos ICs para estimar duas métricas sobre os usuários do LastFM em geral durante um período de 6 meses. Em ambos os casos faremos isso a partir de uma amostra de 300 usuários. As duas métricas são:
Crie intervalos com 95% de confiança.
Como solicitado, as métricas devem ser calculadas com base em uma amostras de tamanho igual a 300 de um universo populacional de 11.989 usuários disponível em nosso base de dados. É preciso primeiramente selecionar de maneira aleatoria essa amostra (n = 300). Em seguida, vamos construir o intervalo de confiança (IC) desta amostra para estimar a faixa de valores (mínimo e máximo) que a variável news apresenta em comparação a população.
Vamos encontrar a proporção de novos artistas em geral ter escutado por usuário é igual à quantidade de artivas novos dividido pela (quantidade artitas novos + quantidade artitas antigos). news/(news + old).
lastfm <- lastfm %>%
mutate(proportion = news/(news + old))
glimpse(lastfm)
## Observations: 300
## Variables: 4
## $ news <dbl> 28, 35, 13, 24, 14, 17, 13, 21, 34, 55, 10, 33, 10, 217...
## $ old <dbl> 61, 194, 70, 96, 130, 67, 106, 123, 76, 78, 76, 116, 11...
## $ mediana_pop <dbl> 6.105585, 5.376812, 5.713082, 4.564335, 5.782320, 5.532...
## $ proportion <dbl> 0.31460674, 0.15283843, 0.15662651, 0.20000000, 0.09722...
lastfm %>% ggplot(aes(x = proportion)) +
geom_histogram(binwidth = .1,
colour = "darkred",
fill = "white")+
labs(title = "Distribuição da proporção", x='Novos artistas', y='Usuários')
Como é possível verificar neste histograma, os valores da amostra apresentam uma proporção de novos artistas escutados próximo de 25% (0.25). Mas, não podemos tirar conclusões finais em apenas uma única amostra, é preciso fazer mais calculos. Vamos agora cálcular a média da proporção desta amostra:
funcao_theta = function(df) {
df %>%
pull(proportion) %>%
mean()
}
theta_c = funcao_theta(lastfm)
print(paste('Valor da Média amostral:',theta_c))
## [1] "Valor da Média amostral: 0.248356815094237"
Agora temos o valor de 0.248356815094237 para a média amostral. Vamos agora refazer o calculo para outras amostrar e calcular o Intervalo de Confiança. É necessário encontrar o número adequado de amostrar, o estudo indica um número de 5000 amostrar.
set.seed(4321)
iteration = 5000
um_bootstrap <- function(x){
proportion = x %>% pull(proportion)
boot_x <- sample(proportion,
size = NROW(proportion),
replace = TRUE)
return(mean(boot_x))
}
# A REAMOSTRAGEM
resampling = data.frame(i = 1:iteration) %>%
mutate(theta_c_s = map_dbl(i, ~ um_bootstrap(lastfm)))
resampling_mean_error = resampling %>%
mutate(error = theta_c_s - theta_c)
resampling_mean_error
confidence_level = .95
alpha = 1 - confidence_level
interval = resampling_mean_error %>%
summarise(error_i = quantile(error, alpha/2),
error_s = quantile(error, 1 - alpha/2)) %>%
mutate(valor_i = theta_c + error_i,
valor_s = theta_c + error_s)
cat(paste('Est. iuperior:',interval$valor_i),"\n",
paste('Est. snferior:',interval$valor_s),"\n",
paste('Erro1:',interval$error_s),"\n",
paste('Erro2:',interval$error_i)
)
## Est. iuperior: 0.235798185658249
## Est. snferior: 0.261798064261403
## Erro1: 0.0134412491671663
## Erro2: -0.0125586294359884
set.seed(45678)
theta <- function(df,i) {
mean(
(df %>%
slice(i) %>%
pull(proportion)
))
}
booted <- boot(data = lastfm,
statistic = theta,
R = 5000)
ci = tidy(booted,
conf.level = .95,
conf.method = "bca",
conf.int = TRUE)
cat(paste('Média:',ci$statistic),"\n",
paste('Est. inferior:',ci$conf.low),"\n",
paste('Est. superior:',ci$conf.high),"\n",
paste('Erro1:',ci$std.error), "\n",
paste('Erro2:',ci$bias)
)
## Média: 0.248356815094237
## Est. inferior: 0.235224000231867
## Est. superior: 0.262005093611465
## Erro1: 0.00676914569931786
## Erro2: -9.02014927335049e-05
ic_amostras = resampling_mean_error %>%
mutate(interval_i = theta_c_s + interval$error_i,
interval_s = theta_c_s + interval$error_s) %>%
mutate(contem_theta = theta_c >= interval_i & theta_c <= interval_s)
ic_amostras %>%
summarise(cobertura = sum(contem_theta) / n())
ic_amostras %>%
slice(1:100) %>%
ggplot(aes(
x = i,
y = theta_c_s,
ymin = interval_i,
ymax = interval_s,
color = contem_theta
)) +
geom_pointrange(alpha = .8, size = .3) +
geom_hline(yintercept = theta_c, color = "dark blue") +
labs(x = "Amostra",
y = "Média") +
scale_color_manual(values = c("red", "blue"))
Nesta representação gráfica dos valores dos IC que foram calculados podemos concluir que para 100 novas amostras, 5 delas não estão inseridas na média da população, atendendo ao nível de confiança de 95%.
É possível verificar que a média para ambas as bibliotecas foram iguais: 0.248356815094237. Agora quando verificamos os IC, vamos encontrar: o primeiro foi de [0.2357982,0.2617981] e o segundo foi de [0.235224,0.2620051]. Assim, podemos garantir que em média a proporção para novos artistas escutados pelos usuários é de 0.242366 com 95% de confiança e com um IC de [0.2357982,0.2617981].
Precisamos, inicialmente, filtrar os usuários na amostra que possuem mediana_pop maior que 5. Após isso, podemos usar a correlação como a variável do intervalo de confiança. Iremos usar Spearman como o método de cálculo da correlação, por se tratar de uma amostra consideravelmente grande.Em seguida vamos utilizar a função bootstrap, que utiliza uma tabela para coletar as amostras de mesmo tamanho amostral.
lastfm %>%
filter(mediana_pop >5) %>%
mutate(ratio = news/(news+old)) %>%
ggplot(aes(x=mediana_pop, y=ratio)) +
geom_point()+
geom_smooth(method='lm', color='red', se = FALSE)+
labs(title='Correlação das variáveis', x = 'Gosto por música pop', y = 'Proporção novos artistas')
## `geom_smooth()` using formula 'y ~ x'
Diante do gráfico acima, podemos verificar que existe uma relação fraca e negativa entre as variáveis (mediana_pop, ratio). Vale destacar que pode existir uma relação não linear.
Vamos agora calcular a correlação amostrar pelo método Spearman.
funcao_theta_pop = function(df) {
x <- df %>%
filter(mediana_pop >5) %>%
mutate(ratio = news/(news+old)) %>%
summarise(corr = cor(mediana_pop, ratio, method= 'spearman')) %>%
pull(corr)
return(x)
}
theta_c_pop = funcao_theta_pop(lastfm)
print(paste("Correlação amostral (spearman)",theta_c_pop))
## [1] "Correlação amostral (spearman) -0.0239004973681646"
repeticoes = 5000
um_bootstrap <- function(df){
boot_x <- sample_n(df,
size = NROW(df),
replace = TRUE)
return(funcao_theta_pop(boot_x))
}
reamostragens = tibble(i = 1:repeticoes) %>%
mutate(theta_c_s_pop = map_dbl(i, ~ um_bootstrap(lastfm)))
reamostragens_error = reamostragens %>%
mutate(error = theta_c_s_pop - theta_c_pop)
reamostragens_error
intervalo = reamostragens %>%
mutate(erro = theta_c_s_pop - theta_c_pop) %>%
summarise(erro_i = quantile(erro, .05),
erro_s = quantile(erro, .95))
intervalo = intervalo %>%
mutate(valor_i = theta_c_pop + erro_i,
valor_s = theta_c_pop + erro_s)
cat(paste('Est. iuperior:',interval$valor_i),"\n",
paste('Est. snferior:',interval$valor_s),"\n",
paste('Erro1:',interval$erro_i),"\n",
paste('Erro2:',interval$erro_s)
)
## Est. iuperior: 0.235798185658249
## Est. snferior: 0.261798064261403
## Erro1:
## Erro2:
É possível verificar que 95% dos valors do intervalo de confiança estão entre -0.146721481616017 e 0.102676021391378.
theta_pop <- function(df,i) {
df = df %>%
filter(mediana_pop > 5) %>%
slice(i) %>%
mutate(prop = news/(news + old),
cor = cor(mediana_pop, prop, method= 'spearman'))
mean(df$cor)
}
booted_pop <- boot(data = lastfm,
statistic = theta_pop,
R = 5000)
ci = tidy(booted_pop,
conf.level = .95,
conf.method = "bca",
conf.int = TRUE)
cat(paste('Correlação amostral:',ci$statistic),"\n",
paste('Est. inferior:',ci$conf.low),"\n",
paste('Est. Superior:',ci$conf.high),"\n",
paste('Erro1:',ci$std.error), "\n",
paste('Erro2:',ci$bias)
)
## Correlação amostral: -0.0239004973681646
## Est. inferior: -0.151558294004748
## Est. Superior: 0.100900483580033
## Erro1: 0.0639430535889186
## Erro2: 0.000501077366240138
Agora com a utilização da biblioteca boot não vamos encontrar uma igualdade entre os resultados, lembrando que a cada execução de novos valores da amostrar os resultados são diferentes e quanto maior o número de novas amostras mais resultados tendem a se aproximar.
É possível verificar que o valor do theta do bootstrapping manual foi de -0.0239004973681646 e pela biblioteca boot foi -0.0239004973681646, ambos iguais, já o IC foram de [-0.146721481616017, 0.102676021391378] e no segundo [-0.149875704194716,0.0991188594145701], respectivamente, agora com valores bem próximos. Com 95% de confiança é possível confirmar que, utilizando o método de spearman, a correlação é de -0.0239004973681646 entre a popularidade mediana dos artistas escutado e a proporção dos artistas escutados que eram novos.