{ "cells": [ { "cell_type": "markdown", "id": "a1b2c3d4", "metadata": {}, "source": [ "# EDA: happy_robot_publicpublic.run_events\n", "\n", "Exploratory analysis of Happy Robot AI agent interactions for glass/luna operations (Mutua insurance).\n", "\n", "- 72 rows from BigQuery via Metabase API\n", "- Fields: classification, metrics (duration, messages, filler words), triage/workflow outcomes, center info" ] }, { "cell_type": "markdown", "id": "b1c2d3e4", "metadata": {}, "source": [ "## 1. Setup" ] }, { "cell_type": "code", "execution_count": 2, "id": "c1d2e3f4", "metadata": {}, "outputs": [], "source": [ "import os\n", "import pandas as pd\n", "import numpy as np\n", "import plotly.express as px\n", "import plotly.graph_objects as go\n", "from dotenv import load_dotenv\n", "load_dotenv()\n", "\n", "import sys\n", "sys.path.insert(0, os.path.join(os.environ[\"FN_REGISTRY_ROOT\"], \"python\", \"functions\"))\n", "from metabase.client import MetabaseClient\n", "\n", "client = MetabaseClient(os.environ[\"METABASE_URL\"], os.environ[\"METABASE_API_KEY\"])\n", "\n", "def query_to_df(sql: str) -> pd.DataFrame:\n", " \"\"\"Execute SQL against BigQuery via Metabase API, return DataFrame.\"\"\"\n", " result = client.request('POST', '/api/dataset', json={\n", " 'database': 6, 'type': 'native', 'native': {'query': sql}\n", " })\n", " cols = [c['name'] for c in result['data']['cols']]\n", " return pd.DataFrame(result['data']['rows'], columns=cols)" ] }, { "cell_type": "markdown", "id": "d1e2f3a4", "metadata": {}, "source": [ "## 2. Carga de datos" ] }, { "cell_type": "code", "execution_count": 3, "id": "e1f2a3b4", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Rows: 73, Columns: 42\n" ] }, { "data": { "text/plain": [ "['id',\n", " 'run_id',\n", " 'environment',\n", " 'time',\n", " 'source',\n", " 'center_nav_id',\n", " 'org_name',\n", " 'redirect_reason',\n", " 'created_at',\n", " 'updated_at',\n", " 'glass_operation',\n", " 'last_tool',\n", " 'policy_error',\n", " 'triage_successful',\n", " 'total_errors',\n", " 'classification',\n", " 'quote_no',\n", " 'unnecessary_question_ratio',\n", " 'summary',\n", " 'rgpd',\n", " 'license_plate',\n", " 'zip_code',\n", " 'another_workshop',\n", " 'agent_tone',\n", " 'reasoning',\n", " 'to_number',\n", " 'total_messages',\n", " 'appointment_date',\n", " 'tool_retry',\n", " 'is_garbage',\n", " 'workflow_ok',\n", " 'filler_words',\n", " 'centers_count',\n", " 'redirect_error',\n", " 'relevant_keywords',\n", " 'schedule_preference',\n", " 'agent_total_messages',\n", " 'unnecesary_questions',\n", " 'internal_actions_verbalizations',\n", " 'duration',\n", " 'raw_payload',\n", " 'datastream_metadata']" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df = query_to_df(\"SELECT * FROM happy_robot_publicpublic.run_events\")\n", "print(f\"Rows: {len(df)}, Columns: {len(df.columns)}\")\n", "df.columns.tolist()" ] }, { "cell_type": "code", "execution_count": 4, "id": "f1a2b3c4", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "id int64\n", "run_id str\n", "environment str\n", "time datetime64[us, UTC+02:00]\n", "source str\n", "center_nav_id str\n", "org_name str\n", "redirect_reason str\n", "created_at datetime64[us, UTC+02:00]\n", "updated_at str\n", "glass_operation str\n", "last_tool str\n", "policy_error str\n", "triage_successful str\n", "total_errors float64\n", "classification str\n", "quote_no str\n", "unnecessary_question_ratio float64\n", "summary str\n", "rgpd str\n", "license_plate str\n", "zip_code str\n", "another_workshop str\n", "agent_tone str\n", "reasoning str\n", "to_number str\n", "total_messages float64\n", "appointment_date str\n", "tool_retry float64\n", "is_garbage str\n", "workflow_ok str\n", "filler_words float64\n", "centers_count float64\n", "redirect_error str\n", "relevant_keywords str\n", "schedule_preference str\n", "agent_total_messages float64\n", "unnecesary_questions float64\n", "internal_actions_verbalizations float64\n", "duration int64\n", "raw_payload str\n", "datastream_metadata object\n", "dtype: object" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Cast numeric columns\n", "numeric_cols = [\n", " 'duration', 'total_messages', 'filler_words', 'unnecessary_question_ratio',\n", " 'tool_retry', 'centers_count', 'agent_total_messages',\n", " 'unnecesary_questions', 'internal_actions_verbalizations', 'total_errors'\n", "]\n", "for col in numeric_cols:\n", " if col in df.columns:\n", " df[col] = pd.to_numeric(df[col], errors='coerce')\n", "\n", "# Parse datetime columns\n", "for col in ['time', 'created_at']:\n", " if col in df.columns:\n", " df[col] = pd.to_datetime(df[col], errors='coerce')\n", "\n", "df.dtypes" ] }, { "cell_type": "markdown", "id": "a2b3c4d5", "metadata": {}, "source": [ "## 3. Vista general" ] }, { "cell_type": "code", "execution_count": 5, "id": "b2c3d4e5", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Shape: (73, 42)\n", "\n", "Null counts:\n", "total_errors 73\n", "unnecessary_question_ratio 5\n", "total_messages 5\n", "tool_retry 5\n", "filler_words 5\n", "centers_count 26\n", "agent_total_messages 5\n", "unnecesary_questions 5\n", "internal_actions_verbalizations 5\n", "dtype: int64\n" ] }, { "data": { "text/html": [ "
| \n", " | id | \n", "total_errors | \n", "unnecessary_question_ratio | \n", "total_messages | \n", "tool_retry | \n", "filler_words | \n", "centers_count | \n", "agent_total_messages | \n", "unnecesary_questions | \n", "internal_actions_verbalizations | \n", "duration | \n", "
|---|---|---|---|---|---|---|---|---|---|---|---|
| count | \n", "73.000000 | \n", "0.0 | \n", "68.000000 | \n", "68.000000 | \n", "68.000000 | \n", "68.000000 | \n", "47.000000 | \n", "68.000000 | \n", "68.000000 | \n", "68.000000 | \n", "73.000000 | \n", "
| mean | \n", "37.000000 | \n", "NaN | \n", "0.882353 | \n", "21.602941 | \n", "0.661765 | \n", "1.338235 | \n", "1.510638 | \n", "21.602941 | \n", "0.882353 | \n", "1.500000 | \n", "178.109589 | \n", "
| std | \n", "21.217131 | \n", "NaN | \n", "0.906517 | \n", "12.850623 | \n", "0.839515 | \n", "1.333946 | \n", "1.100836 | \n", "12.850623 | \n", "0.906517 | \n", "1.354925 | \n", "123.508610 | \n", "
| min | \n", "1.000000 | \n", "NaN | \n", "0.000000 | \n", "1.000000 | \n", "0.000000 | \n", "0.000000 | \n", "0.000000 | \n", "1.000000 | \n", "0.000000 | \n", "0.000000 | \n", "0.000000 | \n", "
| 25% | \n", "19.000000 | \n", "NaN | \n", "0.000000 | \n", "9.500000 | \n", "0.000000 | \n", "0.000000 | \n", "0.000000 | \n", "9.500000 | \n", "0.000000 | \n", "0.000000 | \n", "63.000000 | \n", "
| 50% | \n", "37.000000 | \n", "NaN | \n", "1.000000 | \n", "22.000000 | \n", "0.000000 | \n", "1.000000 | \n", "2.000000 | \n", "22.000000 | \n", "1.000000 | \n", "1.000000 | \n", "180.000000 | \n", "
| 75% | \n", "55.000000 | \n", "NaN | \n", "2.000000 | \n", "34.000000 | \n", "1.000000 | \n", "2.000000 | \n", "2.000000 | \n", "34.000000 | \n", "2.000000 | \n", "2.000000 | \n", "274.000000 | \n", "
| max | \n", "73.000000 | \n", "NaN | \n", "3.000000 | \n", "44.000000 | \n", "3.000000 | \n", "6.000000 | \n", "4.000000 | \n", "44.000000 | \n", "3.000000 | \n", "5.000000 | \n", "489.000000 | \n", "
| \n", " | id | \n", "run_id | \n", "environment | \n", "time | \n", "source | \n", "center_nav_id | \n", "org_name | \n", "redirect_reason | \n", "created_at | \n", "updated_at | \n", "... | \n", "centers_count | \n", "redirect_error | \n", "relevant_keywords | \n", "schedule_preference | \n", "agent_total_messages | \n", "unnecesary_questions | \n", "internal_actions_verbalizations | \n", "duration | \n", "raw_payload | \n", "datastream_metadata | \n", "
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | \n", "68 | \n", "4ba565a3-eddd-45a4-b732-cc0b8be35d3c | \n", "staging | \n", "2026-04-17 13:19:12+02:00 | \n", "+34623122972 | \n", "300 | \n", "MutuaMobility | \n", "\n", " | 2026-04-17 13:24:12.589920+02:00 | \n", "2026-04-17T13:24:12.58992+02:00 | \n", "... | \n", "2.0 | \n", "False | \n", "[\"siniestro\",\"lunas\",\"parabrisas\",\"Mutua\",\"pól... | \n", "\n", " | 32.0 | \n", "2.0 | \n", "1.0 | \n", "281 | \n", "{\"agent_tone\":\"amable y cordial\",\"agent_total_... | \n", "{'uuid': '56448836-4328-418b-9b6b-a3dd06a1d22d... | \n", "
| 1 | \n", "64 | \n", "74359e70-6836-4685-8da8-2172e10ca92d | \n", "production | \n", "2026-04-17 11:56:40+02:00 | \n", "+34623122972 | \n", "\n", " | MutuaMobility | \n", "\n", " | 2026-04-17 11:58:51.760255+02:00 | \n", "2026-04-17T11:58:51.760255+02:00 | \n", "... | \n", "NaN | \n", "False | \n", "[\"siniestro\",\"lunas\",\"parabrisas\",\"Mutua\",\"pól... | \n", "\n", " | 15.0 | \n", "0.0 | \n", "0.0 | \n", "118 | \n", "{\"agent_tone\":\"amable y cordial\",\"agent_total_... | \n", "{'uuid': '88022b58-67eb-4463-bfa0-2be495173fa1... | \n", "
| 2 | \n", "63 | \n", "f6b049a9-47b3-4424-a924-296fcaeddcd2 | \n", "production | \n", "2026-04-17 11:51:18+02:00 | \n", "+34623122972 | \n", "\n", " | MutuaMobility | \n", "\n", " | 2026-04-17 11:53:38.300626+02:00 | \n", "2026-04-17T11:53:38.300626+02:00 | \n", "... | \n", "NaN | \n", "False | \n", "[\"siniestro\",\"lunas\",\"sustitución\",\"parabrisas... | \n", "\n", " | 15.0 | \n", "0.0 | \n", "0.0 | \n", "124 | \n", "{\"agent_tone\":\"amable y cordial\",\"agent_total_... | \n", "{'uuid': '4efd8843-d956-4e6e-ab84-879d00aa1af1... | \n", "
| 3 | \n", "62 | \n", "2eb55ebe-e09c-4515-a7f8-c4651cf494a7 | \n", "staging | \n", "2026-04-16 21:52:23+02:00 | \n", "+34616559883 | \n", "300 | \n", "MutuaMobility | \n", "\n", " | 2026-04-16 21:57:54.343005+02:00 | \n", "2026-04-16T21:57:54.343005+02:00 | \n", "... | \n", "2.0 | \n", "False | \n", "[\"siniestro\",\"lunas\",\"parabrisas\",\"Mutua\",\"tal... | \n", "pm | \n", "38.0 | \n", "2.0 | \n", "4.0 | \n", "314 | \n", "{\"agent_tone\":\"amable y cordial\",\"agent_total_... | \n", "{'uuid': 'ce94625c-8d4b-4547-b0e6-b0589f89281d... | \n", "
| 4 | \n", "27 | \n", "1055d527-b3ef-4024-b3b8-86680c8e2098 | \n", "staging | \n", "2026-04-13 12:13:22+02:00 | \n", "+34618360645 | \n", "\n", " | MutuaMobility | \n", "\n", " | 2026-04-13 12:13:33.123887+02:00 | \n", "2026-04-13T12:13:33.123887+02:00 | \n", "... | \n", "NaN | \n", "\n", " | \n", " | \n", " | NaN | \n", "NaN | \n", "NaN | \n", "0 | \n", "{\"agent_tone\":\"\",\"agent_total_messages\":\"\",\"an... | \n", "{'uuid': 'b8866ca2-e57e-4962-9fb3-fdad80c915ff... | \n", "
| 5 | \n", "46 | \n", "47e2a834-ba61-4832-b396-b149a8cb4e34 | \n", "staging | \n", "2026-04-15 08:25:55+02:00 | \n", "+34658124349 | \n", "\n", " | MutuaMobility | \n", "\n", " | 2026-04-15 08:26:04.638077+02:00 | \n", "2026-04-15T08:26:04.638077+02:00 | \n", "... | \n", "NaN | \n", "\n", " | \n", " | \n", " | NaN | \n", "NaN | \n", "NaN | \n", "0 | \n", "{\"agent_tone\":\"\",\"agent_total_messages\":\"\",\"an... | \n", "{'uuid': '9abf5574-5300-49f6-9e8b-5e3b8eb7fb87... | \n", "
| 6 | \n", "1 | \n", "\n", " | development | \n", "2026-04-07 17:38:09+02:00 | \n", "+12345678902 | \n", "test_center_nav_id_value | \n", "MutuaMobility | \n", "otros | \n", "2026-04-07 17:38:09.573068+02:00 | \n", "2026-04-07T17:38:09.573068+02:00 | \n", "... | \n", "NaN | \n", "\n", " | \n", " | \n", " | NaN | \n", "NaN | \n", "NaN | \n", "0 | \n", "{\"agent_tone\":\"\",\"agent_total_messages\":\"\",\"an... | \n", "{'uuid': 'da8244e7-eff5-4c53-8977-b4e4a759948e... | \n", "
| 7 | \n", "34 | \n", "835d8e35-1439-4706-ba17-3c3b8fe7199c | \n", "staging | \n", "2026-04-14 13:27:32+02:00 | \n", "+34615420380 | \n", "\n", " | MutuaMobility | \n", "\n", " | 2026-04-14 13:27:40.198534+02:00 | \n", "2026-04-14T13:27:40.198534+02:00 | \n", "... | \n", "NaN | \n", "\n", " | \n", " | \n", " | NaN | \n", "NaN | \n", "NaN | \n", "0 | \n", "{\"agent_tone\":\"\",\"agent_total_messages\":\"\",\"an... | \n", "{'uuid': 'a6923276-15cd-40ad-9465-b543a547378f... | \n", "
| 8 | \n", "8 | \n", "85dce09b-7604-46fa-adc0-53511bc569f6 | \n", "staging | \n", "2026-04-09 11:28:28+02:00 | \n", "+34666551751 | \n", "\n", " | MutuaMobility | \n", "\n", " | 2026-04-09 11:29:01.733635+02:00 | \n", "2026-04-09T11:29:01.733635+02:00 | \n", "... | \n", "NaN | \n", "False | \n", "[\"Mutua\",\"lunas\",\"asistente virtual\",\"agente h... | \n", "\n", " | 1.0 | \n", "0.0 | \n", "0.0 | \n", "15 | \n", "{\"agent_tone\":\"amable y cordial\",\"agent_total_... | \n", "{'uuid': '4c289375-6746-4b1c-b190-2ca27a2c70f9... | \n", "
| 9 | \n", "38 | \n", "7ccb8a2c-6ed0-493d-b9c5-10dea391cefb | \n", "staging | \n", "2026-04-14 17:24:52+02:00 | \n", "+34624510247 | \n", "\n", " | MutuaMobility | \n", "\n", " | 2026-04-14 17:25:32.307490+02:00 | \n", "2026-04-14T17:25:32.30749+02:00 | \n", "... | \n", "NaN | \n", "False | \n", "[\"Mutua\",\"lunas\",\"asistente virtual\",\"agente h... | \n", "\n", " | 1.0 | \n", "0.0 | \n", "0.0 | \n", "18 | \n", "{\"agent_tone\":\"amable y cordial\",\"agent_total_... | \n", "{'uuid': '7a3610b6-108b-459e-9b69-0155d1a23da8... | \n", "
10 rows × 42 columns
\n", "