1 Introducción

Primero vamos a instalar algunos paquetes.

  • El paquete readxl permite leer bases de datos desde excel.
install.packages("readxl", dependencies = TRUE) # Instalación del paquete  readxl
library("readxl") # Activación del paquete readxl

Objetos que se encuentra en el paquete readxl:

library(help=readxl)
  • Paquete dplyr
install.packages("dplyr") 
library("dplyr")
  • Paquete prettyR
install.packages("prettyR") 
library("prettyR")          # Para la función describe() y Mode()

library(help=prettyR)
  • Paquete tidyverse
install.packages("tidyverse")  
library("tidyverse")   # Paquete necesario para el uso de %>%
  • Paquete agricolae

  • Paquete DescTools

Vamos a importar bases de datos, y a realizar análisis de datos univariados.

2 Importar datos desde excel

Funciones para importar archivos desde excel:

  • Función read.csv() del paquete utils, archivo limitado por comas

  • Función read_excel() del paquete readxl

  • Función read.xlsx() del paquete xlsx

  • Función read.xlsx() del paquete openxlsx

La función args() muestra los argumentos de la función read_excel():

args(read_excel) 
:)  function (path, sheet = NULL, range = NULL, col_names = TRUE, 
:)      col_types = NULL, na = "", trim_ws = TRUE, skip = 0, n_max = Inf, 
:)      guess_max = min(1000, n_max), progress = readxl_progress(), 
:)      .name_repair = "unique") 
:)  NULL

En el caso de los dos primeros argumentos de read_excel(): + path es el argumento que especifica la ruta en donde se encuentra el archivo de excel.

  • sheet es el argumento para indicar el número de la hoja del archivo de excel, con la que se va a trabajar.

Con la función read_excel() se va a importar el archivo “Variables_agricolas.xlsx” desde excel a R, y se va a crear el objeto “dat_variables”.

dat_variables<-read_excel("C:/Documetos MGM_OS_Dell/Documentos Maria_Dell/UAGro/Cursos_Taller_Impartidos/Curso-Taller_DGETA_2022/Variables_agricolas.xlsx")
class(dat_variables) #tbl es tabla
:)  [1] "tbl_df"     "tbl"        "data.frame"
View(dat_variables)   # Muestra la base de datos importada dat_variables

Base de datos importada a R:

head(dat_variables)
:)  # A tibble: 6 × 24
:)     Anio Idestado Nomestado Idddr Nomddr Idcader Nomcader Idmun…¹ Nommu…² Idciclo
:)    <dbl>    <dbl> <chr>     <dbl> <chr>    <dbl> <chr>      <dbl> <chr>     <dbl>
:)  1  2020       12 Guerrero     53 Atoyac       1 Técpan …      57 Técpan…       3
:)  2  2020       12 Guerrero     53 Atoyac       1 Técpan …      57 Técpan…       3
:)  3  2020       12 Guerrero     53 Atoyac       1 Técpan …      57 Técpan…       3
:)  4  2020       12 Guerrero     53 Atoyac       4 La Unión      68 La Uni…       3
:)  5  2020       12 Guerrero     53 Atoyac       4 La Unión      68 La Uni…       3
:)  6  2020       12 Guerrero     53 Atoyac       5 Petatlán      38 Zihuat…       3
:)  # … with 14 more variables: Nomcicloproductivo <chr>, Idmodalidad <dbl>,
:)  #   Nommodalidad <chr>, Idunidadmedida <dbl>, Nomunidad <chr>, Idcultivo <dbl>,
:)  #   Nomcultivo.Sin.Um <chr>, Sembrada <dbl>, Cosechada <dbl>,
:)  #   Siniestrada <dbl>, Volumenproduccion <dbl>, Rendimiento <dbl>,
:)  #   Precio <dbl>, Valorproduccion <dbl>, and abbreviated variable names
:)  #   ¹​Idmunicipio, ²​Nommunicipio

3 Tipos de variables

Según su escala de medición:

  • Nominal: dicotómicas, politómicas (No existe orden en las categorías)

  • Ordinal (Existe orden en las categorías)

  • Métrica

    • De intervalo

    • De razón

Según el número de valores que contiene:

  • Continua (Números reales)

  • Discreta (Números enteros)

Según su papel en la investigación:

  • Independiente

  • Dependiente

Base de datos iris: This famous iris data set gives the measurements in centimeters of the variables sepal length and width and petal length and width, respectively, for 50 flowers from each of 3 species of iris. The species are Iris setosa, versicolor, and virginica.

data(iris)

attributes(iris)
:)  $names
:)  [1] "Sepal.Length" "Sepal.Width"  "Petal.Length" "Petal.Width"  "Species"     
:)  
:)  $class
:)  [1] "data.frame"
:)  
:)  $row.names
:)    [1]   1   2   3   4   5   6   7   8   9  10  11  12  13  14  15  16  17  18
:)   [19]  19  20  21  22  23  24  25  26  27  28  29  30  31  32  33  34  35  36
:)   [37]  37  38  39  40  41  42  43  44  45  46  47  48  49  50  51  52  53  54
:)   [55]  55  56  57  58  59  60  61  62  63  64  65  66  67  68  69  70  71  72
:)   [73]  73  74  75  76  77  78  79  80  81  82  83  84  85  86  87  88  89  90
:)   [91]  91  92  93  94  95  96  97  98  99 100 101 102 103 104 105 106 107 108
:)  [109] 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126
:)  [127] 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144
:)  [145] 145 146 147 148 149 150
class(iris)
:)  [1] "data.frame"
dim(iris)
:)  [1] 150   5

Base de datos iris:

head(iris)
:)    Sepal.Length Sepal.Width Petal.Length Petal.Width Species
:)  1          5.1         3.5          1.4         0.2  setosa
:)  2          4.9         3.0          1.4         0.2  setosa
:)  3          4.7         3.2          1.3         0.2  setosa
:)  4          4.6         3.1          1.5         0.2  setosa
:)  5          5.0         3.6          1.4         0.2  setosa
:)  6          5.4         3.9          1.7         0.4  setosa

Nombre de las columnas del objeto iris:

colnames(iris)  # Nombre de las columnas del objeto iris
:)  [1] "Sepal.Length" "Sepal.Width"  "Petal.Length" "Petal.Width"  "Species"

Creación del objeto dat_iris y uso de la función rename() para cambiar los nombres de las columnas de la base de datos iris.

dat_iris<-iris%>%
          rename(Long.Sepal=Sepal.Length, Ancho.Sepal=Sepal.Width, 
                 Long.Petalo=Petal.Length, Ancho.Petalo=Petal.Width,
                 Especies=Species)

Base de datos iris con nuevos nombres para las variables:

head(dat_iris)
:)    Long.Sepal Ancho.Sepal Long.Petalo Ancho.Petalo Especies
:)  1        5.1         3.5         1.4          0.2   setosa
:)  2        4.9         3.0         1.4          0.2   setosa
:)  3        4.7         3.2         1.3          0.2   setosa
:)  4        4.6         3.1         1.5          0.2   setosa
:)  5        5.0         3.6         1.4          0.2   setosa
:)  6        5.4         3.9         1.7          0.4   setosa

Note que la función también str() muestra de que tipo son las variables del objeto dat_iris.

str(dat_iris)
:)  'data.frame':   150 obs. of  5 variables:
:)   $ Long.Sepal  : num  5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ...
:)   $ Ancho.Sepal : num  3.5 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 ...
:)   $ Long.Petalo : num  1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5 ...
:)   $ Ancho.Petalo: num  0.2 0.2 0.2 0.2 0.2 0.4 0.3 0.2 0.2 0.1 ...
:)   $ Especies    : Factor w/ 3 levels "setosa","versicolor",..: 1 1 1 1 1 1 1 1 1 1 ...

3.1 Variables continuas:

class(dat_iris$Long.Sepal)
:)  [1] "numeric"
class(dat_iris$Ancho.Sepal)
:)  [1] "numeric"
class(dat_iris$Long.Petalo)
:)  [1] "numeric"
class(dat_iris$Ancho.Petalo)
:)  [1] "numeric"

3.2 Variable categórica

Las categorías de una variable cualitativa, se pueden arreglar en una tabla:

Categoría Conteo
\(a_{1}\) \(n_{1}\)
\(a_{2}\) \(n_{2}\)
. .
. .
. .
\(a_{k}\) \(n_{k}\)

A partir de esta información se puede calcular:

  • Frecuencias absolutas, \(n_{i}\), es decir, la cantidad de unidades por categoría (valores absolutos)

  • Frecuencias relativas, \(f_{i}=\frac{n_{i}}{n}\), es decir, la proporción de unidades por categoría (valores relativos), donde \(n=\sum n_{i}\).

  • Frecuencias relativas porcentuales, \(f_{i}*100\), es decir, la proporción de unidades por categoría expresada en porcentajes.

class(dat_iris$Especies)
:)  [1] "factor"
resultado<-dat_iris %>%
           select(Especies)%>%
           group_by(Especies)%>%
           summarise(Fre.abs=n())%>%
           mutate(Fre.relativas=Fre.abs/sum(Fre.abs),
                  Fre.relativas.por=Fre.relativas*100)

kable(resultado, digits = 3, col.names = c("Especies", "Frecuencias absolutas", "Frecuencias relativas", "Frecuencias relativas porcentual"))
Especies Frecuencias absolutas Frecuencias relativas Frecuencias relativas porcentual
setosa 50 0.333 33.333
versicolor 50 0.333 33.333
virginica 50 0.333 33.333
attach(resultado)
pie(Fre.abs,col=rainbow(6),main="Grafico de sectores") # frecuencias absolutas

4 Análisis univariado

Si usamos la función attach() para manejar bases de datos las cosas se simplifian, ya que se puede trabajar directamente con las variables sin tener que escribir el nombre de la base de datos antes de la varaible, a continuación se muestra un ejemplo. (With attach() the database is attached to the R search path. This means that the database is searched by R when evaluating a variable, so objects in the database can be accessed by simply giving their names).

attach(dat_iris)  # La función attach  adjunta la base de datos a la ruta de búsqueda de R, por lo que se puede acceder a los objetos de la base de datos simplemente dando sus nombres.

4.1 Estadísticas de centralidad

Dado \(n\) datos el promedio está dado por: \[ \bar{x}=\frac{1}{n}\sum_{i=1}^{n} x_{i} \]

x<-c(2,4,6)
mean(x)
:)  [1] 4

La mediana, es un valor que divide a las observaciones en dos grupos con el mismo número de datos. Si el número de datos es par, se elige el promedio de los dos datos centrales. La mediana no es sensible a los valores extremos.

x<-c(2,4,6,8)
median(x)
:)  [1] 5

La moda de un conjunto de datos, es el valor que ocurre con mayor frecuencia. Si todos los valores son diferentes, entonces no hay moda. Un conjunto de datos puede tener mas de una moda.

x<-c(2,4,6,8,2,2,6,6,6)
Mode(x)      
:)  [1] "6"

Ejemplo con la base de datos dat_iris:

mean(Ancho.Petalo)     # Promedio
:)  [1] 1.199333
median(Ancho.Petalo)   # Mediana
:)  [1] 1.3
Mode(Ancho.Petalo)     # Moda
:)  [1] "0.2"

Otra función que también reporta la Moda es Mode() y se encuentra en el paquete DescTools.

4.2 Estadísticas de dispersión

La varianza muestral está dada por

\[ S^2=\frac{1}{n-1}\sum_{i=1}^{n} (x_{i}-\bar{x})^2 \] La desviación estándar está dada por \[ \sqrt{S^2} \] Ejemplos:

var(Ancho.Petalo) # Varianza
:)  [1] 0.5810063
sd(Ancho.Petalo)  # Desviación estándar
:)  [1] 0.7622377

Los cuantiles son puntos de corte tomados a intervalos de un conjunto de datos. El cuantil de orden \(p\) (con 0 < p < 1) es el valor d \(x_{p}\) que marca un corte de modo que una proporción \(p\) de valores es menor o igual que \(x_{p}\). Por ejemplo, el cuantil de orden \(0.30\) dejaría un \(30\%\) de valores por debajo.

Los cuantiles suelen usarse por grupos que dividen la muestra en partes iguales; entendidas estas como intervalos que comprenden la misma proporción de valores. Los más usados son:

  • Los cuartiles, que dividen la muestra en cuatro partes (cuantiles): 0.25 0.50 y 0.75.

  • Los quintiles, que dividen la muestra en cinco partes (cuantiles): 0.20; 0.40; 0.60 y 0.80.

  • Los deciles, que dividen la muestra en diez partes.

  • Los percentiles, que dividen la muestra en cien partes.

Ejemplos:

range(Ancho.Petalo)  # La función range() reporta el máximo y el valor  mínimo 
:)  [1] 0.1 2.5
diff(range(Ancho.Petalo)) # La función diff() reporta el rango=máximo-mínimo
:)  [1] 2.4
IQR(Ancho.Petalo) # La función IQR() reporta el rango intercuartil es la diferencia de Q3-Q1
:)  [1] 1.5

4.3 Resumen de las estádisticas

summary(dat_iris)
:)     Long.Sepal     Ancho.Sepal     Long.Petalo     Ancho.Petalo  
:)   Min.   :4.300   Min.   :2.000   Min.   :1.000   Min.   :0.100  
:)   1st Qu.:5.100   1st Qu.:2.800   1st Qu.:1.600   1st Qu.:0.300  
:)   Median :5.800   Median :3.000   Median :4.350   Median :1.300  
:)   Mean   :5.843   Mean   :3.057   Mean   :3.758   Mean   :1.199  
:)   3rd Qu.:6.400   3rd Qu.:3.300   3rd Qu.:5.100   3rd Qu.:1.800  
:)   Max.   :7.900   Max.   :4.400   Max.   :6.900   Max.   :2.500  
:)         Especies 
:)   setosa    :50  
:)   versicolor:50  
:)   virginica :50  
:)                  
:)                  
:)  
describe(dat_iris)
:)  Description of dat_iris
:)  
:)   Numeric 
:)               mean median  var   sd valid.n
:)  Long.Sepal   5.84   5.80 0.69 0.83     150
:)  Ancho.Sepal  3.06   3.00 0.19 0.44     150
:)  Long.Petalo  3.76   4.35 3.12 1.77     150
:)  Ancho.Petalo 1.20   1.30 0.58 0.76     150
:)  
:)   Factor 
:)           
:)  Especies  setosa versicolor virginica
:)    Count    50.00      50.00     50.00
:)    Percent  33.33      33.33     33.33
:)  Mode >1 mode

Otra función que también reporta un resumen de las estadísticas es Summarize() y se encuentra en el paquete FSA.

4.4 Gráficos

     ggplot(dat_iris, aes(Long.Petalo))+
     geom_histogram(fill = "blue")+         # Gráfico de barras
     theme_bw()+         # Fondo del gráfico cuadriculado
     labs(x="Lontitud del pétado",y="Conteos")   # Cambio de nombre de los ejes 

ggplot(dat_iris, aes(Long.Petalo)) +
geom_freqpoly(color="blue")+
theme_bw()+         # Fondo del gráfico cuadriculado
labs(x="Lontitud del pétado",y="Valores")   # Cambio del nombre del eje y

     ggplot(dat_iris, aes(Ancho.Petalo))+
     geom_histogram(fill = "blue")+         # GRafico de barras
     theme_bw()+         # Fondo del gráfico cuadriculado
     labs(x="Ancho del pétado",y="Valores")   # Camb

El diagrama de Tukey o cajas y bigotes, representa gráficamente la distribución de los valores de una variable. Las estadísticas que reporta el gráfico son:

  • El valor mínimo

  • El cuantil \(Q_{1}=0.025\)

  • La mediana

  • El cuantil \(Q_{3}=0.75\)

  • El valor máximo

     ggplot(dat_iris, aes(y=Long.Petalo))+
     geom_boxplot()+         # GRafico de barras
     theme_bw()+         # Fondo del gráfico cuadriculado
     labs(x="Longitud del pétado",y="Valores")   # Cambio del nombre del eje y

     ggplot(dat_iris, aes(y=Ancho.Petalo))+
     geom_boxplot()+         # GRafico de barras
     theme_bw()+         # Fondo del gráfico cuadriculado
     labs(x="Ancho del pétado",y="Valores")   # Cambio del nombre del eje y

     ggplot(dat_iris, aes(x=Especies, color=Especies, fill=Especies))+
     geom_bar()+         # GRafico de barras
     theme_bw()+         # Fondo del gráfico cuadriculado
     labs(y="Conteos")   # Cambio del nombre del eje y