Sunteți pe pagina 1din 32

SISTEMAS DE PUESTA A TIERRA:

Diseñado Notas
con de yclase:
IEEE-80 evaluado
Análisis de datos con Rcon MEF

JOSÉ SAMUEL RAMÍREZ CASTAÑO


Juan David Marín Jiménez
Ingeniero Electricista
Doctor en Ingeniería
EDUARDO ANTONIO
Ingeniero CANO PLATA
electricista
Ingeniero Electricista

El presente trabajo se presenta como guía detallada de análisis de datos para ingenieros
electricistas

FACULTAD DEdeINGENIERÍA
Facultad Ingeniería YYArquitectura
ARQUITECTURA
Universidad Nacional de
Universidad Nacional deColombia
Colombia
Sede Manizales
Sede Manizales
2018
2010
CAPÍTULO 1

Adquisición y preparación de datos para


el análisis

1.1. Preparación de datos para el análisis

Que es un dato?
Como se leen los datos
5 etapas
Etapa 1: enmarcar el problema (hacer las preguntas adecuadas). Cual es el objetivo
de la empresa, qué queremos predecir o estimar?
Etapa 2: adquirir y preparar los datos. Que recursos tenemos para obtener datos? Que
información es relevante? Limpieza y filtración de datos
Etapa 3: Explorar datos. Visualizar datos. Localizar en los gráficos posibles tenden-
cias, correlaciones o patrones.
Etapa 4: Modelar y evaluar los datos. Ultilizar algún algoritmo innovador para crear
el modelo. Evaluar el modelo.
Etapa 5: Comunicar los resultados y/o puesta en producción. Que hemos aprendido?
Los resultados tienen sentido?

1.1.1. El fichero CSV y la función read.csv

Son los ficheron mas comunes:

auto <- read.csv("../data/tema1/auto-mpg.csv",


header = TRUE, sep = ",",
strings.na = "",

2
1.1 preparación de datos para el análisis

stringsAsFactors = FALSE)
names(auto)

#read.csv2 == read.csv("filename", sep = ";", dec = ",")


# sep = "\t"

auto_no_header <- read.csv("../data/tema1/auto-mpg-noheader.csv",


header = FALSE)
head(auto_no_header, 4)

auto_no_sense <- read.csv("../data/tema1/auto-mpg-noheader.csv")


head(auto_no_sense, 4)

auto_custom_header <-
read.csv("../data/tema1/auto-mpg-noheader.csv",
header = F,
col.names = c("numero", "millas_por_galeon", "cilindrada",
"desplazamiento", "caballos_de_potencia",
"peso", "aceleracion", "año", "modelo"
)
)
head(auto_custom_header, 2)

who_from_internet <- read.csv("https://frogames.es/


course-contents/r/intro/tema1/WHO.csv")

#NA : not available


#na.strings=""
#as.character()
#stringsAsFactors = FALSE - Para leer datos como factores

1.1.2. Creando ficheros Rdata y rds

clientes <- c("Juan Gabriel", "Ricardo", "Pedro")


fechas <- as.Date(c("2017-12-27", "2017-11-1", "2018-1-1"))
pago <- c(315, 192.55, 40.15)
pedidos <- data.frame(clientes, fechas, pago)

clientes_vip <- c("Juan Gabriel", "Ricardo")

save(pedidos, clientes_vip, file = "../data/tema1/pedidos.Rdata")


saveRDS(pedidos, file="../data/tema1/pedidos.rds")

3
adquisición y preparación de datos para el análisis

remove(pedidos)

load("../data/tema1/pedidos.Rdata")

orders <- readRDS("../data/tema1/pedidos.rds")

data(iris)
data(cars)

save.image(file = "../data/tema1/alldata.Rdata")

primes <- c(2,3,5,7,11,13)


pow2 <- c(2,4,8,16,32,64,128)
save(list = c("primes", "pow2"), file = "../data/tema1/primes_and_pow2.Rdata")

attach("../data/tema1/primes_and_pow2.Rdata")

data()

1.1.3. Eliminar datos sin valor con na.omit y limpieza selectiva

Permite verificar si falta algún valor en nuestra base de datos y eliminarlos. Sin embargo es
necesario realizar otros tipos de operaciones que nos permitan
data <- read.csv("../data/tema1/missing-data.csv", na.strings = "")

data.cleaned <- na.omit(data)

is.na(data[4,2])
is.na(data[4,1])
is.na(data$Income)

#Limpiar NA de solamente la variable Income


data.income.cleaned <- data[!is.na(data$Income),]
#Filas completas para un data frame
complete.cases(data)
data.cleaned.2 <- data[complete.cases(data), ]
#Convertir los ceros de ingresos en NA
data$Income[data$Income == 0] <- NA

#Medidas de centralización y dispersión

4
1.1 preparación de datos para el análisis

mean(data$Income)
mean(data$Income, na.rm = TRUE)

sd(data$Income)
sd(data$Income, na.rm = TRUE)

1.1.4. Reemplazo de NA con la media o extrcción aleatoria

Se debe poner atención si el dataframe contiene variables categoricas, numericas, o carac-


teres.
data <- read.csv("../data/tema1/missing-data.csv", na.strings = "")
data$Income.mean <- ifelse(is.na(data$Income),
mean(data$Income, na.rm = TRUE),
data$Income
)
#se crea una nueva conlumna con el valor del valor medio en vez de NA

#x es un vector de datos que puede contener NA


rand.impute <- function(x) {
# missing contiene un vector de valores T/F dependiendo del NA de x
missing <- is.na(x)
#n.missing contiene cuantos valores son NA dentro de x
n.missing <- sum(missing)
#x.obs son los valores conocidos que tienen dato diferente de NA en x
x.obs <- x[!missing]
c lo mismo que habÃa entrado por parámetro
#por defecto, devolverÃ
imputed <- x
#en los valores que faltaban, los reemplazamos por una muestra
#de los que si conocemos (MAS)
imputed[missing] <- sample(x.obs, n.missing, replace = TRUE)
return (imputed)
}

random.impute.data.frame <- function(dataframe, cols){


names <- names(dataframe)
for(col in cols){
name <- paste(names[col], "imputed", sep = ".")
dataframe[name] = rand.impute(dataframe[,col])
}
dataframe
}

5
adquisición y preparación de datos para el análisis

data <- read.csv("../data/tema1/missing-data.csv", na.strings = "")


data$Income[data$Income==0]<-NA
data <- random.impute.data.frame(data, c(1,2))

1.1.5. Evitando duplicaciones de datos - unique

family.salary = c(40000, 60000, 50000, 80000, 60000, 70000, 60000)


family.size = c(4, 3, 2, 2, 3, 4, 3)
family.car = c("Lujo", "Compacto", "Utilitario", "Lujo",
"Compacto", "Compacto", "Compacto")

family <- data.frame(family.salary, family.size, family.car)

family.unique <- unique(family)

duplicated(family)

family[duplicated(family),]

1.1.6. Reescalado lineal de datos

Aplica para variables numéricas


install.packages("scales")
library(scales)
students <- read.csv("../data/tema1/data-conversion.csv")

students$Income.rescaled <- rescale(students$Income)

(students$Income - min(students$Income))/
(max(students$Income) - min(students$Income))

rescale(students$Income, to = c(0, 100))

rescale.many <- function(dataframe, cols){


names <- names(dataframe)
for(col in cols){
name <- paste(names[col], "rescaled", sep = ".")
dataframe[name] <- rescale(dataframe[,col])
}
cat(paste("Hemos reescalado ", length(cols), " variable(s)"))
dataframe

6
1.1 preparación de datos para el análisis

students <- rescale.many(students, c(1,4))

1.1.7. Normalizado o estanarizado de datos de un dataframe

La función scale depende de la normalización de la media.

X−µ
Z= (1.1)
σ
housing <- read.csv("../data/tema1/BostonHousing.csv")

housing.z <- scale(housing, center = TRUE, scale = TRUE)


housing.mean <- scale(housing, center = TRUE, scale = FALSE)
housing.sd <- scale(housing, center = FALSE, scale = TRUE)
housing.none <- scale(housing, center = FALSE, scale = FALSE)

#sd = sqrt(sum(x^2)/(n-1))

scale.many = function(dataframe, cols){


names <- names(dataframe)
for(col in cols){
name <- paste(names[col], "z", sep = ".")
dataframe[name] <- scale(dataframe[,col])
}
cat(paste("Hemos normalizado ", length(cols), " variable(s)"))
dataframe
}

housing <- scale.many(housing, c(1, 3, 5:8))

1.1.8. Categorizando información numérica y creando variables


ficticias

Haciendo Break points, similar a un fuzzy


students <- read.csv("../data/tema1/data-conversion.csv")

bp <- c(-Inf, 10000, 31000, Inf)


names <- c("Low", "Average", "High")

7
adquisición y preparación de datos para el análisis

students$Income.cat <- cut(students$Income, breaks = bp, labels = names)


students$Income.cat2 <- cut(students$Income, breaks = bp)
students$Income.cat3 <- cut(students$Income,
breaks = 4,
labels = c("Level 1", "Level 2",
"Level 3", "Level 4")
)

#dummy variables
students <- read.csv("../data/tema1/data-conversion.csv")
install.packages("dummies")
library(dummies)

students.dummy <- dummy.data.frame(students, sep = ".")


names(students.dummy)

dummy(students$State, sep=".")

dummy.data.frame(students, names = c("State", "Gender"), sep = ".")

1.1.9. Formas de eliminar o completar la información que hace


falta

Se puede borrar las filas u observaciones, eliminar las variables, reemplazar por promedio.
library(Hmisc), library(mice), library(VIM).
housing.data <- read.csv("../data/tema1/housing-with-missing-value.csv",
header = TRUE, stringsAsFactors = FALSE)

summary(housing.data)

##ELiminar todas las observaciones que contengan algún NA


housing.data.1 <- na.omit(housing.data)
summary(housing.data.1)

##Eliminar las NAs de ciertas columnas


drop_na <- c("rad")
housing.data.2 <- housing.data[
complete.cases(housing.data[,!(names(housing.data))%in% drop_na]),]

8
1.1 preparación de datos para el análisis

summary(housing.data.2)

##Eliminar toda una columna


housing.data$rad <- NULL
summary(housing.data)

drops <- c("rad", "ptratio")


housing.data.3 <- housing.data[,!(names(housing.data) %in% drops)]
summary(housing.data.3)

Son paquetes muy útiles!!!!

library(Hmisc), library(mice), library(VIM).

install.packages("Hmisc")
library(Hmisc)

housing.data.copy1 <- housing.data


housing.data.copy1$ptratio <- impute(housing.data.copy1$ptratio, mean)
housing.data.copy1$rad <- impute(housing.data.copy1$rad, mean)
summary(housing.data.copy1)

housing.data.copy2 <- housing.data


housing.data.copy2$ptratio <- impute(housing.data.copy2$ptratio, median)
housing.data.copy2$rad <- impute(housing.data.copy2$rad, median)
summary(housing.data.copy2)

housing.data.copy3 <- housing.data


housing.data.copy3$ptratio <- impute(housing.data.copy3$ptratio, 18)
housing.data.copy3$rad <- impute(housing.data.copy3$rad, 7)
summary(housing.data.copy3)

install.packages("mice")
library(mice)
md.pattern(housing.data)
#para seguir la información que hace falta

install.packages("VIM")
library(VIM)

aggr(housing.data,
col= c(’green’, ’red’),

9
adquisición y preparación de datos para el análisis

numbers = TRUE,
sortVars = TRUE,
labels = names(housing.data),
cex.axis = 0.75,
gap = 1,
ylab = c("Histograma de NAs", "Patrón")
)

1.1.10. Combinando y separando datos

install.packages("tidyr")
library(tidyr)

crime.data <- read.csv("../data/tema1/USArrests.csv",


stringsAsFactors = FALSE)

View(crime.data)

crime.data <- cbind(state = rownames(crime.data), crime.data)

crime.data.1 <- gather(crime.data,


key = "crime_type",
value = "arrest_estimate",
Murder : UrbanPop)

crime.data.2 <- gather(crime.data,


key = "crime_type",
value = "arrest_estimate",
-state)

crimate.data.3 <- gather(crime.data,


key = "crime_type",
value = "arrest_estimate",
Murder, Assault)

crime.data.4 <- spread(crime.data.2,


key = "crime_type",
value = "arrest_estimate")

crime.data.5 <- unite(crime.data,


col = "Murder_Assault",

10
1.1 preparación de datos para el análisis

Murder, Assault,
sep = "_")

crime.data.6 <- separate(crime.data.5,


col= "Murder_Assault",
into = c("Murder", "Assault"),
sep = "_")

1.1.11. Uso de modelos predictivos para eliminar NAs

Paquete para crear un modelo de datos para obtener valores para los NAs
library(mice)

housing.data <- read.csv("../data/tema1/housing-with-missing-value.csv",


header = TRUE,
stringsAsFactors = FALSE)

columns <- c("ptratio", "rad")

imputed_data <- mice(housing.data[,names(housing.data) %in% columns],


m = 5,
maxit = 50,
method = "pmm",
seed = 2018)

## pmm - comparación predictiva de medias


## logreg - regresión logistica
## polyreg - regresión logística politómica
## polr - modelo de probabilidades proporcionales.

summary(imputed_data)

#:: sirve para indicar a R que función según el paquete


complete.data <- mice::complete(imputed_data)

housing.data$ptratio <- complete.data$ptratio


housing.data$rad <- complete.data$rad

anyNA(housing.data)

11
adquisición y preparación de datos para el análisis

#aregImpute es un función del paquete Mice

impute_arg <- aregImpute(~ptratio + rad, data = housing.data, n.impute = 5)

impute_arg

impute_arg$imputed$rad
#el R2 entre mayor (mas cerca de 1) mucho mejor el modelo de predicción

1.1.12. Detección de Outliers a través de box plots

En el centro se encuentra la mediana, en la parte superior se encuentra Q3 (75) y en la


parte inferior se encuentra Q1 (25). RI es a¿la distancia entre Q1 y Q3. El bigote infe-
rior se encuentra a max(min,Q1-1.5 RI). El bigote superior se encuentra entre min (max,
Q3+1.5RI)
ozone.data <- read.csv("../data/tema1/ozone.csv", stringsAsFactors = F)

boxplot(ozone.data$pressure_height,
main = "Pressure Height",
boxwex = 0.5)$out

summary(ozone.data$pressure_height)

boxplot(pressure_height ~ Month,
data = ozone.data,
main = "Presure Height per Month"
)

boxplot(ozone_reading ~Month,
data = ozone.data,
main = "Ozone reading per Month")$out
#Con el parámetro $out se puede observar los outliers
mtext("Hola")

impute_outliers <- function(x, removeNA = TRUE){


quantiles <- quantile(x, c(0.05, 0.95), na.rm = removeNA)
x[x<quantiles[1]] <- mean(x, na.rm = removeNA)
x[x>quantiles[2]] <- median(x, na.rm = removeNA)

12
1.2 análisis exploratorio de datos

x
}

imputed_data <- impute_outliers(ozone.data$pressure_height)

par(mfrow = c(1,2))

boxplot(ozone.data$pressure_height, main = "Presión con outliers")


boxplot(imputed_data, main = "Presión sin outliers")

replace_outliers <- function(x, removeNA = TRUE){


qrts <- quantile(x, probs = c(0.25, 0.75), na.rm = removeNA)
caps <- quantile(x, probs = c(.05, .95), na.rm = removeNA)
iqr <- qrts[2]-qrts[1]
h <- 1.5 * iqr
x[x<qrts[1]-h] <- caps[1]
x[x>qrts[2]+h] <- caps[2]
x
}

capped_pressure_height <- replace_outliers(ozone.data$pressure_height)


#para tener un gráfico al lado del otro
par(mfrow = c(1,2))
boxplot(ozone.data$pressure_height, main = "Presión con outliers")
boxplot(capped_pressure_height, main = "Presión sin outliers")

1.2. Análisis exploratorio de datos

1.2.1. Resumiendo nuestros datos summary str

data <- read.csv("../data/tema2/auto-mpg.csv",


header = TRUE,
stringsAsFactors = FALSE)

data$cylinders <- factor(data$cylinders,


levels = c(3,4,5,6,8),
labels = c("3cil", "4cil", "5cil", "6cil", "8cil"))

summary(data)

13
adquisición y preparación de datos para el análisis

str(data)

summary(data$cylinders)
summary(data$mpg)
str(data$cylinders)

1.2.2. Estadísticos y medidas básicas

Las medidas básicas de la estadística descriptiva

X = {x1 , x2 . . . xn } |X| = n (1.2)

Existen medidas de centralización (media aritmética, mediana, moda, percentiles). Medi-


das de dispersión (varianza, desviación típica, coeficiente de variación). Medidas de asi-
metría (asimetría de Fisher (asimetría negativa (la media está en la izquierda de la normal),
simétrica, asimétrica positiva), Curtois (leptocúrtica, mesocúrtica, platicúrtica))

install.packages(c("modeest", "raster", "moments"))


library(modeest) #moda
library(raster) #quantiles, cv coeficiente de variabilidad
library(moments) # asimetría, curtosis

X = data$mpg

#### Medidas de Centralización


mean(X) #sum(X)/length(X)
median(X)
mfv(X)
quantile(X)

#### Medidas de Dispersión


var(X)
sd(X)
cv(X) #sd(X)/mean(X)

#### Medidas de asimetría


skewness(X)
moments::kurtosis(X)

par(mfrow = c(1,1))

14
1.2 análisis exploratorio de datos

hist(X)

1.2.3. Subconjuntos

Se utiliza para sacar subconjuntos de dataframes, sacar un porcentaje para entrenar un


modelo y el otro porcentaje servirá para validar la predicción.

data <- read.csv("../data/tema2/auto-mpg.csv", stringsAsFactors = F)

#Index by position
data[1:5, 8:9]
data[1:5, c(8,9)]

#Index by Name
data[1:5, c("model_year", "car_name")]

# & : AND
# | : OR
# ! : NOT
# ==
##Min / Max de mpg
data[data$mpg == max(data$mpg) | data$mpg == min(data$mpg),]

#Filtros con condiciones


data[data$mpg>30 & data$cylinders == 6, c("car_name", "mpg")]

data[data$mpg>30 & data$cyl == 6, c("car_name", "mpg")]

#subset
subset(data, mpg>30 & cylinders == 6, select = c("car_name", "mpg"))

##FALLOS A TENER EN CUENTA


data[data$mpg>30]
# error porque le falta la coma después de la condición en filas

#Excluir columnas
data[1:5,c(-1,-9)]
data[1:5, -c(1,9)]

15
adquisición y preparación de datos para el análisis

#data[1:5, -c("No", "car_name")]


data[1:5, !names(data) %in% c("No", "car_name")]

data[data$mpg %in% c(15,20), c("car_name", "mpg")]

data[c(F,F,F,F,T), c(F, F, T)]

1.2.4. Divisiones con Split

Se utiliza para sacar subconjuntos de dataframes, sacar un porcentaje para entrenar un


modelo y el otro porcentaje servirá para validar la predicción.
#split / unsplit
data <- read.csv("../data/tema2/auto-mpg.csv", stringsAsFactors = F)

carslist <- split(data, data$cylinders)


carslist[1]
carslist[[1]]

str(carslist[1])

names(carslist[[1]])

1.2.5. Partición de data frames con variables numéricas

Se utiliza para sacar subconjuntos de dataframes, sacar un porcentaje para entrenar un


modelo y el otro porcentaje servirá para validar la predicción.
install.packages("caret")
library(caret)
data <- read.csv("../data/tema2/BostonHousing.csv")

training.ids <- createDataPartition(data$MEDV, p = 0.8, list = F) #entrenamiento d


data.training <- data[training.ids,]
data.validation <- data[-training.ids,]

training.ids.2 <- createDataPartition(data$MEDV, p = 0.7, list = F)


data.training.2 <- data[training.ids.2,]
temp <- data[-training.ids.2,]

16
1.2 análisis exploratorio de datos

validation.ids.2 <- createDataPartition(temp$MEDV, p = 0.5, list = F)


data.validation <- temp[validation.ids.2,]
data.testing <- temp[-validation.ids.2,]

1.2.6. Partición de data frames con variables categóricas

Se utiliza para sacar subconjuntos de dataframes, sacar un porcentaje para entrenar un


modelo y el otro porcentaje servirá para validar la predicción.

data2 <- read.csv("../data/tema2/boston-housing-classification.csv")


training.ids.3 <- createDataPartition(data2$MEDV_CAT, p = 0.7, list = F)
data.training.3 <- data2[training.ids.3,]
data.validation.3 <- data2[-training.ids.3,]

rda.cb.partition2 <- function(dataframe, target.index, prob){


library(caret)
training.ids <- createDataPartition(dataframe[,target.index], p=prob, list = FALS
list(train = dataframe[training.ids,], val = dataframe[-training.ids,])
}

rda.cb.partition3 <- function(dataframe, target.index,


prob.train, prob.val){
library(caret)
training.ids <- createDataPartition(dataframe[,target.index], p = prob.train, lis
train.data <- dataframe[training.ids,]
temp <- dataframe[-training.ids,]
validation.ids <- createDataPartition(temp[,target.index], p = prob.val, list = F
list(train = train.data, val = temp[validation.ids,], test = temp[-validation.ids
}

data1 <- rda.cb.partition2(data, 14, 0.8)


data2 <- rda.cb.partition3(data2, 14, 0.7, 0.5)

head(data1$val)
head(data2$val)

nrow(data)

sample1 <- sample(data$CRIM, 40, replace = F)

17
adquisición y preparación de datos para el análisis

1.2.7. Series temporales

Se utiliza para sacar subconjuntos de dataframes, sacar un porcentaje para entrenar un


modelo y el otro porcentaje servirá para validar la predicción.

AAPL = read.csv("../data/tema6/AAPL.csv", stringsAsFactors = F)


AMZN = read.csv("../data/tema6/AMZN.csv", stringsAsFactors = F)
FB = read.csv("../data/tema6/FB.csv", stringsAsFactors = F)
GOOG = read.csv("../data/tema6/GOOG.csv", stringsAsFactors = F)

str(AAPL)
#Hacemos el casting a fecha de las mismas...
AAPL$Date = as.Date(AAPL$Date)
AMZN$Date = as.Date(AMZN$Date)
FB$Date = as.Date(FB$Date)
GOOG$Date = as.Date(GOOG$Date)

library(ggplot2)

ggplot(AAPL, aes(Date, Close)) +


geom_line(aes(color="Apple")) +
geom_line(data=AMZN, aes(color = "Amazon"))+
geom_line(data=FB, aes(color="Facebook"))+
geom_line(data=GOOG, aes(color="Google"))+
labs(color="Legend")+
scale_color_manual("",
breaks = c("Apple", "Amazon", "Facebook", "Google" ),
values = c("gray", "yellow", "blue", "red"))+
ggtitle("Comparaciones de cierre de stocks")+
theme(plot.title = element_text(lineheight = 0.7, face = "bold"))

tail(GOOG)

##cargar datos en tiempo real


install.packages("quantmod")
library(quantmod)

getSymbols("AAPL")
barChart(AAPL)
chartSeries(AAPL, TA = "NULL")
candleChart(AAPL, up.col = "black",
dn.col="red", theme = "white")

head(AAPL)
chartSeries(AAPL[,4],TA = "addMACD()")

18
1.2 análisis exploratorio de datos

getSymbols("NFLX")
barChart(NFLX)
chartSeries(NFLX, TA = "NULL")
chartSeries(NFLX[,4],TA = "addMACD()")

1.2.8. Trabajo con fechas

#EPOCH : 1 de Enero de 1970

#HOY
Sys.Date()

#año dos dígitos


as.Date("1/1/80", format="%m/%d/%y")

#año cuatro dígitos


as.Date("1/1/1980", format="%m/%d/%Y")

#yyyy-mm-dd o yyyy/mm/dd
as.Date("2018-01-06")

nac <- as.Date("88/05/19")

##fecha -> numero


as.numeric(as.Date("1988/05/19"))
as.numeric(Sys.Date())

#Nombre de los meses


as.Date("Ene 6, 2018", format="%b %d, %Y")
as.Date("Enero 6, 18", format="%B %d, %y")

#Fechas desde días de EPOCH


dt <- 2018
class(dt) <- "Date"
dt

dt <- -2018
class(dt) <- "Date"
dt

#Fechas desde días de un punto dado

19
adquisición y preparación de datos para el análisis

dt <- as.Date(2018, origin = as.Date("1988-05-19"))


as.Date(-2018, origin = as.Date("1988-05-19"))

#Componentes de las fechas


dt
#Año en 4 dígitos
format(dt, "%Y")
#Año como número en lugar de String
as.numeric(format(dt, "%Y"))
#Año en 2 dígitos
format(dt, "%y")
#Año como número en lugar de String
as.numeric(format(dt, "%y"))
#Mes como String
format(dt, "%b")
format(dt, "%B")
months(dt)
weekdays(dt)
quarters(dt)
julian(dt)
julian(dt, origin = as.Date("1980/06/25"))

dt <- as.Date("1/1/2001", format = "%d/%m/%Y")


dt+100
dt-100
dt+31

dt2 <- as.Date("2001/01/02")


dt2-dt
dt-dt2
as.numeric(dt-dt)

dt<dt2
dt==dt2
dt2<dt

seq(dt, dt+365, "month")

seq(dt, as.Date("2001/01/10"), "day")

seq(dt, dt+365, "2 months")

seq(from = dt, by = "4 months", length.out = 6)[3]

seq(from = dt, by = "3 weeks", length.out = 6)[4]

20
1.2 análisis exploratorio de datos

1.2.9. Análisis preliminar de una Serie temporal

wmt <- read.csv("../data/tema6/WMT.csv", stringsAsFactors = F)


plot(wmt$Adj.Close, type = "l")

d <- diff(wmt$Adj.Close, lag = 2)


head(d)
plot(d, type="l")

hist(d, prob=T, ylim = c(0,0.8), breaks = 30, main = "Walmart Stocks", col = "green
lines(density(d), lwd=3)

wmt.m <- read.csv("../data/tema6/WMT-monthly.csv", stringsAsFactors = F)


wmt.m <- wmt.m[2:nrow(wmt.m),]
wmt.m$Date <- as.Date(wmt.m$Date)
wmt.m.ts <- ts(wmt.m$Adj.Close)

wmt.m.ts
d <- diff(as.numeric(wmt.m.ts))
d
wmt.m.return <- d / lag(as.numeric(wmt.m.ts), k = -1)
View(wmt.m.return)
hist(wmt.m.return, prob = T, col = "blue")

1.2.10. Análisis preliminar de una Serie temporal

s <- read.csv("../data/tema6/ts-example.csv")
head(s)

s.ts <- ts(s)


class(s.ts)
head(s.ts)
plot(s.ts)

s.ts.a <- ts(s, start = 2001)


s.ts.a
plot(s.ts.a)

s.ts.m <- ts(s, start = c(2001,1), frequency = 12)


s.ts.m

21
adquisición y preparación de datos para el análisis

plot(s.ts.m)

s.ts.q <- ts(s, start = 2001, frequency = 4)


s.ts.q
plot(s.ts.q)

start(s.ts.m)
end(s.ts.m)
frequency(s.ts.m)

start(s.ts.q)
end(s.ts.q)
frequency(s.ts.q)

prices <- read.csv("../data/tema6/prices.csv")


head(prices)

prices.ts <- ts(prices, start = c(1980,1), frequency = 12)


prices.ts
plot(prices.ts)

plot(prices.ts, plot.type = "single", col = 1:2)


legend("topleft", colnames(prices.ts), col = 1:2, lty = 1)

#log(a*b) = log (a) + log(b)

#Descomposición de una serie temporal

#stl
#Seasonal Decomposition of Time Series by Loess
flour.l <- log(prices.ts[,1])
flour.stl<- stl(flour.l, s.window = "period")
plot(flour.stl)
flour.stl

gas.l <- log(prices.ts[,2])


gas.stl <- stl(gas.l, s.window = "period")
plot(gas.stl)

#decompose
#Classical Seasonal Decomposition by Moving Averages

22
1.2 análisis exploratorio de datos

flour.dec <- decompose(flour.l)


plot(flour.dec)

gas.dec <- decompose(gas.l)


plot(gas.dec)

gas.season.adjusted <- prices.ts[,2] - (gas.dec$seasonal)


plot(gas.season.adjusted)

n <- 12
gas.f.1 <- filter(prices.ts[,2], filter = rep(1/n, n), sides = 2)
gas.f.2 <- filter(prices.ts[,2], filter = rep(1/n,n), sides = 1)
plot(prices.ts[,2])
lines(gas.f.1, col = "blue", lwd = 3)
lines(gas.f.2, col = "red", lwd = 3)

1.2.11. Descomposición de una Serie temporal

inf <- read.csv("../data/tema6/INFY-monthly.csv")


tail(inf)

inf.ts <- ts(inf$Adj.Close, start=c(1999,3), frequency = 12)


inf.ts
plot(inf.ts)
inf.hw <- HoltWinters(inf.ts)

plot(inf.hw, col = "blue", col.predicted = "red")

inf.hw$SSE
inf.hw$alpha
inf.hw$beta
inf.hw$gamma

head(inf.hw$fitted)

install.packages("forecast")
library(forecast)

infy.fore <- forecast(inf.hw, h=24)


plot(infy.fore)

23
adquisición y preparación de datos para el análisis

infy.fore$lower
infy.fore$upper

1.2.12. ARIMA

#modelo autorregresivo integrado de media móvil


inf <- read.csv("../data/tema6/INFY-monthly.csv")
inf.ts <- ts(inf$Adj.Close, start = c(1999,3), frequency = 12)
inf.arima <- auto.arima(inf.ts)
summary(inf.arima)

inf.fore <- forecast(inf.arima, h = 12)


plot(inf.fore, col = "red",
fcol = "green")

1.2.13. Plot

auto <- read.csv("../data/tema2/auto-mpg.csv")


auto$cylinders <- factor(auto$cylinders,
levels = c(3,4,5,6,8),
labels = c("3cil", "4cil", "5cil", "6cil", "8cil"))
attach(auto)
head(cylinders)

#Histograma de frecuencias
hist(acceleration,
col = rainbow(12),
xlab = "Aceleración",
ylab = "Frecuencias",
main = "Histograma de las aceleraciones",
breaks = 12)

hist(mpg, breaks = 16, prob = T)


lines(density(mpg))

#Boxplots
boxplot(mpg, xlab = "Millas por Galeón")
boxplot(mpg ~ model_year, xlab = "Millas por Galeón (por año)")
boxplot(mpg ~ cylinders, xlab = "Consumo por Número de cilindros")
boxplot(auto)

#Scatterplot

24
1.2 análisis exploratorio de datos

plot(mpg ~ horsepower, type = "n")


linearmodel <- lm(mpg ~ horsepower)
abline(linearmodel)
#Agregar colores para cada cilindrada
with(subset(auto, cylinders=="8cil"),
points(horsepower, mpg, col = "red"))
with(subset(auto, cylinders == "6cil"),
points(horsepower, mpg, col = "yellow"))
with(subset(auto, cylinders == "5cil"),
points(horsepower, mpg, col = "green"))
with(subset(auto, cylinders == "4cil"),
points(horsepower, mpg, col = "blue"))
with(subset(auto, cylinders == "3cil"),
points(horsepower, mpg))
#Matriz de Scatterplots
pairs(~mpg+displacement+horsepower+weight)

#Combinacion de plots con par


old.par <- par()
old.par
par(mfrow = c(1,2))

with(auto, {
plot(mpg ~ weight, main = "Peso vs Consumo")
plot(mpg ~ acceleration, main = "Aceleración vs Consumo")
}
)

par(old.par)

#Laticce
auto <- read.csv("../data/tema2/auto-mpg.csv", stringsAsFactors = F)
auto$cylinders = factor(auto$cylinders,
levels = c(3,4,5,6,8),
labels = c("3C", "4C", "5C", "6C", "8C"))

bwplot(~ auto$mpg | auto$cylinders,


main = "MPG según cilindrada",
xlab = "Millas por Galeón",
layout = c(2,3), aspect = 1)

xyplot(mpg~weight | cylinders, data = auto,


main = "Peso vs Consumo vs Cilindrada",

25
adquisición y preparación de datos para el análisis

xlab = "Peso (kg)", ylab = "Consumo (mpg)")

## bwplot, xyplot, densityplot, splom

trellis.par.set(theme = col.whitebg())

1.2.14. Comparación de datos

data <- read.csv("../data/tema2/daily-bike-rentals.csv")

data$season <- factor(data$season, levels = c(1,2,3,4),


labels = c("Invierno", "Primavera", "Verano", "Otoñ"))
data$workingday <- factor(data$workingday, levels = c(0,1),
labels = c("Festivo", "De trabajo"))
data$weathersit <- factor(data$weathersit, levels = c(1,2,3),
labels = c("Despejado", "Nublado", "Lluvia/Nieve ligera"
data$dteday <- as.Date(data$dteday, format = "%Y-%m-%d")
attach(data)

par(mfrow=c(2,2))
winter <- subset(data, season == "Invierno")$cnt
spring <- subset(data, season == "Primavera")$cnt
summer <- subset(data, season == "Verano")$cnt
fall <- subset(data, season == "Otoño")$cnt

hist(winter, prob = TRUE, xlab = "Alquiler diario en invierno", main ="")


lines(density(winter))
abline(v = mean(winter), col = "red")
abline(v=median(winter), col = "blue")

hist(spring, prob = TRUE, xlab = "Alquiler diario en primavera", main = "")


lines(density(spring))
abline(v = mean(spring), col="red")
abline(v=median(spring), col="blue")

hist(summer, prob = TRUE, xlab = "Alquiler diario en verano", main = "")


lines(density(summer))
abline(v = mean(summer), col="red")
abline(v=median(summer), col="blue")

hist(fall, prob = TRUE, xlab = "Alquiler diario en otoño", main = "")

26
1.2 análisis exploratorio de datos

lines(density(fall))
abline(v = mean(fall), col="red")
abline(v=median(fall), col="blue")

install.packages("beanplot")
library(beanplot)

par(mfrow=c(1,1))
beanplot(data$cnt ~ data$season, col = c("blue", "red", "yellow"))

#causalidad
library(lattice)
bwplot(cnt ~ weathersit, data = data,
layout = c(1,1),
xlab = "Pronóstico del tiempo",
ylab = "Frecuencias",
panel = function(x,y,...){
panel.bwplot(x,y,...)
panel.stripplot(x,y,jitter.data = TRUE,...)
},
par.settings = list(box.rectangle = list(fill = c(’red’, ’yellow’, ’green’))

1.2.15. Comparación de datos

s <- seq(0.01, 0.99, 0.01)


s
qn <- qnorm(s)
qn
df <- data.frame(p = s, q = qn)

sample <- rnorm(200)


sample
quantile(sample, probs = s)

#qqnorm
trees
par(mfrow=c(1,1))
qqnorm(trees$Height)

27
adquisición y preparación de datos para el análisis

qqnorm(randu$x)

#qqplot
randu
n <- length(randu$x)
n
y <- qunif(ppoints(n))
y
qqplot(y, randu$x)

chi3 <- qchisq(ppoints(30), df = 3)


n30 <- qnorm(ppoints(30))
qqplot(n30, chi3)

qqplot(chi3, chi3)

cauchy <- qcauchy(ppoints(30))


qqplot(n30, cauchy)

par(mfrow=c(1,2))
x <- seq(-3, 3, 0.01)
plot(x, dnorm(x))
plot(x, pnorm(x))

plot(x, dchisq(x, df=3))


plot(x, pchisq(x, df=3))

plot(x, dcauchy(x))
plot(x, pcauchy(x))

1.2.16. Matrices de confusión/ Fuzzy

cp <- read.csv("../data/tema3/college-perf.csv")

cp$Perf <- ordered(cp$Perf,


levels = c("Low", "Medium", "High"))
cp$Pred <- ordered(cp$Pred,
levels = c("Low", "Medium", "High"))

table <- table(cp$Perf, cp$Pred,

28
1.2 análisis exploratorio de datos

dnn = c("Actual", "Predecido"))


table

prop.table(table)

round(prop.table(table, 1)*100, 2)

round(prop.table(table, 2)*100, 2)

barplot(table, legend = TRUE,


xlab = "Nota predecida por el modelo")

mosaicplot(table, main = "Eficiencia del modelo")

summary(table)

1.2.17. Diagramas ROC

install.packages("ROCR")
library(ROCR)

data1 <- read.csv("../data/tema3/roc-example-1.csv")


data2 <- read.csv("../data/tema3/roc-example-2.csv")
#0 -> fallo
c
#1 -> Ã xito
pred1 <- prediction(data1$prob, data1$class)
perf1 <- performance(pred1, "tpr", "fpr")
plot(perf1)
lines(par()$usr[1:2], par()$usr[3:4])

prob.cuts.1 <- data.frame(cut = perf1@alpha.values[[1]],


fpr = perf1@x.values[[1]],
tpr = perf1@y.values[[1]])
head(prob.cuts.1)

tail(prob.cuts.1)

prob.cuts.1[prob.cuts.1$tpr>=0.8,]

pred2 <- prediction(data2$prob, data2$class, label.ordering = c("non-buyer", "buyer


perf2 <- performance(pred2, "tpr", "fpr")

29
adquisición y preparación de datos para el análisis

plot(perf2)
lines(par()$usr[1:2], par()$usr[3:4])

1.2.18. Árboles de clasificación

install.packages("ROCR")
library(ROCR)

data1 <- read.csv("../data/tema3/roc-example-1.csv")


data2 <- read.csv("../data/tema3/roc-example-2.csv")
#0 -> fallo
c
#1 -> Ã xito
pred1 <- prediction(data1$prob, data1$class)
perf1 <- performance(pred1, "tpr", "fpr")
plot(perf1)
lines(par()$usr[1:2], par()$usr[3:4])

prob.cuts.1 <- data.frame(cut = perf1@alpha.values[[1]],


fpr = perf1@x.values[[1]],
tpr = perf1@y.values[[1]])
head(prob.cuts.1)

tail(prob.cuts.1)

prob.cuts.1[prob.cuts.1$tpr>=0.8,]

pred2 <- prediction(data2$prob, data2$class, label.ordering = c("non-buyer", "buye


perf2 <- performance(pred2, "tpr", "fpr")
plot(perf2)
lines(par()$usr[1:2], par()$usr[3:4])

1.2.19. Máquinas de soporte vectorial

install.packages("e1071")
library(caret)
library(e1071)

banknote <- read.csv("../data/tema3/banknote-authentication.csv")


banknote$class = factor(banknote$class)

30
1.2 análisis exploratorio de datos

set.seed(2018)
t.ids <- createDataPartition(banknote$class, p = 0.7, list = F)
mod <- svm(class ~ ., data = banknote[t.ids, ],
class.weights = c("0"=0.3, "1"=0.7),
cost=1000)
table(banknote[t.ids,"class"], fitted(mod), dnn = c("Actual", "Predicho"))
pred <- predict(mod, banknote[-t.ids,])
table(banknote[-t.ids, "class"], pred, dnn = c("Actual", "Predicho"))

plot(mod, data = banknote[t.ids,], skew ~ variance)


plot(mod, data = banknote[-t.ids,], skew ~ variance)

tuned <- tune.svm(class ~ ., data = banknote[t.ids,],


gamma = 10^(-6:-1), cost = 10^(1:2))
summary(tuned)

31
adquisición y preparación de datos para el análisis

Referencias

32

S-ar putea să vă placă și