Spaces:
Sleeping
Sleeping
import imp | |
import io | |
import re | |
import numpy as np | |
import pandas as pd | |
import seaborn as sns | |
import streamlit as st | |
import matplotlib.pyplot as plt | |
from sklearn.preprocessing import LabelEncoder | |
st.sidebar.title('Secciones') | |
opcion_general = st.sidebar.selectbox('Selecciona la sección que desees revisar', ['Presentación', 'Resumen', 'Conceptos clave', | |
'Análisis exploratorio (EDA: Exploratory Data Analysis)', 'Hallazgos', 'Referencias']) | |
if opcion_general == 'Presentación': | |
st.title('Estudio sobre las Industrias Culturales y Creativas en México') | |
st.write('Por Jesús Eduardo Oliva Abarca') | |
st.write('Facultad de Artes Visuales, Universidad Autónoma de Nuevo León') | |
elif opcion_general == 'Resumen': | |
st.title('Resumen') | |
st.markdown('''Existen numerosas acepciones del concepto de Industrias Culturales y Creativas -en adelante, ICC, para abreviar-, de igual manera, se han formulado múltiples clasificaciones de este sector productivo que, a partir de la década de los ochenta del siglo pasado, adquiere una mayor relevancia tanto para la economía global, lo mismo que para las discusiones y debates en torno a las políticas de desarrollo de los países. En lo que respecta a México, las ICC han sido objeto de investigaciones muy diversas, que van desde el análisis de su dimensión económica y jurídica (Piedras, 2004), o bien para abordarles desde una óptica sociológica (García Canclini, 2000, y 2006), o para examinar su influjo en la generación en la planeación pública (Mariscal Orozco, 2007). Este proyecto de investigación parte del análisis de los datos referentes a las ICC, disponibles en el Directorio Estadístico Nacional de Unidades Económicas (DENUE), desde el año 2015 y hasta el 2021, con el propósito de identificar características generales de éstas, así como patrones y tendencias de su desarrollo, que posibiliten un entendimiento general de la estructura del campo de producción cultural (Bourdieu, 2002; García Canclini, 2014) en México. Para cumplir con tal objetivo, este estudio se apoya en la análitica cultural (Manovich, 2020), enfoque que combina técnicas y métodos de la ciencia de datos (campo que integra a la estadística, el Aprendizaje Automático, o Machine Learning y la Inteligencia Artificial), con el análisis sociológico y las humanidades digitales para el análisis de grandes volúmenes de datos culturales. El estudio aquí propuesto se realiza en tres etapas: durante la primera, se recolectan y se procesan los datos para conformar los conjuntos a partir de los cuales se realizará un análisis exploratorio (Exploratory Data Analysis); la segunda fase comprende el examen e interpretación de los patrones, tendencias y/o anomalías relativas al desarrollo de las ICC, y la elaboración de recomendaciones para su mejora. En la tercera y última fase, se desarrolla y despliega una aplicación web que permita visualizar los datos examinados en esta investigación para propiciar la socialización de los hallazgos obtenidos, así como para incentivar la reflexión y debate, por parte de las personas u organizaciones interesadas, en torno a las ICC en México.''') | |
st.markdown('''Palabras clave: analítica cultural, brecha digital, campo cultural, industrias culturales y creativas, innovación cultural''') | |
elif opcion_general == 'Conceptos clave': | |
st.title('Conceptos clave') | |
tema = st.sidebar.radio('Selecciona la temática de tu interés', ['Industrias Culturales y Creativas', 'Analítica Cultural']) | |
if tema == 'Industrias Culturales y Creativas': | |
st.header('Industrias Culturales y Creativas') | |
elif tema == 'Analítica Cultural': | |
st.header('Analítica Cultural') | |
elif opcion_general == 'Análisis exploratorio (EDA: Exploratory Data Analysis)': | |
st.title('Análisis exploratorio (EDA: Exploratory Data Analysis)') | |
opcion = st.sidebar.selectbox('Selecciona el año que deseas examinar', ('2015', '2016', '2017', '2018', '2019', '2020', '2021')) | |
df_cargado = pd.read_csv('datos_procesados/datos_denue_icc_' + opcion + '.csv') | |
st.sidebar.write('Seleccionaste el año', opcion) | |
copia_df = df_cargado.copy() | |
datos_binarios = df_cargado[['razon_social', 'correo_electronico', 'sitio_internet']].notna() | |
copia_df.insert(2, '_razon_social', datos_binarios['razon_social']) | |
copia_df.insert(13, '_correo_electronico', datos_binarios['correo_electronico']) | |
copia_df.insert(15, '_sitio_internet', datos_binarios['sitio_internet']) | |
copia_df['_razon_social'] = copia_df['_razon_social'].astype(str) | |
copia_df['_razon_social'] = copia_df['_razon_social'].replace('False', 'No tiene') | |
copia_df['_razon_social'] = copia_df['_razon_social'].replace('True', 'Sí tiene') | |
copia_df['_correo_electronico'] = copia_df['_correo_electronico'].astype(str) | |
copia_df['_correo_electronico'] = copia_df['_correo_electronico'].replace('False', 'No tiene') | |
copia_df['_correo_electronico'] = copia_df['_correo_electronico'].replace('True', 'Sí tiene') | |
copia_df['_sitio_internet'] = copia_df['_sitio_internet'].astype(str) | |
copia_df['_sitio_internet'] = copia_df['_sitio_internet'].replace('False', 'No tiene') | |
copia_df['_sitio_internet'] = copia_df['_sitio_internet'].replace('True', 'Sí tiene') | |
opcion_actividad = st.sidebar.radio('Selecciona la actividad que deseas realizar sobre el conjunto de datos seleccionado', ['Exploración descriptiva', | |
'Visualización']) | |
if opcion_actividad == 'Exploración descriptiva': | |
opcion_tarea = st.sidebar.selectbox('Selecciona la tarea exploratoria', ['Descripción general', 'Marco de datos completo', | |
'Agrupación', 'Análisis de segmentación', 'Correlaciones']) | |
if opcion_tarea == 'Descripción general': | |
buffer = io.StringIO() | |
df_cargado.info(buf= buffer) | |
info_df = buffer.getvalue() | |
st.text(info_df) | |
elif opcion_tarea == 'Marco de datos completo': | |
st.dataframe(df_cargado) | |
elif opcion_tarea == 'Agrupación': | |
st.subheader('Selecciona la variable categórica en torno a la cual deseas agrupar los demás valores:') | |
if st.sidebar.checkbox('Razón social'): | |
df_grupo = df_cargado['razon_social'].notna().value_counts() | |
st.table(df_grupo) | |
elif st.sidebar.checkbox('Clase de actividad'): | |
df_grupo = df_cargado['nombre_clase_actividad'].value_counts() | |
st.table(df_grupo) | |
elif st.sidebar.checkbox('Rango de personal ocupado'): | |
df_grupo = df_cargado['rango_personal_ocupado'].value_counts() | |
st.table(df_grupo) | |
elif st.sidebar.checkbox('Entidad federativa'): | |
df_grupo = df_cargado['entidad_federativa'].value_counts() | |
st.table(df_grupo) | |
elif st.sidebar.checkbox('Correo electrónico'): | |
df_grupo = df_cargado['correo_electronico'].notna().value_counts() | |
st.table(df_grupo) | |
elif st.sidebar.checkbox('Sitio en Internet'): | |
df_grupo = df_cargado['sitio_internet'].notna().value_counts() | |
st.table(df_grupo) | |
elif st.sidebar.checkbox('Tipo de establecimiento'): | |
df_grupo = df_cargado['tipo_establecimiento'].value_counts() | |
st.table(df_grupo) | |
elif opcion_tarea == 'Análisis de segmentación': | |
try: | |
opcion_estado = st.sidebar.selectbox('Selecciona la entidad federativa', [i for i in copia_df.groupby(by= 'entidad_federativa').groups]) | |
opcion_razon_social = st.sidebar.selectbox('Selecciona el estatus de registro legal', [i for i in copia_df.groupby(by= '_razon_social').groups]) | |
opcion_actividad = st.sidebar.selectbox('Selecciona la clase de actividad', [i for i in copia_df.groupby(by= 'nombre_clase_actividad').groups]) | |
opcion_rango_ocupacion = st.sidebar.selectbox('Selecciona el rango de ocupación laboral', [i for i in copia_df.groupby(by= 'rango_personal_ocupado').groups]) | |
opcion_correo = st.sidebar.selectbox('Selecciona según posea o no correo electrónico', [i for i in copia_df.groupby(by= '_correo_electronico').groups]) | |
opcion_sitio = st.sidebar.selectbox('Selecciona según posea o no sitio en Internet', [i for i in copia_df.groupby(by= '_sitio_internet').groups]) | |
opcion_tipo_establecimiento = st.sidebar.selectbox('Selecciona el tipo de establecimiento', [i for i in copia_df.groupby(by= 'tipo_establecimiento').groups]) | |
df_segmentado = copia_df.groupby(['entidad_federativa', '_razon_social', 'nombre_clase_actividad', 'rango_personal_ocupado', '_correo_electronico', | |
'_sitio_internet', 'tipo_establecimiento']).get_group((opcion_estado, opcion_razon_social, opcion_actividad, | |
opcion_rango_ocupacion, opcion_correo, opcion_sitio, opcion_tipo_establecimiento)) | |
df_segmentado.drop(columns= 'entidad_federativa', inplace= True) | |
st.dataframe(df_segmentado) | |
except KeyError: | |
st.warning('No existen entradas u observaciones para las categorías seleccionadas') | |
elif opcion_tarea == 'Correlaciones': | |
etiquetador = LabelEncoder() | |
copia_df = df_cargado.copy() | |
for columna in copia_df.columns: | |
copia_df[columna] = etiquetador.fit_transform(copia_df[columna]) | |
copia_df.drop(columns= ['nombre_unidad_economica', 'tipo_vialidad', 'nombre_vialidad', 'numero', 'tipo_asentamiento_humano', 'nombre_asentamiento_humano', | |
'codigo_postal', 'entidad_federativa', 'municipio', 'fecha_incorporacion_denue'], inplace= True) | |
st.table(copia_df.corr(method= 'pearson')) | |
elif opcion_actividad == 'Visualización': | |
opcion_grafico = st.sidebar.radio('Selecciona el gráfico para visualizar los datos', ('Pie', 'De barras', 'Mapa de calor')) | |
if opcion_grafico == 'Pie': | |
if st.sidebar.checkbox('Gráfico general'): | |
opcion_variable = st.sidebar.selectbox('Selecciona la variable categórica que deseas graficar', | |
['Razon social', 'Rango de personal ocupado', 'Cuenta con correo electrónico', 'Cuenta con sitio de Internet', 'Tipo de establecimiento']) | |
if opcion_variable == 'Razon social': | |
figura, eje = plt.subplots() | |
eje.pie(df_cargado['razon_social'].notna().value_counts(), labels= ['No cuentan con razón social', 'Sí cuentan con razón social'], | |
autopct= '%1.1f%%', explode= [0, 0.1], shadow= True) | |
eje.axis('equal') | |
st.pyplot(figura) | |
elif opcion_variable == 'Rango de personal ocupado': | |
figura, eje = plt.subplots() | |
eje.pie(df_cargado['rango_personal_ocupado'].value_counts(), labels= ['0 a 5 personas', '6 a 10 personas', '11 a 30 personas', '31 a 50 personas', | |
'51 a 100 personas', '101 a 250 personas', '251 y más personas'], | |
autopct= '%1.1f%%', explode= [0.1, 0, 0, 0, 0.3, 0.6, 0.9], shadow= True) | |
eje.axis('equal') | |
st.pyplot(figura) | |
elif opcion_variable == 'Cuenta con correo electrónico': | |
figura, eje = plt.subplots() | |
eje.pie(df_cargado['correo_electronico'].notna().value_counts(), | |
labels= ['No cuentan con correo electrónico', 'Sí cuentan con correo electrónico'], autopct= '%1.1f%%', explode= [0, 0.1], shadow= True) | |
eje.axis('equal') | |
st.pyplot(figura) | |
elif opcion_variable == 'Cuenta con sitio de Internet': | |
figura, eje = plt.subplots() | |
eje.pie(df_cargado['sitio_internet'].notna().value_counts(), | |
labels= ['No cuentan con sitio en Internet', 'Sí cuentan con sitio en Internet'], autopct= '%1.1f%%', explode= [0, 0.1], shadow= True) | |
eje.axis('equal') | |
st.pyplot(figura) | |
elif opcion_variable == 'Tipo de establecimiento': | |
figura, eje = plt.subplots() | |
eje.pie(df_cargado['tipo_establecimiento'].value_counts(), labels= ['Fijo', 'Semifijo'], autopct= '%1.1f%%', explode= [0, 0.1], shadow= True) | |
eje.axis('equal') | |
st.pyplot(figura) | |
elif st.sidebar.checkbox('Gráfico por entidad federativa'): | |
opcion_estado = st.sidebar.selectbox('Selecciona la entidad federativa', [i for i in copia_df.groupby(by= 'entidad_federativa').groups]) | |
opcion_variable = st.sidebar.selectbox('Selecciona la variable categórica que deseas graficar', | |
['Razon social', 'Rango de personal ocupado', 'Cuenta con correo electrónico', 'Cuenta con sitio de Internet', 'Tipo de establecimiento']) | |
df_segmentado = copia_df.groupby('entidad_federativa').get_group(opcion_estado) | |
try: | |
if opcion_variable == 'Razon social': | |
figura, eje = plt.subplots() | |
eje.pie(df_segmentado['razon_social'].notna().value_counts(), labels= ['No cuentan con razón social', 'Sí cuentan con razón social'], | |
autopct= '%1.1f%%', explode= [0, 0.1], shadow= True) | |
eje.axis('equal') | |
st.pyplot(figura) | |
elif opcion_variable == 'Rango de personal ocupado': | |
figura, eje = plt.subplots() | |
eje.pie(df_segmentado['rango_personal_ocupado'].value_counts(), labels= ['0 a 5 personas', '6 a 10 personas', '11 a 30 personas', | |
'31 a 50 personas', '51 a 100 personas', '101 a 250 personas', '251 y más personas'], | |
autopct= '%1.1f%%', explode= [0.1, 0, 0, 0, 0.3, 0.6, 0.9], shadow= True) | |
eje.axis('equal') | |
st.pyplot(figura) | |
elif opcion_variable == 'Cuenta con correo electrónico': | |
figura, eje = plt.subplots() | |
eje.pie(df_segmentado['correo_electronico'].notna().value_counts(), | |
labels= ['No cuentan con correo electrónico', 'Sí cuentan con correo electrónico'], autopct= '%1.1f%%', explode= [0, 0.1], shadow= True) | |
eje.axis('equal') | |
st.pyplot(figura) | |
elif opcion_variable == 'Cuenta con sitio de Internet': | |
figura, eje = plt.subplots() | |
eje.pie(df_segmentado['sitio_internet'].notna().value_counts(), | |
labels= ['No cuentan con sitio en Internet', 'Sí cuentan con sitio en Internet'], autopct= '%1.1f%%', explode= [0, 0.1], shadow= True) | |
eje.axis('equal') | |
st.pyplot(figura) | |
elif opcion_variable == 'Tipo de establecimiento': | |
figura, eje = plt.subplots() | |
eje.pie(df_segmentado['tipo_establecimiento'].value_counts(), labels= ['Fijo', 'Semifijo'], autopct= '%1.1f%%', explode= [0, 0.1], shadow= True) | |
eje.axis('equal') | |
st.pyplot(figura) | |
except ValueError: | |
figura, eje = plt.subplots() | |
#plt.title('Seleccionaste ' + df_segmentado[opcion_estado]) | |
eje.pie(df_segmentado['rango_personal_ocupado'].value_counts(), labels= ['0 a 5 personas', '6 a 10 personas', '11 a 30 personas', | |
'31 a 50 personas', '51 a 100 personas', '101 a 250 personas'], | |
autopct= '%1.1f%%', shadow= True) | |
st.pyplot(figura) | |
elif opcion_grafico == 'De barras': | |
opcion_estado = st.sidebar.selectbox('Escoge una entidad federativa para explorar', [i for i in copia_df.groupby(by= 'entidad_federativa').groups]) | |
df_segmentado = copia_df.groupby(by= 'entidad_federativa').get_group(opcion_estado) | |
st.subheader('Selecciona la variable categórica en torno a la cual deseas agrupar los demás valores:') | |
if st.sidebar.checkbox('Razón social'): | |
figura = plt.figure() | |
eje = sns.countplot(y= 'nombre_clase_actividad', hue= '_razon_social', data= df_segmentado) | |
st.pyplot(figura) | |
elif st.sidebar.checkbox('Rango de personal ocupado'): | |
figura = plt.figure() | |
eje = sns.countplot(y= 'nombre_clase_actividad', hue= 'rango_personal_ocupado', data= df_segmentado) | |
st.pyplot(figura) | |
elif st.sidebar.checkbox('Correo electrónico'): | |
figura = plt.figure() | |
eje = sns.countplot(y= 'nombre_clase_actividad', hue= '_correo_electronico', data= df_segmentado) | |
st.pyplot(figura) | |
elif st.sidebar.checkbox('Sitio en Internet'): | |
figura = plt.figure() | |
eje = sns.countplot(y= 'nombre_clase_actividad', hue= '_sitio_internet', data= df_segmentado) | |
st.pyplot(figura) | |
elif st.sidebar.checkbox('Tipo de establecimiento'): | |
figura = plt.figure() | |
eje = sns.countplot(y= 'nombre_clase_actividad', hue= 'tipo_establecimiento', data= df_segmentado) | |
st.pyplot(figura) | |
elif opcion_grafico == 'Mapa de calor': | |
etiquetador = LabelEncoder() | |
copia_df = df_cargado.copy() | |
for columna in copia_df.columns: | |
copia_df[columna] = etiquetador.fit_transform(copia_df[columna]) | |
copia_df.drop(columns= ['nombre_unidad_economica', 'tipo_vialidad', 'nombre_vialidad', 'numero', 'tipo_asentamiento_humano', 'nombre_asentamiento_humano', | |
'codigo_postal', 'entidad_federativa', 'municipio', 'fecha_incorporacion_denue'], inplace= True) | |
figura = plt.figure() | |
eje = sns.heatmap(copia_df.corr(), annot= True) | |
st.pyplot(figura) | |
elif opcion_general == 'Hallazgos': | |
st.title('Hallazgos') | |
elif opcion_general == 'Referencias': | |
st.title('Referencias') | |