Files
turismo_spain/notebooks/03_informe_mercado_espana.ipynb
T
fn-registry agent ea833af54c chore: initial sync
2026-04-28 22:13:09 +02:00

534 lines
23 KiB
Plaintext

{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Turismo Internacional en Espana: Analisis de Mercado 2025\n",
"\n",
"**Documento de soporte para la propuesta de app de turismo**\n",
"\n",
"Fuentes: INE (FRONTUR/EGATUR), Ministerio de Industria y Turismo, Turespaña, Skyscanner, Dataestur\n",
"\n",
"---"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"tags": [
"hide-input"
]
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Datos cargados correctamente\n"
]
}
],
"source": [
"import pandas as pd\n",
"import matplotlib\n",
"matplotlib.use('Agg')\n",
"import matplotlib.pyplot as plt\n",
"import matplotlib.ticker as mticker\n",
"from pathlib import Path\n",
"import os\n",
"import warnings\n",
"warnings.filterwarnings('ignore')\n",
"\n",
"plt.rcParams.update({\n",
" 'figure.figsize': (10, 5),\n",
" 'figure.dpi': 150,\n",
" 'font.size': 11,\n",
" 'axes.titlesize': 14,\n",
" 'axes.titleweight': 'bold',\n",
" 'axes.grid': True,\n",
" 'grid.alpha': 0.3,\n",
" 'figure.facecolor': 'white',\n",
"})\n",
"\n",
"FN_ROOT = Path(os.environ.get('FN_REGISTRY_ROOT', '')).resolve() if os.environ.get('FN_REGISTRY_ROOT') else Path.home() / 'fn_registry'\n",
"VAULT = FN_ROOT / 'vaults' / 'turismo_spain'\n",
"RAW = VAULT / 'raw'\n",
"FUENTES = RAW / 'turismo-espana-2025' / 'fuentes'\n",
"\n",
"COLORS = ['#2563EB', '#DC2626', '#059669', '#D97706', '#7C3AED', '#DB2777', '#0891B2', '#65A30D', '#EA580C', '#4F46E5']\n",
"print('Datos cargados correctamente')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 1. Record historico: 96.8 millones de turistas\n",
"\n",
"Espana alcanzo en 2025 un maximo historico de **96.8 millones de turistas internacionales**, superando en un 15.9% los niveles pre-pandemia de 2019 (83.5M). El gasto asociado llego a **134.710 millones de euros** (+6.8% interanual).\n",
"\n",
"Este crecimiento sostenido confirma que Espana se consolida como segundo destino mundial, solo por detras de Francia."
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"serie = pd.read_csv(FUENTES / '06_FRONTUR_serie_historica_anual.csv')\n",
"\n",
"fig, ax = plt.subplots(figsize=(10, 5))\n",
"colors = ['#2563EB' if a != 2025 else '#DC2626' for a in serie['anio']]\n",
"bars = ax.bar(serie['anio'].astype(str), serie['turistas_millones'], color=colors, edgecolor='white', linewidth=0.5)\n",
"\n",
"for bar, val in zip(bars, serie['turistas_millones']):\n",
" ax.text(bar.get_x() + bar.get_width()/2, bar.get_height() + 1, f'{val}M',\n",
" ha='center', va='bottom', fontweight='bold', fontsize=11)\n",
"\n",
"ax.set_title('Turistas internacionales en Espana (millones)', pad=15)\n",
"ax.set_ylabel('Millones')\n",
"ax.set_ylim(0, 115)\n",
"ax.spines['top'].set_visible(False)\n",
"ax.spines['right'].set_visible(False)\n",
"\n",
"# Annotate COVID\n",
"ax.annotate('COVID-19', xy=('2020', 18.9), xytext=('2020', 40),\n",
" arrowprops=dict(arrowstyle='->', color='gray'), ha='center', color='gray', fontsize=10)\n",
"ax.annotate('RECORD', xy=('2025', 96.8), xytext=('2025', 108),\n",
" ha='center', color='#DC2626', fontweight='bold', fontsize=11)\n",
"\n",
"plt.tight_layout()\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 2. Mercados emisores: de donde vienen los turistas\n",
"\n",
"Los cinco principales mercados emisores concentran el **56.6% del total**. Reino Unido lidera con 19.1M, seguido de Francia (12.8M) y Alemania (12.0M).\n",
"\n",
"**Dato clave para la app:** estos cinco paises (UK, FR, DE, IT, Nordicos) son exactamente los idiomas que debe soportar el MVP. Con ingles, frances, aleman, italiano y neerlandes se cubre al **62% de los turistas**."
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [],
"source": [
"paises = pd.read_csv(FUENTES / '01_FRONTUR_2025_anual_paises.csv')\n",
"p = paises[paises['pais'] != 'TOTAL'].sort_values('turistas_millones', ascending=True)\n",
"\n",
"fig, ax = plt.subplots(figsize=(10, 6))\n",
"c = ['#DC2626' if v > 3 else '#2563EB' if v > 0 else '#9CA3AF' for v in p['variacion_anual_pct']]\n",
"bars = ax.barh(p['pais'], p['turistas_millones'], color=c, edgecolor='white', linewidth=0.5)\n",
"\n",
"for bar, (_, row) in zip(bars, p.iterrows()):\n",
" signo = '+' if row['variacion_anual_pct'] > 0 else ''\n",
" ax.text(bar.get_width() + 0.2, bar.get_y() + bar.get_height()/2,\n",
" f\"{row['turistas_millones']}M ({signo}{row['variacion_anual_pct']}%)\",\n",
" va='center', fontsize=9)\n",
"\n",
"ax.set_title('Turistas por pais de origen — 2025', pad=15)\n",
"ax.set_xlabel('Millones de turistas')\n",
"ax.set_xlim(0, 24)\n",
"ax.spines['top'].set_visible(False)\n",
"ax.spines['right'].set_visible(False)\n",
"\n",
"from matplotlib.patches import Patch\n",
"ax.legend([Patch(fc='#DC2626'), Patch(fc='#2563EB'), Patch(fc='#9CA3AF')],\n",
" ['Crece > 3%', 'Crece 0-3%', 'Decrece'], loc='lower right', framealpha=0.9)\n",
"\n",
"plt.tight_layout()\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 3. Estacionalidad: oportunidad de desestacionalizacion\n",
"\n",
"La distribucion mensual muestra una concentracion extrema en verano (julio-agosto: 22.3M, el 23% del total). Los meses de invierno (noviembre-febrero) apenas suman 20.7M.\n",
"\n",
"**Oportunidad para la app:** las comunidades autonomas necesitan desestacionalizar. Una app que recomiende destinos de interior, rutas gastro y experiencias culturales fuera de temporada alta es un aliado natural para las oficinas de turismo regionales — y un canal de monetizacion B2G."
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Concentracion jul-ago: 22.3M = 23% del total anual\n"
]
}
],
"source": [
"mensual = pd.read_csv(FUENTES / '04_FRONTUR_2025_mensual.csv')\n",
"\n",
"fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(12, 5))\n",
"\n",
"# Barras mensuales\n",
"c = ['#DC2626' if v > 10 else '#D97706' if v > 8 else '#2563EB' for v in mensual['turistas_millones']]\n",
"ax1.bar(mensual['mes'].str[:3], mensual['turistas_millones'], color=c, edgecolor='white')\n",
"ax1.set_title('Llegadas mensuales 2025 (M)', pad=10)\n",
"ax1.set_ylabel('Millones')\n",
"ax1.tick_params(axis='x', rotation=45)\n",
"ax1.spines['top'].set_visible(False)\n",
"ax1.spines['right'].set_visible(False)\n",
"\n",
"# Variacion interanual\n",
"c2 = ['#059669' if v > 3 else '#2563EB' if v > 0 else '#DC2626' for v in mensual['variacion_anual_pct']]\n",
"ax2.bar(mensual['mes'].str[:3], mensual['variacion_anual_pct'], color=c2, edgecolor='white')\n",
"ax2.set_title('Variacion interanual mensual (%)', pad=10)\n",
"ax2.set_ylabel('%')\n",
"ax2.axhline(y=0, color='gray', linewidth=0.5)\n",
"ax2.tick_params(axis='x', rotation=45)\n",
"ax2.spines['top'].set_visible(False)\n",
"ax2.spines['right'].set_visible(False)\n",
"\n",
"plt.tight_layout()\n",
"plt.show()\n",
"\n",
"print(f'Concentracion jul-ago: {mensual[mensual[\"mes\"].isin([\"Julio\",\"Agosto\"])][\"turistas_millones\"].sum():.1f}M = '\n",
" f'{mensual[mensual[\"mes\"].isin([\"Julio\",\"Agosto\"])][\"turistas_millones\"].sum()/96.8*100:.0f}% del total anual')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 4. Destinos: sobreturismo en la costa, oportunidad en el interior\n",
"\n",
"Cuatro CCAA costeras concentran el **65.2% de todos los turistas**: Cataluna (20.1M), Baleares (15.7M), Canarias (15.7M) y Andalucia (14.5M).\n",
"\n",
"Pero el dato revelador es el **crecimiento desigual**: Andalucia crece al +6.6% mientras Cataluna apenas al +0.6%. El turista busca cada vez mas destinos alternativos.\n",
"\n",
"**Dato clave para la app:** el tercer pilar (descubrimiento \"fuera del radar\") responde a una tendencia real y medible. Los datos de hoteles del INE muestran que ciudades como Algeciras (+35%), Badajoz (+30%), Murcia (+24%) y Malaga (+17%) crecen muy por encima de Barcelona (+0.6%)."
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [],
"source": [
"ccaa = pd.read_csv(FUENTES / '03_FRONTUR_2025_destino_ccaa.csv')\n",
"cc = ccaa[ccaa['ccaa'] != 'TOTAL'].sort_values('turistas_millones', ascending=True)\n",
"\n",
"fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(12, 5))\n",
"\n",
"# Volumen\n",
"colors_ccaa = ['#059669' if v > 3.2 else '#2563EB' for v in cc['variacion_anual_pct']]\n",
"ax1.barh(cc['ccaa'], cc['turistas_millones'], color=colors_ccaa, edgecolor='white')\n",
"for i, (_, row) in enumerate(cc.iterrows()):\n",
" ax1.text(row['turistas_millones'] + 0.3, i, f\"{row['turistas_millones']}M\", va='center', fontsize=9)\n",
"ax1.set_title('Turistas por CCAA destino (M)', pad=10)\n",
"ax1.set_xlim(0, 25)\n",
"ax1.spines['top'].set_visible(False)\n",
"ax1.spines['right'].set_visible(False)\n",
"\n",
"# Crecimiento\n",
"cc_sort = cc.sort_values('variacion_anual_pct', ascending=True)\n",
"c_crec = ['#059669' if v > 3.2 else '#D97706' if v > 0 else '#DC2626' for v in cc_sort['variacion_anual_pct']]\n",
"ax2.barh(cc_sort['ccaa'], cc_sort['variacion_anual_pct'], color=c_crec, edgecolor='white')\n",
"ax2.axvline(x=3.2, color='gray', linestyle='--', linewidth=0.8, label='Media nacional (3.2%)')\n",
"for i, (_, row) in enumerate(cc_sort.iterrows()):\n",
" ax2.text(row['variacion_anual_pct'] + 0.2, i, f\"+{row['variacion_anual_pct']}%\", va='center', fontsize=9)\n",
"ax2.set_title('Crecimiento interanual (%)', pad=10)\n",
"ax2.legend(fontsize=8)\n",
"ax2.spines['top'].set_visible(False)\n",
"ax2.spines['right'].set_visible(False)\n",
"\n",
"plt.tight_layout()\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 5. Gasto turistico: quien gasta mas\n",
"\n",
"El gasto medio por turista varia enormemente segun el pais de origen. Los turistas estadounidenses gastan **1.511 EUR** de media, un 72% mas que los franceses (907 EUR).\n",
"\n",
"**Dato clave para la app:** priorizar la experiencia en ingles no solo cubre al mayor mercado (UK 19.1M) sino al de mayor gasto medio (USA 1.511 EUR/turista). El ingles cubre los dos segmentos de mayor valor."
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [],
"source": [
"gasto = pd.read_csv(FUENTES / '05_EGATUR_2025_gasto_paises.csv')\n",
"g = gasto[~gasto['pais'].isin(['TOTAL', 'Resto'])].dropna(subset=['gasto_medio_por_turista_eur_aprox'])\n",
"g = g.sort_values('gasto_medio_por_turista_eur_aprox', ascending=True)\n",
"\n",
"fig, ax = plt.subplots(figsize=(10, 6))\n",
"c = ['#DC2626' if v > 1200 else '#D97706' if v > 900 else '#2563EB' for v in g['gasto_medio_por_turista_eur_aprox']]\n",
"bars = ax.barh(g['pais'], g['gasto_medio_por_turista_eur_aprox'], color=c, edgecolor='white')\n",
"\n",
"for bar, (_, row) in zip(bars, g.iterrows()):\n",
" ax.text(bar.get_width() + 20, bar.get_y() + bar.get_height()/2,\n",
" f\"{int(row['gasto_medio_por_turista_eur_aprox'])} EUR | Total: {int(row['gasto_total_millones_eur']):,}M\",\n",
" va='center', fontsize=9)\n",
"\n",
"ax.set_title('Gasto medio por turista segun pais de origen — 2025', pad=15)\n",
"ax.set_xlabel('EUR / turista')\n",
"ax.set_xlim(0, 1900)\n",
"ax.spines['top'].set_visible(False)\n",
"ax.spines['right'].set_visible(False)\n",
"\n",
"plt.tight_layout()\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 6. Alojamiento: la necesidad del offline-first\n",
"\n",
"El 65% de los turistas se aloja en hoteles, pero el segmento de **vivienda de alquiler crece al +5.3%** y la **vivienda propia al +8.5%**. Estos turistas estan fuera del circuito hotelero — no tienen un recepcionista que les recomiende que hacer.\n",
"\n",
"Ademas, el 16.5% se aloja con familiares o en vivienda propia, muchas veces en **zonas rurales o costeras con mala cobertura movil**.\n",
"\n",
"**Dato clave para la app:** el pilar offline-first no es un nice-to-have, es una necesidad real para ~16M turistas anuales que estan en zonas sin cobertura fiable."
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Turistas FUERA de hoteles: 33,631,848 (34.8%) — publico objetivo para offline-first\n"
]
}
],
"source": [
"aloj = pd.read_csv(FUENTES / '07_FRONTUR_2025_alojamiento.csv')\n",
"a = aloj[aloj['tipo_alojamiento'].str.contains(' - ') & ~aloj['tipo_alojamiento'].str.contains('Total')].copy()\n",
"a['tipo'] = a['tipo_alojamiento'].str.split(' - ').str[-1]\n",
"a['pct'] = a['turistas_acum2025'] / 96770515 * 100\n",
"a = a.sort_values('turistas_acum2025', ascending=False)\n",
"\n",
"fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(12, 5))\n",
"\n",
"# Pie\n",
"wedges, texts, autotexts = ax1.pie(a['turistas_acum2025'], labels=a['tipo'],\n",
" autopct='%1.1f%%', colors=COLORS[:len(a)], startangle=90, textprops={'fontsize': 9})\n",
"ax1.set_title('Tipo de alojamiento 2025', pad=15)\n",
"\n",
"# Crecimiento\n",
"a_sort = a.sort_values('variacion_anual_pct', ascending=True)\n",
"c = ['#059669' if v > 3 else '#2563EB' for v in a_sort['variacion_anual_pct']]\n",
"ax2.barh(a_sort['tipo'], a_sort['variacion_anual_pct'], color=c, edgecolor='white')\n",
"for i, (_, row) in enumerate(a_sort.iterrows()):\n",
" ax2.text(row['variacion_anual_pct'] + 0.2, i, f\"+{row['variacion_anual_pct']}%\", va='center', fontsize=9)\n",
"ax2.set_title('Crecimiento interanual por tipo (%)', pad=10)\n",
"ax2.spines['top'].set_visible(False)\n",
"ax2.spines['right'].set_visible(False)\n",
"\n",
"plt.tight_layout()\n",
"plt.show()\n",
"\n",
"no_hotel = a[a['tipo'] != 'Hotelero']['turistas_acum2025'].sum()\n",
"print(f'Turistas FUERA de hoteles: {no_hotel:,.0f} ({no_hotel/96770515*100:.1f}%) — publico objetivo para offline-first')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 7. Satisfaccion y motivaciones: por que eligen Espana\n",
"\n",
"El **97% de los turistas se declaran satisfechos** y el 69% tiene intencion de volver en 12 meses. Los turistas latinoamericanos son los mas satisfechos (Mexico 79.5%, Brasil 79.4% de \"muy satisfechos\").\n",
"\n",
"Las motivaciones principales son **clima (26%), cultura (15.7%) y visita a familiares (12.6%)**. Pero lo mas relevante es la evolucion: los motivos culturales han crecido **+32% vs 2019** y los gastronomicos **+28%**.\n",
"\n",
"**Dato clave para la app:** el turista de 2025 ya no busca solo sol y playa. Busca experiencias autenticas, gastronomia local y cultura. Exactamente lo que una app con datos curados de pueblos, mercados, fiestas y chiringuitos puede ofrecer — y lo que TripAdvisor/Wanderlog no cubren."
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [],
"source": [
"satis = pd.read_csv(FUENTES / '09_satisfaccion_por_pais.csv')\n",
"s = satis[satis['pct_muy_satisfechos'].notna() & ~satis['pais_origen'].str.contains('intencion')]\n",
"s = s.sort_values('pct_muy_satisfechos', ascending=True)\n",
"\n",
"fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(12, 5))\n",
"\n",
"# Satisfaccion por pais\n",
"ax1.barh(s['pais_origen'], s['pct_muy_satisfechos'], color='#059669', edgecolor='white')\n",
"for i, (_, row) in enumerate(s.iterrows()):\n",
" ax1.text(row['pct_muy_satisfechos'] + 0.5, i, f\"{row['pct_muy_satisfechos']}%\", va='center', fontsize=9)\n",
"ax1.set_title('% Muy satisfechos por pais', pad=10)\n",
"ax1.set_xlim(65, 85)\n",
"ax1.spines['top'].set_visible(False)\n",
"ax1.spines['right'].set_visible(False)\n",
"\n",
"# Evolucion motivaciones\n",
"motiv_data = {'Cultural': 32, 'Gastronomico': 28, 'Media general': 10}\n",
"ax2.barh(list(motiv_data.keys()), list(motiv_data.values()),\n",
" color=['#7C3AED', '#D97706', '#9CA3AF'], edgecolor='white')\n",
"for i, (k, v) in enumerate(motiv_data.items()):\n",
" ax2.text(v + 0.5, i, f'+{v}%', va='center', fontweight='bold', fontsize=11)\n",
"ax2.set_title('Crecimiento motivaciones vs 2019 (%)', pad=10)\n",
"ax2.spines['top'].set_visible(False)\n",
"ax2.spines['right'].set_visible(False)\n",
"\n",
"plt.tight_layout()\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 8. Ciudades emergentes: la dispersion del turismo\n",
"\n",
"Los datos del INE (Encuesta de Ocupacion Hotelera) por municipio revelan que las ciudades con mayor crecimiento de turismo extranjero en 2025 **no son los destinos clasicos**, sino ciudades de segundo nivel:"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [],
"source": [
"df = pd.read_csv(RAW / 'ine_2078_viajeros_puntos_turisticos.csv', sep=';', encoding='utf-8-sig')\n",
"df[['cod', 'ciudad']] = df['Puntos turísticos'].str.extract(r'^(\\d+)\\s+(.*)')\n",
"df['anio'] = df['Periodo'].str[:4].astype(int)\n",
"df['valor'] = pd.to_numeric(df['Total'].str.replace('.', '', regex=False), errors='coerce')\n",
"\n",
"ext = df[(df['Residencia'] == 'Residentes en el Extranjero') & (df['Viajeros y pernoctaciones'] == 'Viajero')]\n",
"anual = ext.groupby(['ciudad', 'anio'])['valor'].sum().reset_index()\n",
"piv = anual.pivot(index='ciudad', columns='anio', values='valor')\n",
"\n",
"crec = pd.DataFrame({'y2024': piv[2024], 'y2025': piv[2025]}).dropna()\n",
"crec['pct'] = ((crec['y2025'] / crec['y2024']) - 1) * 100\n",
"crec = crec[crec['y2024'] > 10000].sort_values('pct', ascending=True)\n",
"\n",
"top15 = crec.tail(15)\n",
"\n",
"fig, ax = plt.subplots(figsize=(10, 6))\n",
"c = ['#DC2626' if v > 20 else '#D97706' if v > 10 else '#2563EB' for v in top15['pct']]\n",
"ax.barh(top15.index, top15['pct'], color=c, edgecolor='white')\n",
"\n",
"for i, (ciudad, row) in enumerate(top15.iterrows()):\n",
" ax.text(row['pct'] + 0.5, i, f\"+{row['pct']:.0f}% ({row['y2025']:,.0f})\", va='center', fontsize=9)\n",
"\n",
"ax.set_title('Top 15 ciudades con mayor crecimiento de turismo extranjero (2024→2025)', pad=15)\n",
"ax.set_xlabel('Crecimiento %')\n",
"ax.spines['top'].set_visible(False)\n",
"ax.spines['right'].set_visible(False)\n",
"\n",
"plt.tight_layout()\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 9. Imagen de Espana: los atributos que el turista valora\n",
"\n",
"Segun los estudios de mercado de Turespaña, la imagen de Espana entre los turistas se define por estos atributos:"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"imagen = pd.read_csv(FUENTES / '13_imagen_espana_mercados.csv')\n",
"\n",
"rel_map = {'alta': 3, 'alta y creciente': 3.5, 'creciente': 2, 'emergente': 1}\n",
"imagen['score'] = imagen['relevancia'].map(rel_map).fillna(2)\n",
"imagen = imagen.sort_values('score', ascending=True)\n",
"\n",
"fig, ax = plt.subplots(figsize=(10, 5))\n",
"c = ['#059669' if 'creciente' in str(r) else '#2563EB' if r == 'alta' else '#D97706' for r in imagen['relevancia']]\n",
"ax.barh(imagen['atributo'], imagen['score'], color=c, edgecolor='white')\n",
"\n",
"for i, (_, row) in enumerate(imagen.iterrows()):\n",
" ax.text(row['score'] + 0.05, i, f\"[{row['relevancia']}]\", va='center', fontsize=9, style='italic')\n",
"\n",
"ax.set_title('Imagen de Espana en mercados emisores (Turespaña 2024-25)', pad=15)\n",
"ax.set_xlim(0, 4.5)\n",
"ax.set_xticks([])\n",
"ax.spines['top'].set_visible(False)\n",
"ax.spines['right'].set_visible(False)\n",
"ax.spines['bottom'].set_visible(False)\n",
"\n",
"from matplotlib.patches import Patch\n",
"ax.legend([Patch(fc='#059669'), Patch(fc='#2563EB'), Patch(fc='#D97706')],\n",
" ['Creciente', 'Alta (estable)', 'Emergente'], loc='lower right', framealpha=0.9)\n",
"\n",
"plt.tight_layout()\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 10. Cifras clave — Resumen ejecutivo\n",
"\n",
"| Metrica | Valor 2025 | Relevancia para la app |\n",
"|---------|-----------|------------------------|\n",
"| Turistas internacionales | **96.8M** (+3.2%) | Mercado masivo y en crecimiento |\n",
"| Gasto total | **134.710M EUR** (+6.8%) | Alta disposicion de gasto |\n",
"| Gasto medio/turista | **1.391 EUR** | Segmento de alto valor |\n",
"| Top 5 emisores (UK+FR+DE+IT+Nordicos) | **56.6% del total** | Cinco idiomas cubren la mayoria |\n",
"| USA gasto medio | **1.511 EUR/turista** | Mercado anglofono de altisimo valor |\n",
"| Turistas fuera de hotel | **33.6M** (34.7%) | Necesitan guia — no tienen recepcionista |\n",
"| Alojamiento alquiler | **+5.3% crecimiento** | Segmento en expansion sin atencion |\n",
"| Motivos culturales | **+32% vs 2019** | El turista busca experiencias, no solo playa |\n",
"| Motivos gastronomicos | **+28% vs 2019** | Gastronomia es diferenciador clave |\n",
"| Satisfaccion | **97%** satisfechos | Alta lealtad — 69% repite en 12 meses |\n",
"| Cataluna crecimiento | **+0.6%** | Saturacion de destinos clasicos |\n",
"| Andalucia crecimiento | **+6.6%** | Destinos emergentes en alza |\n",
"| Algeciras/Badajoz/Murcia | **+24-35%** | Ciudades secundarias explotan |\n",
"\n",
"---\n",
"\n",
"*Informe generado automaticamente a partir de datos oficiales INE/FRONTUR/EGATUR/Turespaña.*\n",
"\n",
"*Fecha: Abril 2026*"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3 (ipykernel)",
"language": "python",
"name": "python3"
},
"language_info": {
"name": "python",
"version": "3.13.0"
}
},
"nbformat": 4,
"nbformat_minor": 4
}