Es necesario aclarar que este análisis es puramente metodológico, no tienen intenciones políticas, y además cuenta con muy poco volúmen de datos como para sacar conclusiones claras. El objetivo es simplemente proponer una metodología de trabajo a seguir cuando se trabaja con datos de tipo texto y se quiere encontrar patrones que ayuden a predecir la ocurrencia de un evento binario.
Para eso, se creará una variable binaria que indique un “1” cuando la línea analizada efectivamente corresponde al candidato “Macri”, y un “0” en otro caso. Todo el análisis se centrará en dicha marca. El objetivo será encontrar patrones que permitan diferenciar con mayor certeza las líneas del programa de Macri vs las líneas del programa de Fernandez.
#### Codigo para levantar los data sets y limpiarlos ####
#### Levanto los data sets
fernandez <- readr::read_csv("https://raw.githubusercontent.com/cienciadedatos/datos-de-miercoles/master/datos/2019/2019-09-04/argentina_frente-de-todos_fernandez_2019.txt")
macri <- readr::read_csv("https://raw.githubusercontent.com/cienciadedatos/datos-de-miercoles/master/datos/2019/2019-09-04/argentina_juntos-por-el-cambio_macri_2019.txt")
#### Abro las librerias necesarias
library(dplyr)
library(tidytext)
library(ggplot2)
library(purrr)
library(stringr)
library(tidyr)
library(forcats)
library(plotly)
library(collapsibleTree)
#### Convierto el set de datos en tipo "tibble"
fernandez <- tibble(line = 1:nrow(fernandez), text = fernandez$INTRODUCCIÓN)
macri <- tibble(line = 1:nrow(macri), text = macri$CAMBIEMOS)
#### Uno los dos data sets en uno solo
propuestas <- rbind(fernandez,macri)
#### Creo la variable binaria que diferencia con un "1" a las lineas correspondientes a Macri.
propuestas$Candidato <- c(rep(0,nrow(fernandez)),
rep(1,nrow(macri)))
Para ello, se procede con la limpieza y tokenización de la base.
Desplegá el código para ver cómo limpio la base!
#### Defino una funcion para limpiar y tokenizar los datos
limpiar_df <- function(texto){
# El orden de la limpieza no es arbitrario
# Se convierte todo el texto a minúsculas
nuevo_texto <- tolower(texto)
# Eliminación de páginas web (palabras que empiezan por "http." seguidas
# de cualquier cosa que no sea un espacio)
nuevo_texto <- str_replace_all(nuevo_texto,"http\\S*", "")
# Eliminación de signos de puntuación
nuevo_texto <- str_replace_all(nuevo_texto,"[[:punct:]]", " ")
#Elimino tildes en las letras
nuevo_texto<-stringi::stri_trans_general(nuevo_texto,"Latin-ASCII")
# Eliminación de números
nuevo_texto <- str_replace_all(nuevo_texto,"[[:digit:]]", " ")
# Eliminación de espacios en blanco múltiples
nuevo_texto <- str_replace_all(nuevo_texto,"[\\s]+", " ")
# Tokenización por palabras individuales
nuevo_texto <- str_split(nuevo_texto, " ")[[1]]
# Eliminación de tokens con una longitud < 2
nuevo_texto <- keep(.x = nuevo_texto, .p = function(x){str_length(x) > 1})
return(nuevo_texto)
}
#### Limpio y tokenizo los datos
propuestas <- propuestas %>% mutate(texto_tokenizado = map(.x = text,
.f = limpiar_df))
#### Creo un nuevo data set ordenado, donde tengo una fila por palabra:
data_tidy <- propuestas %>% select(-text) %>% unnest()
data_tidy <- data_tidy %>% rename(token = texto_tokenizado)
resumen <- propuestas %>%
group_by(Candidato) %>%
count(Candidato)
resumen$Pct_Lines <- resumen$n/sum(resumen$n)
resumen$Candidato <- as.factor(resumen$Candidato)
p <- ggplot(resumen,
aes(x=Candidato,
y=Pct_Lines,
fill=Candidato)) +
geom_bar(stat="identity",
color = 'black') +
ggtitle("Distribución del total de lineas\nde ambos programas") +
xlab("Es Macri") + ylab("Porcentaje") +
scale_fill_manual(values=c("#68a4bd","#fff000"), name="Es Macri") +
geom_text(aes(label=paste0(round(resumen$Pct_Lines*100,0),"%")), position=position_dodge(width=0.9), vjust=0.5,size=12) +
ylim(0, 0.9) +
theme_minimal()
ggplotly(p)
resumen <- data_tidy %>%
group_by(Candidato) %>%
count(Candidato)
resumen$Pct <- resumen$n/sum(resumen$n)
resumen$Candidato <- as.factor(resumen$Candidato)
p <- ggplot(resumen,
aes(x=Candidato,
y=Pct,
fill=Candidato)) +
geom_bar(stat="identity",
color = 'black') +
ggtitle("Distribución del total de palabras\nde ambos programas") +
xlab("Es Macri") + ylab("Porcentaje") +
scale_fill_manual(values=c("#68a4bd","#fff000"), name="Es Macri") +
geom_text(aes(label=paste0(round(resumen$Pct*100,0),"%")), position=position_dodge(width=0.9), vjust=0.5,size=12) +
ylim(0, 0.9) +
theme_minimal()
ggplotly(p)
Finalmente, de se observa que el 33% del total de líneas y el 34% del total de las palabras corresponde al programa de Macri (la distribución es muy similar).
Teniendo en cuenta que el objetivo del problema planteado consiste en clasificar a cada línea de un programa en “Es de Macri” o “No es de Macri”, con este análisis se debería poder encontrar palabras o conjuntos de palabras en donde la tasa de éxito (es decir, la probabilidad de pertenecer al programa de Macri) sea ampliamente superior o inferior al promedio.
El objetivo es encontrar qué palabras son las que están más presentes en los programas de Macri pero NO en el programa de Fernandez, y viceversa.
Por ejemplo, si vemos que la palabra “crisis” aparece una mayor proporción de veces en el programa de Fernandez respecto del programa de Macri, entonces podemos inferir que las líneas que contengan la palabra “crisis” cuentan con una menor probabilidad de pertenecer al programa de Macri.
Para llevar a cabo este análisis, se realizó un conteo del total de palabras que aparecen en ambos programas, excluyendo las Stop Words (definidas según mi criterio). Para tener un poco de robustez (más allá de que los volúmenes tratados en este data set son muy bajos), se exigió que la palabra aparezca al menos 6 veces en cualquiera de los dos documentos.
Se calculó la tasa de éxito asociada a cada palabra como la proporción de veces en que esa palabra aparece en el programa de Macri, respecto la cantidad de veces total que se menciona la palabra en ambos programas.
# Defino el listado de Stop Words:
stop_words_general <- c("de","la","el","en","las","que","los",
"un","del","para","una","se","con",
"es","por","al","su","como","ello","esta",
"mas","sus","debe","este","no","sobre","desde",
"as","tiene","tambien","entre","ha","esto","nos",
"puede","cada","lo","otra","otro","sin","ante",
"estar","gran","lo","mayor","tal","tanto","si",
"sera","todo","ademas","dan","cuando","alla",
"la", "las", "el", "los", "a", "ante", "bajo",
"cabe", "con", "contra", "de",
"desde", "durante", "en", "entre", "hacia",
"hasta", "mediante", "para", "por",
"segun", "sin", "so", "sobre", "tras", "versus","via",
"me", "se", "una", "te", "esta", "tu", "pero", "yo", "como",
"ya", "mi","aqui","le", "no", "si", "ha",
"mas", "su", "nos", "hay", "he","no","si","ha",
"eso","mas","todo","su","nos","hay","he","va","voy","porque","eh","nada",
"muy","ahi","asi","todos","estas","favor", "hacer", "pues", "esto","cuando",
"este", "soy", "ni", "tengo", "donde" ,"dos","has","ese", "estan",
"uno","dos","tres","cuatro","cinco","seis","siete","ocho","nueve","diez",
"casi","cabo","ir","hora")
# Hago un conteo por palabra, excluyendo las stop words, y calculo la proporción de éxito de cada palbra (esto es, de la cantidad total de veces que aparece la palabra, cuál es la porción de veces que aparece en el programa de Macri):
data_tidy %>%
filter(!token %in% stop_words_general) %>%
group_by(token) %>%
summarise(n=length(Candidato),
Prop_exito = mean(Candidato)) -> conteo
# Para el analisis me quedo con las palabras que aparecen al menos 6 veces, ya que sino estoy trabajando con palabras muy poco frecuentes
conteo %>%
filter(n>=6) -> conteo
# Visualizo los resultados
# Primero ordeno la tabla de mayor a menor probabilidad de exito
conteo <- conteo[order(-conteo$Prop_exito),]
# Luego convierto en factor las palabras, para que GGPLOT mantenga el orden
conteo$token <- factor(conteo$token, levels=unique(conteo$token))
# Armo el gráfico base
ggplot(data=conteo,
aes(x=token, y=Prop_exito, group=1)) +
geom_line(colour=c("#f9bb13"),size=1.5) +
geom_point(colour=c("#ff9900"),size=2) +
theme_minimal() +
ggtitle("Tasas de éxito por palabra") +
xlab("Palabra") + ylab("Tasa de Éxito") +
theme(axis.text.x = element_text(angle = 90,size=10),
axis.title.x = element_text(size=15),
axis.title.y = element_text(size=15),
plot.title = element_text(color = "gray43", size = 15, face = "bold",hjust=0.5)) -> p
# Le agrego la tasa media de manera horizontal
p +
geom_hline(yintercept=mean(data_tidy$Candidato),
linetype="dashed",
color="black",
size=1.5) -> p
# Le agrego el texto que diga cuanto es la tasa promedio
p +
geom_text(aes(x=1,
y=round(mean(data_tidy$Candidato),1)*0.9,
label=paste0("Tasa Media: ",round(mean(data_tidy$Candidato)*100,0),"%")),
hjust=0, size=6) -> p
# Defino las lineas verticales que voy a graficar
# Para las categorias con mayor y menor probabilidad de exito
MAYOR_1 <- length(conteo$token[conteo$Prop_exito>mean(data_tidy$Candidato)*1.75])
MAYOR_0 <- length(conteo$token[conteo$Prop_exito>mean(data_tidy$Candidato)*1.1])
MENOR_0 <- length(conteo$token[conteo$Prop_exito>mean(data_tidy$Candidato)*0.9])
MENOR_1 <- length(conteo$token[conteo$Prop_exito>mean(data_tidy$Candidato)*0.1])
# Agrego las secciones pintadas de mas o menos tasa de exito
p +
# Esto es para agregar la linea vertical:
geom_vline(xintercept = MAYOR_1,
color="palegreen4",
size=1) +
#Esto es para agregar el relleno:
annotate("rect",
xmin=1,
xmax = MAYOR_1,
ymin=-0.25,
ymax=1.3,
alpha=.2, fill="palegreen4") +
# Esto es para agregar el texto:
geom_text(aes(x=(1+MAYOR_1)/2,
y=1.1,
label=paste0("Palabras con\n tasa de éxito\n al menos un \n75% superior\n a la media")),
hjust=0.5, size=3.5)-> p
# Se repite la misma estructura de codigo:
p +
geom_vline(xintercept = MAYOR_0,
color="palegreen3",
size=1) +
annotate("rect",
xmin= MAYOR_1,
xmax = MAYOR_0,
ymin=-0.25,
ymax=1.3,
alpha=.2, fill="palegreen3") +
geom_text(aes(x=(MAYOR_0+MAYOR_1)/2,
y=1.1,
label=paste0("Palabras con\n tasa de éxito\n al menos un \n10% superior\n a la media")),
hjust=0.5, size=3.5)-> p
p +
geom_vline(xintercept = MENOR_0,
color="salmon3",
size=1)+
annotate("rect",
xmin= MAYOR_0,
xmax = MENOR_0,
ymin=-0.25,
ymax=1.3,
alpha=.2, fill="lightgoldenrodyellow") +
geom_text(aes(x=(MAYOR_0+MENOR_0)/2,
y=1.1,
label=paste0("Palabras con\ntasa de éxito\n muy similares \n a la media")),
hjust=0.5, size=3.5)-> p
p +
geom_vline(xintercept = MENOR_1,
color="salmon4",
size=1) +
annotate("rect",
xmin= MENOR_0,
xmax = MENOR_1,
ymin=-0.25,
ymax=1.3,
alpha=.2, fill="salmon3") +
geom_text(aes(x=(MENOR_1+MENOR_0)/2,
y=1.1,
label=paste0("Palabras con\n tasa de éxito\n al menos un\n 10% inferior\n a la media")),
hjust=0.5, size=3.5)-> p
p +
annotate("rect",
xmin= MENOR_1,
xmax = length(conteo$token),
ymin=-0.25,
ymax=1.3,
alpha=.2, fill="salmon4") +
geom_text(aes(x=(MENOR_1+length(conteo$token))/2,
y=1.1,
label=paste0("Palabras con\n tasa de éxito\n al menos un\n 50% inferior\n a la media")),
hjust=0.5, size=3.5)-> p
p
Teniendo en cuenta la tasa de éxito promedio (33%), se separaron 5 grupos de palabras: - Las que cuentan con una tasa de éxito al menos un 75% superior al promedio - Las que cuentan con una tasa de éxito entre un 10% y un 75% superior al promedio - Las que cuentan con una tasa de éxito muy similar al promedio (+/- 10%) - Las que cuentan con una tasa de éxito entre un 10% y un 50% inferior al promedio - Las que cuentan con una tasa de éxito al menos un 50% inferior al promedio
Vamos a crear cuatro variables que cuenten la cantidad de palabras claves que aparece en cada línea (según los cuatro grupos predefinidos, excluyendo al grupo de palabras que tienen una tasa de éxito muy similar al promedio).
Se debe tener en cuenta que las variables a crear son a nivel LÍNEA, y no a nivel PALABRA.
Desplegá el código para ver cómo armé las cuatro features!
# Identificando los cuatro grupos de palabras
# Primero vuelvo a armar el conteo
data_tidy %>%
filter(!token %in% stop_words_general) %>%
group_by(token) %>%
summarise(n=length(Candidato),
Prop_exito = mean(Candidato)) -> conteo
conteo %>%
filter(n>=6) -> conteo
# Luego identifico el grupo de palabras con mayores diferencias respecto a la tasa de éxito promedio
MAYOR_1 <- conteo$token[conteo$Prop_exito>mean(data_tidy$Candidato)*1.75]
MAYOR_0 <- conteo$token[conteo$Prop_exito>mean(data_tidy$Candidato)*1.10]
MAYOR_0 <- MAYOR_0[!MAYOR_0 %in% MAYOR_1] # Excluyo a los que ya estaban en el primer grupo
MENOR_1 <- conteo$token[conteo$Prop_exito<mean(data_tidy$Candidato)*0.5]
MENOR_0 <- conteo$token[conteo$Prop_exito<mean(data_tidy$Candidato)*0.9]
MENOR_0 <- MENOR_0[!MENOR_0 %in% MENOR_1]
# Por ultimo creo las cuatro features, en el data set que se encuentra a nivel linea
# Primero identifico a cada palabra si se encuentra o no dentro de cada grupo
data_tidy %>%
mutate(MayorExito_1=ifelse(token %in% MAYOR_1,1,0),
MayorExito_0=ifelse(token %in% MAYOR_0,1,0),
MenorExito_1=ifelse(token %in% MENOR_1,1,0),
MenorExito_0=ifelse(token %in% MENOR_0,1,0)) -> data_tidy
# Luego armo la agregación a nivel linea y candidato. Sumo la cantidad de palabras de cada grupo que aparecen en dicha linea
data_tidy %>%
group_by(line,Candidato) %>%
summarise(MayorExito_1 = sum(MayorExito_1),
MayorExito_0 = sum(MayorExito_0),
MenorExito_1 = sum(MenorExito_1),
MenorExito_0 = sum(MenorExito_0)) -> datos_linea
# Listo, ya están creadas las 4 features! En el proximo bloque vamos a mostrar el resumen de lo que armamos
MAYOR_1
## [1] "acceso" "argentina" "argentinos" "creemos"
## [5] "educacion" "mejorar" "nuestro" "objetivo"
## [9] "pais" "proteccion" "ser" "sociales"
## [13] "transparencia"
datos_linea %>%
mutate(MayorExito_1_Topeada = ifelse(MayorExito_1>2,2,MayorExito_1)) %>%
group_by(MayorExito_1_Topeada) %>%
summarise(Cantidad=length(Candidato),
Tasa_Exito=sum(Candidato)/length(Candidato)) -> resumen
resumen$MayorExito_1_Topeada <- factor(resumen$MayorExito_1_Topeada,
levels=unique(resumen$MayorExito_1_Topeada))
p <- ggplot(resumen,
aes(x=MayorExito_1_Topeada,
y=Cantidad,
fill=MayorExito_1_Topeada)) +
geom_bar(stat="identity",
color = rep('black',3)) +
ggtitle("Distribución del total de líneas") +
xlab("Feature 1") + ylab("Cantidad de líneas") +
theme_minimal() +
theme(axis.text.x = element_text(size=15,face = "bold"),
axis.title.x = element_text(size=15),
axis.title.y = element_text(size=15),
plot.title = element_text(color = "gray43", size = 15, face = "bold",hjust=0.5))+
geom_text(aes(label=resumen$Cantidad), position=position_dodge(width=0.9), vjust=-1,size=7)
ggplotly(p)
p <- ggplot(resumen,
aes(x=MayorExito_1_Topeada)) +
geom_bar(aes(y=Cantidad,
fill=MayorExito_1_Topeada),
stat="identity",
color = rep('black',3),
alpha = 0.2) +
geom_line(aes(y=Tasa_Exito * 198),
colour=c("#f9bb13"),
size=1.5,
group = 1) +
geom_point(aes(y=Tasa_Exito * 198),
colour=c("#ff9900"),
size=2) +
geom_text(aes(y=Tasa_Exito * 198,
label=paste0(round(resumen$Tasa_Exito,2)*100,"%")),
position=position_dodge(width=0.9), vjust=-1,size=7) +
scale_y_continuous(sec.axis = sec_axis(~./198, name = "Tasa de éxito")) +
theme_minimal() +
ggtitle("Tasas de éxito según grupos de Feature 1") +
xlab("Feature 1") + ylab("Cantidad de líneas") +
theme_minimal() +
theme(axis.text.x = element_text(size=15,face = "bold"),
axis.title.x = element_text(size=15),
axis.title.y = element_text(size=15),
plot.title = element_text(color = "gray43", size = 15, face = "bold",hjust=0.5))
p
MAYOR_0
## [1] "anos" "derecho" "desarrollo" "economico"
## [5] "equidad" "estado" "fortalecer" "impulsar"
## [9] "institucional" "ley" "politica" "salud"
## [13] "seguridad" "sistema" "social"
datos_linea %>%
mutate(MayorExito_0_Topeada = ifelse(MayorExito_0>3,3,MayorExito_0)) %>%
group_by(MayorExito_0_Topeada) %>%
summarise(Cantidad=length(Candidato),
Tasa_Exito=sum(Candidato)/length(Candidato)) -> resumen
resumen$MayorExito_0_Topeada <- factor(resumen$MayorExito_0_Topeada,
levels=unique(resumen$MayorExito_0_Topeada))
p <- ggplot(resumen,
aes(x=MayorExito_0_Topeada,
y=Cantidad,
fill=MayorExito_0_Topeada)) +
geom_bar(stat="identity",
color = rep('black',4)) +
ggtitle("Distribución del total de líneas") +
xlab("Feature 2") + ylab("Cantidad de líneas") +
theme_minimal() +
theme(axis.text.x = element_text(size=15,face = "bold"),
axis.title.x = element_text(size=15),
axis.title.y = element_text(size=15),
plot.title = element_text(color = "gray43", size = 15, face = "bold",hjust=0.5))+
geom_text(aes(label=resumen$Cantidad), position=position_dodge(width=0.9), vjust=-1,size=7)
ggplotly(p)
p <- ggplot(resumen,
aes(x=MayorExito_0_Topeada)) +
geom_bar(aes(y=Cantidad,
fill=MayorExito_0_Topeada),
stat="identity",
color = rep('black',4),
alpha = 0.2) +
geom_line(aes(y=Tasa_Exito * 150),
colour=c("#f9bb13"),
size=1.5,
group = 1) +
geom_point(aes(y=Tasa_Exito * 150),
colour=c("#ff9900"),
size=2) +
geom_text(aes(y=Tasa_Exito * 150,
label=paste0(round(resumen$Tasa_Exito,2)*100,"%")),
position=position_dodge(width=0.9), vjust=-1,size=7) +
scale_y_continuous(sec.axis = sec_axis(~./150, name = "Tasa de éxito")) +
theme_minimal() +
ggtitle("Tasas de éxito según grupos de Feature 2") +
xlab("Feature 2") + ylab("Cantidad de líneas") +
theme_minimal() +
theme(axis.text.x = element_text(size=15,face = "bold"),
axis.title.x = element_text(size=15),
axis.title.y = element_text(size=15),
plot.title = element_text(color = "gray43", size = 15, face = "bold",hjust=0.5))
p
MENOR_0
## [1] "defensa" "derechos" "economia" "federal" "generar" "mayores"
## [7] "mundo" "nacional" "parte" "publica" "recursos" "sociedad"
## [13] "trabajo"
datos_linea %>%
mutate(MenorExito_0_Topeada = ifelse(MenorExito_0>2,2,MenorExito_0)) %>%
group_by(MenorExito_0_Topeada) %>%
summarise(Cantidad=length(Candidato),
Tasa_Exito=sum(Candidato)/length(Candidato)) -> resumen
resumen$MenorExito_0_Topeada <- factor(resumen$MenorExito_0_Topeada,
levels=unique(resumen$MenorExito_0_Topeada))
p <- ggplot(resumen,
aes(x=MenorExito_0_Topeada,
y=Cantidad,
fill=MenorExito_0_Topeada)) +
geom_bar(stat="identity",
color = rep('black',3)) +
ggtitle("Distribución del total de líneas") +
xlab("Feature 3") + ylab("Cantidad de líneas") +
theme_minimal() +
theme(axis.text.x = element_text(size=15,face = "bold"),
axis.title.x = element_text(size=15),
axis.title.y = element_text(size=15),
plot.title = element_text(color = "gray43", size = 15, face = "bold",hjust=0.5))+
geom_text(aes(label=resumen$Cantidad), position=position_dodge(width=0.9), vjust=-1,size=7)
ggplotly(p)
p <- ggplot(resumen,
aes(x=MenorExito_0_Topeada)) +
geom_bar(aes(y=Cantidad,
fill=MenorExito_0_Topeada),
stat="identity",
color = rep('black',3),
alpha = 0.2) +
geom_line(aes(y=Tasa_Exito * 150),
colour=c("#f9bb13"),
size=1.5,
group = 1) +
geom_point(aes(y=Tasa_Exito * 150),
colour=c("#ff9900"),
size=2) +
geom_text(aes(y=Tasa_Exito * 150,
label=paste0(round(resumen$Tasa_Exito,2)*100,"%")),
position=position_dodge(width=0.9), vjust=-1,size=7) +
scale_y_continuous(sec.axis = sec_axis(~./150, name = "Tasa de éxito")) +
theme_minimal() +
ggtitle("Tasas de éxito según grupos de Feature 3") +
xlab("Feature 3") + ylab("Cantidad de líneas") +
theme_minimal() +
theme(axis.text.x = element_text(size=15,face = "bold"),
axis.title.x = element_text(size=15),
axis.title.y = element_text(size=15),
plot.title = element_text(color = "gray43", size = 15, face = "bold",hjust=0.5))
p
MENOR_1
## [1] "alianza" "cambiemos" "consejo" "garantizar"
## [5] "internacional" "juventudes" "nuestra" "nuevo"
## [9] "perdida" "personas" "poder" "programa"
## [13] "promover" "publicas" "situacion"
datos_linea %>%
mutate(MenorExito_1_Topeada = ifelse(MenorExito_1>2,2,MenorExito_1)) %>%
group_by(MenorExito_1_Topeada) %>%
summarise(Cantidad=length(Candidato),
Tasa_Exito=sum(Candidato)/length(Candidato)) -> resumen
resumen$MenorExito_1_Topeada <- factor(resumen$MenorExito_1_Topeada,
levels=unique(resumen$MenorExito_1_Topeada))
p <- ggplot(resumen,
aes(x=MenorExito_1_Topeada,
y=Cantidad,
fill=MenorExito_1_Topeada)) +
geom_bar(stat="identity",
color = rep('black',3)) +
ggtitle("Distribución del total de líneas") +
xlab("Feature 4") + ylab("Cantidad de líneas") +
theme_minimal() +
theme(axis.text.x = element_text(size=15,face = "bold"),
axis.title.x = element_text(size=15),
axis.title.y = element_text(size=15),
plot.title = element_text(color = "gray43", size = 15, face = "bold",hjust=0.5))+
geom_text(aes(label=resumen$Cantidad), position=position_dodge(width=0.9), vjust=-1,size=7)
ggplotly(p)
p <- ggplot(resumen,
aes(x=MenorExito_1_Topeada)) +
geom_bar(aes(y=Cantidad,
fill=MenorExito_1_Topeada),
stat="identity",
color = rep('black',3),
alpha = 0.2) +
geom_line(aes(y=Tasa_Exito * 150),
colour=c("#f9bb13"),
size=1.5,
group = 1) +
geom_point(aes(y=Tasa_Exito * 150),
colour=c("#ff9900"),
size=2) +
geom_text(aes(y=Tasa_Exito * 150,
label=paste0(round(resumen$Tasa_Exito,2)*100,"%")),
position=position_dodge(width=0.9), vjust=-1,size=7) +
scale_y_continuous(sec.axis = sec_axis(~./150, name = "Tasa de éxito")) +
theme_minimal() +
ggtitle("Tasas de éxito según grupos de Feature 4") +
xlab("Feature 4") + ylab("Cantidad de líneas") +
theme_minimal() +
theme(axis.text.x = element_text(size=15,face = "bold"),
axis.title.x = element_text(size=15),
axis.title.y = element_text(size=15),
plot.title = element_text(color = "gray43", size = 15, face = "bold",hjust=0.5))
p
# Defino el data set unicamente con las features a analizar
mydata <- datos_linea[,3:ncol(datos_linea)]
# Grafico 1
library(corrplot)
corrplot.mixed(cor(mydata), order="hclust", tl.col="black")
# Defino el data set unicamente con las features a analizar
mydata <- datos_linea[,3:ncol(datos_linea)]
# Grafico 2
library(GGally)
ggpairs(mydata)
library(DT)
datatable(datos_linea)
Siguiendo esta línea se podrían crear cientos de features más que ayuden a discriminar entre un programa de Macri vs un programa de Fernandez!
Finalmente, cuando se crearon suficientes features, se puede correr algún algoritmo de Machine Learning para optimizar la combinación de estas features y obtener las mejores predicciones posibles para el evento objetivo.
Cuando se hace un análisis de text mining con el objetivo de crear distintas features para armar un modelo predictivo, es importante no perder de vista qué es lo que quiero predecir y cómo puedo construir variables que dependan de palabras o relaciones de palabras tal que ayuden a mejorar las predicciones.
Así como en este trabajo se hizo un análisis de palabras y la tasa de éxito asociada a cada una de ellas, se puede realizar algún tipo de análisis entre relaciones de palabras, siguiendo la misma metodología.
Las 4 features creadas en este trabajo se resumen en el siguiente grafo, en donde se puede ver qué palabras se consideran para definir cada uno de los grupos:
Resumen_Features <- data.frame(FEATURE=c(rep("MayorExito_1",length(MAYOR_1)),
rep("MayorExito_0",length(MAYOR_0)),
rep("MenorExito_1",length(MENOR_1)),
rep("MenorExito_0",length(MENOR_0))),
PALABRAS=c(MAYOR_1,
MAYOR_0,
MENOR_1,
MENOR_0))
nivel_1 <- length(unique(Resumen_Features$FEATURE))
nivel_2 <- length(unique(paste(Resumen_Features$FEATURE,Resumen_Features$PALABRAS)))
p <- collapsibleTree(Resumen_Features,
root="Features",
hierarchy = c("FEATURE", "PALABRAS"),
fontSize = 12,
fill = c("hotpink",
rep("plum", nivel_1),
rep("lightskyblue",nivel_2)),
collapsed = TRUE,
tooltip=TRUE,
zoomable = TRUE,
fillByLevel=TRUE)
p
Si alguien tiene otras ideas para aportar, serán muy bien recibidas!
Muchas gracias por leerme hasta acá :)