#install.packages("fdth")
library(fdth)
##
## Attaching package: 'fdth'
## The following objects are masked from 'package:stats':
##
## sd, var
library(ggplot2)
library(psych)
##
## Attaching package: 'psych'
## The following objects are masked from 'package:ggplot2':
##
## %+%, alpha
library(moments)
library(plotly)
Las medidas de tendencia central son valores estadísticos que resumen un conjunto de datos mediante la identificación de un valor central o representativo. Estas medidas describen el punto alrededor del cual se distribuyen los datos, proporcionando una idea de su centro o tendencia típica.
Las tres medidas principales de tendencia central son:
Media (o promedio): Es la suma de todos los valores de un conjunto de datos dividida por el número total de valores. Se utiliza principalmente cuando los datos son numéricos y no presentan valores extremos que puedan distorsionar el promedio.
Para la explicación del tema tomemos los precios de 9 casas en millones de pesos
# Precio de 9 casas en millones de pesos
precio<-c(74, 82, 107, 92, 125, 130, 118, 140, 153)
Para la exploración de datos, para obtener un resumen del vector “precio” usaremos summary , y ejecutamos str para saber de que tipo es el vector, y con head para ver el contenido del vector.
summary(precio)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 74.0 92.0 118.0 113.4 130.0 153.0
str(precio)
## num [1:9] 74 82 107 92 125 130 118 140 153
head(precio)
## [1] 74 82 107 92 125 130
tail(precio)
## [1] 92 125 130 118 140 153
De los resultados mostrados con summary observamos que el precio mínimo es 74 millones y el máximo es 153 millones. El promedio “Mean” es 113.4 millones y el valor de la mediana “Median” es 118.
str nos indica que los datos contenidos en la lista son num, es decir del tipo numericos y que el vector contiene 9 elemento [1:9].
head muestra los primeros 5 valores del vector por default
La funcion mean permite calcular la media de un vector de datos
mean(precio)
## [1] 113.4444
# Precio1 introduciendo el valor de 500
precio1<-c(74, 82, 107, 92, 125, 130, 118, 140,500)
mean(precio1)
## [1] 152
El valor de la media debe estar entre el valor menor y mayor dato
Si a cada dato de la muestra se les suma( o resta) una constante entonces la media queda sumada ( o restada) por dicha constante.
mean(precio)
## [1] 113.4444
precio+6 # Se le adiciona 6 a cada valor del vector
## [1] 80 88 113 98 131 136 124 146 159
mean(precio+6)
## [1] 119.4444
mean(precio)
## [1] 113.4444
precio*6 # Se le multiplica 6 a cada valor del vector
## [1] 444 492 642 552 750 780 708 840 918
mean(precio*6)
## [1] 680.6667
Es el valor central de un conjunto de datos ordenado. Si el número de datos es impar, la mediana es el valor que está en el medio; si es par, es el promedio de los dos valores centrales. La mediana es útil cuando hay valores extremos o datos atípicos, ya que no se ve afectada por ellos.
*Para un número par de datos: La mediana es el promedio de los dos valores centrales.
median(precio)
## [1] 118
La mediana es mas fuerte a valores atípicos. Esto es a diferencia de la media, la mediana no es afectada por la presencia de valores anormales
Es el valor o los valores que más se repiten en un conjunto de datos. Puede haber una moda (unimodal), más de una moda (bimodal o multimodal), o no haber ninguna si todos los valores son diferentes. La moda se usa principalmente para datos categóricos o cuando se busca identificar los valores más comunes.
Supongamos 10 calificaciones
# 10 calificaciones con valores enteros
calificaciones = c(5, 7, 8, 8, 10, 9, 7, 6, 8, 9)
mfv(calificaciones)
## [1] 8
Otra manera de observar la moda es mediante la funcion table()
table(calificaciones)
## calificaciones
## 5 6 7 8 9 10
## 1 1 2 3 2 1
#rm(list = ls())
notas <- read_delim("notas.csv", delim = ";",show_col_types = F)
str(notas)
## spc_tbl_ [5,535 × 6] (S3: spec_tbl_df/tbl_df/tbl/data.frame)
## $ Alumno : num [1:5535] 1 2 3 4 5 6 7 8 9 10 ...
## $ Semestre : num [1:5535] 12 13 10 13 10 10 13 11 11 10 ...
## $ Cr.Aprobados: num [1:5535] 207 226 235 231 235 235 231 197 235 231 ...
## $ Cr.Cursando : num [1:5535] 19 9 10 14 10 10 4 23 10 4 ...
## $ Promedio : num [1:5535] 79.8 82.5 95.2 79.3 92.7 ...
## $ Carrera : chr [1:5535] "SISTEMAS" "SISTEMAS" "SISTEMAS" "SISTEMAS" ...
## - attr(*, "spec")=
## .. cols(
## .. Alumno = col_double(),
## .. Semestre = col_double(),
## .. Cr.Aprobados = col_double(),
## .. Cr.Cursando = col_double(),
## .. Promedio = col_double(),
## .. Carrera = col_character()
## .. )
## - attr(*, "problems")=<externalptr>
summary(notas)
## Alumno Semestre Cr.Aprobados Cr.Cursando Promedio
## Min. : 1.0 Min. : 2.000 Min. : 4 Min. : 3.0 Min. : 70.00
## 1st Qu.:106.0 1st Qu.: 3.000 1st Qu.: 53 1st Qu.:23.0 1st Qu.: 83.25
## Median :239.0 Median : 6.000 Median :109 Median :28.0 Median : 86.36
## Mean :262.2 Mean : 5.826 Mean :115 Mean :26.1 Mean : 86.60
## 3rd Qu.:388.0 3rd Qu.: 8.000 3rd Qu.:172 3rd Qu.:30.0 3rd Qu.: 89.83
## Max. :755.0 Max. :17.000 Max. :264 Max. :42.0 Max. :100.00
## Carrera
## Length:5535
## Class :character
## Mode :character
##
##
##
notas<-na.omit(notas)
Para seleccionar una variable especifica de la base de datos, escribimos en nombre de la base de datos seguido del signo $ y se listaran todas las variables de la base de datos.
# media de la variable numero de semestre
mean(notas$Semestre)
## [1] 5.825836
# media de la variable creditos aprobados
mean(notas$Cr.Aprobados)
## [1] 114.9991
# mediana para la variable promedio
median(notas$Promedio)
## [1] 86.36
# moda para la variable carrera
mfv(notas$Carrera)
## [1] "INDUSTRIAL"
La función sapply() en R es una de las funciones que se utiliza para aplicar una función a cada elemento de una lista, vector o marco de datos, y devuelve el resultado de manera simplificada, en la forma más compacta posible (por ejemplo, un vector o matriz).
X: El objeto al que se le aplica la función (generalmente una lista, vector o dataframe).
FUN: La función que se desea aplicar(mean,median,mfv,sd).
simplify: Si es TRUE, intenta simplificar el resultado a un vector, matriz o lista. Si es FALSE, el resultado será una lista (similar a lapply()).
USE.NAMES: Si es TRUE y X tiene nombres, los preservará en el resultado.
sapply(notas[, sapply(notas, is.numeric)], mean, simplify = T, USE.NAMES = F)
## Alumno Semestre Cr.Aprobados Cr.Cursando Promedio
## 262.233966 5.825836 114.999097 26.104246 86.595225
medias_numericas<-sapply(notas[, sapply(notas, is.numeric)], mean, simplify = F, USE.NAMES = F)
# Si deseo la salida como un data.frame
medias_df <- as.data.frame(t(medias_numericas))
medias_df
## Alumno Semestre Cr.Aprobados Cr.Cursando Promedio
## 1 262.234 5.825836 114.9991 26.10425 86.59522
# suppressWarnings() evita mostrar los mensajes de advertencia
suppressWarnings(summarise_each(notas, funs(mean)))# Media para todas las variables
## # A tibble: 1 × 6
## Alumno Semestre Cr.Aprobados Cr.Cursando Promedio Carrera
## <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 262. 5.83 115. 26.1 86.6 NA
suppressWarnings(summarise_each(notas[,c(3,4,5,6)], funs(mean)))# Media para las variables elegidas
## # A tibble: 1 × 4
## Cr.Aprobados Cr.Cursando Promedio Carrera
## <dbl> <dbl> <dbl> <dbl>
## 1 115. 26.1 86.6 NA
suppressWarnings(summarise(notas, avg = mean(notas$Promedio)))# Calcula el promedio para una sola variable
## # A tibble: 1 × 1
## avg
## <dbl>
## 1 86.6
notas %>%
group_by(Carrera) %>%
summarize(promedio = mean(Promedio))
## # A tibble: 14 × 2
## Carrera promedio
## <chr> <dbl>
## 1 ADMINISTRACION 90.2
## 2 ARQUITECTURA 87.0
## 3 BIOQUIMICA 86.4
## 4 CIVIL 84.5
## 5 ELECTRICA 85.8
## 6 ELECTRONICA 87.0
## 7 GESTION 88.3
## 8 INDUSTRIAL 85.9
## 9 INFORMATICA 87.4
## 10 MECANICA 83.5
## 11 MECATRONICA 85.2
## 12 QUIMICA 87.3
## 13 SISTEMAS 87.2
## 14 TIC 85.4
Es una medida que da una idea del grado de concentración de los datos seria el promedio de las desviaciones al cuadrado con respecto a la media.
El problema mayor que tiene la varianza es que las unidades están expresadas al cuadrado.
#Se determina la varianza de las variable del conjunto de datos.
var_promedio<-var(notas$Promedio)
var_cr.cursando<-var(notas$Cr.Cursando)
var_cr.aprobados<-var(notas$Cr.Aprobados)
summarise_each(notas, funs(var))# Varianza para todas las variables
## Warning: `summarise_each()` was deprecated in dplyr 0.7.0.
## ℹ Please use `across()` instead.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
## Warning: `funs()` was deprecated in dplyr 0.8.0.
## ℹ Please use a list of either functions or lambdas:
##
## # Simple named list: list(mean = mean, median = median)
##
## # Auto named with `tibble::lst()`: tibble::lst(mean, median)
##
## # Using lambdas list(~ mean(., trim = .2), ~ median(., na.rm = TRUE))
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
## Warning: There was 1 warning in `summarise()`.
## ℹ In argument: `Carrera = var(Carrera)`.
## Caused by warning in `stats::var()`:
## ! NAs introduced by coercion
## # A tibble: 1 × 6
## Alumno Semestre Cr.Aprobados Cr.Cursando Promedio Carrera
## <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 33255. 8.23 4807. 49.1 20.7 NA
summarise_each(notas[,c(3,4,5,6)], funs(var))# Varianza para las variables elegidas
## Warning: `summarise_each()` was deprecated in dplyr 0.7.0.
## ℹ Please use `across()` instead.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
## Warning: `funs()` was deprecated in dplyr 0.8.0.
## ℹ Please use a list of either functions or lambdas:
##
## # Simple named list: list(mean = mean, median = median)
##
## # Auto named with `tibble::lst()`: tibble::lst(mean, median)
##
## # Using lambdas list(~ mean(., trim = .2), ~ median(., na.rm = TRUE))
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
## Warning: There was 1 warning in `summarise()`.
## ℹ In argument: `Carrera = var(Carrera)`.
## Caused by warning in `stats::var()`:
## ! NAs introduced by coercion
## # A tibble: 1 × 4
## Cr.Aprobados Cr.Cursando Promedio Carrera
## <dbl> <dbl> <dbl> <dbl>
## 1 4807. 49.1 20.7 NA
summarise(notas, avg = var(notas$Promedio))# Calcula la varianza para una sola variable
## # A tibble: 1 × 1
## avg
## <dbl>
## 1 20.7
notas %>%
group_by(Carrera) %>%
summarize(promedio_por_car = var(Promedio))
## # A tibble: 14 × 2
## Carrera promedio_por_car
## <chr> <dbl>
## 1 ADMINISTRACION 14.1
## 2 ARQUITECTURA 16.4
## 3 BIOQUIMICA 25.4
## 4 CIVIL 18.5
## 5 ELECTRICA 17.3
## 6 ELECTRONICA 18.8
## 7 GESTION 16.4
## 8 INDUSTRIAL 19.1
## 9 INFORMATICA 17.2
## 10 MECANICA 17.1
## 11 MECATRONICA 13.0
## 12 QUIMICA 21.7
## 13 SISTEMAS 20.3
## 14 TIC 18.7
Es la raíz cuadrada positiva de la varianza y tiene la ventaja que esta en las mismas unidades de medida que los datos. Se representa por s.
De por si sola la desviación estándar no permite concluir si la muestra es muy variable o poco variable.
La desviación estándar tampoco es tan confiable para medir la variabilidad de los datos.
Considere los siguientes conjuntos de datos:
c1=c(16,18,25,28,23,42,24,47,38,19,22,34)
c2=c(116,118,125,128,123,142,124,147,138,119,122,134)
Calculemos la varianza y desviacion estandar para cada conjunto.
sd(c1)
## [1] 10.01817
sd(c2)
## [1] 10.01817
Observe que las medidas de variabilidad son iguales, pero es claro que los elementos del conjunto de datos primero tiene mayor variabilidad que el segundo conjunto de datos. La razón es que, aunque las desviaciones estándar son iguales, la media de los valores en el conjunto 1 es mucho menor que en el conjunto 2, lo que hace que la variabilidad sea más significativa en relación con la media en el primer conjunto.
Por lo cual lo mejor es hallar el coeficiente de variación
#Se determina la desviacion estandar de las variable del conjunto de datos.
des_promedio<-sd(notas$Promedio)
des_cr.cursando<-sd(notas$Cr.Cursando)
des_cr.aprobados<-sd(notas$Cr.Aprobados)
notas %>%
group_by(Carrera) %>%
summarize(Desviaciones_estandar = sd(Promedio))
## # A tibble: 14 × 2
## Carrera Desviaciones_estandar
## <chr> <dbl>
## 1 ADMINISTRACION 3.76
## 2 ARQUITECTURA 4.05
## 3 BIOQUIMICA 5.04
## 4 CIVIL 4.30
## 5 ELECTRICA 4.16
## 6 ELECTRONICA 4.33
## 7 GESTION 4.05
## 8 INDUSTRIAL 4.36
## 9 INFORMATICA 4.15
## 10 MECANICA 4.14
## 11 MECATRONICA 3.61
## 12 QUIMICA 4.66
## 13 SISTEMAS 4.51
## 14 TIC 4.32
El coeficiente de variación es el cociente entre la desviacion estandar y la media. Los datos se dan el porcentaje:
Se calcula y se puede interpretar que si CV es mayor que 30% la muestra es muy variable. Si CV es menor que 30% no existe mucha variabilidad ## Funcion para calcular el coeficiente de variacion
coeficiente_variacion <- function(x) {
cv <- sd(x) / mean(x) * 100
return(cv)
}
coeficiente_variacion(notas$Promedio)
## [1] 5.256737
coeficiente_variacion(c1)
## [1] 35.77916
coeficiente_variacion(c2)
## [1] 7.826692
notas %>%
group_by(Carrera) %>%
summarize(Coe_var = coeficiente_variacion(Promedio))
## # A tibble: 14 × 2
## Carrera Coe_var
## <chr> <dbl>
## 1 ADMINISTRACION 4.17
## 2 ARQUITECTURA 4.66
## 3 BIOQUIMICA 5.84
## 4 CIVIL 5.09
## 5 ELECTRICA 4.85
## 6 ELECTRONICA 4.98
## 7 GESTION 4.58
## 8 INDUSTRIAL 5.08
## 9 INFORMATICA 4.75
## 10 MECANICA 4.95
## 11 MECATRONICA 4.23
## 12 QUIMICA 5.34
## 13 SISTEMAS 5.17
## 14 TIC 5.05
###Funcion barplot
Carrera<-table(notas$Carrera)
barplot(Carrera, #B) Se aplica barplot a esa tabla
main="TITULO GENERAL", #C) Título principal
xlab="Eje X", #D) Tíulo del eje X
ylab="Eje Y", #E) Título del eje Y
legend = rownames(notas$Carrera),#F) Mostrar las leyendas
col=c(1,2,3,4,5,6,7,8,9,10,11,12,13,14),#G) Poner color
ylim = c(0, 700) #H) Ajustar límites en eje Y
) #I) No olvidar cerrar el paréntesis
# Graficos de barras con ggplot2
# Grafica de barra de la variable promedio por carrera
plot_ly(data = notas, x = ~Carrera, y = ~Promedio, color = ~Carrera, type = "bar" )
## Warning in RColorBrewer::brewer.pal(N, "Set2"): n too large, allowed maximum for palette Set2 is 8
## Returning the palette you asked for with that many colors
## Warning in RColorBrewer::brewer.pal(N, "Set2"): n too large, allowed maximum for palette Set2 is 8
## Returning the palette you asked for with that many colors
boxplot(notas$Promedio)
## Agregando parametros al boxplot
boxplot(airquality$Ozone,
main = "Boxplot de nota promedio",
xlab = "",
ylab = "Promedio",
col = "orange",
border = "brown",
horizontal = F,
notch = T
)
### Boxplot con ggplot2
# Grafica de boxplot de la variable promedio por carrera
plot_ly(data = notas, x = ~Carrera, y = ~Promedio, color = ~Carrera, type = "box" )
## Warning in RColorBrewer::brewer.pal(N, "Set2"): n too large, allowed maximum for palette Set2 is 8
## Returning the palette you asked for with that many colors
## Warning in RColorBrewer::brewer.pal(N, "Set2"): n too large, allowed maximum for palette Set2 is 8
## Returning the palette you asked for with that many colors
hist(notas$Cr.Cursando, col = "blue")
hist(notas$Cr.Aprobados, col = "blue")
hist(notas$Promedio, col = "blue")
hist(notas$Semestre, col = "blue")
## Histogramas en un solo grafico
par(mfrow=c(2,2))
hist(notas$Cr.Cursando,
col = "blue",breaks = 10,
main="His.Creditos Cursando",
xlab="Intervalos")
hist(notas$Cr.Aprobados,
col = "blue",breaks = 10,
main="His.Creditos Aprobados",
xlab="Intervalos")
hist(notas$Promedio,
col = "blue",breaks = 10,
main="His.Nota promedio",
xlab="Intervalos")
hist(notas$Semestre,
col = "blue",breaks = 10,
main="His.Semestre",
xlab="Intervalos")
ggplot(data.frame(notas$Promedio), aes(x = notas$Promedio)) +
geom_histogram(aes(y = ..density..),color = "red",fill = "green")+
geom_density(fill = "black", alpha = 0.25) #con alpha elegimos el grado de transparencia
## Warning: The dot-dot notation (`..density..`) was deprecated in ggplot2 3.4.0.
## ℹ Please use `after_stat(density)` instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.