Upload 5 files
Browse filesCommint ejemplo : Este modelo clasifica empresas del sector TIC en **innovadoras** o **tradicionales** usando:
- Actividad económica (CIIU)
- Tamaño (empleados)
- Uso de tecnologías avanzadas (IA, GitHub)
- Exportación de servicios
- README.md +24 -14
- app.py +60 -0
- empresas_tic_bucaramanga.csv.txt +8 -0
- requirements.txt +5 -0
- tic_innovacion.py +51 -0
README.md
CHANGED
|
@@ -1,14 +1,24 @@
|
|
| 1 |
-
|
| 2 |
-
|
| 3 |
-
|
| 4 |
-
|
| 5 |
-
|
| 6 |
-
|
| 7 |
-
|
| 8 |
-
|
| 9 |
-
|
| 10 |
-
|
| 11 |
-
|
| 12 |
-
|
| 13 |
-
|
| 14 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# 🚀 Empresas TIC Innovadoras en Bucaramanga
|
| 2 |
+
|
| 3 |
+
Este modelo clasifica empresas del sector TIC en **innovadoras** o **tradicionales** usando:
|
| 4 |
+
|
| 5 |
+
- Actividad económica (CIIU)
|
| 6 |
+
- Tamaño (empleados)
|
| 7 |
+
- Uso de tecnologías avanzadas (IA, GitHub)
|
| 8 |
+
- Exportación de servicios
|
| 9 |
+
|
| 10 |
+
## 🎯 Aplicaciones
|
| 11 |
+
- **Alcaldía de Bucaramanga**: identificar empresas para programas de innovación.
|
| 12 |
+
- **ParqueSoft Santander**: priorizar incubación.
|
| 13 |
+
- **Estudiantes UIS/UNAB**: elegir empresas para pasantías con impacto.
|
| 14 |
+
|
| 15 |
+
## 📊 Datos
|
| 16 |
+
- MinTIC – Directorio Nacional de Empresas TIC
|
| 17 |
+
- RUES – Datos abiertos de Colombia
|
| 18 |
+
- Información pública de redes (GitHub, LinkedIn)
|
| 19 |
+
|
| 20 |
+
## 🛠️ Tecnología
|
| 21 |
+
- `RandomForestClassifier` + calibración (`CalibratedClassifierCV`)
|
| 22 |
+
- Interfaz interactiva con **Gradio** en **Hugging Face Spaces**
|
| 23 |
+
|
| 24 |
+
Hecho con ❤️ para el ecosistema TIC de Santander.
|
app.py
ADDED
|
@@ -0,0 +1,60 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# app.py
|
| 2 |
+
import gradio as gr
|
| 3 |
+
import joblib
|
| 4 |
+
import numpy as np
|
| 5 |
+
|
| 6 |
+
# Cargar
|
| 7 |
+
modelo = joblib.load("modelo_tic.pkl")
|
| 8 |
+
le_ciiu = joblib.load("encoder_actividad.pkl")
|
| 9 |
+
|
| 10 |
+
CIIU_OPCIONES = ["6201 - Desarrollo software", "6202 - Consultoría TIC", "6209 - Otros servicios TIC", "6311 - Hosting/Cloud"]
|
| 11 |
+
|
| 12 |
+
def predecir_innovacion(ciiu_str, empleados, exporta, usa_ia, tiene_github):
|
| 13 |
+
# Extraer código CIIU
|
| 14 |
+
ciiu = ciiu_str.split(" ")[0]
|
| 15 |
+
try:
|
| 16 |
+
ciiu_cod = le_ciiu.transform([ciiu])[0]
|
| 17 |
+
except:
|
| 18 |
+
ciiu_cod = 0 # fallback
|
| 19 |
+
|
| 20 |
+
entrada = np.array([[ciiu_cod, empleados, int(exporta), int(usa_ia), int(tiene_github)]])
|
| 21 |
+
prob = modelo.predict_proba(entrada)[0][1]
|
| 22 |
+
|
| 23 |
+
if prob >= 0.7:
|
| 24 |
+
mensaje = "🚀 Alta innovación: probable startup tecnológica o empresa exportadora."
|
| 25 |
+
elif prob >= 0.4:
|
| 26 |
+
mensaje = "💡 Innovación moderada: podría beneficiarse de apoyo del clúster TIC."
|
| 27 |
+
else:
|
| 28 |
+
mensaje = "🔧 Empresa tradicional: servicios básicos de TI."
|
| 29 |
+
|
| 30 |
+
return f"{prob*100:.1f}%", mensaje
|
| 31 |
+
|
| 32 |
+
with gr.Blocks(title="TIC Bucaramanga") as demo:
|
| 33 |
+
gr.Markdown("# 🧠 ¿Es innovadora tu empresa TIC en Bucaramanga?")
|
| 34 |
+
gr.Markdown("Modelo basado en datos del MinTIC, RUES y clústeres locales.")
|
| 35 |
+
|
| 36 |
+
with gr.Row():
|
| 37 |
+
ciiu = gr.Dropdown(CIIU_OPCIONES, label="Actividad principal (CIIU)", value=CIIU_OPCIONES[0])
|
| 38 |
+
empleados = gr.Slider(1, 100, value=10, label="Número de empleados")
|
| 39 |
+
with gr.Row():
|
| 40 |
+
exporta = gr.Checkbox(label="¿Exporta servicios?")
|
| 41 |
+
usa_ia = gr.Checkbox(label="¿Usa inteligencia artificial?")
|
| 42 |
+
tiene_github = gr.Checkbox(label="¿Tiene repositorios públicos (GitHub)?")
|
| 43 |
+
|
| 44 |
+
prob_output = gr.Textbox(label="Probabilidad de ser innovadora")
|
| 45 |
+
mensaje_output = gr.Textbox(label="Interpretación")
|
| 46 |
+
|
| 47 |
+
btn = gr.Button("Analizar empresa")
|
| 48 |
+
btn.click(
|
| 49 |
+
predecir_innovacion,
|
| 50 |
+
inputs=[ciiu, empleados, exporta, usa_ia, tiene_github],
|
| 51 |
+
outputs=[prob_output, mensaje_output]
|
| 52 |
+
)
|
| 53 |
+
|
| 54 |
+
gr.Markdown("""
|
| 55 |
+
> ℹ️ Este modelo ayuda a identificar talento TIC en Bucaramanga.
|
| 56 |
+
> Datos: MinTIC, RUES, ParqueSoft Santander.
|
| 57 |
+
> Proyecto de código abierto para el ecosistema local.
|
| 58 |
+
""")
|
| 59 |
+
|
| 60 |
+
demo.launch()
|
empresas_tic_bucaramanga.csv.txt
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
empresa,actividad_ciiu,empleados,exporta_servicios,usa_ia,tiene_github,innovadora
|
| 2 |
+
SoftSantander,6201,15,0,1,1,1
|
| 3 |
+
DataSys SAS,6202,8,0,0,0,0
|
| 4 |
+
NeuronCloud Ltda,6209,25,1,1,1,1
|
| 5 |
+
SoporteTI,6209,3,0,0,0,0
|
| 6 |
+
IAAndina,6201,12,1,1,1,1
|
| 7 |
+
RedesBuc,6311,5,0,0,0,0
|
| 8 |
+
CyberSantander,6202,18,0,1,1,1
|
requirements.txt
ADDED
|
@@ -0,0 +1,5 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
gradio==4.36.0
|
| 2 |
+
scikit-learn==1.5.0
|
| 3 |
+
pandas==2.2.0
|
| 4 |
+
joblib==1.4.0
|
| 5 |
+
numpy==1.26.0
|
tic_innovacion.py
ADDED
|
@@ -0,0 +1,51 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# tic_innovacion.py
|
| 2 |
+
import pandas as pd
|
| 3 |
+
import numpy as np
|
| 4 |
+
from sklearn.model_selection import train_test_split
|
| 5 |
+
from sklearn.ensemble import RandomForestClassifier
|
| 6 |
+
from sklearn.preprocessing import LabelEncoder
|
| 7 |
+
from sklearn.calibration import CalibratedClassifierCV
|
| 8 |
+
from sklearn.metrics import classification_report, brier_score_loss, calibration_curve
|
| 9 |
+
import joblib
|
| 10 |
+
import matplotlib.pyplot as plt
|
| 11 |
+
|
| 12 |
+
# Cargar datos
|
| 13 |
+
df = pd.read_csv("data/empresas_tic_bucaramanga.csv")
|
| 14 |
+
|
| 15 |
+
# Codificar actividad CIIU
|
| 16 |
+
le_ciiu = LabelEncoder()
|
| 17 |
+
df['actividad_cod'] = le_ciiu.fit_transform(df['actividad_ciiu'])
|
| 18 |
+
|
| 19 |
+
# Variables predictoras
|
| 20 |
+
X = df[['actividad_cod', 'empleados', 'exporta_servicios', 'usa_ia', 'tiene_github']]
|
| 21 |
+
y = df['innovadora']
|
| 22 |
+
|
| 23 |
+
# Dividir
|
| 24 |
+
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42, stratify=y)
|
| 25 |
+
|
| 26 |
+
# Modelo base
|
| 27 |
+
model = RandomForestClassifier(
|
| 28 |
+
n_estimators=150,
|
| 29 |
+
max_depth=6,
|
| 30 |
+
class_weight='balanced',
|
| 31 |
+
random_state=42
|
| 32 |
+
)
|
| 33 |
+
model.fit(X_train, y_train)
|
| 34 |
+
|
| 35 |
+
# Calibración (como en cancer.py)
|
| 36 |
+
calibrated_model = CalibratedClassifierCV(model, method='sigmoid', cv=3)
|
| 37 |
+
calibrated_model.fit(X_train, y_train)
|
| 38 |
+
|
| 39 |
+
# Evaluar
|
| 40 |
+
prob_cal = calibrated_model.predict_proba(X_test)[:, 1]
|
| 41 |
+
y_pred = (prob_cal >= 0.5).astype(int)
|
| 42 |
+
|
| 43 |
+
print("=== Reporte de Clasificación ===")
|
| 44 |
+
print(classification_report(y_test, y_pred))
|
| 45 |
+
|
| 46 |
+
print(f"Brier Score: {brier_score_loss(y_test, prob_cal):.4f}")
|
| 47 |
+
|
| 48 |
+
# Guardar
|
| 49 |
+
joblib.dump(calibrated_model, "modelo_tic.pkl")
|
| 50 |
+
joblib.dump(le_ciiu, "encoder_actividad.pkl")
|
| 51 |
+
print("✅ Modelo y encoder guardados.")
|