1 Instalação

install.packages("CFilt")
library(CFilt)

2 Base de Dados

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

3 Primeiro Passo: Criação do Objeto CF

objetoCF<-CFbuilder(movies, sim_user = "both", sim_item = "both")

4 Análise Descritiva

A base de dados "movies" possui avaliações de 526 usuários para 50 itens.

Primeiro, avaliaremos o comportamento das avaliações realizadas.

4.1 Avaliações

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))

5 Funções de Manipulação

5.1 Adicionar um novo usuário

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.

5.2 Adicionar um novo item:

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.

6 Recomendações

6.1 1. Estimar avaliações:

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.

6.1.1 Usando Similaridades entre Usuários:

6.1.1.1 Similaridade Cosseno:

objetoCF$estimaterating(Id_u = "4", Id_i = "Iron Man 3", type = "user", similarity = "cos", neighbors = 10)
## [1] 4.292997

6.1.2 Usando Similaridades entre Itens:

6.1.2.1 Similaridade Cosseno:

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.

6.2 2. Recomendar?

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.

6.2.1 Usando Similaridades entre Usuários:

6.2.1.1 Similaridade Cosseno:

objetoCF$recommend(Id_u = "4", Id_i = "Iron Man 3", type = "user", similarity = "cos", cuts = 4, neighbors = 10)
## [1] TRUE

6.2.2 Usando Similaridades entre Itens:

6.2.2.1 Similaridade Cosseno:

objetoCF$recommend(Id_u = "4", Id_i = "Iron Man 3", type = "item", similarity = "cos",cuts = 4, neighbors = 10)
## [1] FALSE

6.3 3. Lista de Itens

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.

6.3.1 Usando Similaridades entre Usuários:

6.3.1.1 Similaridade Pearson:

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"

6.3.2 Usando Similaridades entre Itens:

6.3.2.1 Similaridade Cosseno Ajustado:

objetoCF$topkitems(Id_u = "20", k = 3, type = "item", similarity = "adjcos", cuts = 4, neighbors = 10)
## [1] "12 Years a Slave" "Amour"            "Argo"

6.4 4. Lista de Usuários

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".

6.4.1 Usando Similaridades entre Usuários:

6.4.1.1 Similaridade Cosseno:

objetoCF$topkusers( Id_i = "Iron Man 3", k = 3, type = "user", similarity = "cos", cuts = 4, neighbors = 10)
## [1] "352" "319" "525"

6.4.2 Usando Similaridades entre Itens:

6.4.2.1 Similaridade Cosseno:

objetoCF$topkusers( Id_i = "Iron Man 3", k = 3, type = "item", similarity = "cos", cuts = 4, neighbors = 10)
## [1] "9"  "23" "26"

6.5 4. Lista de Itens Semelhantes

Podemos recomendar, a quaisquer usuário, os 3 itens mais similares ao filme "Homem de Ferro 3":

6.5.1 Utilizando a Similaridade Cosseno:

objetoCF$kclosestitems( Id_i = "Iron Man 3", k = 3, similarity = "cos")
## [1] "Thor: The Dark World"           "The Wolverine"                 
## [3] "Hansel & Gretel: Witch Hunters"

6.5.2 Utilizando a Similaridade Cosseno Ajustado:

objetoCF$kclosestitems( Id_i = "Iron Man 3", k = 3, similarity = "adjcos")
## [1] "The Wolverine"          "Meu Passado me Condena" "Fast & Furious 6"


Nota-se que filmes de "heróis" como Wolverine e Thor são considerados bem similares ao Homem de Ferro 3. Porém vale lembrar que o conceito de similaridade está associado às avaliações e não ao gênero dos filmes.


Muito Obrigado pela atenção!!