Introducción

El conjunto de datos seleccionado para la actividad será bezdekIris.data, que corresponde a una colección de datos de la planta iris. Para el buen desarrollo del trabajo, se decide importar mediante R el dataset, para luego asignarlo a una variable y utilizar las respectivas columnas con los datos, esto puesto que al realizarlo de la forma mostrada como ejemplo se pierde una fila de datos.

library(ggplot2)
library(plotly)
## 
## Attaching package: 'plotly'
## The following object is masked from 'package:ggplot2':
## 
##     last_plot
## The following object is masked from 'package:stats':
## 
##     filter
## The following object is masked from 'package:graphics':
## 
##     layout
# Lectura de datos
library(readr)
bezdekIris <- read_csv("bezdekIris.data", 
    col_names = FALSE)
## Rows: 150 Columns: 5
## -- Column specification --------------------------------------------------------
## Delimiter: ","
## chr (1): X5
## dbl (4): X1, X2, X3, X4
## 
## i Use `spec()` to retrieve the full column specification for this data.
## i Specify the column types or set `show_col_types = FALSE` to quiet this message.
View(bezdekIris)

datos = bezdekIris
datos
## # A tibble: 150 x 5
##       X1    X2    X3    X4 X5         
##    <dbl> <dbl> <dbl> <dbl> <chr>      
##  1   5.1   3.5   1.4   0.2 Iris-setosa
##  2   4.9   3     1.4   0.2 Iris-setosa
##  3   4.7   3.2   1.3   0.2 Iris-setosa
##  4   4.6   3.1   1.5   0.2 Iris-setosa
##  5   5     3.6   1.4   0.2 Iris-setosa
##  6   5.4   3.9   1.7   0.4 Iris-setosa
##  7   4.6   3.4   1.4   0.3 Iris-setosa
##  8   5     3.4   1.5   0.2 Iris-setosa
##  9   4.4   2.9   1.4   0.2 Iris-setosa
## 10   4.9   3.1   1.5   0.1 Iris-setosa
## # ... with 140 more rows

Distribucion de frecuencia

Para la variable cualitativa tenemos el tipo de cada planta.

fi=-as.numeric(sort(-table(datos$X5)))   #Frecuencia absoluta
fac=cumsum(fi)                           #Frecuencia acumulada
fri=as.numeric(fi/sum(fi))*100           #Frecuencia relativa
frac=cumsum(fri)                         #Frecuencia relativa acumulada
plantas = c("Iris-setosa","Iris-versicolor","Iris-virginica")

freqPlantas = data.frame(plantas,fi,fac,fri=round(fri,2),frac=round(frac,2))
knitr::kable(freqPlantas)
plantas fi fac fri frac
Iris-setosa 50 50 33.33 33.33
Iris-versicolor 50 100 33.33 66.67
Iris-virginica 50 150 33.33 100.00

En este conjunto de datos tendremos 4 variables cuantitativas, que serán el ancho y largo del sépalo, y el largo y ancho de los pétalos de las plantas, cada dato medido en centimetros.

Largo de los sepalos en centimetros

largoSepalos = sort(unique(datos$X1))                 # Ordenar los datos
n = length(largoSepalos)                            # Número de elementos de edad
k = round(1 + 3.3 * log(n))                         # Aplicamos regla de Sturges
h = round((max(largoSepalos)-min(largoSepalos))/k)  # Cálculo de intervalo
 #Crear intervalos
intervalos=hist(datos$X1, plot=FALSE, breaks = k)$breaks
intervalos=paste("(",intervalos[1:(length(intervalos)-1)],"-",intervalos[2:(length(intervalos))],"]",sep="")
 #Cálculo de frecuencia
fi = hist(datos$X1, plot=FALSE, breaks = k)$counts        #Frecuencia con intervalos
fac=cumsum(fi)                                            #Frecuencia acumulada
fri=as.numeric(fi/sum(fi))*100                            #Frecuencia relativa
frac=cumsum(fri)                                          #Frecuencia relativa acumulada  

frec_largoSepalos=data.frame(largoSepalos=intervalos,fi,fac,fri=round(fri,2),frac=round(frac,2))
knitr::kable(frec_largoSepalos)
largoSepalos fi fac fri frac
(4.2-4.4] 4 4 2.67 2.67
(4.4-4.6] 5 9 3.33 6.00
(4.6-4.8] 7 16 4.67 10.67
(4.8-5] 16 32 10.67 21.33
(5-5.2] 13 45 8.67 30.00
(5.2-5.4] 7 52 4.67 34.67
(5.4-5.6] 13 65 8.67 43.33
(5.6-5.8] 15 80 10.00 53.33
(5.8-6] 9 89 6.00 59.33
(6-6.2] 10 99 6.67 66.00
(6.2-6.4] 16 115 10.67 76.67
(6.4-6.6] 7 122 4.67 81.33
(6.6-6.8] 11 133 7.33 88.67
(6.8-7] 5 138 3.33 92.00
(7-7.2] 4 142 2.67 94.67
(7.2-7.4] 2 144 1.33 96.00
(7.4-7.6] 1 145 0.67 96.67
(7.6-7.8] 4 149 2.67 99.33
(7.8-8] 1 150 0.67 100.00

Ancho de los sepalos en centimetros

anchoSepalos = sort(unique(datos$X2))                 # Ordenar los datos
n = length(anchoSepalos)                            # Número de elementos de edad
k = round(1 + 3.3 * log(n))                         # Aplicamos regla de Sturges
h = round((max(anchoSepalos)-min(anchoSepalos))/k)  # Cálculo de intervalo
 #Crear intervalos
intervalos=hist(datos$X2, plot=FALSE, breaks = k)$breaks
intervalos=paste("(",intervalos[1:(length(intervalos)-1)],"-",intervalos[2:(length(intervalos))],"]",sep="")
 #Cálculo de frecuencia
fi = hist(datos$X2, plot=FALSE, breaks = k)$counts        #Frecuencia con intervalos
fac=cumsum(fi)                                            #Frecuencia acumulada
fri=as.numeric(fi/sum(fi))*100                            #Frecuencia relativa
frac=cumsum(fri)                                          #Frecuencia relativa acumulada  

frec_anchoSepalos=data.frame(anchoSepalos=intervalos,fi,fac,fri=round(fri,2),frac=round(frac,2))
knitr::kable(frec_anchoSepalos)
anchoSepalos fi fac fri frac
(2-2.2] 4 4 2.67 2.67
(2.2-2.4] 7 11 4.67 7.33
(2.4-2.6] 13 24 8.67 16.00
(2.6-2.8] 23 47 15.33 31.33
(2.8-3] 36 83 24.00 55.33
(3-3.2] 24 107 16.00 71.33
(3.2-3.4] 18 125 12.00 83.33
(3.4-3.6] 10 135 6.67 90.00
(3.6-3.8] 9 144 6.00 96.00
(3.8-4] 3 147 2.00 98.00
(4-4.2] 2 149 1.33 99.33
(4.2-4.4] 1 150 0.67 100.00

Largo de los petalos en centimetros

largoPetalos = sort(unique(datos$X3))                 # Ordenar los datos
n = length(largoPetalos)                            # Número de elementos de edad
k = round(1 + 3.3 * log(n))                         # Aplicamos regla de Sturges
h = round((max(largoPetalos)-min(largoPetalos))/k)  # Cálculo de intervalo
 #Crear intervalos
intervalos=hist(datos$X3, plot=FALSE, breaks = k)$breaks
intervalos=paste("(",intervalos[1:(length(intervalos)-1)],"-",intervalos[2:(length(intervalos))],"]",sep="")
 #Cálculo de frecuencia
fi = hist(datos$X3, plot=FALSE, breaks = k)$counts        #Frecuencia con intervalos
fac=cumsum(fi)                                            #Frecuencia acumulada
fri=as.numeric(fi/sum(fi))*100                            #Frecuencia relativa
frac=cumsum(fri)                                          #Frecuencia relativa acumulada  

frec_largoPetalos=data.frame(largoPetalos=intervalos,fi,fac,fri=round(fri,2),frac=round(frac,2))
knitr::kable(frec_largoPetalos)
largoPetalos fi fac fri frac
(1-1.5] 37 37 24.67 24.67
(1.5-2] 13 50 8.67 33.33
(2-2.5] 0 50 0.00 33.33
(2.5-3] 1 51 0.67 34.00
(3-3.5] 4 55 2.67 36.67
(3.5-4] 11 66 7.33 44.00
(4-4.5] 21 87 14.00 58.00
(4.5-5] 21 108 14.00 72.00
(5-5.5] 17 125 11.33 83.33
(5.5-6] 16 141 10.67 94.00
(6-6.5] 5 146 3.33 97.33
(6.5-7] 4 150 2.67 100.00

Ancho de los petalos en centimetros

anchoPetalos = sort(unique(datos$X4))                 # Ordenar los datos
n = length(anchoPetalos)                            # Número de elementos de edad
k = round(1 + 3.3 * log(n))                         # Aplicamos regla de Sturges
h = round((max(anchoPetalos)-min(anchoPetalos))/k)  # Cálculo de intervalo
 #Crear intervalos
intervalos=hist(datos$X4, plot=FALSE, breaks = k)$breaks
intervalos=paste("(",intervalos[1:(length(intervalos)-1)],"-",intervalos[2:(length(intervalos))],"]",sep="")
 #Cálculo de frecuencia
fi = hist(datos$X4, plot=FALSE, breaks = k)$counts        #Frecuencia con intervalos
fac=cumsum(fi)                                            #Frecuencia acumulada
fri=as.numeric(fi/sum(fi))*100                            #Frecuencia relativa
frac=cumsum(fri)                                          #Frecuencia relativa acumulada  

frec_anchoPetalos=data.frame(anchoPetalos=intervalos,fi,fac,fri=round(fri,2),frac=round(frac,2))
knitr::kable(frec_anchoPetalos)
anchoPetalos fi fac fri frac
(0-0.2] 34 34 22.67 22.67
(0.2-0.4] 14 48 9.33 32.00
(0.4-0.6] 2 50 1.33 33.33
(0.6-0.8] 0 50 0.00 33.33
(0.8-1] 7 57 4.67 38.00
(1-1.2] 8 65 5.33 43.33
(1.2-1.4] 21 86 14.00 57.33
(1.4-1.6] 16 102 10.67 68.00
(1.6-1.8] 14 116 9.33 77.33
(1.8-2] 11 127 7.33 84.67
(2-2.2] 9 136 6.00 90.67
(2.2-2.4] 11 147 7.33 98.00
(2.4-2.6] 3 150 2.00 100.00

Graficos

Grafico tipo pie para tipos de planta

p=ggplot(freqPlantas, aes(x="", y=fri, fill=reorder(plantas, -fri))) +
  geom_bar(stat="identity", width=1) + coord_polar("y", start=0) + theme_minimal() +
  labs(title="Frecuencia relativa - Previsión", x="Previsión", y = "Frecuencia relativa (%)")
p=p + scale_fill_brewer(palette="RdPu",name = "Tipo de planta")
plot(p)

## Histograma para largos de sepalo

grafico=ggplot(datos,aes(X1)) # Gráfico y datos base
#Histograma (25 niveles)
grafico = grafico + geom_histogram(bins=30,fill="maroon",color="maroon",alpha=0.8)
grafico = grafico + theme_bw() # Visualización estándar en blanco y negro
grafico = grafico + ylab("Frecuencia absoluta (largo de sepalo)") + xlab("Largo (centimetros)")
grafico = grafico + ggtitle("Histograma")
plot(grafico)

## Histograma para anchos de sepalo

grafico=ggplot(datos,aes(X2)) # Gráfico y datos base
#Histograma (25 niveles)
grafico = grafico + geom_histogram(bins=30,fill="maroon",color="maroon",alpha=0.8)
grafico = grafico + theme_bw() # Visualización estándar en blanco y negro
grafico = grafico + ylab("Frecuencia absoluta (ancho de sepalo)") + xlab("Ancho (centimetros)")
grafico = grafico + ggtitle("Histograma")
plot(grafico)

Histograma para largos de petalos

grafico=ggplot(datos,aes(X3)) # Gráfico y datos base
#Histograma (25 niveles)
grafico = grafico + geom_histogram(bins=30,fill="maroon",color="maroon",alpha=0.8)
grafico = grafico + theme_bw() # Visualización estándar en blanco y negro
grafico = grafico + ylab("Frecuencia absoluta (largo de petalo)") + xlab("Largo (centimetros)")
grafico = grafico + ggtitle("Histograma")
plot(grafico)

Histograma para anchos de petalos

grafico=ggplot(datos,aes(X4)) # Gráfico y datos base
#Histograma (25 niveles)
grafico = grafico + geom_histogram(bins=30,fill="maroon",color="maroon",alpha=0.8)
grafico = grafico + theme_bw() # Visualización estándar en blanco y negro
grafico = grafico + ylab("Frecuencia absoluta (ancho de petalo)") + xlab("Ancho (centimetros)")
grafico = grafico + ggtitle("Histograma")
plot(grafico)

Preguntas planteadas

1- ¿Qué ocurre al construir directamente una tabla de frecuencia?¿Qué conclusiones se pueden extraer? Al construir una tabla de frecuencias se puede observar la cantidad de datos ordenados por tipo, en este caso podemos ver cuantas platas hay por tipo en el dataset, asi como tambien se pueden ver datos como la cantidad de sépalos y pétalos divididos por anchos y largos, datos ordenados por intervalos de medidas. De esto podemos ver a cuanto tienden las medidas en promedio.

2- ¿Qué diferencia aprecia entre ambos tipos de representaciones? Una diferencia visual, ya que con el gráfico de pie podemos ver de forma mas visual cual es la mayor planta presente en el conjunto de datos, esto gracias a los colores, en el caso del histograma podemos ver cuantas veces se repite el dato en el intervalo que corresponde, el cual no corresponde a un dato fijo, si no a diversos datos, lo cual es una diferencia directa con el gráfico de pie, por lo que para analizar el histograma debemos tener en cuenta el tamaño de cada intervalo definido. Por lo anterior, se podría deducir que el gráfico de pie seria mas útil para graficar variables cualitativas y los histogramas para variables cuantitativas.