hllinas2023

1 Introducción

Primero, debemos instalar y descargar las librerías que vamos a utilizar.

library(lsm)      # Para descargar una base de datos
library(dplyr)
library(moments)  # Para hallar las medidas de forma
library(e1071)
library(ggplot2)

2 Data frame

Recuerde que el data frame (básicamente una tabla) es en realidad solo un tipo específico de otra estructura de datos (la lista). Actualmente, es el formato de entrada de nuestros datos más frecuente para los análisis estadísticos (dentro de R, pero también para otros programas estadísticos y, por supuesto, para softwares de hojas de cálculo). Por esta razón, primero, es importante importar/cargar los datos antes de iniciar nuestro análisis. Esto ya se explicó en el documento Rpubs :: Importar datasets.

En los documentos Rpubs :: Examinar data frames y Rpubs :: Examinar data frames explicamos algunas funciones de R que nos permiten revisar propiedades de los data frames de las variables que contenidads en él. En Rpubs :: Recodificar variables describimos como recodificar las variables. Para más detalles relacionados con los data frames, se puede consultar el documento Rpubs :: data frames (generalidades).

3 Nuestro data frame

Vamos a utilizar el conjunto de datos survey del paquete lsm, que fueron recogidos aplicando una encuesta a una muestra de estudiantes universitarios. Es un data frame con 800 observaciones y 66 variables, las cuales se describen en este enlace (click aquí):

datosCompleto <- lsm::survey

4 Revisando el data frame

Para visualizar solo una parte de los datos, se pueden utilizar las funciones head y/o tail.

4.0.1 Visualizar una parte de la información con head.

head(datosCompleto)        #A) Por defecto, solo las primeras 6 observaciones 
head(datosCompleto, 3)     #B) Solo las primeras 3 observaciones 

(A)

## # A tibble: 6 × 66
##   Observation ID       Gender Like    Age Smoke Height Weight   BMI School SES  
##         <dbl> <chr>    <chr>  <chr> <dbl> <chr>  <dbl>  <dbl> <dbl> <chr>  <chr>
## 1           1 SB11201… Female TV     21.4 No      1.58     75  30.0 Priva… Medi…
## 2           2 SB11201… Male   Netw…  21.1 Yes     1.6      80  31.2 Public High 
## 3           3 SB11201… Male   Netw…  20.9 Yes     1.5      64  28.4 Priva… High 
## 4           4 SB11201… Male   TV     18.4 Yes     1.53     49  20.9 Public Low  
## 5           5 SB11201… Female TV     16.6 Yes     1.78     82  25.9 Priva… High 
## 6           6 SB11201… Female Netw…  16.0 No      1.65     80  29.4 Public Low  
## # ℹ 55 more variables: Enrollment <chr>, Score <dbl>, MotherHeight <chr>,
## #   MotherAge <dbl>, MotherCHD <dbl>, FatherHeight <chr>, FatherAge <dbl>,
## #   FatherCHD <dbl>, Status <chr>, SemAcum <dbl>, Exam1 <dbl>, Exam2 <dbl>,
## #   Exam3 <dbl>, Exam4 <dbl>, ExamAcum <dbl>, Definitive <dbl>, Expense <dbl>,
## #   Income <dbl>, Gas <dbl>, Course <chr>, Law <chr>, Economic <chr>,
## #   Race <chr>, Region <chr>, EMO1 <dbl>, EMO2 <dbl>, EMO3 <dbl>, EMO4 <dbl>,
## #   EMO5 <dbl>, GOAL1 <chr>, GOAL2 <chr>, GOAL3 <chr>, Pre_STAT1 <dbl>, …

(B)

## # A tibble: 3 × 66
##   Observation ID       Gender Like    Age Smoke Height Weight   BMI School SES  
##         <dbl> <chr>    <chr>  <chr> <dbl> <chr>  <dbl>  <dbl> <dbl> <chr>  <chr>
## 1           1 SB11201… Female TV     21.4 No      1.58     75  30.0 Priva… Medi…
## 2           2 SB11201… Male   Netw…  21.1 Yes     1.6      80  31.2 Public High 
## 3           3 SB11201… Male   Netw…  20.9 Yes     1.5      64  28.4 Priva… High 
## # ℹ 55 more variables: Enrollment <chr>, Score <dbl>, MotherHeight <chr>,
## #   MotherAge <dbl>, MotherCHD <dbl>, FatherHeight <chr>, FatherAge <dbl>,
## #   FatherCHD <dbl>, Status <chr>, SemAcum <dbl>, Exam1 <dbl>, Exam2 <dbl>,
## #   Exam3 <dbl>, Exam4 <dbl>, ExamAcum <dbl>, Definitive <dbl>, Expense <dbl>,
## #   Income <dbl>, Gas <dbl>, Course <chr>, Law <chr>, Economic <chr>,
## #   Race <chr>, Region <chr>, EMO1 <dbl>, EMO2 <dbl>, EMO3 <dbl>, EMO4 <dbl>,
## #   EMO5 <dbl>, GOAL1 <chr>, GOAL2 <chr>, GOAL3 <chr>, Pre_STAT1 <dbl>, …

4.0.2 Visualizar una parte de la información con tail.

tail(datosCompleto)        #C) Por defecto, solo las últimas 6 observaciones 
tail(datosCompleto, 2)     #D) Solo las últimas 2 observaciones 

(C)

## # A tibble: 6 × 66
##   Observation ID       Gender Like    Age Smoke Height Weight   BMI School SES  
##         <dbl> <chr>    <chr>  <chr> <dbl> <chr>  <dbl>  <dbl> <dbl> <chr>  <chr>
## 1         795 AC31201… Female <NA>   NA   <NA>    1.64     NA  NA   <NA>   Low  
## 2         796 AC31201… Female TV     13.5 <NA>    1.71     78  26.7 Public <NA> 
## 3         797 AC31201… <NA>   Netw…  15.8 No      1.68     53  18.8 Priva… Medi…
## 4         798 AC31201… Male   <NA>   15.7 No     NA        83  NA   <NA>   Low  
## 5         799 AC31201… Female TV     NA   No      1.76     73  23.6 Priva… Low  
## 6         800 AC31201… Male   TV     16.6 No      1.62     70  26.7 Priva… <NA> 
## # ℹ 55 more variables: Enrollment <chr>, Score <dbl>, MotherHeight <chr>,
## #   MotherAge <dbl>, MotherCHD <dbl>, FatherHeight <chr>, FatherAge <dbl>,
## #   FatherCHD <dbl>, Status <chr>, SemAcum <dbl>, Exam1 <dbl>, Exam2 <dbl>,
## #   Exam3 <dbl>, Exam4 <dbl>, ExamAcum <dbl>, Definitive <dbl>, Expense <dbl>,
## #   Income <dbl>, Gas <dbl>, Course <chr>, Law <chr>, Economic <chr>,
## #   Race <chr>, Region <chr>, EMO1 <dbl>, EMO2 <dbl>, EMO3 <dbl>, EMO4 <dbl>,
## #   EMO5 <dbl>, GOAL1 <chr>, GOAL2 <chr>, GOAL3 <chr>, Pre_STAT1 <dbl>, …

(D)

## # A tibble: 2 × 66
##   Observation ID       Gender Like    Age Smoke Height Weight   BMI School SES  
##         <dbl> <chr>    <chr>  <chr> <dbl> <chr>  <dbl>  <dbl> <dbl> <chr>  <chr>
## 1         799 AC31201… Female TV     NA   No      1.76     73  23.6 Priva… Low  
## 2         800 AC31201… Male   TV     16.6 No      1.62     70  26.7 Priva… <NA> 
## # ℹ 55 more variables: Enrollment <chr>, Score <dbl>, MotherHeight <chr>,
## #   MotherAge <dbl>, MotherCHD <dbl>, FatherHeight <chr>, FatherAge <dbl>,
## #   FatherCHD <dbl>, Status <chr>, SemAcum <dbl>, Exam1 <dbl>, Exam2 <dbl>,
## #   Exam3 <dbl>, Exam4 <dbl>, ExamAcum <dbl>, Definitive <dbl>, Expense <dbl>,
## #   Income <dbl>, Gas <dbl>, Course <chr>, Law <chr>, Economic <chr>,
## #   Race <chr>, Region <chr>, EMO1 <dbl>, EMO2 <dbl>, EMO3 <dbl>, EMO4 <dbl>,
## #   EMO5 <dbl>, GOAL1 <chr>, GOAL2 <chr>, GOAL3 <chr>, Pre_STAT1 <dbl>, …

4.0.3 Analizar la estructura del data frame

Con la función str, aplicada al data frame datosCompleto, podemos observar su estructura. Ella proporciona información sobre el tipo de objeto, el número de filas (observaciones) y columnas (variables), junto con información adicional como los nombres de las variables y su tipo seguido de algunas de las observaciones iniciales de cada una de ellas. A manera de ejemplo, se visualiza solo una parte de la información.

str(datosCompleto)   #A) Estructura de los datos
## tibble [800 × 66] (S3: tbl_df/tbl/data.frame)
##  $ Observation : num [1:800] 1 2 3 4 5 6 7 8 9 10 ...
##  $ ID          : chr [1:800] "SB11201910010435" "SB11201910004475" "SB11201910011427" "SB11201910041975" ...
##  $ Gender      : chr [1:800] "Female" "Male" "Male" "Male" ...
##  $ Like        : chr [1:800] "TV" "Network" "Network" "TV" ...
##  $ Age         : num [1:800] 21.4 21.1 20.9 18.4 16.6 ...
##  $ Smoke       : chr [1:800] "No" "Yes" "Yes" "Yes" ...
##  $ Height      : num [1:800] 1.58 1.6 1.5 1.53 1.78 1.65 1.73 1.53 1.64 1.52 ...
##  $ Weight      : num [1:800] 75 80 64 49 82 80 90 55 50 78 ...
##  $ BMI         : num [1:800] 30 31.2 28.4 20.9 25.9 ...
##  $ School      : chr [1:800] "Private" "Public" "Private" "Public" ...
##  $ SES         : chr [1:800] "Medium" "High" "High" "Low" ...
##  $ Enrollment  : chr [1:800] "Credit" "Scholarship" "Scholarship" "Credit" ...
##  $ Score       : num [1:800] 81 78 77 70 68 65 54 50 36 35 ...
##  $ MotherHeight: chr [1:800] "Short_M" "Normal_M" "Normal_M" "Tall_M" ...
##  $ MotherAge   : num [1:800] 41 45 45 45 46 46 47 48 48 48 ...
##  $ MotherCHD   : num [1:800] 0 0 0 0 1 0 0 0 0 1 ...
##  $ FatherHeight: chr [1:800] "Normal_F" "Short_F" "Tall_F" "Short_F" ...
##  $ FatherAge   : num [1:800] 40 43 44 45 45 46 46 48 48 49 ...
##  $ FatherCHD   : num [1:800] 1 1 1 2 1 1 1 1 1 1 ...
##  $ Status      : chr [1:800] "Distinguished" "Distinguished" "Distinguished" "Regular" ...
##  $ SemAcum     : num [1:800] 4.25 2.8 4.15 3.2 3.45 2.75 2.7 4.35 4.3 2.8 ...
##  $ Exam1       : num [1:800] 1.5 2.3 3.4 2.5 3.1 3.8 5 4 2.5 2.4 ...
##  $ Exam2       : num [1:800] 5 4.9 3.6 4.2 3.5 4.4 3 2.3 3.3 2.6 ...
##  $ Exam3       : num [1:800] 5 3.7 2 5 5 4.2 3.5 4.6 3.8 4.3 ...
##  $ Exam4       : num [1:800] 4.5 3.3 1.9 2.5 3 5 3.6 4.3 1.9 5 ...
##  $ ExamAcum    : num [1:800] 16 14.2 10.9 14.2 14.6 17.4 15.1 15.2 11.5 14.3 ...
##  $ Definitive  : num [1:800] 4 3.55 2.73 3.55 3.65 ...
##  $ Expense     : num [1:800] 48.9 72.1 85.2 56.6 64.6 63 40.8 65.4 37.3 63 ...
##  $ Income      : num [1:800] 1.61 2.07 2.84 1.55 2.32 2.1 1.69 2.18 1.71 2.1 ...
##  $ Gas         : num [1:800] 27.4 24.2 22.3 23.1 27.3 ...
##  $ Course      : chr [1:800] "Face-to-Face" "Virtual" "Face-to-Face" "Virtual" ...
##  $ Law         : chr [1:800] "Agree" "Agree" "Agree" "Agree" ...
##  $ Economic    : chr [1:800] "Regular" "Good" "Regular" "Bad" ...
##  $ Race        : chr [1:800] "Ethnic" "Ethnic" "Ethnic" "Ethnic" ...
##  $ Region      : chr [1:800] "North" "Center" "North" "Center" ...
##  $ EMO1        : num [1:800] 1 4 3 4 2 3 2 3 4 2 ...
##  $ EMO2        : num [1:800] 2 4 1 2 1 1 4 1 2 2 ...
##  $ EMO3        : num [1:800] 2 1 3 3 2 4 2 4 3 3 ...
##  $ EMO4        : num [1:800] 1 2 3 1 4 2 3 2 1 1 ...
##  $ EMO5        : num [1:800] 4 1 2 2 2 2 1 1 2 2 ...
##  $ GOAL1       : chr [1:800] "Strongly agree" "Undecided" "Agree" "Agree" ...
##  $ GOAL2       : chr [1:800] "Agree" "Disagree" "Disagree" "Undecided" ...
##  $ GOAL3       : chr [1:800] "Strongly agree" "Disagree" "Agree" "Strongly agree" ...
##  $ Pre_STAT1   : num [1:800] 2 1 5 4 1 4 4 2 2 2 ...
##  $ Pre_STAT2   : num [1:800] 4 1 1 3 4 1 2 3 3 5 ...
##  $ Pre_STAT3   : num [1:800] 2 1 3 1 1 5 4 3 3 2 ...
##  $ Pre_STAT4   : num [1:800] 5 1 1 2 2 3 2 3 2 4 ...
##  $ Post_STAT1  : num [1:800] 4 5 5 3 5 2 3 3 2 5 ...
##  $ Post_STAT2  : num [1:800] 5 1 2 2 3 3 2 3 2 3 ...
##  $ Post_STAT3  : num [1:800] 2 3 3 4 3 5 5 4 5 4 ...
##  $ Post_STAT4  : num [1:800] 2 3 3 5 4 4 3 5 5 1 ...
##  $ Pre_IDARE1  : chr [1:800] "Quite a bit" "Quite a bit" "Quite a bit" "Little" ...
##  $ Pre_IDARE2  : chr [1:800] "Little" "Little" "Little" "Nothing" ...
##  $ Pre_IDARE3  : chr [1:800] "Quite a bit" "A lot" "Quite a bit" "Quite a bit" ...
##  $ Pre_IDARE4  : chr [1:800] "Quite a bit" "Nothing" "Quite a bit" "Quite a bit" ...
##  $ Pre_IDARE5  : chr [1:800] "Little" "Quite a bit" "Little" "Nothing" ...
##  $ Post_IDARE1 : chr [1:800] "A lot" "A little" "Nothing" "Quite a bit" ...
##  $ Post_IDARE2 : chr [1:800] "A lot" "Nothing" "Quite a bit" "A little" ...
##  $ Post_IDARE3 : chr [1:800] "A little" "Quite a bit" "Nothing" "A lot" ...
##  $ Post_IDARE4 : chr [1:800] "Quite a bit" "A lot" "Nothing" "Quite a bit" ...
##  $ Post_IDARE5 : chr [1:800] "A lot" "Quite a bit" "Nothing" "A lot" ...
##  $ PSICO1      : chr [1:800] "Frequently" "Frequently" "Sometimes" "Almost always" ...
##  $ PSICO2      : chr [1:800] "Almost always" "Sometimes" "Sometimes" "Frequently" ...
##  $ PSICO3      : chr [1:800] "Frequently" "Sometimes" "Sometimes" "Frequently" ...
##  $ PSICO4      : chr [1:800] "Almost always" "Frequently" "Frequently" "Almost never" ...
##  $ PSICO5      : chr [1:800] "Almost always" "Frequently" "Sometimes" "Sometimes" ...

4.0.4 Explorar los nombres de las variables

names(datosCompleto)    #A) Muestra los nombres de las columnas (variables).
##  [1] "Observation"  "ID"           "Gender"       "Like"         "Age"         
##  [6] "Smoke"        "Height"       "Weight"       "BMI"          "School"      
## [11] "SES"          "Enrollment"   "Score"        "MotherHeight" "MotherAge"   
## [16] "MotherCHD"    "FatherHeight" "FatherAge"    "FatherCHD"    "Status"      
## [21] "SemAcum"      "Exam1"        "Exam2"        "Exam3"        "Exam4"       
## [26] "ExamAcum"     "Definitive"   "Expense"      "Income"       "Gas"         
## [31] "Course"       "Law"          "Economic"     "Race"         "Region"      
## [36] "EMO1"         "EMO2"         "EMO3"         "EMO4"         "EMO5"        
## [41] "GOAL1"        "GOAL2"        "GOAL3"        "Pre_STAT1"    "Pre_STAT2"   
## [46] "Pre_STAT3"    "Pre_STAT4"    "Post_STAT1"   "Post_STAT2"   "Post_STAT3"  
## [51] "Post_STAT4"   "Pre_IDARE1"   "Pre_IDARE2"   "Pre_IDARE3"   "Pre_IDARE4"  
## [56] "Pre_IDARE5"   "Post_IDARE1"  "Post_IDARE2"  "Post_IDARE3"  "Post_IDARE4" 
## [61] "Post_IDARE5"  "PSICO1"       "PSICO2"       "PSICO3"       "PSICO4"      
## [66] "PSICO5"

4.0.5 Explorar tamaños

length(datosCompleto)   #A) Revisando número de variables del objeto
dim(datosCompleto)      #B Muestra las dimensiones del objeto.
ncol(datosCompleto)     #C) Muestra el número de columnas del objeto.
nrow(datosCompleto)     #D) Muestra el número de filas del objeto.

(A). Número de variables.

## [1] 66

(B). Dimensiones.

## [1] 800  66

(C). Número de columnas.

## [1] 66

(D). Número de filas.

## [1] 800

5 Filtrar con la función corchete

5.0.1 Explicación

Una opción es ejecutando datosCompleto[i,j], donde i yj son las filas y columnas que se va a utilizar o quitar, respectivamente.

  1. Si escribimos datosCompleto[ , j] (sin información para la fila i), indicaremos que queremos construir un data frame que tenga en cuenta todas las filas (observaciones), pero solo la columna (variable) j.

  2. Si escribimos datosCompleto[i, ] (sin información para la columna j), indicaremos que queremos construir un data frame que tenga en cuenta solo la fila (observación) i, pero con todas las columnas (variables).

  3. Las expresiones -i, -j (con el signo menos), indicarán quitar la fila i y/o la columna j.

  4. Lo anterior también es válidos para vectores.

5.0.2 Ejemplos con la función cochete

Ejemplo 1

Supongamos que solo necesito un data frame que contenga solo las observaciones de 1 a 4, con las columnas 2 a 5. Para ello, podemos utilizar la función corchete [] y la función dos puntos :.

Muestra1 <- datosCompleto[1:10,2:7]       # A) Un nuevo data frame 
Muestra1
ID Gender Like Age Smoke Height
SB11201910010435 Female TV 21.36 No 1.58
SB11201910004475 Male Network 21.07 Yes 1.60
SB11201910011427 Male Network 20.92 Yes 1.50
SB11201910041975 Male TV 18.41 Yes 1.53
SB11201910013623 Female TV 16.64 Yes 1.78
SB11201910038122 Female Network 16.02 No 1.65
SB11201910037905 Female TV 19.32 Yes 1.73
SB11201910038140 Female TV 18.62 Yes 1.53
SB11201910038005 Female TV 17.01 Yes 1.64
SB11201910037919 Male TV 19.71 Yes 1.52

Ejemplo 2

A continuación, se muestran algunas filtraciones del data frame Muestra1 (definido en el ejemplo 1):

Muestra1[3,2]           # A) Solo la fila 3 y la columna 2
Muestra1[,2]            # B) Todas las filas (por el espacio en blanco) y solo la columna 2
Muestra1[3,]            # C) Solo la fila 3 y todas las columnas (por el espacio en blanco)
Muestra1[-5, ]          # D) Quitar la fila 5 (por eso el signo menos) y dejar todas las columnas
Muestra1[,-2]           # E) Todas las filas, pero sin la columna 2 (por eso, el signo menos)
Muestra1[,2:5]          # F) Todas las filas, pero solo columnas de 2 a 5 (por eso, dos puntos)
Muestra1[,c(2,5)]       # G) Todas las filas, pero solo columnas 2 y 5 (*c* representa un vector)
Muestra1[1:4,2:5]       # H) Solo las filas de 1 a 4, con las columnas 2 a 5 
Muestra1[1:4,c(2,5)]         # I) Solo las filas de 1 a 4, con las columnas 2 y 5 
Muestra1[c(1,5),c(2,4, 6:8)] # J) Solo las filas 1 y 5, con las columnas 2, 4 y desde 6 a 8
Muestra1[1:5,-c(2,5)]        # K) Solo las filas de 1 a 5, quitando las columnas 2 y 5 
Muestra1[-3,-c(2,5)]         # L) Quitar la filas 3, y las columnas 2 y 5 

6 Tipos de variables

Primero, revisar la estructura del data frame.

str(datosCompleto)   #A) Estructura de los datos

6.0.1 Nominales o caracter

Observe que R lee muchas de las variables como de tipo caracter (por el símbolo chr), pero algunas están mal definidas y, por esta razón, debemos redefinirlas (véase ejemplos siguientes).

Codigo <- datosCompleto$ID     #B) Si es tipo caracter, es correcto)
Edad <- datosCompleto$Age      #C) Si es tipo caracter, es incorrecto (ver ejemplo 4) 
Sexo <- datosCompleto$Gender   #D) Si es tipo caracter, es incorrecto (ver ejemplo 5) 

6.0.2 Numéricas

P1   <- datosCompleto$Exam1 #E) Numérica
P2   <- datosCompleto$Exam2 #F) Numérica
Edad <- datosCompleto$Age   #G) Numérica

6.0.3 Categórica o factor

Sexo <- as.factor(Sexo)  #H) Convirtiendo a factor
class(Sexo)              #I) Sale: "factor"
str(Sexo)                #J) Sale: Factor w/ 2 levels "Female","Masculino": 1 2 2 2 1 1 1 1 1 2 ...
levels(Sexo)             #K) Sale: "Female"  "Masculino"
## [1] "factor"
##  Factor w/ 2 levels "Female","Male": 1 2 2 2 1 1 1 1 1 2 ...
## [1] "Female" "Male"

7 Tablas de frecuencias

7.0.1 Tablas univariadas

Se quiere construir una tabla de frecuencias para analizar la distribución de la variable categórica Sexo. La tabla de frecuencias de interés construída con table es:

Muestra <- datosCompleto[1:100,]

#A) Definiendo y convirtiendo en factor
Sexo <- as.factor(Muestra$Gender)  

#B) Calcular tabla de frecuencias
Tabla1 <- table(Sexo)
Tabla1                                   
## Sexo
## Female   Male 
##     49     51
#A) Definiendo y convirtiendo en factor
Fuma <- as.factor(Muestra$Smoke)  

#B) Calcular tabla de frecuencias
Tabla2 <- table(Fuma)
Tabla2                                   
## Fuma
##  No Yes 
##  45  55

7.0.2 Tablas cruzadas o de contingencias

Supongamos que se quiere construir una tabla de frecuencias para analizar la distribución conjunta de las variables categóricas Sexo y Fuma, que son las mismas en comparación con la sección anterior, las cuales se deben definir como factor. La tabla de frecuencias de interés construída con table es:

#B) Tabla de frecuencias 
Tabla3 <- table(Sexo, Fuma)
Tabla3       
##         Fuma
## Sexo     No Yes
##   Female 21  28
##   Male   24  27

8 Diagramas de barras (caso univariado)

Para crear un diagrama de barras, se necesita crear una tabla de frecuencias (con la función table) y luego aplicar la función ggplot a esta tabla. El diagrama de barras es:

ggplot(Muestra, aes(x = Sexo)) +                            #1
  #geom_bar() +                                             #2
  geom_bar(width=0.5, colour="red", fill="skyblue") +       #2 
  
  labs(x="Sexo",y= "Frecuencia")  +              #3               
  ylim(c(0,60)) +                               #4
  #xlim(c(0,300)) +                              #4
  ggtitle("Diagrama de barras")  +               #5
  
  # theme_bw() +                                 #6
  theme_bw(base_size = 12) +                     #6
  #coord_flip() +                                #7
  
  geom_text(aes(label=..count..), stat='count',  #8
            position=position_dodge(0.9), 
            vjust=-0.5, 
            size=5.0
            ) + 
  facet_wrap(~"Variable Sexo")                   #9

Descripción de las capas en el ejemplo 1 (que se agregan con el signo “+”)

Consideremos el código presentado en el ejemplo 1.

  1. En esta capa, se especifica el data frame y, con aes(x=…, y=…, fill=…), las variables que se van a utilizar.

  2. Se crea el diagrama de barras con geom_bar(). Si no se escriben argumentos dentro de los paréntesis, sale en escala de grises y negro. Para cambiar el ancho de las barras, así como los colores de su borde e interior se utilizan las opciones width, colour y fill como argumentos de geom_bar.

  3. Con labs(), se asignan los nombres de los ejes X y Y (y el de las leyendas, si las hay). Con y=““ (sin nada adentro de las comillas), el nombre en el eje Y no aparecerá.

  4. Para ajustar la escala del eje Y, se utiliza ylim(). De manera análoga, se escribe xlim() cuando X sea continua.

  5. Se utiliza ggtitle para agregar un título del diagrama.

  6. Para cambiar el fondo del diagrama, se agrega la capa theme_bw(). En este caso, el fondo del diagrama será a blanco y negro. Para cambiar el tamaño de las fuentes del diagrama (por ejemplo, a 12 puntos), se escribe la opción base_size=12 en theme_bw().

  7. Para rotar horizontalmente el diagrama, se agrega la capa coord_flip().

  8. Para agregar sobre las barras las etiquetas de las frecuencias, se agrega la capa geom_text(). Las frecuencias de cada barra se etiquetan mediante el uso de aes(label=..count..) para stat=“count”. Con position=position_dodge y vjust se ajustan las posiciones horizontal y vertical de estas etiquetas. La opción size es el tamaño de la fuente de estas etiquetas.

  9. Para ajustar las facetas de forma rectangular se agrega la capa facet_wrap. La opción ggtitle() se puede quitar si así lo desea. En este caso, si reemplaza facet_wrap por facet_grid, obtenemos el mismo diagrama.

9 Diagrama de barras (caso bivariado): primer caso

9.0.1 Ejemplo 1 (Colegio versus Fuma)

Supongamos que se quiere analizar la distribución de la variable “SEXO” (variable auxiliar) dentro de cada nivel de la variable “FUMA” (grupo de referencia). En este caso, el diagrama de barras de interés se obtiene así:

ggplot(Muestra, aes(Fuma,  fill=Sexo)) +      #1
  geom_bar()+                                          #2
  
  labs(x= "Fuma",  y="Frecuencias", fill="Sexo") +  #3 
  
  ylim(c(0,60))  +                  #4   
  #xlim(c(0,300)) +                  #4
  
  ggtitle("Diagrama de barras") +    #5
  #coord_flip() +                    #6
  #theme_bw() +                      #7
  theme_bw(base_size = 12)           #7

Ejemplo 2: Descripción de las capas en el ejemplo 1 (que se agregan con el signo “+”)

Consideremos el código presentado en el ejemplo 1.

  1. En esta capa, se especifica el data frame. En la estetica aes, se indica la variable o grupo de referencia y, con la opción fill, la variable auxiliar (la que se quiere analizar o distribuir).

  2. Se crea el diagrama de barras con geom_bar(). Si no se escriben argumentos dentro de los paréntesis, las barras salen en position = stack. Para cambiar el ancho de las barras, el color de su borde y la posición de las barras, se utilizan las opciones width y colour y position como argumentos de geom_bar. Por ejemplo, con position=“dodge” salen una al lado de la otra.

  3. Con labs(), se asignan los nombres de los ejes X y Y (y el de las leyendas). Con y=““ (sin nada adentro de las comillas), el nombre en el eje Y no aparecerá.

  4. Para ajustar la escala del eje Y, se utiliza ylim(). De manera análoga, se escribe xlim() cuando X sea continua.

  5. Se utiliza ggtitle para agregar un título del diagrama.

  6. Para rotar horizontalmente el diagrama, se agrega la capa coord_flip().

  7. Para cambiar el fondo del diagrama, se agrega la capa theme_bw(). En este caso, el fondo del diagrama será a blanco y negro. Para cambiar el tamaño de las fuentes del diagrama (por ejemplo, a 12 puntos), se escribe la opción base_size=12 en theme_bw().

9.0.2 Ejemplo 3 (Otra forma de construir el mismo diagrama)

Observe el código de abajo (las opciones numeradas se explican en el ejemplo 4). Compare el del ejemplo 1.

ggplot(Muestra, aes(Fuma,  fill=Sexo)) +      
  geom_bar(position="dodge",colour="black") +
  
  labs(x= "Fuma",  y="Frecuencias", fill="Sexo") +
  ylim(c(0,30)) +
  #xlim(c(0,300)) +   
  
  ggtitle("Diagrama de barras") + 
  
  #theme_bw() +                     
  theme_bw(base_size = 12) +          
  #coord_flip() + 
  
  #guides(fill=FALSE)+                                #8                                    
  scale_fill_manual(values = c("orange","green")) +   #9
  
  geom_text(aes(label=..count..), stat='count',       #10
            position=position_dodge(0.9),
            vjust=-0.5, 
            size=5.0
            )+
  
  facet_wrap(~"Sexo por fumadores y no fumadores")  #11

Ejemplo 4 (descripción de las capas en el ejemplo 3)

Consideremos el código presentado en el ejemplo 3.

  1. Para hacer invisible las leyendas, se utiliza la opción fill=FALSE.

  2. Cambiar los colores de las barras.

  3. Para agregar sobre las barras las etiquetas de las frecuencias, se agrega la capa geom_text(). Las frecuencias de cada barra se etiquetan mediante el uso de aes(label=..count..) para stat=“count”. Con position=position_dodge y vjust se ajustan las posiciones horizontal y vertical de estas etiquetas. La opción size es el tamaño de la fuente de estas etiquetas.

  4. Para ajustar las facetas de forma rectangular se agrega la capa facet_wrap. La opción ggtitle() se puede quitar si así lo desea. En este caso, si reemplaza facet_wrap por facet_grid, obtenemos el mismo diagrama.

10 Diagrama de barras (caso bivariado): segundo caso

10.0.1 Ejemplo 5 (dentro de mujeres: Estatura versus Fuma)

Supongamos que, dentro del grupo de las MUJERES, se quiere analizar la distribución de “ESTATURA” dentro de “FUMA”. Para ello, se puede construir el diagrama de barras correspondiente de la siguiente manera (el código No.12 se usa para filtrar la base de datos al grupo de las mujeres):

Muestra %>% filter(Gender=="Female") %>%    #12
  
ggplot(., aes(Smoke,  fill=MotherHeight)) + 
  geom_bar(position="dodge",colour="black") +
  
  labs(x= "Fuma", y="Frecuencias", fill="Estatura") +
  ylim(c(0,15)) +
  #xlim(c(0,300)) + 
  
  ggtitle("Diagrama de barras en el grupo de las mujeres") +   
  #theme_bw() + 
  theme_bw(base_size = 14) +
  #coord_flip() +
  
  #guides(fill=FALSE)+
  #scale_fill_manual(values = c("red","blue", "orange")) +
  
  geom_text(aes(label=..count..),stat='count',
            position=position_dodge(0.9),
            vjust=-0.5, 
            size=5.0) +
  
  facet_wrap(~"Estatura por fumadores y no fumadores")

10.0.2 Ejemplo 6 (dentro de hombres: Estatura versus Fuma)

Supongamos que, dentro del grupo de los HOMBRES, se quiere analizar la distribución de “ESTATURA” dentro de “FUMA”. Para ello, se puede construir el diagrama de barras correspondiente de la siguiente manera (el código No.13 se usa para filtrar la base de datos al grupo de los hombres):

Muestra %>% filter(Gender=="Male") %>%    #13
  
ggplot(., aes(Smoke,  fill=MotherHeight)) + 
  geom_bar(position="dodge",colour="black") +
  
  labs(x= "Fuma", y="Frecuencias", fill="Estatura") +
  ylim(c(0,15))+
  #xlim(c(0,300)) + 
  
  ggtitle("Diagrama de barras en el grupo de los hombres") +   
  #theme_bw() + 
  theme_bw(base_size = 14) +
  #coord_flip() +
  
  #guides(fill=FALSE) +
  scale_fill_manual(values = c("red","blue", "green"))+
  geom_text(aes(label=..count..),stat='count',
            position=position_dodge(0.9),
            vjust=-0.5, 
            size=5.0) +
  
  facet_wrap(~"Estatura por fumadores y no fumadores")

11 Diagrama de barras (caso bivariado): tercer caso

11.0.1 Ejemplo 7 (construyendo, primero, una tabla cruzada)

Otra forma de generar diagramas de barras es construir primero la tabla de frecuencias correspondiente. Véase el código de abajo. Primero, se agrupa por Fuma y Sexo (No. 14). Luego, calculan los totales y porcentajes de interés (No.15 y 16). Finalmente, cualquiera variable de interés, se puede ordenar en forma ascendente con la opción arrange(variable) o en forma descendente con arrange(desc(variable)) (No.17).

Tabla <- Muestra %>%
  dplyr::group_by(Smoke, Gender) %>%                               #14
  dplyr::summarise(Total = n()) %>%                                #15
  dplyr::mutate(Porcentaje = round(Total/sum(Total)*100, 1)) %>%   #16
  
  dplyr::arrange(Smoke)                                            #17
  #dplyr::arrange(desc(Fuma))                                      #17  
  #dplyr::arrange(Sexo)                                            #17
  #dplyr::arrange(desc(Sexo))                                      #17
Tabla
Smoke Gender Total Porcentaje
No Female 21 46.7
No Male 24 53.3
Yes Female 28 50.9
Yes Male 27 49.1

Con ayuda de la tabla anterior, procedemos a construir el diagrama:

ggplot(Tabla, aes(x = Smoke, y=Total, fill=Gender) ) + 
  geom_bar(width = 0.9,stat="identity",                 #18
              position = position_dodge()               #19  
           ) +  
  ylim(c(0,40))+
  #xlim(c(0,300)) +                  
  #ggtitle("Un título") + 
  labs(x="Fuma", y= "Frecuencias \n (Porcentajes)") +   #20
  labs(fill = "Sexo") +                                 #21
  
  scale_fill_manual(values = c("pink",  "skyblue")) +   #22
  
  geom_text(aes(label=paste0(Total," ", "", "(", Porcentaje, "%", ")")),  #23
            vjust=-0.9, 
            color="black", 
            hjust=0.5,
            # define text position and size
            position = position_dodge(0.9),  
            angle=0, 
            size=4.0
            )+
  
  scale_fill_discrete(name = "Sexo", labels = c("Mujer", "Hombre")) +     #24
  
  theme(axis.text.x = element_text(angle = 0, vjust = 1, hjust=1)) +      #25
  theme_bw(base_size = 14) +
  #coord_flip() +                                                         #26
  facet_wrap(~"Sexo versus Fuma")

Ejemplo 8 (descripción de las capas en el ejemplo 7)

Consideremos el código presentado en el ejemplo 7.

  1. Las alturas de las barras representan comúnmente una de dos cosas: un recuento de casos en cada grupo o los valores en una columna del marco de datos. Por defecto, geom_bar usa stat = “bin”. Esto hace que la altura de cada barra sea igual al número de casos de cada grupo. Si desea que las alturas de las barras representen valores en los datos, usamos stat = “identity”. En este sentido, estamos asignando un valor a la estética Y.

  2. De forma predeterminada, varias X que se produzcan en el mismo lugar se apilarán una encima de la otra por position_stack. Si desea que se ubiquen una al lado de la otra, se utiliza position_dodge. Finalmente, position_fill muestra las proporciones relativas en cada X al apilar las barras y, luego, estirarlas o aplastarlas a la misma altura.

  3. Títulos de los ejes X y Y. Observe que se ha utilizado “” para quebrar la línea de uno de los títulos.

  4. Para modificar el título de las leyendas.

  5. Para editar los título de las leyendas y de los niveles de la variable.

  6. En geom_text() se han agregado las frecuencias y los porcentajes. Para ello, se ha utilizado la función paste0(), colocando los argumentos que quiero pegar, separados de coma. Con angle se le puede dar rotación al texto.

  7. Para editar los título de las leyendas y de los niveles de la variable. Si se escoge esta capa, inmediatamente se anula el argumento que se anote en la opción explicada en el punto 21.

  8. Para rotar y ajustar etiquetas en el eje X.

  9. Para rotar horizontalmente el diagrama, se agrega la capa coord_flip().

11.0.2 Ejemplo 9 (con tabla cruzada y coord_flip)

Compare el código de abajo y el diagrama resultante aquéllos del ejemplo7 (las descripciones de las capas se dejan al lector).

ggplot(Tabla, aes(x = Smoke, y=Total, fill=Gender) ) + 
  geom_bar(width = 0.9,stat="identity",                 
              position = position_dodge()                 
           ) +  
  ylim(c(0,50))+
  #xlim(c(0,300)) +                  
  
  #ggtitle("Un título") + 
  
  labs(x="Fuma", y= "Frecuencias \n (Porcentajes)") +   
  labs(fill = "Sexo") +                                 
  
  scale_fill_manual(values = c("pink",  "skyblue")) +   
  
  geom_text(aes(label=paste0(Total," ", "", "(", Porcentaje, "%", ")")),        #27
            #vjust=-0.9,                       #28
            color="black",                     #29
            hjust=-0.15,                       #30   
            # define text position and size    #31
            position = position_dodge(0.9),    #32
            angle=90,                          #33
            size=4.0                           #34
            )+
  
  scale_fill_discrete(name = "Sexo", labels = c("Female", "Male")) +          #35
  
  theme(axis.text.x = element_text(angle = 45,   #36
                                   vjust = 1,    #37
                                   hjust=1,      #38
                                   size=14)      #39
        ) +    
  #theme_bw(base_size = 14) +
  #coord_flip() +
  facet_wrap(~"Sexo versus Fuma") 

12 Diagrama de barras (caso bivariado): variados

12.0.1 Ejemplo 10: position_stack(reverse = FALSE)

Considere el código de abajo y el diagrama resultante (las descripciones de las capas se dejan al lector). Compare con el ejemplo 5.

Muestra %>% filter(Gender=="Female") %>%    
  
ggplot(., aes(Smoke)) + 
  
  geom_bar(aes(fill = MotherHeight),                        #40
           #position = position_stack(reverse = TRUE),  #41
           colour="brown"                               #42
           ) +
  
  labs(x= "Fuma", y="Frecuencias", fill="Estatura") +
  ylim(c(0,40))+
  #xlim(c(0,300)) + 
  
  ggtitle("Diagrama de barras en el grupo de los hombres") +   
  #theme_bw() + 
  theme_bw(base_size = 14) +
  theme(legend.position = "top") +   #43
  
  coord_flip() +                     #44
  
  #guides(fill=FALSE) +
  scale_fill_manual(values = c("red","blue", "green"))+
  geom_text(aes(label=..count..),stat='count',
            position=position_dodge(0.9),
            hjust=-0.6, 
            size=5.0) +
  
  facet_wrap(~"Estatura por fumadores y no fumadores")

12.0.2 Ejemplo 11: position_stack(reverse = TRUE)

Considere el código de abajo y el diagrama resultante (las descripciones de las capas se dejan al lector). Compare con el ejemplo 10.

Muestra %>% filter(Gender=="Female") %>%    
  
ggplot(., aes(Smoke)) + 
  
  geom_bar(aes(fill = MotherHeight),                        #44
           position = position_stack(reverse = TRUE),   #45
           colour="brown"                               #46
           ) +
  
  labs(x= "Fuma", y="Frecuencias", fill="Estatura") +
  ylim(c(0,40))+
  #xlim(c(0,300)) + 
  
  ggtitle("Diagrama de barras en el grupo de los hombres") +   
  #theme_bw() + 
  theme_bw(base_size = 14) +
  theme(legend.position = "top") +   #47
  
  coord_flip() +                     #48
  
  #guides(fill=FALSE) +
  scale_fill_manual(values = c("red","blue", "green"))+
  geom_text(aes(label=..count..),stat='count',
            position=position_dodge(0.9),
            hjust=-0.6, 
            size=5.0) +
  
  facet_wrap(~"Estatura por fumadores y no fumadores")

13 Medidas estadísticas

Ahora, vamos a revisar las medidas para una variable numérica en particular.

13.0.1 Caso 1 (la variable numérica no tiene valores faltantes)

Consideremos algunas notas del tercer parcial (Exam3).

Muestra2 <- datosCompleto[1:100,] 
x <- as.numeric(Muestra2$Exam3)  # A) Convirtiendo la variable a numérica
x
##   [1] 5.0 3.7 2.0 5.0 5.0 4.2 3.5 4.6 3.8 4.3 3.0 3.8 3.4 3.3 3.5 4.5 3.6 4.0
##  [19] 3.4 4.0 4.2 3.5 3.7 4.0 4.0 3.2 2.9 2.9 3.0 3.3 2.8 2.4 3.8 3.3 3.2 2.2
##  [37] 2.6 3.2 3.3 1.2 4.2 2.4 5.0 2.8 3.0 3.8 3.2 1.5 2.6 3.8 3.2 3.3 1.4 3.8
##  [55] 1.4 3.6 3.6 2.4 2.8 3.1 2.4 1.8 1.6 3.3 4.4 1.0 4.5 2.0 4.2 4.2 3.1 2.3
##  [73] 2.6 2.7 2.4 2.2 2.8 2.4 1.9 2.4 1.7 2.9 2.4 2.2 2.8 3.2 3.1 2.7 2.5 3.5
##  [91] 3.3 2.1 3.3 2.1 3.7 5.0 3.7 2.0 5.0 5.0

Algunos estadísticos de esta variable son:

min(x)          #B) Mínimo
max(x)          #C) Máximo
range(x)        #D) Obtenemos (min, max)
length(x)       #E) Tamaño
sum(x)          #F) Suma los valores de los datos

mean(x)         #G) Media aritmética
median(x)       #H) Mediana

var(x)          #I) Varianza muestral
sqrt(var(x))    #J) Desviación estándar muestral (una forma)
sd(x)           #K) Desviación estándar muestral (otra forma)

skewness(x)     #L) Sesgo

quantile(x, probs=0.80)    #M) 80-ésimo percentil o percentil 85
quantile(x, probs=0.25)    #N) Primer cuartil o 25-ésimo percentil
quantile(x, probs=0.50)    #O) Segundo cuartil o 50-ésimo percentil o mediana
quantile(x, probs=0.75)    #P) Tercer cuartil o 75-ésimo percentil
  • B) Mínimo: 1
  • C) Máximo: 5
  • D) Rango (min, max): 1 - 5
  • E) Tamaño: 100
  • F) Suma: 317.6
  • G) Media: 3.176
  • H) Mediana: 3.2
  • I) Varianza: 0.8885091
  • J) Desviación estándar (sqrt): 0.9426076
  • K) Desviación estándar (sd): 0.9426076
  • L) Sesgo: 0.01846742
  • M) Percentil 80: 4
  • N) Q1 (primer cuartil): 2.4
  • O) Q2 (Mediana): 3.2
  • P) Q3 (tercer cuartil): 3.8

13.0.2 Caso 2. La variable contiene valores faltantes (NA)

Supongamos que algunos estudiantes no presentaron el examen.

Muestra3 <- datosCompleto[700:800,] 
y <- as.numeric(Muestra3$Exam3)
y
##   [1] 1.90 2.20 2.65 3.10 2.00 4.25 3.90 3.50 3.70 2.15 4.50 3.90 1.15 2.90 2.35
##  [16] 3.20 4.45 4.40 4.95 5.00 4.90 3.75 3.15 4.85 1.90 3.50 2.15 4.90 3.05 2.95
##  [31] 2.55 3.70 4.15 4.00 3.80 4.20 2.45 1.65 3.05 3.45 1.35 4.20 4.75 4.40 1.55
##  [46] 2.40 3.50 3.80 1.45 2.50 1.85 3.55 3.60 3.15 3.55 2.75 1.70 1.85 4.05 4.30
##  [61] 2.00 4.75 4.70 2.25 2.00 1.65 1.35 4.10 3.70 3.15 3.80 2.15 4.10 2.40 4.75
##  [76] 3.35 2.50 3.80 3.60 4.30 1.25 2.45 4.95 1.00 3.15 1.15 3.55 1.90 3.30 3.95
##  [91] 1.95 3.85 4.70 2.90 2.80 2.65 5.00 4.25 4.85   NA 2.05

Si ejecutamos

mean(y)

obtendremos

## [1] NA

porque existe al menos un dato faltante (NA). La solución consiste en agregar el argumento

na.rm = TRUE

que significa remove missing values.

min(y, na.rm = TRUE)          #B) Mínimo
max(y, na.rm = TRUE)          #C) Máximo
range(y, na.rm = TRUE)        #D) Obtenemos (min, max)
length(y)                     #E) Tamaño
sum(y, na.rm = TRUE)          #F) Suma los valores de los datos

mean(y, na.rm = TRUE)         #G) Media aritmética
median(y, na.rm = TRUE)       #H) Mediana

var(y, na.rm = TRUE)          #I) Varianza muestral
sqrt(var(y, na.rm = TRUE))    #J) Desviación estándar muestral (una forma)
sd(y, na.rm = TRUE)           #K) Desviación estándar muestral (otra forma)

skewness(y, na.rm = TRUE)     #L) Sesgo

quantile(y, probs=0.80, na.rm = TRUE)    #M) 80-ésimo percentil o percentil 85
quantile(y, probs=0.25, na.rm = TRUE)    #N) Primer cuartil o 25-ésimo percentil
quantile(y, probs=0.50, na.rm = TRUE)    #O) Segundo cuartil o 50-ésimo percentil o mediana
quantile(y, probs=0.75, na.rm = TRUE)    #P) Tercer cuartil o 75-ésimo percentil
  • B) Mínimo: 1
  • C) Máximo: 5
  • D) Rango (min, max): 1 - 5
  • E) Tamaño: 101
  • F) Suma: 320.55
  • G) Media: 3.2055
  • H) Mediana: 3.325
  • I) Varianza: 1.225803
  • J) Desviación estándar (sqrt): 1.10716
  • K) Desviación estándar (sd): 1.10716
  • L) Sesgo: -0.1463073
  • M) Percentil 80: 4.25
  • N) Q1 (primer cuartil): 2.2375
  • O) Q2 (Mediana): 3.325
  • P) Q3 (tercer cuartil): 4.1

13.0.3 Caso 2. ¿Y qué pasa con length()?

Aquí hay una diferencia importante que vale la pena explicar.

length(y)

Cuenta todos los elementos del vector.

13.0.4 Caso 2. ¿Y cómo contar los valores faltantes?

Si queremos saber cuántos datos válidos tenemos:

sum(!is.na(y))
## [1] 100

o, de forma equivalente,

length(na.omit(y))
## [1] 100

También se puede ejecutar:

sum(is.na(y))
## [1] 1

13.0.5 Nota

Cuando una variable contiene valores faltantes (NA), la mayoría de las funciones estadísticas devuelven NA como resultado. Para ignorar dichos valores debe utilizarse el argumento na.rm = TRUE. Las únicas excepciones de este ejemplo son funciones como length(), que cuenta todos los elementos del vector (incluidos los NA), por lo que, si se desea conocer únicamente el número de observaciones válidas, puede utilizarse sum(!is.na(x)).

14 Medidas en dos etapas

Son las medidas calculadas en una partición de la muestra, ubicada en un segundo nivel. Se pueden calcular de dos maneras:

Caso 1: Medidas en todos los niveles categóricos.

Caso 2: Medidas dentro de un nivel categórico.

Explicaremos, a continuación, cada uno de estos casos.

14.0.1 Caso 1: Medidas en todos los niveles categóricos

Supongamos que se quiere calcular una medida (digamos, la media) para cada uno de los niveles de una variable categórica (digamos los colegios privados). Entonces aplicamos la función “tapply” para realizar la operación corespondiente.

La línea de comando básica es:

tapply(Numérica, Categórica, Medida)

Como se observa, esta función tiene tres argumentos:

  1. El primero, la variable numérica a la que queremos aplicar la función.
  2. El segundo, el factor para cada uno de cuyos niveles vamos a calcular la función.
  3. El tercero, la función que queremos calcular (en nuestro ejemplo, la media).

Ejemplo.

La media de las calificaciones del tercer parcial para los hombres y para las mujeres se halla de la siguiente manera:

tapply(x, Muestra$Gender, mean)  #A) Media de Exam3 tanto en hombres como en mujeres
##   Female     Male 
## 3.208163 3.145098

14.0.2 Medida dentro de un nivel categórico

Supongamos que se quiere calcular una medida (digamos, la media de Exam3) para un nivel específico de una variable categórica (digamos, Female). Primero, se aplica la función filter de la librería dplyr para filtrar y luego se obtiene la medida de interés.

Ejemplo.

a) El promedio de las notas del tercer examen en las mujeres fue:

Muestra%>%  filter(Gender=="Female") -> mujeres  #A) Definición del grupo 
P3m <- as.numeric(mujeres$Exam3)                 #B) Parcial 3 dentro del grupo
mean(P3m)                                       #C) Media de P3  dentro del grupo
## [1] 3.208163

b) El promedio de las notas del tercer examen en los hombres fue:

Muestra%>%  filter(Gender=="Male") -> hombres  #A) Definición del grupo 
P3h <- as.numeric(hombres$Exam3)               #B) Parcial 3 dentro del grupo
mean(P3h)                                     #C) Media de P3  dentro del grupo
## [1] 3.145098

Compare con los resultados con los del ejemplo anterior.

15 Medidas en tres etapas

Consideremos solo un grupo de interés (digamos, Female). Supongamos que, dentro de ese grupo, se quiere calcular una medida (digamos, la media de Exam3) para cada uno de los niveles de otra variable categórica (digamos, Smoke). Entonces, se procede como se muestra a continuación (se le han agregado otras medidas a manera de ejemplo):

datosCompleto %>%   filter(Gender=="Female") %>%   group_by(Smoke)  %>% 
  
             summarise(n = length(as.numeric(Exam3)),
             Promedio = mean(as.numeric(Exam3)),
             Desviacion = sd(as.numeric(Exam3)),
             Minimo = min(as.numeric(Exam3)),
             Maximo = max(as.numeric(Exam3))) 
## # A tibble: 3 × 6
##   Smoke     n Promedio Desviacion Minimo Maximo
##   <chr> <int>    <dbl>      <dbl>  <dbl>  <dbl>
## 1 No      239    NA         NA     NA        NA
## 2 Yes     169     3.19       1.04   1         5
## 3 <NA>      2     3.82       1.66   2.65      5

16 Ejercicios

Realizar los ejercicios que se indican abajo. Es obligatorio explicar e interpretar los resultados hallados.

  1. Considerar solamente las observaciones que van desde la 2 hasta la 193 y las variables que van desde la 5 hasta la 15 y las variables 20 y 35.

    1. Definir como MisDatos al data frame con estas observaciones y variables y utilizarlo en los incisos que se indican abajo.

    2. Visualizar una parte de la información.

    3. Revisar la estructura de estos nuevos datos.

    4. Explorar los nombres de las variables.

    5. Explorar tamaños.

    6. Revisar los tipos de todas las variables del nuevo data frame.

    7. Construir una tabla de frecuencias para una variable categórica y su correspondiente diagrama de barras.

    8. Construir una tabla de frecuencias cruzadas entre dos variables categóricas y su correspondiente diagrama de barras

    9. Considerar una sola variable numérica (que no sea Exam3, ni Age) y calcular las medidas estadísticas indicadas en este documento. Interpretar cada una de ellas.

  2. Considerar solamente las observaciones que van desde la 4 hasta la 195 y las variables que van desde la 6 hasta la 17 y las variables 21 y 40. Repetir el ejercicio 1.

  3. Considerar solamente las observaciones que van desde la 6 hasta la 198 y las variables que van desde la 7 hasta la 19 y las variables 20 y 46. Repetir el ejercicio 1.

  4. Considerar solamente las observaciones que van desde la 9 hasta la 200 y las variables que van desde la 12 hasta la 23 y las variables 25 y 27. Repetir el ejercicio 1.

  5. Considerar solamente las observaciones que van desde la 12 hasta la 210 y las variables que van desde la 13 hasta la 22 y las variables 24 y 38. Repetir el ejercicio 1.

17 Actividad práctica No. 1

17.0.1 Tema

Análisis exploratorio de datos.

17.0.2 Objetivo

Aplicar las herramientas básicas de exploración de datos estudiadas en clase para describir las características generales de un conjunto de datos, identificar el tipo de las variables y presentar información mediante tablas y gráficos.

17.0.3 Base de datos

Utilice el conjunto de datos survey del paquete lsm, el mismo empleado durante las clases.

17.0.4 Lineamientos

Los lineamientos generales para la elaboración, entrega y evaluación de esta actividad se encuentran disponibles en:

https://rpubs.com/hllinas/R_Lineamiento_EstInf

No es necesario repetir dichos lineamientos en este documento.

17.0.5 Actividades

  1. Conociendo la base de datos.

    Responda las siguientes preguntas:

    • ¿Cuántas observaciones tiene la base de datos?

    • ¿Cuántas variables contiene?

    • Muestre los nombres de todas las variables.

    • Seleccione cinco variables que considere de interés e indique:

      • nombre;

      • tipo de variable (numérica, categórica, carácter, etc.);

      • breve descripción de su significado.

  1. Selección de una muestra.

    • Construya un nuevo data frame denominado Muestra que contenga más de 100 observaciones de la base de datos.

    • A partir de esta muestra, realice todo el análisis solicitado en las siguientes secciones.

  1. Variables categóricas

    Seleccione tres variables categóricas diferentes. Para cada una:

    • construya la tabla de frecuencias;

    • calcule las frecuencias relativas;

    • interprete los resultados.

  1. Tabla de contingencia.

    Seleccione las tres variables categóricas anteriores y construya tablas de contingencia. Responda:

    • ¿Existe alguna diferencia importante entre las distribuciones observadas?

    • ¿Qué conclusiones preliminares pueden obtenerse?

  1. Diagramas de barras

    Construya:

    • un diagrama de barras para cada variable categórica;

    • un diagrama de barras comparativo utilizando ambas variables.

    Personalice los gráficos incluyendo:

    • título;

    • nombres de los ejes;

    • etiquetas de frecuencia;

    • tema gráfico.

  1. Interpretación

    Escriba una discusión (entre dos y tres párrafos) donde responda, entre otras, las siguientes preguntas:

    • ¿Qué características generales presenta la muestra?

    • ¿Qué categorías predominan en las variables analizadas?

    • ¿Los gráficos ayudan a comprender mejor la información? Explique.

    • ¿Qué limitaciones tiene realizar únicamente un análisis exploratorio?

17.0.6 Recomendaciones

  • Todas las tablas y figuras deberán estar numeradas y tituladas.

  • Todas las afirmaciones deberán estar sustentadas con los resultados obtenidos.

  • El código deberá estar correctamente documentado mediante comentarios.

  • Recuerde consultar los lineamientos generales del curso para conocer los requisitos de reproducibilidad, entrega y evaluación.

Bibliografía

  1. LLinás, H. (2006); Estadística inferencial. Barranquilla: Editorial Universidad del Norte.

  2. Consultar el documento RPubs :: Enlace y materiales de ayuda.

 

 
If you found any ERRORS or have SUGGESTIONS, please report them to my email. Thanks.