R es un entorno y lenguaje de programación libre con un enfoque al análisis estadístico para facilitar el análisis de datos.
DESVENTAJA Su interfaz gráfica es limitada lo que genera rechazo por parte de los usuarios no familiarizados con lenguajes de programación.
Es el entorno de desarrollo integrado.
Son colecciones de funciones desarrolladas por los usuarios. Aquí podemos encontrar diferentes funciones para realizar desde análisis descriptivos hasta modelos más complejos. Ejemplo de como instalar un paquete.
install.packages(“names”)
rm(list=ls())
.getwd()
El
directorio base es el lugar donde R lee los archivos de entrada y ubica
las salidas dirigidas por defecto.setwd(dir)
setwd("~/Documents/Asesorias/Clases")
Inf
es un simbolo para infinitoNA
es un simbolo para dato no disponible o
missing.NaN
operación imposible.NULL
es un símbolo para objeto vacío.TRUE
y FALSE
son constantes lógicas&, |, !
operadores lógicos.=
o <-
operador de asignación.==, !=, <, <=
comparaciones.read.table()
read.delim()
read.csv()
Library(foreign)
importa datos de spss, minitab, stata,
etcwrite.table()
,
write.csv()
.attach(datos)
para manipular cada variable por
separado.x <- c(10, 30, 1, 15, 8)
x
## [1] 10 30 1 15 8
y <- c("A", "B", "C", "D", "A")
y
## [1] "A" "B" "C" "D" "A"
#Limpiar
rm(list=ls())
##Identificar el directorio actual de trabajo
getwd()
##Definir el directorio de trabajo
setwd("")
##Verificación que si se cambio el directorio de trabajo
getwd()
##Ayuda en R
help()
##Ayuda sobre una función (exige que sepamos el nombre de la función)
help(sd)
?sd
##Buscar ayuda sobre un concepto estadístico
help.search("Skewness")
??Skewness
Se cuenta con la información de 50 trabajadores en quienes se ha documentado el sexo (1: M, 2: F), escolaridad (1: Bachiller, 2: Técnico, 3: Profesional), si conduce carro (0: No, 1: Si), los años de antigüedad en la empresa y la edad. Realice un análisis para cada una de las variables.
#Leer base de datos
data_lab1 <- read.csv("data_lab1.csv")
head(data_lab1)
## id sexo escolaridad carro anos_laborales edad
## 1 1 1 1 1 19 46
## 2 2 2 2 1 18 39
## 3 3 2 3 1 9 25
## 4 4 2 3 1 12 42
## 5 5 2 3 1 20 21
## 6 6 2 3 0 12 53
#Para saber el tipo de objeto
class(data_lab1)
## [1] "data.frame"
#Recodificación de variables
#El signo $ permite manipular las variables dentro del conjunto de datos
?factor
data_lab1$sexo=factor(data_lab1$sexo, levels=c(1,2),
labels=c("M", "F"))
data_lab1$escolaridad=factor(data_lab1$escolaridad, levels=c(1,2,3),
labels=c("Bachiller", "Técnico", "Profesional"))
data_lab1$carro=factor(data_lab1$carro, levels=c(0,1),
labels=c("No", "Si"))
head(data_lab1)
## id sexo escolaridad carro anos_laborales edad
## 1 1 M Bachiller Si 19 46
## 2 2 F Técnico Si 18 39
## 3 3 F Profesional Si 9 25
## 4 4 F Profesional Si 12 42
## 5 5 F Profesional Si 20 21
## 6 6 F Profesional No 12 53
Tablas de frecuencias
#Opcion 1
frec_abs=data.frame(table(data_lab1$sexo))
frec_Rel=frec_abs$Freq/length(data_lab1$sexo)
frec_abs_acum<-cumsum(frec_abs$Freq)
frec_rel_acum<-cumsum(frec_Rel)
tabla<-cbind(frec_abs,frec_Rel,frec_abs_acum,frec_rel_acum)
names(tabla) <- c("Valores", "n_i","f_i","N_i","F_i")
tabla
## Valores n_i f_i N_i F_i
## 1 M 24 0.48 24 0.48
## 2 F 26 0.52 50 1.00
#Opcion 2
#Frecuencias Absolutas
table(data_lab1$sexo)
##
## M F
## 24 26
#Frecuencias Relativas
prop.table(table(data_lab1$sexo))
##
## M F
## 0.48 0.52
#Opcion 3
#install.packages("epiDisplay")
#library(epiDisplay)
#tab1(data_lab1$sexo, cum.percent = TRUE)
La visualización de los datos puede realizarse con el paquete
ggplot2
.
#Gráficos
#install.packages("ggplot2")
# Load ggplot2
library(ggplot2)
#Opcion 1 Gráfico de torta
pct <- tabla$f_i*100
etiquetas <- paste(tabla$Valores, pct) # Añadimos porcentajes a etiquetas
etiquetas <- paste(etiquetas,"%",sep="") # Añadimos el símbolo de %
pie(tabla$n_i, labels = etiquetas,
main="Diagrama de pastel",
clockwise = TRUE,radius=1)
#Opción 2 ggplot2 Gráfico de torta
ggplot(tabla, aes(x="", y=f_i, fill=Valores)) +
geom_bar(stat="identity", width=1) +
coord_polar("y", start=0) +
geom_text(aes(label = paste0(f_i, "%")), position = position_stack(vjust=0.5)) +
labs(x = NULL, y = NULL) +
theme_classic() +
theme(axis.line = element_blank(),
axis.text = element_blank(),
axis.ticks = element_blank())
#Opcion 1 Barras
barplot(tabla$n_i, xlab = "Sexo", names.arg=c("F","M"))
#Opcion 2 Barras ggplot2
ggplot(data_lab1, aes(x=sexo, fill=sexo)) +
geom_bar()+
xlab("Sexo") +
ylab("Frecuencia Absoluta")
#Tabla Cruzada
table(data_lab1$sexo)
##
## M F
## 24 26
table(data_lab1$carro)
##
## No Si
## 19 31
#Tabla Cruzada de variables
table2=table(data_lab1$sexo, data_lab1$carro)
table2
##
## No Si
## M 6 18
## F 13 13
#Total de columnas y total por filas
margin.table(table2,1)
##
## M F
## 24 26
margin.table(table2,2)
##
## No Si
## 19 31
#Proporciones ¿Cómo interpretarlo?
prop.table(table2)
##
## No Si
## M 0.12 0.36
## F 0.26 0.26
#Contingencia proporciones fila
prop.table(table2, margin = 1)
##
## No Si
## M 0.25 0.75
## F 0.50 0.50
#Contingencia proporciones columna
prop.table(table2, margin = 2)
##
## No Si
## M 0.3157895 0.5806452
## F 0.6842105 0.4193548
#Usando el paquete epiDisplay
#tabla3=tabpct(data_lab1$sexo, data_lab1$carro, graph = F)
#tabla3
Gráficas para tablas de contingencia
#Grafico de Frecuencias
barplot(table2,beside=T,
main=' ',xlab = "Conduce carro", ylab="Frecuencia",
col=c("darkblue", "red"), ylim = c(0,30))
legend("topleft", legend=rownames(table2), cex=0.75, fill=c("darkblue", "red"))
#Grafico de Proporciones
barplot(prop.table(table2,1)*100,beside=T,
main=' ',xlab = "Conduce carro", ylab="Porcentaje",
col=c("darkblue", "red"), ylim = c(0,100))
legend("topleft", legend=rownames(table2), cex=0.50, fill=c("darkblue", "red"))
##Usando GGPLOT
library(ggplot2)
ggplot(data_lab1, aes(x = carro)) +
geom_bar(aes(y = (..count..)/sum(..count..))) +
scale_y_continuous(labels=scales::percent) +
ylab("Porcentaje")
## Warning: The dot-dot notation (`..count..`) was deprecated in ggplot2 3.4.0.
## ℹ Please use `after_stat(count)` instead.
ggplot(data_lab1, aes(sexo, group = carro, fill=carro)) +
geom_bar(aes(y = ..prop.., fill = factor(..x..)), stat="count") +
scale_y_continuous(labels=scales::percent) +
ylab("Porcentaje") +
facet_grid(~carro)
ggplot(data_lab1, aes(carro, group = sexo, fill=sexo)) +
geom_bar(aes(y = ..prop.., fill = factor(..x..)), stat="count") +
scale_y_continuous(labels=scales::percent) +
ylab("Porcentaje") +
facet_grid(~sexo)
Ejemplo con el ejercicio en clase de los pesos de los 98 estudiantes evaluados.
#Generar los pesos
peso=c(34.5, 35.2, 36.1, 37.0, 37.9, 38.5, 38.5, 39.1, 39.6, 40.0,
40.4, 40.4, 40.5, 40.8, 40.9, 41.1, 45.0, 45.2, 46.0, 47.3,
47.7, 47.8, 48.0, 48.2, 48.3, 48.3, 48.7, 49.0, 49.1, 49.1,
49.2, 50.3, 50.5, 50.5, 50.6, 50.9, 52.3, 52.8, 52.9, 53.0,
53.3, 53.5, 54.0, 54.2, 54.9, 55.1, 55.3, 55.3, 52.9, 53.0,
55.4, 55.6, 55.8, 55.8, 55.8, 56.0, 56.2, 56.4, 57.4, 58.1,
58.0, 58.9, 58.9, 59.0, 59.3, 59.3, 60.1, 60.4, 60.5, 60.5,
60.7, 62.5, 62.7, 63.0, 63.1, 63.2, 63.8, 64.6, 65.0, 65.0,
65.0, 65.5, 65.6, 65.7, 95.1, 68.2, 68.4, 69.6, 70.1, 70.3,
72.5, 72.5, 73.0, 79.0, 80.4, 80.7, 85.8, 108.4)
#Paso 1: rango
range=max(peso)-min(peso)
range
## [1] 73.9
c(max(peso),min(peso), max(peso)-min(peso))
## [1] 108.4 34.5 73.9
#Paso 2: definir m con sturgles
N=98
m=1+3.3*log10(98)
print(m)
## [1] 7.571046
#Usando hist
#install.packages("fdth")
library(fdth)
##
## Attaching package: 'fdth'
## The following objects are masked from 'package:stats':
##
## sd, var
peso_tabla=fdt(peso,start=30,
end=110,
h=10)
peso_tabla
## Class limits f rf rf(%) cf cf(%)
## [30,40) 9 0.09 9.18 9 9.18
## [40,50) 22 0.22 22.45 31 31.63
## [50,60) 35 0.36 35.71 66 67.35
## [60,70) 21 0.21 21.43 87 88.78
## [70,80) 6 0.06 6.12 93 94.90
## [80,90) 3 0.03 3.06 96 97.96
## [90,100) 1 0.01 1.02 97 98.98
## [100,110) 1 0.01 1.02 98 100.00
#Densidad
hist(peso,freq=FALSE,col="lightcyan", xaxt = "n", main=" ",xlab="Peso", ylab="Densidad", xlim=c(30,110))
axis(1, at =seq(30,110,10))
hist(peso,col="lightcyan", xaxt = "n", main=" ",xlab="Peso", ylab="Frecuencias Absolutas", xlim=c(30,110))
axis(1, at =seq(30,110,10))
#Ojiva con distribución empirica acumulada
ECDF=ecdf(peso)
plot(ECDF,col="red",lwd=2,xlab="Peso",
ylab="Frecuencia acumulada",main=" ")
Ejemplo de tabla de frecuencia para la edad de trabajadores.
#Definición de intervalos con la función fdt
edad_tabla=fdt(data_lab1$edad,breaks=c("Sturges"))
edad_tabla
## Class limits f rf rf(%) cf cf(%)
## [17.82,23.93) 7 0.14 14 7 14
## [23.93,30.04) 7 0.14 14 14 28
## [30.04,36.15) 8 0.16 16 22 44
## [36.15,42.27) 8 0.16 16 30 60
## [42.27,48.38) 7 0.14 14 37 74
## [48.38,54.49) 9 0.18 18 46 92
## [54.49,60.6) 4 0.08 8 50 100
#Varios indicadores de resumen
summary(data_lab1$edad)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 18.0 29.0 38.5 38.9 49.5 60.0
#Media
mean(data_lab1$edad)
## [1] 38.9
#Desviación estandar
sd(data_lab1$edad)
## [1] 11.95613
#Percentiles
quantile(data_lab1$edad,probs=0.5)
## 50%
## 38.5
#Varios Percentiles
quantile(data_lab1$edad,probs=c(0.25,0.50,0.75))
## 25% 50% 75%
## 29.0 38.5 49.5
#install.packages("moments")
library("moments")
#Asimetría
skewness(data_lab1$edad)
## [1] -0.03109101
#Kurtosis
kurtosis(data_lab1$edad)
## [1] 1.948691
boxplot(data_lab1$edad,
main = "Diagrama de cajas",
ylab = "Edad",
col= "blue")
boxplot(data_lab1$edad~ data_lab1$carro,
ylab = "Edad", xlab="Conduce Carro")
Indicadores de acuerdo a grupos.
#Edad de acuerdo a la habilidad de conducción
tapply(data_lab1$edad, data_lab1$carro, summary)
## $No
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 18.00 25.00 40.00 39.26 53.00 60.00
##
## $Si
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 21.00 32.00 38.00 38.68 46.00 60.00
tapply(data_lab1$edad, data_lab1$carro, sd)
## No Si
## 15.110122 9.816269
#¿Qué distribución de edad presenta una mayor variabilidad?
cv_si=(9.8162/38.68)*100
cv_si
## [1] 25.37797
cv_no=(15.1101/39.26)*100
cv_no
## [1] 38.48726