## 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

Datos presencia/ausencia

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.

Datos cualitativos

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