UNIVERSIDAD NACIONAL DE INGENIERÍA
FACULTAD DE INGENIERÍA INDUSTRIAL Y DE SISTEMAS
ANALÍTICA DE DATOS
Práctica Nº2
Integrantes:
Lescano Avalos Miguel Angel 20161212D
Pazce Alama Patricia Elena 20162612F
Timana Mendoza Abelardo 20152582G
Obregon Zavaleta Harold André 20161081G
Docente:
ARADIEL CASTAÑEDA, HILARIO
2020
1. Descripción General
2. Índice Jaccard
2.1. Porcentaje de Similitud entre Productos
#Leyendo el archivo
df_ingprod=pd.read_csv("Listado de Ingredientes por
[Link]",sep=',', encoding='latin-1')
#Funcion Jaccard
def jaccard_sim(str1, str2):
a = str1
b = str2
interseccion = (a&b).sum()
union = (a|b).sum()
return round((interseccion/union)*100)
#Formar la tabla de frecuencias de producto por ingredientes
MatrizIXP =
[Link](index=df_ingprod['Ingrediente'],columns=df_ingpr
od['Producto'],margins=False)
ArrProductos= [Link]
ArrIngredientes= [Link]
MatrizJaccard.to_csv('[Link]',sep=',',
encoding='latin-1')
print(MatrizIXP)
#Generar Dataframe vacío de productos
zero_data =
[Link](shape=([Link][1],[Link][1]))
MatrizJaccard =
[Link](zero_data,index=ArrProductos,columns=ArrProduct
os)
#Recorrer matriz producto por ingredientes
for i in range(0,[Link][1]):
for j in range(0,[Link][1]):
coefJaccard=jaccard_sim(MatrizIXP[ArrProductos[i]],MatrizIXP
[ArrProductos[j]])
MatrizJaccard[[Link][i]].values[j]=coefJaccard
MatrizJaccard[[Link][j]].values[i]=coefJaccard
MatrizJaccard.to_csv('[Link]',sep=',', encoding='latin-
1')
print(MatrizJaccard)
Resultados:
1. Matriz frecuencias de ingredientes por producto
2. Matriz de porcentaje de similitud entre productos con el índice Jaccard.
Conclusiones:
Los productos con un porcentaje de similitud mayor al 80% son: (19,16,88%)
(18,17,89%) (7,8,83%) (7,6,94%) (7,9,82%) (9,5,88%).
3.
3. Análisis de Componentes Principales (ACP)
3.1. Clustering Jerárquico
4. Clustering Jerárquico de Series Temporales
4.1. Carga de Archivos y gráfica de datos
Cargamos el archivo csv:
from [Link] import files
import pandas as pd
import numpy as np
cargar=[Link]
IB=pd.read_csv("/content/indices bursatiles retornos
[Link]",sep=',', encoding='latin-1')
#Mostrar primeros elementos
[Link]()
#Graficamos las variaciones que han tenido los índices
bursátiles a través de las 73 semanas...
[Link]()
#Como se puede observar, matplotlib arroja todo en una sola
gráfica, lo que hace difícil su visualización
# Para solucionar ello, podemos utilizar los "subplots" o
subtramas
import [Link] as plt
[Link](subplots=True)
[Link]()
# El inconveniente con este método es el limitado rango de
cada una de las gráficas.
#Por ello, debemos establecer un orden de cada subgráfico a
manera de matriz.
# Crearemos un conjunto de gráficos, ordenados en 3 filas y
2 columnas:
fig, axes = [Link](nrows=3, ncols=2, figsize=(10,8));
axes
#Hacemos un cambio de variable de cada subgráfico}
ax11 = axes[0][0]
ax12 = axes[0][1]
ax21 = axes[1][0]
ax22 = axes[1][1]
ax31 = axes[2][0]
ax32 = axes[2][1]
#Indicamos el grosor de la línea de las gráficas
line_width = 1.5
#Graficamos cada columna en un subgráfico
[Link](ax=ax11, c='blue', lw=line_width, ylim=[-15,
15])
[Link](ax=ax12, c='orange', lw=line_width, ylim=[-
15, 15])
[Link](ax=ax21, c='green', lw=line_width, ylim=[-
15, 15])
[Link](ax=ax22, c='brown', lw=line_width, ylim=[-15,
15])
[Link](ax=ax31, c='green', lw=line_width, ylim=[-
15, 15])
[Link](ax=ax32, c='brown', lw=line_width, ylim=[-15,
15])
#Graficamos
fig
#Podemos añadir mas características al gráfico anterior,
como poner cuadrículas o establecer etiquetas:
line_width = 1.5
# Aumentamos "Grid=True" para ver cuadrículas
[Link](ax=ax11, c='blue', lw=line_width, ylim=[-15,
15], grid=True)
[Link](ax=ax12, c='orange', lw=line_width, ylim=[-
15, 15], grid=True)
[Link](ax=ax21, c='green', lw=line_width, ylim=[-
15, 15], grid=True)
[Link](ax=ax22, c='brown', lw=line_width, ylim=[-15,
15], grid=True)
[Link](ax=ax31, c='green', lw=line_width, ylim=[-
15, 15], grid=True)
[Link](ax=ax32, c='brown', lw=line_width, ylim=[-15,
15], grid=True)
#
# Colocamos título a la figura
[Link]('Evolución de Indices')
# Nombrando las axisas y ordenadas
ax31.set_xlabel('Tiempo (Días)')
ax32.set_xlabel('Tiempo (Días)')
ax11.set_ylabel('FCHI')
ax12.set_ylabel('GDAXI')
ax21.set_ylabel('IBEX')
ax22.set_ylabel('NDX')
ax31.set_ylabel('N225')
ax32.set_ylabel('STI')
# Graficamos
fig
4.2. Clustering Jerárquico de Series Temporales
¿Qué son los Clusters Jerárquicos?
Es una representación mediante un método de clasificación
automática de datos. Es muy útil en algoritmos de aprendizaje no
supervisado.
Los Clusters jerarquicos sirven para la agrupación de individuos u
objetos que tienen similares características. La gráfica de los clusters
son los llamados "Dendrogramas".
Existen diversos métodos para hallar las similitudes entre los
individuos, el más utilizado es el método de la "Distancia
Euclidiana",que aplica dicha fórmula a cada columna de cada dos
individuos, estableciendo la distancia entre ellos.
No obstante, para series de tiempo el algoritmo euclidiano no es el
más óptimo. El Dynamic Time Warping(DTW) es un método que
considera las frecuencias de la misma serie, a comparación de la
euclidiana que lo hace punto por punto de las dos series. La gran
desventaja de la DTW es el amplio tiempo de procesamiento en
grandes bases de datos.
#Hallando el Cluster Jerarquico utilizando el método DTW
# Para ello, primero transponemos la matriz de los
datos,pues hallaremos las similitudes de cada Bolsa de
valores
IBTranspuesto=[Link]()
#Para poder utilizar el dtw, debemos instalarlo
previamente...
!pip install dtw-python
#Hacemos lo mismo para la librería dtaidistance, que sirve
para las gráficas de dendrogramas especiales
!pip install dtaidistance[numpy]
#Calculamos las distancias DTW de cada índice bursátil...
IB2=pd.read_csv("/content/indices bursatiles retornos
[Link]",sep=',', encoding='latin-1',index_col=0)
IBTranspuesto2=[Link]()
# calculate series cost
results = dtw.distance_matrix_fast(IBTranspuesto2,
compact=True)
results
array('d', [5.533002271527661, 8.634772506216766,
16.55046612413815, 15.809303264515696, 15.745447986305104,
9.370125074875622, 16.610876823871727, 16.08453492183169,
15.63766660730683, 16.212678730338315, 16.67685145617768,
15.51778666892907, 19.12250581857366, 18.812911522837595,
12.12313466558908])
#Mostramos el dendrograma
import [Link] as shc
[Link](figsize=(10, 7))
[Link]("Dendrograms")
#dend = [Link]([Link](results,
method='weighted'))
#dend = [Link]([Link](results, method='ward'))
#dend = [Link]([Link](results,
method='centroid'))
#dend = [Link]([Link](results,
method='median'))
#dend = [Link]([Link](results,
method='average'))
dend = [Link]([Link](results,
method='complete'))
Como se pudo observar, existen métodos de clasificación de cada
cluster, como el "ward", "weighted","centroid","median", "average" y
"complete".
# Ahora, para el gráfico del dendrograma, es necesario
establecer a los índices bursátiles como índices de la
tabla:
IBTranspuesto3=[Link]()
[Link]()
from dtaidistance import dtw, clustering
# Añadiendo los valores de matriz DTW, hallada
anteriormente:
model1 = [Link](dtw.distance_matrix_fast,
{})
cluster_idx = [Link](IBTranspuesto2)
# Ingresamos el modelo1 a otro para poder graficarlo:
model2 = [Link](model1)
cluster_idx = [Link](IBTranspuesto2)
model2 =
[Link](dists_fun=dtw.distance_matrix_fa
st, dists_options={})
cluster_idx = [Link](IBTranspuesto2)
# Utilizamos el metodo LinkageTree para poder ingresasr
etiquetas y valores al dendrograma:
model3 = [Link](dtw.distance_matrix_fast,
{})
cluster_idx = [Link](IBTranspuesto2)
#Establecemos las etiquetas al modelo3
fig, ax = [Link](nrows=1, ncols=2, figsize=(10, 10))
show_ts_label = lambda idx: "ts-" + str(idx)
[Link](axes=ax, show_ts_label=[Link],
show_tr_label=True, ts_label_margin=-10,
ts_left_margin=10, ts_sample_length=1)
#Si bien el gráfico anterior es muy detallado, no permite
identificar subgrupos similares, por ello utilizazremos el
metodo dendrogram:
dend = [Link]([Link](results,
method='complete'))
#Establecemos el valor (t=10) donde se hará el corte para
la clasificación de Clusters:
from [Link] import fcluster
clusters= fcluster([Link](results,
method='complete'),t=10,criterion='distance')
clusters
Se pudo comprobar gráficamente el resultado del último array: Se
formaron 4 grupos de acuerdo al criterio de distancia=10.
# Añadiendo una columna que indica al grupo al que pertenece
cada indice bursátil
IBTranspuesto3['Clustering Jerarquico']=clusters
[Link]()
#Guardando el dataframe con la clasificación hallada:
#Para Jupyter: IBTranspuesto3.to_csv('C:/User/...')
from [Link] import drive
[Link]('/drive2')
IBTranspuesto3.to_csv('/drive2/My Drive/Indices Clustering
[Link]')
4.3. dasdasd
5. Mapa Temático