Solucionado (ver solução)

Importante

Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!

Solucionado
(ver solução)
1
resposta

[Projeto] Desafio: bora praticar? | Pandas: conhecendo a biblioteca

DESAFIO 1: Calcular a média de quartos dos imóveis

# Forma simples
media_quartos = df['quartos'].mean()
print(f"Média de quartos: {media_quartos:.2f}")

# Forma detalhada com estatísticas
estatisticas_quartos = df['quartos'].describe()
print(estatisticas_quartos)

# Alternativa: usando agg para múltiplas operações
resumo = df['quartos'].agg(['mean', 'median', 'min', 'max', 'count'])
print(resumo)

Explicação:

  • .mean(): calcula a média aritmética
  • .describe(): retorna contagem, média, desvio padrão, min, Q1, mediana, Q3, max
  • .agg(): permite calcular múltiplas agregações de uma vez

DESAFIO 2: Conferir quantos bairros únicos existem

# Forma simples
qtd_bairros = df['bairro'].nunique()
print(f"Quantidade de bairros únicos: {qtd_bairros}")

# Ver os bairros
print(df['bairro'].unique())

# Contar frequência de cada bairro
contagem_bairros = df['bairro'].value_counts()
print(contagem_bairros)

# Alternativa com mais detalhes
print(f"Bairros únicos: {qtd_bairros}")
print(f"Total de registros: {len(df)}")
print(f"Média de imóveis por bairro: {len(df) / qtd_bairros:.1f}")

Explicação:

  • .nunique(): conta valores únicos
  • .unique(): retorna array com valores únicos
  • .value_counts(): conta a frequência de cada valor

DESAFIO 3: Analisar quais bairros possuem média de aluguel mais elevada

# Forma básica
media_por_bairro = df.groupby('bairro')['aluguel'].mean()
print(media_por_bairro.sort_values(ascending=False))

# Forma detalhada com múltiplas métricas
analise_bairros = df.groupby('bairro')['aluguel'].agg([
    ('média', 'mean'),
    ('mediana', 'median'),
    ('mínimo', 'min'),
    ('máximo', 'max'),
    ('quantidade', 'count'),
    ('desvio_padrão', 'std')
])

analise_bairros = analise_bairros.sort_values('média', ascending=False)
print(analise_bairros)

# Salvando em um arquivo
analise_bairros.to_csv('analise_aluguel_por_bairro.csv')

# Alternativa com groupby múltiplo
analise_completa = df.groupby('bairro').agg({
    'aluguel': 'mean',
    'quartos': 'mean',
    'imovel_id': 'count'  # ou qualquer coluna para contar registros
})
analise_completa.columns = ['média_aluguel', 'média_quartos', 'quantidade_imóveis']
print(analise_completa.sort_values('média_aluguel', ascending=False))

Explicação:

  • .groupby(): agrupa dados por uma ou mais colunas
  • .agg(): aplica agregações (funções) aos grupos
  • ascending=False: ordena de forma decrescente

DESAFIO 4: Gráfico de barras horizontais com top 5 bairros

import matplotlib.pyplot as plt

# Obter top 5
top_5 = df.groupby('bairro')['aluguel'].mean().nlargest(5)

# Criar gráfico
fig, ax = plt.subplots(figsize=(10, 6))
ax.barh(top_5.index, top_5.values, color='#2E86AB')

# Personalizações
ax.set_xlabel('Média de Valor de Aluguel (R$)', fontsize=12, fontweight='bold')
ax.set_ylabel('Bairro', fontsize=12, fontweight='bold')
ax.set_title('Top 5 Bairros com Maior Média de Aluguel', fontsize=14, fontweight='bold')
ax.invert_yaxis()  # Maior valor no topo

# Adicionar valores nas barras
for i, v in enumerate(top_5.values):
    ax.text(v, i, f' R$ {v:,.0f}', va='center', fontweight='bold')

# Grid para melhor leitura
ax.grid(axis='x', alpha=0.3, linestyle='--')

# Salvar e mostrar
plt.tight_layout()
plt.savefig('top_5_bairros.png', dpi=300, bbox_inches='tight')
plt.show()

# Alternativa com seaborn (mais bonito)
import seaborn as sns

top_5 = df.groupby('bairro')['aluguel'].mean().nlargest(5).sort_values()

plt.figure(figsize=(10, 6))
sns.barplot(x=top_5.values, y=top_5.index, palette='viridis', orient='h')
plt.xlabel('Média de Valor de Aluguel (R$)', fontweight='bold')
plt.ylabel('Bairro', fontweight='bold')
plt.title('Top 5 Bairros com Maior Média de Aluguel', fontweight='bold', fontsize=14)
plt.grid(axis='x', alpha=0.3)
plt.tight_layout()
plt.savefig('top_5_bairros_seaborn.png', dpi=300, bbox_inches='tight')
plt.show()

Explicação:

  • .nlargest(5): retorna os 5 maiores valores
  • .barh(): cria barras horizontais
  • invert_yaxis(): inverte eixo Y (maior valor no topo)
  • .text(): adiciona rótulos nos dados

1 resposta
solução!

Olá, Estudante. Como vai?

Que publicação fantástica e completa! Você cobriu desde a exploração estatística básica até a parte de visualização de dados com Matplotlib e Seaborn de uma forma extremamente organizada. Códigos limpos, comentários precisos e explicações diretas de cada método. Com certeza esse passo a passo servirá como um guia excelente para a comunidade do fórum.

Para agregar ainda mais valor ao seu tópico e trazer algumas boas práticas de análise exploratória e engenharia de dados, preparei alguns complementos importantes para os seus desafios:

Agregações Nomeadas no groupby (Desafio 3)

No Desafio 3, você usou uma tupla para nomear as colunas geradas no método .agg(). Essa é uma ótima abordagem!

Uma alternativa muito elegante introduzida nas versões mais recentes do Pandas é a agregação nomeada (Named Aggregation). Em vez de passar uma lista de tuplas, você passa o nome da nova coluna como um argumento nomeado. Isso deixa a leitura do código ainda mais natural:

analise_bairros = df.groupby('bairro').agg(
    média_aluguel=('aluguel', 'mean'),
    mediana_aluguel=('aluguel', 'median'),
    quantidade_imóveis=('aluguel', 'count')
)

O Perigo dos Outliers na Média (Dica de Análise)

Quando analisamos o mercado imobiliário (especialmente aluguel), o método .mean() usado no Desafio 1 e 3 pode ser fortemente distorcido por outliers (valores discrepantes, como uma única mansão ou cobertura com aluguel astronômico em um bairro simples).

Como você já calculou brilhantemente a mediana no seu método detalhado, uma excelente prática de mercado é comparar a média com a mediana. Se a média for muito maior que a mediana no Desafio 3, significa que aquele bairro tem imóveis muito caros puxando a linha para cima, e a mediana representará melhor o "aluguel típico" da região.

Paletas de Cores no Seaborn (Desafio 4)

No seu código do Seaborn, você utilizou a paleta 'viridis', que é uma escolha perfeita por ser visualmente bonita e perceptivelmente uniforme.

Vale apenas um ponto de atenção: o Seaborn alterou recentemente a forma como lida com o parâmetro palette ao mapear dados numéricos em gráficos de barras. Para evitar avisos de depreciação (FutureWarning) nas versões mais novas, uma boa prática é passar explicitamente a coluna do eixo Y (os bairros) como o argumento hue e desativar a legenda automática:

sns.barplot(
    x=top_5.values, 
    y=top_5.index, 
    hue=top_5.index, 
    palette='viridis', 
    legend=False, 
    orient='h'
)

Parabéns pelo excelente domínio das bibliotecas de análise de dados e pela dedicação em trazer soluções visuais tão caprichadas!

Espero que possa ter lhe ajudado!