Tutorial: programando con Python en SPSS

El lenguaje de programación Python es una habilidad útil en la caja de herramientas de cualquier friki de los datos.

Te puede interesar:

Si estás interesado en el software de estadística más usado en todo el mundo, que sepas que es posible conseguir la última versión gratis y 100% legal.

Entre otras cosas, permite a los usuarios de SPSS condensar la sintaxis tediosa o repetitiva en unas pocas líneas de código Python.

En este tutorial, vamos a explicar los fundamentos del uso de Python con SPSS.

Configuración de Python para SPSS

En primer lugar, asegúrate de que tiene instalado el plugin de Python.

Si usas la versión 22 o posterior de SPSS, ya viene incluido y para versiones anteriores, el plugin se puede encontrar aquí.

Importante: recuerda que aquí te contamos cómo descargar SPSS en su última versión.

Para empezar a utilizar Python, simplemente abre un archivo de sintaxis y cree un bloque de INICIO DE PROGRAMA – FIN DE PROGRAMA.

El código que introduzcas en este bloque no será analizado como sintaxis de SPSS, sino como código Python.

Haz la prueba tú mismo:

BEGIN PROGRAM.
print 'Hello world!'
END PROGRAM.

El módulo SPSS de Python

Cuando se utiliza Python en SPSS, lo primero que hay que hacer es importar el módulo SPSS a su script de Python.

Esto asegura que un montón de funciones incorporadas están disponibles.

La primera que exploraremos es la función spss.Submit(). Esta función te permite enviar comandos de sintaxis a SPSS desde un bloque de Python.

Pega lo siguiente en el editor de sintaxis y selecciona «ejecutar todo»:

* We start by creating some test data.
DATA LIST /VAR1 1-2 VAR2 4-5.
BEGIN DATA
23 11
48 15
62 17
END DATA.
 
* The Python block starts here.
BEGIN PROGRAM.
# Import the SPSS and SPSS Client modules.
import spss, SpssClient
 
# Start the SPSS Client. Always do this first.
SpssClient.StartClient()
 
# Submit some syntax string to SPSS.
spss.Submit("FREQ var1.")
END PROGRAM.

Esto debería mostrar una tabla de frecuencias de una variable que acabas de crear.

Ahora intentemos repetir este proceso en un bucle while de Python. Añade lo siguiente a tu archivo de sintaxis antes de ejecutarlo de nuevo:

BEGIN PROGRAM.
import spss, SpssClient
SpssClient.StartClient()
i=0
while i<20:
   spss.Submit("FREQ VAR1.")
   i+=1
 
END PROGRAM.

Ya está. Acabas de automatizar tu primer procedimiento de SPSS.

Que es un procedimiento totalmente inútil, pero aún así te sugiero que te tomes un momento para celebrarlo. Ahora que tenemos lo básico, vamos a explorar algunas de las otras funciones incorporadas del módulo SPSS.

Funciones incorporadas I: acceso a conjuntos de datos

Para hacer cualquier cosa en SPSS, necesitarás acceder al conjunto de datos actual.

Esto se consigue utilizando la clase spss.dataset. En el siguiente ejemplo, abrimos el conjunto de datos y añadimos una nueva variable a los datos.

BEGIN PROGRAM.
import spss, SpssClient
SpssClient.StartClient()
# Start a data step. This allows us to write to file without using spss.Submit().
spss.StartDataStep()
 
# Create a new dataset object.
dataset = spss.Dataset()
 
# Concatenate a variable to the varlist.
dataset.varlist.append('VAR3',0)
 
# Create a var object and format it. The first number sets the type(numeric), the second sets #the width (2), the third sets the decimals (0).
 
var = dataset.varlist['VAR3']
var.format = (5,2,0)
 
# Fill a value list for the new variable
val_list=[33,44,55]
 
# Set the values of the new variable per row.
for i,j in enumerate(dataset.cases):
 
   dataset.cases[i,dataset.varlist['VAR3'].index] = val_list[i]
 
spss.EndDataStep()
END PROGRAM.

Funciones incorporadas II: acceso a la salida

Desde Python se puede acceder a cualquier cosa en SPSS.

Cosas que eran inmodificables pueden cambiarse de repente. Ahora que sabemos cómo manipular los datos, es el momento de hacer algo aún más genial: alterar la salida.

En este ejemplo, crearemos una tabla y cambiaremos los colores de fondo.

Ten en cuenta que este es un ejemplo en ejecución. Necesitarás los datos de los pasos anteriores para ejecutar este.

CORRELATIONS
/VARIABLES=VAR1 VAR2 VAR3
/MISSING=PAIRWISE.
BEGIN PROGRAM.
import SpssClient, spss
SpssClient.StartClient()
 
# Call output document.
OutputDoc = SpssClient.GetDesignatedOutputDoc()
 
# Call the list of items in that document.
OutputItems = OutputDoc.GetOutputItems()
 
# Iterate over output items.
for index in range(OutputItems.Size()):
 
    OutputItem = OutputItems.GetItemAt(index)
 
    # Select tables only.
    if OutputItem.GetType() == SpssClient.OutputItemType.PIVOT:
 
        PivotTable = OutputItem.GetSpecificType()
 
        # Get data cells from table.
        SpssDataCells=PivotTable.DataCellArray()
 
        # Iterate over rows en columns to set a new background color.
           for i in range(SpssDataCells.GetNumRows()):
              for j in range(SpssDataCells.GetNumColumns()):
                temp=SpssDataCells.GetUnformattedValueAt(i,j)
                if i%2==0:
                   SpssDataCells.SetBackgroundColorAt(i,j, 255)
                else:
                   SpssDataCells.SetBackgroundColorAt(i,j, 122)
 
SpssClient.StopClient()
END PROGRAM.

Funciones incorporadas III: acceso al archivo de sintaxis

También puedes crear archivos de sintaxis completamente nuevos y escribir cadenas en ellos. Un ejemplo sencillo:

BEGIN PROGRAM.
import spss, SpssClient
SpssClient.StartClient()
spss.StartDataStep()
dataset = spss.Dataset()
 
# Create new syntax doc object.
NewSyntaxDoc = SpssClient.NewSyntaxDoc()
NewSyntaxDoc.SetAsDesignatedSyntaxDoc()
 
# Create some output string
output=''
 
for i in range(400):
   temp='testvar'+str(i)
   output=output+'\n'+temp
# Write output string to syntax document.
 
NewSyntaxDoc.SetSyntax(output)
 
# Close document.
 
NewSyntaxDoc.CloseDocument()
 
END PROGRAM.

Ejemplo completo de Python en SPSS

Es hora de poner algunas cosas juntas y demostrar un script de Python realista que podría utilizar en su trabajo.

El siguiente script cargará todos los archivos sav de una carpeta en SPSS y escribirá cada uno en su propia hoja en un archivo Excel.

Repetimos el proceso para un par de archivos de Excel y nos aseguramos de que cada archivo recibe un determinado subconjunto de los registros de los datos sav, aplicando una selección antes de escribir en Excel.

BEGIN PROGRAM.
import SpssClient,spssaux, spss, os
SpssClient.StartClient()
 
# Determine path containing the sav-files.
savpath='c:/your_path/'
 
# Define function that reads sav and writes to excel.
def write_excel(excelfile, val):
 
   # Loop through dir and subdirs.
   for root, dirs, files in os.walk(savpath):
      for filename in files:
 
         # Set sheet names to be file name minus extension and prefix.
         sheetname = filename[4:-4]
 
         # Load sav-file. Note the use of escape characters.
         spss.Submit("GET FILE ='%s'." %(savpath+filename))
 
         # Apply selection.
         spss.Submit("SELECT IF %s='%s'."
                      EXE. %(“selection_variable”,val))
 
         # Send file to appropriately named Excel sheet.
         spss.Submit("
         SAVE TRANSLATE
         /CONNECT='DSN=Excel Files;DBQ=
         %s;DriverId=790;MaxBufferSize=2048;PageTimeout=5;'
         /TYPE=ODBC
         /VERSION=12
         /MAP
         /REPLACE
         /FIELDNAMES
         /TABLE='%s'
         /CELLS=VALUES.
         EXE." %(excelfile, sheetname))
 
# Call write_excel function for each value to select
value_list=[“your_values1”,“your_values2”,]
 
for val in value_list:
   write_excel("c:/your_path/excel/test”+str(i)+”.xlsx'', val)
 
END PROGRAM.