---
# Carga de las librerias necesarias
En este apartado se cargan las librerias necesarias para ejecutar el codigo
```r
# https://cran.r-project.org/web/packages/ggplot2/index.html
if (!require('ggplot2')) install.packages('ggplot2'); library('ggplot2')
# https://cran.r-project.org/web/packages/dplyr/index.html
if (!require('dplyr')) install.packages('dplyr'); library('dplyr')
# https://cran.r-project.org/web/packages/mice/index.html
if (!require('mice')) install.packages('mice'); library('mice')
Vamos a cargar la base de datos, tambien vamos a crear una copia de la base de datos original.
Train <- read.csv("C:\\Users\\masso\\OneDrive\\Escritorio\\train_edic.csv")
TrainOriginal<- Train
filas <- c(1:2000)
Train$id <- seq(filas)
Primero se visualizara un resumen de los datos para luego analizarlos
summary(Train)
## artist_name track_name popularity danceability
## Length:2000 Length:2000 Min. : 1.00 Min. : 0.0755
## Class :character Class :character 1st Qu.:34.75 1st Qu.: 0.4360
## Mode :character Mode :character Median :45.00 Median : 0.5490
## Mean :45.59 Mean : 0.5697
## 3rd Qu.:57.00 3rd Qu.: 0.6640
## Max. :97.00 Max. :44.0000
## NA's :52
## energy key loudness mode
## Min. :0.00395 Min. : 1.000 Min. :-34.378 Min. :-9.000
## 1st Qu.:0.50650 1st Qu.: 3.000 1st Qu.: -9.437 1st Qu.: 0.000
## Median :0.70150 Median : 7.000 Median : -6.971 Median : 1.000
## Mean :0.66095 Mean : 6.067 Mean : -7.926 Mean : 0.639
## 3rd Qu.:0.86300 3rd Qu.: 9.000 3rd Qu.: -5.196 3rd Qu.: 1.000
## Max. :0.99900 Max. :11.000 Max. : 11.000 Max. : 1.000
## NA's :250
## speechiness acousticness instrumentalness liveness
## Min. :0.02270 Min. :0.0000016 Min. :0.0000 Min. :0.00153
## 1st Qu.:0.03580 1st Qu.:0.0027675 1st Qu.:0.0001 1st Qu.:0.09728
## Median :0.04965 Median :0.0682000 Median :0.0051 Median :0.13200
## Mean :0.08273 Mean :0.2402621 Mean :0.1838 Mean :0.20280
## 3rd Qu.:0.08530 3rd Qu.:0.4092500 3rd Qu.:0.2057 3rd Qu.:0.27300
## Max. :1.00000 Max. :0.9930000 Max. :0.9650 Max. :0.99200
## NA's :496
## valence tempo duration_in.min.ms time_signature
## Min. :0.0307 Min. : 0.153 Min. : 1.1 Min. :1.000
## 1st Qu.:0.2968 1st Qu.: 99.991 1st Qu.: 164450.2 1st Qu.:4.000
## Median :0.4750 Median :120.026 Median : 208974.0 Median :4.000
## Mean :0.4830 Mean :122.764 Mean : 200862.6 Mean :3.916
## 3rd Qu.:0.6670 3rd Qu.:141.988 3rd Qu.: 253133.5 3rd Qu.:4.000
## Max. :0.9760 Max. :216.091 Max. :1244613.0 Max. :5.000
##
## genre id
## Length:2000 Min. : 1.0
## Class :character 1st Qu.: 500.8
## Mode :character Median :1000.5
## Mean :1000.5
## 3rd Qu.:1500.2
## Max. :2000.0
##
#Analisis de cada columna:
-artist_name: Esta variable categorica contiene el nombre del artista que interpreta la canción y es de tipo caracter.
-Track_name:Esta variable categorica es el nombre del tema y es de tipo caracter
-Popularity: Mide el índice de popularidad de la canción, esta contenida entre 1 y 97. La media es 45 y contiene valores no disponibles.
-Danceability: Mide el índice de danceabilidad del tema basándose en una combinación de elementos musicales que incluye el tempo, la estabilidad rítmica, la intensidad del pulso y la regularidad general. Los valores que puede tomar van desde 0.0 (la menos bailable) hasta 1.0 (la más bailable). Sin embargo se observa que tiene un valor atípico de 44 el cual será tratado mas adelante.
-Energy: Mide la energía que transmite la canción y toma valores comprendidos entre 0 y 1. Su media es de 0.66095
-Key: Variable categorica que informa de la escala en la que está la canción. Contiene valores no disponibles
-Loudness:Esta compuesta de valores negativos y un solo número positivo (11), lo cual nos lleva a pensar que es un valor atípico, mas adelante será analizado con mayor profundidad.
-Mode:Es una variable binaria con un valor atípico de -9. Indica si está en una escala mayor o menor.
-Speechiness: Por speechiness se entiende la presencia de palabras habladas en el tema. Para pistas totalmente habladas, como un audiolibro, un recital de un poema, etc., el valor de este parámetro se acercará a 1.0. Los valores entre 0.33 y 0.66 representan temas en los que se combinan partes habladas con música, ya sea secuencialmente o a la vez, como puede ser el caso del rap. Por debajo de 0.33 estaríamos hablando del resto de géneros en los que la letra no se recita, sino que se canta.
-Acousticness:Este parámetro da información sobre la presencia de elementos vocales en la canción. Cuanto más próximo esté este valor a 1.0, mayor probabilidad de que el tema no tenga voces. En general, con valores superiores a 0.5 el tema puede considerarse como instrumental. La función de probabilidad de esta variable nos lo deja bastante claro: distingue entre temas estrictamente instrumentales (los cercanos a 1.0) y temas que también incluyen voz (los cercanos a 0.0)
-Instrumentalness:Mide cuanto instrumental tiene la canción y se distribuye entre 0 y 1. Contiene valores no disponibles.
-Liveness: Detecta la presencia de publico en el tema y se distribuye del 0 al 1.
-Valence: Esta propiedad musical describe la positividad musical transmitida por una pista de audio. Las pistas con alta valencia están asociadas con emociones positivas tales como: estar feliz, alegre eufórico, entre otros. Por otra parte, las pistas de con baja valencia están asociadas a emociones negativas o estados de ánimo tales como: tristeza, depresión, enojo. Esta distribuida entre 0 y 1.
-Tempo:indica los beats por minuto que tiene la canción. A simple vista puede observarse que 0.153 es un valor atípico.
-duration_in.min.ms:Indica la duracion en milisegundos del tema.
-Time_signature:Esta variable nos indica el compás en el que está escrita la canción. Comprende valores entre 1 y 5.
-Genre:Es una variable tipo caracter que contiene el genero de cada tema.
A continuación se adicionará una variable llamada ‘Publicidad’ que será binaria y tendra un 1 si el tema pertenece a alguno de los siguientes géneros:
Train$publicidad <- 0
Train$publicidad[Train$genre == 'Country'] <- 1
Train$publicidad[Train$genre == 'HipHop'] <- 1
Train$publicidad[Train$genre == 'Bolywood'] <- 1
Train$publicidad[Train$genre == 'Metal'] <- 1
Train$publicidad[Train$genre == 'Pop'] <- 1
Ahora analizaremos la variable publicidad
barplot(table(Train$publicidad), main='Publicidad', ylab='Frecuencia', col=123)
Se puede visualizar que hay mayor frecuencia de canciones que no pertenecen a los generos a publictar.
En este punto se graficara y analizara un boxplot de cada variable con el fin de identificar posibles outliers y su razón.
Train_num <- Train[, 3:15] #Nos quedamos solo con las variables numericas
boxplot(Train$popularity, main= 'Popularity', col=143)
boxplot.stats(Train$popularity)
## $stats
## [1] 1.0 34.5 45.0 57.0 90.0
##
## $n
## [1] 1948
##
## $conf
## [1] 44.19454 45.80546
##
## $out
## [1] 92 95 97 92 93
OutPopu <- subset(Train, popularity > 90)
table(OutPopu$genre)
##
## HipHop Pop
## 1 4
Se distinguen 5 canciones extremadamente populares, particularmente del genero pop. Se decide eliminarlos ya que no representan cantidad significativa en el data frame y distorsionan el valor de la media de la variable.
Train <- Train[(Train$popularity < 90), ]
FilasABorrar <- which(rowMeans(is.na(Train))>0.9)
Train <- Train[-FilasABorrar, ]
boxplot(Train$danceability, main= 'Danceability', col=453)
boxplot.stats(Train$danceability)
## $stats
## [1] 0.0985 0.4360 0.5480 0.6640 0.9800
##
## $n
## [1] 1942
##
## $conf
## [1] 0.5398254 0.5561746
##
## $out
## [1] 0.0850 0.0755 0.0918
OutDanc <- subset(Train, danceability < 0.0985)
table(OutDanc$genre)
##
## Instrumental Metal
## 2 1
Como puede verse los generos que presentan valores outliers son generos que comunmente no se bailan, por lo tanto tiene sentido que se encuentren debajo del límite inferior entonces se determina que no son datos atipicos.
boxplot(Train$energy, main= 'Energy', col=263)
boxplot.stats(Train$energy)
## $stats
## [1] 0.00395 0.50800 0.70250 0.86400 0.99900
##
## $n
## [1] 1942
##
## $conf
## [1] 0.6897361 0.7152639
##
## $out
## numeric(0)
Esta variable no presenta valores outliers.
boxplot(Train$loudness, main= 'loudness', col=453)
boxplot.stats(Train$loudness)
## $stats
## [1] -15.786 -9.452 -6.975 -5.213 -1.101
##
## $n
## [1] 1942
##
## $conf
## [1] -7.126983 -6.823017
##
## $out
## [1] -16.117 -19.559 -19.947 -17.117 -25.743 -15.969 -20.924 -22.505 -23.714
## [10] -18.252 -18.481 -22.533 -24.035 -17.948 -22.751 -34.378 -17.789 -20.816
## [19] -22.079 -23.987 -15.921 -16.653 -18.621 -17.737 -18.928 -19.055 -21.322
## [28] -18.181 -16.670 -16.225 -23.811 -18.022 -20.043 -15.982 -20.689 -16.843
## [37] -16.225 -20.219 -24.937 -16.225 -16.551 -29.298 -18.152 -23.295 -19.991
## [46] -18.769 -16.296 -17.208 -21.903 -16.209 -17.850 -23.378 -23.806 -16.415
## [55] -19.161 -25.567 -18.730 -19.872 -17.651 -18.318 -26.085 -19.165 -25.533
## [64] -19.539 -19.782 -19.429 -20.758 -24.253 -16.945 -22.241 -18.201 -17.424
## [73] -22.482 -26.725 -18.827 -18.604 -30.470 -16.239 -25.826 -22.159 -21.178
## [82] -16.729 -16.415 -17.999 -22.487 -25.934 -16.446 -16.509 -19.854 -18.064
## [91] -22.925 -16.729 -24.372 -16.498 -16.117 -17.343 -17.339 -16.204 -19.696
## [100] -15.965
OutLoud <- subset(Train, loudness < -15.786)
table(OutLoud$genre)
##
## Acoustic/Folk Alt_Music Blues Bollywood Country
## 4 9 14 1 2
## HipHop Indie_Alt Instrumental Metal Pop
## 3 12 45 1 2
## Rock
## 7
Los valores outliers pertenecientes a los generos: Indie_Alt, Instrumental, Country, Blues, Acoustic/Folk de por si tienen bajos sonidos debido a la naturaleza del genero.
Los outliers pertenecientes a HipHop, Bollywood, Metal, Pop y Rock si son atipicos debibo a la naturaleza del genero, por lo tanto se reemplazaran como NA para luego imputarlos.
OutLoud <- subset(OutLoud, genre == 'HipHop' | genre == 'Bollywood' | genre == 'Metal' | genre== 'Pop' | genre == 'Rock')
OutLoud$loudness <- OutLoud$loudness == NA
Train$loudness[OutLoud$id] <- NA
Se analiza mode porque a pesar de que es una variable binaria, en el summary se observo un valor atípico
boxplot(Train$mode, main= 'Mode', col=453)
boxplot.stats(Train$mode)
## $stats
## [1] 0 0 1 1 1
##
## $n
## [1] 1942
##
## $conf
## [1] 0.9641464 1.0358536
##
## $out
## integer(0)
Se decide eliminar ese dato atípico ya que no representa un porcentaje notable para el data frame y claramente es un outlier.
OutMode <- subset(Train, mode < 0)
Train <- Train[Train$mode > -1,]
boxplot(Train$speechiness, main= 'speechiness', col=426)
boxplot.stats(Train$speechiness)
## $stats
## [1] 0.02270 0.03580 0.04955 0.08560 0.16000
##
## $n
## [1] 1942
##
## $conf
## [1] 0.04776449 0.05133551
##
## $out
## [1] 0.242 0.176 0.366 0.872 0.334 0.261 0.499 0.251 0.234 0.209 0.339 0.161
## [13] 0.187 0.340 0.321 0.182 0.406 0.483 0.222 0.201 0.424 0.193 0.201 0.176
## [25] 0.418 0.305 0.217 0.198 0.303 0.363 0.504 0.236 0.310 0.210 0.263 0.299
## [37] 0.368 0.357 0.316 0.178 0.282 0.230 0.165 0.303 0.334 0.170 0.325 0.209
## [49] 0.920 0.291 0.350 0.197 0.299 0.220 0.210 0.313 0.530 0.559 0.182 0.163
## [61] 0.311 0.298 0.241 0.210 0.171 0.236 0.300 0.315 0.228 0.438 0.258 0.266
## [73] 0.678 0.245 0.169 0.253 0.280 0.229 0.179 0.186 0.409 0.525 0.439 0.305
## [85] 0.333 0.289 0.193 0.264 0.261 0.216 0.216 0.167 0.723 0.344 0.294 0.161
## [97] 0.315 0.175 0.300 0.402 0.219 0.169 0.242 0.166 0.450 0.290 0.428 0.285
## [109] 0.500 0.315 0.266 0.200 0.439 0.321 0.392 0.219 0.550 0.256 0.190 0.341
## [121] 0.252 0.181 0.364 0.274 0.237 0.187 0.241 0.258 0.433 0.306 0.164 0.191
## [133] 0.361 0.253 0.166 0.332 0.477 0.187 0.174 0.241 0.212 0.245 0.326 0.332
## [145] 0.204 0.530 0.251 0.272 0.180 0.268 0.170 0.176 0.293 0.341 0.252 0.167
## [157] 0.365 0.302 0.315 0.369 0.315 0.522 0.318 0.204 0.329 0.502 0.318 0.162
## [169] 0.597 0.172 0.171 0.198 0.368 0.374 0.287 0.277 0.309 0.188 0.955 0.366
## [181] 0.309 0.303 0.252 0.305 0.170 0.182 0.207 0.218 0.212 0.294 0.167 0.218
## [193] 0.193 0.348 0.295 0.202 0.245 0.161 0.370 0.164 0.174 0.248 0.380 0.165
## [205] 0.173 0.268 0.173 0.333 0.293 0.435 0.374 0.303 0.202 0.427 0.318 0.211
OutSpech <- subset(Train, speechiness > 0.15900)
table(OutSpech$genre)
##
## Alt_Music Blues Bollywood HipHop Indie_Alt Metal Pop Rock
## 14 7 5 109 20 17 21 24
Por la naturaleza del genero HipHop es logico que haya tantos outliers dado que las canciònes presentan mucha parte hablada.
boxplot(Train$acousticness, main= 'Acousticness', col=480)
boxplot.stats(Train$acousticness)
## $stats
## [1] 1.610e-06 2.770e-03 6.795e-02 4.070e-01 9.930e-01
##
## $n
## [1] 1942
##
## $conf
## [1] 0.05345691 0.08244309
##
## $out
## numeric(0)
Acouticness no posee outliers por lo cual no es necesario realizar ninguna operacion
boxplot(Train$instrumentalness, main= 'Instrumentalness', col=490)
boxplot.stats(Train$instrumentalness)
## $stats
## [1] 0.000001 0.000127 0.005090 0.218000 0.543000
##
## $n
## [1] 1458
##
## $conf
## [1] -0.003925332 0.014105332
##
## $out
## [1] 0.947 0.658 0.827 0.941 0.946 0.671 0.865 0.900 0.758 0.959 0.865 0.772
## [13] 0.617 0.611 0.667 0.937 0.776 0.791 0.745 0.816 0.887 0.721 0.789 0.921
## [25] 0.951 0.830 0.694 0.879 0.608 0.731 0.775 0.582 0.921 0.584 0.562 0.843
## [37] 0.710 0.875 0.911 0.671 0.906 0.907 0.864 0.893 0.725 0.944 0.749 0.826
## [49] 0.932 0.918 0.926 0.778 0.945 0.936 0.899 0.734 0.904 0.687 0.925 0.756
## [61] 0.940 0.581 0.922 0.956 0.886 0.842 0.680 0.878 0.707 0.769 0.837 0.750
## [73] 0.914 0.878 0.917 0.842 0.880 0.961 0.869 0.939 0.879 0.590 0.808 0.941
## [85] 0.878 0.735 0.916 0.941 0.886 0.586 0.880 0.908 0.911 0.566 0.807 0.761
## [97] 0.928 0.571 0.901 0.859 0.937 0.783 0.765 0.808 0.855 0.690 0.940 0.606
## [109] 0.565 0.566 0.845 0.874 0.928 0.946 0.880 0.626 0.953 0.837 0.725 0.918
## [121] 0.949 0.965 0.846 0.842 0.808 0.901 0.926 0.760 0.722 0.668 0.667 0.914
## [133] 0.953 0.882 0.818 0.842 0.814 0.756 0.835 0.933 0.572 0.917 0.621 0.658
## [145] 0.936 0.924 0.892 0.849 0.578 0.882 0.595 0.817 0.915 0.841 0.840 0.897
## [157] 0.856 0.856 0.897 0.896 0.779 0.918 0.881 0.945 0.870 0.564 0.830 0.924
## [169] 0.555 0.565 0.671 0.902 0.863 0.886 0.732 0.667 0.852 0.914 0.641 0.704
## [181] 0.870 0.653 0.935 0.747 0.902 0.783 0.937 0.929 0.716 0.899 0.725 0.943
## [193] 0.947 0.708 0.927 0.923 0.644 0.733 0.927 0.858 0.557 0.889 0.703 0.799
## [205] 0.826 0.850 0.914 0.670 0.741 0.725 0.720 0.737 0.823 0.958 0.923 0.898
## [217] 0.847 0.893 0.814 0.852 0.826 0.839 0.752 0.800 0.866 0.932 0.881 0.901
## [229] 0.886 0.728 0.687 0.948 0.866 0.916 0.762 0.835 0.800 0.826 0.869 0.928
## [241] 0.794 0.658 0.814 0.803 0.858 0.583 0.929 0.929 0.899 0.944 0.563
OutInstru <- subset(Train, instrumentalness > 0.1550)
table(OutInstru$genre)
##
## Acoustic/Folk Alt_Music Blues Bollywood HipHop
## 5 40 25 5 3
## Indie_Alt Instrumental Metal Pop Rock
## 106 59 71 7 74
Las canciones de Indie_Alt, Metal o Rock poseen una fuerte base instrumental por lo tanto es logico que sus valores sean muy cercanos a la unidad. ## Liveneess
boxplot(Train$liveness, main= 'Liveness', col=50)
boxplot.stats(Train$liveness)
## $stats
## [1] 0.0244 0.0969 0.1310 0.2730 0.5360
##
## $n
## [1] 1942
##
## $conf
## [1] 0.1246862 0.1373138
##
## $out
## [1] 0.771 0.762 0.809 0.667 0.743 0.706 0.593 0.683 0.839 0.868 0.741 0.626
## [13] 0.938 0.834 0.679 0.793 0.567 0.877 0.641 0.660 0.746 0.906 0.612 0.811
## [25] 0.556 0.784 0.677 0.557 0.847 0.909 0.594 0.608 0.702 0.665 0.560 0.548
## [37] 0.771 0.596 0.596 0.639 0.861 0.611 0.538 0.950 0.920 0.567 0.986 0.643
## [49] 0.752 0.856 0.726 0.717 0.953 0.582 0.546 0.605 0.923 0.680 0.617 0.671
## [61] 0.719 0.601 0.955 0.612 0.565 0.575 0.790 0.587 0.538 0.927 0.700 0.598
## [73] 0.551 0.847 0.970 0.739 0.962 0.979 0.712 0.652 0.752 0.707 0.879 0.680
## [85] 0.669 0.585 0.965 0.908 0.962 0.585 0.992 0.639 0.567 0.977 0.971 0.696
## [97] 0.796 0.544 0.622 0.754 0.676 0.658 0.555 0.659
OutLive <- subset(Train, liveness > 0.53600)
table(OutLive$genre)
##
## Acoustic/Folk Alt_Music Blues Bollywood HipHop
## 1 7 9 5 11
## Indie_Alt Metal Pop Rock
## 10 14 16 31
Los generos que figuran en la tabla por lo general graban canciones en vivo por lo cual se podrà apreciar la presencia del publico.
boxplot(Train$valence, main= 'Valence', col=500)
boxplot.stats(Train$valence)
## $stats
## [1] 0.0307 0.2990 0.4750 0.6700 0.9760
##
## $n
## [1] 1942
##
## $conf
## [1] 0.4616983 0.4883017
##
## $out
## numeric(0)
No posee Outliers por lo cual no debo realizar ninguna accion
boxplot(Train$tempo, main= 'Tempo', col=500)
boxplot.stats(Train$tempo)
## $stats
## [1] 50.329 100.006 120.035 142.184 204.065
##
## $n
## [1] 1942
##
## $conf
## [1] 118.5228 121.5472
##
## $out
## [1] 207.452 212.049 207.469 216.091
OutTempo <- subset(Train, tempo > 204.0650| tempo < 0.153)
table(OutTempo$genre)
##
## Alt_Music Blues HipHop
## 1 2 1
Esta variable toma valores entre 50 y 216, en la base de datos original se detectaba un valor atìpico de 0.153 sin embargo este fue eliminado anteriormente. ## Duration
boxplot(Train$duration_in.min.ms, main= 'Duration', col=500)
boxplot.stats(Train$duration_in.min.ms)
## $stats
## [1] 68413.0 166400.0 209761.5 254691.0 385400.0
##
## $n
## [1] 1942
##
## $conf
## [1] 206596 212927
##
## $out
## [1] 3.578883e+00 4.319730e+05 5.153550e+00 3.158633e+00 4.430450e+00
## [6] 2.853783e+00 4.220217e+00 3.831417e+00 4.484983e+00 6.815600e+05
## [11] 2.641283e+00 5.233470e+05 4.290930e+05 2.818867e+00 3.066117e+00
## [16] 3.697817e+00 3.936667e+00 4.167600e+05 3.274450e+00 3.283333e+00
## [21] 2.629117e+00 7.540450e+00 3.178883e+00 4.342283e+00 1.880717e+00
## [26] 3.884533e+00 6.019783e+00 4.081117e+00 3.857150e+00 2.289333e+00
## [31] 7.033730e+05 3.648217e+00 6.178580e+05 4.678950e+00 4.030450e+00
## [36] 4.144883e+00 3.219667e+00 8.437117e+00 3.981100e+05 2.555633e+00
## [41] 5.706130e+05 3.687333e+00 3.666983e+00 6.108667e+00 7.626670e+05
## [46] 4.512450e+00 5.202450e+00 3.347117e+00 5.232030e+05 5.257900e+00
## [51] 4.199550e+00 3.319100e+00 4.631583e+00 5.126217e+00 2.779917e+00
## [56] 4.251783e+00 5.504800e+05 4.021783e+00 3.341333e+00 3.162667e+00
## [61] 3.650883e+00 4.660667e+00 2.658333e+00 3.450967e+00 3.925333e+00
## [66] 4.731517e+00 3.055767e+00 2.988450e+00 2.777433e+00 4.178000e+05
## [71] 3.457117e+00 5.616000e+00 4.224640e+05 5.145733e+00 1.121253e+06
## [76] 3.340450e+00 3.623467e+00 3.181333e+00 4.617283e+00 7.131920e+05
## [81] 4.615330e+05 9.104800e+05 2.902450e+00 3.692883e+00 4.750367e+00
## [86] 2.839083e+00 7.245333e+00 3.850667e+00 3.657783e+00 4.008670e+05
## [91] 5.080000e+00 3.850233e+00 3.186883e+00 3.336217e+00 2.873333e+00
## [96] 4.258217e+00 2.228783e+00 3.919583e+00 4.103783e+00 3.643383e+00
## [101] 4.294890e+05 3.859717e+00 4.330000e+05 4.092883e+00 3.170667e+00
## [106] 4.822217e+00 5.033117e+00 6.844450e+00 3.061117e+00 8.977080e+05
## [111] 4.002883e+00 5.563617e+00 3.211783e+00 3.731600e+00 4.154883e+00
## [116] 3.916930e+05 3.639700e+00 3.019983e+00 4.140217e+00 3.706667e+00
## [121] 3.878670e+05 4.527783e+00 3.614233e+00 5.016667e+00 4.224640e+05
## [126] 5.153870e+05 3.643550e+00 4.470000e+05 5.158217e+00 6.504670e+05
## [131] 2.508617e+00 5.535550e+00 6.770933e+00 6.883333e+00 3.750000e+00
## [136] 3.509333e+00 5.096000e+05 3.692217e+00 4.304217e+00 2.792667e+00
## [141] 4.699550e+00 3.267550e+00 3.045833e+00 3.436817e+00 5.496450e+00
## [146] 2.069117e+00 2.721550e+00 4.479990e+05 4.115700e+00 2.765433e+00
## [151] 4.427330e+05 4.647333e+00 4.770270e+05 3.098617e+00 6.066217e+00
## [156] 8.515550e+00 2.926783e+00 1.130667e+00 3.873333e+00 3.466233e+00
## [161] 4.056400e+05 2.132200e+00 3.977680e+05 7.023267e+00 4.228130e+05
## [166] 3.066000e+00 3.167783e+00 2.790450e+00 4.972833e+00 5.030450e+00
## [171] 3.820450e+00 3.228883e+00 7.927683e+00 7.226883e+00 4.854883e+00
## [176] 3.635117e+00 2.565367e+00 4.026667e+00 1.760683e+00 9.084450e+00
## [181] 1.244613e+06 2.860883e+00 5.186433e+00 3.424217e+00 6.178883e+00
## [186] 4.041117e+00 4.509840e+05 3.962217e+00 2.700000e+00 3.878933e+00
## [191] 4.266667e+00 3.133333e+00 6.011783e+00 5.696217e+00 5.372030e+05
## [196] 3.860450e+00 2.733083e+00 4.000000e+00 4.555240e+05 4.289750e+00
## [201] 3.913320e+05 5.794667e+00 5.407783e+00 5.617070e+05 3.863867e+00
## [206] 2.642450e+00 8.545550e+00 6.210000e+00 5.718950e+05 3.892000e+05
## [211] 4.747333e+00 4.358883e+00 2.720400e+00 6.316667e+00 3.424700e+00
## [216] 3.502667e+00 6.191017e+00 2.303817e+00 2.147550e+00 2.704883e+00
## [221] 4.035330e+05 4.408400e+00 3.312450e+00 6.569340e+05 4.653330e+05
## [226] 2.631550e+00 3.771783e+00 4.443070e+05 4.845167e+00 5.135730e+05
## [231] 4.142530e+05 8.962270e+05 3.636217e+00 2.810267e+00 4.046667e+00
## [236] 3.750667e+00 3.140150e+00 3.643183e+00 4.023760e+05 2.394450e+00
## [241] 3.098667e+00 4.094400e+05 5.057233e+00 4.207920e+05 1.863117e+00
## [246] 4.368400e+05 3.619550e+00 6.180000e+00 3.602883e+00 4.102800e+05
## [251] 5.996780e+05 2.572667e+00 2.445333e+00 3.947750e+00 3.149800e+00
## [256] 3.946450e+00 4.391200e+05 7.697333e+00 3.421317e+00 4.007170e+05
## [261] 6.807950e+00 2.570000e+00 1.473967e+00 5.294683e+00 4.236217e+00
## [266] 2.923917e+00 2.599200e+00 3.976000e+00 2.133250e+00 4.382483e+00
## [271] 4.138333e+00 4.390670e+05 4.671117e+00 3.930450e+00 6.233870e+05
## [276] 1.772150e+00 3.646000e+00 3.668450e+00 3.371783e+00 6.788450e+00
## [281] 4.171817e+00 3.105550e+00 3.609117e+00 4.583217e+00 5.353600e+05
## [286] 2.816850e+00 4.051470e+05 4.197117e+00 3.122883e+00 4.899500e+00
## [291] 3.881550e+00 2.875567e+00 3.584883e+00 3.807333e+00 5.516917e+00
## [296] 4.776067e+00 3.997200e+05 7.267117e+00 3.465183e+00 4.135240e+05
## [301] 3.729333e+00 4.183117e+00 2.716217e+00 2.806000e+00 1.023037e+01
## [306] 3.430450e+00 3.616000e+00 3.273700e+00 4.193070e+05 7.987117e+00
## [311] 6.402500e+05 3.912033e+00 2.469333e+00 3.626000e+00 4.318667e+00
## [316] 4.498667e+00 4.347200e+00 4.947117e+00 5.522217e+00 2.235300e+00
## [321] 4.954450e+00 3.926450e+00 4.486267e+00 3.288883e+00 7.105333e+00
## [326] 5.150000e+05 6.160000e+00 4.135600e+05 3.953817e+00 5.940000e+05
## [331] 4.679330e+05 3.307333e+00 4.663820e+05 3.222217e+00
OutDuran <- subset(Train, duration_in.min.ms > 385400| duration_in.min.ms < 68413)
table(OutDuran$genre)
##
## Acoustic/Folk Alt_Music Blues Bollywood Country
## 55 4 11 40 41
## HipHop Indie_Alt Instrumental Metal Pop
## 2 8 64 21 38
## Rock
## 50
Las duraciones mas altas se deben a conciertos en vivo o discos enteros. Se puede ver que la mayoria de los datos atipicos pertenecen a generos instrumenaltes, acusticos, pop, rock y bollywood los cuales poseen mayor duracion en general.En este Sprint no se eliminaran dado que podrìan ser de valor mas adelante.
Para analizar la coreelacion entre las variables usaremos la herramienta pairs.panels de la libreria “psych”
Train_num2 <- select(Train, -mode, -key, -publicidad, -time_signature, -id)
if (!require('psych')) install.packages('psych'); library('psych')
## Loading required package: psych
##
## Attaching package: 'psych'
## The following objects are masked from 'package:ggplot2':
##
## %+%, alpha
pairs.panels(Train_num2)
Podemos ver que existen correlaciones entre algunas variables.
-Energy tiene una correlacion positiva con loudness
-Energy tiene una correlacion negativa con Acoustiness
-Danceability tiene una correlacion negativa con mode.
Vamos a realizar un analisis de las distintas variables que componen el dataframe mediante el uso de histogramas y boxplots.
if (!require('inspectdf')) install.packages('inspectdf');
## Loading required package: inspectdf
library(inspectdf)
num <- inspect_num(Train_num2)
show_plot(num)
Las variables popularity, danceability, valance y tempo presentan una distribucion normal, por esta razon de ser necesario imputar valores se realizara por la media.
Energy y loudness presentan una distribucion sesgada hacia la derecha, los valores se imputaran por la mediana.
Spechness, acousticness, instrumentalness y liveness presentan distribucion sesgada hacia la izquierda, los valores se imputaran por la mediana.
Vamos a ver graficamente la proporcion de datos faltantes
na <-inspect_na(Train)
show_plot(na)
Podemos apreciar que las variables que contienen datos faltantes son instrumentalness, key, popularity y loudness. Se procede a la imputacion.
TrainLimpio <- na.omit(Train)
TrainLimpio$key <- as.numeric(TrainLimpio$key)
MedianaInstrum <- median(TrainLimpio$instrumentalness)
MediaKey <- round(mean((TrainLimpio$key)))
MediaPopularity <- mean(TrainLimpio$popularity)
MediaLoudness <- median(TrainLimpio$loudness)
Train$instrumentalness[is.na(Train$instrumentalness)] <- MedianaInstrum
Train$key[is.na(Train$key)] <- MediaKey
Train$popularity[is.na(Train$popularity)] <- MediaPopularity
Train$loudness[is.na(Train$loudness)] <- MediaLoudness
Verificamos que ya no existen datos faltantes
na <-inspect_na(Train)
show_plot(na)
## Warning: `guides(<scale> = FALSE)` is deprecated. Please use `guides(<scale> =
## "none")` instead.
Vamos a analizar la variable publicidad comparandola con las demas variables.
Train$publicidad <- as.character(Train$publicidad)
ggplot(data = Train[!(is.na(Train[1:1942,]$popularity)),],aes(x=popularity,fill=publicidad))+geom_histogram(binwidth =3, position="fill")
Se puede observar una tendencia que a medida que aumenta la popularidad de la canciòn, la proporciòn de cancion publicitadas es mayor.
Train$publicidad <- as.character(Train$publicidad)
ggplot(data = Train[!(is.na(Train[1:1942,]$danceability)),],aes(x=danceability,fill=publicidad))+geom_histogram(binwidth =3, position="fill")
A simple vista no se observa una relaciòn entre que tan bailable sea la canciòn y si conviene o no publicitar ## Publicidad y energy
ggplot(data = Train[!(is.na(Train[1:1942,]$energy)),],aes(x=energy,fill=publicidad))+geom_histogram(binwidth =3, position="fill")
A simple vista no se observa una relaciòn entre energy y si conviene o no publicitar ## Publicidad y key
ggplot(data = Train[!(is.na(Train[1:1942,]$key)),],aes(x=key,fill=publicidad))+geom_histogram(binwidth =3, position="fill")
Se observa una leve tendencia entre que si la categoria de key es baja o alta conviene publicitar ## Publicidad y loudness
ggplot(data = Train[!(is.na(Train[1:1942,]$loudness)),],aes(x=loudness,fill=publicidad))+geom_histogram(binwidth =3, position="fill")
Se observa que las canciones con mayor loudness tienen mas posibilidad de ser publicitadas.
ggplot(data = Train[!(is.na(Train[1:1942,]$mode)),],aes(x=mode,fill=publicidad))+geom_histogram(binwidth =3, position="fill")
A simple vista no se observa una relaciòn entre mode y si conviene o no publicitar
ggplot(data = Train[!(is.na(Train[1:1942,]$speechiness)),],aes(x=speechiness,fill=publicidad))+geom_histogram(binwidth =3, position="fill")
A simple vista no se observa una relaciòn entre speechiness y si conviene o no publicitar
ggplot(data = Train[!(is.na(Train[1:1942,]$acousticness)),],aes(x=acousticness,fill=publicidad))+geom_histogram(binwidth =3, position="fill")
A simple vista no se observa una relaciòn entre acousticness y si conviene o no publicitar
ggplot(data = Train[!(is.na(Train[1:1942,]$instrumentalness)),],aes(x=instrumentalness,fill=publicidad))+geom_histogram(binwidth =3, position="fill")
A simple vista no se observa una relaciòn entre instrumentalness y si conviene o no publicitar
ggplot(data = Train[!(is.na(Train[1:1942,]$liveness)),],aes(x=liveness,fill=publicidad))+geom_histogram(binwidth =3, position="fill")
A simple vista no se observa una relaciòn entre liveness y si conviene o no publicitar
ggplot(data = Train[!(is.na(Train[1:1942,]$valence)),],aes(x=valence,fill=publicidad))+geom_histogram(binwidth =3, position="fill")
A simple vista no se observa una relaciòn entre valance y si conviene o no publicitar
ggplot(data = Train[!(is.na(Train[1:1942,]$tempo)),],aes(x=tempo,fill=publicidad))+geom_histogram(binwidth =3, position="fill")
## Warning: Removed 6 rows containing missing values (geom_bar).
A simple vista no se observa una relaciòn entre tempo y si conviene o no publicitar
ggplot(data = Train[!(is.na(Train[1:1942,]$time_signature)),],aes(x=time_signature,fill=publicidad))+geom_histogram(binwidth =3, position="fill")
A medida que aumenta el valor de time_signature hay mas posibilidades de que la canciòn sea publicitada.