Autores: Jeremy Tello - Walinn Paredes
Fecha: 27/01/2024
Spotify Technology S.A
Misión: Ofrecer acceso ilimitado a la música y al entretenimiento para todas las personas en todo el mundo.
Este conjunto de datos contiene una lista completa de las canciones más famosas de 2023 enumeradas en Spotify. El conjunto de datos ofrece una gran cantidad de características más allá de las que normalmente están disponibles en conjuntos de datos similares. Proporciona información sobre los atributos, la popularidad y la presencia de cada canción en varias plataformas de música. El conjunto de datos incluye información como el nombre de la pista, el nombre del artista, la fecha de lanzamiento, las listas de reproducción y gráficos de Spotify, estadísticas de transmisión, presencia de Apple Music, presencia de Deezer, gráficos de Shazam y varias funciones de audio.
Datos obtenidos de: https://www.kaggle.com/datasets/nelgiriyewithana/top-spotify-songs-2023
Analizar el comportamiento de los usuarios en Spotify para comprender mejor sus preferencias musicales, patrones de escucha y cómo la plataforma puede mejorar la experiencia del usuario.
El objetivo de este análisis estadístico es explorar y comprender los patrones y tendencias en el comportamiento de las canciones en Spotify. Se busca identificar factores clave que influyen en la popularidad y éxito de las canciones en la plataforma.
La población de estudio comprende todas las canciones disponibles en Spotify.
Para llevar a cabo este análisis, se utilizará una muestra aleatoria estratificada que incluirá una variedad de géneros musicales y períodos de lanzamiento para garantizar representatividad.
La unidad de análisis en este estudio será las canciones mas escuchadas en este año 2023
El tipo de muestreo seleccionado para este análisis será muestreo aleatorio estratificado. Esta elección se basa en la necesidad de garantizar una representación equitativa de diferentes géneros musicales y períodos de lanzamiento en la muestra. Al estratificar la muestra por género musical y año de lanzamiento, se busca capturar la diversidad y variabilidad de la música disponible en Spotify.
released_year: Año de lanzamiento de la canción.
released_month: Mes de lanzamiento de la canción.
track_name: Nombre de la canción.
artist_name: Nombre del artista.
artist_count: Número de artistas en la canción.
released_day: Día de lanzamiento de la canción.
in_spotify_playlists: Número de playlists de Spotify en las que la
canción está incluida.
in_spotify_charts: Indicador de si la canción está en las listas de
éxitos de Spotify.
streams: Número de transmisiones de la canción.
in_apple_playlists: Número de playlists de Apple Music en las que la
canción está incluida.
in_apple_charts: Indicador de si la canción está en las listas de éxitos
de Apple Music.
in_deezer_playlists: Indicador de si la canción está en playlists de
Deezer.
in_deezer_charts: Indicador de si la canción está en las listas de
éxitos de Deezer.
in_shazam_charts: Indicador de si la canción está en las listas de
éxitos de Shazam.
bpm: Ritmos por minuto de la canción.
key: Tonalidad de la canción.
mode: Modo de la canción (mayor o menor).
danceability: Índice de capacidad de baile.
valence_: Índice de valencia.
energy_: Índice de energía.
acousticness_: Índice de acústica.
liveness_: Índice de vivacidad.
instrumentalness: Índice de instrumentalidad.
speechiness_: Índice de hablabilidad.
# Para limpiar el workspace, por si hubiera algun dataset
# o informacion cargada
rm(list = ls())
# Cambiar el directorio de trabajo
library(rstudioapi)
setwd(dirname(rstudioapi::getActiveDocumentContext()$path))
getwd()
## [1] "C:/Users/jerem/OneDrive/Documentos/Computación e informatica/CICLO 4/Estadística Aplicada a la Computación/Informe-Final-Estadistica-Aplicada"
enlace_url <- "https://raw.githubusercontent.com/cj-2022/Spotify-Conjunto-de-datos/main/spotify-2023.csv"
spotify_df <- read.csv(enlace_url, sep = ";")
head(spotify_df)
## track_name artist.s._name artist_count
## 1 Seven (feat. Latto) (Explicit Ver.) Latto, Jung Kook 2
## 2 LALA Myke Towers 1
## 3 vampire Olivia Rodrigo 1
## 4 Cruel Summer Taylor Swift 1
## 5 WHERE SHE GOES Bad Bunny 1
## 6 Sprinter Dave, Central Cee 2
## released_year released_month released_day in_spotify_playlists
## 1 2023 7 14 553
## 2 2023 3 23 1474
## 3 2023 6 30 1397
## 4 2019 8 23 7858
## 5 2023 5 18 3133
## 6 2023 6 1 2186
## in_spotify_charts streams in_apple_playlists in_apple_charts
## 1 147 141381703 43 263
## 2 48 133716286 48 126
## 3 113 140003974 94 207
## 4 100 800840817 116 207
## 5 50 303236322 84 133
## 6 91 183706234 67 213
## in_deezer_playlists in_deezer_charts in_shazam_charts bpm key mode
## 1 45 10 826 125 B Major
## 2 58 14 382 92 C# Major
## 3 91 14 949 138 F Major
## 4 125 12 548 170 A Major
## 5 87 15 425 144 A Minor
## 6 88 17 946 141 C# Major
## danceability_. valence_. energy_. acousticness_. instrumentalness_.
## 1 80 89 83 31 0
## 2 71 61 74 7 0
## 3 51 32 53 17 0
## 4 55 58 72 11 0
## 5 65 23 80 14 63
## 6 92 66 58 19 0
## liveness_. speechiness_. X X.1 X.2
## 1 8 4 NA NA NA
## 2 10 4 NA NA NA
## 3 31 6 NA NA NA
## 4 11 15 NA NA NA
## 5 11 6 NA NA NA
## 6 8 24 NA NA NA
write.csv(spotify_df, file = "Spotify.csv")
library(readxl)
spotify_excel <- read_excel("Spotify.xlsx")
head(spotify_excel)
## # A tibble: 6 × 28
## ...1 track_name artist.s._name artist_count released_year released_month
## <dbl> <chr> <chr> <chr> <chr> <chr>
## 1 1 Seven (feat. L… Latto, Jung K… 2 2023 7
## 2 2 LALA Myke Towers 1 2023 3
## 3 3 vampire Olivia Rodrigo 1 2023 6
## 4 4 Cruel Summer Taylor Swift 1 2019 8
## 5 5 WHERE SHE GOES Bad Bunny 1 2023 5
## 6 6 Sprinter Dave, Central… 2 2023 6
## # ℹ 22 more variables: released_day <dbl>, in_spotify_playlists <dbl>,
## # in_spotify_charts <dbl>, streams <chr>, in_apple_playlists <dbl>,
## # in_apple_charts <dbl>, in_deezer_playlists <dbl>, in_deezer_charts <dbl>,
## # in_shazam_charts <dbl>, bpm <dbl>, key <chr>, mode <chr>,
## # danceability_. <chr>, valence_. <chr>, energy_. <chr>,
## # acousticness_. <dbl>, instrumentalness_. <dbl>, liveness_. <dbl>,
## # speechiness_. <dbl>, X <chr>, X.1 <chr>, X.2 <chr>
spotify_csv <- read.csv("Spotify.csv")
head(spotify_csv)
## X.3 track_name artist.s._name artist_count
## 1 1 Seven (feat. Latto) (Explicit Ver.) Latto, Jung Kook 2
## 2 2 LALA Myke Towers 1
## 3 3 vampire Olivia Rodrigo 1
## 4 4 Cruel Summer Taylor Swift 1
## 5 5 WHERE SHE GOES Bad Bunny 1
## 6 6 Sprinter Dave, Central Cee 2
## released_year released_month released_day in_spotify_playlists
## 1 2023 7 14 553
## 2 2023 3 23 1474
## 3 2023 6 30 1397
## 4 2019 8 23 7858
## 5 2023 5 18 3133
## 6 2023 6 1 2186
## in_spotify_charts streams in_apple_playlists in_apple_charts
## 1 147 141381703 43 263
## 2 48 133716286 48 126
## 3 113 140003974 94 207
## 4 100 800840817 116 207
## 5 50 303236322 84 133
## 6 91 183706234 67 213
## in_deezer_playlists in_deezer_charts in_shazam_charts bpm key mode
## 1 45 10 826 125 B Major
## 2 58 14 382 92 C# Major
## 3 91 14 949 138 F Major
## 4 125 12 548 170 A Major
## 5 87 15 425 144 A Minor
## 6 88 17 946 141 C# Major
## danceability_. valence_. energy_. acousticness_. instrumentalness_.
## 1 80 89 83 31 0
## 2 71 61 74 7 0
## 3 51 32 53 17 0
## 4 55 58 72 11 0
## 5 65 23 80 14 63
## 6 92 66 58 19 0
## liveness_. speechiness_. X X.1 X.2
## 1 8 4 NA NA NA
## 2 10 4 NA NA NA
## 3 31 6 NA NA NA
## 4 11 15 NA NA NA
## 5 11 6 NA NA NA
## 6 8 24 NA NA NA
##spotify_copia <- read.delim("clipboard")
##head(spotify_copia)
##spotify_asistente <- read.csv(file.choose())
##head(spotify_asistente)
dim(spotify_csv)
## [1] 953 28
spotify <- read.csv("spotify-2023.csv", sep=",", stringsAsFactors = TRUE, encoding = "latin1")
head(spotify)
## track_name artist.s._name artist_count
## 1 Seven (feat. Latto) (Explicit Ver.) Latto, Jung Kook 2
## 2 LALA Myke Towers 1
## 3 vampire Olivia Rodrigo 1
## 4 Cruel Summer Taylor Swift 1
## 5 WHERE SHE GOES Bad Bunny 1
## 6 Sprinter Dave, Central Cee 2
## released_year released_month released_day in_spotify_playlists
## 1 2023 7 14 553
## 2 2023 3 23 1474
## 3 2023 6 30 1397
## 4 2019 8 23 7858
## 5 2023 5 18 3133
## 6 2023 6 1 2186
## in_spotify_charts streams in_apple_playlists in_apple_charts
## 1 147 141381703 43 263
## 2 48 133716286 48 126
## 3 113 140003974 94 207
## 4 100 800840817 116 207
## 5 50 303236322 84 133
## 6 91 183706234 67 213
## in_deezer_playlists in_deezer_charts in_shazam_charts bpm key mode
## 1 45 10 826 125 B Major
## 2 58 14 382 92 C# Major
## 3 91 14 949 138 F Major
## 4 125 12 548 170 A Major
## 5 87 15 425 144 A Minor
## 6 88 17 946 141 C# Major
## danceability_. valence_. energy_. acousticness_. instrumentalness_.
## 1 80 89 83 31 0
## 2 71 61 74 7 0
## 3 51 32 53 17 0
## 4 55 58 72 11 0
## 5 65 23 80 14 63
## 6 92 66 58 19 0
## liveness_. speechiness_.
## 1 8 4
## 2 10 4
## 3 31 6
## 4 11 15
## 5 11 6
## 6 8 24
mode_fi <- table(spotify$mode)
mode_fi
##
## Major Minor
## 550 403
released_year_fi <- table(spotify$released_year)
head(released_year_fi, 10)
##
## 1930 1942 1946 1950 1952 1957 1958 1959 1963 1968
## 1 1 1 1 1 2 3 2 3 1
mode_fi <- table(spotify$mode)
mode_hi_opcion1 <- mode_fi / length(spotify$mode)
mode_hi_opcion1
##
## Major Minor
## 0.5771249 0.4228751
mode_hi_opcion2 <- prop.table(mode_fi)
mode_hi_opcion2
##
## Major Minor
## 0.5771249 0.4228751
mode_hi <- prop.table(table(spotify$mode))
mode_hi
##
## Major Minor
## 0.5771249 0.4228751
artist_count_hi <- prop.table(table(spotify$artist_count)) * 100
head(artist_count_hi, 10)
##
## 1 2 3 4 5 6 7
## 61.5949633 26.6526758 8.9192025 1.5739769 0.5246590 0.3147954 0.2098636
## 8
## 0.2098636
mode_fi <- table(spotify$mode)
mode_hi <- prop.table(mode_fi)
mode_pi <- prop.table(mode_fi) * 100
cbind(mode_fi, mode_hi, mode_pi)
## mode_fi mode_hi mode_pi
## Major 550 0.5771249 57.71249
## Minor 403 0.4228751 42.28751
t(rbind(mode_fi, mode_hi, mode_pi))
## mode_fi mode_hi mode_pi
## Major 550 0.5771249 57.71249
## Minor 403 0.4228751 42.28751
cbind(mode_fi, mode_hi, mode_pi)
## mode_fi mode_hi mode_pi
## Major 550 0.5771249 57.71249
## Minor 403 0.4228751 42.28751
t(rbind(mode_fi, mode_hi, mode_pi))
## mode_fi mode_hi mode_pi
## Major 550 0.5771249 57.71249
## Minor 403 0.4228751 42.28751
# Convertir las variables relevantes en factor si no lo son
spotify$in_apple_playlists <- as.factor(spotify$in_apple_playlists)
spotify$in_apple_charts <- as.factor(spotify$in_apple_charts)
spotify$in_deezer_charts <- as.factor(spotify$in_deezer_charts)
# Volver a intentar el análisis de frecuencia
library(summarytools)
tabla_frecuencias <- freq(spotify$track_name, report.nas = TRUE)
head(tabla_frecuencias, 10)
## Freq % Valid % Valid Cum. % Total % Total Cum.
## 'Till I Collapse 1 0.1049318 0.1049318 0.1049318 0.1049318
## (It Goes Like) Nanana - Edit 1 0.1049318 0.2098636 0.1049318 0.2098636
## 10 Things I Hate About You 1 0.1049318 0.3147954 0.1049318 0.3147954
## 10:35 1 0.1049318 0.4197272 0.1049318 0.4197272
## 2 Be Loved (Am I Ready) 1 0.1049318 0.5246590 0.1049318 0.5246590
## 2055 1 0.1049318 0.6295908 0.1049318 0.6295908
## 212 1 0.1049318 0.7345226 0.1049318 0.7345226
## 25k jacket (feat. Lil Baby) 1 0.1049318 0.8394544 0.1049318 0.8394544
## 295 1 0.1049318 0.9443861 0.1049318 0.9443861
## 505 1 0.1049318 1.0493179 0.1049318 1.0493179
summary(spotify)
## track_name artist.s._name
## About Damn Time : 2 Taylor Swift : 34
## Daylight : 2 The Weeknd : 22
## Die For You : 2 Bad Bunny : 19
## Flowers : 2 SZA : 19
## Let It Snow! Let It Snow! Let It Snow!: 2 Harry Styles : 17
## Miss You : 2 Kendrick Lamar: 12
## (Other) :941 (Other) :830
## artist_count released_year released_month released_day
## Min. :1.000 Min. :1930 Min. : 1.000 Min. : 1.00
## 1st Qu.:1.000 1st Qu.:2020 1st Qu.: 3.000 1st Qu.: 6.00
## Median :1.000 Median :2022 Median : 6.000 Median :13.00
## Mean :1.556 Mean :2018 Mean : 6.034 Mean :13.93
## 3rd Qu.:2.000 3rd Qu.:2022 3rd Qu.: 9.000 3rd Qu.:22.00
## Max. :8.000 Max. :2023 Max. :12.000 Max. :31.00
##
## in_spotify_playlists in_spotify_charts streams in_apple_playlists
## Min. : 31 Min. : 0.00 1223481149: 2 0 : 23
## 1st Qu.: 875 1st Qu.: 0.00 156338624 : 2 8 : 22
## Median : 2224 Median : 3.00 395591396 : 2 4 : 20
## Mean : 5200 Mean : 12.01 723894473 : 2 7 : 20
## 3rd Qu.: 5542 3rd Qu.: 16.00 100409613 : 1 10 : 20
## Max. :52898 Max. :147.00 1007612429: 1 16 : 20
## (Other) :943 (Other):828
## in_apple_charts in_deezer_playlists in_deezer_charts in_shazam_charts
## 0 :100 0 : 24 0 :558 0 :344
## 1 : 40 15 : 23 1 :137 1 : 73
## 2 : 26 13 : 20 2 : 48 : 50
## 3 : 24 5 : 20 3 : 31 2 : 35
## 6 : 16 12 : 18 4 : 18 3 : 21
## 5 : 15 2 : 18 5 : 18 4 : 19
## (Other):732 (Other):830 (Other):143 (Other):411
## bpm key mode danceability_. valence_.
## Min. : 65.0 C# :120 Major:550 Min. :23.00 Min. : 4.00
## 1st Qu.:100.0 G : 96 Minor:403 1st Qu.:57.00 1st Qu.:32.00
## Median :121.0 : 95 Median :69.00 Median :51.00
## Mean :122.5 G# : 91 Mean :66.97 Mean :51.43
## 3rd Qu.:140.0 F : 89 3rd Qu.:78.00 3rd Qu.:70.00
## Max. :206.0 B : 81 Max. :96.00 Max. :97.00
## (Other):381
## energy_. acousticness_. instrumentalness_. liveness_.
## Min. : 9.00 Min. : 0.00 Min. : 0.000 Min. : 3.00
## 1st Qu.:53.00 1st Qu.: 6.00 1st Qu.: 0.000 1st Qu.:10.00
## Median :66.00 Median :18.00 Median : 0.000 Median :12.00
## Mean :64.28 Mean :27.06 Mean : 1.581 Mean :18.21
## 3rd Qu.:77.00 3rd Qu.:43.00 3rd Qu.: 0.000 3rd Qu.:24.00
## Max. :97.00 Max. :97.00 Max. :91.000 Max. :97.00
##
## speechiness_.
## Min. : 2.00
## 1st Qu.: 4.00
## Median : 6.00
## Mean :10.13
## 3rd Qu.:11.00
## Max. :64.00
##
Cuando la representación de la tabla tiene más de 12 filas (otros más de 15) no se debe presentar una tabla clásica, lo más conveniente es agrupar por intervalos. La opción más conocida es la regla de sturges (k=1+3.322*log(n))
# Asegurarse de que la columna streams sea numérica
spotify$streams <- as.numeric(spotify$streams)
# Calcular la tabla de frecuencia utilizando la librería agricolae
library(agricolae)
tabla_frecuencia_streams <- table.freq(hist(spotify$streams, breaks = "Sturges", plot = FALSE))
# Ver la tabla de frecuencia
tabla_frecuencia_streams
## Lower Upper Main Frequency Percentage CF CPF
## 1 0 100 50 101 10.6 101 10.6
## 2 100 200 150 100 10.5 201 21.1
## 3 200 300 250 101 10.6 302 31.7
## 4 300 400 350 100 10.5 402 42.2
## 5 400 500 450 100 10.5 502 52.7
## 6 500 600 550 100 10.5 602 63.2
## 7 600 700 650 101 10.6 703 73.8
## 8 700 800 750 100 10.5 803 84.3
## 9 800 900 850 101 10.6 904 94.9
## 10 900 1000 950 49 5.1 953 100.0
Tabla de acousticness_
# Asegurarse de que las columnas seleccionadas sean numéricas
spotify$acousticness_ <- as.numeric(spotify$acousticness_)
# Calcular la tabla de frecuencia agrupada para la variable acousticness_
tabla_frecuencia_acousticness <- table.freq(hist(spotify$acousticness_, breaks = "Sturges", plot = FALSE))
tabla_frecuencia_acousticness
## Lower Upper Main Frequency Percentage CF CPF
## 1 0 10 5 355 37.3 355 37.3
## 2 10 20 15 154 16.2 509 53.4
## 3 20 30 25 101 10.6 610 64.0
## 4 30 40 35 90 9.4 700 73.5
## 5 40 50 45 64 6.7 764 80.2
## 6 50 60 55 49 5.1 813 85.3
## 7 60 70 65 43 4.5 856 89.8
## 8 70 80 75 45 4.7 901 94.5
## 9 80 90 85 36 3.8 937 98.3
## 10 90 100 95 16 1.7 953 100.0
Tabla de instrumentalness_
# Asegurarse de que las columnas seleccionadas sean numéricas
spotify$instrumentalness_ <- as.numeric(spotify$instrumentalness_)
# Calcular la tabla de frecuencia agrupada para la variable instrumentalness_
tabla_frecuencia_instrumentalness <- table.freq(hist(spotify$instrumentalness_, breaks = "Sturges", plot = FALSE))
tabla_frecuencia_instrumentalness
## Lower Upper Main Frequency Percentage CF CPF
## 1 0 10 5 917 96.2 917 96.2
## 2 10 20 15 12 1.3 929 97.5
## 3 20 30 25 7 0.7 936 98.2
## 4 30 40 35 2 0.2 938 98.4
## 5 40 50 45 5 0.5 943 99.0
## 6 50 60 55 2 0.2 945 99.2
## 7 60 70 65 4 0.4 949 99.6
## 8 70 80 75 1 0.1 950 99.7
## 9 80 90 85 2 0.2 952 99.9
## 10 90 100 95 1 0.1 953 100.0
#Cargar la libreria
library(ggplot2)
# Gráfico de barras para variables cualitativas nominales
ggplot(spotify, aes(x = `artist_count`, fill = `artist_count`, group = `artist_count`)) +
geom_bar(color = "black") +
labs(title = "Gráfico de Barras para Artistas de Canciones en Spotify") +
theme_minimal()
ggplot(spotify_csv, aes(x = factor(1), fill = in_spotify_charts, group = in_spotify_charts)) +
geom_bar(width = 1, color = "black") +
coord_polar(theta = "y") +
labs(title = "Gráfico Circular (Pastel) para Presencia en Listas de Éxitos en Spotify") +
theme_void()
ggplot(spotify, aes(x = released_year)) +
geom_bar(fill = "lightcoral", color = "black") +
labs(title = "Gráfico de Barras para Año de Lanzamiento de Canciones en Spotify") +
theme_minimal()
ggplot(spotify, aes(x = factor(1), fill = key, group = key)) +
geom_bar(width = 1, color = "black") +
coord_polar(theta = "y") +
labs(title = "Gráfico Circular (Pastel) para Tonalidad de Canciones en Spotify") +
theme_void()
ggplot(spotify, aes(x = streams)) +
geom_bar(fill = "gold", color = "black") +
labs(title = "Gráfico de Barras para Número de Streams de Canciones en Spotify") +
theme_minimal()
ggplot(spotify, aes(x = energy_.)) +
geom_histogram(binwidth = 1, fill = "lightblue", color = "black") +
labs(title = "Histograma para Nivel de Energía de Canciones en Spotify") +
theme_minimal()
ggplot(spotify, aes(x = danceability_.)) +
geom_histogram(binwidth = 5, fill = "lightgreen", color = "black") +
labs(title = "Histograma para Índice de Capacidad de Baile de Canciones en Spotify") +
theme_minimal()
ggplot(spotify, aes(y = valence_.)) +
geom_boxplot(fill = "lightblue", color = "black") +
labs(title = "Diagrama de Caja para Positividad de Canciones en Spotify") +
theme_minimal()
ggplot(spotify, aes(x = acousticness_.)) +
geom_density(alpha = 0.5, fill = "orange") +
labs(title = "Gráfico de Densidad para acústica de Canciones en Spotify") +
theme_minimal()
mean_speechiness<- mean(spotify$speechiness_.)
cat("Media:", mean_speechiness)
## Media: 10.13116
median_speechiness <- median(spotify$speechiness_.)
cat("Mediana:", median_speechiness)
## Mediana: 6
table_speechiness <- table(spotify$speechiness_.)
moda_speechiness <- as.numeric(names(table_speechiness)[table_speechiness == max(table_speechiness)])
cat("Moda:", moda_speechiness)
## Moda: 4
range_speechiness <- max(spotify$speechiness_.) - min(spotify$speechiness_.)
cat("Rango:", range_speechiness)
## Rango: 62
var_speechiness <- var(spotify$speechiness_.)
cat("Varianza:", var_speechiness)
## Varianza: 98.26534
sd_speechiness <- sd(spotify$speechiness_.)
cat("Desviación Estándar:", sd_speechiness)
## Desviación Estándar: 9.912888
cv_speechiness <- sd_speechiness / mean_speechiness * 100
cat("Coeficiente de Variación:", cv_speechiness)
## Coeficiente de Variación: 97.84549
str(spotify)
## 'data.frame': 953 obs. of 26 variables:
## $ track_name : Factor w/ 943 levels "'Till I Collapse",..: 700 423 879 175 910 753 243 160 298 409 ...
## $ artist.s._name : Factor w/ 645 levels "(G)I-DLE","21 Savage, Gunna",..: 331 409 438 563 39 125 181 476 219 458 ...
## $ artist_count : int 2 1 1 1 1 2 2 1 1 2 ...
## $ released_year : int 2023 2023 2023 2019 2023 2023 2023 2023 2023 2023 ...
## $ released_month : int 7 3 6 8 5 6 3 7 5 3 ...
## $ released_day : int 14 23 30 23 18 1 16 7 15 17 ...
## $ in_spotify_playlists: int 553 1474 1397 7858 3133 2186 3090 714 1096 2953 ...
## $ in_spotify_charts : int 147 48 113 100 50 91 50 43 83 44 ...
## $ streams : num 157 126 152 865 500 281 832 738 934 718 ...
## $ in_apple_playlists : Factor w/ 234 levels "0","1","2","3",..: 44 49 93 111 83 66 35 26 61 50 ...
## $ in_apple_charts : Factor w/ 172 levels "0","1","2","3",..: 170 125 163 163 130 166 168 88 164 109 ...
## $ in_deezer_playlists : Factor w/ 348 levels "0","1","1,003",..: 218 263 338 51 331 332 211 169 229 292 ...
## $ in_deezer_charts : Factor w/ 34 levels "0","1","2","3",..: 11 15 15 13 16 18 14 14 12 14 ...
## $ in_shazam_charts : Factor w/ 199 levels "","0","1","1,021",..: 187 120 195 151 127 194 125 61 197 110 ...
## $ bpm : int 125 92 138 170 144 141 148 100 130 170 ...
## $ key : Factor w/ 12 levels "","A","A#","B",..: 4 5 9 2 2 5 9 9 5 6 ...
## $ mode : Factor w/ 2 levels "Major","Minor": 1 1 1 1 2 1 2 1 2 2 ...
## $ danceability_. : int 80 71 51 55 65 92 67 67 85 81 ...
## $ valence_. : int 89 61 32 58 23 66 83 26 22 56 ...
## $ energy_. : int 83 74 53 72 80 58 76 71 62 48 ...
## $ acousticness_. : int 31 7 17 11 14 19 48 37 12 21 ...
## $ instrumentalness_. : int 0 0 0 0 63 0 0 0 0 0 ...
## $ liveness_. : int 8 10 31 11 11 8 8 11 28 8 ...
## $ speechiness_. : int 4 4 6 15 6 24 3 4 9 33 ...
## $ acousticness_ : num 31 7 17 11 14 19 48 37 12 21 ...
## $ instrumentalness_ : num 0 0 0 0 63 0 0 0 0 0 ...
cuartiles_speechines <- quantile(spotify$speechiness_., probs = c(0, 0.25, 0.5, 0.75, 1))
cuartiles_speechines
## 0% 25% 50% 75% 100%
## 2 4 6 11 64
Resultado /## 0% 25% 50% 75% 100%
/## 2 4 6 11 64
El valor minimo de cantidad de ‘speechiness_.’ es 2.
El 25% de las canciones tienen ‘speechiness_.’ iguales o inferiores al cuartil 1 (4).
El 50% de las canciones tienen ‘speechiness_.’ iguales o inferiores al cuartil 2 (6).
El 75% de las canciones tienen ‘speechiness_.’ iguales o inferiores al cuartil 3 (11).
El valor máximo de speechiness_% es el cuartil 4 (64).
deciles_speechiness <- data.frame(
Deciles = seq(0, 1, 0.1),
Valor = quantile(spotify$speechiness_., probs = seq(0, 1, 0.1))
)
deciles_speechiness_ordenado <- deciles_speechiness[order(deciles_speechiness$Deciles), ]
deciles_speechiness_ordenado
## Deciles Valor
## 0% 0.0 2
## 10% 0.1 3
## 20% 0.2 4
## 30% 0.3 4
## 40% 0.4 5
## 50% 0.5 6
## 60% 0.6 7
## 70% 0.7 9
## 80% 0.8 14
## 90% 0.9 26
## 100% 1.0 64
percentiles_speechiness <- data.frame(
Percentiles = seq(0, 1, 0.01),
Valor = quantile(spotify$speechiness_., probs = seq(0, 1, 0.01))
)
percentiles_speechiness_ordenado <- percentiles_speechiness[order(percentiles_speechiness$Percentiles), ]
head(percentiles_speechiness_ordenado, 10)
## Percentiles Valor
## 0% 0.00 2
## 1% 0.01 3
## 2% 0.02 3
## 3% 0.03 3
## 4% 0.04 3
## 5% 0.05 3
## 6% 0.06 3
## 7% 0.07 3
## 8% 0.08 3
## 9% 0.09 3
library(fBasics)
asimetria_speechiness <- skewness(spotify$speechiness_.)
cat("Asimetría:", asimetria_speechiness, "\n")
## Asimetría: 1.928582
curtosis_speechiness <- kurtosis(spotify$speechiness_.)
cat("Curtosis:", curtosis_speechiness, "\n")
## Curtosis: 3.337138
Si el valor de asimetría es positivo, la distribución es asimétrica positiva, lo que significa que los valores están concentrados en los puntos mínimos. Si es negativo, sería asimétrica negativa, indicando concentración en puntos máximos.
Para la curtosis, si el valor es mayor que 3, la distribución es leptocúrtica, lo que implica que los datos están muy concentrados alrededor de las medidas de tendencia central.
hist(spotify$speechiness_., col = "skyblue", main = "Histograma de Speechiness", xlab = "Speechiness")
# Cargar conjunto de datos
spotify_missing <- read.csv("Spotify-Missing-2023.csv", sep = ";" , stringsAsFactors = TRUE)
# Mostrar datos
head(spotify_missing)
## track_name artist.s._name artist_count
## 1 Seven (feat. Latto) (Explicit Ver.) Latto, Jung Kook 2
## 2 LALA Myke Towers 1
## 3 vampire Olivia Rodrigo 1
## 4 Cruel Summer Taylor Swift 1
## 5 WHERE SHE GOES Bad Bunny 1
## 6 Sprinter Dave, Central Cee 2
## released_year released_month released_day in_spotify_playlists
## 1 2023 7 14 553
## 2 2023 3 23 1474
## 3 2023 6 30 1397
## 4 2019 8 23 7858
## 5 2023 5 18 3133
## 6 2023 6 1 2186
## in_spotify_charts streams in_apple_playlists in_apple_charts
## 1 147 141381703 43 263
## 2 48 133716286 48 126
## 3 113 140003974 94 207
## 4 100 800840817 116 207
## 5 50 303236322 84 133
## 6 91 183706234 67 213
## in_deezer_playlists in_deezer_charts in_shazam_charts bpm key mode
## 1 45 10 826 125 B Major
## 2 58 14 382 92 C# Major
## 3 91 14 949 138 F Major
## 4 125 12 548 170 A Major
## 5 87 15 425 144 A Minor
## 6 88 17 946 141 C# Major
## danceability_. valence_. energy_. acousticness_. instrumentalness_.
## 1 80 89 83 31 0
## 2 71 61 74 7 0
## 3 51 32 53 17 0
## 4 55 58 72 11 0
## 5 65 23 80 14 63
## 6 92 66 58 19 0
## liveness_. speechiness_.
## 1 8 4
## 2 10 4
## 3 31 6
## 4 11 15
## 5 11 6
## 6 8 24
# Mostrar la extructura
str(spotify_missing)
## 'data.frame': 953 obs. of 24 variables:
## $ track_name : Factor w/ 914 levels "","'Till I Collapse",..: 678 409 852 168 883 730 235 154 288 396 ...
## $ artist.s._name : Factor w/ 639 levels "","(G)I-DLE",..: 327 405 433 558 40 126 182 471 219 453 ...
## $ artist_count : int 2 1 1 1 1 2 2 1 1 2 ...
## $ released_year : int 2023 2023 2023 2019 2023 2023 2023 2023 2023 2023 ...
## $ released_month : int 7 3 6 8 5 6 3 7 5 3 ...
## $ released_day : int 14 23 30 23 18 1 16 7 15 17 ...
## $ in_spotify_playlists: int 553 1474 1397 7858 3133 2186 3090 714 1096 2953 ...
## $ in_spotify_charts : int 147 48 113 100 50 91 50 43 83 44 ...
## $ streams : Factor w/ 922 levels "","100409613",..: 154 123 149 839 484 272 807 719 907 699 ...
## $ in_apple_playlists : int 43 48 94 116 84 67 34 25 60 49 ...
## $ in_apple_charts : int 263 126 207 207 133 213 222 89 210 110 ...
## $ in_deezer_playlists : Factor w/ 347 levels "","0","1","1,003",..: 218 263 337 52 330 331 211 169 229 291 ...
## $ in_deezer_charts : int 10 14 14 12 15 17 13 13 11 13 ...
## $ in_shazam_charts : Factor w/ 198 levels "","0","1","1,021",..: 186 119 194 150 126 193 124 60 196 109 ...
## $ bpm : int 125 92 138 170 144 141 148 100 130 170 ...
## $ key : Factor w/ 12 levels "","A","A#","B",..: 4 5 9 2 2 5 9 9 5 6 ...
## $ mode : Factor w/ 3 levels "","Major","Minor": 2 2 2 2 3 2 3 2 3 3 ...
## $ danceability_. : int 80 71 51 55 65 92 67 67 85 81 ...
## $ valence_. : int 89 61 32 58 23 66 83 26 22 56 ...
## $ energy_. : int 83 74 53 72 80 58 76 71 62 48 ...
## $ acousticness_. : int 31 7 17 11 14 19 48 37 12 21 ...
## $ instrumentalness_. : int 0 0 0 0 63 0 0 0 0 0 ...
## $ liveness_. : int 8 10 31 11 11 8 8 11 28 8 ...
## $ speechiness_. : int 4 4 6 15 6 24 3 4 9 33 ...
# Verificar colummnas con missing
which(colSums(is.na(spotify_missing))!=0)
## artist_count released_year released_month
## 3 4 5
## released_day in_spotify_playlists in_spotify_charts
## 6 7 8
## in_apple_playlists in_apple_charts in_deezer_charts
## 10 11 13
## bpm danceability_. valence_.
## 15 18 19
## energy_. acousticness_. instrumentalness_.
## 20 21 22
## liveness_. speechiness_.
## 23 24
library(VIM)
library(mice)
resumen_missing <- aggr(spotify_missing, numbers=T)
# Resumen de datos
summary(resumen_missing)
##
## Missings per variable:
## Variable Count
## track_name 0
## artist.s._name 0
## artist_count 7
## released_year 21
## released_month 7
## released_day 7
## in_spotify_playlists 7
## in_spotify_charts 2
## streams 0
## in_apple_playlists 7
## in_apple_charts 8
## in_deezer_playlists 0
## in_deezer_charts 11
## in_shazam_charts 0
## bpm 9
## key 0
## mode 0
## danceability_. 3
## valence_. 7
## energy_. 11
## acousticness_. 5
## instrumentalness_. 9
## liveness_. 6
## speechiness_. 10
##
## Missings in combinations of variables:
## Combinations Count Percent
## 0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0 836 87.7229801
## 0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:1 6 0.6295908
## 0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:1:0 4 0.4197272
## 0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:1:0:0 7 0.7345226
## 0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:1:0:0:0 3 0.3147954
## 0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:1:0:0:1 1 0.1049318
## 0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:1:0:1:0 1 0.1049318
## 0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:1:0:0:0:0 6 0.6295908
## 0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:1:0:0:1:0 1 0.1049318
## 0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:1:0:1:0:0 1 0.1049318
## 0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:1:0:0:0:0:0 2 0.2098636
## 0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:1:0:0:0:0:1 2 0.2098636
## 0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:1:0:0:0:0:0:0 2 0.2098636
## 0:0:0:0:0:0:0:0:0:0:0:0:0:0:1:0:0:0:0:0:0:0:0:0 7 0.7345226
## 0:0:0:0:0:0:0:0:0:0:0:0:0:0:1:0:0:0:0:1:0:0:0:0 1 0.1049318
## 0:0:0:0:0:0:0:0:0:0:0:0:1:0:0:0:0:0:0:0:0:0:0:0 11 1.1542497
## 0:0:0:0:0:0:0:0:0:0:1:0:0:0:0:0:0:0:0:0:0:0:0:0 5 0.5246590
## 0:0:0:0:0:0:0:0:0:0:1:0:0:0:0:0:0:0:1:0:0:0:0:0 1 0.1049318
## 0:0:0:0:0:0:0:0:0:1:0:0:0:0:0:0:0:0:0:0:0:0:0:0 6 0.6295908
## 0:0:0:0:0:0:0:0:0:1:0:0:0:0:0:0:0:0:1:0:0:0:0:0 1 0.1049318
## 0:0:0:0:0:0:0:1:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0 1 0.1049318
## 0:0:0:0:0:0:1:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0 3 0.3147954
## 0:0:0:0:0:0:1:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:1 1 0.1049318
## 0:0:0:0:0:0:1:0:0:0:0:0:0:0:0:0:0:1:0:0:0:0:0:0 1 0.1049318
## 0:0:0:0:0:0:1:0:0:0:1:0:0:0:0:0:0:0:0:0:0:0:0:0 1 0.1049318
## 0:0:0:0:0:1:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0 4 0.4197272
## 0:0:0:0:0:1:0:0:0:0:0:0:0:0:0:0:0:0:1:0:0:0:0:0 1 0.1049318
## 0:0:0:0:0:1:0:0:0:0:0:0:0:0:1:0:0:0:0:0:0:0:0:0 1 0.1049318
## 0:0:0:0:0:1:0:0:0:0:1:0:0:0:0:0:0:0:0:0:0:0:0:0 1 0.1049318
## 0:0:0:0:1:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0 7 0.7345226
## 0:0:0:1:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0 17 1.7838405
## 0:0:0:1:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:1:0:0 1 0.1049318
## 0:0:0:1:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:1:0:0:0:0 1 0.1049318
## 0:0:0:1:0:0:0:1:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0 1 0.1049318
## 0:0:0:1:0:0:1:0:0:0:0:0:0:0:0:0:0:0:0:1:0:0:0:0 1 0.1049318
## 0:0:1:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0 7 0.7345226
Para determinar mejor los patrones de comportamiento de missing se puede utilizar la siguiente funcion
matrixplot(spotify_missing)
Otra representacion
# Con libreria mice
md.pattern(spotify_missing, rotate.names = TRUE)
## track_name artist.s._name streams in_deezer_playlists in_shazam_charts key
## 836 1 1 1 1 1 1
## 17 1 1 1 1 1 1
## 6 1 1 1 1 1 1
## 1 1 1 1 1 1 1
## 11 1 1 1 1 1 1
## 6 1 1 1 1 1 1
## 7 1 1 1 1 1 1
## 1 1 1 1 1 1 1
## 1 1 1 1 1 1 1
## 7 1 1 1 1 1 1
## 1 1 1 1 1 1 1
## 5 1 1 1 1 1 1
## 2 1 1 1 1 1 1
## 2 1 1 1 1 1 1
## 1 1 1 1 1 1 1
## 6 1 1 1 1 1 1
## 1 1 1 1 1 1 1
## 3 1 1 1 1 1 1
## 1 1 1 1 1 1 1
## 1 1 1 1 1 1 1
## 1 1 1 1 1 1 1
## 4 1 1 1 1 1 1
## 1 1 1 1 1 1 1
## 1 1 1 1 1 1 1
## 1 1 1 1 1 1 1
## 7 1 1 1 1 1 1
## 7 1 1 1 1 1 1
## 4 1 1 1 1 1 1
## 1 1 1 1 1 1 1
## 3 1 1 1 1 1 1
## 1 1 1 1 1 1 1
## 1 1 1 1 1 1 1
## 2 1 1 1 1 1 1
## 1 1 1 1 1 1 1
## 1 1 1 1 1 1 1
## 1 1 1 1 1 1 1
## 0 0 0 0 0 0
## mode in_spotify_charts danceability_. acousticness_. liveness_.
## 836 1 1 1 1 1
## 17 1 1 1 1 1
## 6 1 1 1 1 1
## 1 1 1 1 1 1
## 11 1 1 1 1 1
## 6 1 1 1 1 1
## 7 1 1 1 1 1
## 1 1 1 1 1 1
## 1 1 1 1 1 1
## 7 1 1 1 1 1
## 1 1 1 1 1 1
## 5 1 1 1 1 1
## 2 1 1 1 1 1
## 2 1 1 1 1 1
## 1 1 1 1 1 1
## 6 1 1 1 1 1
## 1 1 1 1 1 1
## 3 1 1 1 1 1
## 1 1 1 1 1 1
## 1 1 1 1 1 1
## 1 1 1 1 1 1
## 4 1 1 1 1 1
## 1 1 1 1 1 1
## 1 1 1 1 1 1
## 1 1 1 1 1 1
## 7 1 1 1 1 1
## 7 1 1 1 1 1
## 4 1 1 1 1 0
## 1 1 1 1 1 0
## 3 1 1 1 0 1
## 1 1 1 1 0 1
## 1 1 1 1 0 0
## 2 1 1 0 1 1
## 1 1 1 0 1 1
## 1 1 0 1 1 1
## 1 1 0 1 1 1
## 0 2 3 5 6
## artist_count released_month released_day in_spotify_playlists
## 836 1 1 1 1
## 17 1 1 1 1
## 6 1 1 1 1
## 1 1 1 1 1
## 11 1 1 1 1
## 6 1 1 1 1
## 7 1 1 1 1
## 1 1 1 1 1
## 1 1 1 1 1
## 7 1 1 1 1
## 1 1 1 1 1
## 5 1 1 1 1
## 2 1 1 1 1
## 2 1 1 1 1
## 1 1 1 1 1
## 6 1 1 1 1
## 1 1 1 1 1
## 3 1 1 1 0
## 1 1 1 1 0
## 1 1 1 1 0
## 1 1 1 1 0
## 4 1 1 0 1
## 1 1 1 0 1
## 1 1 1 0 1
## 1 1 1 0 1
## 7 1 0 1 1
## 7 0 1 1 1
## 4 1 1 1 1
## 1 1 1 1 1
## 3 1 1 1 1
## 1 1 1 1 1
## 1 1 1 1 1
## 2 1 1 1 1
## 1 1 1 1 0
## 1 1 1 1 1
## 1 1 1 1 1
## 7 7 7 7
## in_apple_playlists valence_. in_apple_charts bpm instrumentalness_.
## 836 1 1 1 1 1
## 17 1 1 1 1 1
## 6 1 1 1 1 1
## 1 1 1 1 1 1
## 11 1 1 1 1 1
## 6 1 1 1 1 1
## 7 1 1 1 1 0
## 1 1 1 1 1 0
## 1 1 1 1 1 0
## 7 1 1 1 0 1
## 1 1 1 1 0 1
## 5 1 1 0 1 1
## 2 1 0 1 1 1
## 2 1 0 1 1 1
## 1 1 0 0 1 1
## 6 0 1 1 1 1
## 1 0 0 1 1 1
## 3 1 1 1 1 1
## 1 1 1 1 1 1
## 1 1 1 1 1 1
## 1 1 1 0 1 1
## 4 1 1 1 1 1
## 1 1 1 1 0 1
## 1 1 1 0 1 1
## 1 1 0 1 1 1
## 7 1 1 1 1 1
## 7 1 1 1 1 1
## 4 1 1 1 1 1
## 1 1 1 1 1 1
## 3 1 1 1 1 1
## 1 1 1 1 1 1
## 1 1 1 1 1 1
## 2 1 1 1 1 1
## 1 1 1 1 1 1
## 1 1 1 1 1 1
## 1 1 1 1 1 1
## 7 7 8 9 9
## speechiness_. in_deezer_charts energy_. released_year
## 836 1 1 1 1 0
## 17 1 1 1 0 1
## 6 1 1 0 1 1
## 1 1 1 0 0 2
## 11 1 0 1 1 1
## 6 0 1 1 1 1
## 7 1 1 1 1 1
## 1 1 1 1 0 2
## 1 1 1 0 1 2
## 7 1 1 1 1 1
## 1 1 1 0 1 2
## 5 1 1 1 1 1
## 2 1 1 1 1 1
## 2 0 1 1 1 2
## 1 1 1 1 1 2
## 6 1 1 1 1 1
## 1 1 1 1 1 2
## 3 1 1 1 1 1
## 1 1 1 0 0 3
## 1 0 1 1 1 2
## 1 1 1 1 1 2
## 4 1 1 1 1 1
## 1 1 1 1 1 2
## 1 1 1 1 1 2
## 1 1 1 1 1 2
## 7 1 1 1 1 1
## 7 1 1 1 1 1
## 4 1 1 1 1 1
## 1 1 1 0 1 2
## 3 1 1 1 1 1
## 1 0 1 1 1 2
## 1 1 1 1 1 2
## 2 1 1 1 1 1
## 1 1 1 1 1 2
## 1 1 1 1 1 1
## 1 1 1 1 0 2
## 10 11 11 21 137
La libreria visdat permite visualizar missing pero los ordena por tipo de datos
library(visdat)
## Warning: package 'visdat' was built under R version 4.3.2
vis_dat(spotify_missing)
Para obtener colummnas con porcentajes de missing
vis_miss(spotify_missing)
Eliminar filas o colummnas con missing (es recomendable optar por eliminar columnas si el % de missing esta por arriba de 15% <para algunos expertos 30%>)
Solo para este ejemplo se va a eliminar filas:
spotify_missing_corregido1 <- na.omit(spotify_missing)
str(spotify_missing_corregido1)
## 'data.frame': 836 obs. of 24 variables:
## $ track_name : Factor w/ 914 levels "","'Till I Collapse",..: 678 409 852 168 883 730 235 154 288 396 ...
## $ artist.s._name : Factor w/ 639 levels "","(G)I-DLE",..: 327 405 433 558 40 126 182 471 219 453 ...
## $ artist_count : int 2 1 1 1 1 2 2 1 1 2 ...
## $ released_year : int 2023 2023 2023 2019 2023 2023 2023 2023 2023 2023 ...
## $ released_month : int 7 3 6 8 5 6 3 7 5 3 ...
## $ released_day : int 14 23 30 23 18 1 16 7 15 17 ...
## $ in_spotify_playlists: int 553 1474 1397 7858 3133 2186 3090 714 1096 2953 ...
## $ in_spotify_charts : int 147 48 113 100 50 91 50 43 83 44 ...
## $ streams : Factor w/ 922 levels "","100409613",..: 154 123 149 839 484 272 807 719 907 699 ...
## $ in_apple_playlists : int 43 48 94 116 84 67 34 25 60 49 ...
## $ in_apple_charts : int 263 126 207 207 133 213 222 89 210 110 ...
## $ in_deezer_playlists : Factor w/ 347 levels "","0","1","1,003",..: 218 263 337 52 330 331 211 169 229 291 ...
## $ in_deezer_charts : int 10 14 14 12 15 17 13 13 11 13 ...
## $ in_shazam_charts : Factor w/ 198 levels "","0","1","1,021",..: 186 119 194 150 126 193 124 60 196 109 ...
## $ bpm : int 125 92 138 170 144 141 148 100 130 170 ...
## $ key : Factor w/ 12 levels "","A","A#","B",..: 4 5 9 2 2 5 9 9 5 6 ...
## $ mode : Factor w/ 3 levels "","Major","Minor": 2 2 2 2 3 2 3 2 3 3 ...
## $ danceability_. : int 80 71 51 55 65 92 67 67 85 81 ...
## $ valence_. : int 89 61 32 58 23 66 83 26 22 56 ...
## $ energy_. : int 83 74 53 72 80 58 76 71 62 48 ...
## $ acousticness_. : int 31 7 17 11 14 19 48 37 12 21 ...
## $ instrumentalness_. : int 0 0 0 0 63 0 0 0 0 0 ...
## $ liveness_. : int 8 10 31 11 11 8 8 11 28 8 ...
## $ speechiness_. : int 4 4 6 15 6 24 3 4 9 33 ...
## - attr(*, "na.action")= 'omit' Named int [1:117] 28 36 44 48 52 62 63 64 67 70 ...
## ..- attr(*, "names")= chr [1:117] "28" "36" "44" "48" ...
which(colSums(is.na(spotify_missing_corregido1))!=0)
## named integer(0)
Imputación por medidas de tendencia central
library(DMwR2)
spotify_missing_corregido2 <- centralImputation(spotify_missing) #DMwR, mediana (númerico), moda(no númerico)
str(spotify_missing_corregido2)
## 'data.frame': 953 obs. of 24 variables:
## $ track_name : Factor w/ 914 levels "","'Till I Collapse",..: 678 409 852 168 883 730 235 154 288 396 ...
## $ artist.s._name : Factor w/ 639 levels "","(G)I-DLE",..: 327 405 433 558 40 126 182 471 219 453 ...
## $ artist_count : num 2 1 1 1 1 2 2 1 1 2 ...
## $ released_year : num 2023 2023 2023 2019 2023 ...
## $ released_month : num 7 3 6 8 5 6 3 7 5 3 ...
## $ released_day : num 14 23 30 23 18 1 16 7 15 17 ...
## $ in_spotify_playlists: num 553 1474 1397 7858 3133 ...
## $ in_spotify_charts : int 147 48 113 100 50 91 50 43 83 44 ...
## $ streams : Factor w/ 922 levels "","100409613",..: 154 123 149 839 484 272 807 719 907 699 ...
## $ in_apple_playlists : num 43 48 94 116 84 67 34 25 60 49 ...
## $ in_apple_charts : int 263 126 207 207 133 213 222 89 210 110 ...
## $ in_deezer_playlists : Factor w/ 347 levels "","0","1","1,003",..: 218 263 337 52 330 331 211 169 229 291 ...
## $ in_deezer_charts : num 10 14 14 12 15 17 13 13 11 13 ...
## $ in_shazam_charts : Factor w/ 198 levels "","0","1","1,021",..: 186 119 194 150 126 193 124 60 196 109 ...
## $ bpm : num 125 92 138 170 144 141 148 100 130 170 ...
## $ key : Factor w/ 12 levels "","A","A#","B",..: 4 5 9 2 2 5 9 9 5 6 ...
## $ mode : Factor w/ 3 levels "","Major","Minor": 2 2 2 2 3 2 3 2 3 3 ...
## $ danceability_. : num 80 71 51 55 65 92 67 67 85 81 ...
## $ valence_. : num 89 61 32 58 23 66 83 26 22 56 ...
## $ energy_. : num 83 74 53 72 80 58 76 71 62 48 ...
## $ acousticness_. : num 31 7 17 11 14 19 48 37 12 21 ...
## $ instrumentalness_. : num 0 0 0 0 63 0 0 0 0 0 ...
## $ liveness_. : int 8 10 31 11 11 8 8 11 28 8 ...
## $ speechiness_. : int 4 4 6 15 6 24 3 4 9 33 ...
#Verificar columnas con missing
which(colSums(is.na(spotify_missing_corregido2))!=0)
## named integer(0)
library(VIM)
spotify_missing_corregido3 <- initialise(spotify_missing,method="median") #media (continuos) mediana (discretos), moda(no númerico)
str(spotify_missing_corregido3)
## 'data.frame': 953 obs. of 24 variables:
## $ track_name : Factor w/ 914 levels "","'Till I Collapse",..: 678 409 852 168 883 730 235 154 288 396 ...
## $ artist.s._name : Factor w/ 639 levels "","(G)I-DLE",..: 327 405 433 558 40 126 182 471 219 453 ...
## $ artist_count : num 2 1 1 1 1 2 2 1 1 2 ...
## $ released_year : num 2023 2023 2023 2019 2023 ...
## $ released_month : num 7 3 6 8 5 6 3 7 5 3 ...
## $ released_day : num 14 23 30 23 18 1 16 7 15 17 ...
## $ in_spotify_playlists: num 553 1474 1397 7858 3133 ...
## $ in_spotify_charts : int 147 48 113 100 50 91 50 43 83 44 ...
## $ streams : Factor w/ 922 levels "","100409613",..: 154 123 149 839 484 272 807 719 907 699 ...
## $ in_apple_playlists : num 43 48 94 116 84 67 34 25 60 49 ...
## $ in_apple_charts : int 263 126 207 207 133 213 222 89 210 110 ...
## $ in_deezer_playlists : Factor w/ 347 levels "","0","1","1,003",..: 218 263 337 52 330 331 211 169 229 291 ...
## $ in_deezer_charts : num 10 14 14 12 15 17 13 13 11 13 ...
## $ in_shazam_charts : Factor w/ 198 levels "","0","1","1,021",..: 186 119 194 150 126 193 124 60 196 109 ...
## $ bpm : num 125 92 138 170 144 141 148 100 130 170 ...
## $ key : Factor w/ 12 levels "","A","A#","B",..: 4 5 9 2 2 5 9 9 5 6 ...
## $ mode : Factor w/ 3 levels "","Major","Minor": 2 2 2 2 3 2 3 2 3 3 ...
## $ danceability_. : num 80 71 51 55 65 92 67 67 85 81 ...
## $ valence_. : num 89 61 32 58 23 66 83 26 22 56 ...
## $ energy_. : num 83 74 53 72 80 58 76 71 62 48 ...
## $ acousticness_. : num 31 7 17 11 14 19 48 37 12 21 ...
## $ instrumentalness_. : num 0 0 0 0 63 0 0 0 0 0 ...
## $ liveness_. : int 8 10 31 11 11 8 8 11 28 8 ...
## $ speechiness_. : int 4 4 6 15 6 24 3 4 9 33 ...
#Verificar columnas con missing
which(colSums(is.na(spotify_missing_corregido3))!=0)
## named integer(0)
Imputacion utilizando vecinos mas cercanos
spotify_missing_corregido4 <- knnImputation(spotify_missing, k = 5)
str(spotify_missing_corregido4)
## 'data.frame': 953 obs. of 24 variables:
## $ track_name : Factor w/ 914 levels "","'Till I Collapse",..: 678 409 852 168 883 730 235 154 288 396 ...
## $ artist.s._name : Factor w/ 639 levels "","(G)I-DLE",..: 327 405 433 558 40 126 182 471 219 453 ...
## $ artist_count : num 2 1 1 1 1 2 2 1 1 2 ...
## $ released_year : num 2023 2023 2023 2019 2023 ...
## $ released_month : num 7 3 6 8 5 6 3 7 5 3 ...
## $ released_day : num 14 23 30 23 18 1 16 7 15 17 ...
## $ in_spotify_playlists: num 553 1474 1397 7858 3133 ...
## $ in_spotify_charts : num 147 48 113 100 50 91 50 43 83 44 ...
## $ streams : Factor w/ 922 levels "","100409613",..: 154 123 149 839 484 272 807 719 907 699 ...
## $ in_apple_playlists : num 43 48 94 116 84 67 34 25 60 49 ...
## $ in_apple_charts : num 263 126 207 207 133 213 222 89 210 110 ...
## $ in_deezer_playlists : Factor w/ 347 levels "","0","1","1,003",..: 218 263 337 52 330 331 211 169 229 291 ...
## $ in_deezer_charts : num 10 14 14 12 15 17 13 13 11 13 ...
## $ in_shazam_charts : Factor w/ 198 levels "","0","1","1,021",..: 186 119 194 150 126 193 124 60 196 109 ...
## $ bpm : num 125 92 138 170 144 141 148 100 130 170 ...
## $ key : Factor w/ 12 levels "","A","A#","B",..: 4 5 9 2 2 5 9 9 5 6 ...
## $ mode : Factor w/ 3 levels "","Major","Minor": 2 2 2 2 3 2 3 2 3 3 ...
## $ danceability_. : num 80 71 51 55 65 92 67 67 85 81 ...
## $ valence_. : num 89 61 32 58 23 66 83 26 22 56 ...
## $ energy_. : num 83 74 53 72 80 58 76 71 62 48 ...
## $ acousticness_. : num 31 7 17 11 14 19 48 37 12 21 ...
## $ instrumentalness_. : num 0 0 0 0 63 0 0 0 0 0 ...
## $ liveness_. : num 8 10 31 11 11 8 8 11 28 8 ...
## $ speechiness_. : num 4 4 6 15 6 24 3 4 9 33 ...
#Verificar columnas con missing
which(colSums(is.na(spotify_missing_corregido4))!=0)
## named integer(0)
El analisis solo se realiza para variables cuantitativas
# Grafico de cajas y bigotes
boxplot(spotify$streams)
Segun los resultados, los streams no tiene valores atipicos
Obteniendo valores atipicos para la variable artist_count
boxplot(spotify$released_day)
Para todos
boxplot(spotify)
boxplot(spotify$artist_count)
Segun los resultados, se identifica valores atipicos. Vamos a identificarlo y plantear estrategia de correcion
# Calcular el RIC (RIC = Q3 - Q1)
q1 <- quantile(spotify$artist_count, 0.25)
q3 <- quantile(spotify$artist_count, 0.75)
RIC <- q3-q1
RIC
## 75%
## 1
# Limites o bigotes (Superioro inferior)
bigote_inferior <- q1-1.5*RIC
bigote_inferior
## 25%
## -0.5
bigote_superior <- q3+1.5*RIC
bigote_superior
## 75%
## 3.5
# Identificar los valores atipicos
outliers_det <- spotify$artist_count[spotify$artist_count < bigote_inferior | spotify$artist_count > bigote_superior]
outliers_det
## [1] 8 4 5 4 4 4 5 5 5 4 6 6 4 4 7 4 4 4 8 7 4 6 4 4 5 4 4
spotify_sin_atipicos <- spotify[!spotify$artist_count %in% outliers_det,]
head(spotify_sin_atipicos, 10)
## track_name artist.s._name artist_count
## 1 Seven (feat. Latto) (Explicit Ver.) Latto, Jung Kook 2
## 2 LALA Myke Towers 1
## 3 vampire Olivia Rodrigo 1
## 4 Cruel Summer Taylor Swift 1
## 5 WHERE SHE GOES Bad Bunny 1
## 6 Sprinter Dave, Central Cee 2
## 7 Ella Baila Sola Eslabon Armado, Peso Pluma 2
## 8 Columbia Quevedo 1
## 9 fukumean Gunna 1
## 10 La Bebe - Remix Peso Pluma, Yng Lvcas 2
## released_year released_month released_day in_spotify_playlists
## 1 2023 7 14 553
## 2 2023 3 23 1474
## 3 2023 6 30 1397
## 4 2019 8 23 7858
## 5 2023 5 18 3133
## 6 2023 6 1 2186
## 7 2023 3 16 3090
## 8 2023 7 7 714
## 9 2023 5 15 1096
## 10 2023 3 17 2953
## in_spotify_charts streams in_apple_playlists in_apple_charts
## 1 147 157 43 263
## 2 48 126 48 126
## 3 113 152 94 207
## 4 100 865 116 207
## 5 50 500 84 133
## 6 91 281 67 213
## 7 50 832 34 222
## 8 43 738 25 89
## 9 83 934 60 210
## 10 44 718 49 110
## in_deezer_playlists in_deezer_charts in_shazam_charts bpm key mode
## 1 45 10 826 125 B Major
## 2 58 14 382 92 C# Major
## 3 91 14 949 138 F Major
## 4 125 12 548 170 A Major
## 5 87 15 425 144 A Minor
## 6 88 17 946 141 C# Major
## 7 43 13 418 148 F Minor
## 8 30 13 194 100 F Major
## 9 48 11 953 130 C# Minor
## 10 66 13 339 170 D Minor
## danceability_. valence_. energy_. acousticness_. instrumentalness_.
## 1 80 89 83 31 0
## 2 71 61 74 7 0
## 3 51 32 53 17 0
## 4 55 58 72 11 0
## 5 65 23 80 14 63
## 6 92 66 58 19 0
## 7 67 83 76 48 0
## 8 67 26 71 37 0
## 9 85 22 62 12 0
## 10 81 56 48 21 0
## liveness_. speechiness_. acousticness_ instrumentalness_
## 1 8 4 31 0
## 2 10 4 7 0
## 3 31 6 17 0
## 4 11 15 11 0
## 5 11 6 14 63
## 6 8 24 19 0
## 7 8 3 48 0
## 8 11 4 37 0
## 9 28 9 12 0
## 10 8 33 21 0
Para confirmar vamos a realizar un grafico de cajas con la nueva data
boxplot(spotify_sin_atipicos$artist_count)
La transformación y estandarización de variables son técnicas comunes utilizadas en el análisis de datos para mejorar la interpretación de los datos y garantizar que las variables sean comparables entre sí.
La transformación de variables es una técnica utilizada en estadística y análisis de datos para modificar una variable con el objetivo de cumplir con ciertos supuestos o mejorar la interpretación de los datos. Esta transformación implica aplicar una función matemática a los valores de la variable original para obtener una nueva variable.
La transformación de variables implica aplicar una función matemática a los valores de una variable con el objetivo de modificar su distribución o relación con otras variables. Algunas transformaciones comunes incluyen la transformación logarítmica, la transformación exponencial y la transformación de raíz cuadrada. Estas transformaciones se utilizan principalmente cuando los datos presentan asimetría o heterocedasticidad. Por ejemplo, si se tiene una variable con una distribución sesgada hacia la derecha, se puede aplicar una transformación logarítmica para reducir la asimetría y hacer que los datos se aproximen más a una distribución normal (gráfica o distribución se asemeja a la campana de Gauss).
Existen diferentes tipos de transformaciones de variables que se utilizan según las características de los datos y los objetivos del análisis. Algunas de las transformaciones más comunes son:
Esta transformación se utiliza para reducir la dispersión de los datos cuando estos tienen una distribución con una varianza que aumenta con el nivel medio de la variable. También puede ayudar a reducir la asimetría.
# Original
hist(spotify$released_day, 12)
Para sacar la raiz cuadrada, simplemente se puede utilizar la función sqrt
head(sqrt(spotify$released_day), 10)
## [1] 3.741657 4.795832 5.477226 4.795832 4.242641 1.000000 4.000000 2.645751
## [9] 3.872983 4.123106
hist(sqrt(spotify$released_day))
Se aplica cuando los datos tienen una distribución sesgada hacia la izquierda (asimetría negativa). La transformación exponencial puede ayudar a corregir la asimetría y hacer que los datos se aproximen más a una distribución simétrica.
En R para poder obtener esta transformacio, se debe utilizar la funcion exp
head(exp(spotify$released_day), 10)
## [1] 1.202604e+06 9.744803e+09 1.068647e+13 9.744803e+09 6.565997e+07
## [6] 2.718282e+00 8.886111e+06 1.096633e+03 3.269017e+06 2.415495e+07
Para poder observarlo graficamente se tiene:
hist(exp(spotify$released_day))
Forma 2
released_day_exp <- exp(spotify$released_day)
hist(released_day_exp)
Esta transformación se utiliza cuando los datos presentan una distribución sesgada hacia la derecha (asimetría positiva). La transformación logarítmica reduce la asimetría y puede facilitar la interpretación de los datos.
Para la transformacion logaritmica, utilizar log (dentro de los argumentos se puede cambiar la base)
head(log(spotify$released_day), 10)
## [1] 2.639057 3.135494 3.401197 3.135494 2.890372 0.000000 2.772589 1.945910
## [9] 2.708050 2.833213
Graficamente
hist(log(spotify$released_day))
Cambiar la base 2
log(spotify$released_day, base=2)
## [1] 3.807355 4.523562 4.906891 4.523562 4.169925 0.000000 4.000000 2.807355
## [9] 3.906891 4.087463 4.087463 2.807355 3.584963 3.807355 4.954196 3.000000
## [17] 4.584963 3.700440 4.954196 4.584963 4.459432 2.807355 0.000000 4.954196
## [25] 1.000000 4.459432 4.643856 4.857981 4.954196 4.643856 3.700440 4.807355
## [33] 1.000000 4.392317 4.523562 0.000000 2.807355 0.000000 0.000000 4.247928
## [41] 3.321928 3.169925 4.700440 4.392317 4.523562 4.754888 3.700440 4.584963
## [49] 4.392317 4.584963 1.000000 2.584963 4.584963 3.906891 3.906891 4.857981
## [57] 4.584963 4.700440 3.807355 4.584963 2.000000 1.584963 4.584963 4.584963
## [65] 2.584963 0.000000 4.392317 1.000000 3.807355 2.807355 4.523562 4.807355
## [73] 3.906891 3.807355 2.584963 0.000000 4.087463 4.459432 4.321928 4.459432
## [81] 0.000000 4.459432 4.523562 2.807355 3.169925 1.584963 3.000000 2.584963
## [89] 4.459432 4.321928 4.584963 4.087463 4.087463 3.000000 2.321928 3.584963
## [97] 4.087463 3.169925 0.000000 3.169925 0.000000 1.000000 3.807355 0.000000
## [105] 2.807355 4.321928 3.321928 4.807355 3.459432 0.000000 0.000000 1.000000
## [113] 4.459432 2.807355 4.087463 3.169925 4.643856 3.000000 3.584963 4.584963
## [121] 4.459432 3.321928 3.906891 3.169925 3.459432 4.247928 4.000000 4.087463
## [129] 3.459432 4.392317 3.906891 1.000000 0.000000 3.459432 4.321928 1.000000
## [137] 1.000000 4.459432 0.000000 4.321928 4.954196 4.247928 0.000000 0.000000
## [145] 3.700440 4.584963 2.584963 0.000000 3.321928 4.754888 4.906891 4.700440
## [153] 0.000000 1.000000 2.321928 2.000000 4.087463 0.000000 4.247928 2.000000
## [161] 4.523562 3.700440 2.000000 0.000000 4.321928 4.643856 2.584963 1.000000
## [169] 0.000000 2.321928 4.643856 1.000000 0.000000 0.000000 3.584963 4.643856
## [177] 0.000000 0.000000 4.247928 2.584963 4.087463 3.700440 4.392317 4.169925
## [185] 4.392317 4.247928 4.321928 4.906891 0.000000 3.700440 4.000000 3.169925
## [193] 2.584963 2.807355 3.321928 0.000000 4.321928 3.000000 4.247928 4.247928
## [201] 1.000000 0.000000 3.459432 4.584963 3.906891 1.000000 4.700440 4.906891
## [209] 1.000000 4.087463 3.700440 4.857981 1.000000 4.954196 1.000000 4.523562
## [217] 3.584963 4.906891 4.700440 1.000000 2.000000 1.000000 0.000000 4.700440
## [225] 4.906891 4.459432 4.700440 3.000000 1.000000 0.000000 4.857981 4.857981
## [233] 2.321928 4.169925 4.392317 2.807355 4.247928 4.392317 1.000000 2.584963
## [241] 4.754888 3.807355 4.087463 4.392317 0.000000 2.000000 3.807355 3.459432
## [249] 1.000000 3.807355 0.000000 4.000000 3.321928 3.321928 2.000000 2.321928
## [257] 0.000000 4.392317 4.906891 4.584963 2.807355 1.000000 3.000000 4.584963
## [265] 3.321928 0.000000 2.000000 4.584963 4.459432 4.392317 4.523562 4.392317
## [273] 3.807355 1.584963 3.169925 4.906891 4.643856 4.000000 4.807355 4.392317
## [281] 2.321928 4.807355 2.000000 2.321928 4.643856 4.754888 4.584963 4.087463
## [289] 4.857981 2.000000 4.000000 4.459432 4.857981 4.584963 1.000000 1.584963
## [297] 0.000000 4.700440 1.000000 2.807355 4.087463 4.459432 4.754888 0.000000
## [305] 4.954196 4.643856 4.584963 4.584963 4.321928 3.169925 4.321928 4.459432
## [313] 4.857981 3.807355 4.392317 3.321928 3.700440 0.000000 4.700440 4.392317
## [321] 3.459432 3.700440 4.807355 4.321928 3.169925 4.754888 3.321928 2.807355
## [329] 3.906891 4.643856 3.169925 4.584963 4.584963 1.584963 1.000000 2.321928
## [337] 1.584963 1.584963 4.523562 4.954196 4.087463 3.906891 4.523562 4.954196
## [345] 2.321928 4.954196 3.906891 1.584963 1.584963 4.954196 3.169925 4.523562
## [353] 0.000000 0.000000 4.247928 1.584963 4.321928 2.584963 4.584963 3.000000
## [361] 4.807355 1.584963 2.584963 3.000000 4.523562 1.584963 4.643856 1.584963
## [369] 4.807355 4.321928 4.754888 4.247928 3.906891 1.584963 4.321928 4.857981
## [377] 3.584963 2.584963 4.584963 1.584963 4.754888 4.754888 4.754888 4.087463
## [385] 4.906891 3.700440 4.807355 4.807355 4.459432 2.000000 3.584963 4.754888
## [393] 3.169925 4.459432 4.643856 0.000000 4.321928 4.392317 3.584963 4.392317
## [401] 0.000000 4.321928 3.584963 1.000000 4.754888 4.247928 4.754888 4.954196
## [409] 3.000000 4.000000 4.523562 3.321928 4.459432 4.459432 3.169925 2.321928
## [417] 3.169925 2.000000 4.321928 1.584963 4.087463 1.000000 2.000000 3.584963
## [425] 4.000000 2.321928 3.459432 4.906891 4.807355 1.584963 3.584963 3.000000
## [433] 4.584963 4.754888 4.643856 3.807355 3.807355 4.392317 4.087463 0.000000
## [441] 0.000000 4.807355 0.000000 0.000000 0.000000 3.807355 3.700440 3.807355
## [449] 4.000000 0.000000 4.643856 0.000000 3.807355 0.000000 4.459432 3.169925
## [457] 3.169925 0.000000 3.000000 0.000000 0.000000 4.000000 4.643856 3.169925
## [465] 3.169925 0.000000 0.000000 3.169925 3.000000 0.000000 0.000000 4.459432
## [473] 3.169925 3.169925 3.169925 3.321928 0.000000 2.807355 2.000000 1.000000
## [481] 1.584963 1.000000 4.954196 0.000000 3.169925 3.169925 4.392317 4.392317
## [489] 4.807355 4.392317 2.584963 4.321928 4.643856 3.000000 2.584963 0.000000
## [497] 0.000000 3.169925 1.000000 4.643856 3.700440 2.807355 2.807355 2.321928
## [505] 2.807355 4.321928 4.247928 4.584963 2.807355 2.807355 4.523562 2.807355
## [513] 2.584963 3.807355 2.807355 2.807355 3.169925 2.807355 3.459432 4.169925
## [521] 4.700440 2.807355 4.247928 2.807355 4.087463 2.321928 3.000000 4.392317
## [529] 2.321928 3.321928 2.000000 4.906891 4.459432 4.392317 3.321928 3.000000
## [537] 4.906891 3.584963 2.807355 4.247928 2.321928 2.807355 4.169925 4.754888
## [545] 0.000000 3.169925 4.906891 1.584963 1.000000 4.906891 2.321928 3.700440
## [553] 2.807355 4.459432 4.247928 4.906891 4.857981 3.169925 3.000000 4.584963
## [561] 4.087463 4.000000 4.392317 2.807355 4.584963 0.000000 4.392317 2.321928
## [569] 3.459432 4.392317 3.000000 2.321928 1.584963 0.000000 0.000000 3.459432
## [577] 4.247928 2.807355 4.247928 3.321928 0.000000 4.906891 2.807355 0.000000
## [585] 4.584963 4.247928 4.087463 2.807355 4.392317 4.857981 4.643856 0.000000
## [593] 4.643856 4.857981 3.000000 4.523562 4.392317 2.807355 0.000000 4.523562
## [601] 4.247928 4.459432 0.000000 4.392317 4.169925 3.700440 4.321928 3.807355
## [609] 4.906891 4.807355 0.000000 1.000000 3.321928 2.000000 4.087463 0.000000
## [617] 2.584963 1.584963 4.643856 4.754888 3.321928 3.906891 4.807355 0.000000
## [625] 3.321928 2.807355 1.584963 3.459432 3.321928 4.754888 4.523562 3.321928
## [633] 4.584963 2.807355 4.754888 3.321928 4.807355 3.169925 3.906891 3.169925
## [641] 4.700440 4.321928 3.584963 2.807355 4.857981 3.807355 4.857981 4.169925
## [649] 3.321928 0.000000 3.459432 3.459432 3.459432 0.000000 4.247928 3.459432
## [657] 1.000000 0.000000 0.000000 2.000000 4.000000 2.000000 2.321928 2.000000
## [665] 4.392317 4.584963 3.321928 3.807355 4.807355 0.000000 4.247928 4.087463
## [673] 4.906891 4.392317 4.000000 2.000000 4.857981 4.807355 3.906891 4.459432
## [681] 3.459432 3.459432 4.807355 4.247928 4.584963 0.000000 2.000000 4.584963
## [689] 3.807355 2.000000 2.000000 2.000000 2.000000 4.247928 4.000000 2.584963
## [697] 4.857981 4.584963 3.459432 2.000000 4.392317 3.459432 1.584963 1.584963
## [705] 2.000000 0.000000 2.000000 1.584963 4.906891 4.169925 4.169925 3.906891
## [713] 4.169925 4.000000 4.643856 1.584963 4.857981 4.954196 4.000000 4.754888
## [721] 0.000000 4.392317 3.321928 3.000000 4.459432 4.954196 4.459432 0.000000
## [729] 4.807355 3.000000 4.523562 4.087463 4.643856 4.954196 0.000000 3.459432
## [737] 2.321928 4.169925 2.584963 0.000000 2.807355 3.169925 4.906891 4.954196
## [745] 3.000000 4.906891 3.000000 4.643856 4.643856 4.087463 3.700440 4.584963
## [753] 4.906891 4.169925 4.523562 4.169925 3.700440 0.000000 4.643856 4.643856
## [761] 2.321928 4.321928 3.169925 3.700440 3.807355 3.700440 2.584963 2.584963
## [769] 3.700440 3.700440 2.584963 3.700440 3.584963 2.584963 3.700440 2.584963
## [777] 3.700440 2.584963 2.584963 3.700440 3.700440 2.584963 2.584963 3.700440
## [785] 2.584963 3.700440 2.584963 3.807355 2.584963 2.584963 4.954196 2.584963
## [793] 2.584963 3.906891 3.700440 4.857981 4.857981 3.700440 3.700440 3.321928
## [801] 4.459432 3.700440 3.700440 4.857981 3.700440 4.459432 4.643856 3.700440
## [809] 2.584963 3.700440 0.000000 4.700440 2.584963 4.857981 3.700440 4.584963
## [817] 1.000000 4.523562 4.459432 4.584963 4.954196 3.000000 2.807355 2.584963
## [825] 4.321928 3.169925 3.321928 3.321928 4.321928 4.321928 3.321928 4.321928
## [833] 2.584963 3.321928 4.754888 3.321928 4.321928 4.321928 4.754888 4.321928
## [841] 0.000000 3.000000 4.321928 4.321928 3.169925 4.169925 4.321928 4.321928
## [849] 4.643856 0.000000 1.584963 4.321928 3.321928 1.000000 3.321928 4.169925
## [857] 3.584963 1.000000 4.321928 3.906891 3.700440 3.700440 1.584963 4.392317
## [865] 4.000000 4.087463 3.321928 2.584963 4.584963 4.584963 0.000000 0.000000
## [873] 3.584963 4.247928 4.087463 0.000000 1.584963 2.584963 4.584963 1.000000
## [881] 3.321928 2.000000 2.321928 2.321928 4.169925 2.321928 4.321928 4.857981
## [889] 3.700440 0.000000 3.459432 3.584963 4.459432 0.000000 3.906891 3.906891
## [897] 4.169925 4.000000 4.321928 3.321928 3.169925 4.459432 0.000000 3.906891
## [905] 4.700440 4.321928 1.584963 3.321928 3.700440 3.906891 2.321928 3.321928
## [913] 1.000000 3.700440 4.523562 4.459432 3.700440 4.523562 2.807355 3.807355
## [921] 4.169925 4.087463 4.000000 4.392317 3.807355 4.857981 4.000000 4.169925
## [929] 3.807355 4.459432 0.000000 2.000000 2.000000 4.392317 4.392317 2.000000
## [937] 4.392317 2.000000 4.392317 2.000000 4.392317 4.392317 2.000000 2.000000
## [945] 4.807355 2.000000 2.000000 4.392317 1.584963 4.392317 1.584963 4.321928
## [953] 2.000000
#Obtener solo transformaciones
released_day_sqrt <- sqrt(spotify$released_day)
released_day_exp <- exp(spotify$released_day)
released_day_ln <- log(spotify$released_day)
released_day_log2 <- log(spotify$released_day, base=2)
released_day_log5 <- log(spotify$released_day, base=5)
Ver graficamente cada una
par(mfrow=c(3,2))
hist(spotify$released_day)
hist(released_day_sqrt)
hist(released_day_exp)
hist(released_day_ln)
hist(released_day_log2)
hist(released_day_log5)
par(mfrow=c(1,1))
Este tipo de transformaciones, busca que los datos sea simetricos (distribucion forma de campana o que se cumpla un supuesto estadistico)
La visualizacion de la distribucion puede mejorarse con la grafica de densidad
par(mfrow=c(3,2))
plot(density(spotify$released_day), main = "Distribución de released_day originales")
plot(density(released_day_sqrt), main = "Distribución de released_day transformadas - sqrt")
plot(density(released_day_exp), main = "Distribución de released_day transformadas - exp")
plot(density(released_day_ln), main = "Distribución de released_day transformadas - ln")
plot(density(released_day_log2), main = "Distribución de released_day transformadas - log2")
plot(density(released_day_log5), main = "Distribución de released_day transformadas - log5")
par(mfrow=c(1,1))
Se puede realizar un analisis general de las variables originales y verificar su comportamiento, a partir de alli se puede aplicar la transformacion mas adecuado segun objetivo.
Grafica general
library(PerformanceAnalytics)
chart.Correlation(cor(spotify[,4:8]), histogram = TRUE)
La estandarización de variables, también conocida como normalización, implica transformar los valores de una variable para que tengan una media de cero y una desviación estándar de uno. Esto se logra restando la media de la variable a cada valor y dividiendo por la desviación estándar.
La estandarización es útil cuando se desea comparar variables que están en diferentes escalas o unidades. Al estandarizar las variables, se eliminan las diferencias en las escalas y se asegura que todas las variables tengan la misma escala relativa.
Por ejemplo, si tienes un conjunto de variables con diferentes unidades de medida, como peso en kilogramos y altura en metros, puedes estandarizar ambas variables para que sean comparables y no se vean afectadas por las diferencias en las unidades.
Desde el punto de vista estadistico la estadarizacion se hace o se aplica a la transformacion z: se debe restar cada dato con su media y dividir este resultado con la desviacion estandar.
\[ z=\frac{x_i-\mu}{\sigma} \]
Donde:
head(spotify)
## track_name artist.s._name artist_count
## 1 Seven (feat. Latto) (Explicit Ver.) Latto, Jung Kook 2
## 2 LALA Myke Towers 1
## 3 vampire Olivia Rodrigo 1
## 4 Cruel Summer Taylor Swift 1
## 5 WHERE SHE GOES Bad Bunny 1
## 6 Sprinter Dave, Central Cee 2
## released_year released_month released_day in_spotify_playlists
## 1 2023 7 14 553
## 2 2023 3 23 1474
## 3 2023 6 30 1397
## 4 2019 8 23 7858
## 5 2023 5 18 3133
## 6 2023 6 1 2186
## in_spotify_charts streams in_apple_playlists in_apple_charts
## 1 147 157 43 263
## 2 48 126 48 126
## 3 113 152 94 207
## 4 100 865 116 207
## 5 50 500 84 133
## 6 91 281 67 213
## in_deezer_playlists in_deezer_charts in_shazam_charts bpm key mode
## 1 45 10 826 125 B Major
## 2 58 14 382 92 C# Major
## 3 91 14 949 138 F Major
## 4 125 12 548 170 A Major
## 5 87 15 425 144 A Minor
## 6 88 17 946 141 C# Major
## danceability_. valence_. energy_. acousticness_. instrumentalness_.
## 1 80 89 83 31 0
## 2 71 61 74 7 0
## 3 51 32 53 17 0
## 4 55 58 72 11 0
## 5 65 23 80 14 63
## 6 92 66 58 19 0
## liveness_. speechiness_. acousticness_ instrumentalness_
## 1 8 4 31 0
## 2 10 4 7 0
## 3 31 6 17 0
## 4 11 15 11 0
## 5 11 6 14 63
## 6 8 24 19 0
Vamos a aplicar estadarizacion Z a la variable released_day de manera manual
Metodo 1: Por partes
media_released_day <- mean(spotify$released_day)
media_released_day
## [1] 13.93075
desv_est <- sd(spotify$released_day)
desv_est
## [1] 9.201949
released_day_estandar <- (spotify$released_day-media_released_day)/desv_est
head(released_day_estandar, 10)
## [1] 0.007526121 0.985579760 1.746288146 0.985579760 0.442216627
## [6] -1.405218024 0.224871374 -0.753182265 0.116198748 0.333544001
Metodo 2: Directo
released_day_estandar2 <- (spotify$released_day-mean(spotify$released_day))/sd(spotify$released_day)
head(released_day_estandar2, 10)
## [1] 0.007526121 0.985579760 1.746288146 0.985579760 0.442216627
## [6] -1.405218024 0.224871374 -0.753182265 0.116198748 0.333544001
Metodo 3: Apoyarse en las funciones de R
R tiene multiples funciones para estandarizar, la clasica es la funcion scale
#Funcion scale
released_day_estandar3 <- scale(spotify$released_day)
head(released_day_estandar3, 10)
## [,1]
## [1,] 0.007526121
## [2,] 0.985579760
## [3,] 1.746288146
## [4,] 0.985579760
## [5,] 0.442216627
## [6,] -1.405218024
## [7,] 0.224871374
## [8,] -0.753182265
## [9,] 0.116198748
## [10,] 0.333544001
La ventaja de la funcion de R, es que se puede enviar todo el caso
spotify_cuanti_scale <- scale(spotify[ ,3:7])
head(spotify_cuanti_scale, 10)
## artist_count released_year released_month released_day
## [1,] 0.4970207 0.42836555 0.270976981 0.007526121
## [2,] -0.6227447 0.42836555 -0.850591154 0.985579760
## [3,] -0.6227447 0.42836555 -0.009415053 1.746288146
## [4,] -0.6227447 0.06853094 0.551369015 0.985579760
## [5,] -0.6227447 0.42836555 -0.289807086 0.442216627
## [6,] 0.4970207 0.42836555 -0.009415053 -1.405218024
## [7,] 0.4970207 0.42836555 -0.850591154 0.224871374
## [8,] -0.6227447 0.42836555 0.270976981 -0.753182265
## [9,] -0.6227447 0.42836555 -0.289807086 0.116198748
## [10,] 0.4970207 0.42836555 -0.850591154 0.333544001
## in_spotify_playlists
## [1,] -0.5884217
## [2,] -0.4718042
## [3,] -0.4815540
## [4,] 0.3365417
## [5,] -0.2617406
## [6,] -0.3816503
## [7,] -0.2671853
## [8,] -0.5680358
## [9,] -0.5196668
## [10,] -0.2845323
Recordar
En un tema anterior se realizo gráficos de cajas para verificar la presencia de outliers No se recomienda trabajar con valores originales para la siguiente gráfica
boxplot(spotify[,3:7])
Lo más recomendable es realizar el gráfico con los valores de las variables transformadas
boxplot(spotify_cuanti_scale)
Estadarizacion min-max: Consiste en restar cada dato con el valor minimo y a esta operacion se le divide con la resta del valor maximo con el minimo. Esto permite que los resultados varien entre 0 y 1
\[ X_{norm}=\frac{\left(X_i-X_{\min }\right)}{X_{\max }-X_{\min }} \]
Metodo 1:
released_day_normal <- (spotify$released_day-min(spotify$released_day))/(max(spotify$released_day)-min(spotify$released_day))
head(released_day_normal, 10)
## [1] 0.4333333 0.7333333 0.9666667 0.7333333 0.5666667 0.0000000 0.5000000
## [8] 0.2000000 0.4666667 0.5333333
Metodo 2: Funcion
library(scales)
head(rescale(spotify$released_day), 10)
## [1] 0.4333333 0.7333333 0.9666667 0.7333333 0.5666667 0.0000000 0.5000000
## [8] 0.2000000 0.4666667 0.5333333
Aplicando a todo el caso (var cuantitativas) la funcion rescale solo permite aplicarse a vectores, no es posible directamente aplicar al data frame.
library(caret)
pre_procesamiento1 <- preProcess(spotify[,3:7]) # Asi por defecto muestra la est. z
head(predict(pre_procesamiento1, spotify), 10)
## track_name artist.s._name artist_count
## 1 Seven (feat. Latto) (Explicit Ver.) Latto, Jung Kook 0.4970207
## 2 LALA Myke Towers -0.6227447
## 3 vampire Olivia Rodrigo -0.6227447
## 4 Cruel Summer Taylor Swift -0.6227447
## 5 WHERE SHE GOES Bad Bunny -0.6227447
## 6 Sprinter Dave, Central Cee 0.4970207
## 7 Ella Baila Sola Eslabon Armado, Peso Pluma 0.4970207
## 8 Columbia Quevedo -0.6227447
## 9 fukumean Gunna -0.6227447
## 10 La Bebe - Remix Peso Pluma, Yng Lvcas 0.4970207
## released_year released_month released_day in_spotify_playlists
## 1 0.42836555 0.270976981 0.007526121 -0.5884217
## 2 0.42836555 -0.850591154 0.985579760 -0.4718042
## 3 0.42836555 -0.009415053 1.746288146 -0.4815540
## 4 0.06853094 0.551369015 0.985579760 0.3365417
## 5 0.42836555 -0.289807086 0.442216627 -0.2617406
## 6 0.42836555 -0.009415053 -1.405218024 -0.3816503
## 7 0.42836555 -0.850591154 0.224871374 -0.2671853
## 8 0.42836555 0.270976981 -0.753182265 -0.5680358
## 9 0.42836555 -0.289807086 0.116198748 -0.5196668
## 10 0.42836555 -0.850591154 0.333544001 -0.2845323
## in_spotify_charts streams in_apple_playlists in_apple_charts
## 1 147 157 43 263
## 2 48 126 48 126
## 3 113 152 94 207
## 4 100 865 116 207
## 5 50 500 84 133
## 6 91 281 67 213
## 7 50 832 34 222
## 8 43 738 25 89
## 9 83 934 60 210
## 10 44 718 49 110
## in_deezer_playlists in_deezer_charts in_shazam_charts bpm key mode
## 1 45 10 826 125 B Major
## 2 58 14 382 92 C# Major
## 3 91 14 949 138 F Major
## 4 125 12 548 170 A Major
## 5 87 15 425 144 A Minor
## 6 88 17 946 141 C# Major
## 7 43 13 418 148 F Minor
## 8 30 13 194 100 F Major
## 9 48 11 953 130 C# Minor
## 10 66 13 339 170 D Minor
## danceability_. valence_. energy_. acousticness_. instrumentalness_.
## 1 80 89 83 31 0
## 2 71 61 74 7 0
## 3 51 32 53 17 0
## 4 55 58 72 11 0
## 5 65 23 80 14 63
## 6 92 66 58 19 0
## 7 67 83 76 48 0
## 8 67 26 71 37 0
## 9 85 22 62 12 0
## 10 81 56 48 21 0
## liveness_. speechiness_. acousticness_ instrumentalness_
## 1 8 4 31 0
## 2 10 4 7 0
## 3 31 6 17 0
## 4 11 15 11 0
## 5 11 6 14 63
## 6 8 24 19 0
## 7 8 3 48 0
## 8 11 4 37 0
## 9 28 9 12 0
## 10 8 33 21 0
library(caret)
pre_procesamiento2 <- preProcess(spotify[,3:7], method = "range")
head(predict(pre_procesamiento2, spotify[,3:7]), 10)
## artist_count released_year released_month released_day in_spotify_playlists
## 1 0.1428571 1.0000000 0.5454545 0.4333333 0.009873834
## 2 0.0000000 1.0000000 0.1818182 0.7333333 0.027294910
## 3 0.0000000 1.0000000 0.4545455 0.9666667 0.025838425
## 4 0.0000000 0.9569892 0.6363636 0.7333333 0.148050769
## 5 0.0000000 1.0000000 0.3636364 0.5666667 0.058675544
## 6 0.1428571 1.0000000 0.4545455 0.0000000 0.040762669
## 7 0.1428571 1.0000000 0.1818182 0.5000000 0.057862182
## 8 0.0000000 1.0000000 0.5454545 0.2000000 0.012919212
## 9 0.0000000 1.0000000 0.3636364 0.4666667 0.020144892
## 10 0.1428571 1.0000000 0.1818182 0.5333333 0.055270774
Es una librería en R que proporciona una forma fácil y poderosa de crear gráficos de alta calidad. Fue desarrollada por Hadley Wickham y se basa en la gramática de gráficos, lo que significa que utiliza una sintaxis coherente y consistente para construir visualizaciones.
La principal idea detrás de ggplot es que un gráfico se puede descomponer en capas que representan diferentes aspectos de la visualización, como los datos, las variables estéticas, las escalas, los ejes, los títulos, las leyendas, etc. Cada capa se agrega al gráfico utilizando funciones específicas de ggplot.
En ggplot, se sigue un enfoque de “declaración” para construir gráficos. En lugar de dibujar directamente los gráficos, se especifica cómo deberían verse los gráficos y qué datos utilizar. Luego, ggplot se encarga de generar el gráfico final teniendo en cuenta todas las especificaciones.
La sintaxis básica de ggplot involucra tres componentes principales:
ggplot(): Esta función inicializa un objeto de gráfico base al que se pueden agregar capas adicionales. Se especifica el conjunto de datos y las variables estéticas dentro de esta función.
aes(): Esta función se utiliza dentro de ggplot() o en las capas adicionales para definir las variables estéticas. Las variables estéticas determinan cómo se mapean los datos a los aspectos visuales del gráfico, como las posiciones en los ejes x e y, los colores, los tamaños, etc.
Capas adicionales: Después de inicializar el objeto de gráfico con ggplot(), se pueden agregar capas adicionales utilizando funciones como geom_point(), geom_line(), geom_bar(), etc. Estas funciones especifican el tipo de gráfico que se desea agregar al gráfico base y permiten personalizar aún más la visualización.
library(ggplot2)
# Realizar el preprocesamiento con estandarización Z
spotify_trans1 <- predict(pre_procesamiento1, spotify[,3:7])
# Convertir las columnas en vectores
spotify_trans1_vectors <- lapply(spotify_trans1, as.vector)
# Crear el data frame
spotify_trans1_df <- data.frame(variable = colnames(spotify_trans1),
value = unlist(spotify_trans1_vectors))
# Crear un gráfico de densidad para visualizar los datos después de la estandarización Z
ggplot(data = spotify_trans1_df, aes(x = value)) +
geom_density() +
labs(title = "Estandarización Z de las variables de Spotify")
library(ggplot2)
# Realizar el preprocesamiento con el método de rango
spotify_trans2 <- predict(pre_procesamiento2, spotify[,3:7])
# Convertir las columnas en vectores
spotify_trans2_vectors <- lapply(spotify_trans2, as.vector)
# Crear el data frame
spotify_trans2_df <- data.frame(variable = colnames(spotify_trans2),
value = unlist(spotify_trans2_vectors))
# Crear un gráfico de densidad para visualizar los datos después del método de rango
ggplot(data = spotify_trans2_df, aes(x = value)) +
geom_density() +
labs(title = "Método de rango de las variables de Spotify")
El analista de datos de Spotify, con el objetivo de evaluar la relación entre las transmisiones de canciones y variables como la “danceability”, “energy”, “acousticness”, “instrumentalness”, y “bpm”, ha recopilado el siguiente conjunto de datos:
La variable dependiente (Y) es “streams”, que representa el número de transmisiones de una canción. Las variables independientes (X) son “danceability”, “energy”, “acousticness”, “instrumentalness”, y “bpm”. Estas variables representan diferentes características de las canciones.
El objetivo es desarrollar un modelo de regresión que permita predecir las transmisiones de una canción basándose en estas variables predictoras. Este análisis puede proporcionar información valiosa para entender qué características de las canciones están más asociadas con un mayor número de transmisiones.
Streams/transmisiones (Y) 141381703, 133716286, 140003974, 800840817, 303236322 …
Variables Predictivas (X):
Se busca desarrollar un modelo de regresión que permita predecir las transmisiones de canciones en Spotify basándose en las variables predictoras “danceability”, “energy”, “acousticness”, “instrumentalness”, y “bpm”. El objetivo es entender cómo estas características de las canciones influyen en el número de transmisiones y utilizar el modelo para hacer proyecciones sobre tendencias futuras. Este análisis puede proporcionar información valiosa para la toma de decisiones estratégicas en Spotify, desde la planificación de la promoción de canciones hasta la mejora de la experiencia del usuario.
# Paso 1: Determinar las variables X,Y
modelo_spotify <- spotify[, c("streams", "danceability_.")]
# Renombrar las columnas para mayor claridad
colnames(modelo_spotify) <- c("transmiciones", "danceabilidad")
# Visualizar el nuevo conjunto de datos
head(modelo_spotify)
## transmiciones danceabilidad
## 1 157 80
## 2 126 71
## 3 152 51
## 4 865 55
## 5 500 65
## 6 281 92
# Diagrama de dispersión
plot(x = spotify$danceability_.,
y = spotify$streams,
main = "Diagrama de Dispersión",
xlab = "Danceabilidad",
ylab = "Transmiciones")
# Diagrama de dispersión con pairs
pairs(spotify[, c("danceability_.", "streams")])
Interpretación: Según los resultados sugieren que a medida que la “danceability” de una canción aumenta, tiende a haber un aumento en las “streams” de la canción. La dirección positiva en el segundo gráfico indica una asociación creciente entre estas dos variables, lo que respalda la idea de una conexión positiva entre la “danceability” y las “streams”.
# Convertir la columna a formato numérico en caso existan valores no numericos utilizando la función as.numeric().
spotify$streams <- as.numeric(spotify$streams)
# Coeficiente de correlación
cor(spotify$danceability_., spotify$streams)
## [1] -0.03008916
Coeficiente de correlación:
r = -0.03008916
Paso 3: Regresión
# Ajuste del modelo de regresión lineal simple
modelo_spotify <- lm(streams ~ danceability_., data = spotify)
# Resumen de resultados
summary(modelo_spotify)
##
## Call:
## lm(formula = streams ~ danceability_., data = spotify)
##
## Residuals:
## Min 1Q Median 3Q Max
## -481.95 -236.13 -1.23 238.23 473.66
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 512.5815 41.6444 12.309 <2e-16 ***
## danceability_. -0.5640 0.6075 -0.928 0.353
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 274.2 on 951 degrees of freedom
## Multiple R-squared: 0.0009054, Adjusted R-squared: -0.0001452
## F-statistic: 0.8618 on 1 and 951 DF, p-value: 0.3535
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 512.5815 41.6444 12.309 <2e-16 ***
## danceability_. -0.5640 0.6075 -0.928 0.353
## ---
## Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
##
## Residual standard error: 274.2 on 951 degrees of freedom
## Multiple R-squared: 0.0009054, Adjusted R-squared: -0.0001452
## F-statistic: 0.8618 on 1 and 951 DF, p-value: 0.3535
Modelo general \(\hat{Y} = 512.5815 + -0.5640 X\)
Modelo para el caso: \(\hat{Ingresos} = 512.5815 + -0.5640 \cdot \text danceability_.\)
Paso 1: Modificar la variable dependiente a binaria
# Modificar la variable en_lista_spotify a binaria
spotify$en_lista_spotify <- ifelse(spotify$in_spotify_charts > 0, 1, 0)
# Visualizar el conjunto de datos con la nueva variable
head(spotify)
## track_name artist.s._name artist_count
## 1 Seven (feat. Latto) (Explicit Ver.) Latto, Jung Kook 2
## 2 LALA Myke Towers 1
## 3 vampire Olivia Rodrigo 1
## 4 Cruel Summer Taylor Swift 1
## 5 WHERE SHE GOES Bad Bunny 1
## 6 Sprinter Dave, Central Cee 2
## released_year released_month released_day in_spotify_playlists
## 1 2023 7 14 553
## 2 2023 3 23 1474
## 3 2023 6 30 1397
## 4 2019 8 23 7858
## 5 2023 5 18 3133
## 6 2023 6 1 2186
## in_spotify_charts streams in_apple_playlists in_apple_charts
## 1 147 157 43 263
## 2 48 126 48 126
## 3 113 152 94 207
## 4 100 865 116 207
## 5 50 500 84 133
## 6 91 281 67 213
## in_deezer_playlists in_deezer_charts in_shazam_charts bpm key mode
## 1 45 10 826 125 B Major
## 2 58 14 382 92 C# Major
## 3 91 14 949 138 F Major
## 4 125 12 548 170 A Major
## 5 87 15 425 144 A Minor
## 6 88 17 946 141 C# Major
## danceability_. valence_. energy_. acousticness_. instrumentalness_.
## 1 80 89 83 31 0
## 2 71 61 74 7 0
## 3 51 32 53 17 0
## 4 55 58 72 11 0
## 5 65 23 80 14 63
## 6 92 66 58 19 0
## liveness_. speechiness_. acousticness_ instrumentalness_ en_lista_spotify
## 1 8 4 31 0 1
## 2 10 4 7 0 1
## 3 31 6 17 0 1
## 4 11 15 11 0 1
## 5 11 6 14 63 1
## 6 8 24 19 0 1
# Diagrama de dispersión
plot(x = spotify$danceability_.,
y = spotify$en_lista_spotify,
main = "Diagrama de Dispersión",
xlab = "Danceability",
ylab = "En Lista Spotify")
# Diagrama de dispersión con pairs
pairs(spotify[, c("danceability_.", "en_lista_spotify")])
Interpretación: Analizando el diagrama de dispersión, podemos observar la relación entre la variable danceability_ y la variable binaria en_lista_spotify, lo que nos ayudará a entender si hay una asociación entre estas variables.
# Coeficiente de correlación
cor(spotify$danceability_., spotify$en_lista_spotify)
## [1] 0.04596874
El coeficiente de correlación nos ayudará a comprender la relación entre la danceability_ y la variable binaria en_lista_spotify.
Paso 3: Regresión logística
# Ajuste del modelo de regresión logística
modelo_logistico <- glm(en_lista_spotify ~ danceability_. + energy_. + acousticness_. + bpm, data = spotify, family = binomial(link = "logit"))
# Resumen de resultados
summary(modelo_logistico)
##
## Call:
## glm(formula = en_lista_spotify ~ danceability_. + energy_. +
## acousticness_. + bpm, family = binomial(link = "logit"),
## data = spotify)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -1.656869 0.589606 -2.810 0.00495 **
## danceability_. 0.005545 0.004725 1.174 0.24053
## energy_. 0.014031 0.004939 2.841 0.00450 **
## acousticness_. 0.002085 0.003147 0.662 0.50769
## bpm 0.005175 0.002396 2.160 0.03075 *
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 1299.6 on 952 degrees of freedom
## Residual deviance: 1282.8 on 948 degrees of freedom
## AIC: 1292.8
##
## Number of Fisher Scoring iterations: 4
Este resumen nos proporciona información sobre los coeficientes estimados, los valores p, la significancia estadística y otros aspectos relevantes del modelo de regresión logística.
Aquí interpretamos los coeficientes del modelo y su impacto en la probabilidad de que una canción esté en la lista de éxitos de Spotify.
Paso 1: Selección de variables y preparación de los datos
Primero, seleccionamos las variables predictoras (X) y la variable dependiente (Y). En este caso, utilizaremos las variables danceability_, energy_, acousticness_, y bpm como nuestras variables predictoras, y la variable streams como nuestra variable dependiente.
# Seleccionar variables predictoras y variable dependiente
modelo_spotify <- spotify[, c("streams", "danceability_.", "energy_.", "acousticness_.", "bpm")]
Paso 2: Análisis exploratorio de datos
Podemos realizar un análisis exploratorio de los datos para entender la relación entre las variables y detectar posibles problemas, como valores atípicos o datos faltantes.
# Resumen estadístico de las variables
summary(modelo_spotify)
## streams danceability_. energy_. acousticness_.
## Min. : 1.0 Min. :23.00 Min. : 9.00 Min. : 0.00
## 1st Qu.:237.0 1st Qu.:57.00 1st Qu.:53.00 1st Qu.: 6.00
## Median :475.0 Median :69.00 Median :66.00 Median :18.00
## Mean :474.8 Mean :66.97 Mean :64.28 Mean :27.06
## 3rd Qu.:712.0 3rd Qu.:78.00 3rd Qu.:77.00 3rd Qu.:43.00
## Max. :949.0 Max. :96.00 Max. :97.00 Max. :97.00
## bpm
## Min. : 65.0
## 1st Qu.:100.0
## Median :121.0
## Mean :122.5
## 3rd Qu.:140.0
## Max. :206.0
Paso 3: Visualización de datos
Es útil visualizar la relación entre la variable dependiente y cada una de las variables predictoras mediante gráficos.
# Diagramas de dispersión entre la variable dependiente y las predictoras
plot(modelo_spotify)
Paso 4: Ajuste del modelo de regresión múltiple
Ajustamos el modelo de regresión múltiple utilizando la función lm() en R.
# Convertir la variable de respuesta a tipo numérico
modelo_spotify$streams <- as.numeric(as.character(modelo_spotify$streams))
# Ajuste del modelo de regresión múltiple
modelo_reg_multiple <- lm(streams ~ danceability_. + energy_. + acousticness_. + bpm, data = modelo_spotify)
Paso 5: Evaluación del modelo
Examinamos el resumen del modelo para interpretar los coeficientes, los valores p y otras estadísticas importantes.
# Resumen del modelo
summary(modelo_reg_multiple)
##
## Call:
## lm(formula = streams ~ danceability_. + energy_. + acousticness_. +
## bpm, data = modelo_spotify)
##
## Residuals:
## Min 1Q Median 3Q Max
## -479.68 -235.44 -0.67 234.13 473.10
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 532.195885 78.908462 6.744 2.67e-11 ***
## danceability_. -0.628980 0.635954 -0.989 0.323
## energy_. -0.147719 0.661010 -0.223 0.823
## acousticness_. -0.237397 0.424453 -0.559 0.576
## bpm 0.005365 0.321366 0.017 0.987
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 274.6 on 948 degrees of freedom
## Multiple R-squared: 0.001248, Adjusted R-squared: -0.002966
## F-statistic: 0.2962 on 4 and 948 DF, p-value: 0.8805
Paso 6: Interpretación de resultados
Interpretamos los coeficientes del modelo para comprender cómo cada variable predictoras influye en el número de transmisiones de una canción.
Interpretación de los coeficientes: Los coeficientes estimados representan el cambio promedio en la variable de respuesta (en este caso, el número de transmisiones) por cada unidad de cambio en la variable predictora, manteniendo todas las demás variables constantes. Por ejemplo, si el coeficiente para la variable danceability_ es 10, esto significaría que, en promedio, un aumento de una unidad en la danceabilidad se asociaría con un aumento de 10 unidades en el número de transmisiones, manteniendo todas las demás variables constantes.
Significancia estadística: Para determinar si una variable predictora es significativa en el modelo, se puede examinar el valor p asociado con el coeficiente estimado. Un valor p menor que un umbral específico (como 0.05) generalmente se considera indicativo de una asociación significativa entre la variable predictora y la variable de respuesta. Por lo tanto, las variables con valores p significativamente bajos pueden considerarse importantes en el modelo.
Coeficiente de determinación (R-cuadrado): El coeficiente de determinación (R-cuadrado) proporciona una medida de cuánta variabilidad en la variable de respuesta es explicada por el modelo. Un R-cuadrado más alto indica un mejor ajuste del modelo a los datos. Sin embargo, es importante recordar que un R-cuadrado alto no siempre significa que el modelo sea útil o que las variables predictoras sean importantes.
Diagnóstico de residuos: También es importante realizar un diagnóstico de los residuos del modelo para verificar si se cumplen los supuestos de la regresión lineal, como la linealidad, la homocedasticidad y la normalidad de los residuos. Los gráficos de residuos y las pruebas estadísticas pueden ayudar a identificar posibles problemas con el modelo.
Al interpretar los resultados, es crucial considerar el contexto del problema y la relevancia de las variables predictoras en el dominio del problema. Además, es importante tener en cuenta que la regresión múltiple asume ciertos supuestos que deben ser verificados para asegurar la validez de las conclusiones derivadas del modelo.
Paso 7: Diagnóstico del modelo
Realizamos diagnósticos del modelo para verificar si se cumplen los supuestos de la regresión lineal, como la linealidad, la homocedasticidad y la normalidad de los residuos.
# Gráfico de diagnóstico de residuos
plot(modelo_reg_multiple)
Estas conclusiones y recomendaciones resumen el trabajo realizado y proporcionan una guía para futuras investigaciones y aplicaciones prácticas en el análisis de datos de Spotify.