## Distribuciones y estadísticas
Aquí se definen parámetros generales y el espacio de trabajo
options(max.print = 100000, width=300) # dimensiones salida
getwd() # donde estamos ahora
## [1] "/home/sergio/Documents/Lavoro in corso/Análisis de datos y estadística inferencial - IMCA/Lezioni 2024/Clase_3/R"
setwd("~/Documents/Lavoro in corso/Análisis de datos y estadística inferencial - IMCA/Lezioni 2024/Clase_3/R") # donde vamos
Se trabaja con una fila de la tabla del archivo Fiebre.csv, con presencia/ausencia de fiebre de heno.
datos <- read.csv("http://www.camiz.it/Universita/Dati/Fiebre.csv") # datos
fiebre <- as.matrix(datos)[3,c(1,2)] # se extrae la 3a fila
nombres <- names(fiebre) # se toman los nombres
fiebre <- as.vector(fiebre) # se trata de vector
names(fiebre) <- nombres
n <- sum(fiebre) # total tabla
frecuencias <- as.vector(fiebre/n) # se calculan frecuencias
tab <- cbind(fiebre,frecuencias) # se asocian tabla y frecuencias
tab <- rbind(tab,c(n,1)) # se ajunta el total
colnames(tab) <- c("números","frecuencias") # los nombres de columna
rownames(tab) <- c(nombres,"Total") # y de filas
round(tab,3) # se sale la tabla
## números frecuencias
## Fiebre.de.heno 1069 0.071
## No.fiebre 13945 0.929
## Total 15014 1.000
noquote(paste0("riesgo = ", round(fiebre[1]/n,3))) # el riesgo
## [1] riesgo = 0.071
noquote(paste0("momio = ", round(fiebre[1]/fiebre[2],3))) # y el momio
## [1] momio = 0.077
nompie <- paste(nombres,round(frecuencias,3),sep=" ") # se construyen etiquetas
pie(frecuencias,col=c("red","lightblue"),labels = nompie,init.angle=90, # gráfico
main="Riesgo de fiebre de heno")
se observa que en la población examinada hay un riesgo de 7.1% de tener fiebre de heno y momios circa 8 de tener fiebre contra 92 de no tener (3 contra 34).
Se puede construir una función stat_dico(), que hace todos los cálculos: por esto es suficiente de llamar a la función con el vector y si se quiere un nombre que sirva como encabezamiento del gráfico.
stat_dico <- function(vector,...){
res <- list()
nombres <- names(vector) # toma los nombres
n <- sum(vector) # total tabla
frecuencias <- as.vector(vector/n) # se calculan frecuencias
tab <- cbind(vector,frecuencias) # se asocian tabla y frecuencias
tab <- rbind(tab,c(n,1)) # se ajunta el total
colnames(tab) <- c("números","frecuencias") # los nombres de columna
rownames(tab) <- c(nombres,"Total") # y de filas
res$table <- round(tab,3) # se sale la tabla
res$risk <- round(vector[1]/n,3) # el riesgo
res$odds <- round(vector[1]/vector[2],3) # y el momio
nompie <- paste(nombres,round(frecuencias,3),sep=" ") # se construyen etiquetas
pie(frecuencias,col=c("red","lightblue"),labels = nompie,init.angle=90,...) # gráfico
res
}
Por consecuencia, el cálculo se reduce a
stat_dico(fiebre,main="Riesgo de fiebre de heno")
## $table
## números frecuencias
## Fiebre.de.heno 1069 0.071
## No.fiebre 13945 0.929
## Total 15014 1.000
##
## $risk
## Fiebre.de.heno
## 0.071
##
## $odds
## Fiebre.de.heno
## 0.077
La misma función se puede aplicar a otro caso: sean 1127 entrevistados, preguntandole si creen en la vida post muerte. Se resulta
vidapm <- c(907,220) # Ingreso de datos
names(vidapm) <- c("Creyentes","No Creyentes") # etiquetas
stat_dico(vidapm,main="Creer en la vida post muerte")
## $table
## números frecuencias
## Creyentes 907 0.805
## No Creyentes 220 0.195
## Total 1127 1.000
##
## $risk
## Creyentes
## 0.805
##
## $odds
## Creyentes
## 4.123
En este caso, el “riesgo” de creer en la vida post muerte es de .80 contra .20 de no creer. Los momios son de 4 creyentes por cada non creyente.
En este caso trabajamos sobre el archivo pielescuero.csv. Hay que declarar como factores los datos, con Tamaño que es ordenado también.
piel <-read.csv("Pielescuero.csv", header = TRUE); head(piel) # datos
## Exportacion Tamano Financiacion Zona Actividad
## 1 1 1 2 2 4
## 2 2 1 2 3 3
## 3 1 1 2 2 3
## 4 1 1 2 2 3
## 5 1 1 2 1 3
## 6 1 1 2 3 3
pielc <- piel # copia sobre otro data frame
attach(pielc) # se conecta
# se definen los factores, niveles, etiquetas, y si ordenado
pielc$Exportacion <- factor(piel$Exportacion,
levels = c(1,2),
labels = c("siexp","noexp"))
pielc$Tamano <- factor(piel$Tamano,
levels = c(1,2,3),
labels = c("11-20","21-50","> 50"), ordered = TRUE)
pielc$Financiacion <- factor(piel$Financiacion,
levels = c(1,2),
labels = c("sipre","nopre"))
pielc$Zona <- factor(piel$Zona,
levels = c(1,2,3),
labels = c("NO","NE","CE"))
pielc$Actividad <- factor(piel$Actividad,
levels = c(1,2,3,4),
labels = c("PeCu","Zapa","Ropa","MeAl"))
head(pielc); typeof(pielc); str(pielc); summary(pielc) # se ve el resultado
## Exportacion Tamano Financiacion Zona Actividad
## 1 siexp 11-20 nopre NE MeAl
## 2 noexp 11-20 nopre CE Ropa
## 3 siexp 11-20 nopre NE Ropa
## 4 siexp 11-20 nopre NE Ropa
## 5 siexp 11-20 nopre NO Ropa
## 6 siexp 11-20 nopre CE Ropa
## [1] "list"
## 'data.frame': 173 obs. of 5 variables:
## $ Exportacion : Factor w/ 2 levels "siexp","noexp": 1 2 1 1 1 1 1 1 1 2 ...
## $ Tamano : Ord.factor w/ 3 levels "11-20"<"21-50"<..: 1 1 1 1 1 1 1 1 1 1 ...
## $ Financiacion: Factor w/ 2 levels "sipre","nopre": 2 2 2 2 2 2 2 2 2 2 ...
## $ Zona : Factor w/ 3 levels "NO","NE","CE": 2 3 2 2 1 3 3 3 1 1 ...
## $ Actividad : Factor w/ 4 levels "PeCu","Zapa",..: 4 3 3 3 3 3 3 3 4 3 ...
## Exportacion Tamano Financiacion Zona Actividad
## siexp:129 11-20:53 sipre: 53 NO:43 PeCu:46
## noexp: 44 21-50:93 nopre:120 NE:42 Zapa:62
## > 50 :27 CE:88 Ropa:54
## MeAl:11
detach(pielc)
Ahora podemos calcular tabla, frecuencias, moda y entropia.
t1 <- table(pielc[,1]); t1 # tabla de distribución
##
## siexp noexp
## 129 44
tot1 <- sum(t1); tot1 # total
## [1] 173
f1 <- t1/tot1; f1; f1*100 # frecuencias relativas y porcentajes
##
## siexp noexp
## 0.7456647 0.2543353
##
## siexp noexp
## 74.56647 25.43353
tab <- cbind(t1,round(f1,5),round(f1*100,3) )
colnames(tab) <- c("numbers","frequencies","percentages")
tab
## numbers frequencies percentages
## siexp 129 0.74566 74.566
## noexp 44 0.25434 25.434
# moda # estadísticas para la moda
moda1 <- c(names(t1)[which(f1==max(f1))], max(t1), round(max(f1),3))
names(moda1) <- c("Mode","numbers", "frequency")
noquote(moda1)
## Mode numbers frequency
## siexp 129 0.746
# entropías
h1 <- -sum(f1*log(f1,2));h1 # entropía
## [1] 0.8180773
hm1 <- log(dim(f1),2);hm1 # entropía máxima
## [1] 1
hr1 <- h1/hm1
ent <- cbind(h1,hm1,hr1) # tabla de resumen
colnames(ent) <- c("entropy","max entropy","relative entropy")
round(ent,3)
## entropy max entropy relative entropy
## [1,] 0.818 1 0.818
# diagrama circular
pie(f1,labels=paste(rownames(f1), round(f1*100,2), "%"), main = colnames(pielc)[1])
En este caso también se puede hacer una función
stat_nom <- function(vector,...) {
res <- list() # lista para resultados
# tabla
t <- table(vector); t # tabla de distribución
tot <- sum(t); tot # total
f <- t/tot # frecuencias
tab <- cbind(t,round(f,5),round(f*100,3) ) # tabla resumen
colnames(tab) <- c("numbers","frequencies","percentages") # nombres columnas
res$frequencies <- tab
# moda # estadísticas para la moda
moda <- c(names(t)[which(f==max(f))], max(t), round(max(f),3)) # consigue moda y valor
names(moda) <- c("Mode","numbers","frequency") # nombres columnas
res$mode <- noquote(moda)
# entropías
h <- -sum(f*log(f,2));h # entropía
hm <- log(dim(f),2);hm # entropía máxima
hr <- h/hm # entropia relativa
ent <- cbind(h1,hm1,hr1) # tabla de resumen
colnames(ent) <- c("entropy","max entropy","relative entropy") # nombres columnas
res$entropy <- round(ent,3)
# diagrama circular
pie(f,labels=paste(rownames(f), round(f*100,2), "%"), ...)
res
}
Asi que Exportaciones se calcula directamente:
stat_nom(pielc[,1],main="Exportaciones de piel y cuero")
## $frequencies
## numbers frequencies percentages
## siexp 129 0.74566 74.566
## noexp 44 0.25434 25.434
##
## $mode
## Mode numbers frequency
## siexp 129 0.746
##
## $entropy
## entropy max entropy relative entropy
## [1,] 0.818 1 0.818