0
respostas

[Dúvida] [DÚVIDA] Como posso melhorar a lógica e visualização

Olá, pessoal!

Meu código atual já realiza todos os passos do exercício, mas gostaria de receber sugestões de como posso melhorar a lógica do cálculo ou a visualização, especialmente para:

  • Tornar o código mais limpo ou compacto.

  • Melhorar a interpretação visual das retas e das médias.

Obs: Eu segui a lógica da equação, calculando os desvios em relação à média passo a passo, pois achei mais intuitivo. Contudo, na prática, acredito que não seja a maneira mais eficiente, como o próprio código do instruto mostra. Gostaria de saber se alguém teria dicas para manter essa clareza pedagógica, mas ao mesmo tempo deixar o código mais enxuto ou os gráficos mais elegantes.

import matplotlib.gridspec as gridspec
import matplotlib.pyplot as plt
import numpy as np

# --- Carregando os dados ---
url_2 = 'https://raw.githubusercontent.com/YuriArduino/Estudos_Numpy/refs/heads/Datas_tests/citrus.csv'
fruit_data = np.loadtxt(url_2, delimiter=',', skiprows=1, usecols=np.arange(1,6))

# --- Separando as frutas ---
# Laranjas
orange_diameters = fruit_data[:5000, 0]  # diâmetros
orange_weights   = fruit_data[:5000, 1]  # pesos

# Toranjas
grapefruit_diameters = fruit_data[5000:, 0]
grapefruit_weights   = fruit_data[5000:, 1]

# --- Calculando médias ---
x_mean = np.mean(orange_diameters)   # média dos diâmetros laranja
y_mean = np.mean(orange_weights)     # média dos pesos laranja

z_mean = np.mean(grapefruit_diameters)  # média dos diâmetros toranja
w_mean = np.mean(grapefruit_weights)    # média dos pesos toranja

# --- Cálculo da reta de regressão (laranjas) ---
desvios_diametro_laranja = orange_diameters - x_mean    # x_i - média dos diâmetros
desvios_peso_laranja = orange_weights - y_mean          # y_i - média dos pesos

numerador_laranja = np.sum(desvios_diametro_laranja * desvios_peso_laranja)   # Σ(x_i - x̄)(y_i - ȳ)
denominador_laranja = np.sum(desvios_diametro_laranja**2)                     # Σ(x_i - x̄)^2

m_laranja = numerador_laranja / denominador_laranja       # coeficiente angular: inclinação da reta
b_laranja = y_mean - m_laranja * x_mean                   # coeficiente linear: ponto onde a reta cruza o eixo y

# --- Cálculo da reta de regressão (toranjas) ---
desvios_diametro_toranja = grapefruit_diameters - z_mean  # x_i - média dos diâmetros
desvios_peso_toranja = grapefruit_weights - w_mean       # y_i - média dos pesos

numerador_toranja = np.sum(desvios_diametro_toranja * desvios_peso_toranja)  # Σ(x_i - x̄)(y_i - ȳ)
denominador_toranja = np.sum(desvios_diametro_toranja**2)                     # Σ(x_i - x̄)^2

m_toranja = numerador_toranja / denominador_toranja     # coeficiente angular
b_toranja = w_mean - m_toranja * z_mean                 # coeficiente linear

# --- Preparando a figura com 3 gráficos ---
fig = plt.figure(figsize=(12,12))
gs = gridspec.GridSpec(3, 1, height_ratios=[2, 1, 1], hspace=0.4)

# --- Gráfico principal (ambas as frutas) ---
ax0 = fig.add_subplot(gs[0])
ax0.scatter(orange_diameters, orange_weights, color='orange', label='Laranja', alpha=0.3, s=30)
ax0.scatter(grapefruit_diameters, grapefruit_weights, color='purple', label='Toranja', alpha=0.3, s=30)
ax0.scatter(x_mean, y_mean, color='red', marker='x', s=100, label='Média Laranja')
ax0.scatter(z_mean, w_mean, color='blue', marker='x', s=100, label='Média Toranja')

# Retas de regressão
x_range_laranja = np.linspace(min(orange_diameters), max(orange_diameters), 100)
y_range_laranja = m_laranja * x_range_laranja + b_laranja
ax0.plot(x_range_laranja, y_range_laranja, color='orange', linewidth=2, label='Reta Laranja')

x_range_toranja = np.linspace(min(grapefruit_diameters), max(grapefruit_diameters), 100)
y_range_toranja = m_toranja * x_range_toranja + b_toranja
ax0.plot(x_range_toranja, y_range_toranja, color='purple', linewidth=2, label='Reta Toranja')

ax0.set_xlabel('Diâmetro')
ax0.set_ylabel('Peso')
ax0.set_title('Comparativo: Diâmetro e Peso com Retas de Regressão')
ax0.legend()
ax0.grid(True)

# --- Gráfico só laranjas ---
ax1 = fig.add_subplot(gs[1])
ax1.scatter(orange_diameters, orange_weights, color='orange', alpha=0.3, s=20)
ax1.scatter(x_mean, y_mean, color='red', marker='x', s=100, label='Média Laranja')
ax1.plot(x_range_laranja, y_range_laranja, color='orange', linewidth=2)
ax1.set_xlabel('Diâmetro')
ax1.set_ylabel('Peso')
ax1.set_title('Somente Laranjas')
ax1.grid(True)

# --- Gráfico só toranjas ---
ax2 = fig.add_subplot(gs[2])
ax2.scatter(grapefruit_diameters, grapefruit_weights, color='purple', alpha=0.3, s=20)
ax2.scatter(z_mean, w_mean, color='blue', marker='x', s=100, label='Média Toranja')
ax2.plot(x_range_toranja, y_range_toranja, color='purple', linewidth=2)
ax2.set_xlabel('Diâmetro')
ax2.set_ylabel('Peso')
ax2.set_title('Somente Toranjas')
ax2.grid(True)

plt.show()