edgamer's picture
Update app.py
5487c12
raw
history blame
No virus
18.8 kB
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')