PROYECTO 1

EDA DataViz, Proyecto 1.

Andrés España, Omar Medina

El mercado de criptomonedas, liderado por Bitcoin, se ha caracterizado por su alta volatilidad y su capacidad para capturar la atención de inversores y analistas en todo el mundo. En este contexto, el análisis de datos históricos de Bitcoin se convierte en una herramienta fundamental para comprender su comportamiento, identificar patrones y tomar decisiones informadas. Este proyecto tiene como objetivo realizar un análisis exploratorio de datos (EDA) sobre los precios y el volumen de transacciones de Bitcoin, utilizando datos descargados desde Yahoo Finance.

library(quantmod)
Warning: package 'quantmod' was built under R version 4.4.3
Cargando paquete requerido: xts
Warning: package 'xts' was built under R version 4.4.3
Cargando paquete requerido: zoo

Adjuntando el paquete: 'zoo'
The following objects are masked from 'package:base':

    as.Date, as.Date.numeric
Cargando paquete requerido: TTR
Warning: package 'TTR' was built under R version 4.4.3
Registered S3 method overwritten by 'quantmod':
  method            from
  as.zoo.data.frame zoo 
library(astsa)
library(fpp2)
Warning: package 'fpp2' was built under R version 4.4.3
── Attaching packages ────────────────────────────────────────────── fpp2 2.5 ──
✔ ggplot2   3.5.1      ✔ fma       2.5   
✔ forecast  8.23.0     ✔ expsmooth 2.3   
Warning: package 'forecast' was built under R version 4.4.3
Warning: package 'fma' was built under R version 4.4.3
Warning: package 'expsmooth' was built under R version 4.4.3

Adjuntando el paquete: 'fpp2'
The following object is masked from 'package:astsa':

    oil
# Descargar datos de Bitcoin desde Yahoo Finance
getSymbols("BTC-USD", from = "2023-12-01", src = "yahoo")
Warning: BTC-USD contains missing values. Some functions will not work if
objects contain missing values in the middle of the series. Consider using
na.omit(), na.approx(), na.fill(), etc to remove or replace them.
[1] "BTC-USD"
# Convertir a data.frame y agregar el índice como una columna
df <- data.frame(Fecha = index(`BTC-USD`), coredata(`BTC-USD`))

# Ver los primeros registros para confirmar
head(df)
       Fecha BTC.USD.Open BTC.USD.High BTC.USD.Low BTC.USD.Close BTC.USD.Volume
1 2023-12-01     37718.01     38954.11    37629.36      38688.75    23512784002
2 2023-12-02     38689.28     39678.94    38652.59      39476.33    15534035612
3 2023-12-03     39472.21     40135.61    39298.16      39978.39    15769696322
4 2023-12-04     39978.63     42371.75    39978.63      41980.10    39856129827
5 2023-12-05     41986.27     44408.66    41421.15      44080.65    36312154535
6 2023-12-06     44080.02     44265.77    43478.08      43746.45    29909761586
  BTC.USD.Adjusted
1         38688.75
2         39476.33
3         39978.39
4         41980.10
5         44080.65
6         43746.45
summary(df)
     Fecha             BTC.USD.Open     BTC.USD.High     BTC.USD.Low    
 Min.   :2023-12-01   Min.   : 37718   Min.   : 38954   Min.   : 37629  
 1st Qu.:2024-03-25   1st Qu.: 58243   1st Qu.: 59718   1st Qu.: 57187  
 Median :2024-07-19   Median : 65274   Median : 66590   Median : 63830  
 Mean   :2024-07-19   Mean   : 68640   Mean   : 70037   Mean   : 67238  
 3rd Qu.:2024-11-11   3rd Qu.: 79547   3rd Qu.: 84146   3rd Qu.: 77828  
 Max.   :2025-03-07   Max.   :106147   Max.   :109115   Max.   :105292  
                      NA's   :1        NA's   :1        NA's   :1       
 BTC.USD.Close    BTC.USD.Volume      BTC.USD.Adjusted
 Min.   : 38689   Min.   :9.344e+09   Min.   : 38689  
 1st Qu.: 58349   1st Qu.:2.312e+10   1st Qu.: 58349  
 Median : 65336   Median :3.245e+10   Median : 65336  
 Mean   : 68753   Mean   :3.826e+10   Mean   : 68753  
 3rd Qu.: 83379   3rd Qu.:4.563e+10   3rd Qu.: 83379  
 Max.   :106146   Max.   :1.492e+11   Max.   :106146  
 NA's   :1        NA's   :1           NA's   :1       
  • Precios de Apertura, Máximo, Mínimo y Cierre:

    • El precio mínimo de apertura registrado es 37,718 USD, mientras que el máximo alcanza 106,147 USD.

    • El precio máximo en algún punto llegó a 109,115 USD, lo que sugiere una fuerte volatilidad.

    • El precio de cierre sigue un comportamiento similar, con un mínimo de 38,689 USD y un máximo de 106,146 USD.

  • Tendencias centrales:

    • La mediana del precio de apertura es 65,316 USD, lo que indica que la mitad de los datos están por encima y la otra mitad por debajo de este valor.

    • El promedio del precio de apertura es 68,686 USD, lo que sugiere una ligera tendencia alcista.

Realizamos un cambio en los nombres de las variables.

library(dplyr)

######################### Warning from 'xts' package ##########################
#                                                                             #
# The dplyr lag() function breaks how base R's lag() function is supposed to  #
# work, which breaks lag(my_xts). Calls to lag(my_xts) that you type or       #
# source() into this session won't work correctly.                            #
#                                                                             #
# Use stats::lag() to make sure you're not using dplyr::lag(), or you can add #
# conflictRules('dplyr', exclude = 'lag') to your .Rprofile to stop           #
# dplyr from breaking base R's lag() function.                                #
#                                                                             #
# Code in packages is not affected. It's protected by R's namespace mechanism #
# Set `options(xts.warn_dplyr_breaks_lag = FALSE)` to suppress this warning.  #
#                                                                             #
###############################################################################

Adjuntando el paquete: 'dplyr'
The following objects are masked from 'package:xts':

    first, last
The following objects are masked from 'package:stats':

    filter, lag
The following objects are masked from 'package:base':

    intersect, setdiff, setequal, union
viejos<- df%>% names
viejos
[1] "Fecha"            "BTC.USD.Open"     "BTC.USD.High"     "BTC.USD.Low"     
[5] "BTC.USD.Close"    "BTC.USD.Volume"   "BTC.USD.Adjusted"
require(dplyr)
require(magrittr) 
Cargando paquete requerido: magrittr
library(magrittr)
df <- as.data.frame(df)

df %<>% rename(
  Fecha=viejos[1],  
 Apertura=viejos[2],
 Maximo=viejos[3],
 Minimo=viejos[4],
 Cierre=viejos[5],
 Volumen=viejos[6],
 Cierre_Ajustado=viejos[7])

df%>% names
[1] "Fecha"           "Apertura"        "Maximo"          "Minimo"         
[5] "Cierre"          "Volumen"         "Cierre_Ajustado"

Definición de Variables

  • Fecha: Fecha correspondiente a cada registro del precio de Bitcoin.

  • Apertura (BTC-USD.Open): Precio de apertura del Bitcoin en dólares (USD) en la fecha correspondiente.

  • Máximo (BTC-USD.High): Precio máximo alcanzado por el Bitcoin durante el día.

  • Mínimo (BTC-USD.Low): Precio mínimo registrado del Bitcoin en el día.

  • Cierre (BTC-USD.Close): Precio de cierre del Bitcoin al final del día.

  • Volumen (BTC-USD.Volume): Volumen total de transacciones de Bitcoin en el día.

  • Cierre Ajustado (BTC-USD.Adjusted): Precio ajustado de cierre del Bitcoin, considerando eventos como splits o dividendos (si aplicara).

Tratamiento de Datos Faltantes, NA.

# Revisamos la cantidad de datos faltantes por columna
colSums(is.na(df))
          Fecha        Apertura          Maximo          Minimo          Cierre 
              0               1               1               1               1 
        Volumen Cierre_Ajustado 
              1               1 
# Visualización de datos faltantes
library(naniar)
missing(df)
[1] FALSE
vis_miss(df) +
  labs(title = "Mapa de Valores Faltantes en Bitcoin") +
  theme_light() +
  theme(plot.title = element_text(face = "bold", hjust = 0.5),
        axis.text.x = element_text(angle = 45, vjust = 1))

Como la cantidad de datos faltantes es mínima, Consideramos eliminar las filas que contienen datos faltantes.

df <- na.omit(df)
# Confirmamos haber quedado sin valores faltantes.
colSums(is.na(df))
          Fecha        Apertura          Maximo          Minimo          Cierre 
              0               0               0               0               0 
        Volumen Cierre_Ajustado 
              0               0 

Un Primer vistazo a los Precios de Cierre.

stock<-`BTC-USD`$`BTC-USD.Close`
plot(stock)

El gráfico muestra la evolución del precio de Bitcoin desde diciembre de 2023 hasta marzo de 2025. Se observa una tendencia creciente en general:

  • Inicio en niveles bajos (~40,000 USD): Bitcoin comienza con precios relativamente bajos.

  • Subida progresiva hasta mediados de 2024 (~70,000 USD): Se ve un crecimiento con algunas fluctuaciones.

  • Corrección y consolidación (~60,000 - 70,000 USD): Hay un periodo de estabilidad con pequeñas caídas y subidas.

  • Rally alcista fuerte (~100,000 USD): En la segunda mitad de 2024, Bitcoin alcanza su punto máximo por encima de 100,000 USD.

  • Retroceso en 2025 (~90,000 USD): Hacia el final del gráfico, se observa una caída desde el máximo, indicando una posible corrección o toma de ganancias.

library(ggplot2)
library(scales)  # Para formatear los valores del eje Y

ggplot(df, aes(x = Fecha)) +
  geom_line(aes(y = Apertura, color = "Apertura")) +
  geom_line(aes(y = Cierre, color = "Cierre")) +
  geom_line(aes(y = Maximo, color = "Máximo"), linetype = "dashed") +
  geom_line(aes(y = Minimo, color = "Mínimo"), linetype = "dashed") +
  scale_y_continuous(labels = comma_format()) +  # Corrige la notación científica
  labs(title = "Evolución de los Precios de Bitcoin",
       x = "Fecha", y = "Precio (USD)") +
  theme_minimal()

Boxplots de Distribución de los Precios de Bitcoin

# Cargar librerías
library(ggplot2)
library(scales)

# Crear el boxplot directamente desde df
ggplot(df) +
  geom_boxplot(aes(x = "Apertura", y = Apertura, fill = "Apertura")) +
  geom_boxplot(aes(x = "Cierre", y = Cierre, fill = "Cierre")) +
  geom_boxplot(aes(x = "Máximo", y = Maximo, fill = "Máximo")) +
  geom_boxplot(aes(x = "Mínimo", y = Minimo, fill = "Mínimo")) +
  geom_boxplot(aes(x = "Cierre Ajustado", y = Cierre_Ajustado, fill = "Cierre Ajustado")) +
  scale_y_continuous(labels = comma_format()) +  # Formato con comas (ej: 60,000 en vez de 6e+04)
  labs(title = "Distribución de los Precios de Bitcoin",
       x = "Tipo de Precio", y = "Valor en USD") +
  theme_minimal()

El boxplot muestra la distribución de los precios de Bitcoin en diferentes categorías (apertura, cierre, cierre ajustado, máximo y mínimo). Se observa que los precios tienen una alta variabilidad, con la mediana rondando los 70,000 - 80,000 USD. Los precios máximos son consistentemente más altos, mientras que los mínimos muestran mayor dispersión. La volatilidad es notable en todas las categorías.

Análisis de la variable Volumen.

ggplot(df, aes(x = Volumen)) +
  geom_histogram(bins = 30, fill = "steelblue", color = "black", alpha = 0.7) +
  scale_x_log10() +  # Escala logarítmica para mejor visualización
  labs(title = "Distribución del Volumen de Transacciones",
       x = "Volumen (USD, log)", y = "Frecuencia") +
  theme_minimal()

Parece seguir una distribución aproximadamente normal, pero con una ligera asimetría hacia la derecha. Esto sugiere que hay algunos días con volúmenes de transacción significativamente más altos que el promedio.

Esto podría estar asociado a eventos específicos del mercado de criptomonedas (picos de interés, noticias relevantes, o movimientos de grandes inversores).

Por esto decidimos revisar donde están mayormente concentrados estos picos en los datos y encontramos lo siguiente.

Identificación de Datos Atipicos.

library(ggplot2)
library(dplyr)

Q1 <- quantile(df$Volumen, 0.25, na.rm = TRUE)
Q3 <- quantile(df$Volumen, 0.75, na.rm = TRUE)
IQR <- Q3 - Q1

limite_inf <- Q1 - 1.5 * IQR
limite_sup <- Q3 + 1.5 * IQR

outliers <- df %>% filter(Volumen < limite_inf | Volumen > limite_sup)

print(outliers)
        Fecha  Apertura    Maximo    Minimo    Cierre      Volumen
1  2024-02-28  57071.10  63913.13  56738.43  62504.79  83239156760
2  2024-03-05  68341.05  69170.62  59323.91  63801.20 102802940877
3  2024-08-05  58110.30  58268.83  49121.24  53991.46 108991085584
4  2024-11-06  69358.50  76460.16  69322.03  75639.08 118592653963
5  2024-11-10  76775.55  81474.42  76565.43  80474.19  82570594495
6  2024-11-11  80471.41  89604.50  80283.25  88701.48 117966845037
7  2024-11-12  88705.56  89956.88  85155.11  87955.81 133673285375
8  2024-11-13  87929.97  93434.35  86256.93  90584.16 123559027869
9  2024-11-14  90574.88  91765.22  86682.81  87250.43  87616705248
10 2024-11-21  94334.64  99014.22  94132.60  98504.73 106024505582
11 2024-11-25  98033.45  98935.03  92642.91  93102.30  80909462490
12 2024-11-26  93087.28  94991.75  90770.81  91985.32  91656519855
13 2024-12-05  98741.54 103900.47  91998.78  96593.57 149218945580
14 2024-12-06  97074.23 102039.88  96514.88  99920.71  94534772658
15 2024-12-09 101237.06 101272.51  94355.91  97432.72 110676473908
16 2024-12-10  97441.23  98270.16  94321.26  96675.43 104823780634
17 2024-12-11  96656.06 101913.36  95747.23 101173.03  85391409936
18 2024-12-16 104293.58 107780.58 103322.98 106029.72  91020417816
19 2024-12-18 106147.30 106470.61 100041.54 100041.54  93865656139
20 2024-12-19 100070.69 102748.15  95587.68  97490.95  97221662392
21 2024-12-20  97484.70  98098.91  92175.18  97755.93 105634083408
22 2025-01-20 101083.75 109114.88  99471.36 102016.66 126279678351
23 2025-01-21 102052.58 107180.92 100103.95 106146.27  88733878242
24 2025-01-23 103657.67 106820.33 101257.80 103960.17 104104515428
25 2025-01-27 102680.30 103214.11  97795.94 102087.69  89006608428
26 2025-02-03  97681.10 102514.17  91242.89 101405.42 115400897748
27 2025-02-25  91437.12  92511.08  86008.23  88736.17  92139104128
28 2025-02-28  84705.62  85036.32  78248.91  84373.01  83610570576
   Cierre_Ajustado
1         62504.79
2         63801.20
3         53991.46
4         75639.08
5         80474.19
6         88701.48
7         87955.81
8         90584.16
9         87250.43
10        98504.73
11        93102.30
12        91985.32
13        96593.57
14        99920.71
15        97432.72
16        96675.43
17       101173.03
18       106029.72
19       100041.54
20        97490.95
21        97755.93
22       102016.66
23       106146.27
24       103960.17
25       102087.69
26       101405.42
27        88736.17
28        84373.01
# Graficar el volumen de transacciones en el tiempo
ggplot(df, aes(x = Fecha, y = Volumen)) +
  geom_line(color = "blue") +
  geom_point(data = outliers, aes(x = Fecha, y = Volumen), color = "red", size = 2) +
  labs(title = "Volumen de Transacciones de Bitcoin",
       x = "Fecha", y = "Volumen (USD)") +
  theme_minimal()

El mercado de las criptomonedas experimentó un fuerte repunte en noviembre y diciembre del año pasado, impulsado por factores políticos clave en Estados Unidos. Uno de los eventos más influyentes fue la victoria de Donald Trump en las elecciones presidenciales del 5 de noviembre, lo que generó expectativas de un entorno regulatorio más favorable para los activos digitales.

Desde el día de las elecciones, el precio de Bitcoin aumentó más del 40%, pasando de aproximadamente 75.000 dólares a superar los 100.000 dólares por primera vez en su historia. Este incremento estuvo acompañado de un notable aumento en la volatilidad y el volumen de transacciones, esto se refleja en el aumento que hubo desde entonces, pero especialmente entre el 6 y el 13 de noviembre, fechas en las que se discutía la posibilidad de que la nueva administración flexibilizara las regulaciones sobre criptomonedas.

En diciembre, la tendencia continuó con anuncios clave, como la nominación de Paul Atkins como nuevo presidente de la Comisión de Bolsa y Valores (SEC), quien ha manifestado una postura más amigable con las criptomonedas en comparación con su predecesor, Gary Gensler.

Análisis de la relación entre Volumen y Cierre

Se realizó un análisis de regresión lineal simple con el objetivo de evaluar si existe relación entre el volumen de transacciones y el precio de cierre.

library(ggcorrplot)
Warning: package 'ggcorrplot' was built under R version 4.4.3
matriz_cor <- cor(df %>% select(-Fecha))  # Eliminamos la columna de Fecha
ggcorrplot(matriz_cor, method = "circle", type = "lower",
           lab = TRUE, lab_size = 3, colors = c("red", "white", "blue"),
           title = "Matriz de Correlaciones entre Variables")

cor(df$Cierre, df$Volumen, use = "complete.obs")
[1] 0.5444245

Lo que realmente nos interesa es la Relación entre Volumen y Cierre:

Se observa una correlación positiva moderada de 0.54 entre volumen y el precio de cierre, lo que sugiere que a medida que el precio de cierre aumenta, el volumen también tiende a incrementarse, aunque no de manera perfectamente lineal.

ggplot(df, aes(x = Cierre, y = Volumen)) +
  geom_point(alpha = 0.5, color = "blue") +
  geom_smooth(method = "lm", color = "red", se = FALSE) +
  labs(title = "Relación entre Precio de Cierre y Volumen",
       x = "Precio de Cierre (USD)", y = "Volumen (USD)") +
  theme_minimal()
`geom_smooth()` using formula = 'y ~ x'

modelo <- lm(Volumen ~ Cierre, data = df)
summary(modelo)

Call:
lm(formula = Volumen ~ Cierre, data = df)

Residuals:
       Min         1Q     Median         3Q        Max 
-4.028e+10 -1.004e+10 -2.658e+09  7.060e+09  9.254e+10 

Coefficients:
              Estimate Std. Error t value Pr(>|t|)    
(Intercept) -7.236e+09  3.383e+09  -2.139    0.033 *  
Cierre       6.617e+05  4.753e+04  13.920   <2e-16 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 1.88e+10 on 460 degrees of freedom
Multiple R-squared:  0.2964,    Adjusted R-squared:  0.2949 
F-statistic: 193.8 on 1 and 460 DF,  p-value: < 2.2e-16

Se realizó un análisis de regresión lineal simple con el objetivo de evaluar la relación entre el volumen transaccionado y el precio de cierre.

Significancia de la variable Cierre:
El coeficiente de la variable Cierre es altamente significativo (p < 2e-16), lo que indica que existe una relación estadísticamente relevante entre el precio de cierre y el volumen.

Coeficiente de determinación R^2:
El modelo explica el 29.64% de la variabilidad en el volumen transaccionado. Esto sugiere que, si bien el precio de cierre influye en el volumen, hay otros factores que también afectan su comportamiento.

Conclusión:


El análisis exploratorio de datos del mercado de Bitcoin permitió identificar tendencias, relaciones y anomalías clave. Se manejaron datos faltantes eliminando filas con valores ausentes y se detectaron valores atípicos en el volumen de transacciones, coincidiendo con periodos de alta volatilidad.

El análisis de precios mostró una alta variabilidad y una tendencia alcista, con un rally en la segunda mitad de 2024 que llevó a máximos históricos. Además, se encontró una correlación moderada (0.54) entre el volumen y el precio de cierre, aunque otros factores también influyen en la actividad transaccional.

Las visualizaciones facilitaron la interpretación de los datos y la identificación de patrones clave. Estos hallazgos proporcionan una base sólida para análisis más avanzados, como modelos predictivos o estudios sobre factores adicionales que impactan el mercado de criptomonedas.