jcmachicao's picture
Update app.py
14f2703 verified
raw
history blame
4.57 kB
# 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)