Trans | prdno |
1 | 2 |
1 | 4 |
1 | 5 |
2 | 1 |
2 | 3 |
2 | 4 |
2 | 5 |
3 | 2 |
3 | 4 |
3 | 5 |
4 | 1 |
4 | 2 |
4 | 4 |
4 | 5 |
5 | 3 |
6 | 5 |
7 | 4 |
8 | 7 |
9 | 6 |
9 | 7 |
10 | 6 |
Nome Campo | Tipo de dado | Comentario |
X | int not null | guarda codigo do produto |
Y | int not null | guarda codigo do produto |
Freq_x | float | guarda frequencia de x com relacao ao total de vendas |
Freq_xy | float | guarda frequencia x em relacao a y |
x int not null,
y int not null,
freq_x float,
freq_xy float )
CREATE PROCEDURE `sp_apriori`(in sup_min integer,in conf integer)
begin
delete from regras;
select @total:=count(distinct trans) as total from vendas;
/* criacao da tabela temporaria para um item */
create temporary table 1_item(
id int not null auto_increment primary key,
prdno int not null,
freq float not null);
set @i:=1;
while @i <= @total_aux do
select @cod:=prdno,@freqx:=freq from 1_item where id=@i;
insert into regras
select @cod,prdno,@freqx,ROUND(100*count(prdno)/@total,2) as freq
from vendas where trans in(select trans from vendas where prdno=@cod)
and prdno <> @cod group by prdno having freq >=sup_min; /*nessa linha filtro os produtos que sairam com o outro produto
set @i:=@i+1;
end while;
/* seleciona as regras que estao dentro da confianca passada como parametro, ou seja, deleta aquelas que nao interessam */
delete from regras where (freq_xy/freq_x) < (conf/100);
end $$
X |
Y |
Freq_x |
Freq_xy |
2 |
4 |
30 |
30 |
2 |
5 |
30 |
30 |
4 |
5 |
50 |
40 |
5 |
4 |
50 |
40 |
Conclusões:
Na tabela acima pode-se concluir os resultados da seguinte forma:
· O produto 2 vende-se 30% do total das vendas sendo que toda vez que vende-se 2 também vende-se 4 100%(30/30).
· O produto 2 vende-se 30% do total das vendas sendo que toda vez que vende-se 2 também vende-se 5 100%(30/30).
· O produto 4 vende-se 50% do total das vendas sendo que toda vez que vende-se 5 tem a probabilidade de 80% (40/50) de também vender 5.
· O produto 5 vende-se 50% do total das vendas sendo que toda vez que vende-se 5 tem a probabilidade de 80% (40/50) de também vender 4.
Observações: O algoritmo desenvolvido acima só encontra as duplas ou seja se X então Y.
Atenção: Esse algoritmo aplicado a grande quantidade de dados (milhões de registros) com certeza será demorado e exigirá muito processamento