Conjunto de datos obtenidos de https://www.kaggle.com/datasets/rounakbanik/pokemon
datos=read.csv("pokemon.csv", sep = ",", stringsAsFactors = F)
Tabla de frecuencia sobre una variable cualitativa, en donde se usara el atributo Tipo principal del pokemon.
fi=-as.numeric(sort(-(table(datos$type1)))) #Frecuencia absoluta
fac=cumsum(fi) #Frecuencia acumulada
fri=as.numeric(fi/sum(fi))*100 #Frecuencia relativa
frac=cumsum(fri) #Frecuencia relativa acumulada
Tipo=c("Agua","Normal","Planta","Bicho","Psiquico","Fuego","Roca","Electrico","Tierra","Veneno","Siniestro","Lucha","Dragon","Fantasma","Acero","Hielo","Hada","Volador")
#Tabla
frec_Tipo=data.frame(Tipo,fi,fac,fri=round(fri,2),frac=round(frac,2))
#Visualización
knitr::kable(frec_Tipo)
| Tipo | fi | fac | fri | frac |
|---|---|---|---|---|
| Agua | 114 | 114 | 14.23 | 14.23 |
| Normal | 105 | 219 | 13.11 | 27.34 |
| Planta | 78 | 297 | 9.74 | 37.08 |
| Bicho | 72 | 369 | 8.99 | 46.07 |
| Psiquico | 53 | 422 | 6.62 | 52.68 |
| Fuego | 52 | 474 | 6.49 | 59.18 |
| Roca | 45 | 519 | 5.62 | 64.79 |
| Electrico | 39 | 558 | 4.87 | 69.66 |
| Tierra | 32 | 590 | 4.00 | 73.66 |
| Veneno | 32 | 622 | 4.00 | 77.65 |
| Siniestro | 29 | 651 | 3.62 | 81.27 |
| Lucha | 28 | 679 | 3.50 | 84.77 |
| Dragon | 27 | 706 | 3.37 | 88.14 |
| Fantasma | 27 | 733 | 3.37 | 91.51 |
| Acero | 24 | 757 | 3.00 | 94.51 |
| Hielo | 23 | 780 | 2.87 | 97.38 |
| Hada | 18 | 798 | 2.25 | 99.63 |
| Volador | 3 | 801 | 0.37 | 100.00 |
#Tabla de frecuencia variables cuantitativas
#Frecuencia
fi=as.numeric(table(datos$hp)) #Frecuencia absoluta
fac=cumsum(fi) #Frecuencia acumulada
fri=as.numeric(fi/sum(fi))*100 #Frecuencia relativa
frac=cumsum(fri) #Frecuencia relativa acumulada
#Tabla
vidaBase=sort(unique(datos$hp))
frec_vidaBase=data.frame(vidaBase,fi,fac,fri=round(fri,2),frac=round(frac,2))
#Visualización
knitr::kable(head(frec_vidaBase,5))
| vidaBase | fi | fac | fri | frac |
|---|---|---|---|---|
| 1 | 1 | 1 | 0.12 | 0.12 |
| 10 | 1 | 2 | 0.12 | 0.25 |
| 20 | 6 | 8 | 0.75 | 1.00 |
| 25 | 3 | 11 | 0.37 | 1.37 |
| 28 | 1 | 12 | 0.12 | 1.50 |
knitr::kable(tail(frec_vidaBase,5))
| vidaBase | fi | fac | fri | frac | |
|---|---|---|---|---|---|
| 95 | 190 | 1 | 797 | 0.12 | 99.50 |
| 96 | 216 | 1 | 798 | 0.12 | 99.63 |
| 97 | 223 | 1 | 799 | 0.12 | 99.75 |
| 98 | 250 | 1 | 800 | 0.12 | 99.88 |
| 99 | 255 | 1 | 801 | 0.12 | 100.00 |
R: Cuando se construye una tabla de frecuencia, esta se divide en 4 secciones, la primera la frecuencia absoluta, que es la cantidad de veces que se repite una característica o suceso en un número determinado de experimentos, la segunda es la frecuencia acumulada, la cual es la suma progresiva de la frecuencia absoluta, la tercera es la frecuencia relativa, que es el porcentaje de que esta característica o suceso aparezca, y la frecuencia relativa acumulada, que es la suma progresiva de la anterior.
Entonces gracias a estos datos podemos extraer información de la tabla de frecuencia de una manera más ordenada y fácil de leer, tales como poder ver cual tiene mayor numero, cual se repite más, alguna búsqueda en particular, etc. Y a base de esto generar conclusiones, predicciones, etc.
En este caso, se construyo una tabla en donde se muestran los tipos elementales principales de cada Pokémon, un dato puede ser que el tipo Agua tiene una frecuencia relativa de 14.23, que el tipo Dragon tiene una frecuencia de 27, o que hay 801 Pokémon considerados.
#Tabla de frecuencia variables cuantitativas
#Frecuencia
vidaBase=sort(unique(datos$hp)) # Ordenar los datos
n = length(vidaBase) # Número de elementos de edad
k = round(1 + 3.3 * log(n)) # Aplicamos regla de Sturges
h = round((max(vidaBase)-min(vidaBase))/k) # Cálculo de intervalo
#Crear intervalos
intervalos=hist(datos$hp, plot=FALSE, breaks = k)$breaks
intervalos=paste("(",intervalos[1:(length(intervalos)-1)],"-",intervalos[2:(length(intervalos))],"]",sep="")
intervalos[1]="[0-20]"
#Cálculo de frecuencia
fi = hist(datos$hp, 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_vidaBase=data.frame(vidaBase=intervalos,fi,fac,fri=round(fri,2),frac=round(frac,2))
knitr::kable(frec_vidaBase)
| vidaBase | fi | fac | fri | frac |
|---|---|---|---|---|
| [0-20] | 8 | 8 | 1.00 | 1.00 |
| (20-40] | 86 | 94 | 10.74 | 11.74 |
| (40-60] | 254 | 348 | 31.71 | 43.45 |
| (60-80] | 262 | 610 | 32.71 | 76.15 |
| (80-100] | 128 | 738 | 15.98 | 92.13 |
| (100-120] | 38 | 776 | 4.74 | 96.88 |
| (120-140] | 13 | 789 | 1.62 | 98.50 |
| (140-160] | 5 | 794 | 0.62 | 99.13 |
| (160-180] | 2 | 796 | 0.25 | 99.38 |
| (180-200] | 1 | 797 | 0.12 | 99.50 |
| (200-220] | 1 | 798 | 0.12 | 99.63 |
| (220-240] | 1 | 799 | 0.12 | 99.75 |
| (240-260] | 2 | 801 | 0.25 | 100.00 |
# Gráfico de barras
p=ggplot(data=frec_Tipo, aes(x=reorder(Tipo, -fri),y=fi)) +
geom_bar(stat="identity",fill="indianred1",alpha=0.8) + theme_minimal() +
labs(title="Frecuencia absoluta - Tipo principal", x="Tipo principal", y = "Frecuencia absoluta")
ggplotly(p)
p=ggplot((frec_Tipo), aes(x="", y=fri, fill=reorder(Tipo, -fri))) +
geom_bar(stat="identity", width=1) + coord_polar("y", start=0) + theme_minimal() +
labs(title="Frecuencia relativa - Tipo principal", x="Tipo principal", y = "Frecuencia relativa (%)")
p=p + scale_fill_brewer(palette="PuOr",aesthetics = "colour",name = "Tipo principal del Pokémon")
plot(p)
p=ggplot(data=frec_Tipo, aes(x=reorder(Tipo, -fri),y=fi)) +
geom_bar(stat="identity",fill="indianred1",alpha=0.8) + theme_minimal() +
labs(title="Frecuencia absoluta y absoluta acumulada - Tipo principal", x="Tipo principal", y = "Frecuencia absoluta")
p = p + geom_point(aes(y=fac))
ggplotly(p)
library("BHH2")
dotPlot(datos$hp,xlab = "Vida Base",)
grafico=ggplot(datos,aes(hp)) # Gráfico y datos base
#Histograma (25 niveles) (colores- http://www.stat.columbia.edu/~tzheng/files/Rcolor.pdf)
grafico = grafico + geom_histogram(bins=30,fill="indianred1",color="indianred1",alpha=0.8)
grafico = grafico + theme_bw() # Visualización estándar en blanco y negro
grafico = grafico + ylab("Frecuencia absoluta (vida base)") + xlab("Vida Base")
grafico = grafico + ggtitle("Histograma")
ggplotly(grafico)
R: La pregunta hace ilusión a la diferencia entre el Diagrama de punto y el Histograma (Ambas de carácter cuantitativo), en donde por su parte el Diagrama de punto muestra todas las variables, para cuando una característica de esta variable se repite, esta se apile con la ya estaba, de esta manera genera un diagrama que muestra a todas las variables con su caracteristica distintiva de manera ordenada, mientras que el Histograma presenta barras en vez de puntos, en donde cada barra es similar a un intervalo de frecuencia de los valores obtenidos, de esta manera haciendo esta mas general que el Diagrama de punto.