En este ejercicio se ha utilizado un dataset relativo a Social Media. Nuestro dataset contiene información relativa a la Agencia, Plataforma, Url, Fecha y Nºde Visitas/Likes. Es descargable en este link: https://data.cityofnewyork.us/api/views/5b3a-rs48/rows.csv?accessType=DOWNLOAD.
Vamos a llevar a cabo una serie de técnicas destinadas a la limpieza y preparación del dataset de cara a un posterior análisis:
Eliminamos registros vacíos y NAs que no aportan información.
Adaptamos las variables a sus formatos adecuados.
Convertimos a minúsculas los valores para homogeneizar categorías.
Limpiamos el dataset de algunos registros que no deben aparecer.
Ordenamos el dataset para que sea más intuitivo y fácil de manejar.
#Fijamos directorio de trabajo
setwd("C:/Users/Gonzalo/Documents/datos")
#Comprobamos directorio de trabajo
getwd()
## [1] "C:/Users/Gonzalo/Documents/datos"
#Descargamos nuestro dataset y lo guardamos en el directorio fijado
URL<-"https://data.cityofnewyork.us/api/views/5b3a-rs48/rows.csv?accessType=DOWNLOAD"
download.file(URL,destfile="./SocialMedia.csv")
#Almacenamos la fecha de la descarga
fechaDescarga <- date()
fechaDescarga
## [1] "Sat Nov 18 18:01:03 2017"
#Librerías necesarias#
library(knitr)
#Lectura de los datos#
socialmedia<-read.csv("./SocialMedia.csv",header=TRUE)
summary(socialmedia)
## Agency Platform Url
## DOE : 380 Facebook :1680 : 160
## DOH : 300 Twitter :1400 You The Man : 40
## DOT : 280 YouTube : 560 0 : 20
## NYC & Co: 260 Flickr : 440 2800000 : 20
## MOME : 180 Tumblr : 420 877877 : 20
## OEM : 180 WordPress: 240 Condom Finder: 20
## (Other) :4319 (Other) :1159 (Other) :5619
## Date.Sampled Likes.Followers.Visits.Downloads
## 01/20/2012 12:00:00 AM: 295 Min. : 0
## 02/17/2012 12:00:00 AM: 295 1st Qu.: 196
## 03/14/2012 12:00:00 AM: 295 Median : 709
## 04/09/2012 12:00:00 AM: 295 Mean : 18486
## 04/30/2012 12:00:00 AM: 295 3rd Qu.: 3400
## 05/09/2012 12:00:00 AM: 295 Max. :2785806
## (Other) :4129 NA's :1920
#Modificamos los nombres de las variables para que no lleven puntos#
colnames(socialmedia)<-c("Agency","Platform","Url","Date_Sampled","Likes_Followers_Visits_Downloads")
#Usamos complete.cases para eliminar NA y vacios ya que no nos aportan información#
socialmedia2<-socialmedia[complete.cases(socialmedia),]
No necesitamos que se incluya la hora. Vamos a mostrar la fecha en formato aaaa-mm-dd:
#Cargamos la librería Ludridate#
library(lubridate)
##
## Attaching package: 'lubridate'
## The following object is masked from 'package:base':
##
## date
#Transformamos el formato original que viene con la hora#
socialmedia2$Date_Sampled=mdy_hms(socialmedia2$Date_Sampled)
#Formato Date#
socialmedia2$Date_Sampled=as.Date(socialmedia2$Date_Sampled)
#Formato numérico en el campo Likes#
socialmedia2$Likes_Followers_Visits_Downloads=as.numeric(socialmedia2$Likes_Followers_Visits_Downloads)
Vemos en ella que tenemos valores repetidos en función de las mayúsculas. Por ejemplo, tenemos “Youtube” y “YouTube” en el campo Platform. Eliminamos también los registros TOTAL ya que no nos interesa que aparezca el total como un registro más.
#Vemos los posibles valores que toman Agency y Platform#
levels(socialmedia2$Agency)
## [1] "" "311"
## [3] "ACS" "All"
## [5] "CAU" "CCRB"
## [7] "Change by Us" "Change By Us"
## [9] "Child Services" "City Charter"
## [11] "City Store" "Commission on Human Rights"
## [13] "Culture" "DCA"
## [15] "DEP" "Dept of Consumer Affairs"
## [17] "DFTA" "DHS"
## [19] "DOB" "DOB: Cool Roofs"
## [21] "DOB: UrbanCanvas" "DOC"
## [23] "DOE" "DOF"
## [25] "DOH" "DOHMH"
## [27] "DOI" "DOITT"
## [29] "DOT" "DPR"
## [31] "DRIS" "DSNY"
## [33] "DYCD" "EDC"
## [35] "ENDHT" "energyNYC"
## [37] "FDNY" "FUND"
## [39] "GreeNYC" "HDP"
## [41] "HHC" "HHS"
## [43] "HIA" "HPD/Commission on Human Rights"
## [45] "HRA" "LMEC"
## [47] "LPC" "Materials for the Arts"
## [49] "Mayor's Fund" "Mayor's Office"
## [51] "MOAE" "MOIA"
## [53] "MOME" "MOPD"
## [55] "NYC & Co" "NYC Digital"
## [57] "NYC Digital: external newsletter" "NYC Gov"
## [59] "NYC Mayors Cup" "NYC Water"
## [61] "NYC Waterfront" "NYCCFB"
## [63] "NYCDCAS" "NYCGLOBAL"
## [65] "nycgov" "NYCHA"
## [67] "NYCService" "NYCSevereWeather"
## [69] "NYPD" "OCDV"
## [71] "OEM" "OMB"
## [73] "PlaNYC" "Prob"
## [75] "Probation" "SBS"
## [77] "SBS - Workforce1" "SICB1"
## [79] "SimpliCity" "SnowUpdate"
## [81] "TLC" "TOTAL"
## [83] "VAC" "Veteran's Affairs"
## [85] "Vets" "YMI"
## [87] "Young Mens Initiative"
levels(socialmedia2$Platform)
## [1] "Android" "Broadcastr"
## [3] "Facebook" "Flickr"
## [5] "Foursquare" "Foursquare (Badge Unlock)"
## [7] "Google+" "Instagram"
## [9] "iPhone" "iPhone app"
## [11] "iPhone App" "Linked-In"
## [13] "Newsletter" "nyc.gov"
## [15] "Pinterest" "SMS"
## [17] "TOTAL" "Tumblr"
## [19] "Twitter" "Vimeo"
## [21] "WordPress" "Youtube"
## [23] "YouTube"
#Corregimos posibles errores en los valores pasando a minúsculas#
socialmedia3<-data.frame(tolower(as.matrix(socialmedia2)))
kable(head(socialmedia3[1:6,]))
| Agency | Platform | Url | Date_Sampled | Likes_Followers_Visits_Downloads | |
|---|---|---|---|---|---|
| 1 | oem | sms | 2012-02-17 | 61652 | |
| 2 | oem | sms | 2012-11-09 | 44547 | |
| 5 | dhs | www.twitter.com/nycdhs | 2012-06-13 | 389 | |
| 6 | dhs | www.twitter.com/nycdhs | 2012-08-02 | 431 | |
| 7 | doh | android | condom finder | 2011-08-08 | 5026 |
| 9 | mome | android | miny venor app | 2011-08-08 | 313 |
#Ya no tenemos Youtube y YouTube separados#
levels(socialmedia3$Platform)
## [1] "android" "facebook"
## [3] "flickr" "foursquare"
## [5] "foursquare (badge unlock)" "google+"
## [7] "instagram" "iphone"
## [9] "iphone app" "linked-in"
## [11] "newsletter" "pinterest"
## [13] "sms" "total"
## [15] "tumblr" "twitter"
## [17] "wordpress" "youtube"
dim(socialmedia3)
## [1] 3979 5
#Existen filas intermedias que indican el total para algun día concreto#
#Las eliminamos. Los totales no deberían estar como un registro más#
socialmedia4<-socialmedia3[socialmedia3$Platform!="total",]
#Se reduce el numero de filas al quitar los totales#
dim(socialmedia4)
## [1] 3960 5
Utilizamos el comando Order para ordenar por Fecha, Agencia y Plataforma.
#Utilizamos el comando order para ordenar nuestro dataframe#
DatosLimpios<-socialmedia4[order(socialmedia4$Date_Sampled,socialmedia4$Agency,socialmedia4$Platform),]
rownames(DatosLimpios) <- NULL
#Vista final de los datos limpios#
kable(head(DatosLimpios[1:10,]))
| Agency | Platform | Url | Date_Sampled | Likes_Followers_Visits_Downloads |
|---|---|---|---|---|
| 311 | http://www.facebook.com/pages/new-york-city-311/84372567650 | 2011-08-08 | 1078 | |
| 311 | iphone app | http://itunes.apple.com/us/app/nyc-311/id324897619?mt=8 | 2011-08-08 | 16879 |
| 311 | http://www.twitter.com/nycasp | 2011-08-08 | 6677 | |
| 311 | http://www.twitter.com/311nyc | 2011-08-08 | 17956 | |
| 311 | wordpress | http://311nyc.wordpress.com/ | 2011-08-08 | 100 |
| acs | http://www.facebook.com/familyconnectionsnyc | 2011-08-08 | 290 |
#Grabamos nuestros datos limpios en el directorio fijado inicialmente#
write.csv(DatosLimpios,"DatosLimpios.csv",row.names=FALSE)