# 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
# Clase 1 en R


# Estadistica descriptiva: 
# Su propósito es describir o caracterizar los datos

# Medidas de tendencia central, medidas de dispersión

# 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
# Cuando se imprime un arreglo en la consola el valor que aparece 
# entre corchetes es la posición del pirmer elemento que se imprime en ese renglón
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
# También lo puedes imprimir sólo escribiendo el nombre de la variable
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
# Distribuciones de frecuencia
#Explorar los datos mediante un histograma
# El histograma se utiliza para representar distribuciones de frecuencia 
# Los intervalos de clase se dibujan en el eje x de modo que 
# cada clase comience y termine en el límite real del intervalo. 
# La altura de la barra corresponde a la frecuencia del intervalo de clase. 

hist(edad)

# Decidir los intervalos de tres en tres
hist(edad, breaks = 3, main = "Histograma de edades",
     xlab = "Edades", ylab = "Frecuencia", col = "purple")

# Chismear la función hist
# ?hist
# Gráfica de tallo y hoja
# Es una variante del histograma
# Se presentan los valores de la variable (el tallo) eje vertical
# Las frecuencias son las hojas, eje horizontal

stem(edad, scale= 0.3)
## 
##   The decimal point is 1 digit(s) to the right of the |
## 
##   1 | 9
##   2 | 000000000011112222223344
##   2 | 577
stem(edad, scale= 1)
## 
##   The decimal point is at the |
## 
##   19 | 0
##   20 | 0000000000
##   21 | 0000
##   22 | 000000
##   23 | 00
##   24 | 00
##   25 | 0
##   26 | 
##   27 | 00
# Diagrama de dispersión
# Instalar paquete ggplot2
# install.packages("ggplot2")

# Usar librería
library(ggplot2)

# El comando aes(), que se refiere a la “estética” del gráfico, 
# se especifica del conjunto de datos que se va a representar


ggplot(df, aes(x = edad, fill = genero)) + geom_histogram() 
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

# Se usa la librería ggplot2 (Basic scatter plot) con geom_point
ggplot(df, aes(x=genero, y=edad)) + geom_point()

# Si se quiere cambiar el tamaño de los puntos y la forma
ggplot(df, aes(x=genero, y=edad)) +
  geom_point(size=2, shape=23)

# Cambiar la forma de los puntos según los niveles 
ggplot(df, aes(x=edad, y=edad, shape=genero)) +
  geom_point()

# Cambiar la forma de los puntos y los colores según los niveles
ggplot(df, aes(x=edad, y=edad, shape=genero, color=genero)) +
  geom_point()

# Usar geom_jitter es útil cuando tienes valores discretos y pocos datos
# Le añade un poco de ruido aleatorio a los datos para que no se encimen
# Ver la dispersión de la edad en ambos ejes y la variable genero por color y forma
ggplot(df, aes(x=edad, y=edad, shape=genero, color=genero)) +
  geom_jitter()

# Ver la disperisón por edad pero en el eje x ponemos la variable género
# Para ver los cada uno de los puntos de los datos, Jittering, geom_jitter()
ggplot(df, aes(x=genero, y=edad, colour= genero)) + 
  geom_jitter(shape=16, position=position_jitter(0.2))

# Medidas de tendencia central
# 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()
mean(edad)
## [1] 21.71429
# Mediana: es el puntaje central si la cantidad de puntajes es impar
# Si la cantidad es par, la mediana se toma como el promedio de los 
# dos puntajes centrales

# Primero los organizamos del menor al mayor
# La función para ordenar es: sort()
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
(21 + 21) / 2
## [1] 21
# En R, la función para calcular la mediana es: median()
median(edad)
## [1] 21
# Si queremos, podemos guardar el resultado en una variable
mediana_edad <- median(edad)
media_edad <- mean(edad)

media_edad
## [1] 21.71429
mediana_edad
## [1] 21
# Moda 
# El dato que se repite con mayor frecuencia
# R no tiene una función específica para calcular la moda

# Es necesario crear una función para la moda de EDAD
obtener_moda_e <- function(edad) {
  unicos <- unique(edad)
  unicos[which.max(tabulate(match(edad, unicos)))]
}


# Calcular la moda usando la función llamada: obtener_moda_e
resultado <- obtener_moda_e(edad)
print(resultado)
## [1] 20
# ¿Pero qué está haciendo esa función?

# Datos sin repetirse
unicos <- unique(edad)
print(unicos)
## [1] 20 22 19 21 27 24 23 25
# De todos los datos "edad" cuáles se repiten considerando la posición en el vector de "unicos"
prueba <- match(edad,unicos)
print(prueba)
##  [1] 1 1 2 3 1 4 2 2 5 4 4 1 6 7 1 1 8 2 1 4 7 2 1 1 1 6 2 5
# Para cada dato en su respectiva posición en "unicos" cuenta cuantas veces se repiten en "edad"
prueba <- tabulate(match(edad,unicos))
print(prueba)
## [1] 10  6  1  4  2  2  2  1
# Nos permite ver cuál es el dato que más se repite de "edad" considerando su posición en "unicos"
prueba <- which.max(tabulate(match(edad,unicos)))
print(prueba)
## [1] 1
# Nos da el dato que más se repite, el dato que se encuentra en la posición de "unicos"
prueba <- unicos[which.max(tabulate(match(edad,unicos)))]
print(prueba)
## [1] 20
#¿Se puede calcular la moda de la variable género?
# Sí 
# Ahora vamos a crear una función para la moda de la variable "genero"

obtener_moda_g <- function(genero) {
  unicos_g <- unique(genero)
  unicos_g[which.max(tabulate(match(genero, unicos_g)))]
}

# Calcular la moda usando la función llamada: obtener_moda_g
resultado_g <- obtener_moda_g(genero)
print(resultado_g)
## [1] mujer
## Levels: mujer hombre
# Medidas de dispersión
# Mínimos, máximos y rango
min(edad)
## [1] 19
max(edad)
## [1] 27
# En R se puede obtener con la funcion: range
min_max <- range(edad)
min_max
## [1] 19 27
# La variable min_max contiene el mínimo y el máximo, es un vector con 2 elementos
# Si queremos llamar al primer elemento, el mínimo
min_max[1]
## [1] 19
# Si queremos al segundo elemento, el máximo
min_max[2]
## [1] 27
# El rango: se usa para tener una rápida idea del grado 
# de dispersión o separación de un conjunto de datos

rango <- min_max[2] - min_max[1]
rango
## [1] 8
# Cuartiles y Rango intercuartílico
# Entre el Q1 y el Q3 se encuentran la mitad de las observaciones
# 50% de los datos ocurren ahí
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
#Primer cuartil Q1: el valor de puntuación más alto del 25% inferior
q_25 <- quantile(edad, 0.25)
q_25
## 25% 
##  20
#Tercer cuartil Q3: el valor de puntuación más alto del 75% inferior
q_75 <- quantile(edad,0.75)
q_75
##   75% 
## 22.25
# Rango intercuartílico
# El rango intercuartílico es una medida de variabilidad adecuada cuando la medida 
# de posición central empleada ha sido la mediana. Se define como la diferencia entre 
# el tercer cuartil (Q3) y el primer cuartil (Q1), es decir: RQ = Q3 - Q1. 
# A la mitad del rango intercuartil se le conoce como desviación cuartil (DQ)
rango_inter <- q_75 - q_25
rango_inter
##  75% 
## 2.25
# R tiene una función directa para calcular el rango intercuartilílico

IQR(edad)
## [1] 2.25
# Gráfica de caja y bigotes
# min, Q1, mediana (Q2), Q3, max
# Mediana: está representada con la raya obscura dentro de la caja
# Si está el centro del rectángulo, la distribución es simétrica
# Rango intercuartílico (Q3– Q1)=  23.75 - 22 = 1.75
# Los bigotes, se extienden hasta los valores máximo y mínimo de la serie
# O hasta 1.5 veces el rango intercuartílico (sirve para ver valores atípicos)

boxplot(edad)

# Agregarle nombres a los ejes y establecer los límites del eje y
boxplot(edad, xlab= "grupos", ylab= "edad", ylim = c(15,30))

# Cuando los datos incluye una variable categórica y una o más variables discretas o continuas 
# te puede interesar saber cómo los valores varían según la variable categórica 


#Boxplot- hacer una grafica de caja y bigotes por grupo y color
# Asignando los datos del ggplot sobre la estética a una variable

pl <- ggplot(df, aes(x=genero, y=edad, colour= genero))
pl + geom_boxplot()