TÉCNICAS ESTADÍSTICAS DE VISUALIZACIÓN Y VALIDEZ POBLACIONAL CON R MEDIANTE DATOS PRAGMÁTICOS Y FÓNICOS

Author
Affiliation

Adrián Cabedo Nebot

Universitat de València

Curso diseñado para el Servei de Formació Permanent de la Universitat de València.

Email: adrian.cabedo@uv.es

Celebrado los días: 20, 23, 27 y 30 de mayo de 2024

Copyright y derechos:

Curso estadística 2024 para el Servei de Formació Permanent by Adrián Cabedo Nebot is licensed under CC BY 4.0

1 Programa del curso

1.1 Resumen

El curso ofrece una inmersión completa en el análisis y aprovechamiento de bases de datos lingüísticas, superando las limitaciones de herramientas convencionales como Excel y Google Sheets. Los participantes adquirirán una sólida comprensión de R, un lenguaje de programación esencial en análisis de datos. Además, explorarán técnicas estadísticas avanzadas para visualizar y analizar datos lingüísticos y poblacionales. Aprenderán a crear visualizaciones descriptivas impactantes utilizando GGplot2, aplicarán Mosaicplot y pruebas de chi cuadrado para investigar relaciones categóricas, identificarán patrones en datos multidimensionales mediante análisis de correspondencias y componentes, utilizarán árboles de decisiones para tomar decisiones basadas en datos y explorarán relaciones no lineales, y generarán mapas de calor para visualizar correlaciones y tendencias en datos numéricos. Este curso proporciona una base para el análisis avanzado de datos lingüísticos y poblacionales.

1.2 Objetivos específicos

• Adquirir habilidades avanzadas en el manejo de bases de datos lingüísticas más allá de las hojas de cálculo tradicionales como Excel o Google Sheets.

• Familiarizarse con el programa R, aprendiendo los conceptos básicos de programación y análisis de datos en este entorno.

• Desarrollar la capacidad de representar datos de manera efectiva utilizando técnicas de visualización avanzadas, incluyendo barras, lolipops, diagramas de caja y líneas temporales utilizando GGplot2 en R.

• Adquirir habilidades avanzadas en el análisis de datos, utilizando diversas técnicas estadísticas y de visualización, como Mosaicplot y pruebas de chi cuadrado para explorar relaciones entre variables categóricas, análisis de correspondencias múltiples y análisis de componentes para identificar patrones en datos multidimensionales, la construcción de árboles de decisiones para tomar decisiones basadas en datos y la exploración de relaciones no lineales, así como la generación de mapas de calor para visualizar patrones de correlación y tendencias en datos numéricos.

1.3 Contenidos

  1. Análisis y explotación de una base de datos lingüística: más allá de Excel/Goole Sheets

  2. Introducción básica al manejo del programa R

  3. Técnicas estadísticas de visualización y contraste poblacional

    1. Visualización descriptiva (barras, lolipops, diagramas de caja, líneas temporales…) con GGplot2.
    2. Mosaicplot y chi cuadrado Análisis múltiple de correspondencias / Análisis de componentes
    3. Árboles de decisiones
    4. Mapas de calor

1.4 Conocimientos previos

Se recomienda a las personas interesadas en realizar el curso que tengan un conocimiento básico de programas de hojas de datos como, por ejemplo, Excel o, al menos, que conozcan su estructura general. También es recomendable que hayan realizado investigaciones previas con datos.

1.5 Requisitos técnicos

Se recomienda a quien acuda al curso que tenga previamente instalado R (https://cran.rediris.es/) y RStudio (https://posit.co/download/rstudio-desktop) en su propio ordenador portátil, independientemente de que la realización del curso pueda impartirse en algún aula con ordenadores. Ambos son programas gratuitos y pueden instalarse en Linux, Windows y Mac.

1.6 Sobre los datos de este curso

En este curso, utilizaremos datos lingüísticos, específicamente datos pragmáticos y fónicos, como ejemplos prácticos para aprender a trabajar con R y desarrollar habilidades estadísticas avanzadas. Sin embargo, es importante comprender que el enfoque principal de este curso va más allá de los datos lingüísticos en sí. Las técnicas y pruebas que aprenderán aquí son universales y se pueden aplicar a una amplia gama de datos en diferentes campos y disciplinas. Nuestro objetivo es capacitar a quienes asistan para que se conviertan en analistas de datos competentes y versátiles que puedan abordar y resolver problemas utilizando R y técnicas estadísticas, independientemente del tipo de datos con el que trabajen en el futuro.

1.7 Evaluación

Los contenidos se evaluarán a través de la asistencia y las prácticas realizadas en el aula, así como de la realización de un breve cuestionario online a la finalización del curso. En este cuestionario se preguntará sobre los ejemplos prácticos expuestos en clase.

1.8 Bibliografía recomendada

Referencias recomendas
  • Este mismo documento.

  • Cabedo Nebot, A. (2021). Fundamentos de estadística con R para lingüistas. Tirant Lo Blanch.

  • Gries, S. Th. (2021). Statistics for Linguistics with R: A Practical Introduction. De Gruyter. https://doi.org/10.1515/9783110718256

  • Levshina, N. (2015). How to do Linguistics with R: Data exploration and statistical analysis. John Benjamins Publishing Company.

  • Moore, D. S., & McCabe, G. P. (1999). Introduction to the practice of statistics. W.H. Freeman.

  • Navarro, D. (2015). Learning statistics with R: A tutorial for psychology students and other beginners. (. University of Adelaide. https://learningstatisticswithr.com/

1.9 ¿Dónde voy cuando me atasco?

2 Y hubo un principio…

2.1 ¿Qué hago en mi investigación?

Images created by an AI from OpenAI

2.2 ¿Por qué analizar datos?

Image created by an AI from OpenAI

2.3 ¿Cómo siente un lingüista la estadística?

Images created by an AI from OpenAI

3 Sobre R

Funcionalidades de R
  • Análisis Estadístico: Desde análisis descriptivos básicos hasta modelos estadísticos avanzados y pruebas de hipótesis.

  • Visualización de Datos: Creación de gráficos y mapas detallados para explorar y presentar datos de manera efectiva.

  • Manipulación de Datos: Transformación, limpieza y preparación de datos para análisis mediante paquetes como dplyr y tidyr.

  • Modelado Predictivo: Desarrollo de modelos de machine learning, incluyendo regresión, clasificación y clustering.

  • Generación de Informes: Automatización de informes y creación de documentos reproducibles con R Markdown.

  • Interfaz de Programación: Desarrollo de aplicaciones interactivas y dashboards usando Shiny para presentaciones dinámicas de datos.

4 Sobre R (II)

Vale, pero, ¿qué hace realmente R?

library(tidyverse)
library(gridExtra)

frase <- unlist(strsplit("la noche en la que suplico que no salga el sol", " "))

# Crear el data frame
datos <- data.frame(
  palabra = frase,  
  tiempo = seq(0, length(frase) - 1), 
  pitch = runif(length(frase), min=80, max=90),  
  intensidad = runif(length(frase), min=70, max=85)  
)

# Create the plot with labels
plot <- ggplot(datos) +
  geom_point(aes(x = tiempo, y = pitch, color = "Pitch")) +
  geom_smooth(aes(x = tiempo, y = pitch, color = "Pitch")) +
  geom_text(aes(x = tiempo, y = pitch, label = palabra), vjust = -1, hjust = 0.5, size = 3.5, check_overlap = TRUE) +  geom_point(aes(x = tiempo, y = intensidad, color = "Intensidad")) +
  geom_smooth(aes(x = tiempo, y = intensidad, color = "Intensidad")) +
  labs(color = "Variable") + # Add text labels above points
  theme_minimal() 
plot

Figura extraída con GGplot2. Curva melódica y de intensidad del enunciado la noche en la que no salga el sol

5 ¿Qué más puedo hacer con R?

Más funcionalidades
  • Escribir documentos científicos mediante Rmarkdown o Quarto (este mismo documento ha sido escrito en R).

  • Exportar tus documentos a varios formatos: PDF, Word o Powerpoint.

  • Modificación de las plantillas. Ejemplo: revista Normas de la UV.

  • Programar scripts que realicen funciones de manera automática. Por ejemplo, abre todos los archivos de una carpeta e impórtalos.

  • Crear aplicaciones web para consultar datos. Ej.: Oralstats.

6 ¿Desde dónde instalo R y RStudio?

  • R
  • RStudio
  • Puedes usar también una versión gratuita online (con limitaciones de uso, pero suficiente para este curso y para un uso puntual): https://posit.cloud/

7 ¿Por qué RStudio?

Justificación de R
  • RStudio es un entorno de desarrollo integrado (IDE) para R.

  • RStudio simplifica la programación en R y mejora la productividad del usuario.

  • RStudio es gratuito y de código abierto.

  • RStudio es multiplataforma (Windows, Mac y Linux).

8 Uso de Excel o Google Sheets

Uso de Excel
  • Formato tabular. Filas y columnas.

  • Organización de datos.

  • Tablas dinámicas para estadística básica.

  • Limitaciones: no permite realizar análisis estadísticos avanzados.

8.1 Bases de datos

https://github.com/acabedo/abralin_1/blob/main/idiolectal.xlsx

https://github.com/acabedo/databases/blob/main/r-libro/fonocortesia.xlsx

8.2 Ejemplo de uso: Fonocortesía

https://lookerstudio.google.com/reporting/57f127e6-8e3b-4d63-8fc7-7e0226431e9c/page/9OMAB?s=iJDWulQ3Ees

https://adrin-cabedo.shinyapps.io/oralstats_v_1_3/

8.3 Métodos de exploración avanzada en Excel o Google Sheets

Sobre tablas dinámicas

Tablas dinámicas: “Una tabla dinámica es una herramienta avanzada para calcular, resumir y analizar datos que le permite ver comparaciones, patrones y tendencias en ellos. Las tablas dinámicas funcionan de forma un poco distinta dependiendo de la plataforma que use para ejecutar Excel.” (extraído de: https://support.microsoft.com/es-es/office/crear-una-tabla-din%C3%A1mica-para-analizar-datos-de-una-hoja-de-c%C3%A1lculo-a9a84538-bfe9-40a9-a8e9-f99134456576)

8.4 Ejercicio

Explora la base de datos Idiolectal en Excel o Google Sheets.

8.5 Definir la construcción de la base de datos (estructura)

flowchart LR
  A[Investigación] --> B(Base de datos)
  B --> C{Variables}
  C --> D[elemento de análisis]
  C --> E[F0 media]
  C --> F[Intensidad media]
  C --> G[Cortesía]
  C --> H[...]
flowchart LR
  A[Investigación] --> B(Base de datos)
  B --> C{Variables}
  C --> D[elemento de análisis]
  C --> E[F0 media]
  C --> F[Intensidad media]
  C --> G[Cortesía]
  C --> H[...]

Figura. Proceso de construcción de la base de datos.

9 Uso general de R

9.1 Instalar librerías

install.packages("tidyverse")
install.packages("FactoMineR")
install.packages("factoextra")
install.packages("partykit")
install.packages("randomForest")
install.packages("DataExplorer")
install.packages("heatmap.2")
install.packages("corrplot")
install.packages("ggwordcloud")

9.2 Cargar librerías

library(tidyverse)
library(corrplot)
library(FactoMineR)
library(factoextra)
library(partykit)
library(randomForest)
library(DataExplorer)
library(gplots)
library(ggwordcloud)

9.3 Importar datos

library(readxl)
fonocortesia <- read_xlsx("databases/corpus.xlsx")

9.4 Conoce la estructura de tus datos: str o summary

str(fonocortesia)
tibble [282 × 36] (S3: tbl_df/tbl/data.frame)
 $ Conversacion              : chr [1:282] "VALESCO 114A" "VALESCO 130A" "VALESCO 194A" "VALESCO 114A" ...
 $ Cortes_Descortes          : chr [1:282] "descortés" "descortés" "descortés" "descortés" ...
 $ Llama_Atencion            : chr [1:282] "acento;entonación;velocidad de habla" "acento;duración;entonación" "acento;duración;velocidad de habla" "acento;entonación;velocidad de habla" ...
 $ Mediodeexpresion          : chr [1:282] "Fórmulas indirectas" "Atenuación" "Intensificación" "Intensificación" ...
 $ F0_Inicial                : num [1:282] 227 213 242 148 249 ...
 $ F0_Final                  : num [1:282] 292 226 422 125 224 ...
 $ F0_Media                  : num [1:282] 298 174 315 224 226 ...
 $ F0_Maxima                 : num [1:282] 441 301 498 121 334 ...
 $ F0_Minima                 : num [1:282] 225 70.2 108 461 111.7 ...
 $ Intensidad_Maxima         : num [1:282] 89 86 86 89 87 86 90 89 NA 64 ...
 $ Intensidad_Minima         : num [1:282] 71 74 59 68 83 61 66 69 NA 45 ...
 $ Intensidad_Primera        : num [1:282] 84 77 83 77 80 80 85 70 NA NA ...
 $ Intensidad_Ultima         : num [1:282] 85 80 70 76 83 80 88 81 NA NA ...
 $ Intensidad_Media          : num [1:282] 85 78 81 85 83 80 85 84 0 57 ...
 $ Silabas                   : num [1:282] 4.1 19 41 37 39 38 31 39 47 0 ...
 $ Duracion                  : num [1:282] 33 9 7.6 7.4 7.2 6.9 6 6 6 5.62 ...
 $ Duracion_Pausa_Anterior   : num [1:282] 0 1 0 0 0 0.6 0 0 0 0 ...
 $ Duracion_Pausa_Posterior  : num [1:282] 0 2.1 0 0 0.5 0 0 0 0 0 ...
 $ Continuacion_Pausa        : chr [1:282] "continúa otro hablante" "continúa otro hablante" "continúa otro hablante" "continúa el mismo hablante" ...
 $ Curva_Melodica            : chr [1:282] "suspensión" "suspensión" "circunfleja" "inclinación" ...
 $ Otro_Curva_Melodica       : chr [1:282] "desconocido" "desconocido" "desconocido" "desconocido" ...
 $ Inflexion_Local_Interna   : chr [1:282] "ascendente" "ninguna" "ascendente_descendente" "ascendente" ...
 $ Tonema                    : chr [1:282] "suspendido" "suspendido" "ascendente" "descendente" ...
 $ Unidad_Del_Discurso       : chr [1:282] "Intervención reactiva" "acto;Intervención iniciativo-reactiva" "acto;Intervención reactiva;turno" "Intervención reactivo-iniciativa;turno" ...
 $ Valormodal                : chr [1:282] "aserción" "desconocido" "negación" "aserción" ...
 $ Otro_Valor_Modal          : chr [1:282] "desconocido" "Amenaza" "Respuesta" "desconocido" ...
 $ Fenomeno_Tonal            : chr [1:282] "entonación suspendida" "entonación suspendida" "ascenso brusco de la curva melódica" "ascenso brusco de la curva melódica" ...
 $ Fenomeno_Duracion         : chr [1:282] "alargamiento" "alargamiento" "ninguno" "ninguno" ...
 $ Fenomeno_Pausas           : chr [1:282] "desconocido" "pausas largas" "pausas cortas" "pocas pausas" ...
 $ Fenomeno_Velocidad        : chr [1:282] "velocidad de habla rápida" "velocidad de habla lenta" "velocidad de habla rápida" "ninguno" ...
 $ Fenomeno_Amplitud         : chr [1:282] "campo tonal alto" "ninguno" "campo tonal alto" "ninguno" ...
 $ Unidad_Fonica             : chr [1:282] "cláusula entonativa" "grupo entonativo" "cláusula entonativa" "paratono" ...
 $ Estrategia_Pragmatica     : chr [1:282] "recriminación" "desconocido" "Ofrecer información" "recriminación;desacuerdo" ...
 $ Efecto_Pragmatico_Asociado: chr [1:282] "desconocido" "desconocido" "Ninguno" "desconocido" ...
 $ Elemento_Analizado        : chr [1:282] "si me lo ha dicho a mí ella" "M: (...) si no tee- no te sacas un futuro­↑/// asín quee↓// aprieta porque sino→" "M: porque NOO/ porque me pongo a discutir↑ otra vez con ella / y con ella↑ es inútil discutir↓ hay que [darle la=]" "y si desde que tú vas diciéndome/ na(da) na na na\r\n" ...
 $ Fragmento                 : chr [1:282] "C: si me lo ha dicho a mí ella↓ ella allí tiene el historial del PAPA↓ allí en la ofici– y tiene también el [hi"| __truncated__ "M: estudiar // tú porque no quieres estudiar // pero imagínate que tú no-tú no // si no tee- no te sacas un fut"| __truncated__ "P: a A si que la quieres→/ o si no↑ cuenta lo que ha pasado hoy con la conducción§\r\nM: § no\r\nP: ¿por QUÉ?\r"| __truncated__ "A:  y si desde que tú vas diciéndome/ na(da) na na na↑ ya son trenta billetes que hubiera perdido↓ TRENTA/// ¿¡"| __truncated__ ...
summary(fonocortesia)
 Conversacion       Cortes_Descortes   Llama_Atencion     Mediodeexpresion  
 Length:282         Length:282         Length:282         Length:282        
 Class :character   Class :character   Class :character   Class :character  
 Mode  :character   Mode  :character   Mode  :character   Mode  :character  
                                                                            
                                                                            
                                                                            
                                                                            
   F0_Inicial       F0_Final        F0_Media       F0_Maxima    
 Min.   :  0.0   Min.   :  0.0   Min.   :  0.0   Min.   :  0.0  
 1st Qu.:161.8   1st Qu.:145.9   1st Qu.:180.0   1st Qu.:228.2  
 Median :219.7   Median :210.1   Median :221.4   Median :286.0  
 Mean   :212.7   Mean   :210.0   Mean   :215.3   Mean   :287.6  
 3rd Qu.:252.2   3rd Qu.:266.3   3rd Qu.:251.7   3rd Qu.:356.0  
 Max.   :490.0   Max.   :519.0   Max.   :419.6   Max.   :528.0  
 NA's   :42      NA's   :42                                     
   F0_Minima     Intensidad_Maxima Intensidad_Minima Intensidad_Primera
 Min.   :  0.0   Min.   :52.00     Min.   : 40.00    Min.   :51.00     
 1st Qu.:100.7   1st Qu.:73.75     1st Qu.: 55.00    1st Qu.:75.00     
 Median :133.6   Median :86.00     Median : 72.00    Median :81.00     
 Mean   :142.6   Mean   :80.62     Mean   : 67.32    Mean   :79.18     
 3rd Qu.:185.8   3rd Qu.:89.00     3rd Qu.: 77.00    3rd Qu.:86.00     
 Max.   :461.0   Max.   :90.00     Max.   :107.00    Max.   :90.00     
                 NA's   :2         NA's   :2         NA's   :49        
 Intensidad_Ultima Intensidad_Media    Silabas         Duracion     
 Min.   :54.00     Min.   :  0.00   Min.   : 0.00   Min.   : 0.000  
 1st Qu.:72.00     1st Qu.: 66.00   1st Qu.: 6.00   1st Qu.: 1.000  
 Median :77.00     Median : 81.00   Median : 9.50   Median : 1.500  
 Mean   :76.59     Mean   : 76.76   Mean   :11.54   Mean   : 2.042  
 3rd Qu.:84.00     3rd Qu.: 86.00   3rd Qu.:15.00   3rd Qu.: 2.400  
 Max.   :89.00     Max.   :222.00   Max.   :47.00   Max.   :33.000  
 NA's   :49                                                         
 Duracion_Pausa_Anterior Duracion_Pausa_Posterior Continuacion_Pausa
 Min.   : 0.0000         Min.   : 0.0000          Length:282        
 1st Qu.: 0.0000         1st Qu.: 0.0000          Class :character  
 Median : 0.0000         Median : 0.0000          Mode  :character  
 Mean   : 0.3939         Mean   : 0.5122                            
 3rd Qu.: 0.5000         3rd Qu.: 0.6000                            
 Max.   :15.0000         Max.   :36.0000                            
                                                                    
 Curva_Melodica     Otro_Curva_Melodica Inflexion_Local_Interna
 Length:282         Length:282          Length:282             
 Class :character   Class :character    Class :character       
 Mode  :character   Mode  :character    Mode  :character       
                                                               
                                                               
                                                               
                                                               
    Tonema          Unidad_Del_Discurso  Valormodal        Otro_Valor_Modal  
 Length:282         Length:282          Length:282         Length:282        
 Class :character   Class :character    Class :character   Class :character  
 Mode  :character   Mode  :character    Mode  :character   Mode  :character  
                                                                             
                                                                             
                                                                             
                                                                             
 Fenomeno_Tonal     Fenomeno_Duracion  Fenomeno_Pausas    Fenomeno_Velocidad
 Length:282         Length:282         Length:282         Length:282        
 Class :character   Class :character   Class :character   Class :character  
 Mode  :character   Mode  :character   Mode  :character   Mode  :character  
                                                                            
                                                                            
                                                                            
                                                                            
 Fenomeno_Amplitud  Unidad_Fonica      Estrategia_Pragmatica
 Length:282         Length:282         Length:282           
 Class :character   Class :character   Class :character     
 Mode  :character   Mode  :character   Mode  :character     
                                                            
                                                            
                                                            
                                                            
 Efecto_Pragmatico_Asociado Elemento_Analizado  Fragmento        
 Length:282                 Length:282         Length:282        
 Class :character           Class :character   Class :character  
 Mode  :character           Mode  :character   Mode  :character  
                                                                 
                                                                 
                                                                 
                                                                 

9.5 Citar R

citation()
To cite R in publications use:

  R Core Team (2024). _R: A Language and Environment for Statistical
  Computing_. R Foundation for Statistical Computing, Vienna, Austria.
  <https://www.R-project.org/>.

A BibTeX entry for LaTeX users is

  @Manual{,
    title = {R: A Language and Environment for Statistical Computing},
    author = {{R Core Team}},
    organization = {R Foundation for Statistical Computing},
    address = {Vienna, Austria},
    year = {2024},
    url = {https://www.R-project.org/},
  }

We have invested a lot of time and effort in creating R, please cite it
when using it for data analysis. See also 'citation("pkgname")' for
citing R packages.
citation("tidyverse")
To cite package 'tidyverse' in publications use:

  Wickham H, Averick M, Bryan J, Chang W, McGowan LD, François R,
  Grolemund G, Hayes A, Henry L, Hester J, Kuhn M, Pedersen TL, Miller
  E, Bache SM, Müller K, Ooms J, Robinson D, Seidel DP, Spinu V,
  Takahashi K, Vaughan D, Wilke C, Woo K, Yutani H (2019). "Welcome to
  the tidyverse." _Journal of Open Source Software_, *4*(43), 1686.
  doi:10.21105/joss.01686 <https://doi.org/10.21105/joss.01686>.

A BibTeX entry for LaTeX users is

  @Article{,
    title = {Welcome to the {tidyverse}},
    author = {Hadley Wickham and Mara Averick and Jennifer Bryan and Winston Chang and Lucy D'Agostino McGowan and Romain François and Garrett Grolemund and Alex Hayes and Lionel Henry and Jim Hester and Max Kuhn and Thomas Lin Pedersen and Evan Miller and Stephan Milton Bache and Kirill Müller and Jeroen Ooms and David Robinson and Dana Paige Seidel and Vitalie Spinu and Kohske Takahashi and Davis Vaughan and Claus Wilke and Kara Woo and Hiroaki Yutani},
    year = {2019},
    journal = {Journal of Open Source Software},
    volume = {4},
    number = {43},
    pages = {1686},
    doi = {10.21105/joss.01686},
  }

9.6 Data frames

Un data frame es una estructura de datos en R que se utiliza para almacenar datos en forma tabular. Es similar a una matriz, pero cada columna puede contener un tipo de datos diferente.

data.frame(
  cortesia = c("cortés", "descortés", "cortés"),
  f0_media = c(145, 187, 135),
  sexo = c("Hombre", "Mujer", "Hombre")
)
   cortesia f0_media   sexo
1    cortés      145 Hombre
2 descortés      187  Mujer
3    cortés      135 Hombre
Visualizar data frames

Los data frames se pueden visualizar en RStudio en la pestaña “Environment” o escribiendo el nombre del data frame en la consola. Para mejorar la visualización, puedes usar la función View().

10 Tareas de limpieza y manipulación de datos

  1. Revisión y corrección de valores faltantes:

    • Identificar y manejar los valores no disponicles (NA en R).

    • Decidir si imputar los valores faltantes con la media, mediana, moda, o algún otro método, o eliminar las filas/columnas con valores faltantes.

  2. Detección y manejo de valores atípicos:

    • Identificar valores atípicos o outliers que pueden distorsionar el análisis.

    • Decidir si eliminar, transformar o tratar de otra manera estos valores.

  3. Estandarización y normalización de datos:

    • Estandarizar unidades de medida para asegurarse de que sean consistentes.

    • Normalizar o estandarizar variables si es necesario para ciertos tipos de análisis.

  4. Conversión de tipos de datos:

    • Asegurarse de que los datos estén en los tipos adecuados (por ejemplo, convertir variables categóricas a factores en R).
  5. Revisión de la coherencia de los datos:

    • Verificar que no haya inconsistencias en los datos (por ejemplo, un valor de edad negativo).

    • Asegurar que los valores categóricos estén correctamente codificados y no haya variaciones como “Hombre” y “hombre”.

  6. Eliminación de duplicados:

    • Identificar y eliminar registros duplicados que puedan afectar el análisis.
  7. Corrección de errores tipográficos y de entrada de datos:

    • Revisar y corregir errores tipográficos o de entrada manual en los datos.
  8. Creación de variables derivadas:

    • Crear nuevas variables que puedan ser útiles para el análisis, como agregar una variable que represente la diferencia entre dos fechas (edad, duración, etc.).
  9. Filtrado de datos irrelevantes:

    • Eliminar columnas o filas que no sean relevantes para el análisis específico.

10.1 ¿Qué es Tidyverse?

https://www.tidyverse.org/

Note

Colección de paquetes de R diseñados para la ciencia de datos.

  • dplyr: manipulación de datos.

  • ggplot2: visualización de datos.

  • tidyr: limpieza de datos.

  • readr: importación de datos.

10.2 Filtrar datos

  1. Ver los datos (table)
  2. Filtrar datos (filter)
Notas importantes
  • El operador %>% se utiliza para encadenar funciones en R. Se lee de izquierda a derecha, lo que facilita la lectura del código.
  • El operador == se utiliza para comparar si dos valores son iguales.
  • EL operador != se utiliza para comparar si dos valores son diferentes.
  • El operador <- se utiliza para crear un nuevo objeto (variable, dataframe…) en R.
table(fonocortesia$Cortes_Descortes)

     cortés desconocido   descortés 
        135           1         146 
fonocortesia%>%filter(Cortes_Descortes=="desconocido")
# A tibble: 1 × 36
  Conversacion Cortes_Descortes Llama_Atencion Mediodeexpresion F0_Inicial
  <chr>        <chr>            <chr>          <chr>                 <dbl>
1 VALESCO 194A desconocido      entonación     desconocido             296
# ℹ 31 more variables: F0_Final <dbl>, F0_Media <dbl>, F0_Maxima <dbl>,
#   F0_Minima <dbl>, Intensidad_Maxima <dbl>, Intensidad_Minima <dbl>,
#   Intensidad_Primera <dbl>, Intensidad_Ultima <dbl>, Intensidad_Media <dbl>,
#   Silabas <dbl>, Duracion <dbl>, Duracion_Pausa_Anterior <dbl>,
#   Duracion_Pausa_Posterior <dbl>, Continuacion_Pausa <chr>,
#   Curva_Melodica <chr>, Otro_Curva_Melodica <chr>,
#   Inflexion_Local_Interna <chr>, Tonema <chr>, Unidad_Del_Discurso <chr>, …
table(fonocortesia$Cortes_Descortes)

     cortés desconocido   descortés 
        135           1         146 
fonocortesia_filt <- fonocortesia%>%filter(Cortes_Descortes!="desconocido")

10.3 Seleccionar columnas: select

fonocortesia_sel <- fonocortesia%>%select(Cortes_Descortes, F0_Media, Intensidad_Media)

10.4 Ordenar datos: arrange

fonocortesia_ord <- fonocortesia%>%arrange(F0_Media)

10.5 Reordernar columnas:: relocate

fonocortesia_reord2 <- fonocortesia%>%relocate(Cortes_Descortes, .after = Intensidad_Media)

10.6 Crear nuevas columnas: mutate

Ejemplo: convertir Hz a Semitono

fonocortesia_nueva <- fonocortesia%>%mutate(F0_media_norm = 12*log2(F0_Media/1))

10.7 Agrupar datos: group_by

fonocortesia_agrup <- fonocortesia%>%group_by(Cortes_Descortes)%>%mutate(F0_media_mean = mean(F0_Media,na.rm = T), Intensidad_media_mean = mean(Intensidad_Media,na.rm = T))

10.8 Resumir datos: summarise

fonocortesia_resumen <- fonocortesia%>%group_by(Cortes_Descortes)%>%summarise(F0_media_mean = mean(F0_Media,na.rm = T), Intensidad_media_mean = mean(Intensidad_Media,na.rm = T))

11 Visualización de datos

En esta sección, aprenderemos a visualizar datos utilizando el paquete ggplot2 en R. GGplot2 es una librería de visualización de datos en R que permite crear gráficos de alta calidad de manera sencilla y flexible.

11.1 ¿Por qué visualizar datos?

Visualizar datos es una parte fundamental del análisis de datos. Las visualizaciones permiten explorar los datos, identificar patrones y tendencias, comunicar resultados y conclusiones, y tomar decisiones adecuadas y coherentes. Las visualizaciones efectivas pueden ayudar a resumir y presentar datos de manera clara y concisa; esto facilita la interpretación y comprensión de los datos.

Images created by an AI from OpenAI

11.2 ¿Qué es ggplot2?

GGplot2 es una librería de visualización de datos en R que permite crear gráficos de alta calidad de manera sencilla y flexible. GGplot2 se basa en la gramática de gráficos, un enfoque que descompone los gráficos en componentes básicos (datos, estética, geometría, estadísticas y facetas) y permite construir gráficos complejos combinando estos componentes de manera intuitiva.

11.3 Tipos de gráficos

Los gráficos más comunes que se pueden crear con ggplot2 incluyen: gráfico de barras, gráfico de líneas, gráfico de dispersión, gráfico de violín, gráfico de áreas, gráfico de burbujas, gráfico de donut, gráfico de lolipop, gráfico de mapa de calor, gráfico de densidad, gráfico de correlaciones, gráfico de árbol…

11.3.1 Gráficos de barras

11.3.1.1 Barras 1

ggplot(fonocortesia, aes(x=Cortes_Descortes)) + 
  geom_bar(stat="count")

11.3.1.2 Barras 2

fonocortesia%>% ggplot(aes(x=Cortes_Descortes, fill=Mediodeexpresion)) + 
  geom_bar(stat="count")

11.3.1.3 Barras 3

fonocortesia%>% ggplot(aes(x=Cortes_Descortes, fill=Tonema)) + scale_x_discrete(guide = guide_axis(n.dodge=3))+  geom_bar(stat="count") + facet_wrap(~Tonema)

11.3.1.4 Barras 4

fonocortesia%>% ggplot(aes(x=Cortes_Descortes, fill=Mediodeexpresion)) + 
  geom_bar(stat="count") + coord_flip()

11.3.1.5 Barras 5

data <- fonocortesia%>%group_by(Cortes_Descortes,Mediodeexpresion)%>%summarise(Total = sum(n())) %>%
  mutate(Percentage = Total / sum(Total) * 100)

ggplot(data, aes(x=Cortes_Descortes,y=Percentage, fill=Mediodeexpresion))+
  geom_bar(stat="identity") + geom_text(
    aes(label = paste(Total, "(", sprintf("%.1f%%", Percentage), ")", sep = "")),
    position = position_stack(vjust = 0.5), # Center text in the middle of each bar segment
    size = 2  # Adjust text size
  ) + coord_flip() 

ggplot(data%>%filter(Mediodeexpresion%in%c("Atenuación","Intensificación","desconocido")), aes(x=Cortes_Descortes,y=Percentage, fill=Mediodeexpresion))+
  geom_bar(stat="identity") + geom_text(
    aes(label = paste(Total, "(", sprintf("%.1f%%", Percentage), ")", sep = "")),
    position = position_stack(vjust = 0.5), # Center text in the middle of each bar segment
    size = 2  # Adjust text size
  ) + coord_flip() 

11.3.2 Diagramas de caja

ggplot(fonocortesia, aes(y=F0_Media,fill=Cortes_Descortes)) + 
  geom_boxplot()

11.3.3 Gráfico de correlaciones

library(corrplot)
datosnum <- fonocortesia%>%select_if(is.numeric)
correlaciones <- cor(datosnum,use = "complete.obs")
corrplot(correlaciones, method = "color",tl.col = "black",tl.cex = 0.7)

11.3.4 Gráficos de líneas

ggplot(fonocortesia%>%mutate(id=row_number()), aes(x=id,y=F0_Media,fill=Cortes_Descortes, color = Cortes_Descortes)) + geom_line() + geom_point()

11.3.5 Gráficos de dispersión

ggplot(fonocortesia%>%filter(between(Intensidad_Media,60,90), F0_Media<300), aes(x=F0_Media, y=Intensidad_Media))  +
  geom_point() + geom_smooth(method = "lm", se = FALSE, color = "blue")

11.3.6 Gráficos de burbujas

ggplot(fonocortesia, aes(x=Duracion, y=Intensidad_Media, size=F0_Media, fill = Cortes_Descortes, color=Cortes_Descortes)) + 
  geom_point()

11.3.7 Gráficos de áreas

ggplot(fonocortesia%>%mutate(id=row_number())%>%filter(Cortes_Descortes!="desconocido"), aes(x=id, y=F0_Media, fill=Cortes_Descortes)) + 
  geom_area() + facet_wrap(~Cortes_Descortes)

11.3.8 Gráficos de violín

El gráfico de violín es una combinación de un diagrama de caja y un gráfico de densidad. Muestra la distribución de los datos en función de una variable categórica.

ggplot(fonocortesia, aes(x=Cortes_Descortes, y=F0_Media, color=Cortes_Descortes, fill=Cortes_Descortes)) + 
  geom_violin() + coord_flip()

11.3.9 Gráficos de densidad

La densidad de un conjunto de datos es una estimación de la distribución de probabilidad subyacente de los datos. Los gráficos de densidad muestran la distribución de los datos en forma de una curva suave.

ggplot(fonocortesia, aes(x=F0_Media)) + 
  geom_density()

11.3.10 Gráficos de lolipop

lolipop <- fonocortesia%>%group_by(Cortes_Descortes)%>%summarise(f0_mean=mean(F0_Media,na.rm = T))

ggplot(lolipop, aes(x=Cortes_Descortes, y=f0_mean, fill = Cortes_Descortes, color =Cortes_Descortes)) +  # Mapear 'z' al tamaño
  geom_point(aes(size = f0_mean), alpha = 0.6) +  # Añadir puntos de dispersión con transparencia
 
  geom_segment(aes(x=Cortes_Descortes, xend=Cortes_Descortes, y=0, yend=f0_mean)) +coord_flip()

11.3.11 Gráficos de donut

data <- fonocortesia%>%group_by(Cortes_Descortes)%>%summarise(count=n())%>%na.omit()%>%rename(category=Cortes_Descortes, count=count)

data$fraction <- data$count / sum(data$count)

# Compute the cumulative percentages (top of each rectangle)
data$ymax <- cumsum(data$fraction)

# Compute the bottom of each rectangle
data$ymin <- c(0, head(data$ymax, n=-1))

# Compute label position
data$labelPosition <- (data$ymax + data$ymin) / 2

# Compute a good label
data$label <- paste0(data$category, "\n value: ", data$count)

# Make the plot
ggplot(data, aes(ymax=ymax, ymin=ymin, xmax=4, xmin=3, fill=category)) +
  geom_rect() +
  geom_label( x=3.5, aes(y=labelPosition, label=label), size=3) +
  scale_fill_brewer(palette=3) +
  coord_polar(theta="y") +
  xlim(c(2, 4)) +
  theme_void() +
  theme(legend.position = "none")

11.3.12 Gráficos de mapa de calor

library(gplots)
png(filename='heatmap.png', width=2400, height=1550, res=300)

# Ajustar márgenes
par(mar=c(5,4,4,2) + 0.1)

# Cargar datos y procesarlos
p <- fonocortesia %>%
  group_by(Cortes_Descortes) %>%
  summarise_all(mean, na.rm = TRUE) %>%
  column_to_rownames(var="Cortes_Descortes") %>%
  select_if(is.numeric) %>%
  select(F0_Media, Duracion, Intensidad_Media)

# Generar el heatmap
heatmap.2(as.matrix(p), na.rm = TRUE, scale="column", cexCol = 0.8, cexRow = 0.8)

# Cerrar el dispositivo gráfico
dev.off()

11.3.13 Nube de palabras

library(ggwordcloud)

df_words <- fonocortesia %>%select(Cortes_Descortes,Elemento_Analizado)%>%
  mutate(word = str_split(Elemento_Analizado, " "),cortesia=Cortes_Descortes) %>%  # Dividir el texto en palabras
  unnest(word) %>%  group_by(cortesia,word) %>%  summarise(frecuencia = n())%>%filter(frecuencia>2) 


ggplot(df_words%>%filter(!word%in%c("A:","B:","C:","L:","M:","(...)")), aes(label = word, size = frecuencia,color=cortesia)) +
  geom_text_wordcloud(area_corr = TRUE) +
  scale_size_area(max_size = 20) +
  theme_minimal()

12 Ejercicios

  1. Importa los datos del archivo idiolectal.xlsx y explora su estructura.

  2. Haz dos dataframes según la variable genre. Cada uno de ellos debe contener los datos solo de un género.

  3. Crea un dataframe llamado “piquito_relocado” y ubica la variable tonemes delante de genre

  4. Visualiza en un gráfico de líneas en el dataframe “idiolectal” la evolución de los tonemas solo en el archivo 5pangelreal.

  5. Crea un dataframe llamado “piquito_filtrado” en el que filtre todos los datos que no sean NA en la variable tonemeMAS.

  6. Crea un diagrama de caja de la variable dur en el dataframe “idiolectal”. ¿Sabrías crearlos por hablante en un mismo gráfico? Hay varias maneras de hacerlo.

  7. ¿Cuántos tonemas hay en el dataframe “idiolectal”? Visualízalo en una tabla y en un gráfico de barras usando la base de datos “piquito_filtrado”

  8. Correlaciona en el dataframe “idiolectal” las variables numéricas de este estudio.

  9. Haz una tabla de frecuencias de cada hablante en el dataframe “idiolectal” y saca la media de tonemeMAS, de dur y de body

  10. Visualiza la información anterior en un mapa de calor.