Cómo usar este notebook

Este documento es un material de estudio guiado. Cada tema sigue siempre el mismo recorrido, para que entiendas el razonamiento económico y no solo el código:

  1. Idea intuitiva: qué problema enfrenta la empresa (o el regulador).
  2. Modelo y fórmulas: el problema de optimización, con la demostración de cada resultado.
  3. Cálculo paso a paso en R: cada fórmula se traduce en una o dos líneas de código.
  4. Verificación numérica: comprobamos el resultado analítico con optim(), integrate() o una simulación.
  5. Gráfico: para “ver” los excedentes, las funciones de reacción o la sostenibilidad del cártel.
  6. Interpretación económica y regulatoria.
  7. Ejercicio para practicar.

Instrucciones prácticas

  • Abre este archivo en RStudio. Ejecuta cada bloque gris con el triángulo verde o con Ctrl + Shift + Enter, o genera el informe completo con el botón Knit.
  • Solo se usa R base: no necesitas instalar paquetes (salvo rmarkdown para el botón Knit).
  • Todos los números del texto salen del código: si cambias un parámetro (por ejemplo, el costo marginal), vuelve a ejecutar y observa cómo cambian los resultados.
Sesión Tema Herramientas de R
5 Discriminación de precios de primer, segundo y tercer grado integrate(), solve(), optim()
6 Colusión: Cournot, Bertrand, dilema del cártel y factor de descuento crítico solve(), bucles for, simulación

1 Ideas previas que necesitamos

1.1 El modelo base

En toda la semana usaremos el mismo mercado, para poder comparar los resultados:

\[P(q) = a - q = 100 - q, \qquad CMg = c = 20 .\]

  • \(P(q)\) es la demanda inversa: el precio máximo que alguien está dispuesto a pagar por la unidad \(q\).
  • El costo marginal es constante: producir cada unidad cuesta 20.
a <- 100     # intercepto de la demanda inversa: P(q) = a - q
c <- 20      # costo marginal constante
P <- function(q) a - q          # demanda inversa como función de R
P(c(0, 40, 80))                 # precio que se paga por las unidades 0, 40 y 80
[1] 100  60  20

1.2 Excedentes como integrales

El excedente del consumidor (EC) es la diferencia entre lo que los consumidores estarían dispuestos a pagar y lo que efectivamente pagan. Si compran \(q\) unidades al precio \(p\):

\[EC = \int_0^{q} \big[P(x) - p\big]\,dx .\]

El excedente del productor (EP), con costo marginal constante y sin costos fijos, es el beneficio:

\[EP = \int_0^{q} \big[p - CMg\big]\,dx = (p - c)\,q .\]

El bienestar total es \(W = EC + EP\) y la pérdida irrecuperable de eficiencia (PIE) es lo que falta para llegar al máximo posible, que se alcanza cuando se produce hasta \(P(q) = CMg\):

\[W^{\max} = \int_0^{a-c} \big[P(x) - c\big]\,dx = \frac{(a-c)^2}{2} = \frac{80^2}{2} = 3200 .\]

En R, la función integrate() calcula integrales definidas numéricamente. Su resultado es una lista; el valor está en $value.

W_max <- integrate(function(x) P(x) - c, lower = 0, upper = a - c)$value
W_max
[1] 3200

1.3 Funciones auxiliares para salidas ordenadas

Para que las salidas sean fáciles de leer usaremos tres funciones de presentación. Se definen una sola vez y se usan en todo el documento:

  • ver(): muestra varios resultados con nombre, uno por línea y alineados.
  • mostrar(): imprime una tabla redondeada y sin la numeración de filas.
  • recuadro(): igual que ver(), pero dentro de un recuadro con título; la usamos para los resultados finales.
# fmt(): da formato a un número; los enteros se muestran sin decimales.
fmt <- function(v, dec = 2) {
  if (is.null(v) || length(v) == 0 || is.na(v)) return("--")
  if (!is.numeric(v)) return(as.character(v))
  if (abs(v - round(v)) < 1e-9) return(format(round(v), big.mark = ""))
  formatC(v, format = "f", digits = dec)
}

# ver(): valores con nombre, uno por línea y alineados.
#   Ejemplo: ver("Precio" = 60, "Cantidad" = 40)
ver <- function(..., dec = 2) {
  x <- list(...)
  cat(paste0("  ", format(names(x)), " : ",
             vapply(x, fmt, character(1), dec = dec)), sep = "\n")
}

# mostrar(): data.frame redondeado y sin numeración de filas.
mostrar <- function(df, dec = 2) {
  df <- as.data.frame(df)
  num <- vapply(df, is.numeric, logical(1))
  df[num] <- lapply(df[num], round, dec)
  print(df, row.names = FALSE)
}

# recuadro(): resultados finales dentro de un recuadro con título.
recuadro <- function(titulo, ..., dec = 2) {
  linea <- strrep("-", 60)
  cat(linea, "\n", " ", titulo, "\n", linea, "\n", sep = "")
  ver(..., dec = dec)
  cat(linea, "\n", sep = "")
}

1.4 Punto de partida: el monopolio con precio único

El monopolista que cobra un solo precio elige \(q\) para maximizar \(\pi(q) = P(q)\,q - c\,q = (a - q)\,q - c\,q\). La condición de primer orden es

\[\frac{d\pi}{dq} = \underbrace{a - 2q}_{IMg} - \underbrace{c}_{CMg} = 0 \quad\Longrightarrow\quad q_m = \frac{a-c}{2} = 40, \qquad p_m = a - q_m = 60 .\]

qm <- (a - c) / 2                                         # cantidad de monopolio
pm <- P(qm)                                               # precio de monopolio
pi_m  <- (pm - c) * qm                                    # beneficio
EC_m  <- integrate(function(x) P(x) - pm, 0, qm)$value    # excedente del consumidor
PIE_m <- W_max - pi_m - EC_m                              # lo que se pierde
recuadro("Monopolio con precio único",
         "Cantidad (q)" = qm, "Precio (p)" = pm, "Beneficio" = pi_m,
         "Excedente del consumidor" = EC_m, "Pérdida irrecuperable" = PIE_m,
         "Bienestar total" = pi_m + EC_m)
------------------------------------------------------------
 Monopolio con precio único
------------------------------------------------------------
  Cantidad (q)             : 40
  Precio (p)               : 60
  Beneficio                : 1600
  Excedente del consumidor : 800
  Pérdida irrecuperable    : 800
  Bienestar total          : 2400
------------------------------------------------------------

Interpretación. Con precio único, el monopolio deja \(EC = 800\) a los consumidores y destruye \(PIE = 800\): hay 40 unidades (de la 41 a la 80) que los consumidores valoran más que su costo, pero no se producen. La pregunta de la semana es: ¿puede la empresa capturar también esos excedentes? Hay dos caminos: cobrar precios distintos (sesión 5) o coordinarse con sus rivales (sesión 6).

2 Sesión 5 — Discriminación de precios

2.1 ¿Qué es discriminar precios?

Discriminar precios es vender unidades del mismo bien a precios distintos, sin que la diferencia se explique por diferencias de costos. Para hacerlo, la empresa necesita tres condiciones:

  1. Poder de mercado: puede fijar un precio mayor que el costo marginal.
  2. Información o segmentación: puede identificar o clasificar a los consumidores según su disposición a pagar.
  3. No reventa (no arbitraje): quien compra barato no puede revender a quien paga caro.

Pigou (1920) clasificó la discriminación en tres grados, según cuánta información tiene la empresa:

Grado Qué conoce la empresa Ejemplo
Primer grado (perfecta) La disposición a pagar de cada consumidor Subastas, negociación individual
Segundo grado Nada individual: ofrece un menú y el consumidor elige Tarifas por bloques, paquetes de datos
Tercer grado Una característica observable del grupo Tarifa de estudiante, precios por región

2.2 Primer grado: discriminación perfecta

2.2.1 Idea y modelo

La empresa cobra a cada consumidor exactamente su precio de reserva: la unidad \(q\) se vende al precio \(P(q)\). Entonces su ingreso ya no es \(p \cdot q\) sino el área bajo la demanda, y su beneficio es

\[\pi(Q) = \int_0^{Q} P(x)\,dx - c\,Q = \int_0^{Q} \big[P(x) - c\big]\,dx .\]

¿Hasta dónde produce? Derivando con el teorema fundamental del cálculo:

\[\frac{d\pi}{dQ} = P(Q) - c = 0 \quad\Longrightarrow\quad P(Q) = c \quad\Longrightarrow\quad Q = a - c = 80 .\]

Es decir, el ingreso marginal coincide con la demanda: vender una unidad más no obliga a bajar el precio de las anteriores. Por eso la empresa produce la cantidad eficiente, la misma que en competencia perfecta.

2.2.2 Cálculo paso a paso en R

# Paso 1: cantidad que maximiza el beneficio, P(Q) = c
Q1 <- a - c

# Paso 2: beneficio = integral de [P(x) - c] entre 0 y Q
pi_1 <- integrate(function(x) P(x) - c, 0, Q1)$value

# Paso 3: el consumidor paga su precio de reserva, por lo que EC = 0
EC_1  <- 0
PIE_1 <- W_max - pi_1 - EC_1

recuadro("Discriminación de primer grado",
         "Cantidad (Q)" = Q1, "Beneficio" = pi_1,
         "Excedente del consumidor" = EC_1, "Pérdida irrecuperable" = PIE_1)
------------------------------------------------------------
 Discriminación de primer grado
------------------------------------------------------------
  Cantidad (Q)             : 80
  Beneficio                : 3200
  Excedente del consumidor : 0
  Pérdida irrecuperable    : 0
------------------------------------------------------------

Comprobamos la integral a mano: \(\int_0^{80}(80 - x)\,dx = \big[80x - \tfrac{x^2}{2}\big]_0^{80} = 6400 - 3200 = 3200\).

2.2.3 Gráfico

op <- par(mfrow = c(1, 2), mar = c(4, 4, 2.5, 1))
# Izquierda: monopolio con precio único
plot(0, type = "n", xlim = c(0, 100), ylim = c(0, 100), xlab = "q", ylab = "P",
     main = "Precio único")
polygon(c(0, qm, 0), c(a, pm, pm), col = "#cfe0f3", border = NA)              # EC
polygon(c(0, qm, qm, 0), c(pm, pm, c, c), col = "#c8e6c9", border = NA)      # beneficio
polygon(c(qm, a - c, qm), c(pm, c, c), col = "#f2c4cc", border = NA)         # PIE
abline(a = a, b = -1, col = "#002D62", lwd = 2); abline(h = c, lwd = 2, col = "gray40")
text(c(12, 20, 52), c(68, 40, 30), c("EC = 800", "Benef. = 1600", "PIE"), cex = 0.8)
# Derecha: discriminación perfecta
plot(0, type = "n", xlim = c(0, 100), ylim = c(0, 100), xlab = "q", ylab = "P",
     main = "Primer grado")
polygon(c(0, Q1, 0), c(a, c, c), col = "#c8e6c9", border = NA)
abline(a = a, b = -1, col = "#002D62", lwd = 2); abline(h = c, lwd = 2, col = "gray40")
text(25, 45, "Beneficio = 3200", cex = 0.8)

par(op)

2.2.4 La tarifa en dos partes: el primer grado en la práctica

Si todos los consumidores son idénticos, la empresa puede replicar la discriminación perfecta con una tarifa en dos partes: un cargo fijo \(A\) más un precio \(p\) por unidad,

\[T(q) = A + p\,q .\]

Razonamiento en dos pasos:

  1. El precio por unidad decide cuánto consume la persona. Si \(p = c\), consume la cantidad eficiente \(q = 80\).
  2. El cargo fijo decide si compra. La persona acepta mientras \(A \le EC(p)\). La empresa fija \(A = EC(c) = \tfrac12 (a - c)^2 = 3200\) y se queda con todo el excedente.
p_dp <- c                                                      # precio por unidad = CMg
A    <- integrate(function(x) P(x) - p_dp, 0, a - p_dp)$value  # cargo fijo = EC con p = c
recuadro("Tarifa en dos partes (consumidores idénticos)",
         "Precio por unidad (p)" = p_dp, "Cargo fijo (A)" = A,
         "Beneficio = A + (p - c) q" = A + (p_dp - c) * (a - p_dp))
------------------------------------------------------------
 Tarifa en dos partes (consumidores idénticos)
------------------------------------------------------------
  Precio por unidad (p)     : 20
  Cargo fijo (A)            : 3200
  Beneficio = A + (p - c) q : 3200
------------------------------------------------------------

Conexión con la semana 2. En el monopolio natural usamos la tarifa en dos partes para cubrir el costo fijo. Aquí la empresa la usa para maximizar su beneficio. Es el mismo instrumento con otro objetivo; por eso el regulador suele fijar también el cargo fijo.

Con consumidores distintos, un único cargo fijo deja de funcionar: si \(A\) es alto, los de baja demanda no compran. Esto nos lleva a la discriminación de segundo grado.

2.3 Segundo grado: precios por bloques

2.3.1 Idea y modelo

La empresa no sabe quién es quién, pero ofrece un menú: las primeras \(q_1\) unidades a \(p_1\) y las siguientes, hasta \(q_2\), a un precio menor \(p_2\) (un descuento por volumen). Cada consumidor elige cuánto comprar. Con \(p_1 = P(q_1)\) y \(p_2 = P(q_2)\), el beneficio es

\[\pi(q_1, q_2) = \underbrace{(a - q_1)\,q_1}_{\text{bloque 1}} + \underbrace{(a - q_2)(q_2 - q_1)}_{\text{bloque 2}} - c\,q_2 .\]

Condiciones de primer orden. Derivamos respecto de cada cantidad:

\[\frac{\partial \pi}{\partial q_1} = a - 2q_1 - (a - q_2) = q_2 - 2q_1 = 0 \quad\Longrightarrow\quad q_2 = 2q_1,\]

\[\frac{\partial \pi}{\partial q_2} = -(q_2 - q_1) + (a - q_2) - c = a - c + q_1 - 2q_2 = 0 .\]

Reemplazando \(q_2 = 2q_1\) en la segunda: \(a - c + q_1 - 4q_1 = 0\), es decir

\[q_1 = \frac{a-c}{3} = 26.67, \qquad q_2 = \frac{2(a-c)}{3} = 53.33 .\]

2.3.2 Paso 1: resolver las condiciones de primer orden como sistema lineal

Las dos condiciones forman un sistema lineal \(M\,\mathbf{q} = \mathbf{b}\):

\[\begin{pmatrix} -2 & 1 \\ 1 & -2 \end{pmatrix} \begin{pmatrix} q_1 \\ q_2 \end{pmatrix} = \begin{pmatrix} 0 \\ -(a - c) \end{pmatrix}.\]

La función solve(M, b) de R lo resuelve directamente:

M <- matrix(c(-2,  1,
               1, -2), nrow = 2, byrow = TRUE)
b <- c(0, -(a - c))
q_bloques <- solve(M, b)
ver("q1" = q_bloques[1], "q2" = q_bloques[2])
  q1 : 26.67
  q2 : 53.33

2.3.3 Paso 2: comprobar con optimización numérica

optim() minimiza una función. Para maximizar el beneficio, le damos el beneficio con signo negativo. Partimos de un punto cualquiera, por ejemplo \((20, 50)\):

menos_beneficio <- function(x) {
  q1 <- x[1]; q2 <- x[2]
  -((a - q1) * q1 + (a - q2) * (q2 - q1) - c * q2)
}
opt <- optim(c(20, 50), menos_beneficio, method = "BFGS")
ver("q1 (optim)" = opt$par[1], "q2 (optim)" = opt$par[2],
    "Beneficio máximo" = -opt$value)
  q1 (optim)       : 26.67
  q2 (optim)       : 53.33
  Beneficio máximo : 2133.33

Los dos métodos coinciden: la solución analítica es correcta.

2.3.4 Paso 3: precios, excedentes y bienestar

El consumidor paga \(p_1\) por cada unidad del primer bloque y \(p_2\) por cada unidad del segundo. Su excedente es lo que valora todas las unidades menos lo que paga:

\[EC = \int_0^{q_2} P(x)\,dx - \big[p_1 q_1 + p_2 (q_2 - q_1)\big].\]

q1 <- q_bloques[1]; q2 <- q_bloques[2]
p1 <- P(q1); p2 <- P(q2)
pago   <- p1 * q1 + p2 * (q2 - q1)                     # lo que paga el consumidor
valor  <- integrate(P, 0, q2)$value                    # lo que valora las q2 unidades
EC_2   <- valor - pago
pi_2   <- pago - c * q2
PIE_2  <- W_max - pi_2 - EC_2
recuadro("Discriminación de segundo grado (dos bloques)",
         "Precio del bloque 1 (p1)" = p1, "Precio del bloque 2 (p2)" = p2,
         "Cantidad total (q2)" = q2, "Beneficio" = pi_2,
         "Excedente del consumidor" = EC_2, "Pérdida irrecuperable" = PIE_2,
         "Total (debe ser 3200)" = pi_2 + EC_2 + PIE_2)
------------------------------------------------------------
 Discriminación de segundo grado (dos bloques)
------------------------------------------------------------
  Precio del bloque 1 (p1) : 73.33
  Precio del bloque 2 (p2) : 46.67
  Cantidad total (q2)      : 53.33
  Beneficio                : 2133.33
  Excedente del consumidor : 711.11
  Pérdida irrecuperable    : 355.56
  Total (debe ser 3200)    : 3200
------------------------------------------------------------

2.3.5 Gráfico

op <- par(mar = c(4, 4, 2.5, 1))
plot(0, type = "n", xlim = c(0, 100), ylim = c(0, 100), xlab = "q", ylab = "P",
     main = "Precios por bloques: la empresa cobra p1 y luego p2")
polygon(c(0, q1, q1, 0), c(p1, p1, c, c), col = "#c8e6c9", border = "gray30")
polygon(c(q1, q2, q2, q1), c(p2, p2, c, c), col = "#c8e6c9", border = "gray30")
polygon(c(0, q1, 0), c(a, p1, p1), col = "#cfe0f3", border = NA)
polygon(c(q1, q2, q1), c(p1, p2, p2), col = "#cfe0f3", border = NA)
polygon(c(q2, a - c, q2), c(p2, c, c), col = "#f2c4cc", border = NA)
abline(a = a, b = -1, col = "#002D62", lwd = 2); abline(h = c, lwd = 2, col = "gray40")
text(c(13, 40, 63), c(48, 33, 25), c("Beneficio\nbloque 1", "Beneficio\nbloque 2", "PIE"),
     cex = 0.75)
legend("topright", fill = c("#cfe0f3", "#c8e6c9", "#f2c4cc"),
       legend = c("Excedente del consumidor", "Beneficio", "Pérdida irrecuperable"),
       bty = "n", cex = 0.8)

par(op)

2.3.6 ¿Qué pasa con más bloques?

Con \(n\) bloques, el mismo razonamiento da \(q_k = \dfrac{k\,(a-c)}{n+1}\) para \(k = 1, \dots, n\) (cantidades igualmente espaciadas). Sustituyendo en las áreas se obtiene

\[\pi_n = \frac{n}{n+1}\cdot\frac{(a-c)^2}{2}, \qquad PIE_n = \frac{(a-c)^2}{2\,(n+1)^2} .\]

En vez de demostrarlo con álgebra, lo comprobamos numéricamente: escribimos el beneficio para \(n\) bloques cualesquiera y lo maximizamos con optim().

# Beneficio con n bloques: sum_k (a - q_k)(q_k - q_{k-1}) - c q_n, con q_0 = 0
beneficio_bloques <- function(q) {
  q <- sort(q)
  sum((a - q) * diff(c(0, q))) - c * max(q)
}
tabla_bloques <- data.frame()
for (n in 1:6) {
  inicio <- seq(10, 70, length.out = n)                       # punto de partida
  r <- optim(inicio, function(q) -beneficio_bloques(q), method = "BFGS")
  qn <- max(r$par)
  EC <- integrate(P, 0, qn)$value - sum(P(sort(r$par)) * diff(c(0, sort(r$par))))
  tabla_bloques <- rbind(tabla_bloques,
    data.frame(bloques = n, beneficio = -r$value,
               formula = n / (n + 1) * (a - c)^2 / 2,
               EC = EC, PIE = W_max + r$value - EC))
}
mostrar(tabla_bloques)
 bloques beneficio formula     EC    PIE
       1   1600.00 1600.00 800.00 800.00
       2   2133.33 2133.33 711.11 355.56
       3   2400.00 2400.00 600.00 200.00
       4   2560.00 2560.00 512.00 128.00
       5   2666.67 2666.67 444.44  88.89
       6   2742.86 2742.86 391.84  65.31

Interpretación. La columna beneficio (calculada con optim()) coincide con la formula. A medida que aumenta el número de bloques, el beneficio se acerca a 3200 y la pérdida irrecuperable desaparece: el segundo grado converge al primer grado. Frente al precio único (beneficio 1600, PIE 800), los bloques aumentan la producción y reducen la ineficiencia, aunque el excedente del consumidor también se reduce.

2.4 Tercer grado: mercados separados

2.4.1 Idea y modelo

La empresa vende en dos mercados que puede separar por una característica observable (edad, región, condición de estudiante) y fija un precio en cada uno:

\[\text{Mercado 1: } P_1 = 100 - q_1, \qquad \text{Mercado 2: } P_2 = 60 - q_2, \qquad CMg = 20 .\]

Como el costo marginal es constante, los dos mercados son independientes y en cada uno la empresa iguala su ingreso marginal al costo marginal:

\[IMg_i = a_i - 2q_i = c \quad\Longrightarrow\quad q_i = \frac{a_i - c}{2},\qquad p_i = \frac{a_i + c}{2}.\]

2.4.2 La regla de la elasticidad inversa (demostración)

El ingreso marginal se puede escribir en función de la elasticidad. Como \(IT = p(q)\,q\):

\[IMg = p + q\,\frac{dp}{dq} = p\left(1 + \frac{q}{p}\frac{dp}{dq}\right) = p\left(1 - \frac{1}{|\varepsilon|}\right).\]

Igualando \(IMg_i = CMg\) en cada mercado y despejando:

\[p_i\left(1 - \frac{1}{|\varepsilon_i|}\right) = CMg \quad\Longrightarrow\quad \boxed{\;\frac{p_i - CMg}{p_i} = \frac{1}{|\varepsilon_i|}\;}\]

El lado izquierdo es el índice de Lerner. Conclusión: el precio es más alto donde la demanda es más inelástica. Con demanda lineal \(q = a_i - p\), la elasticidad es \(|\varepsilon_i| = p_i / q_i\).

2.4.3 Cálculo paso a paso en R

Escribimos una función que resuelve un mercado y la aplicamos a los dos:

mercado <- function(ai, c) {
  q <- (ai - c) / 2                         # IMg = CMg
  p <- ai - q                               # precio en la demanda
  data.frame(q = q, p = p,
             beneficio = (p - c) * q,
             EC = 0.5 * (ai - p) * q,       # área del triángulo
             elasticidad = p / q,           # |e| = p / q con demanda lineal
             Lerner = (p - c) / p,
             inversa_elast = q / p)         # 1 / |e|: debe ser igual al Lerner
}
discr <- rbind(cbind(mercado = "M1", mercado(100, c)),
               cbind(mercado = "M2", mercado(60, c)))
mostrar(discr, dec = 3)
 mercado  q  p beneficio  EC elasticidad Lerner inversa_elast
      M1 40 60      1600 800         1.5  0.667         0.667
      M2 20 40       400 200         2.0  0.500         0.500

En los dos mercados, la columna Lerner es igual a inversa_elast: la regla se cumple. El mercado 1 es menos elástico (\(|\varepsilon_1| = 1.5\)) y por eso paga más (60 frente a 40).

2.4.4 Gráfico

op <- par(mfrow = c(1, 2), mar = c(4, 4, 2.5, 1))
for (i in 1:2) {
  ai <- c(100, 60)[i]; qi <- discr$q[i]; pi_ <- discr$p[i]
  plot(0, type = "n", xlim = c(0, 100), ylim = c(0, 100), xlab = "q", ylab = "P",
       main = paste0("Mercado ", i, ": P = ", ai, " - q"))
  polygon(c(0, qi, 0), c(ai, pi_, pi_), col = "#cfe0f3", border = NA)
  polygon(c(0, qi, qi, 0), c(pi_, pi_, c, c), col = "#c8e6c9", border = NA)
  abline(a = ai, b = -1, col = "#002D62", lwd = 2)            # demanda
  abline(a = ai, b = -2, col = "#80162A", lwd = 2, lty = 2)   # ingreso marginal
  abline(h = c, lwd = 2, col = "gray40")
  points(qi, pi_, pch = 19)
  text(qi / 2, (pi_ + c) / 2, paste("Benef. =", discr$beneficio[i]), cex = 0.75)
}

par(op)

La línea punteada guinda es el ingreso marginal: corta al costo marginal en \(q_1 = 40\) y \(q_2 = 20\).

2.4.5 ¿Mejora o empeora el bienestar? Comparación con el precio único

Si la empresa no puede discriminar, cobra un solo precio \(p\) en ambos mercados. Para \(p \le 60\) compran los dos mercados y la demanda agregada es

\[Q(p) = (100 - p) + (60 - p) = 160 - 2p \quad\Longrightarrow\quad \max_p\ (p - 20)(160 - 2p): \quad 200 - 4p = 0 \;\Rightarrow\; p_u = 50 .\]

Hay que tener cuidado: la demanda agregada tiene un quiebre en \(p = 60\) (por encima, el mercado 2 no compra). Por eso, en lugar de confiar solo en la derivada, buscamos el mejor precio único en una grilla de precios. Así el método funciona con cualquier par de mercados:

precio_uniforme <- function(a1, a2, c) {
  p  <- seq(c, max(a1, a2), by = 0.01)                    # precios candidatos
  q1 <- pmax(a1 - p, 0); q2 <- pmax(a2 - p, 0)            # nadie compra cantidades negativas
  benef <- (p - c) * (q1 + q2)
  k <- which.max(benef)
  data.frame(p = p[k], q1 = q1[k], q2 = q2[k], beneficio = benef[k],
             EC = 0.5 * q1[k]^2 + 0.5 * q2[k]^2)
}
unico <- precio_uniforme(100, 60, c)
mostrar(unico)
  p q1 q2 beneficio   EC
 50 50 10      1800 1300

Ahora comparamos los dos regímenes:

comparacion <- data.frame(
  regimen   = c("Precio único", "Discriminación 3er grado"),
  precio_M1 = c(unico$p, discr$p[1]),
  precio_M2 = c(unico$p, discr$p[2]),
  Q         = c(unico$q1 + unico$q2, sum(discr$q)),
  beneficio = c(unico$beneficio, sum(discr$beneficio)),
  EC        = c(unico$EC, sum(discr$EC)))
comparacion$W <- comparacion$beneficio + comparacion$EC
mostrar(comparacion)
                  regimen precio_M1 precio_M2  Q beneficio   EC    W
             Precio único        50        50 60      1800 1300 3100
 Discriminación 3er grado        60        40 60      2000 1000 3000

Interpretación.

  • La empresa gana con la discriminación (2000 frente a 1800).
  • Los consumidores del mercado 2 ganan (pagan 40 en vez de 50); los del mercado 1 pierden (pagan 60 en vez de 50).
  • La cantidad total no cambia (\(Q = 60\)), pero ahora está peor repartida: unidades que valoraba más un consumidor del mercado 1 se las lleva uno del mercado 2. Por eso el bienestar total cae en 100.

Resultado de Schmalensee (1981). Con demandas lineales, si la discriminación de tercer grado no aumenta la producción total, el bienestar cae. Solo puede mejorar cuando permite abrir mercados que con un precio único no se atenderían.

2.4.6 Caso en que la discriminación sí mejora el bienestar

Cambiemos el mercado 2 por uno de menor disposición a pagar: \(P_2 = 40 - q_2\). Basta cambiar un número en el código:

unico_b <- precio_uniforme(100, 40, c)
discr_b <- rbind(mercado(100, c), mercado(40, c))
caso_b <- data.frame(
  regimen   = c("Precio único", "Discriminación 3er grado"),
  precio_M1 = c(unico_b$p, discr_b$p[1]),
  precio_M2 = c(unico_b$p, discr_b$p[2]),
  q_M2      = c(unico_b$q2, discr_b$q[2]),
  beneficio = c(unico_b$beneficio, sum(discr_b$beneficio)),
  EC        = c(unico_b$EC, sum(discr_b$EC)))
caso_b$W <- caso_b$beneficio + caso_b$EC
mostrar(caso_b)
                  regimen precio_M1 precio_M2 q_M2 beneficio  EC    W
             Precio único        60        60    0      1600 800 2400
 Discriminación 3er grado        60        30   10      1700 850 2550

Con precio único, a la empresa le conviene cobrar 60 y abandonar el mercado 2 (nadie ahí paga 60). Con discriminación, atiende al mercado 2 a un precio de 30: la empresa gana 100 más, los consumidores del mercado 2 obtienen 50 de excedente y los del mercado 1 quedan igual. Todos ganan o quedan igual: es una mejora de Pareto. Esta es la justificación de las tarifas sociales y de estudiante.

2.5 Ejercicio de la sesión 5

Un monopolista con \(CMg = 10\) vende en dos mercados: \(P_1 = 80 - q_1\) y \(P_2 = 50 - q_2\).

  1. Calcule precios, cantidades y beneficio con discriminación de tercer grado. Verifique la regla de la elasticidad inversa.
  2. Calcule el precio único óptimo con precio_uniforme().
  3. ¿La discriminación aumenta o reduce el bienestar? ¿Cambió la producción total?

Pista: basta con cambiar los argumentos de mercado() y precio_uniforme().

3 Sesión 6 — Colusión y cárteles

3.1 Prácticas anticompetitivas: la colusión

Colusión es un acuerdo, explícito o tácito, entre empresas competidoras para fijar precios, repartirse mercados o restringir la producción, con el fin de obtener beneficios cercanos a los de un monopolio.

  • Colusión explícita (cártel): acuerdos directos (reuniones, correos, reparto de clientes). En el Perú es una práctica prohibida en forma absoluta (D. Leg. 1034), sancionada por el Indecopi.
  • Colusión tácita: las empresas coordinan sin comunicarse, por la amenaza de represalias en un juego repetido. Es más difícil de probar.

Para saber si un cártel es sostenible necesitamos dos puntos de referencia de la competencia: el modelo de Cournot (las empresas eligen cantidades) y el de Bertrand (eligen precios).

3.2 Modelo de Cournot: competencia en cantidades

3.2.1 Idea y modelo

Dos empresas idénticas eligen sus cantidades \(q_1\) y \(q_2\) al mismo tiempo. El precio depende de la producción total: \(P = 100 - (q_1 + q_2)\) y \(CMg = 20\).

Problema de la empresa 1 (toma \(q_2\) como dada):

\[\max_{q_1}\ \pi_1 = \big(100 - q_1 - q_2 - 20\big)\,q_1 \qquad\Longrightarrow\qquad \frac{\partial \pi_1}{\partial q_1} = 80 - 2q_1 - q_2 = 0 .\]

Despejando obtenemos la función de reacción (la mejor respuesta a cada \(q_2\)):

\[q_1 = R_1(q_2) = \frac{80 - q_2}{2}, \qquad\text{y por simetría}\qquad q_2 = R_2(q_1) = \frac{80 - q_1}{2}.\]

Equilibrio de Nash: ninguna empresa quiere cambiar su cantidad dada la del rival, es decir, cada una está sobre su función de reacción. Resolvemos el sistema:

\[\begin{cases} 2q_1 + q_2 = 80 \\ q_1 + 2q_2 = 80 \end{cases} \quad\Longrightarrow\quad q_1 = q_2 = \frac{80}{3} = 26.67 .\]

3.2.2 Paso 1: resolver el equilibrio con solve()

M_c <- matrix(c(2, 1,
                1, 2), nrow = 2, byrow = TRUE)
q_cournot <- solve(M_c, c(a - c, a - c))
Q_c  <- sum(q_cournot)
P_c  <- a - Q_c
pi_N <- (P_c - c) * q_cournot[1]           # beneficio de cada empresa ("N" de Nash)
recuadro("Equilibrio de Cournot (duopolio)",
         "q1" = q_cournot[1], "q2" = q_cournot[2], "Producción total" = Q_c,
         "Precio" = P_c, "Beneficio de cada empresa" = pi_N)
------------------------------------------------------------
 Equilibrio de Cournot (duopolio)
------------------------------------------------------------
  q1                        : 26.67
  q2                        : 26.67
  Producción total          : 53.33
  Precio                    : 46.67
  Beneficio de cada empresa : 711.11
------------------------------------------------------------

3.2.3 Paso 2: ¿cómo se llega al equilibrio? Ajuste por mejores respuestas

Imaginemos que la empresa 1 empieza produciendo como monopolio (\(q_1 = 40\)) y que, por turnos, cada empresa responde de manera óptima a lo último que hizo la otra:

R <- function(q_rival) (a - c - q_rival) / 2      # función de reacción
q1_t <- 40; q2_t <- 0
pasos <- data.frame()
for (t in 1:8) {
  q2_t <- R(q1_t)                                 # la empresa 2 responde
  q1_t <- R(q2_t)                                 # la empresa 1 responde
  pasos <- rbind(pasos, data.frame(ronda = t, q1 = q1_t, q2 = q2_t))
}
mostrar(pasos, dec = 3)
 ronda     q1     q2
     1 30.000 20.000
     2 27.500 25.000
     3 26.875 26.250
     4 26.719 26.562
     5 26.680 26.641
     6 26.670 26.660
     7 26.667 26.665
     8 26.667 26.666

En pocas rondas las cantidades llegan a \(26.667\): el equilibrio de Nash es estable.

3.2.4 Gráfico de las funciones de reacción

op <- par(mar = c(4, 4, 2.5, 1))
q <- seq(0, 80, by = 0.5)
plot(q, R(q), type = "l", lwd = 2, col = "#002D62", xlim = c(0, 80), ylim = c(0, 80),
     xlab = "q2", ylab = "q1", main = "Funciones de reacción")      # R1: q1 en función de q2
lines(R(q), q, lwd = 2, col = "#80162A")                           # R2: q2 en función de q1
# puntos visitados en el ajuste por mejores respuestas
points(pasos$q2, pasos$q1, pch = 4, col = "gray40")
points(q_cournot[2], q_cournot[1], pch = 19, cex = 1.3)
text(q_cournot[2] + 4, q_cournot[1] + 4, "Nash", cex = 0.9)
legend("topright", lwd = 2, col = c("#002D62", "#80162A"),
       legend = c("R1: q1 = (80 - q2)/2", "R2: q2 = (80 - q1)/2"), bty = "n", cex = 0.85)

par(op)

3.2.5 Cournot con \(n\) empresas y el índice HHI

Con \(n\) empresas simétricas, la misma condición de primer orden (\(a - c - Q - q_i = 0\), con \(Q = n\,q_i\) en el equilibrio) da

\[q_i = \frac{a-c}{n+1}, \qquad P = c + \frac{a-c}{n+1}.\]

Además, en el equilibrio de Cournot se cumple una relación muy usada en política de competencia:

\[L = \frac{P - CMg}{P} = \frac{HHI}{|\varepsilon|}, \qquad HHI = \sum_i s_i^2 .\]

Demostración. La condición de primer orden de la empresa \(i\) es \(P + q_i\,\dfrac{dP}{dQ} = c\). Restando \(c\) y dividiendo entre \(P\):

\[\frac{P - c}{P} = -\frac{q_i}{P}\,\frac{dP}{dQ} = \underbrace{\frac{q_i}{Q}}_{s_i}\cdot\underbrace{\frac{Q}{P}\left(-\frac{dP}{dQ}\right)}_{1/|\varepsilon|} = \frac{s_i}{|\varepsilon|}.\]

Multiplicamos ambos lados por \(s_i\) y sumamos sobre todas las empresas. Como \(\sum_i s_i = 1\):

\[\frac{P - c}{P}\sum_i s_i = \frac{P - c}{P} = \frac{\sum_i s_i^2}{|\varepsilon|} = \frac{HHI}{|\varepsilon|}. \qquad\blacksquare\]

n  <- c(1, 2, 3, 5, 10, 20)
qi <- (a - c) / (n + 1)
Pn <- c + (a - c) / (n + 1)
Qn <- n * qi
tabla_n <- data.frame(n = n, q_i = qi, P = Pn,
                      Lerner = (Pn - c) / Pn,
                      HHI = 1 / n,                       # n empresas iguales: s_i = 1/n
                      elasticidad = Pn / Qn)             # |e| = P / Q
tabla_n$HHI_entre_e <- tabla_n$HHI / tabla_n$elasticidad
mostrar(tabla_n, dec = 3)
  n    q_i      P Lerner   HHI elasticidad HHI_entre_e
  1 40.000 60.000  0.667 1.000       1.500       0.667
  2 26.667 46.667  0.571 0.500       0.875       0.571
  3 20.000 40.000  0.500 0.333       0.667       0.500
  5 13.333 33.333  0.400 0.200       0.500       0.400
 10  7.273 27.273  0.267 0.100       0.375       0.267
 20  3.810 23.810  0.160 0.050       0.312       0.160

Las columnas Lerner y HHI_entre_e son idénticas: la fórmula se verifica. Con más empresas el precio se acerca al costo marginal. Esta relación justifica usar el HHI como medida de poder de mercado, tema de la próxima semana.

3.3 Modelo de Bertrand: competencia en precios

3.3.1 La paradoja de Bertrand

Ahora las dos empresas eligen precios, el producto es homogéneo y los consumidores compran a la más barata (si cobran lo mismo, se reparten el mercado). El único equilibrio de Nash es

\[p_1 = p_2 = CMg = 20 .\]

Demostración (por casos).

  • Si \(p_1 > p_2 > c\): la empresa 1 no vende; le conviene bajar a \(p_2 - \epsilon\) y quedarse con todo el mercado.
  • Si \(p_1 = p_2 > c\): cada una vende la mitad; bajando un poco su precio, una empresa casi duplica sus ventas.
  • Si \(p_i < c\): la empresa que vende tiene pérdidas; le conviene subir su precio.
  • Si \(p_1 = p_2 = c\): ninguna gana subiendo (pierde todo el mercado) ni bajando (tendría pérdidas). \(\blacksquare\)

Con solo dos empresas se obtiene el resultado competitivo y el beneficio es cero.

3.3.2 Simulación de la “guerra de precios”

Simulemos el proceso con precios en soles enteros. La función mejor_precio() busca, entre todos los precios posibles, el que da más beneficio a una empresa dado el precio del rival:

beneficio_b <- function(p_propio, p_rival) {
  Q <- max(a - p_propio, 0)                                   # demanda del mercado
  cuota <- ifelse(p_propio < p_rival, 1, ifelse(p_propio == p_rival, 0.5, 0))
  (p_propio - c) * Q * cuota
}
mejor_precio <- function(p_rival) {
  candidatos <- c:a                                           # precios de 20 a 100
  b <- sapply(candidatos, beneficio_b, p_rival = p_rival)
  candidatos[which.max(b)]
}
p1_t <- 60; p2_t <- 60                                        # empiezan coludidos en 60
guerra <- data.frame(ronda = 0, p1 = p1_t, p2 = p2_t)
for (t in 1:45) {
  p1_t <- mejor_precio(p2_t)                                  # la empresa 1 responde
  p2_t <- mejor_precio(p1_t)                                  # la empresa 2 responde
  guerra <- rbind(guerra, data.frame(ronda = t, p1 = p1_t, p2 = p2_t))
}
mostrar(guerra[c(1:4, 18:22), ])
 ronda p1 p2
     0 60 60
     1 59 58
     2 57 56
     3 55 54
    17 27 26
    18 25 24
    19 23 22
    20 21 21
    21 21 21

La tabla muestra las primeras y las últimas rondas. Cada empresa cobra un sol menos que el rival hasta llegar a 21, un sol por encima del costo marginal: con precios enteros, bajar a 20 daría beneficio cero, y es mejor repartirse el mercado a 21. Si los precios pudieran variar en céntimos, el proceso terminaría en 20.01; en el límite, en \(p = c\).

Lección. En mercados que compiten en precios con productos homogéneos, la tentación de coludir es enorme: sin acuerdo, el beneficio es prácticamente cero.

3.4 El dilema del cártel

3.4.1 Paso 1: los beneficios relevantes

Si las dos empresas actúan como un monopolio, producen en total \(Q = 40\) (\(q_i = 20\) cada una) y cobran \(P = 60\). Pero si la empresa 1 cree que la 2 cumplirá, su mejor respuesta no es 20 sino \(R_1(20) = (80 - 20)/2 = 30\). Calculamos los tres beneficios que necesitamos:

  • \(\pi^C\): beneficio de cumplir el cártel.
  • \(\pi^D\): beneficio de desviarse (de la mejor manera) cuando el rival cumple.
  • \(\pi^N\): beneficio en el equilibrio de Nash (el castigo), que ya calculamos.
q_cartel <- (a - c) / 4                      # mitad de la cantidad de monopolio
pi_C <- (a - 2 * q_cartel - c) * q_cartel    # cumplir
q_desvio <- R(q_cartel)                      # mejor respuesta si el rival cumple
pi_D <- (a - q_desvio - q_cartel - c) * q_desvio
recuadro("Beneficios del cártel",
         "Cantidad del cártel por empresa" = q_cartel, "Cumplir (pi_C)" = pi_C,
         "Cantidad de desvío" = q_desvio, "Desviarse (pi_D)" = pi_D,
         "Castigo de Cournot (pi_N)" = pi_N)
------------------------------------------------------------
 Beneficios del cártel
------------------------------------------------------------
  Cantidad del cártel por empresa : 20
  Cumplir (pi_C)                  : 800
  Cantidad de desvío              : 30
  Desviarse (pi_D)                : 900
  Castigo de Cournot (pi_N)       : 711.11
------------------------------------------------------------

3.4.2 Paso 2: la matriz de pagos y el dilema del prisionero

Para ver el dilema en un juego de una sola vez, cada empresa elige entre cumplir (\(q = 20\)) o competir produciendo su cantidad de Cournot (\(q = 26.67\)). Calculamos los pagos de cada combinación:

estrategias <- c(Cumplir = q_cartel, Competir = q_cournot[1])
pago <- function(q_propio, q_rival) (a - q_propio - q_rival - c) * q_propio
matriz <- outer(estrategias, estrategias, Vectorize(pago))
dimnames(matriz) <- list("Empresa 1" = names(estrategias), "Empresa 2" = names(estrategias))
round(matriz, 2)        # pagos de la empresa 1 (los de la 2 son simétricos)
          Empresa 2
Empresa 1  Cumplir Competir
  Cumplir   800.00   666.67
  Competir  888.89   711.11

Leemos la matriz por columnas (lo que hace la empresa 2):

  • Si la empresa 2 cumple, a la empresa 1 le conviene competir: 888.89 > 800.
  • Si la empresa 2 compite, a la empresa 1 también le conviene competir: 711.11 > 666.67.

Competir es una estrategia dominante, pero cuando ambas compiten obtienen 711.11, menos que los 800 del cártel. Es un dilema del prisionero: en un juego de una sola vez el cártel no es un equilibrio.

3.5 Sostenibilidad del cártel: el factor de descuento crítico

3.5.1 Idea y demostración

En la realidad las empresas compiten período tras período. Supongamos la estrategia del gatillo (Friedman, 1971): “cumplo mientras el rival cumpla; si alguna vez se desvía, compito (Nash) para siempre”. Los pagos futuros se descuentan con un factor \(\delta \in (0, 1)\):

\[\text{Cumplir siempre: } \pi^C + \delta\pi^C + \delta^2\pi^C + \cdots = \frac{\pi^C}{1-\delta}\]

\[\text{Desviarse hoy: } \pi^D + \delta\pi^N + \delta^2\pi^N + \cdots = \pi^D + \frac{\delta\,\pi^N}{1-\delta}\]

El cártel es sostenible si cumplir conviene más:

\[\frac{\pi^C}{1-\delta} \ge \pi^D + \frac{\delta\,\pi^N}{1-\delta} \;\overset{\times(1-\delta)}{\Longleftrightarrow}\; \pi^C \ge (1-\delta)\,\pi^D + \delta\,\pi^N \;\Longleftrightarrow\; \delta\,(\pi^D - \pi^N) \ge \pi^D - \pi^C\]

\[\Longleftrightarrow\quad \boxed{\;\delta \;\ge\; \delta^* = \frac{\pi^D - \pi^C}{\pi^D - \pi^N}\;}\]

Lectura económica: el numerador es la ganancia de hacer trampa hoy; el denominador, la pérdida por período que causa el castigo. Si las empresas valoran mucho el futuro (\(\delta\) alto), el cártel se sostiene.

delta_cournot  <- (pi_D - pi_C) / (pi_D - pi_N)
delta_bertrand <- 1 - 1 / 2                      # ver la siguiente sección
recuadro("Factor de descuento crítico (duopolio)",
         "delta* con castigo de Cournot" = delta_cournot,
         "Como fracción: 9/17" = 9 / 17,
         "delta* con castigo de Bertrand" = delta_bertrand, dec = 4)
------------------------------------------------------------
 Factor de descuento crítico (duopolio)
------------------------------------------------------------
  delta* con castigo de Cournot  : 0.5294
  Como fracción: 9/17            : 0.5294
  delta* con castigo de Bertrand : 0.5000
------------------------------------------------------------

3.5.2 Comprobación numérica: sumamos los pagos período a período

En lugar de usar la fórmula de la serie geométrica, sumamos 200 períodos para dos valores de \(\delta\), uno por debajo y otro por encima de \(\delta^* = 0.529\):

valor_presente <- function(pagos, delta) sum(pagos * delta^(seq_along(pagos) - 1))
T_ <- 200
cumplir  <- rep(pi_C, T_)
desviar  <- c(pi_D, rep(pi_N, T_ - 1))
simul <- data.frame(delta = c(0.4, 0.7))
simul$VP_cumplir <- sapply(simul$delta, valor_presente, pagos = cumplir)
simul$VP_desviar <- sapply(simul$delta, valor_presente, pagos = desviar)
simul$conviene   <- ifelse(simul$VP_cumplir >= simul$VP_desviar, "cumplir", "desviarse")
mostrar(simul)
 delta VP_cumplir VP_desviar  conviene
   0.4    1333.33    1374.07 desviarse
   0.7    2666.67    2559.26   cumplir

Con \(\delta = 0.4\) (empresas impacientes) conviene desviarse: el cártel se rompe. Con \(\delta = 0.7\) conviene cumplir: el cártel se sostiene. El umbral está en \(\delta^* = 0.529\).

op <- par(mfrow = c(1, 2), mar = c(4, 4, 2.5, 1))
for (d in c(0.4, 0.7)) {
  t <- 1:15
  acum_c <- cumsum(cumplir[t] * d^(t - 1))
  acum_d <- cumsum(desviar[t] * d^(t - 1))
  plot(t, acum_c, type = "b", pch = 19, col = "#002D62", ylim = c(0, max(acum_c, acum_d) * 1.05),
       xlab = "Período", ylab = "Valor presente acumulado", main = paste("delta =", d))
  lines(t, acum_d, type = "b", pch = 17, col = "#80162A")
  legend("bottomright", legend = c("Cumplir", "Desviarse"), col = c("#002D62", "#80162A"),
         pch = c(19, 17), lwd = 1, bty = "n", cex = 0.85)
}

par(op)

Desviarse da más en el primer período, pero luego el castigo se acumula. Que la curva de “cumplir” termine por encima depende de cuánto pesa el futuro, es decir, de \(\delta\).

3.5.3 Bertrand con \(n\) empresas y la relación entre \(\delta\) y la tasa de interés

Con castigo de Bertrand y \(n\) empresas: cumplir da \(\pi^C = \pi^M / n\); desviarse (bajar el precio un céntimo) da casi todo el beneficio de monopolio, \(\pi^D \approx \pi^M\); y el castigo da \(\pi^N = 0\):

\[\delta^* = \frac{\pi^M - \pi^M/n}{\pi^M - 0} = 1 - \frac{1}{n}.\]

El factor de descuento se relaciona con la tasa de interés por período: \(\delta = \dfrac{1}{1 + r}\). Si las empresas revisan precios \(k\) veces al año y la tasa anual es \(r\), el descuento entre revisiones es \(\delta = (1 + r)^{-1/k}\): interactuar con más frecuencia acerca \(\delta\) a 1.

r <- 0.10                                      # tasa de interés anual del 10 %
d_anual   <- (1 + r)^(-1)                      # revisan precios una vez al año (k = 1)
d_bienal  <- (1 + r)^(-2)                      # una vez cada dos años (k = 1/2)
d_mensual <- (1 + r)^(-1 / 12)                 # todos los meses (k = 12)
ver("delta, revisión cada dos años" = d_bienal, "delta, revisión anual" = d_anual,
    "delta, revisión mensual" = d_mensual, dec = 4)
  delta, revisión cada dos años : 0.8264
  delta, revisión anual         : 0.9091
  delta, revisión mensual       : 0.9921
n <- c(2, 3, 4, 5, 6, 8, 10, 12, 15)
tabla_delta <- data.frame(empresas = n, delta_Bertrand = 1 - 1 / n)
tabla_delta$cada_2_anios <- ifelse(d_bienal  >= tabla_delta$delta_Bertrand, "sí", "no")
tabla_delta$anual        <- ifelse(d_anual   >= tabla_delta$delta_Bertrand, "sí", "no")
tabla_delta$mensual      <- ifelse(d_mensual >= tabla_delta$delta_Bertrand, "sí", "no")
mostrar(tabla_delta, dec = 3)
 empresas delta_Bertrand cada_2_anios anual mensual
        2          0.500           sí    sí      sí
        3          0.667           sí    sí      sí
        4          0.750           sí    sí      sí
        5          0.800           sí    sí      sí
        6          0.833           no    sí      sí
        8          0.875           no    sí      sí
       10          0.900           no    sí      sí
       12          0.917           no    no      sí
       15          0.933           no    no      sí

Las tres últimas columnas indican si el cártel es sostenible (“sí”) en cada caso. Si los precios se revisan cada dos años (\(\delta = 0.826\)), el cártel solo se sostiene con hasta 5 empresas. Con revisión anual (\(\delta = 0.909\)), hasta 10 empresas. Con revisión mensual \(\delta\) es casi 1 y se sostiene en todos los casos de la tabla. Por eso la frecuencia de interacción es un factor clave para las agencias de competencia.

op <- par(mar = c(4, 4, 2.5, 1))
n <- 2:15
plot(n, 1 - 1 / n, type = "b", pch = 19, col = "#80162A", lwd = 2, ylim = c(0.4, 1),
     xlab = "Número de empresas (n)", ylab = "delta*",
     main = "Con más empresas es más difícil sostener el cártel")
abline(h = c(d_anual, d_bienal), lty = 2, col = "#002D62")
text(5, d_anual + 0.04, "delta, revisión anual", col = "#002D62", cex = 0.8)
text(11, d_bienal - 0.04, "delta, revisión cada dos años", col = "#002D62", cex = 0.8)

par(op)

3.6 ¿Qué facilita la colusión?

Factor Efecto en la colusión Por qué (en términos de \(\delta^*\))
Pocas empresas facilita \(\delta^* = 1 - 1/n\) es menor
Barreras a la entrada facilita el cártel no atrae entrantes
Interacción frecuente facilita \(\delta\) cercano a 1
Precios transparentes facilita los desvíos se detectan rápido
Producto homogéneo facilita es fácil acordar un solo precio
Demanda creciente facilita el castigo futuro pesa más
Compradores grandes dificulta aumentan la ganancia de desviarse (\(\pi^D\))
Programa de clemencia dificulta desviarse y delatar evita la multa

Estos factores son los indicios que usan las agencias de competencia, como el Indecopi, para priorizar sus investigaciones. En el Perú las multas pueden llegar al 12 % de las ventas, y el programa de clemencia exonera o reduce la multa al primer integrante que delata el cártel.

Para investigar en grupo. Elijan un caso de concertación sancionado por el Indecopi y respondan: ¿cuántas empresas participaron?, ¿qué factores de la tabla estaban presentes?, ¿cuál fue la multa y cómo se compara con el beneficio estimado del cártel? Verifiquen fechas, montos y el estado del caso en la página web del Indecopi.

4 Ejercicios resueltos

Los ejercicios propuestos en las diapositivas se resuelven aquí con el mismo código de clase. Intenta resolverlos primero en papel y usa estos bloques para comprobar tus respuestas.

4.1 E1. Primer grado y tarifa en dos partes

Un monopolista con \(CMg = 10\) enfrenta \(P = 70 - q\). Calcule el beneficio con precio único, con discriminación perfecta y con una tarifa en dos partes. Compare el excedente del consumidor.

a1 <- 70; c1 <- 10
q_u <- (a1 - c1) / 2; p_u <- a1 - q_u                         # precio único
A1  <- integrate(function(x) (a1 - x) - c1, 0, a1 - c1)$value # cargo fijo = EC con p = c
e1 <- data.frame(
  esquema   = c("Precio único", "Primer grado", "Dos partes (p = 10)"),
  cantidad  = c(q_u, a1 - c1, a1 - c1),
  beneficio = c((p_u - c1) * q_u, A1, A1),
  EC        = c(0.5 * (a1 - p_u) * q_u, 0, 0))
mostrar(e1)
             esquema cantidad beneficio  EC
        Precio único       30       900 450
        Primer grado       60      1800   0
 Dos partes (p = 10)       60      1800   0

Solución. Con precio único, \(q = 30\), \(P = 40\), \(\pi = 900\) y \(EC = 450\). La discriminación perfecta y la tarifa en dos partes (\(p = 10\), \(A = 1800\)) duplican el beneficio y dejan \(EC = 0\), pero eliminan la pérdida irrecuperable.

4.2 E2. Tercer grado: estudiantes y público general

Una empresa de transporte con \(CMg = 5\) atiende a estudiantes (\(P_E = 25 - q_E\)) y al público (\(P_G = 45 - q_G\)). Halle los precios, verifique la regla de la elasticidad inversa y compare el bienestar.

e2_discr <- rbind(cbind(mercado = "Estudiantes", mercado(25, 5)),
                  cbind(mercado = "Público",     mercado(45, 5)))
mostrar(e2_discr, dec = 3)
     mercado  q  p beneficio  EC elasticidad Lerner inversa_elast
 Estudiantes 10 15       100  50        1.50  0.667         0.667
     Público 20 25       400 200        1.25  0.800         0.800
e2_unico <- precio_uniforme(25, 45, 5)
mostrar(e2_unico)
  p q1 q2 beneficio  EC
 20  5 25       450 325
ver("Bienestar con discriminación" = sum(e2_discr$beneficio + e2_discr$EC),
    "Bienestar con precio único"   = e2_unico$beneficio + e2_unico$EC)
  Bienestar con discriminación : 750
  Bienestar con precio único   : 775

Solución. Estudiantes: \(q = 10\), \(p = 15\); público: \(q = 20\), \(p = 25\). El Lerner coincide con \(1/|\varepsilon|\) en ambos (0.667 y 0.8). Con precio único, \(p = 20\) y \(Q = 30\): la producción no cambia, por lo que el bienestar cae de 775 a 750 con la discriminación (resultado de Schmalensee).

4.3 E3. Cártel de cementeras

Dos cementeras compiten a la Cournot con \(P = 200 - Q\) y \(CMg = 50\). Calcule el equilibrio de Nash, el cártel, el desvío y \(\delta^*\) con castigo de Cournot.

a3 <- 200; c3 <- 50
R3 <- function(q_rival) (a3 - c3 - q_rival) / 2
qN <- (a3 - c3) / 3;        piN3 <- (a3 - 2 * qN - c3) * qN
qC <- (a3 - c3) / 4;        piC3 <- (a3 - 2 * qC - c3) * qC
qD <- R3(qC);               piD3 <- (a3 - qD - qC - c3) * qD
e3 <- data.frame(situacion = c("Nash-Cournot", "Cártel", "Desvío"),
                 q_i = c(qN, qC, qD), precio = c(a3 - 2 * qN, a3 - 2 * qC, a3 - qD - qC),
                 beneficio = c(piN3, piC3, piD3))
mostrar(e3)
    situacion   q_i precio beneficio
 Nash-Cournot 50.00 100.00   2500.00
       Cártel 37.50 125.00   2812.50
       Desvío 56.25 106.25   3164.06
ver("delta* (castigo de Cournot)" = (piD3 - piC3) / (piD3 - piN3), dec = 4)
  delta* (castigo de Cournot) : 0.5294

Solución. \(\delta^* = 0.529\), igual que en el ejemplo de clase. No es casualidad: con demanda lineal y costos constantes, \(\delta^* = 9/17\) en el duopolio de Cournot para cualquier \(a\) y \(c\), porque los tres beneficios son proporcionales a \((a - c)^2\).

4.4 E4. Bertrand con cuatro empresas

Con competencia de Bertrand y 4 empresas, ¿cuál es \(\delta^*\)? Si la tasa anual es 10 % y las empresas revisan precios una vez al año, ¿es sostenible el cártel?

delta_estrella <- 1 - 1 / 4
delta_anual    <- 1 / 1.10
ver("delta* (4 empresas)" = delta_estrella, "delta con r = 10 %" = delta_anual, dec = 4)
  delta* (4 empresas) : 0.7500
  delta con r = 10 %  : 0.9091
cat(ifelse(delta_anual >= delta_estrella, "  El cártel SÍ es sostenible.",
           "  El cártel NO es sostenible."), "\n")
  El cártel SÍ es sostenible. 

4.5 E5. Programa de clemencia (pregunta conceptual)

Un programa de clemencia aumenta la ganancia de desviarse: quien delata evita la multa y, además, sabe que el cártel se acabará de todas formas. En la fórmula, sube \(\pi^D\) (y baja el valor esperado de cumplir, porque crece la probabilidad de detección). Ambos efectos elevan \(\delta^*\) y hacen que menos cárteles sean sostenibles.

5 Resumen de la semana

5.1 Fórmulas principales

Concepto Fórmula
Excedente del consumidor \(EC = \int_0^{q} \big[P(x) - p\big]\,dx\)
Primer grado \(P(Q) = CMg\); \(\pi\) = excedente total; \(EC = 0\)
Tarifa en dos partes \(T(q) = A + c\,q\), con \(A = EC(c)\)
Segundo grado (\(n\) bloques) \(q_k = \frac{k(a-c)}{n+1}\); \(\pi_n = \frac{n}{n+1}\cdot\frac{(a-c)^2}{2}\)
Tercer grado \(IMg_i = CMg\); \(\frac{p_i - CMg}{p_i} = \frac{1}{\lvert\varepsilon_i\rvert}\)
Función de reacción (Cournot) \(q_i = \frac{a - c - q_j}{2}\)
Cournot con \(n\) empresas \(q_i = \frac{a-c}{n+1}\), \(P = c + \frac{a-c}{n+1}\), \(L = \frac{HHI}{\lvert\varepsilon\rvert}\)
Bertrand (homogéneo) \(p_1 = p_2 = CMg\)
Factor de descuento crítico \(\delta^* = \frac{\pi^D - \pi^C}{\pi^D - \pi^N}\); Bertrand: \(\delta^* = 1 - \frac1n\)

5.2 Ideas clave

  1. Discriminar exige poder de mercado, segmentación y no reventa.
  2. El primer grado es eficiente, pero transfiere todo el excedente a la empresa.
  3. Los precios por bloques aumentan la producción y reducen la pérdida irrecuperable; con más bloques se acercan al primer grado.
  4. En el tercer grado se cobra más donde la demanda es inelástica; si la producción no aumenta, el bienestar cae, y si se abren mercados nuevos, puede mejorar.
  5. Cournot da precios entre el monopolio y la competencia; el Lerner de la industria depende del HHI.
  6. Un cártel es inestable en un juego de una sola vez, pero se sostiene si \(\delta \ge \delta^*\); más empresas lo dificultan.

Próxima semana: fusiones y concentración, cálculo del HHI, prueba SSNIP y mercado relevante.

Referencias

  • Bertrand, J. (1883). Review of Théorie mathématique de la richesse sociale. Journal des Savants, 67, 499–508.
  • Cournot, A. A. (1838). Recherches sur les principes mathématiques de la théorie des richesses. Hachette.
  • Friedman, J. W. (1971). A Non-cooperative Equilibrium for Supergames. Review of Economic Studies, 38(1), 1–12.
  • Motta, M. (2004). Competition Policy: Theory and Practice, cap. 4. Cambridge University Press.
  • Pigou, A. C. (1920). The Economics of Welfare. Macmillan.
  • Schmalensee, R. (1981). Output and Welfare Implications of Monopolistic Third-Degree Price Discrimination. American Economic Review, 71(1), 242–247.
  • Tirole, J. (1988). The Theory of Industrial Organization, caps. 3 y 6. MIT Press.
  • Viscusi, W. K., Harrington, J. E. y Sappington, D. E. M. (2018). Economics of Regulation and Antitrust (5.ª ed.), caps. 4 y 5. MIT Press.
  • R Core Team (2024). R: A Language and Environment for Statistical Computing. R Foundation for Statistical Computing.