INTRODUCCIÓN

Genshin Impact es un videojuego de rol y acción en un mundo abierto desarrollado por la empresa China Hoyoverse, el cual funciona a partir de un mecanismo de gasha, este término se refiere a un tipo de máquina expendedora que dispensa cápsulas que contienen juguetes, figuras coleccionables o artículos pequeños de manera aleatoria.

Así pues, el juego consiste en que en cada actualización, se promociona a un personaje exclusivo, junto con un arma nueva que es perfecta para este mismo, motivo por el cual los jugadores se ven atraídos por estos y deciden gastar en el juego con tal de obtener las más recientes novedades.

A través de una base de datos sacada de la página kaggle.com, se analizarán los gastos que los jugadores del gasha llamado Genshin Impact realizan conforme hay nuevas actualizaciones en el juego, y así pues, presentar información importante como medidas de tendencia central y medidas de dispersión, para encontrar cuáles son los factores que más se repiten en los gastos y la tendencia a los que estos van.

EXPLORACIÓN DE BASE DE DATOS

Realice un análisis exploratorio de datos para comprender la estructura de la base de datos.

  1. Responda preguntas como:

a) ¿Cuántas filas y columnas tiene la base de datos? 38 objetos y 10 variables b) ¿Cuáles son los nombres de las columnas?

setwd("C:/Users/danie/Downloads")#lugar donde tienes el archivo
df=read.csv("Genshin charac rev (by banner).csv")
colnames(df)
##  [1] "version"            "version_name"       "start_date"        
##  [4] "end_date"           "X5_star_characters" "rerun"             
##  [7] "mixed"              "revenue"            "banner_days"       
## [10] "avg_revenue"

c) ¿Qué tipo de datos contiene cada columna?

variables= c("version", "version_name", "start_date", "end_date", "X5_star_characters",
               "rerun", "mixed", "revenue", "banner_days", "avg_revenue")

tipos_de_datos= c("NUMÉRICO", "CADENA DE CARACTERES", "CADENA DE CARACTERES", "CADENA DE CARACTERES",
                    "CADENA DE CARACTERES", "CADENA DE CARACTERES", "CADENA DE CARACTERES",
                    "CADENA DE CARACTERES", "ENTERO", "NUMÉRICO")


tabla_datos= data.frame(Variable = variables, "Tipo de datos" = tipos_de_datos)


print(tabla_datos)
##              Variable        Tipo.de.datos
## 1             version             NUMÉRICO
## 2        version_name CADENA DE CARACTERES
## 3          start_date CADENA DE CARACTERES
## 4            end_date CADENA DE CARACTERES
## 5  X5_star_characters CADENA DE CARACTERES
## 6               rerun CADENA DE CARACTERES
## 7               mixed CADENA DE CARACTERES
## 8             revenue CADENA DE CARACTERES
## 9         banner_days               ENTERO
## 10        avg_revenue             NUMÉRICO
  1. Calcule estadísticas descriptivas para las columnas numéricas, como promedios, medianas, desviaciones estándar, etc:

Version

x=c(df$version)

promedio=mean(x)

mediana=median(x)

moda=as.numeric(names(which.max(table(x))))

varianza=var(x)

desviacion=sd(x)

tabla_medidas= data.frame("Promedio" = promedio, "Mediana" = mediana, "Moda" = moda, "varianza" = varianza, "desviacion" = desviacion)


print(tabla_medidas)
##   Promedio Mediana Moda  varianza desviacion
## 1 2.055263    2.15  1.3 0.4792959   0.692312

Revenue

revenue=as.numeric(gsub("\\,","",df$revenue))

promedio=mean(revenue)

mediana=median(revenue)

moda=as.numeric(names(which.max(table(x))))

varianza=var(revenue)

desviavcion=sd(revenue)

tabla_medidas= data.frame("Promedio" = promedio, "Mediana" = mediana, "Moda" = moda, "varianza" = varianza, "desviacion" = desviacion)


print(tabla_medidas)
##   Promedio  Mediana Moda     varianza desviacion
## 1 17741611 15706760  1.3 6.931278e+13   0.692312

banner_days

x=c(df$banner_days)

promedio=mean(x)

mediana=median(x)

moda=as.numeric(names(which.max(table(x))))

varianza=var(x)

desviacion=sd(x)

tabla_medidas= data.frame("Promedio" = promedio, "Mediana" = mediana, "Moda" = moda, "varianza" = varianza, "desviacion" = desviacion)


print(tabla_medidas)
##   Promedio Mediana Moda varianza desviacion
## 1 20.92105      21   21 19.53414   4.419744
  1. Identifique cualquier dato faltante y decida cómo manejarlo.
df$banner_days
##  [1] 25 22 20 22 21 21 15 13 14 21 21 21 21 21 21 21 21 20 22 21 22 21 22 21 22
## [26] 21 22 21 43 22 22 21 22 18 19 18 19 15

Observamos la cantidad de datos que existen en nuestra base de datos para la columna de “banner_days”, se logran apreciar de manera sencilla ya que la base de datos no es muy extensa.

Podemos confirmar de esta manera más visual cuantos datos existen en esta columna

table(df$banner_days)
## 
## 13 14 15 18 19 20 21 22 25 43 
##  1  1  2  2  2  2 16 10  1  1

Observamos cual es la frecuencia de los datos y una vez más vemos que no existen datos faltantes o marcados como NA, sin embargo decidiremos tratar a los datos iguales a 22 como no deseados y los excluiremos de la tabla como si de “NA”(datos faltantes) se tratasen

na=c(df$banner_days!=22)
na
##  [1]  TRUE FALSE  TRUE FALSE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE
## [13]  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE FALSE  TRUE FALSE  TRUE FALSE  TRUE
## [25] FALSE  TRUE FALSE  TRUE  TRUE FALSE FALSE  TRUE FALSE  TRUE  TRUE  TRUE
## [37]  TRUE  TRUE

Creamos un vector con los datos de la columna a tratar pero le ponemos una condición, que sean diferentes al “dato no deseado”, esto nos creara un vector con valores booleanos “TRUE” o “FALSE” dependiendo si el valor de cada una de las filas cumple la condición.

banner=data.frame(df$banner_days[na])
banner
##    df.banner_days.na.
## 1                  25
## 2                  20
## 3                  21
## 4                  21
## 5                  15
## 6                  13
## 7                  14
## 8                  21
## 9                  21
## 10                 21
## 11                 21
## 12                 21
## 13                 21
## 14                 21
## 15                 21
## 16                 20
## 17                 21
## 18                 21
## 19                 21
## 20                 21
## 21                 21
## 22                 43
## 23                 21
## 24                 18
## 25                 19
## 26                 18
## 27                 19
## 28                 15

Ahora utilizamos este vector como posición de la columna deseada y la guardamos en un nuevo data frame. Tenemos como resultado un data frame que no contiene los datos iguales a 22, podemos confirmar esto con el número de observaciones .

  1. Cree subtablas, elimine (filas/columnas), filtre por valores

Subtabla 1: tabla por versión.

tabla1=table(df$version)
tabla1=data.frame(tabla1)

colnames(tabla1)=c("Versión","Banners")
tabla1
##    Versión Banners
## 1        1       2
## 2      1.1       2
## 3      1.2       2
## 4      1.3       3
## 5      1.4       2
## 6      1.5       2
## 7      1.6       2
## 8        2       2
## 9      2.1       2
## 10     2.2       2
## 11     2.3       2
## 12     2.4       2
## 13     2.5       2
## 14     2.6       2
## 15     2.7       2
## 16     2.8       2
## 17       3       2
## 18     3.1       2
## 19     3.2       1

Subtabla 2: Duración de banner de personajes 5 estrellas y su ganancia.

tabla2=data.frame(characters=c(df$X5_star_characters),duration=c(df$banner_days),revenue=c(df$revenue))

colnames(tabla2)=c("5-star character","Banner duration (days)","Total revenue")
tabla2
##                               5-star character Banner duration (days)
## 1                                        Venti                     25
## 2                                         Klee                     22
## 3                                    Tartaglia                     20
## 4                                      Zhongli                     22
## 5                                       Albedo                     21
## 6                                        Ganyu                     21
## 7                                         Xiao                     15
## 8                                       Keqing                     13
## 9                                       Hu Tao                     14
## 10                               Venti (Rerun)                     21
## 11                           Tartaglia (Rerun)                     21
## 12                             Zhongli (Rerun)                     21
## 13                                        Eula                     21
## 14                                Klee (Rerun)                     21
## 15                            Kaedehara Kazuha                     21
## 16                              Kamisato Ayaka                     21
## 17                                     Yoimiya                     21
## 18                               Raiden Shogun                     20
## 19                          Sangonomiya Kokomi                     22
## 20                       Tartaglia (2nd Rerun)                     21
## 21                              Hu Tao (Rerun)                     22
## 22               Albedo (Rerun) & Eula (Rerun)                     21
## 23                                Arataki Itto                     22
## 24                       Shenhe & Xiao (Rerun)                     21
## 25         Ganyu (Rerun) & Zhongli (2nd Rerun)                     22
## 26                                    Yae Miko                     21
## 27     Raiden Shogun (Rerun) &  Kokomi (Rerun)                     22
## 28          Kamisato Ayato & Venti (2nd Rerun)                     21
## 29                      Kamisato Ayaka (Rerun)                     43
## 30                    Yelan & Xiao (2nd Rerun)                     22
## 31                        Arataki Itto (Rerun)                     22
## 32 Kaedehara Kazuha (Rerun) & Klee (2nd Rerun)                     21
## 33                             Yoimiya (Rerun)                     22
## 34              Tighnari & Zhongli (3rd Rerun)                     18
## 35     Ganyu (2nd Rerun) &  Kokomi (2nd Rerun)                     19
## 36                    Cyno & Venti (3rd Rerun)                     18
## 37                  Nilou & Albedo (2nd Rerun)                     19
## 38                Nahida & Yoimiya (2nd Rerun)                     15
##    Total revenue
## 1     30,632,752
## 2     22,750,080
## 3     13,443,619
## 4     16,264,892
## 5     11,816,107
## 6     15,669,918
## 7     13,145,115
## 8      9,505,798
## 9     12,481,634
## 10    16,614,209
## 11     6,965,445
## 12    10,215,165
## 13    12,619,390
## 14     7,006,180
## 15     9,807,112
## 16    16,451,006
## 17     8,615,144
## 18    33,020,905
## 19     7,020,975
## 20     7,785,438
## 21    25,226,952
## 22    17,026,066
## 23    13,404,072
## 24    16,994,406
## 25    26,780,298
## 26    15,110,264
## 27    33,560,259
## 28    22,767,455
## 29    35,939,066
## 30    32,177,144
## 31    12,586,764
## 32    24,808,479
## 33    14,333,266
## 34    19,068,372
## 35    15,681,840
## 36    19,052,023
## 37    15,731,680
## 38    32,101,943

Subtabla 3:

tabla3=data.frame(Ganancia_diaria=c(df$avg_revenue),
                  Ganancia_Total=c(df$revenue))
colnames(tabla3)=c("Ganancia promedio","Ganacias Totales")
tabla3
##    Ganancia promedio Ganacias Totales
## 1       1,225,310.08       30,632,752
## 2       1,034,094.55       22,750,080
## 3         672,180.95       13,443,619
## 4         739,313.27       16,264,892
## 5         562,671.76       11,816,107
## 6         746,186.57       15,669,918
## 7         876,341.00       13,145,115
## 8         731,215.23        9,505,798
## 9         891,545.29       12,481,634
## 10        791,152.81       16,614,209
## 11        331,687.86        6,965,445
## 12        486,436.43       10,215,165
## 13        600,923.33       12,619,390
## 14        333,627.62        7,006,180
## 15        467,005.33        9,807,112
## 16        783,381.24       16,451,006
## 17        410,244.95        8,615,144
## 18      1,651,045.25       33,020,905
## 19        319,135.23        7,020,975
## 20        370,735.14        7,785,438
## 21      1,146,679.64       25,226,952
## 22        810,765.05       17,026,066
## 23        609,276.00       13,404,072
## 24        809,257.43       16,994,406
## 25      1,217,286.27       26,780,298
## 26        719,536.38       15,110,264
## 27      1,525,466.32       33,560,259
## 28      1,084,164.52       22,767,455
## 29        835,792.23       35,939,066
## 30      1,462,597.45       32,177,144
## 31        572,125.64       12,586,764
## 32      1,181,356.14       24,808,479
## 33        651,512.09       14,333,266
## 34      1,059,354.00       19,068,372
## 35        825,360.00       15,681,840
## 36      1,058,445.72       19,052,023
## 37        827,983.16       15,731,680
## 38       2140129.533       32,101,943

VISUALIZACIONES

Cree al menos tres visualizaciones diferentes que ayuden a comprender mejor los datos. Puede utilizar gráficos de barras, gráficos de dispersión, histogramas, etc.

Grafica donde podemos ver la cantidad de dias que duraron los banners

hist(df$banner_days,
     names.arg = df$categorias, 
     main = "Dias de duracion",
     xlab="DURACION",
     ylab = "BANERS",
     col = "brown")

Grafica donde se muestra la ganancia promdeio por dia de cada baner

revenue=as.numeric(gsub("\\,","",df$revenue))
barplot(revenue,
        main = "REVENUE",
        xlab = "Versión",
        ylab = "Ganancia promedio por dia",
        col = "blue")

Grafica de la cantidad total de ganancias por cada banner.

avg_revenue=as.numeric(gsub("\\,","",df$avg_revenue))
barplot(avg_revenue,
        main = "AVG REVENUE",
        xlab = "Versión",
        ylab = "Ganancia Total",
        col = "purple")

INTERPRETACIÓN DE LOS DATOS

El promedio de ventas(revenue) por versión que ha tenido el videojuego en su trayectoria hasta la versión 3.2, es de $17,741,611 y la media por día de ingresos que reciben es de $856,876.9

Por otro lado, se encontró que el promedio de duración de los banners es de 20 días, puesto que al principio de sus actualizaciones, estos eran más extensos, más sin embargo, la duración de los banners ha variado bastante a lo largo del tiempo, determinando así pues que la moda de este es de 21 días, muy parecida a la media.

A partir de los datos obtenidos de las medidas de tendencia central, se pudo identificar que el mes que tuvo más ganancias fue en Mayo del 2022, con el relanzamiento del personaje “Kamisato Ayaka” logrando una cifra de $35,939,066, creemos que el éxito de este banner puede ser debido a que duró 43 días, dándole tiempo a los jugadores de invertir más en el juego y dándonos a entender que los personajes que más dinero recaudan, son los que tienen un periodo de duración más largo.

Los 3 banners con más dinero recaudado del juego son los siguientes:“Zephyr of the Violet Garden” es el banner al que pertenece el personaje con más ganancias del juego, en segundo lugar encontramos a “Floating World Under the Moonlight” que alcanzó $33,020,905 y por último “Akasha Pulses, the Kalpa Flame Rises” con un total de $32,101,943.

Así pues, observamos que la varianza a lo largo del juego es de $8,325,430, factores como la estética del personaje, su jugabilidad, novedades de la actualización, el tiempo de duración del banner y la publicidad que la misma empresa realiza, hacen que las ganancias del juego aumenten o disminuyan.