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
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
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.