{ "cells": [ { "cell_type": "markdown", "id": "f9464d1e", "metadata": {}, "source": [ "# UD01 · Notebook 1 — Técnicas de IA en acción\n", "\n", "Este notebook muestra en código **las técnicas básicas de la IA** (RA1-c) y cómo se relacionan\n", "con la **mejora de la eficiencia operativa** (RA1-d). Usa únicamente `numpy`, `pandas` y\n", "`scikit-learn`.\n", "\n", "## Objetivos\n", "\n", "1. Ver un ejemplo de **aprendizaje supervisado** (clasificación).\n", "2. Ver un ejemplo de **aprendizaje no supervisado** (segmentación).\n", "3. Ver un ejemplo de **PLN** básico (análisis de opiniones).\n", "4. Ver un ejemplo de **sistema experto** con reglas.\n", "5. Pensar qué técnica usarías en cada caso de negocio." ] }, { "cell_type": "code", "execution_count": null, "id": "7f5063d1", "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "import pandas as pd\n", "from sklearn.neighbors import KNeighborsClassifier\n", "from sklearn.cluster import KMeans\n", "from sklearn.feature_extraction.text import CountVectorizer\n", "from sklearn.naive_bayes import MultinomialNB\n", "\n", "np.random.seed(42)\n", "print(\"Bibliotecas cargadas\")" ] }, { "cell_type": "markdown", "id": "cc33c290", "metadata": {}, "source": [ "## 1. Aprendizaje supervisado: ¿reclamará este cliente?\n", "\n", "Una empresa quiere anticipar qué clientes van a reclamar, para priorizar su atención\n", "(menos tiempo, menos coste). Entrenamos un clasificador con datos etiquetados." ] }, { "cell_type": "code", "execution_count": null, "id": "29a36ec0", "metadata": {}, "outputs": [], "source": [ "X = np.array([[1, 2], [2, 1], [4, 4], [5, 6], [1, 5], [6, 4]])\n", "y = np.array([0, 0, 1, 1, 0, 1]) # 1 = reclamará\n", "\n", "modelo = KNeighborsClassifier(n_neighbors=3)\n", "modelo.fit(X, y)\n", "print(\"Predicción cliente (2.0, 3.0):\", modelo.predict([[2.0, 3.0]])[0])\n", "print(\"Predicción cliente (5.0, 5.0):\", modelo.predict([[5.0, 5.0]])[0])" ] }, { "cell_type": "markdown", "id": "4e14b1c0", "metadata": {}, "source": [ "## 2. Aprendizaje no supervisado: segmentar clientes\n", "\n", "Sin etiquetas, `k-means` agrupa clientes por comportamiento para personalizar ofertas\n", "(menos coste de marketing, más ventas)." ] }, { "cell_type": "code", "execution_count": null, "id": "64d11788", "metadata": {}, "outputs": [], "source": [ "compras = np.array([[30, 2], [32, 3], [31, 2], [80, 9], [85, 10], [82, 8]])\n", "\n", "km = KMeans(n_clusters=2, n_init=10, random_state=42)\n", "etiquetas = km.fit_predict(compras)\n", "\n", "df = pd.DataFrame({\"importe\": compras[:, 0], \"pedidos\": compras[:, 1], \"segmento\": etiquetas})\n", "df" ] }, { "cell_type": "markdown", "id": "b8adaaaa", "metadata": {}, "source": [ "## 3. PLN básico: analizar opiniones\n", "\n", "Convertimos texto en números (bolsa de palabras) y entrenamos un clasificador de\n", "**sentimiento**. Es el tipo de IA que usa un comercio para medir la satisfacción." ] }, { "cell_type": "code", "execution_count": null, "id": "866e3de9", "metadata": {}, "outputs": [], "source": [ "textos = [\n", " \"el envío llegó rápido y perfecto\",\n", " \"me encanta la calidad de este producto\",\n", " \"el pedido tardó muchísimo\",\n", " \"producto roto y sin reembolso\",\n", "]\n", "opinion = [1, 1, 0, 0]\n", "\n", "vector = CountVectorizer()\n", "X_bow = vector.fit_transform(textos)\n", "\n", "nb = MultinomialNB()\n", "nb.fit(X_bow, opinion)\n", "\n", "frase = [\"llega rápido y bien embalado\"]\n", "pred = nb.predict(vector.transform(frase))[0]\n", "print(\"Sentimiento de la opinión:\", \"positivo\" if pred else \"negativo\")" ] }, { "cell_type": "markdown", "id": "cf07b44b", "metadata": {}, "source": [ "## 4. Sistema experto con reglas\n", "\n", "Un **sistema experto** codifica el conocimiento de un experto en forma de reglas\n", "`si... entonces...`. Ejemplo: recomendar un plan de soporte según el perfil del cliente." ] }, { "cell_type": "code", "execution_count": null, "id": "6360ade2", "metadata": {}, "outputs": [], "source": [ "def recomendar_plan(ventas, reclamaciones):\n", " if ventas > 100 and reclamaciones < 5:\n", " return \"VIP\"\n", " if ventas > 50:\n", " return \"Premium\"\n", " if reclamaciones > 10:\n", " return \"Atención especial\"\n", " return \"Estándar\"\n", "\n", "for ventas, reclam in [(150, 2), (70, 4), (30, 12), (10, 1)]:\n", " print(f\"ventas={ventas:>3}, reclamaciones={reclam:>2} -> {recomendar_plan(ventas, reclam)}\")" ] }, { "cell_type": "markdown", "id": "3e46b196", "metadata": {}, "source": [ "## 5. Actividad\n", "\n", "Responde en celdas Markdown:\n", "\n", "1. ¿Qué técnica usarías para **detectar fraudes** en tarjetas (datos históricos etiquetados)?\n", "2. ¿Y para **agrupar tiendas** por volumen de ventas sin etiquetas?\n", "3. Elige un proceso de tu entorno (clase, centro, trabajo) y propón una **interacción nueva**\n", " (chatbot, voz, visión) que mejore su eficiencia operativa: indica qué técnica de las vistas usaría.\n", "\n", "Guarda el notebook con tus respuestas y **entrégalo en Moodle** como parte de la tarea RA1." ] }, { "cell_type": "code", "execution_count": null, "id": "6f88ac92", "metadata": {}, "outputs": [], "source": [ "print(\"Fin del notebook UD01\")" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "name": "python", "version": "3.12" } }, "nbformat": 4, "nbformat_minor": 5 }