install.packages("CFilt")
library(CFilt)Para exemplificar algumas aplicações do pacote, será utilizada a base de dados "movies" presente no pacote.
## Id Users Id Items Ratings
## 1 1 Wreck-It Ralph 4
## 2 1 We're So Young 4
## 3 1 Brazilian Western 4
## 4 2 We're So Young 4
## 5 2 Brazilian Western 4
## 6 2 Cine Holliudy 5
## 7 2 Silver Linings Playbook 4
## 8 2 A Royal Affair 5
## 9 2 Till Luck Do Us Part 2 2
## 10 2 Muita Calma Nessa Hora 2 2
## 11 2 The Book Thief 4
## 12 2 Blue Is The Warmest Color 5
## 13 3 Iron Man 3 4
## 14 3 My Mom Is a Character 3
## 15 3 Fast & Furious 6 4
objetoCF<-CFbuilder(movies, sim_user = "both", sim_item = "both")A base de dados "movies" possui avaliações de 526 usuários para 50 itens.
Primeiro, avaliaremos o comportamento das avaliações realizadas.
ggplot(data.frame(table(movies$Ratings)),aes(x=Var1,y=Freq)) +
geom_bar(stat ="identity",fill=cores(1)) +
scale_y_continuous(limits = c(0,4000) ,breaks = seq(0,4000,1000)) +
geom_text(aes(label=Freq),size=3, vjust = -0.8, hjust = 0.5) +
theme_hc() + ylab("Frequência") + xlab("Avaliações") +
ggtitle("Gráfico 1","Comportamento das Avaliações Realizadas")Podemos avaliar também através dos comportamentos das médias dos usuários e itens:
ggplotly(ggplot(data.frame(objetoCF$averages_u),aes(x=objetoCF.averages_u))+
geom_histogram(fill=cores(2)[1], color="black",breaks=seq(1,5,0.25))+
scale_x_continuous(limits = c(1,5), breaks = seq(1,5,0.25))+
scale_y_continuous(limits = c(0,150) ,breaks = seq(0,150,50)) +
theme_hc() + ylab("Frequência") + xlab("Média dos Usuários")+
ggtitle("Gráfico 2", "Comportamento das Médias de cada Usuário"))ggplotly(ggplot(data.frame(objetoCF$averages_i),aes(x=objetoCF$averages_i))+
geom_histogram(fill=cores(3)[3], color="black",breaks=seq(1,5,0.5))+
scale_x_continuous(limits = c(0.5,5), breaks = seq(0.5,5,0.5))+
scale_y_continuous(limits = c(0,30) ,breaks = seq(0,30,10)) +
theme_hc() + ylab("Frequência") + xlab("Média dos Itens")+
ggtitle("Gráfico 3","Comportamento das Médias das Avaliações de cada Item"))Além disso, podemos utilizar os objetos de diversas formas e realizar diversas análises.
Uma análise muito interessante é avaliar a esparsidade da Matriz de Utilidade:
levelplot(t(objetoCF$MU[1:50,1:50][c(nrow(objetoCF$MU[1:50,1:50]):1) , ]),
xlab="Itens",ylab="Usuários",scales = list(labels = rep("",100)),
col.regions=cores(20))Para adicionarmos um novo usuário que já avaliou algum item previamente, utilizamos:
objetoCF$addnewuser(Id_u = "Thiago", Ids_i = c("Life of Pi","Iron Man 3"), r = c(5,2))O usuário "Thiago" adicionado avaliou os filmes "As aventuras de Pi"e "Homem de Ferro 3" respectivamente com as notas 5 e 2.
Para adicionarmos um novo filme que já foi avaliado previamente, utilizamos:
objetoCF$addnewitem(Id_i = "Black Widow", Ids_u = c("Thiago","1"), r = c(3,1))O item "Viuva Negra" adicionado foi avaliado previamente pelos usuários "Thiago" e "1" respectivamente com as notas 3 e 1.
Iremos avaliar que nota o Usuário 4 daria para o filme "Homem de Ferro 3".
Podemos realizar a estimativa através de 4 abordagens diferentes.
Serão apresentados somente os resultados de 2 das abordagens.
objetoCF$estimaterating(Id_u = "4", Id_i = "Iron Man 3", type = "user", similarity = "cos", neighbors = 10)## [1] 4.292997
objetoCF$estimaterating(Id_u = "4", Id_i = "Iron Man 3", type = "item", similarity = "cos", neighbors = 10)## [1] 3.998666
Nota-se que as notas estimadas são diferentes dependendo da escolha metodológica.
Através das estimativas, podemos avaliar se o filme "Homem de Ferro 3" é recomendável ao usuário "4".
Utilizaremos a nota de corte = 4.
objetoCF$recommend(Id_u = "4", Id_i = "Iron Man 3", type = "user", similarity = "cos", cuts = 4, neighbors = 10)## [1] TRUE
objetoCF$recommend(Id_u = "4", Id_i = "Iron Man 3", type = "item", similarity = "cos",cuts = 4, neighbors = 10)## [1] FALSE
Outra opção é criar uma lista de itens recomendáveis. Para exemplificar, iremos criar listas de 3 filmes para o usuário "20" com 2 das 4 diferentes metodologias disponíveis.
objetoCF$topkitems(Id_u = "20", k = 3, type = "user", similarity = "pearson", cuts = 4, neighbors = 10)## [1] "Fast & Furious 6" "12 Years a Slave"
## [3] "The Hunger Games: Catching Fire"
objetoCF$topkitems(Id_u = "20", k = 3, type = "item", similarity = "adjcos", cuts = 4, neighbors = 10)## [1] "12 Years a Slave" "Amour" "Argo"
Seguindo a lógica inversa, podemos criar lista de usuários que gostariam de um determinado item. Para exemplificar, iremos criar 2 listas de usuários que gostariam de assistir ao filme "Homem de Ferro 3".
objetoCF$topkusers( Id_i = "Iron Man 3", k = 3, type = "user", similarity = "cos", cuts = 4, neighbors = 10)## [1] "352" "319" "525"
objetoCF$topkusers( Id_i = "Iron Man 3", k = 3, type = "item", similarity = "cos", cuts = 4, neighbors = 10)## [1] "9" "23" "26"
Podemos recomendar, a quaisquer usuário, os 3 itens mais similares ao filme "Homem de Ferro 3":
objetoCF$kclosestitems( Id_i = "Iron Man 3", k = 3, similarity = "cos")## [1] "Thor: The Dark World" "The Wolverine"
## [3] "Hansel & Gretel: Witch Hunters"
objetoCF$kclosestitems( Id_i = "Iron Man 3", k = 3, similarity = "adjcos")## [1] "The Wolverine" "Meu Passado me Condena" "Fast & Furious 6"