29/07/26
Abstract
La teoría mencionada puede revisarse en el capítulo 1 de mis notas de clase que aparecen en el siguiente documento: 1.1. Estadística básica. En Rpubs:: toc se pueden ver otros documentos de posible interés.
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)
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).
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
Para visualizar solo una parte de los datos, se pueden utilizar las
funciones head y/o tail.
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>, …
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>, …
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" ...
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"
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
Una opción es ejecutando datosCompleto[i,j], donde
i yj son las filas y columnas que se va a
utilizar o quitar, respectivamente.
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.
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).
Las expresiones -i, -j (con el signo
menos), indicarán quitar la fila i y/o la columna
j.
Lo anterior también es válidos para vectores.
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
Primero, revisar la estructura del data frame.
str(datosCompleto) #A) Estructura de los datos
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)
P1 <- datosCompleto$Exam1 #E) Numérica
P2 <- datosCompleto$Exam2 #F) Numérica
Edad <- datosCompleto$Age #G) Numérica
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"
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
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
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.
En esta capa, se especifica el data frame y, con aes(x=…, y=…, fill=…), las variables que se van a utilizar.
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.
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á.
Para ajustar la escala del eje Y, se utiliza ylim(). De manera análoga, se escribe xlim() cuando X sea continua.
Se utiliza ggtitle para agregar un título del diagrama.
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().
Para rotar horizontalmente el diagrama, se agrega la capa coord_flip().
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.
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.
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.
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).
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.
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á.
Para ajustar la escala del eje Y, se utiliza ylim(). De manera análoga, se escribe xlim() cuando X sea continua.
Se utiliza ggtitle para agregar un título del diagrama.
Para rotar horizontalmente el diagrama, se agrega la capa coord_flip().
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().
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.
Para hacer invisible las leyendas, se utiliza la opción fill=FALSE.
Cambiar los colores de las barras.
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.
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.
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")
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")
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.
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.
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.
Títulos de los ejes X y Y. Observe que se ha utilizado “” para quebrar la línea de uno de los títulos.
Para modificar el título de las leyendas.
Para editar los título de las leyendas y de los niveles de la variable.
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.
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.
Para rotar y ajustar etiquetas en el eje X.
Para rotar horizontalmente el diagrama, se agrega la capa 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")
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")
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")
Ahora, vamos a revisar las medidas para una variable numérica en particular.
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
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
length()?Aquí hay una diferencia importante que vale la pena explicar.
length(y)
Cuenta todos los elementos del vector.
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
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)).
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.
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:
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
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.
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
Realizar los ejercicios que se indican abajo. Es obligatorio explicar e interpretar los resultados hallados.
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.
Definir como MisDatos al data frame con estas
observaciones y variables y utilizarlo en los incisos que se indican
abajo.
Visualizar una parte de la información.
Revisar la estructura de estos nuevos datos.
Explorar los nombres de las variables.
Explorar tamaños.
Revisar los tipos de todas las variables del nuevo data frame.
Construir una tabla de frecuencias para una variable categórica y su correspondiente diagrama de barras.
Construir una tabla de frecuencias cruzadas entre dos variables categóricas y su correspondiente diagrama de barras
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.
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.
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.
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.
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.
Análisis exploratorio de datos.
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.
Utilice el conjunto de datos survey del
paquete lsm, el mismo empleado durante las
clases.
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.
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.
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.
Variables categóricas
Seleccione tres variables categóricas diferentes. Para cada una:
construya la tabla de frecuencias;
calcule las frecuencias relativas;
interprete los resultados.
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?
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.
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?
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.
LLinás, H. (2006); Estadística inferencial. Barranquilla: Editorial Universidad del Norte.
Consultar el documento RPubs :: Enlace y materiales de ayuda.
If you found any ERRORS or have SUGGESTIONS, please report them to my email. Thanks.