Caratula

Aplicación de estadística aplicada

Autores: Jeremy Tello - Walinn Paredes
Fecha: 27/01/2024

I. Aspectos generales

1.1 Nombre de la organización y/o empresa (real o propuesta)

Spotify Technology S.A

1.2 Misión y visión

Misión: Ofrecer acceso ilimitado a la música y al entretenimiento para todas las personas en todo el mundo.

1.3 Descripción del servicio/productos que se va a analizar

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

1.4 Problemática de estudio

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.

II. Fundamentos básicos de la Estadística

2.1 Objetivo de estudio

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.

2.2 Población de estudio

La población de estudio comprende todas las canciones disponibles en Spotify.

2.3 Muestra

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.

2.4 Unidad de análisis

La unidad de análisis en este estudio será las canciones mas escuchadas en este año 2023

2.5 Tipo de muestreo a utilizar

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.

III. Variables y Tipo de Variables

3.1 Variables y descripción de cada variable

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.

IV. Manejo de base de datos

Limpiar el workspace

# Para limpiar el workspace, por si hubiera algun dataset 
# o informacion cargada
rm(list = ls())

Cambiar directorio de trabajo

# 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"

Importar conjunto de datos desde URL GitHub

enlace_url <- "https://raw.githubusercontent.com/cj-2022/Spotify-Conjunto-de-datos/main/spotify-2023.csv"
spotify_df <- read.csv(enlace_url, sep = ";")

Observar los primeros registros

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

Sacar el conjunto de datos de la memoria al directorio

write.csv(spotify_df, file = "Spotify.csv")

Cargar un archivo de excel a mi entorno de trabajo

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>

Importar archivo csv desde el directorio

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

Importar archivos desde la memoria de la pc (copia-pega)

##spotify_copia <- read.delim("clipboard")
##head(spotify_copia)

Importar datos utilizando choose (asistente)

##spotify_asistente <- read.csv(file.choose())
##head(spotify_asistente)

Observar las dimensiones (filas y colummnas / tamaño de muestra y variables)

dim(spotify_csv)
## [1] 953  28

Cargamos el conjunto de datos asiendo unos ajustes

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

Obtener las frecuencias absolutas (simples) (fi) para la variable “mode”

mode_fi <- table(spotify$mode)
mode_fi
## 
## Major Minor 
##   550   403

Obtener las frecuencias absolutas (simples) (fi) para la variable “released_year”

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

Opción 1: Calculando las frecuencias relativas directamente

mode_fi <- table(spotify$mode)
mode_hi_opcion1 <- mode_fi / length(spotify$mode)
mode_hi_opcion1
## 
##     Major     Minor 
## 0.5771249 0.4228751

Opción 2: Utilizando prop.table()

mode_hi_opcion2 <- prop.table(mode_fi)
mode_hi_opcion2
## 
##     Major     Minor 
## 0.5771249 0.4228751

Calculando las frecuencias relativas (simples) (hi) para la columna “mode”

mode_hi <- prop.table(table(spotify$mode))
mode_hi
## 
##     Major     Minor 
## 0.5771249 0.4228751

calculando las frecuencias porcentuales (simples) (hi) para la columna “artist_count”

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

Definición de los datos ya calculados

mode_fi <- table(spotify$mode)
mode_hi <- prop.table(mode_fi)
mode_pi <- prop.table(mode_fi) * 100

Unión de columnas

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

Unión de filas

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

Presentación de la tabla del caso para la variable “mode” en el conjunto de datos de Spotify

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

Tablas de frecuencia con librerias

# 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

Resumen basico de las variables no numéricas

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

V. Tablas de frecuencia (Para cada variable)

Tabla de frecuencia para variables cuantitativas continuas

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 frecuencia agrupada para la variable acousticness_ y otra para instrumentalness_

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

VI. Representación gráfica de datos

Gráfico de barras para artistas

#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()

Gráfico circular (pastel) para presencia en listas de éxitos en Spotify

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()

Gráfico de barras para año de lanzamiento

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()

Gráfico circular (pastel) para tonalidad de canciones

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()

Gráfico de barras para número de streams

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()

Histograma para nivel de energía de canciones

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()

Histograma para índice de capacidad de baile de canciones

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()

Diagrama de caja para positividad de canciones

ggplot(spotify, aes(y = valence_.)) +
  geom_boxplot(fill = "lightblue", color = "black") +
  labs(title = "Diagrama de Caja para Positividad de Canciones en Spotify") +
  theme_minimal()

Gráfico de densidad para acústica de canciones

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()

VII. Medidas estadísticas de tendencia

Medidas estadísticas de tendencia central para speechiness

Media aritmética

mean_speechiness<- mean(spotify$speechiness_.)
cat("Media:", mean_speechiness)
## Media: 10.13116

Mediana

median_speechiness <- median(spotify$speechiness_.)
cat("Mediana:", median_speechiness)
## Mediana: 6

Moda

table_speechiness <- table(spotify$speechiness_.)
moda_speechiness <- as.numeric(names(table_speechiness)[table_speechiness == max(table_speechiness)])
cat("Moda:", moda_speechiness)
## Moda: 4

Medidas estadísticas de variabilidad o dispersión para speechines

Rango

range_speechiness <- max(spotify$speechiness_.) - min(spotify$speechiness_.)
cat("Rango:", range_speechiness)
## Rango: 62

Varianza

var_speechiness <- var(spotify$speechiness_.)
cat("Varianza:", var_speechiness)
## Varianza: 98.26534

Desviación estándar

sd_speechiness <- sd(spotify$speechiness_.)
cat("Desviación Estándar:", sd_speechiness)
## Desviación Estándar: 9.912888

Coeficiente de variación

cv_speechiness <- sd_speechiness / mean_speechiness * 100
cat("Coeficiente de Variación:", cv_speechiness)
## Coeficiente de Variación: 97.84549

VIII. Medidas estadísticas de posición

Medidas de posicion

Visualizar la estructura del conjunto de datos para identificar las columnas

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

Calcular cuartiles para speechines

cuartiles_speechines <- quantile(spotify$speechiness_., probs = c(0, 0.25, 0.5, 0.75, 1))

Mostrar los cuartiles calculados para speechines

cuartiles_speechines
##   0%  25%  50%  75% 100% 
##    2    4    6   11   64

Interpretación para cuartiles de speechines:

Resultado /## 0% 25% 50% 75% 100%
/## 2 4 6 11 64

Segun los resultados:

El valor minimo de cantidad de ‘speechiness_.’ es 2.

Cuartil 1 \((Q_1)\)

El 25% de las canciones tienen ‘speechiness_.’ iguales o inferiores al cuartil 1 (4).

Cuartil 2 \((Q_1)\)

El 50% de las canciones tienen ‘speechiness_.’ iguales o inferiores al cuartil 2 (6).

Cuartil 3 \((Q_1)\)

El 75% de las canciones tienen ‘speechiness_.’ iguales o inferiores al cuartil 3 (11).

Cuartil 4 \((Q_4)\)

El valor máximo de speechiness_% es el cuartil 4 (64).

Calcular deciles para speechiness

deciles_speechiness <- data.frame(
  Deciles = seq(0, 1, 0.1),
  Valor = quantile(spotify$speechiness_., probs = seq(0, 1, 0.1))
)

Ordenar el dataframe por los valores de deciles

deciles_speechiness_ordenado <- deciles_speechiness[order(deciles_speechiness$Deciles), ]

Mostrar el dataframe ordenado

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

Calcular percentiles para speechiness

percentiles_speechiness <- data.frame(
  Percentiles = seq(0, 1, 0.01),
  Valor = quantile(spotify$speechiness_., probs = seq(0, 1, 0.01))
)

Ordenar el dataframe por los valores de percentiles

percentiles_speechiness_ordenado <- percentiles_speechiness[order(percentiles_speechiness$Percentiles), ]

Mostrar el dataframe ordenado

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

Asimetría

library(fBasics)
asimetria_speechiness <- skewness(spotify$speechiness_.)
cat("Asimetría:", asimetria_speechiness, "\n")
## Asimetría: 1.928582

Curtosis

curtosis_speechiness <- kurtosis(spotify$speechiness_.)
cat("Curtosis:", curtosis_speechiness, "\n")
## Curtosis: 3.337138

Interpretación:

Para asimetria

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 curtosis

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.

Histograma de speechiness

hist(spotify$speechiness_., col = "skyblue", main = "Histograma de Speechiness", xlab = "Speechiness")

IX. Manejo de datos Missing

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

Verificacion de valores perdidos

# 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

Realizar el analisis utilizando librerias

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

Patrones de comportamiento de missing

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

Visualizar missing mediante libreria visdat

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)

Correccion de 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)

Aplicando tecnicas de imputacion

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)

X. Manejo de valores outliers

Deteccion de outliers univariado - grafica

El analisis solo se realiza para variables cuantitativas

Grafico de cajas

# 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)

Para artist_count

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

Correcion

Eliminar los atipicos

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)

XI. Transformación de variables

Transformación y estandarización de variables

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

Transformación de variables

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:

  • Transformación de Box-Cox: Es una transformación paramétrica que puede utilizarse para corregir diferentes tipos de asimetría. La transformación de Box-Cox permite encontrar el valor óptimo del parámetro lambda (λ) que maximiza la simetría de los datos.

Transformación de raíz cuadrada:

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

Transformación exponencial:

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)

Transformación logarítmica:

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

Comparacion de transformaciones

#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)

XII. Estandarización y normalización de variables

Estandarización de variables:

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.

Estandarizacion:

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:

  • \(X_i\) representa cada dato del caso
  • \(\mu\) Es la media poblacional (Promedio)
  • \(\sigma\) Es la desviacion estandar poblacional
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)

Normalizacion:

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

ggplot

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")

XIII. Modelamiento predictivo

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):

  • Danceability (Danceable)
  • Energy (Energia)
  • Acousticness (Acústica)
  • Instrumentalness (Instrumental)
  • Bpn (Beats por minuto)

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.

Pasos para construir el modelo de regresión:

# 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 o puntos

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

Coeficiente de correlacion

# 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

Regresión lineal simple

# 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 final con los resultados:

Modelo general \(\hat{Y} = 512.5815 + -0.5640 X\)

Modelo para el caso: \(\hat{Ingresos} = 512.5815 + -0.5640 \cdot \text danceability_.\)

Resumen: Regresión lineal simple

  • Paso1: Variable X,Y
  • Paso2: Correlación entre varible
    • Método gráfico - diagrama de dispersión
    • Método del coeficiente - r
  • Paso 3: Modelo Regresión lineal simple

Regresion logistica

Pasos para construir el modelo de regresión logística:

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 o puntos

# 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

# 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

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

Interpretación de resultados

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.

Regresion Multiple

Pasos para construir el modelo de regresión múltiple:

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)

Conclusiones

Análisis Exploratorio de Datos:

  • Se realizó un exhaustivo análisis exploratorio de los datos de Spotify, que incluyó la exploración de distribuciones, relaciones entre variables y detección de valores atípicos.

Transformación y Estandarización de Variables:

  • Se aplicaron diversas técnicas de transformación y estandarización de variables para mejorar la interpretación de los datos y ajustarlos a los supuestos de los modelos.

Modelamiento Predictivo:

  • Se desarrollaron modelos predictivos, incluyendo regresión lineal simple, regresión logística y regresión múltiple, para comprender cómo las características de las canciones influyen en el número de transmisiones en Spotify.

Recomendaciones

Exploración Continua de Datos:

  • Se recomienda continuar explorando los datos de Spotify para identificar nuevas tendencias, patrones o relaciones que puedan ser relevantes para comprender el comportamiento de los usuarios y el éxito de las canciones.

Mejora de Modelos:

  • Se sugiere explorar modelos más avanzados, como modelos de series temporales o técnicas de aprendizaje automático, para mejorar la precisión de las predicciones y capturar relaciones no lineales entre las variables.

Validación Rigurosa:

  • Es fundamental realizar una validación rigurosa de los modelos desarrollados utilizando técnicas como la validación cruzada y la división de datos en conjuntos de entrenamiento y prueba para garantizar su robustez y generalización.

Interpretación Profunda:

  • Se insta a profundizar en la interpretación de los resultados de los modelos, centrándose en entender el significado práctico de los coeficientes estimados y su relevancia para la toma de decisiones en la industria musical.

Aplicación Práctica:

  • Finalmente, se recomienda utilizar los insights obtenidos de los análisis para informar estrategias de promoción de canciones, optimización de la experiencia del usuario en la plataforma y toma de decisiones comerciales en Spotify.

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.