forked from datalatam/de_excel_a_R
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Codigo_Taller.R
372 lines (251 loc) · 11.4 KB
/
Codigo_Taller.R
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
#-------------------------------------------------------------------------------
# DEMO CON DATOS DE VENTAS ONLINE
#-------------------------------------------------------------------------------
#-----------1. Inicio de Sesión ------------------------------------------------
# En cada sesión debemos cargar los paquetes cuyas funciones vayamos a utilizar
library(dplyr)
library(readr)
library(stringr)
library(readxl)
library(lubridate)
#-----------2. Operaciones Básicas en R ----------------------------------------
#Operaciones matemáticas básicas
1 + 5
12 * 3
16 / 2
13 - 8
#Operaciones booleanas (comparaciones)
13 == 14
154 > 12
56 != 56
56 == 56
"a" == "b"
"a" != "b"
!(56 == 56)
12 > 24 & 13 < 30
12 > 24 | 13 < 30
#Hasta ahora solo hemos ejecutado comandos, sin guardar los resultados
#Podemos almacenar los resultados asignándolos a una variable con "<-"
#El atajo en R Studio para el comando de asignación es Alt + -
a <- 14
b <- 10 - 2
a - b
c <- a * 3
d <- 12.58
e <- TRUE
f <- "gato"
#Hay 3 tipos de datos principales en R: numeric, character y logical
class(a)
class(b)
class(c)
class(d)
class(e)
class(f)
#Vamos a guardar nuestro el código que hemos escrito hasta ahora... File > Save
#-----------3. Operaciones con Vectores ----------------------------------------
#Los vectores son sets ordenados de elementos del mismo tipo
#Para crearlos "envolvemos" los elementos con una "c" seguida de parentesis
v1 <- c(9, 15, 3, 16, 7)
v2 <- c("Juan", "Maria", "Luisa")
v3 <- c(F, T, F, F, T)
#Al realizar operaciones con vectores, el resultado es otro vector
v1 * 2
v1 > 10
v2 == "Maria"
#También podemos aplicar funciones agregadas a los vectores
#tales como max, min, sum y mean (promedio)
max(v1)
min(v1)
sum(v1)
mean(v1)
#Al aplicar operaciones matemáticas sobre vectores booleanos,
#R interpreta TRUE como 1 y FALSE como 0
#Por los que sum() nos devuelve el conteo de TRUEs y mean() el porcentaje
#Esta particularidad nos resultará muy útil más adelante
sum(v3)
mean(v3)
sum(v1 < 5)
mean(v1 < 5)
#-----------3. Importar datos desde Excel y CSV --------------------------------
#Vamos a almacenar cada table en una variable distinta
ordenes <- read_xlsx("ventas_online.xlsx", sheet = "ordenes")
estados_br <- read_xlsx("ventas_online.xlsx", sheet = "estados_brasil")
#leer desde un csv
productos <- read_csv("ordenes_productos.csv")
#glimpse() nos da una vista general del contenido del set de datos
glimpse(ordenes)
#View() nos permite visualizar los datos de manera tabular
View(ordenes)
#-----------4. Seleccionar columnas --------------------------------------------
#La función select() de dplyr nos permite elegir qué columnas mantener
#Todas las funciones de dplyr toman por primer argumento un set de datos
#El resultado siempre es otro set de datos
#nombrar todas las columnas
select(ordenes, id_orden, status_orden, fecha_entrega_real, precio_orden)
#utilizar un rango
select(ordenes, id_orden:fecha_aprobacion, precio_orden)
#eliminar una sola columna
select(ordenes, -status_orden)
#eliminar un ragngo de columnas
select(ordenes, -status_orden:-ciudad_cliente)
#seleccionar con base en el nombre de las columnas
select(ordenes, starts_with("fecha"))
select(ordenes, ends_with("cliente"))
select(ordenes, contains("entrega"))
#al aplicar la funcion no estamos modificando el set de datos original
#si deseamos almacenar el resultado podemos asignarlo a una variable
ordenes_2 <- select(ordenes, -id_cliente:-productos, -starts_with("pago"))
glimpse(ordenes_2)
#EJERCICIO:
#Del dataset "ordenes" seleccionar la columna id_orden
#y todas aquellas que empiecen por "pago"
#-----------5. Filtrar con base en una o más condiciones------------------------
#filter() nos permite filtrar con base en una o más condiciones
#filtrar con base en una condición
filter(ordenes_2, status_orden == "entregada")
filter(ordenes_2, status_orden %in% c("entregada", "procesando"))
#filtrar con base en dos o más condiciones
filter(ordenes_2, status_orden == "entregada", fecha_aprobacion >= '2018-01-01')
#EJERCICIO:
#Del dataset "ordenes_2", filtrar las ordenes en las que:
#valor_total sea menor que 100 y el status sea "cancelada"
#-----------6. Ordenar con base en una variable---------------------------------
#arrange() nos permite ordenar los datos con base en una o más variables
#ordenar de menor a mayor con base en valor_total
arrange(ordenes_2, valor_total)
#ordenar de mayor a menor con base en valor_total
arrange(ordenes_2, desc(valor_total))
#ordenar con base en fecha de aprobacion y valor total
arrange(ordenes_2, fecha_aprobacion, valor_total)
#EJERCICIO:
#Ordenar el dataset "ordenes_2" con base en costo_envio (mayor a menor)
#Almacenar el resultado en una nueva variable y mostrarlo con View()
#-----------7. Crer nuevas columnas con base en las existentes------------------
#mutate() nos permite crear nuevas variables con fórmulas
mutate(ordenes_2, porcentaje_envio = costo_envio/valor_total)
#podemos crear dos o mas columnas en un mismo comando
mutate(ordenes_2, prop_envio = costo_envio/valor_total,
porcentaje_envio = prop_envio * 100)
#if_else() nos permite crear dos clasificaciones con base en una condicion
mutate(ordenes_2, clase = if_else(precio_orden >= 100, "A", "B"))
#case_when() nos permite crear dos o más clasificaciones
mutate(ordenes_2, clase = case_when(precio_orden <= 100 ~ "C",
precio_orden <= 200 ~ "B",
TRUE ~ "A"))
#EJERCICIO:
#Del dataset "ordenes_2", crear una nueva columna cuyo valor sea el resultado de
#sumar precio_orden y costo_envio
#-----------8. Encadenar operaciones con "pipes" (%>%)--------------------------
#¿Qué tal si deseamos realizar 2 o más operaciones sobre un set de datos,
#una después de la otra, y solo nos interesa el resultado final?
#El pipe (%>%) nos permite tomar el resultado de una operación
#y utilizarlo como el primer argumento de la siguiente operación
#El atajo para el pipe en R Studio es Ctrl + Shift + M
#Empecemos con un ejemplo sencillo:
#La funcion round() tiene dos argumentos: el primero es el numero que deseamos
#redondear y el segundo es la cantidad de decimales
round(7.3468, 2)
#el pipe nos permite alimentar el primer argumento a una funcion "desde afuera"
7.3468 %>% round(2)
#Ahora con funciones de dplyr
ordenes_2 %>%
mutate(prop_envio = costo_envio/valor_total) %>% #primero creamos prop_envio
filter(prop_envio >= 0.4) %>% #luego filtramos con base en la nueva variable
arrange(prop_envio) #finalmente ordenamos con base en esta variable
#Por que utilizar pipes?
#1) es más eficiente escribir código (menos lineas)
#2) mayor legibilidad, orden y limpieza en el código
#3) es mas fácil eliminar o agregar pasos intermedios
#4) están diseñados para trabajar con los verbos de dplyr
#EJERCICIO:
#Utilizando el dataset "ordenes":
#1) Filtrar las ordenes canceladas (status_orden)
#2) Seleccionar las columnas id_orden y precio_orden
#3) Ordenar con base en precio_orden (descendente)
#-----------9. Exportar datos a un csv------------------------------------------
#Para exportar un set de datos, podemos utilizar write_csv(), la cual genera un
#archivo csv en el folder de nuestro proyecto
ordenes_2 %>% write_csv("ordenes_2.csv")
#-----------10. Pivotear data con group_by() y summarise()----------------------
#Hasta ahora el resultado de nuestras operaciones ha mantenido la misma
#granularidad del dataset original (cada fila representa una orden)
#group_by() y summarise() nos permiten agrupar los datos con base en una o más
#variables categóricas y hacer cálculos agregados como totales y promedios
#empezaremos por filtrar ordenes entregadas
ordenes_entregadas <- ordenes %>%
filter(status_orden == "entregada")
#Podemos calcular una sola métrica agregada
ordenes_entregadas %>%
group_by(estado_cliente) %>%
summarise(conteo_ordenes = n())
#O podemos calcular varias
ordenes_entregadas %>%
group_by(estado_cliente) %>%
summarise(conteo_ordenes = n(),
conteo_clientes = n_distinct(id_cliente),
suma_ordenes = sum(valor_total),
promedio_ordenes = mean(precio_orden),
orden_mayor_a_100_total = sum(valor_total >= 100),
orden_mayor_a_100_perc = mean(valor_total >= 100))
#Tambien podemos combinarlo con otras de las funciones de dplyr
ordenes_entregadas %>%
group_by(estado_cliente) %>%
summarise(conteo_ordenes = n()) %>%
filter(conteo_ordenes >= 1000) %>%
arrange(desc(conteo_ordenes))
#EJERCICIO:
#Utilizando el dataset "ordenes":
#1) Agrupar con base en status_orden
#2) Calcular la cantidad de ordenes de cada status
#-----------11. Vlookups con left_join()----------------------------------------
#En ocasiones tenemos informacion en 2 o mas tablas, y nos interesa unirlas con
#base en alguna llave para enriquecer nuestra data original con nuevas variables
#Esto es algo que hariamos hariamos en Excel con vlookup
#La funcion equivalente en R es left_join()
#En este ejemplo importaremos informacion de la tabla estados_br
#A diferencia de vlookup, left_join() trae todas las columnas
ordenes %>%
select(id_orden, estado_cliente) %>%
left_join(estados_br, by = c("estado_cliente" = "codigo_estado"))
#EJERCICIO:
#Unir el dataset "productos" con el dataset "ordenes" con base en la
#llave "id_orden", mantener las columnas desde "id_orden" hasta "costo_envio" y
#la columna "status_orden"
#-----------11. Funciones con texto---------------------------------------------
#El paquete stringr tiene funciones para trabajar con texto
#Hoy veremos dos de las funciones mas utiles: str_replace_all() y str_detect()
#str_detect() detecta si un texto existe dentro otro texto
str_detect("Hola mundo", "mundo")
str_detect("Hola mundo", "o")
str_detect("Hola mundo", "x")
#str_replace_all() reemplaza todas las ocurrencias de un texto por otro texto de
#nuestra escogencia
str_replace_all("Hola mundo", "mundo", "gente")
str_replace_all("Hola mundo", "o", "i")
#Ahora vamos a combinarlas con funciones de dplyr
#Empezaremos por ispeccionar el dataset ordenes_productos
productos %>% glimpse()
#Crear dataset de ordenes por categoria
ordenes_por_categoria <- productos %>%
group_by(categoria) %>%
summarise(conteo_ordenes = n()) %>%
arrange(categoria)
#Inspeccionar el set de datos que acabamos de crear
ordenes_por_categoria %>% View()
#Que tal si quisieramos reemplazar los guines bajos por espacios?
#Podemos utilizar la función str_replace_all()
ordenes_por_categoria %>%
mutate(categoria_2 = str_replace_all(categoria, "_", " "))
#Vamos a mantener unicamente las categorias que tienen "fashion" en su nombre
ordenes_por_categoria %>%
filter(str_detect(categoria, "fashion"))
#Tambien podemos crear una nueva clasificacion agrupando ciertas variables
ordenes_por_categoria %>%
mutate(cat_2 = if_else(str_detect(categoria, "fashion"),
"fashion items",
categoria)) %>%
View()
#EJERCICIO:
#Utilizando el dataset "ordenes_por_categoria":
#1) Filtrar las categorias que tienen "_and_" en su nombre
#2) Reemplazar "_and_" por "&" en la columna categoria