library(readxl)
Data <- read_excel("C:/Users/User/Downloads/enhanced_box_office_data_2000-2024_u (1).xlsx")
View(Data)
library(dplyr)
## 
## Adjuntando el paquete: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
library(tidyverse)
## Warning: package 'ggplot2' was built under R version 4.4.2
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ forcats   1.0.0     ✔ readr     2.1.5
## ✔ ggplot2   3.5.1     ✔ stringr   1.5.1
## ✔ lubridate 1.9.3     ✔ tibble    3.2.1
## ✔ purrr     1.0.2     ✔ tidyr     1.3.1
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag()    masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(kableExtra)
## 
## Adjuntando el paquete: 'kableExtra'
## 
## The following object is masked from 'package:dplyr':
## 
##     group_rows
library(reshape2)
## Warning: package 'reshape2' was built under R version 4.4.2
## 
## Adjuntando el paquete: 'reshape2'
## 
## The following object is masked from 'package:tidyr':
## 
##     smiths
library(dunn.test)
summary(Data)
##       Rank        Release Group        $Worldwide          $Domestic        
##  Min.   :  1.00   Length:5000        Min.   :1.666e+06   Min.   :        0  
##  1st Qu.: 50.75   Class :character   1st Qu.:2.466e+07   1st Qu.:    92752  
##  Median :100.50   Mode  :character   Median :4.845e+07   Median : 17984212  
##  Mean   :100.50                      Mean   :1.192e+08   Mean   : 44725233  
##  3rd Qu.:150.25                      3rd Qu.:1.198e+08   3rd Qu.: 53868472  
##  Max.   :200.00                      Max.   :2.799e+09   Max.   :936662225  
##                                                                             
##    Domestic %        $Foreign           Foreign %           Year     
##  Min.   :  0.00   Min.   :0.000e+00   Min.   :  0.00   Min.   :2000  
##  1st Qu.:  0.20   1st Qu.:1.371e+07   1st Qu.: 42.20   1st Qu.:2006  
##  Median : 37.05   Median :3.019e+07   Median : 62.95   Median :2012  
##  Mean   : 35.74   Mean   :7.449e+07   Mean   : 64.26   Mean   :2012  
##  3rd Qu.: 57.80   3rd Qu.:7.212e+07   3rd Qu.: 99.80   3rd Qu.:2018  
##  Max.   :100.00   Max.   :1.994e+09   Max.   :100.00   Max.   :2024  
##                                                                      
##     Genres             Rating            Vote_Count      Original_Language 
##  Length:5000        Length:5000        Min.   :    0.0   Length:5000       
##  Class :character   Class :character   1st Qu.:  205.2   Class :character  
##  Mode  :character   Mode  :character   Median : 1035.5   Mode  :character  
##                                        Mean   : 2531.6                     
##                                        3rd Qu.: 3065.0                     
##                                        Max.   :36753.0                     
##                                        NA's   :170                         
##  Production_Countries
##  Length:5000         
##  Class :character    
##  Mode  :character    
##                      
##                      
##                      
## 
colnames(Data)
##  [1] "Rank"                 "Release Group"        "$Worldwide"          
##  [4] "$Domestic"            "Domestic %"           "$Foreign"            
##  [7] "Foreign %"            "Year"                 "Genres"              
## [10] "Rating"               "Vote_Count"           "Original_Language"   
## [13] "Production_Countries"

Primero realizare una filtración de los géneros de las películas, puesto que se encuentran juntas entre “comas”.

#Separamos los géneros
Generos_Separados <- unlist(strsplit(as.character(Data$Genres), split = ", "))

#Contamos cuantas películas hay
Frecuencia_Absoluta <- table(Generos_Separados)
Frecuencia_Absoluta
## Generos_Separados
##          Action       Adventure       Animation          Comedy           Crime 
##            1384            1063             498            1907             699 
##     Documentary           Drama          Family         Fantasy         History 
##              79            2009             694             634             293 
##          Horror           Music         Mystery         Romance Science Fiction 
##             436             152             431             844             514 
##        Thriller        TV Movie             War         Western 
##            1060               7             144              34
#Calculamos la frecuencia relativa
Frecuencia_Relativa <- prop.table(Frecuencia_Absoluta)

#Agrupamos todo en Data Frame
Tabla_Final <- data.frame(Genero = names(Frecuencia_Absoluta), Frecuencia_Absoluta = as.numeric(Frecuencia_Absoluta), Frecuencia_Relativa = round(100 * as.numeric(Frecuencia_Relativa), 2)) #Multiplicamos por 100 para convertilo en porcentaje y lo redondeamos a dos cifras.

Tabla_Final
##             Genero Frecuencia_Absoluta Frecuencia_Relativa
## 1           Action                1384               10.74
## 2        Adventure                1063                8.25
## 3        Animation                 498                3.87
## 4           Comedy                1907               14.80
## 5            Crime                 699                5.43
## 6      Documentary                  79                0.61
## 7            Drama                2009               15.60
## 8           Family                 694                5.39
## 9          Fantasy                 634                4.92
## 10         History                 293                2.27
## 11          Horror                 436                3.38
## 12           Music                 152                1.18
## 13         Mystery                 431                3.35
## 14         Romance                 844                6.55
## 15 Science Fiction                 514                3.99
## 16        Thriller                1060                8.23
## 17        TV Movie                   7                0.05
## 18             War                 144                1.12
## 19         Western                  34                0.26
#Hacemos una tabla con la función "kable"
Tabla_Frecuencia <- kable(Tabla_Final, caption = "Tabla: Frecuencia de Géneros", align = "c") %>%  
  kable_styling(full_width = TRUE, bootstrap_options = c("striped", "hover", "condensed", "responsive"), 
                font_size = 15, fixed_thead = TRUE) %>%
  column_spec(1, bold = TRUE, width = "10em") %>%   
  column_spec(2, width = "10em") %>%                
  column_spec(3, width = "10em") %>%                
  row_spec(0, bold = TRUE, background = "#9eb5d9", color = "black")

Tabla_Frecuencia
Tabla: Frecuencia de Géneros
Genero Frecuencia_Absoluta Frecuencia_Relativa
Action 1384 10.74
Adventure 1063 8.25
Animation 498 3.87
Comedy 1907 14.80
Crime 699 5.43
Documentary 79 0.61
Drama 2009 15.60
Family 694 5.39
Fantasy 634 4.92
History 293 2.27
Horror 436 3.38
Music 152 1.18
Mystery 431 3.35
Romance 844 6.55
Science Fiction 514 3.99
Thriller 1060 8.23
TV Movie 7 0.05
War 144 1.12
Western 34 0.26
#Repetimos las ganancias de acuerdo a cuantos generos había en una sola película

GananciasCortas <- rep(Data$`$Foreign`, sapply(strsplit(as.character(Data$Genres), split = ", "), length))

#Juntamos los géneros y las ganancias de las películas en un Data Frame
Data_Frame_Ganancias_Generos <- data.frame(Genero = Generos_Separados, Ganancias = GananciasCortas)

Agrupacion_Ganancias_Generos <- aggregate(Ganancias ~ Genero, data = Data_Frame_Ganancias_Generos, sum)


Tabla_Frecuencia3 <- kable(Agrupacion_Ganancias_Generos, caption = "Tabla: Ganancias Totales por Género", align = "c") %>%  
  kable_styling(full_width = TRUE, bootstrap_options = c("striped", "hover", "condensed", "responsive"), 
                font_size = 15, fixed_thead = TRUE) %>%
  column_spec(1, bold = TRUE, width = "10em") %>%   
  column_spec(2, width = "10em") %>%                
  row_spec(0, bold = TRUE, background = "#00b08e", color = "black")

Tabla_Frecuencia3
Tabla: Ganancias Totales por Género
Genero Ganancias
Action 165951686864
Adventure 168387139689
Animation 61501072956
Comedy 120154492707
Crime 40170061703
Documentary 1827471543
Drama 102252519801
Family 75375365889
Fantasy 81244594839
History 16554412413
Horror 20272217062
Music 8148949877
Mystery 23721062500
Romance 42095656530
Science Fiction 82247553450
Thriller 72920927337
TV Movie 129380542
War 12760889331
Western 1913719532
# Crear gráfico de barras con las ganancias por género
ggplot(Agrupacion_Ganancias_Generos, aes(x = reorder(Genero, -Ganancias), y = Ganancias, fill = Genero)) + 
  geom_bar(stat = "identity") +
  labs(title = "Ganancias Totales por Género", x = "Género", y = "Ganancia Total") +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))  # Mejorar la legibilidad de las etiquetas en el eje X

Seleccionamos los dos grupos de géneros con más ganancias para ver si existe una diferencia significativa entre estas. Estas serán: Acción, Aventura.

# Filtrar los géneros
Generos_Seleccionados <- c("Action", "Adventure", "Comedy")

# Filtrar los datos que contienen esos géneros
Data_Filtrada <- subset(Data_Frame_Ganancias_Generos, Genero %in% Generos_Seleccionados)
# Realizar la prueba de Kruskal-Wallis
kruskal_test <- kruskal.test(Ganancias ~ Genero, data = Data_Filtrada)


kruskal_test
## 
##  Kruskal-Wallis rank sum test
## 
## data:  Ganancias by Genero
## Kruskal-Wallis chi-squared = 310.49, df = 2, p-value < 2.2e-16

El valor p es menor que 0.05 por lo que se rechaza la hipotesis nula. Es decir, sí existen diferencias significativas entre las medianas, por lo que, hay una diferencia entre la ganancia internacional del género de películas de acción, comedia y aventura.

# Realizar la prueba de Dunn
dunn_result <- dunn.test(Data_Filtrada$Ganancias, Data_Filtrada$Genero, 
                         kw = TRUE, label = TRUE, list = TRUE)
##   Kruskal-Wallis rank sum test
## 
## data: x and group
## Kruskal-Wallis chi-squared = 310.4948, df = 2, p-value = 0
## 
## 
##                            Comparison of x by group                            
##                                 (No adjustment)                                
## Col Mean-|
## Row Mean |     Action   Adventur
## ---------+----------------------
## Adventur |  -3.592213
##          |    0.0002*
##          |
##   Comedy |   13.12019   15.93132
##          |    0.0000*    0.0000*
## 
## 
## List of pairwise comparisons: Z statistic (p-value)
## ----------------------------------------
## Action - Adventure : -3.592213 (0.0002)*
## Action - Comedy    :  13.12019 (0.0000)*
## Adventure - Comedy :  15.93132 (0.0000)*
## 
## alpha = 0.05
## Reject Ho if p <= alpha/2
# Mostrar el resultado de la prueba
dunn_result
## $chi2
## [1] 310.4948
## 
## $Z
## [1] -3.592214 13.120198 15.931321
## 
## $P
## [1] 1.639405e-04 1.261376e-39 1.920784e-57
## 
## $P.adjusted
## [1] 1.639405e-04 1.261376e-39 1.920784e-57
## 
## $comparisons
## [1] "Action - Adventure" "Action - Comedy"    "Adventure - Comedy"

Entre todas existe una diferencia.