Saltar navegación

Aplicación en IA

Aplicación práctica en IA

As actividades anteriores, aínda que parecen centrarse só en análise de datos ou gráficos, teñen unha relación moi importante coa intelixencia artificial (IA) porque

a base da IA é o manexo, análise e comprensión de datos.

As librerías Matplotlib e Seaborn vanche servir en IA para:

  • Visualización de Datos
  • Exploración e Preprocesamiento de Datos
  • Atopar variables Relevantes para Modelos
  • Introdución a Técnicas Estatísticas

Aínda que ata agora estamos a traballar na visualización e comprensión de datos, estes pasos son a antesala da IA

Exemplos de aplicación de Matplotlib e Seaborn en IA

Exemplo 1:Rendemento de estudantes

Resultado exemplo
Creación propia. Resultado do exemplo (CC BY-SA)

Código Python: Rendemento de estudantes

import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

# Crear o DataFrame con datos
datos = pd.DataFrame({
    'Estudante': [f'Estudante {i+1}' for i in range(24)],
    'Matemáticas': [8, 5, 7, 3, 10, 6, 4, 9, 2, 5, 7, 3, 6, 8, 5, 4, 3, 2, 9, 7, 6, 4, 5, 8],
    'Ciencias': [7, 4, 6, 2, 9, 5, 3, 8, 1, 6, 8, 4, 7, 9, 5, 3, 2, 1, 10, 8, 7, 3, 4, 7]
})

# Converter os datos a formato longo
datos_melt = datos.melt(id_vars='Estudante', var_name='Materia', value_name='Puntuación')

# Normalizar as puntuacións para a barra de cores
norm = plt.Normalize(datos_melt['Puntuación'].min(), datos_melt['Puntuación'].max())
sm = plt.cm.ScalarMappable(cmap='coolwarm', norm=norm)

# Crear a figura e o eixo
fig, ax = plt.subplots(figsize=(12, 6))

# Crear o gráfico de dispersión con Seaborn
scatter = sns.scatterplot(
    data=datos_melt,
    x='Estudante',
    y='Puntuación',
    size='Puntuación',
    hue='Puntuación',
    sizes=(50, 300),
    palette='cool',
    ax=ax
)

# Engadir bordes aos puntos da materia 'Matemáticas'
for i, row in datos_melt.iterrows():
    if row['Materia'] == 'Matemáticas':
        ax.scatter(
            row['Estudante'],
            row['Puntuación'],
            s=100,  # Tamaño do punto (fixo para bordes)
            facecolor='none',  # Punto transparente
            edgecolor='black',  # Borde negro
            linewidth=1.5
        )

# Configurar a barra de cores
sm.set_array([])
fig.colorbar(sm, ax=ax, label='Puntuación')

# Personalización do gráfico
ax.set_title('Puntuacións de Estudantes por Materia', fontsize=16)
ax.set_xlabel('Estudante', fontsize=12)
ax.set_ylabel('Puntuación', fontsize=12)
ax.set_ylim(0, 10)
plt.xticks(rotation=90)
plt.grid(axis='y', linestyle='--', linewidth=0.5)

# Mostrar o gráfico
plt.tight_layout()
plt.show()    

Código Python: Segmentación ou clustering de estudantes

import pandas as pd
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt
import seaborn as sns

# Crear o DataFrame con datos
datos = pd.DataFrame({
    'Estudante': [f'Estudante {i+1}' for i in range(24)],
    'Matemáticas': [8, 5, 7, 3, 10, 6, 4, 9, 2, 5, 7, 3, 6, 8, 5, 4, 3, 2, 9, 7, 6, 4, 5, 8],
    'Ciencias': [7, 4, 6, 2, 9, 5, 3, 8, 1, 6, 8, 4, 7, 9, 5, 3, 2, 1, 10, 8, 7, 3, 4, 7]
})

# Usar só as columnas numéricas para o clustering
X = datos[['Matemáticas', 'Ciencias']]  # Seleccionamos as puntuacións como variables

# Crear o modelo K-means con 3 clústeres
kmeans = KMeans(n_clusters=3, random_state=0)
datos['Cluster'] = kmeans.fit_predict(X)  # Etiquetar cada estudante co seu clúster

# Visualizar os centros dos clústeres
centros = kmeans.cluster_centers_

# Crear gráfico de dispersión para ver os clústeres
plt.figure(figsize=(10, 6))
sns.scatterplot(
    data=datos,
    x='Matemáticas',
    y='Ciencias',
    hue='Cluster',  # Os clústeres diferéncianse por cores
    palette='coolwarm',  # Paleta de cores para os clústeres
    s=100  # Tamaño dos puntos
)

# Engadir os centros dos clústeres ó gráfico
plt.scatter(centros[:, 0], centros[:, 1], c='black', s=200, marker='X', label='Centros')  # Marcadores para os centros
plt.title('Clustering de Estudantes segundo o Rendemento', fontsize=16)
plt.xlabel('Puntuación en Matemáticas')
plt.ylabel('Puntuación en Ciencias')
plt.legend(title='Grupo')
plt.grid(color='gray', linestyle='--', linewidth=0.5)
plt.tight_layout()
plt.show()    

Explicación do programa

  • Creación do DataFrame:Contén as puntuacións en Matemáticas e Ciencias de cada estudante.Só se empregan as columnas numéricas para o clustering, xa que o modelo K-means funciona con valores continuos.
  • Modelo K-means:Divide os estudantes en tres grupos (ou clústeres) baseándose nas puntuacións. Cada grupo representa estudantes con rendemento similar.
  • Engadir a columna 'Cluster':Cada estudante é etiquetado co grupo ó que pertence segundo o modelo K-means.
  • Visualización dos clústeres:Usa un gráfico de dispersión onde os clústeres se diferencian por cores.Engádense os centros dos clústeres ó gráfico como marcadores 'X' negros.

Exemplo 2: Distribución de poboación

Resultado exemplo
Creación propia. Resultado do exemplo (CC BY-SA)

Código Python: Densidade de poboación por idades e sexos

#Gráfica de densidade
# PASO 1: Importar as bibliotecas necesarias
import pandas as pd  # pandas axúdanos a traballar con datos tabulares
import seaborn as sns  # seaborn permítenos crear gráficos avanzados
import matplotlib.pyplot as plt  # matplotlib complementa para personalizar gráficos

# PASO 2: Subir o arquivo en Google Colab
from google.colab import files
arquivo = files.upload()  # Isto abrirá un cadro de diálogo para subir o arquivo CSV

# PASO 3: Ler o arquivo CSV subido
nome_arquivo = list(arquivo.keys())[0]  # Obtemos o nome do arquivo subido
datos = pd.read_csv(nome_arquivo)  # Cargamos o ficheiro CSV nun DataFrame
datos = datos[datos['Idades'] != 'Totales']#Eliminamos a última columna de totais

# PASO 4: Engadir unha columna cos puntos medios dos tramos de idade
datos['Punto_medio'] = [4.5, 14.5, 24.5, 34.5, 44.5, 54.5, 64.5, 74.5, 84.5, 94.5, 104.5, 114.5]

# PASO 5: Expandir os datos para usar en curvas de densidade
mulleres_expandidas = []
varóns_expandidos = []

for i in range(len(datos)):
    mulleres_expandidas += [datos['Punto_medio'][i]] * datos['Mulleres'][i]
    varóns_expandidos += [datos['Punto_medio'][i]] * datos['Varóns'][i]

# PASO 6: Crear o gráfico de densidade
plt.figure(figsize=(12, 8))
sns.kdeplot(mulleres_expandidas, color='#E55624', fill=True, label='Mulleres')  # Densidade para mulleres
sns.kdeplot(varóns_expandidos, color='#2430E5', fill=True, label='Varóns')  # Densidade para varóns

# PASO 7: Personalizar o gráfico
plt.title('Distribución por Sexos da Poboación', fontsize=16)
plt.xlabel('Idades (anos)', fontsize=12)
plt.ylabel('Densidade', fontsize=12)
plt.legend(title='Sexos')
plt.grid(color='gray', linestyle='--', linewidth=0.5)
plt.tight_layout()
plt.show()
    

Código Python: Gráfico de barras por tramos de idade e sexos

# Importar as bibliotecas necesarias
import pandas as pd
import matplotlib.pyplot as plt
from google.colab import files
import matplotlib.image as mpimg  # Para cargar a imaxe

# PASO 1: Subir o arquivo CSV
archivo_csv = files.upload()  # Subir o arquivo de datos
nome_csv = list(archivo_csv.keys())[0]  # Obter o nome do ficheiro
datos = pd.read_csv(nome_csv)  # Ler os datos

datos_filtrados = datos[datos['Idades'] != 'Totales'].copy()

datos_filtrados['Varóns'] = pd.to_numeric(datos_filtrados['Varóns'], errors='coerce')
datos_filtrados['Mulleres'] = pd.to_numeric(datos_filtrados['Mulleres'], errors='coerce')

# PASO 2: Subir a imaxe
archivo_imaxe = files.upload()  # Subir o arquivo da imaxe
nome_imaxe = list(archivo_imaxe.keys())[0]  # Obter o nome do ficheiro

# Crear unha figura para amosar os datos como gráfico de barras apilado
fig, ax = plt.subplots(figsize=(12, 8))

# Cargar a imaxe de multitude
fondo_imaxe = mpimg.imread(nome_imaxe)  # Ler a imaxe subida

# Engadir a imaxe como fondo
ax.imshow(fondo_imaxe, aspect='auto', extent=[-0.5, len(datos['Idades']) - 0.5, 0, max(datos_filtrados['Varóns'] + datos_filtrados['Mulleres'])], alpha=0.3)


# Calcular os totais de poboación por sexo
total_varóns = datos_filtrados['Varóns'].sum()
total_mulleres = datos_filtrados['Mulleres'].sum()

# Crear gráfico de barras apiladas para mulleres e varóns
barra_varóns = ax.bar(datos_filtrados['Idades'], datos_filtrados['Varóns'], label='Varóns', color='#2430E5', alpha=0.7)
barra_mulleres = ax.bar(datos_filtrados['Idades'], datos_filtrados['Mulleres'], label='Mulleres', color='#E55624', alpha=0.7, bottom=datos_filtrados['Varóns'])

# Engadir anotacións sobre as barras
for rect_varóns, rect_mulleres, varóns, mulleres in zip(barra_varóns, barra_mulleres, datos_filtrados['Varóns'], datos_filtrados['Mulleres']):
    # Anotación para varóns
    ax.text(
        rect_varóns.get_x() + rect_varóns.get_width() / 2,  # Posición horizontal
        rect_varóns.get_height() / 2,  # Posición vertical no medio da barra de varóns
        str(varóns),  # Texto (número de varóns)
        ha='center', va='center', fontsize=9, color='white'  # Estilo do texto
    )
    # Anotación para mulleres
    ax.text(
        rect_mulleres.get_x() + rect_mulleres.get_width() / 2,  # Posición horizontal
        rect_mulleres.get_height() + rect_varóns.get_height() / 2,  # Enriba da barra de varóns
        str(mulleres),  # Texto (número de mulleres)
        ha='center', va='center', fontsize=9, color='black'  # Estilo do texto
    )

# Personalizar o gráfico
plt.title('Distribución por Idades e Sexos da Poboación', fontsize=16)
plt.xlabel('Tramos de Idade', fontsize=12)
plt.ylabel('Poboación', fontsize=12)
plt.xticks(rotation=45)  # Rotar os tramos de idade para mellor visibilidade
plt.legend(title='Sexos')  # Engadir unha lenda para identificar as barras
plt.grid(axis='y', linestyle='--', linewidth=0.5)

# Amosar o gráfico
plt.tight_layout()
plt.show()
    

Explicación do programa

  • Subida de datos:     files.upload() abre unha interface en Google Colab para subir ficheiros desde o computador. O usuario carga un ficheiro CSV que contén datos sobre poboación divididos en Idades, Varóns, e Mulleres.

  • Lectura do ficheiro:Usamos pd.read_csv(nome_csv) para ler o ficheiro CSV e almacenalo nun DataFrame chamado datos. Este DataFrame contén as columnas e filas coas informacións subidas.

  • Filtrar os datos: A fila chamada Totales, que representa unha suma total non útil para a gráfica, elimínase co código:datos_filtrados = datos[datos['Idades'] != 'Totales'].copy()  Isto garante que só se procesen os tramos de idade específicos.

  • Conversión de tipos de datos:As columnas Varóns e Mulleres son convertidas a numéricas usando: pd.to_numeric(datos_filtrados['Varóns'], errors='coerce')pd.to_numeric(datos_filtrados['Mulleres'], errors='coerce')  Este paso evita erros no caso de que algún valor sexa non numérico.

  • Subir a imaxe: De forma similar á subida do ficheiro CSV, files.upload() permite cargar unha imaxe desde o computador.

  • Lectura da imaxe:Usamos mpimg.imread(nome_imaxe) para ler o ficheiro de imaxe cargado e almacenalo como unha matriz.

  • Creación do gráfico .

    • Inicialización da figura: plt.subplots(figsize=(12, 8)) crea unha figura de gran tamaño para mellorar a visibilidade.

    • Engadir a imaxe como fondo: A imaxe cargada é utilizada como fondo da gráfica con ax.imshow(fondo_imaxe, aspect='auto', extent=[-0.5, len(datos_filtrados['Idades']) - 0.5, 0, max(datos_filtrados['Varóns'] + datos_filtrados['Mulleres'])], alpha=0.3)

      • extent define os límites da imaxe no gráfico.

      • alpha=0.3 fai a imaxe semitransparente para que os elementos do gráfico sexan visibles.

    • Cálculo dos totais: Sumamos as cantidades de varóns e mulleres con total_varóns = datos_filtrados['Varóns'].sum() total_mulleres = datos_filtrados['Mulleres'].sum()Estes totais poderían ser usados na lenda ou para outros propósitos.

    • Gráfico de barras apiladas: ax.bar() é utilizado para representar os datos:

      • Primeiro para varóns.Logo para mulleres, apilados enriba dos varóns utilizando o parámetro bottom=datos_filtrados['Varóns'].

    • Engadir anotacións

      • Texto sobre as barras:O bucle for percorre as barras e engade os valores exactos de varóns e mulleres con ax.text():rect_varóns.get_height() e rect_mulleres.get_height() calculan a altura das barras para situar os textos de forma correcta.

    • Personalización do gráfico.

      • Título e etiquetas:Engádese un título e etiquetas para os eixes con plt.title('Distribución por Idades e Sexos da Poboación', fontsize=16)plt.xlabel('Tramos de Idade', fontsize=12)plt.ylabel('Poboación', fontsize=12)

      • Rotación das etiquetas: As etiquetas das idades no eixo x son rotadas 45 grados para mellorar a lectura.

      • Lenda e cuadrícula:A lenda identifica mulleres e varóns por cor, e unha cuadrícula lixeira facilita a lectura visual.

      • Visualización:Finalmente, plt.tight_layout() axusta os espazos para evitar solapamentos, e plt.show() amosa o gráfico.
         

Exemplo 3: Crear un heatmap sobre influencers para comprobar correlacións entre datos

Resultado exemplo
Creación propia. Resultado do exemplo (CC BY-SA)

Código Python: Relación entre características adolescentes famosos

# PASO 1: Importar as bibliotecas necesarias
# Importamos bibliotecas para manexar datos e crear gráficos.
import pandas as pd  # Manexar datos tabulares con DataFrames.
import seaborn as sns  # Crear gráficos avanzados de maneira sinxela.
import matplotlib.pyplot as plt  # Personalizar e mostrar gráficos.

# PASO 2: Crear os datos ficticios de adolescentes famosos
# Neste exemplo, representamos datos de adolescentes cunha variedade de características:
data = pd.DataFrame({
    'Seguidores (millóns)': [5, 10, 20, 8, 3],  # Cantidade de seguidores en redes sociais (en millóns).
    'Ingresos ($ miles)': [159, 120, 300, 80, 20],  # Ganancias anuais en miles de dólares.
    'Horas de traballo (semanais)': [25, 40, 35, 45, 20]  # Cantidade de horas de traballo semanais.
}, index=['Cantante (Chica)', 'Actor (Chico)', 'Influencer (Chica)', 'Gamer (Chico)', 'Deportista (Chica)'])  # Etiquetas que representan cada adolescente.

# PASO 3: Calcular as correlacións entre variables
# As correlacións axúdannos a identificar como se relacionan as características.
correlaciones = data.corr()  # Matriz que mostra o grao de relación entre cada par de características.

# PASO 4: Crear o heatmap usando Seaborn
# Usamos un heatmap para representar visualmente estas correlacións.
sns.heatmap(correlaciones, annot=True, cmap='coolwarm', fmt=".2f")  # Configuración visual:
# - 'annot=True': amosa os valores numéricos dentro das celas.
# - 'cmap="coolwarm"': usa unha paleta de cores para distinguir os graos de correlación.
# - 'fmt=".2f"': formato dos números con dúas decimais.

# PASO 5: Personalizar o gráfico
# Engadimos título e etiquetas para que o gráfico sexa máis informativo.
plt.title('Relación entre características de adolescentes famosos', fontsize=16)  # Título do gráfico.
plt.xlabel('Características', fontsize=12)  # Etiqueta do eixo X.
plt.xticks(rotation=35)  # Rotar as etiquetas de x para mellor visibilidade
plt.ylabel('Características', fontsize=12)  # Etiqueta do eixo Y.

# PASO 6: Mostrar o gráfico
# Finalmente amosamos o gráfico na pantalla.
plt.show()