# Alejandra Ciria
# Clase: Aprendizaje, Motivación y Cognición I
# Ciencias Cognitivas y del Comportamiento 
# Facultad de Psicología, UNAM
# Set working directory: Session - Set working directory - Choose directory
# En esta clase veremos en R

# Medidas de tendencia central, medidas de dispersión
# Estadistica descriptiva: 
# Su propósito es describir o caracterizar los datos

# Para eso usaremos los siguientes datos de los alumnos de la clase:
# Edad (primero mujeres, luego hombres)
# Género 
# Edad y género de los participantes, se asigna a la variable edad y a género
# Se crean las dos variables con sus vectores datos
# Para asignarle vectores a una variable se concatenan mediante: <- c() 
edad <- c(20,20,22,19,20,21,22,22,27,21,21,20,24,23,20,20,25,22,20,21,23,22,20,20,20,24,22,27)
genero_num <- c(2,1,1,2,1,1,1,1,1,2,2,1,2,1,1,1,1,1,1,2,1,2,1,1,1,1,1,1)

# Imrpimir en consola los datos asignados a edad
print(edad)
##  [1] 20 20 22 19 20 21 22 22 27 21 21 20 24 23 20 20 25 22 20 21 23 22 20 20 20
## [26] 24 22 27
edad
##  [1] 20 20 22 19 20 21 22 22 27 21 21 20 24 23 20 20 25 22 20 21 23 22 20 20 20
## [26] 24 22 27
# Género es un factor con dos niveles
genero <- as.factor(genero_num)
levels(genero) <- c("mujer", "hombre")
# Imrpimir en consola los datos asignados a genero
print(genero)
##  [1] hombre mujer  mujer  hombre mujer  mujer  mujer  mujer  mujer  hombre
## [11] hombre mujer  hombre mujer  mujer  mujer  mujer  mujer  mujer  hombre
## [21] mujer  hombre mujer  mujer  mujer  mujer  mujer  mujer 
## Levels: mujer hombre
#Ver resumen de datos 
str(edad)
##  num [1:28] 20 20 22 19 20 21 22 22 27 21 ...
str(genero)
##  Factor w/ 2 levels "mujer","hombre": 2 1 1 2 1 1 1 1 1 2 ...
# Agregar los datos a un data.frame
df <- data.frame(edad, genero)
df
##    edad genero
## 1    20 hombre
## 2    20  mujer
## 3    22  mujer
## 4    19 hombre
## 5    20  mujer
## 6    21  mujer
## 7    22  mujer
## 8    22  mujer
## 9    27  mujer
## 10   21 hombre
## 11   21 hombre
## 12   20  mujer
## 13   24 hombre
## 14   23  mujer
## 15   20  mujer
## 16   20  mujer
## 17   25  mujer
## 18   22  mujer
## 19   20  mujer
## 20   21 hombre
## 21   23  mujer
## 22   22 hombre
## 23   20  mujer
## 24   20  mujer
## 25   20  mujer
## 26   24  mujer
## 27   22  mujer
## 28   27  mujer
# Resumen estadísticos descriptivos del data.frame
summary(df)
##       edad          genero  
##  Min.   :19.00   mujer :21  
##  1st Qu.:20.00   hombre: 7  
##  Median :21.00              
##  Mean   :21.71              
##  3rd Qu.:22.25              
##  Max.   :27.00
# Tip: para ver la estadística descritiva por grupo
# utiliza la función: by() 

by(df, df$genero, summary)
## df$genero: mujer
##       edad         genero  
##  Min.   :20.0   mujer :21  
##  1st Qu.:20.0   hombre: 0  
##  Median :22.0              
##  Mean   :21.9              
##  3rd Qu.:23.0              
##  Max.   :27.0              
## ------------------------------------------------------------ 
## df$genero: hombre
##       edad          genero 
##  Min.   :19.00   mujer :0  
##  1st Qu.:20.50   hombre:7  
##  Median :21.00             
##  Mean   :21.14             
##  3rd Qu.:21.50             
##  Max.   :24.00
# Media
# Es el promedio de los datos
# La suma de todos los datos divididos por el número de datos

sum(edad)/length(edad)
## [1] 21.71429
# En R, la función para calcular la media es: mean()
media_edad <- mean(edad)
media_edad
## [1] 21.71429
# ¿Cómo podemos calcular la media por grupo?

#install.packages("doBy")
library(doBy)

# Una manera de hacerlo es mediante la función de summaryBy de la librería doBy
# Función para calcular estadísticas resumidas por grupos
medias <- summaryBy(edad~genero, data= df, FUN=c(mean))
medias
##   genero edad.mean
## 1  mujer  21.90476
## 2 hombre  21.14286
# ¿Qué hicimos con esta función?
# Calculamos la media para cada nivel del factor 
# Primero le decimos cuál es nuestra VD y VI, los datos y las funciones que queremos usar

# El operador tilde ~ se usa para definir la relación entre
# la variable dependiente y la independiente en un modelo estadístico
# La variable en el lado izquierdo del operador es la dependiente
# la variable del lado derecho es la independiente
# FUN contiene la lista de funciones que se van a aplicar, en este caso mean

# Graficar la media por grupo
plot(medias)

# Usando ggplot para graficar las medias
# Una forma es usando la función stat_summary del paquete Hmisc
# install.packages("Hmisc")

# Definimos la estética
library(ggplot2)

pl <- ggplot(df, aes(x = genero, y = edad)) 
# Gráfica de barras
pl + stat_summary(fun = "mean", geom = "bar") + ylim(0, 30)

# Gráfica de puntos
pl + stat_summary(fun = "mean", colour = "red", size = 3, geom = "point") + ylim(0, 30)

# Varianza
# La varianza toma en cuenta la diferencia entre el valor
# de cada dato y la media, esto es cuánto se desvía cada valor de la media

# Primero, entendamos una propiedad de la media
# La suma de las desviaciones alrededor de la media es igual a cero
suma_des <- c((media_edad-edad[1])+(media_edad-edad[2])+(media_edad-edad[3])+(media_edad-edad[4])
              +(media_edad-edad[5])+(media_edad-edad[6])+(media_edad-edad[7])+(media_edad-edad[8])
              +(media_edad-edad[9])+(media_edad-edad[10])+(media_edad-edad[11])+(media_edad-edad[12])
              +(media_edad-edad[13])+(media_edad-edad[14])+(media_edad-edad[15])+(media_edad-edad[16])
              +(media_edad-edad[17])+(media_edad-edad[18])+(media_edad-edad[19])+(media_edad-edad[20])
              +(media_edad-edad[21])+(media_edad-edad[22])+(media_edad-edad[23])+(media_edad-edad[24])
              +(media_edad-edad[25])+(media_edad-edad[26])+(media_edad-edad[27])+(media_edad-edad[28]))

# Para cambiar notación científica a decimales
options(scipen=999)
suma_des
## [1] 0.00000000000002842171
round(suma_des)
## [1] 0
# Por lo tanto, tenemos que elevar las desviaciones de la media al cuadrado

# Esto es lo que se conoce como varianza
suma_des_cuadrado <- c((media_edad-edad[1])^2+(media_edad-edad[2])^2+(media_edad-edad[3])^2+(media_edad-edad[4])^2
                       +(media_edad-edad[5])^2+(media_edad-edad[6])^2+(media_edad-edad[7])^2+(media_edad-edad[8])^2
                       +(media_edad-edad[9])^2+(media_edad-edad[10])^2+(media_edad-edad[11])^2+(media_edad-edad[12])^2
                       +(media_edad-edad[13])^2+(media_edad-edad[14])^2+(media_edad-edad[15])^2+(media_edad-edad[16])^2
                       +(media_edad-edad[17])^2+(media_edad-edad[18])^2+(media_edad-edad[19])^2+(media_edad-edad[20])^2
                       +(media_edad-edad[21])^2+(media_edad-edad[22])^2+(media_edad-edad[23])^2+(media_edad-edad[24])^2
                       +(media_edad-edad[25])^2+(media_edad-edad[26])^2+(media_edad-edad[27])^2+(media_edad-edad[28])^2)

suma_des_cuadrado
## [1] 119.7143
# Después se necesita dividir ese valor entre el tamaño de la muestra menos uno (n-1)
# La división entre n - 1 provoca que la varianza muestral iguale el valor de 
# la varianza poblacional 
varianza <- suma_des_cuadrado/27
varianza
## [1] 4.433862
# La función en R para la varianza es: var
var(edad)
## [1] 4.433862
# Desviación estándar
# Conocida también como desviación típica es una medida del grado de 
# dispersión de los datos con respecto al valor promedio (media)
# Dicho de otra manera, la desviación estándar es simplemente el "promedio" 
# o variación esperada con respecto a la media aritmética

#La varianza es la raíz cuadrada de la desviación estándar

# La desviación estándar (DE) en inglés (SD) se vincula con la varianza
# Porque es la raíz cuadrada de ésta
# Función de R para sacar raíz cuadrada es sqrt
ds <- sqrt(varianza) 
ds
## [1] 2.105674
# La función en R para la desviación estádar es: sd
sd(edad)
## [1] 2.105674
# Veamos la media más ds y menos la ds
media_edad-ds
## [1] 19.60861
media_edad+ds
## [1] 23.81996
# ¿Cómo podemos calcular la media, la varianza, y la desviación estándar por grupo?

#library(doBy)
# De nuevo, samos la función de summaryBy de la librería doBy
# Primero le decimos cuál es nuestra VD y VI
# FUN contiene la lista de funciones que se van a aplicar
# Podemos ver que ahora le pedimos que realice las funciones mean, var, sd
summaryBy(edad~genero, data= df, FUN=c(mean, var, sd))
##   genero edad.mean edad.var  edad.sd
## 1  mujer  21.90476 5.090476 2.256208
## 2 hombre  21.14286 2.476190 1.573592
#?summaryBy

#Graficar media y desviación estándar por grupo
# Se necesita paquete Hmisc para usar la función stat_summary

# Gráfica de barras
# Definimos la estética del gráfico, graficamos la media y definimos los límites del eje y
pl <- ggplot(df, aes(x = genero, y = edad)) + stat_summary(fun = "mean", geom = "bar") + ylim(0,30)
pl

# Le agregamos la desviación estándar
pl + stat_summary(fun.data = "mean_sdl", geom = "errorbar", width = 0.4)

# Podemos usar una gráfica de puntos
pl <- ggplot(df, aes(x = genero, y = edad)) + stat_summary(fun = "mean", geom = "point") + ylim(0,30)
pl

pl + stat_summary(fun.data = "mean_sdl", geom = "errorbar", width = 0.4)

# Datos nominales
# Variables con niveles en una escala categórica
# Por ejemplo: ver el número de personas en cada categoría

# Fracciones y proporciones
# N = el número total de individuos en la muestra
# x = el número de personas en la categoría
# La fracción de ese: x/N 

# Veamos el dataframe
df
##    edad genero
## 1    20 hombre
## 2    20  mujer
## 3    22  mujer
## 4    19 hombre
## 5    20  mujer
## 6    21  mujer
## 7    22  mujer
## 8    22  mujer
## 9    27  mujer
## 10   21 hombre
## 11   21 hombre
## 12   20  mujer
## 13   24 hombre
## 14   23  mujer
## 15   20  mujer
## 16   20  mujer
## 17   25  mujer
## 18   22  mujer
## 19   20  mujer
## 20   21 hombre
## 21   23  mujer
## 22   22 hombre
## 23   20  mujer
## 24   20  mujer
## 25   20  mujer
## 26   24  mujer
## 27   22  mujer
## 28   27  mujer
# N = 28
summary(df)
##       edad          genero  
##  Min.   :19.00   mujer :21  
##  1st Qu.:20.00   hombre: 7  
##  Median :21.00              
##  Mean   :21.71              
##  3rd Qu.:22.25              
##  Max.   :27.00
# mujeres = 21
# hombres = 7 
# ¿Cuál es la proporción de hombres y mujeres?
prop_total_mujeres <- 21/28 *100
prop_total_mujeres
## [1] 75
prop_total_hombres <- 7/28 *100
prop_total_hombres
## [1] 25
# El 75% son mujeres y el 25% son hombres
# El total de las proporciones siempre debe ser 100
prop_total_genero <- c(prop_total_mujeres, prop_total_hombres)
prop_total_genero
## [1] 75 25
# Hacemos una gráfica de pastel
pie(prop_total_genero)

# Como no es informativa podemos cambiarla según lo que busquemos
pie(prop_total_genero,labels= df$genero, col = c("purple", "cyan"), main = "Total edad")

pie(prop_total_genero,labels= prop_total_genero, col = c("purple", "cyan"), main = "Total edad")

# Le agregamos una leyenda a la gráfica de pastel
legend("topright", c("Mujer","Hombre"), cex=0.8, fill= c("purple", "cyan"))

# Si preferimos usar el factor para determinar el color según los niveles
pie(prop_total_genero,labels= prop_total_genero, col = df$genero, main = "Total edad")
legend("topright", c("Mujer","Hombre"), cex=0.8, fill= df$genero)

# Proporciones por variable y nivel: edad y género
# Primero es necesario poner los datos del data frame en una tabla

# La función table en R:
# Usa los factores para crear una tabla de contingencia
# Cuenta los datos en cada combinación de los niveles del factor 
# Con el operador signo de dólar $ podemos extraer subconjuntos usando nombres
# En otras palabras, permite extraer los elementos de una lista basado en sus nombres

# Primero veamos la distribución de frecuencia de edades en una tabla
tabla_edad <- table(df$edad)
tabla_edad
## 
## 19 20 21 22 23 24 25 27 
##  1 10  4  6  2  2  1  2
# Ahora, veamos proporciones por edad y género

# Hacemos una tabla
# Primero, toma el factor género para establecer las líneas de la tabla
# Y toma el factor edad para establecer las columnas de la tabla
tabla <- table(df$genero, df$edad)
tabla
##         
##          19 20 21 22 23 24 25 27
##   mujer   0  9  1  5  2  1  1  2
##   hombre  1  1  3  1  0  1  0  0
# Si queremos cambiar el orden de las líneas y las columnas de la tabla de contingencia
# Entonces: 
tabla <- table(df$edad, df$genero)
tabla
##     
##      mujer hombre
##   19     0      1
##   20     9      1
##   21     1      3
##   22     5      1
##   23     2      0
##   24     1      1
##   25     1      0
##   27     2      0
# Proporciones en la tabla

# La función prop.table nos da las proporciones de los datos asignados a tabla
# margin = 1, calcula la proporción de cada línea de la tabla
# margin = 2, calcula las proporciones por columna
proptabla <- prop.table(tabla, margin = 2) 
proptabla
##     
##           mujer     hombre
##   19 0.00000000 0.14285714
##   20 0.42857143 0.14285714
##   21 0.04761905 0.42857143
##   22 0.23809524 0.14285714
##   23 0.09523810 0.00000000
##   24 0.04761905 0.14285714
##   25 0.04761905 0.00000000
##   27 0.09523810 0.00000000
# Porcentaje de edad por grupo

# Mujeres: en nuestra tabla, están en la primera columna [línea, columna]
prop_mujeres <- proptabla[ , 1] * 100
prop_mujeres
##        19        20        21        22        23        24        25        27 
##  0.000000 42.857143  4.761905 23.809524  9.523810  4.761905  4.761905  9.523810
# El total debe sumar 100
sum(prop_mujeres)
## [1] 100
# Hacer una gráfica de pastel
pie(prop_mujeres, col = prop_mujeres)

# Hombres: están en la segunda columna
prop_hombres <- proptabla[ ,2] * 100
prop_hombres
##       19       20       21       22       23       24       25       27 
## 14.28571 14.28571 42.85714 14.28571  0.00000 14.28571  0.00000  0.00000
sum(prop_hombres)
## [1] 100
# Hacer una gráfica de pastel
pie(prop_hombres, col = prop_hombres)

# Didstribuciones de frecuencia
# Distribución de frecuencia de edades de toda la muestra
# Nos permite conocer el múmero de personas que dentro de un rango de edad

# Primero necesitamos conocer el valor mínimo y máximo
range(edad)
## [1] 19 27
# Dividir el rango en sub-intervalos con la función seq
# Primero le decimos el rango (from, to) y el número de incrementos (by)
intervalos <- seq(from= 19,to = 27, by= 2)
intervalos
## [1] 19 21 23 25 27
# Clasificamos las edades según los intervalos con la función cut
# Cut divide la variable edad según los intervalos en los que caen
# Los intervalos van a estar cerrados a la izquierda y abiertos a la derecha (right= FLASE)
edad.intervalos <- cut(edad, intervalos, right= FALSE)
edad.intervalos
##  [1] [19,21) [19,21) [21,23) [19,21) [19,21) [21,23) [21,23) [21,23) <NA>   
## [10] [21,23) [21,23) [19,21) [23,25) [23,25) [19,21) [19,21) [25,27) [21,23)
## [19] [19,21) [21,23) [23,25) [21,23) [19,21) [19,21) [19,21) [23,25) [21,23)
## [28] <NA>   
## Levels: [19,21) [21,23) [23,25) [25,27)
# Para ver la frecuencia de cada intervalo lo ponemos en una tabla
edad.frec <- table(edad.intervalos)
edad.frec
## edad.intervalos
## [19,21) [21,23) [23,25) [25,27) 
##      11      10       4       1
# Revisemos las frecuencias por intervalo en la variable edad
sort(edad)
##  [1] 19 20 20 20 20 20 20 20 20 20 20 21 21 21 21 22 22 22 22 22 22 23 23 24 24
## [26] 25 27 27
# ¿Porqué no está incluyendo al 27? Necesitamos incluir el valor mayor
# include.lowest -logical, indicating if an ‘x[i]’ equal to the lowest 
# (or highest, for right = FALSE) 
edad.intervalos <- cut(edad, intervalos, right= FALSE, include.lowest = TRUE)
edad.intervalos
##  [1] [19,21) [19,21) [21,23) [19,21) [19,21) [21,23) [21,23) [21,23) [25,27]
## [10] [21,23) [21,23) [19,21) [23,25) [23,25) [19,21) [19,21) [25,27] [21,23)
## [19] [19,21) [21,23) [23,25) [21,23) [19,21) [19,21) [19,21) [23,25) [21,23)
## [28] [25,27]
## Levels: [19,21) [21,23) [23,25) [25,27]
edad.frec <- table(edad.intervalos)
edad.frec
## edad.intervalos
## [19,21) [21,23) [23,25) [25,27] 
##      11      10       4       3
# La función cbind combina las datos por columna y línea, respectivamente
cbind(edad.frec)
##         edad.frec
## [19,21)        11
## [21,23)        10
## [23,25)         4
## [25,27]         3
# Graficar la frecuencia de distribución de edad en una gráfica de pastel (o de sectores)
pie(edad.frec)

pie(edad.frec,labels= edad.frec, col = c("purple", "cyan", "red", "yellow"), main = "Frecuencias edad")
legend("topright", c("[19,21)", "[21,23)", "[23,25)", "[25,27]"), cex=0.8, fill= c("purple", "cyan", "red", "yellow"))