3  Conceptos básicos en el análisis cuantitativo

Published

June 29, 2026

En este capítulo se desarrollan los conceptos fundamentales que sustentan el trabajo con datos en investigación de mercados: qué es una matriz de datos, qué tipos de variables existen, cómo se relacionan la pregunta, la variable y el código en un cuestionario, y cuáles son los niveles de medición. A continuación se aborda el tratamiento de los valores perdidos, una de las tareas más frecuentes y más determinantes en la calidad del análisis.

El código incluido en este capítulo es funcional y trabaja sobre dataframes reales. Se asume familiaridad básica con R: saber instalar paquetes, ejecutar código en RStudio y entender qué es un dataframe.

3.1 La matriz o tabla de datos

En investigación cuantitativa, los datos siempre se organizan en una matriz de datos: una tabla donde cada fila representa un caso (un entrevistado, un cliente, un producto) y cada columna representa una variable (una característica medida sobre ese caso).

En un estudio de satisfacción de clientes de una cadena de restaurantes, la matriz podría tener este aspecto:

Table 3.1: Ejemplo de matriz de datos de una encuesta de satisfacción

Cada fila es un entrevistado; cada columna es una variable. La dimensión de esta matriz — número de filas (casos) por número de columnas (variables) — es lo primero que se verifica al importar cualquier fichero:

Code
# Dimensions of the dataframe: rows x columns
dim(df)
[1] 5 5

Cuando los datos proceden de encuestas en panel o estudios longitudinales, se añade una tercera dimensión: el tiempo. En la práctica esto se representa añadiendo una columna de periodo (wave, year, month) o manteniendo ficheros separados por oleada.

3.2 Las variables

Una variable es cualquier característica que puede tomar distintos valores entre los casos analizados. En un cuestionario, cada pregunta genera una o varias variables.

Las variables se clasifican de dos formas principales que condicionan directamente qué análisis son aplicables:

3.2.1 Variables cualitativas

Expresan categorías o atributos, no cantidades. La medición consiste en asignar cada caso a una categoría. Pueden ser:

  • Nominales: las categorías no tienen orden entre sí. Ejemplos: marca preferida, comunidad autónoma, sexo. El valor numérico asignado a cada categoría (1 = Mujer, 2 = Hombre) es solo un código, no tiene significado aritmético.
  • Ordinales: las categorías sí tienen un orden natural, aunque la distancia entre ellas no es necesariamente uniforme. Ejemplos: nivel de satisfacción (muy insatisfecho / insatisfecho / satisfecho / muy satisfecho), frecuencia de uso (nunca / ocasionalmente / frecuentemente / siempre).
  • Dicotómicas: caso particular con solo dos categorías posibles (sí/no, usuario/no usuario). Pueden ser nominales u ordinales.

En R las variables cualitativas se representan como factor. Para las ordinales, se añade ordered = TRUE:

Code
# Nominal factor: brand preference
brand_pref <- factor(c("Nike", "Adidas", "Nike", "Puma", "Adidas"),
                     levels = c("Adidas", "Nike", "Puma"))

# Ordered factor: satisfaction level
satis_level <- factor(c("Satisfecho", "Muy satisfecho", "Insatisfecho",
                         "Satisfecho", "Muy insatisfecho"),
                      levels = c("Muy insatisfecho", "Insatisfecho",
                                 "Satisfecho", "Muy satisfecho"),
                      ordered = TRUE)

levels(brand_pref)
[1] "Adidas" "Nike"   "Puma"  
Code
levels(satis_level)
[1] "Muy insatisfecho" "Insatisfecho"     "Satisfecho"       "Muy satisfecho"  

3.2.2 Variables cuantitativas

Expresan cantidades numéricas con las que tiene sentido operar aritméticamente (sumar, promediar, calcular desviaciones). Pueden ser:

  • Discretas: solo toman valores enteros. Ejemplos: número de visitas al mes, número de hijos, número de productos comprados.
  • Continuas: pueden tomar cualquier valor dentro de un rango. Ejemplos: importe del ticket medio, edad exacta, tiempo de espera en minutos.

En R se representan como numeric (o integer para los enteros).

3.2.3 Variables independientes y dependientes

Cuando se plantea una relación explicativa entre variables, se distingue entre:

  • Variable independiente (o explicativa): la que se usa para explicar o predecir. En un análisis de satisfacción por perfil sociodemográfico, el sexo o la edad serían variables independientes.
  • Variable dependiente (o explicada): la que se quiere explicar. En el mismo ejemplo, la satisfacción sería la variable dependiente.

Esta distinción es relevante a partir del análisis bivariante y es central en los modelos de regresión.

3.3 Cuestionario, pregunta, variable y código

En investigación de mercados, el cuestionario es el instrumento de recogida de información. Se compone de preguntas, y cada pregunta genera una o varias variables en la matriz de datos.

Una pregunta puede dar lugar a una variable simple (una sola columna) o a una variable compuesta (varias columnas). La decisión de cómo representarla afecta directamente al análisis posterior:

Table 3.2: Relación entre pregunta y variable en el dataframe

Cada categoría de respuesta lleva asociado un código: un valor numérico que la representa en la matriz. Ese código no tiene por qué tener valor aritmético; su interpretación depende del nivel de medición:

  • Código con valor clasificatorio: escala nominal (el código solo distingue categorías).
  • Código con valor de orden: escala ordinal (el orden de los códigos importa, pero no la distancia).
  • Código con valor métrico: escala de intervalo o razón (el código representa una cantidad real).

3.4 Niveles de medición

El nivel de medición de una variable determina qué operaciones estadísticas son válidas sobre ella. Stevens (1946) definió cuatro niveles, que siguen siendo la referencia estándar en ciencias sociales.

3.4.1 Escala nominal

Solo permite clasificar. Las categorías se distinguen entre sí pero no tienen orden ni valor numérico real.

Table 3.3: Escala nominal — ejemplo de variable sexo

Operaciones válidas: frecuencias, moda, tablas de contingencia, chi-cuadrado. Operaciones no válidas: media, desviación típica, correlación de Pearson.

3.4.2 Escala ordinal

Permite clasificar y ordenar. La distancia entre categorías no es uniforme ni conocida.

Table 3.4: Escala ordinal — ejemplo de nivel de acuerdo

Operaciones válidas: frecuencias, moda, mediana, correlación de Spearman. Operaciones con precaución: media (técnicamente discutible, pero habitual en investigación de mercados con escalas de 5 o más puntos).

3.4.3 Escala de intervalo

Permite clasificar, ordenar y cuantificar diferencias. Las distancias entre puntos son iguales y conocidas, pero no existe un cero absoluto.

El ejemplo clásico es la temperatura en grados Celsius: 20 °C y 40 °C difieren en exactamente 20 grados, pero no se puede decir que 40 °C es “el doble de caliente” que 20 °C. En investigación de mercados, las escalas de valoración de 0 a 10 o las escalas Likert de amplio rango se tratan habitualmente como de intervalo.

Operaciones válidas: media, desviación típica, correlación de Pearson, regresión.

3.4.4 Escala de razón (o métrica)

Es el nivel más completo: permite clasificar, ordenar, cuantificar y además existe un cero absoluto (la ausencia total de la característica medida). Ejemplos: ingresos, edad, número de visitas, importe de compra.

Operaciones válidas: todas las anteriores más cocientes (“el cliente A gasta el doble que el cliente B”).

TipEscalas y análisis en investigación de mercados

En la práctica, la distinción más relevante es la que separa las variables cualitativas (nominal y ordinal) de las cuantitativas (intervalo y razón), porque determina qué técnicas de análisis son aplicables. Las variables cualitativas se analizan con frecuencias, tablas cruzadas y chi-cuadrado; las cuantitativas, con medias, correlaciones y regresión.

3.5 Categorías de respuesta

3.5.1 Principios que deben cumplir

Las categorías de respuesta de cualquier variable cualitativa deben cumplir tres principios:

  • Exhaustividad: deben cubrirse todas las opciones posibles. Se consigue añadiendo categorías de cierre como “Otros”, “Ninguna de las anteriores” o “No sabe”.
  • Mutua exclusión: cada respuesta debe encajar en una sola categoría, sin ambigüedad. (Excepción deliberada: preguntas de respuesta múltiple, donde el entrevistado puede elegir varias opciones.)
  • Unicidad taxonómica: las categorías deben definirse con un único criterio de clasificación. No sería correcto incluir en la variable “sexo” las opciones “niño” y “niña”, porque introduce el criterio de edad.

3.5.2 Categorías especiales: los valores perdidos

En cualquier encuesta existen respuestas que no aportan información sustantiva sobre la variable medida. Se denominan categorías especiales o valores perdidos (missing values) y en R se representan como NA. Hay cuatro tipos:

  • No contesta: el entrevistado puede responder pero decide no hacerlo.
  • No sabe: el entrevistado no tiene suficiente información o criterio para responder.
  • Filtrado / No aplica: la pregunta no se formula porque una respuesta anterior lo impide (p. ej., preguntar por la frecuencia de uso a alguien que ha dicho que no usa el producto).
  • No definido: la respuesta dada no encaja en ninguna de las categorías previstas (error de codificación, respuesta abierta no categorizable, etc.).
ImportantLos NA en SPSS vs. R

En SPSS los valores perdidos se suelen codificar como valores numéricos especiales (99, 999, -1…). Al importar a R, es imprescindible convertirlos a NA antes de cualquier análisis. De lo contrario, esos códigos se tratarán como valores reales y distorsionarán medias, correlaciones y cualquier estadístico calculado.

Code
# Replace SPSS-style missing codes with NA before analysis
df_example <- data.frame(
  satis  = c(7, 5, 99, 8, 6, 99, 9),   # 99 = "No contesta" in SPSS
  income = c(2, 4, 3, -1, 5, 3, 4)     # -1  = "No sabe" in SPSS
)

df_example$satis[df_example$satis   == 99] <- NA
df_example$income[df_example$income == -1] <- NA

df_example
  satis income
1     7      2
2     5      4
3    NA      3
4     8     NA
5     6      5
6    NA      3
7     9      4

3.6 Mapa de métodos de análisis

La escala de medición de las variables condiciona directamente qué técnica estadística es aplicable. El diagrama siguiente muestra las principales decisiones en el análisis bivariante:

Figure 3.1

3.7 Análisis de valores perdidos

Una vez identificadas las categorías especiales, el trabajo del analista consiste en entenderlas y gestionarlas correctamente. El error más común es precipitarse a eliminar o imputar sin antes diagnosticar la naturaleza de los NA.

3.7.1 Paso 1 — Depuración previa

Antes de analizar los valores perdidos hay que asegurarse de que los valores presentes son correctos. Muchos NA están “disfrazados” de valores numéricos no etiquetados (99, -1, 999…) que proceden de la codificación SPSS.

Code
# Build a small survey dataset with SPSS-style missing codes
survey <- data.frame(
  id     = 1:10,
  age    = c(34, 28, 999, 45, 52, 29, 38, 999, 41, 36),
  satis  = c(7, 5, 8, 99, 6, 9, 4, 7, 99, 8),
  income = c(3, 2, 4, 3, -1, 5, 3, 4, 2, -1)
)

# Check ranges before cleaning
range(survey$age,    na.rm = TRUE)
[1]  28 999
Code
range(survey$satis,  na.rm = TRUE)
[1]  4 99
Code
range(survey$income, na.rm = TRUE)
[1] -1  5
Code
library(dplyr)

# Replace out-of-range codes with NA
survey <- survey %>%
  dplyr::mutate(
    age    = dplyr::if_else(age    == 999, NA_real_, age),
    satis  = dplyr::if_else(satis  == 99,  NA_real_, satis),
    income = dplyr::if_else(income == -1,  NA_real_, income)
  )

# Verify: now ranges are clean
range(survey$age,    na.rm = TRUE)
[1] 28 52
Code
range(survey$satis,  na.rm = TRUE)
[1] 4 9

3.7.2 Paso 2 — Cuantificación

Una vez los NA están correctamente codificados, se cuantifica su presencia por variable y por caso:

Code
# NAs per variable (count and percentage)
na_count <- colSums(is.na(survey))
na_pct   <- round(colMeans(is.na(survey)) * 100, 1)

data.frame(n_missing = na_count, pct_missing = na_pct)
       n_missing pct_missing
id             0           0
age            2          20
satis          2          20
income         2          20
Code
# NAs per respondent (row-level)
survey$n_missing <- rowSums(is.na(survey))
survey[, c("id", "n_missing")]
   id n_missing
1   1         0
2   2         0
3   3         1
4   4         1
5   5         1
6   6         0
7   7         0
8   8         1
9   9         1
10 10         1

Una variable con más del 50% de NA raramente es utilizable. Un entrevistado con la mayoría de respuestas en blanco (probablemente abandonó la encuesta) puede descartarse.

3.7.3 Paso 3 — ¿Son aleatorios los valores perdidos?

El concepto clave es si los NA se distribuyen al azar o siguen un patrón sistemático:

  • MCAR (Missing Completely at Random): la ausencia no tiene relación con ninguna variable. Es el escenario ideal y el menos frecuente.
  • MAR (Missing at Random): la ausencia está relacionada con otras variables observadas, pero no con la propia variable que falta. Es tratable.
  • MNAR (Missing Not at Random): la ausencia está relacionada con el propio valor que falta (p. ej., las personas con ingresos muy altos o muy bajos son las que más evitan responder esa pregunta). Es el escenario más problemático.

Para detectar si los NA siguen un patrón, se cruza la variable afectada con otras variables demográficas:

Code
# Does the pattern of missing 'income' vary by another variable?
# Create a binary indicator: 1 = income is missing, 0 = income is present
survey <- survey %>%
  dplyr::mutate(income_missing = as.integer(is.na(income)))

# Compare mean satisfaction between those with and without income data
survey %>%
  dplyr::group_by(income_missing) %>%
  dplyr::summarise(
    n          = dplyr::n(),
    mean_satis = mean(satis, na.rm = TRUE)
  )
# A tibble: 2 × 3
  income_missing     n mean_satis
           <int> <int>      <dbl>
1              0     8       6.67
2              1     2       7   

Si la satisfacción media difiere notablemente entre los dos grupos, la ausencia de income no es aleatoria: está relacionada con el nivel de satisfacción.

Para una confirmación estadística, se aplica una prueba t:

Code
# t-test: does satisfaction differ between respondents with/without income data?
stats::t.test(satis ~ income_missing, data = survey)

    Welch Two Sample t-test

data:  satis by income_missing
t = -0.26537, df = 2.3336, p-value = 0.8124
alternative hypothesis: true difference in means between group 0 and group 1 is not equal to 0
95 percent confidence interval:
 -5.061043  4.394376
sample estimates:
mean in group 0 mean in group 1 
       6.666667        7.000000 

Un p-valor por debajo de 0,05 indica que la diferencia es estadísticamente significativa y que los datos perdidos en income no son completamente aleatorios.

3.7.4 Paso 4 — Tratamiento

Tras el diagnóstico, se elige el método de tratamiento más adecuado. No existe una solución única; la elección depende del patrón detectado y del porcentaje de NA.

Eliminación de casos (listwise deletion)

Se elimina toda fila que contenga al menos un NA en las variables de interés. Solo es recomendable si el porcentaje es pequeño (<5%) y los datos son MCAR.

Code
# Remove all rows with any NA (listwise deletion)
survey_complete <- stats::na.omit(survey[, c("age", "satis", "income")])
nrow(survey_complete)
[1] 4

Eliminación por parejas (pairwise deletion)

Se usa toda la información disponible para cada cálculo, excluyendo solo los casos sin dato en las variables implicadas en ese cálculo concreto. Es el comportamiento por defecto de funciones como stats::cor():

Code
# Pairwise deletion: uses all available data for each pair of variables
stats::cor(survey[, c("age", "satis", "income")],
           use = "pairwise.complete.obs")
              age      satis     income
age     1.0000000 -0.2401270 -0.2981698
satis  -0.2401270  1.0000000  0.8193465
income -0.2981698  0.8193465  1.0000000

Imputación por la media o la moda

Se sustituye cada NA numérico por la media de la variable, o cada NA categórico por la categoría más frecuente. Es un método simple pero que reduce artificialmente la variabilidad.

Code
# Impute NAs in 'age' with the variable mean
survey <- survey %>%
  dplyr::mutate(
    age_imp = dplyr::if_else(is.na(age), mean(age, na.rm = TRUE), age)
  )

Imputación aleatoria condicionada

En lugar de imputar siempre el mismo valor medio, se extrae un valor al azar de un subgrupo de casos similares al que tiene el dato perdido. Preserva mejor la variabilidad original.

Imputación por regresión

Se construye un modelo predictivo donde la variable con NA es la variable dependiente y otras variables del dataframe son las predictoras. El modelo predice el valor más probable para cada caso con dato perdido. Es el método más preciso de los simples.

Code
# Regression imputation for 'age' using 'satis' as predictor
model_age <- stats::lm(age ~ satis, data = survey)

survey <- survey %>%
  dplyr::mutate(
    age_reg_imp = dplyr::if_else(
      is.na(age),
      predict(model_age, newdata = dplyr::cur_data()),
      age
    )
  )
Warning: There was 1 warning in `dplyr::mutate()`.
ℹ In argument: `age_reg_imp = dplyr::if_else(...)`.
Caused by warning:
! `cur_data()` was deprecated in dplyr 1.1.0.
ℹ Please use `pick()` instead.
Tip¿Qué método elegir?
  • Porcentaje bajo de NA y patrón aleatorio (MCAR) → eliminación listwise.
  • Porcentaje moderado y patrón relacionado con otras variables (MAR) → imputación por regresión o imputación aleatoria condicionada.
  • Porcentaje alto o patrón sistemático (MNAR) → revisar el diseño del cuestionario; ninguna imputación simple es completamente satisfactoria.