File size: 4,572 Bytes
fd0c6b5 a39127f b568eb5 cc14847 fd0c6b5 cc14847 a39127f d868ae1 2b25c7a a8403c5 a39127f 2b25c7a 0b34c1a 2b25c7a cc14847 2b25c7a cc14847 2b25c7a b89dfd7 2b25c7a cc14847 2b25c7a cc14847 fd0c6b5 cc14847 5c7a03d cc14847 14f2703 cc14847 e9e337d 5c7a03d cc14847 5c7a03d cc14847 fd0c6b5 cc14847 |
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 |
# Actualizado por: José Carlos Machicao, Fecha de actualización: 2024_06_19
import streamlit as st
import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
import plotly.express as px
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.decomposition import PCA
pd.DataFrame.iteritems = pd.DataFrame.items
scaler = StandardScaler()
st.title("Visualización y Clusterización automática de Data de Estudiantes")
st.write("Cargue el archivo PKL para visualizar el análisis de su contenido.")
uploaded_file = st.file_uploader("Cargar archivo: ", type='pkl')
if uploaded_file is not None:
df = pd.read_pickle(uploaded_file)
# Eliminación de datos inválidos
df_050 = df.dropna(axis=0)
df_050.index = df_050.DNI
# Depuración de columnas sólo para aquellas que contribuyen al clustering
col_selec = []
for col in df_050.columns:
u_col = df_050[col].unique()
if len(u_col) < 25:
col_selec.append(col)
st.write('Esta es la lista de variables que será usada para la clusterización.')
st.write(col_selec)
df_100 = df_050[col_selec]
df_110 = pd.get_dummies(df_100)
st.write('Esta es la matriz de correlación de todas las categorías')
corr_matrix = df_110.corr()
plt.figure(figsize=(21, 21)) # Adjust the figure size as needed
sns.heatmap(corr_matrix, annot=True, cmap='coolwarm', fmt=".2f", linewidths=0.5, annot_kws={'size': 5})
plt.title('Mapa de Calor de la Correlation de Variables')
st.pyplot(plt)
st.write('A continuación se va a hacer el clustering usando PCA.')
X_sc = scaler.fit_transform(df_110)
st.write('La forma de la data es: ', X_sc.shape)
has_nan = np.isnan(X_sc).sum()
pca = PCA(n_components=2)
pca.fit(X_sc)
X_pca = pca.transform(X_sc)
data_200 = df_100
data_200['pca_1'] = X_pca[:, 0]
data_200['pca_2'] = X_pca[:, 1]
plt.figure(figsize=(8, 8))
plt.scatter(data_200.pca_1, data_200.pca_2)
plt.title('Diagrama de Dispersión PCA')
plt.xlabel('Principal Component 1')
plt.ylabel('Principal Component 2')
st.pyplot(plt)
st.write(data_200.columns)
#st.write(data_200['COD_DEPARTAMENTO'].unique())
#st.write(data_200['ESTADO_ESTUDIANTE'].unique())
#VIRTU = st.selectbox('Virtual: ', ['UVIR', 'PCGT'])
INGRE = st.selectbox('Estado: ', ['Abandono', 'Activo'])
data_210 = data_200[data_200['ESTADO_INGRESANTE']==INGRE]
fig2 = px.scatter(data_210, x='pca_1', y='pca_2', title='Distribución PCA', width=800, height=800)
st.plotly_chart(fig2)
GRIDSIZEX = st.slider(0, 100, 10)
plt.figure(figsize=(10, 8))
plt_extracto = plt.hexbin(data_210.pca_1, data_210.pca_2, gridsize=GRIDSIZEX, cmap='inferno')
plt.colorbar()
plt.title('Hexbin Plot of PCA-Transformed Data')
plt.xlabel('Principal Component 1')
plt.ylabel('Principal Component 2')
st.pyplot(plt)
plt.figure(figsize=(7, 4))
densidades = pd.DataFrame(plt_extracto.get_array())
densidades.hist(bins=50, log=True)
plt.xlabel('Cantidad de Ocurrencias')
plt.ylabel('Frecuencia')
plt.title('Histograma de Densidades')
st.pyplot(plt)
offsets = plt_extracto.get_offsets()
offsets_df = pd.DataFrame(offsets)
st.write(offsets_df.shape)
offsets_df['densidad'] = densidades[0]
offsets_df.columns = ['col1', 'col2', 'densidad']
offset_selec = offsets_df.sort_values(by='densidad', ascending=False)
patrones_df = pd.DataFrame(index = [0,1,2,3,4,5,6,7,8,9], data=offset_selec.values[0:10], columns=offset_selec.columns)
st.write(patrones_df)
NUM_CASOS = st.slider("¿Cuántos casos elige explorar?", 1, 10, 3)
st.write('Usted ha elegido ', NUM_CASOS, 'casos.')
radiohex = (data_210.pca_1.max() - data_210.pca_1.min())/50/2
CASOX = st.selectbox('Elija el caso: ', (1, 2, 3))
a, b = patrones_df.col1[CASOX], patrones_df.col2[CASOX]
enfoqueX = data_210[
(data_210.pca_1 > a - radiohex) &
(data_210.pca_1 < a + radiohex) &
(data_210.pca_2 > b - radiohex) &
(data_210.pca_2 < b + radiohex)
]
st.write(enfoqueX.shape)
LISTA_SELEC = st.multiselect('Escoja la variable de color: ', list(enfoqueX.columns))
st.write(LISTA_SELEC)
fig2 = px.parallel_categories(data_frame=enfoqueX[list(LISTA_SELEC)])
st.plotly_chart(fig2)
|