Análisis de likes en Facebook

Author

Omar Rodríguez Torres

Published

Invalid Date

Introducción

En este análisis, trabajaremos con una base de datos de Facebook que contiene información sobre publicaciones, incluyendo el número de likes, comentarios, compartidas, alcance total, impresiones y más. El objetivo es explorar las relaciones entre estas variables y desarrollar un modelo de regresión lineal para predecir el número de likes en función de otras métricas.

Carga de datos y preprocesamiento

library(readr)
library(GGally)
library(ggplot2)
library(sqldf)
library(scatterplot3d)


facebook <- read_delim('dataset_Facebook.csv', delim=';')

Echemos un vistazo a la estructura de la base de datos:

str(facebook)
spc_tbl_ [500 × 19] (S3: spec_tbl_df/tbl_df/tbl/data.frame)
 $ Page total likes                                                   : num [1:500] 139441 139441 139441 139441 139441 ...
 $ Type                                                               : chr [1:500] "Photo" "Status" "Photo" "Photo" ...
 $ Category                                                           : num [1:500] 2 2 3 2 2 2 3 3 2 3 ...
 $ Post Month                                                         : num [1:500] 12 12 12 12 12 12 12 12 12 12 ...
 $ Post Weekday                                                       : num [1:500] 4 3 3 2 2 1 1 7 7 6 ...
 $ Post Hour                                                          : num [1:500] 3 10 3 10 3 9 3 9 3 10 ...
 $ Paid                                                               : num [1:500] 0 0 0 1 0 0 1 1 0 0 ...
 $ Lifetime Post Total Reach                                          : num [1:500] 2752 10460 2413 50128 7244 ...
 $ Lifetime Post Total Impressions                                    : num [1:500] 5091 19057 4373 87991 13594 ...
 $ Lifetime Engaged Users                                             : num [1:500] 178 1457 177 2211 671 ...
 $ Lifetime Post Consumers                                            : num [1:500] 109 1361 113 790 410 ...
 $ Lifetime Post Consumptions                                         : num [1:500] 159 1674 154 1119 580 ...
 $ Lifetime Post Impressions by people who have liked your Page       : num [1:500] 3078 11710 2812 61027 6228 ...
 $ Lifetime Post reach by people who like your Page                   : num [1:500] 1640 6112 1503 32048 3200 ...
 $ Lifetime People who have liked your Page and engaged with your post: num [1:500] 119 1108 132 1386 396 ...
 $ comment                                                            : num [1:500] 4 5 0 58 19 1 3 0 0 3 ...
 $ like                                                               : num [1:500] 79 130 66 1572 325 ...
 $ share                                                              : num [1:500] 17 29 14 147 49 33 27 14 31 26 ...
 $ Total Interactions                                                 : num [1:500] 100 164 80 1777 393 ...
 - attr(*, "spec")=
  .. cols(
  ..   `Page total likes` = col_double(),
  ..   Type = col_character(),
  ..   Category = col_double(),
  ..   `Post Month` = col_double(),
  ..   `Post Weekday` = col_double(),
  ..   `Post Hour` = col_double(),
  ..   Paid = col_double(),
  ..   `Lifetime Post Total Reach` = col_double(),
  ..   `Lifetime Post Total Impressions` = col_double(),
  ..   `Lifetime Engaged Users` = col_double(),
  ..   `Lifetime Post Consumers` = col_double(),
  ..   `Lifetime Post Consumptions` = col_double(),
  ..   `Lifetime Post Impressions by people who have liked your Page` = col_double(),
  ..   `Lifetime Post reach by people who like your Page` = col_double(),
  ..   `Lifetime People who have liked your Page and engaged with your post` = col_double(),
  ..   comment = col_double(),
  ..   like = col_double(),
  ..   share = col_double(),
  ..   `Total Interactions` = col_double()
  .. )
 - attr(*, "problems")=<externalptr> 

La base de datos original contiene 500 observaciones y 19 variables. Renombremos algunas variables para facilitar su manejo:

names(facebook)[1] <- 'Page_total_likes'
names(facebook)[5] <- 'Post_Weekday'

Ahora, filtremos las publicaciones con menos de 1500 likes para enfocarnos en el rango más común:

facebook <- sqldf('SELECT like, Page_total_likes, Post_Weekday, comment, share 
                   FROM facebook WHERE like < 1500')

Visualización de relaciones entre variables

Antes de construir un modelo, es útil visualizar las relaciones entre las variables de interés. Usemos ggpairs para crear un gráfico de pares:

ggpairs(facebook, lower = list(continuous = wrap('points', colour = "blue")),
        diag = list(continuous = wrap("barDiag", colour = "red")))

El gráfico de pares muestra las relaciones entre las variables seleccionadas. Podemos observar una correlación positiva entre el número de likes y el número de comentarios y compartidas. También hay una ligera relación positiva con el total de likes de la página.

Basándonos en estas observaciones, procedamos a construir un modelo de regresión lineal para predecir el número de likes.

Modelo de regresión lineal múltiple

Ajustemos un modelo de regresión lineal múltiple considerando el total de likes de la página, el día de la semana de la publicación, y el número de comentarios y compartidas como predictores:

modelo <- lm(like ~ Page_total_likes + Post_Weekday + comment + share, data = facebook)
summary(modelo)

Call:
lm(formula = like ~ Page_total_likes + Post_Weekday + comment + 
    share, data = facebook)

Residuals:
    Min      1Q  Median      3Q     Max 
-326.80  -42.06  -14.07   17.55 1050.36 

Coefficients:
                   Estimate Std. Error t value Pr(>|t|)    
(Intercept)      -1.119e+02  3.897e+01  -2.873 0.004250 ** 
Page_total_likes  1.038e-03  2.979e-04   3.486 0.000535 ***
Post_Weekday     -2.435e+00  2.382e+00  -1.022 0.307275    
comment           3.188e+00  5.726e-01   5.567  4.3e-08 ***
share             5.202e+00  2.610e-01  19.929  < 2e-16 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 106.7 on 484 degrees of freedom
  (3 observations deleted due to missingness)
Multiple R-squared:  0.5946,    Adjusted R-squared:  0.5913 
F-statistic: 177.5 on 4 and 484 DF,  p-value: < 2.2e-16

El resumen del modelo nos proporciona varias piezas clave de información:

  • Los coeficientes estimados para cada predictor, junto con sus errores estándar, valores t y valores p.
  • El R-cuadrado y el R-cuadrado ajustado, que indican la proporción de varianza en los likes explicada por el modelo.
  • El estadístico F y su valor p, que prueban la significancia global del modelo.

Interpretemos estos resultados:

  • El modelo explica alrededor del 59.5% de la variabilidad en el número de likes (R-cuadrado ajustado = 0.5913).
  • Las variables más significativas son el número de comentarios y compartidas (p < 0.001).
  • El total de likes de la página también es significativo (p < 0.001), pero su coeficiente es muy pequeño, lo que sugiere un efecto limitado.
  • El día de la semana de la publicación no parece tener un efecto significativo (p = 0.307).

Estos hallazgos nos dan una buena idea de qué factores influyen en el número de likes. Sin embargo, antes de finalizar, realicemos algunos chequeos adicionales en el modelo.

Modelo de regresión lineal sin intercepto

Ajustemos ahora un modelo de regresión lineal sin intercepto, considerando solo el número de comentarios y compartidas como predictores:

modelo <- lm(like ~ comment + share - 1, data = facebook)
summary(modelo)

Call:
lm(formula = like ~ comment + share - 1, data = facebook)

Residuals:
    Min      1Q  Median      3Q     Max 
-353.61  -36.54   -5.86   16.71 1055.82 

Coefficients:
        Estimate Std. Error t value Pr(>|t|)    
comment   3.4322     0.5751   5.968 4.63e-09 ***
share     5.2668     0.2026  25.995  < 2e-16 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 107.9 on 487 degrees of freedom
  (3 observations deleted due to missingness)
Multiple R-squared:  0.7705,    Adjusted R-squared:  0.7696 
F-statistic: 817.7 on 2 and 487 DF,  p-value: < 2.2e-16

El resumen de este modelo muestra:

  • Ambas variables, comentarios y compartidas, son altamente significativas (p < 0.001).
  • Los coeficientes estimados son positivos, lo que indica una relación directa con el número de likes.
  • El modelo explica alrededor del 77% de la variabilidad en los likes (R-cuadrado ajustado = 0.7696), una mejora sustancial respecto al modelo anterior.

Calculemos los intervalos de confianza para los coeficientes:

confint(modelo)
           2.5 %   97.5 %
comment 2.302226 4.562144
share   4.868679 5.664873

Y realicemos una prueba ANOVA para evaluar la contribución de cada predictor:

anova(modelo)
Analysis of Variance Table

Response: like
           Df   Sum Sq  Mean Sq F value    Pr(>F)    
comment     1 11167718 11167718  959.60 < 2.2e-16 ***
share       1  7864024  7864024  675.72 < 2.2e-16 ***
Residuals 487  5667667    11638                      
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

La tabla ANOVA descompone la variabilidad en los likes en componentes atribuibles a cada predictor. Ambos, comentarios y compartidas, contribuyen significativamente (p < 0.001).

Gráficos de diagnóstico del modelo

Por último, verifiquemos los supuestos del modelo examinando los gráficos de diagnóstico:

plot(modelo)

Los gráficos de diagnóstico sugieren que:

  • Los residuos parecen distribuirse aleatoriamente alrededor de 0, sin patrones claros, lo que indica linealidad.
  • El gráfico Q-Q muestra que los residuos se alinean razonablemente bien con la línea, sugiriendo normalidad.
  • El gráfico Scale-Location muestra una dispersión relativamente constante de los residuos, indicando homocedasticidad.
  • No hay puntos de alto apalancamiento que sean altamente influyentes.

En general, el modelo parece cumplir adecuadamente con los supuestos de regresión lineal.

Gráfico 3D de la relación entre likes, comentarios y compartidas

Para visualizar la relación entre el número de likes, comentarios y compartidas en las publicaciones de Facebook, creemos un gráfico 3D utilizando el paquete scatterplot3d:

facebook2 <- sqldf('SELECT * 
                    FROM facebook 
                    WHERE like < 1500 AND comment < 100')

fb <- data.frame(facebook2$comment, facebook2$share, facebook2$like)

library(scatterplot3d)

s3d <- scatterplot3d(fb, type = "h", color = "steelblue",
                     angle = 65, scale.y = 0.7, pch = 16,
                     main = "Relación del número de likes vs comentarios y compartidas",
                     xlab = "Comment", ylab = "Share", zlab = "Likes")

s3d$plane3d(modelo, lty = "dotted")

El gráfico 3D muestra cada publicación como un punto en el espacio, con el número de comentarios en el eje x, el número de compartidas en el eje y, y el número de likes en el eje z.

Algunas observaciones clave:

  1. La nube de puntos tiene una forma aproximadamente plana y se inclina hacia arriba, indicando una relación positiva entre las tres variables. A medida que aumentan los comentarios y las compartidas, también tienden a aumentar los likes.

  2. La densidad de puntos es mayor en la región con valores bajos de comentarios y compartidas, sugiriendo que la mayoría de las publicaciones tienen un engagement relativamente bajo.

  3. Hay algunos puntos atípicos con un número muy alto de likes en relación con los comentarios y las compartidas. Estas publicaciones podrían ser contenido viral o publicaciones promocionadas.

  4. El plano de regresión ajustado (representado por la línea punteada) pasa por el centro de la nube de puntos, capturando la tendencia general de los datos. La inclinación del plano confirma la relación positiva entre las variables.

  5. La dispersión de los puntos alrededor del plano de regresión sugiere que, aunque el modelo lineal captura la tendencia general, hay una variabilidad sustancial que no se explica por los comentarios y las compartidas solamente. Otros factores no incluidos en el modelo podrían influir en el número de likes.

Este gráfico 3D es una poderosa herramienta de visualización que nos permite comprender intuitivamente la relación entre estas tres métricas clave de engagement. Confirma visualmente los hallazgos del análisis de regresión lineal, mostrando que las publicaciones con más comentarios y compartidas tienden a tener más likes.

Sin embargo, también destaca la complejidad de predecir el engagement en las redes sociales. Mientras que el modelo de regresión lineal captura la tendencia general, hay una considerable dispersión alrededor de esta tendencia, indicando que otros factores también juegan un papel.

En conclusión, este gráfico 3D refuerza la idea de que fomentar las interacciones de los usuarios, como comentarios y compartidas, puede ser una estrategia efectiva para aumentar los likes y el engagement general. Sin embargo, también subraya la necesidad de considerar un rango más amplio de factores, como el tipo de contenido, el tiempo de publicación y las características de la audiencia, para desarrollar una comprensión completa de lo que impulsa el engagement en Facebook.

Predicción con nuevos datos

Ahora que tenemos un modelo de regresión lineal ajustado, podemos usarlo para predecir el número de likes para nuevas publicaciones. Creemos un nuevo marco de datos con valores hipotéticos para el número de comentarios y compartidas:

newpage <- data.frame(comment = 265, share = 153)

Luego, usemos la función predict() para obtener una predicción del número de likes para esta nueva publicación, junto con un intervalo de predicción del 90%:

predict(modelo, newdata = newpage, interval = 'prediction', level = 0.90)
       fit      lwr      upr
1 1715.346 1431.998 1998.694

El resultado muestra que, para una publicación con 265 comentarios y 153 compartidas, el modelo predice aproximadamente 1715 likes, con un intervalo de predicción del 90% de [1432, 1999].

Este intervalo de predicción es más amplio que un intervalo de confianza para la media, ya que tiene en cuenta tanto la incertidumbre en los coeficientes del modelo como la variabilidad residual. Indica que hay un 90% de probabilidad de que el número real de likes para una publicación con estas características caiga dentro de este rango.

Es importante tener en cuenta que esta predicción está sujeta a todas las limitaciones y supuestos del modelo de regresión lineal. Asume que la relación entre las variables es lineal y que el nuevo punto de datos sigue el mismo patrón que los datos utilizados para ajustar el modelo.

Visualización de los valores reales y estimados

Para comparar visualmente los valores reales de likes con los valores estimados por el modelo, podemos crear un gráfico de líneas. Primero, creemos un nuevo marco de datos con los valores reales y estimados:

like <- sort(facebook$like)[1:489]
periodo <- rep(1:length(like), 2)
valores <- c(like, sort(modelo$fitted.values)[1:489])
origen <- c(rep("Reales", length(like)), rep("Estimados", length(like)))
facebook_gplot <- data.frame(periodo, valores, origen)

Luego, utilicemos ggplot2 para crear el gráfico de líneas:

library(ggplot2)
ggplot(facebook_gplot, aes(periodo, valores, color = origen)) +
  geom_point() +
  geom_line() +
  labs(x = "Periodo", y = "Likes", color = "Origen") +
  theme_minimal()

Este gráfico muestra los valores reales de likes (en azul) y los valores estimados por el modelo (en rojo) a lo largo del tiempo (representado por el período). Permite una comparación visual de qué tan bien el modelo se ajusta a los datos reales.

Podemos ver que el modelo captura la tendencia general de los datos, pero hay discrepancias para publicaciones individuales. Esto es esperado, ya que el modelo es una simplificación de la realidad y no puede explicar toda la variabilidad en los datos.

En resumen, este gráfico proporciona una forma intuitiva de evaluar el rendimiento del modelo y entender sus limitaciones. Muestra que, mientras que el modelo de regresión lineal es una herramienta útil para comprender la relación entre likes, comentarios y compartidas, no es perfecto y debe usarse con precaución al hacer predicciones para publicaciones individuales.

Ejemplos

Ahora que tenemos un modelo de regresión lineal ajustado, podemos usarlo para predecir el número de likes para nuevas publicaciones de Facebook con diferentes características.

Ejemplo 1: Tenemos la página de Facebook de la selección méxicana de futbol con 11,000,000 likes totales, y estamos considerando hacer una publicación que esperamos genere 148 comentarios y 59 compartidas. Creemos un nuevo marco de datos con estos valores:

newpage <- data.frame(Page_total_likes = 11000000, comment = 148, share = 59)

Ahora, usemos la función predict() para obtener una predicción del número de likes para esta publicación:

predict(modelo, newdata = newpage)
       1 
818.7032 

El modelo predice que esta publicación recibirá aproximadamente 818 likes. Este es un número sustancial de likes, lo que sugiere que una publicación con estos niveles de comentarios y compartidas en una página con una gran base de seguidores podría tener un alto engagement.

Ejemplo 2: Ahora, consideremos una página de Facebook más pequeña como el de UNAM con 3,500,000 likes totales. Supongamos que estamos planeando una publicación que esperamos genere 1 comentarios y 1 compartidas. Nuevamente, creemos un marco de datos con estos valores:

newpage <- data.frame(Page_total_likes = 3500000, comment = 1, share = 1)

Y usemos predict() para obtener una predicción:

predict(modelo, newdata = newpage)
       1 
8.698961 

En este caso, el modelo predice aproximadamente 8.69 likes. Este es un número más bajo de likes en comparación con el primer ejemplo, lo que refleja el menor número de comentarios y compartidas, así como la base de seguidores más pequeña de la página.

Estos ejemplos ilustran cómo el modelo de regresión lineal puede usarse para obtener información valiosa sobre el potencial de engagement de las publicaciones de Facebook antes de que se publiquen. Al proporcionar valores hipotéticos para el número de comentarios y compartidas, así como el total de likes de la página, podemos obtener una estimación del número de likes que una publicación podría recibir.

Sin embargo, es crucial recordar que estas son solo predicciones basadas en un modelo simplificado. Hay muchos otros factores que podrían influir en el engagement real de una publicación, como el contenido de la publicación, la hora del día en que se publica, y las características demográficas de la audiencia de la página. Además, el modelo asume que la relación entre las variables es lineal, lo cual puede no ser siempre el caso.

A pesar de estas limitaciones, el modelo de regresión lineal sigue siendo una herramienta poderosa para comprender los impulsores del engagement en Facebook. Puede ayudar a los administradores de páginas a tomar decisiones informadas sobre su estrategia de contenido, al proporcionar una estimación cuantitativa del potencial de engagement de diferentes tipos de publicaciones.

extremos <- data.frame(comment = c(0, 100), share = c(0, 200))
regresion_limit <- predict(modelo, newdata = extremos)

informacion_regresion <- data.frame(comment = seq(0, 100, 5), share = seq(0, 200, 10))
regresion_intervalo <- predict(modelo, newdata = informacion_regresion, interval = 'confidence', level = 0.95)
predicion_intervalo <- predict(modelo, newdata = informacion_regresion, interval = 'prediction', level = 0.95)

plot(facebook$comment, facebook$like, main = 'Relación likes vs comentarios y compartidas', pch = 16, lwd = 2, xlab = "Comentarios", ylab = "Likes")
points(facebook$share, facebook$like, pch = 16, lwd = 2, col = "blue")

newpage <- data.frame(comment = 50, share = 100)
regresion <- predict(modelo, newdata = newpage)
points(x = 50, y = as.numeric(regresion), col = 'red', pch = 16, lwd = 10)

lines(x = extremos$comment, y = regresion_limit, col = 'green')
lines(informacion_regresion$comment, regresion_intervalo[,3], col = 'green', lty = 3)
lines(informacion_regresion$comment, regresion_intervalo[,2], col = 'green', lty = 3)

lines(informacion_regresion$comment, predicion_intervalo[,3], col = 'orange', lty = 2)
lines(informacion_regresion$comment, predicion_intervalo[,2], col = 'orange', lty = 2)

En conclusión, estos ejemplos demuestran cómo el modelo de regresión lineal desarrollado en este análisis puede aplicarse a situaciones prácticas para predecir el número de likes en publicaciones de Facebook. Al combinar este modelo con otros conocimientos y experiencia en la gestión de redes sociales, los administradores de páginas pueden optimizar su estrategia de contenido para maximizar el engagement y alcanzar sus objetivos de marketing en Facebook.