Produto cartesiano entre tabelas no SPSS
Autor: Lucas | Publicado: 2015-09-21T09:21:00-03:00


O SPSS não possuia (pelo menos até a versão 22) um comando para realizar o 

produto cartesiano entre duas tabelas. Na versão 23 apareceu no 

menu a janela "Cartesian Product of Two Sets of Variables", que auxilia neste trabalho. Vamos discutir nesta postagem como 

fazer a operação nas versões anteriores, utilizando um "truque" com os comandos LOOP e XSAVE.


Em nosso exemplo temos duas bases de dados: uma contendo uma lista de 

clientes e outra contendo uma lista de lojas. Queremos descobrir quais os clientes estão localizados a uma distância de até 1km 

de cada uma das lojas. Como estamos querendo calcular distâncias ambas as bases precisam estar georeferenciadas, isto é, tanto 

a lista de clientes como a de lojas devem conter informações das coordenagas geográficas (latitude e longitude). A idéia é 

simples: se temos 10 clientes e 5 lojas vamos comparar as distâncias de cada loja com as dos 10 clientes e filtrar apenas 

aquelas que possuem até 1km. Para isso vamos realizar o produto cartesiano entre as tabelas e obter uma tabela final com 50 

registros contendo as informações de clientes e lojas de modo que cada cliente apareça uma vez na tabela para cada loja e cada 

loja apareça uma vez para cada cliente.


No scrpit abaixo os comentários explicamo o que cada parte do código faz. 

Execute passo a passo o código para entender o que está acontecendo.

* Criamos a tabela exemplo de clientes.
DATA LIST 
    /COD_CLIENTE 1-2(F) NOME_CLIENTE 4-10(A) LAT_CLIENTE 12-21 LONG_CLIENTE 23-32.
BEGIN DATA
05 Augusto -45,860356 -22,568698
07 Lucas   -45,387821 -22,709247
12 Mariana -45,844268 -22,300496
13 Douglas -45,653701 -22,554361
17 Luiza   -45,947584 -22,896798
25 Solange -45,858844 -22,957062
33 Jose    -45,378294 -22,846408
45 Michel  -45,284786 -22,071699
52 Luis    -45,421867 -22,738143
56 Miguel  -45,275170 -22,962908
END DATA.
DATASET NAME TAB_CLI.

DATASET ACTIVATE TAB_CLI.
FORMATS
    LAT_CLIENTE(F8.6)
    LONG_CLIENTE(F8.6).


* Criamos a tabela exemplo de lojas.
DATA LIST 
    /COD_LOJA 1-2(F) NOME_LOJA 4-15(A) LAT_LOJA 17-26 LONG_LOJA 28-37.
BEGIN DATA
10 LOJA AMARELA -45,899434 -22,267355
25 LOJA AZUL    -45,774589 -22,778579
74 LOJA VERDE   -45,389912 -22,046033
76 LOJA ROXA    -45,763099 -22,661482
35 LOJA LARANJA -45,947189 -22,261653
END DATA.
DATASET NAME TAB_LOJA.

DATASET ACTIVATE TAB_LOJA.
FORMATS
    LAT_LOJA(F8.6)
    LONG_LOJA(F8.6).


* Criamos o código único sequencial para a tabela de lojas.
DATASET ACTIVATE TAB_LOJA.
COMPUTE CODIGO = $casenum.
EXECUTE.

* Criamos na tabela de clientes o campo informando o total de lojas.
* Neste exemplo inserimos o total manualmente no código. Poderíamos fazer isso
* utilizando o comando AGGREGATE e um MATCH FILES.
DATASET ACTIVATE TAB_CLI.
COMPUTE TOTAL = 5.
EXECUTE.


* Fazemos o produto cartesiano. O resultado será salvo no arquivo TEMP.SAV.
DATASET ACTIVATE TAB_CLI.
LOOP VAR = 1 TO TOTAL.
    XSAVE OUTFILE = "F:\OUT\TEMP.SAV".
END LOOP.
EXECUTE.

* Abrimos o arquivo TEMP.SAV criado.
* Note que agora o arquivo repete, para cada valor da variável VAR, todos os clientes.
* Altere o caminho do arquivo para uma pasta que exista em seu computador (ou rede).
GET FILE = "F:\OUT\TEMP.SAV".
DATASET NAME TAB_FINAL.

* Fazemos o cruzamento para trazer para essa tabela os dados da loja.
* Utilizamos a variável VAR, que representa o código sequencial criado para as lojas.
* Renomeamos a variável para poder fazer o cruzamento dos arquivos.
DATASET ACTIVATE TAB_FINAL.

RENAME VARIABLES
    (VAR = CODIGO).

SORT CASES BY
    CODIGO(A).

MATCH FILES
    /FILE = *
    /TABLE TAB_LOJA
    /BY CODIGO.
EXECUTE.



Na tabela final temos então as informações de todos os clientes e todas a 
lojas cruzadas. Para selecionar quais os clientes com distância até 1km das lojas basta calcular a distância entre as 
coordenadas geográficas (esta 
postagem explica como fazer isso no SPSS) e realizar o filtro. As coordenadas nos arquivos exemplos foram geradas 
aleatóriamente então não sei se sobraram clientes nestas condições, mas a ideia é essa.


Abraços,Lucas Rodrigues