Reforço: Probabilidade Condicional, Teorema de Bayes, Estatística Descritiva e AED

Revisando e Praticando Conceitos Essenciais para Análise de Dados

Autor

Márcio Nicolau

Data de Publicação

10 de setembro de 2025

Introdução e Objetivos

Chegamos a um ponto crucial em nosso curso: a consolidação dos conhecimentos fundamentais. Ao longo das últimas aulas, mergulhamos em conceitos essenciais como probabilidade condicional, o poderoso Teorema de Bayes, as medidas de tendência central e dispersão da estatística descritiva, e as técnicas visuais e numéricas da Análise Exploratória de Dados (AED). Estes tópicos formam a espinha dorsal de qualquer projeto de ciência de dados, permitindo-nos compreender a incerteza, resumir informações complexas e descobrir padrões ocultos.

Esta aula de reforço tem como objetivo solidificar seu entendimento desses conceitos, apresentando novos cenários e problemas que exigirão a aplicação integrada dessas ferramentas. A prática constante é a chave para a proficiência, e a habilidade de transitar entre a teoria e a aplicação prática é o que definirá um analista de dados competente.

Objetivos de Aprendizagem

Ao final desta aula de reforço, você será capaz de:

  • Revisar e aplicar a probabilidade condicional e o Teorema de Bayes para atualizar probabilidades com novas evidências.
  • Revisar e calcular as principais medidas de tendência central (média, mediana, moda) e dispersão (amplitude, variância, desvio padrão, coeficiente de variação).
  • Revisar e criar visualizações eficazes para a análise exploratória de dados (histogramas, box plots, scatter plots, etc.).
  • Interpretar os resultados das análises descritivas e visuais para extrair insights significativos.
  • Integrar múltiplos conceitos para resolver problemas de análise de dados.

Probabilidade Condicional e Teorema de Bayes

A probabilidade condicional (\(P(A|B)\)) mede a probabilidade de um evento \(A\) ocorrer, dado que outro evento \(B\) já ocorreu. A partir dela, derivamos a Regra da Multiplicação (\(P(A \cap B) = P(A|B)P(B)\)) e definimos eventos independentes (quando \(P(A|B) = P(A)\)).

A Lei da Probabilidade Total nos ajuda a calcular a probabilidade marginal de um evento complexo, e o Teorema de Bayes nos permite atualizar nossas crenças (probabilidades a priori) com base em novas evidências, obtendo probabilidades a posteriori. (Bussab; Morettin, 2017, p. 65–74)

Teorema de Bayes: A Lógica da Atualização de Crenças

\(P(A|B) = \frac{P(B|A)P(A)}{P(B)}\)

Onde:

  • \(P(A|B)\): Probabilidade a posteriori de \(A\) dado \(B\).
  • \(P(B|A)\): Verossimilhança de \(B\) dado \(A\).
  • \(P(A)\): Probabilidade a priori de \(A\).
  • \(P(B)\): Probabilidade marginal de \(B\), frequentemente expandida como \(P(B|A)P(A) + P(B|A^c)P(A^c)\) (Lei da Probabilidade Total).

Exemplo Filtragem de Spam

Imagine um sistema de e-mail que classifica mensagens como “spam” ou “não spam”.

  • Sabe-se que \(10\%\) dos e-mails são spam, \(P(\text{Spam}) = 0.10\).
  • Se um e-mail é spam, a probabilidade de ele conter a palavra “promoção” é de \(70\%\), \(P(\text{Promoção}|\text{Spam}) = 0.70\).
  • Se um e-mail não é spam, a probabilidade de ele conter a palavra “promoção” é de \(15\%\), \(P(\text{Promoção}|\text{Não Spam}) = 0.15\).

Se um e-mail recém-chegado contém a palavra “promoção”, qual a probabilidade de ele ser spam? Ou seja, queremos calcular \(P(\text{Spam}|\text{Promoção})\).

Solução:

Vamos definir os eventos:

  • \(S\): O e-mail é spam. \(P(S) = 0.10\).
  • \(\neg S\): O e-mail não é spam. \(P(\neg S) = 1 - P(S) = 0.90\).
  • \(P\): O e-mail contém a palavra “promoção”.

Conhecemos:

  • \(P(P|S) = 0.70\) (verossimilhança)
  • \(P(P|\neg S) = 0.15\) (falso positivo, na linguagem de spam)

Queremos \(P(S|P)\). Aplicando o Teorema de Bayes:

\(P(S|P) = \frac{P(P|S)P(S)}{P(P)}\)

Primeiro, calculamos \(P(P)\) usando a Lei da Probabilidade Total:

\(P(P) = P(P|S)P(S) + P(P|\neg S)P(\neg S)\) \(P(P) = (0.70)(0.10) + (0.15)(0.90)\) \(P(P) = 0.07 + 0.135 = 0.205\)

Agora, calculamos \(P(S|P)\):

\(P(S|P) = \frac{(0.70)(0.10)}{0.205} = \frac{0.07}{0.205} \approx 0.3415\)

Interpretação: Se um e-mail contém a palavra “promoção”, a probabilidade de ele ser spam é de aproximadamente 34.15%. Mesmo que a palavra “promoção” seja mais comum em spam, o fato de que a maioria dos e-mails não é spam inicialmente (prior baixo) reduz a probabilidade de um e-mail com “promoção” ser spam.

Código Filtragem de Spam

# Probabilidades a priori
p_spam = 0.10
p_nao_spam = 1 - p_spam

# Verossimilhanças
p_promocao_dado_spam = 0.70
p_promocao_dado_nao_spam = 0.15

# Calcular P(Promoção) usando Lei da Probabilidade Total
p_promocao = (p_promocao_dado_spam * p_spam) + \
             (p_promocao_dado_nao_spam * p_nao_spam)
print(f"P(Promoção) (Probabilidade de um e-mail conter 'promoção'): {p_promocao:.3f}")

# Aplicar o Teorema de Bayes
p_spam_dado_promocao = (p_promocao_dado_spam * p_spam) / p_promocao

print(f"P(Spam | Promoção) (Probabilidade de ser spam dado que contém 'promoção'): {p_spam_dado_promocao:.4f}")
# Probabilidades a priori
p_spam <- 0.10
p_nao_spam <- 1 - p_spam

# Verossimilhanças
p_promocao_dado_spam <- 0.70
p_promocao_dado_nao_spam <- 0.15

# Calcular P(Promoção) usando Lei da Probabilidade Total
p_promocao <- (p_promocao_dado_spam * p_spam) +
              (p_promocao_dado_nao_spam * p_nao_spam)
cat(sprintf("P(Promoção) (Probabilidade de um e-mail conter 'promoção'): %.3f\n", p_promocao))

# Aplicar o Teorema de Bayes
p_spam_dado_promocao <- (p_promocao_dado_spam * p_spam) / p_promocao

cat(sprintf("P(Spam | Promoção) (Probabilidade de ser spam dado que contém 'promoção'): %.4f\n", p_spam_dado_promocao))

Diagrama de Relações do Teorema de Bayes

graph TD
    P_S("P(Spam) - Prior: 0.10") --> P_P_S("P(Promoção|Spam) - Likelihood: 0.70");
    P_P_S --> P_S_P("P(Spam|Promoção) - Posterior: 0.3415");
    P_P("P(Promoção) - Evidence: 0.205") --> P_S_P;
    P_P -- "Lei da Prob. Total" --> P_P_S_sum("P(Promoção|Spam)P(Spam) + P(Promoção|Não Spam)P(Não Spam)");
    P_P_S_sum --> P_P;

    style P_S fill:#d4edda,stroke:#28a745,stroke-width:2px;
    style P_P_S fill:#ffecb3,stroke:#ffc107,stroke-width:2px;
    style P_P fill:#cfe2f3,stroke:#007bff,stroke-width:2px;
    style P_S_P fill:#dc3545,stroke:#dc3545,stroke-width:2px;
    style P_P_S_sum fill:#cfe2f3,stroke:#007bff,stroke-width:2px;
Figura 1: Diagrama de Relações do Teorema de Bayes (Revisão)

Estatística Descritiva e Análise Exploratória de Dados (AED)

Estatística descritiva é a arte de resumir e apresentar dados de forma clara e concisa através de medidas numéricas e gráficos. A AED é a etapa inicial e crucial de investigação dos dados, utilizando visualizações para identificar padrões, anomalias e testar suposições. Juntas, elas nos fornecem uma compreensão profunda do nosso conjunto de dados. (Bussab; Morettin, 2017, p. 19–32, 95–96)

Medidas de Tendência Central

  • Média: Soma dos valores dividida pelo número de valores (\(\bar{x}\)). Sensível a outliers.
  • Mediana: Valor central em um conjunto de dados ordenado. Robusta a outliers.
  • Moda: Valor mais frequente. Útil para dados categóricos.

Medidas de Dispersão

  • Amplitude: Diferença entre o valor máximo e mínimo. Muito sensível a outliers.
  • Variância (\(s^2\)): Média dos quadrados dos desvios em relação à média. Unidade ao quadrado.
  • Desvio Padrão (\(s\)): Raiz quadrada da variância. Retorna à unidade original, mais interpretável.
  • Coeficiente de Variação (CV): Desvio padrão como porcentagem da média. Útil para comparar dispersão entre conjuntos de dados com diferentes escalas.

Visualizações Chave na AED

  • Variáveis Qualitativas: Gráfico de Barras, Gráfico de Setores.

  • Variáveis Quantitativas: Histograma, Box Plot, Gráfico de Densidade (KDE).

  • Relações Bivariadas:

    • Quantitativa vs. Quantitativa: Gráfico de Dispersão (Scatter Plot), Heatmap de Correlação.
    • Qualitativa vs. Quantitativa: Box Plot por categoria, Violin Plot.
    • Qualitativa vs. Qualitativa: Gráfico de Barras Agrupadas/Empilhadas.

Exemplo de Reforço: Desempenho de Vendas por Região

Considere os dados de vendas diárias (em R$) de 30 dias para duas regiões de uma empresa.

Região A (R$): [1200, 1500, 1300, 1400, 1600, 1250, 1350, 1450, 1550, 1700, 1280, 1380, 1480, 1580, 1650, 1320, 1420, 1520, 1620, 1750, 1300, 1400, 1500, 1600, 1700, 1800, 1350, 1450, 1550, 1650]

Região B (R$): [1000, 1100, 1050, 1150, 1200, 950, 1020, 1120, 1220, 1300, 980, 1080, 1180, 1280, 1350, 990, 1090, 1190, 1290, 1400, 1010, 1110, 1210, 1310, 1410, 1500, 1030, 1130, 1230, 1330]

Vamos calcular algumas medidas e criar um box plot para comparação.

Código Estatística Descritiva e AED

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

vendas_a = np.array([1200, 1500, 1300, 1400, 1600, 1250, 1350, 1450, 1550, 1700, 1280, 1380, 1480, 1580, 1650, 1320, 1420, 1520, 1620, 1750, 1300, 1400, 1500, 1600, 1700, 1800, 1350, 1450, 1550, 1650])
vendas_b = np.array([1000, 1100, 1050, 1150, 1200, 950, 1020, 1120, 1220, 1300, 980, 1080, 1180, 1280, 1350, 990, 1090, 1190, 1290, 1400, 1010, 1110, 1210, 1310, 1410, 1500, 1030, 1130, 1230, 1330])

# --- Medidas de Tendência Central e Dispersão ---
print("--- Região A ---")
print(f"Média: {np.mean(vendas_a):.2f}")
print(f"Mediana: {np.median(vendas_a):.2f}")
# Moda (pode não existir ou ter múltiplas, para este caso, todos são únicos)
# freq_a = pd.Series(vendas_a).value_counts()
# if len(freq_a[freq_a == freq_a.max()]) == len(vendas_a):
#     print("Moda: Não há moda única")
# else:
#     print(f"Moda: {freq_a.idxmax()}")
print(f"Desvio Padrão: {np.std(vendas_a, ddof=1):.2f}")
print(f"Coeficiente de Variação: {(np.std(vendas_a, ddof=1) / np.mean(vendas_a) * 100):.2f}%")

print("\n--- Região B ---")
print(f"Média: {np.mean(vendas_b):.2f}")
print(f"Mediana: {np.median(vendas_b):.2f}")
# Moda (similar ao acima)
print(f"Desvio Padrão: {np.std(vendas_b, ddof=1):.2f}")
print(f"Coeficiente de Variação: {(np.std(vendas_b, ddof=1) / np.mean(vendas_b) * 100):.2f}%")

# --- AED: Box Plot para Comparação ---
df_vendas = pd.DataFrame({
    'Regiao': ['A'] * len(vendas_a) + ['B'] * len(vendas_b),
    'Vendas': np.concatenate([vendas_a, vendas_b])
})

plt.figure(figsize=(10, 6))
sns.boxplot(x='Regiao', y='Vendas', data=df_vendas, palette='coolwarm')
plt.title('Distribuição de Vendas Diárias por Região')
plt.xlabel('Região')
plt.ylabel('Vendas (R$)')
plt.grid(axis='y', linestyle='--', alpha=0.7)
plt.show()

plt.figure(figsize=(10, 6))
sns.histplot(data=df_vendas, x='Vendas', hue='Regiao', kde=True, palette='viridis', alpha=0.6)
plt.title('Histograma de Vendas Diárias por Região')
plt.xlabel('Vendas (R$)')
plt.ylabel('Frequência')
plt.grid(axis='y', linestyle='--', alpha=0.7)
plt.show()
library(dplyr)
library(ggplot2)

vendas_a <- c(1200, 1500, 1300, 1400, 1600, 1250, 1350, 1450, 1550, 1700, 1280, 1380, 1480, 1580, 1650, 1320, 1420, 1520, 1620, 1750, 1300, 1400, 1500, 1600, 1700, 1800, 1350, 1450, 1550, 1650)
vendas_b <- c(1000, 1100, 1050, 1150, 1200, 950, 1020, 1120, 1220, 1300, 980, 1080, 1180, 1280, 1350, 990, 1090, 1190, 1290, 1400, 1010, 1110, 1210, 1310, 1410, 1500, 1030, 1130, 1230, 1330)

# --- Medidas de Tendência Central e Dispersão ---
cat("--- Região A ---\n")
cat(sprintf("Média: %.2f\n", mean(vendas_a)))
cat(sprintf("Mediana: %.2f\n", median(vendas_a)))
# Moda - para este dataset, cada valor aparece uma vez, então não há moda única.
# Implementar uma função customizada para moda se for necessário lidar com múltiplas.
cat(sprintf("Desvio Padrão: %.2f\n", sd(vendas_a)))
cat(sprintf("Coeficiente de Variação: %.2f%%\n", (sd(vendas_a) / mean(vendas_a) * 100)))

cat("\n--- Região B ---\n")
cat(sprintf("Média: %.2f\n", mean(vendas_b)))
cat(sprintf("Mediana: %.2f\n", median(vendas_b)))
cat(sprintf("Desvio Padrão: %.2f\n", sd(vendas_b)))
cat(sprintf("Coeficiente de Variação: %.2f%%\n", (sd(vendas_b) / mean(vendas_b) * 100)))

# --- AED: Box Plot e Histograma para Comparação ---
df_vendas <- data.frame(
  Regiao = factor(c(rep('A', length(vendas_a)), rep('B', length(vendas_b)))),
  Vendas = c(vendas_a, vendas_b)
)

# Box Plot
ggplot(df_vendas, aes(x = Regiao, y = Vendas, fill = Regiao)) +
  geom_boxplot() +
  labs(title = 'Distribuição de Vendas Diárias por Região', x = 'Região', y = 'Vendas (R$)') +
  theme_minimal() +
  scale_fill_brewer(palette = "Paired")

# Histograma
ggplot(df_vendas, aes(x = Vendas, fill = Regiao, color = Regiao)) +
  geom_histogram(binwidth = 100, position = "identity", alpha = 0.6) +
  geom_density(aes(y = after_stat(count * 100)), alpha = 0.4) + # Ajuste para sobrepor densidade
  labs(title = 'Histograma de Vendas Diárias por Região', x = 'Vendas (R$)', y = 'Frequência') +
  theme_minimal() +
  scale_fill_brewer(palette = "viridis") +
  scale_color_brewer(palette = "viridis")

Interpretação do Exemplo:

  • Medidas: A Região A tem uma média de vendas significativamente maior que a Região B (R$1485.00 vs. R$1153.33). O desvio padrão é similar (R$167.33 vs. R$160.77), mas o Coeficiente de Variação é ligeiramente maior para a Região A (11.27% vs. 13.94%), indicando que a Região A, embora tenha vendas mais altas, apresenta uma variabilidade relativa um pouco menor que a Região B.

  • Visualizações (Box Plot e Histograma): O Box Plot e o Histograma confirmam que a distribuição de vendas da Região A está deslocada para valores maiores. Ambas as regiões parecem ter distribuições aproximadamente simétricas, sem outliers óbvios. A sobreposição dos histogramas mostra a clara separação das faixas de vendas entre as regiões.

Diagrama: AED e Estatística Descritiva no Fluxo de Análise

graph TD
    A[Dados Limpos e Preparados] --> B(Calcular Medidas Descritivas);
    A --> C(Criar Visualizações de AED);
    B & C --> D(Identificar Padrões, Anomalias, Tendências);
    D --> E(Formular Insights Iniciais);
    E --> F[Base para Inferência e Modelagem];

    style A fill:#e6f3ff,stroke:#007bff,stroke-width:2px;
    style B fill:#ffe0b3,stroke:#ffc107,stroke-width:2px;
    style C fill:#ffe0b3,stroke:#ffc107,stroke-width:2px;
    style D fill:#d4edda,stroke:#28a745,stroke-width:2px;
    style E fill:#d4edda,stroke:#28a745,stroke-width:2px;
    style F fill:#aaffaa,stroke:#333,stroke-width:2px;
Figura 2: Integração da Estatística Descritiva e AED

Verificação de Aprendizagem

Para esta atividade, você aplicará os conceitos de Probabilidade Condicional, Teorema de Bayes, Estatística Descritiva e Análise Exploratória de Dados em um novo cenário.

Cenário:

Você é um cientista de dados em uma empresa de desenvolvimento de software que está lançando um novo recurso. A empresa coletou dados de testes de usuários e de relatórios de bugs.

Dados Disponíveis (Simulados):

  1. Dados de Bug Reports (Relatórios de Erro):

    • Probabilidade de um novo recurso ter bugs sérios: \(P(\text{Bugs Séries}) = 0.08\).
    • Se o recurso tem bugs sérios, a probabilidade de ele falhar nos testes de integração é de \(P(\text{Falha Teste}|\text{Bugs Séries}) = 0.90\).
    • Se o recurso não tem bugs sérios, a probabilidade de ele falhar nos testes de integração é de \(P(\text{Falha Teste}|\text{Não Bugs Séries}) = 0.10\).
  2. Dados de Satisfação do Usuário (em escala de 1 a 10):

    Uma amostra de 50 usuários beta forneceu as seguintes pontuações de satisfação: [8, 7, 9, 8, 6, 9, 10, 7, 8, 8, 5, 9, 7, 8, 6, 9, 10, 7, 8, 8, 9, 7, 6, 8, 9, 10, 7, 8, 5, 9, 7, 8, 6, 9, 10, 7, 8, 8, 9, 7, 6, 8, 9, 10, 7, 8, 5, 9, 7, 8]

Tarefas:

  1. Probabilidade Condicional e Teorema de Bayes:

    1. Se um novo recurso falhou nos testes de integração, qual a probabilidade de ele ter bugs sérios? (Calcule \(P(\text{Bugs Séries}|\text{Falha Teste})\)).
    2. Interprete o resultado para a equipe de desenvolvimento.
  2. Estatística Descritiva e AED (Satisfação do Usuário):

    1. Calcule a média, mediana, moda, desvio padrão amostral e amplitude das pontuações de satisfação do usuário.
    2. Crie um histograma da distribuição das pontuações de satisfação.
    3. Crie um box plot das pontuações de satisfação.
    4. Interprete as medidas calculadas e os gráficos. O que eles revelam sobre a satisfação geral dos usuários? Há outliers? Qual a forma da distribuição?

1. Probabilidade Condicional e Teorema de Bayes:

  • Eventos:

    • \(B\): Recurso tem bugs sérios. \(P(B) = 0.08\).
    • \(\neg B\): Recurso não tem bugs sérios. \(P(\neg B) = 1 - 0.08 = 0.92\).
    • \(F\): Recurso falha nos testes de integração.
  • Conhecemos: \(P(F|B) = 0.90\) e \(P(F|\neg B) = 0.10\).

  • Queremos calcular \(P(B|F)\).

  1. Calcule \(P(B|F)\):

    Primeiro, calculamos \(P(F)\) usando a Lei da Probabilidade Total:

    \(P(F) = P(F|B)P(B) + P(F|\neg B)P(\neg B)\) \(P(F) = (0.90)(0.08) + (0.10)(0.92)\) \(P(F) = 0.072 + 0.092 = 0.164\)

    Agora, aplicamos o Teorema de Bayes:

    \(P(B|F) = \frac{P(F|B)P(B)}{P(F)} = \frac{(0.90)(0.08)}{0.164} = \frac{0.072}{0.164} \approx 0.4390\)

# Dados
p_bugs_serios = 0.08
p_nao_bugs_serios = 1 - p_bugs_serios
p_falha_teste_dado_bugs = 0.90
p_falha_teste_dado_nao_bugs = 0.10

# P(Falha Teste)
p_falha_teste = (p_falha_teste_dado_bugs * p_bugs_serios) + \
                (p_falha_teste_dado_nao_bugs * p_nao_bugs_serios)
print(f"P(Falha Teste) = {p_falha_teste:.4f}")

# P(Bugs Séries | Falha Teste)
p_bugs_serios_dado_falha_teste = (p_falha_teste_dado_bugs * p_bugs_serios) / p_falha_teste
print(f"a) P(Bugs Séries | Falha Teste) = {p_bugs_serios_dado_falha_teste:.4f}")
# Dados
p_bugs_serios <- 0.08
p_nao_bugs_serios <- 1 - p_bugs_serios
p_falha_teste_dado_bugs <- 0.90
p_falha_teste_dado_nao_bugs <- 0.10

# P(Falha Teste)
p_falha_teste <- (p_falha_teste_dado_bugs * p_bugs_serios) +
                    (p_falha_teste_dado_nao_bugs * p_nao_bugs_serios)
cat(sprintf("P(Falha Teste) = %.4f\n", p_falha_teste))

# P(Bugs Séries | Falha Teste)
p_bugs_serios_dado_falha_teste <- (p_falha_teste_dado_bugs * p_bugs_serios) / p_falha_teste
cat(sprintf("a) P(Bugs Séries | Falha Teste) = %.4f\n", p_bugs_serios_dado_falha_teste))
  1. Interpretação para a equipe de desenvolvimento:

    Se um novo recurso falha nos testes de integração, a probabilidade de ele ter bugs sérios aumenta significativamente de 8% (probabilidade a priori) para aproximadamente 43.90% (probabilidade a posteriori). Isso significa que uma falha no teste de integração é um forte indicador de que o recurso pode ter problemas sérios, e a equipe deve priorizar a investigação desses recursos falhos com uma perspectiva de que há uma chance considerável de bugs sérios.

2. Estatística Descritiva e AED (Satisfação do Usuário):

Pontuações: [8, 7, 9, 8, 6, 9, 10, 7, 8, 8, 5, 9, 7, 8, 6, 9, 10, 7, 8, 8, 9, 7, 6, 8, 9, 10, 7, 8, 5, 9, 7, 8, 6, 9, 10, 7, 8, 8, 9, 7, 6, 8, 9, 10, 7, 8, 5, 9, 7, 8]

  1. Cálculo das medidas:

    • Média: \(\approx 7.82\)
    • Mediana: \(8.00\)
    • Moda: \(8.00\) (aparece 16 vezes)
    • Desvio Padrão Amostral: \(\approx 1.34\)
    • Amplitude: \(10 - 5 = 5\)
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from scipy import stats

satisfacao = np.array()

print("\na) Medidas de Satisfação do Usuário:")
print(f"Média: {np.mean(satisfacao):.2f}")
print(f"Mediana: {np.median(satisfacao):.2f}")
# Moda:
moda_val = stats.mode(satisfacao, keepdims=True)
print(f"Moda: {moda_val:.2f}")
print(f"Desvio Padrão amostral: {np.std(satisfacao, ddof=1):.2f}")
print(f"Amplitude: {np.max(satisfacao) - np.min(satisfacao):.2f}")
satisfacao <- c(8, 7, 9, 8, 6, 9, 10, 7, 8, 8, 5, 9, 7, 8, 6, 9, 10, 7, 8, 8, 9, 7, 6, 8, 9, 10, 7, 8, 5, 9, 7, 8, 6, 9, 10, 7, 8, 8, 9, 7, 6, 8, 9, 10, 7, 8, 5, 9, 7, 8)

# Função para moda (se não definida)
get_all_modes <- function(v) {
    t <- table(v)
    max_freq <- max(t)
    modes <- as.numeric(names(t[t == max_freq]))
    return(modes)
}

cat("\na) Medidas de Satisfação do Usuário:\n")
cat(sprintf("Média: %.2f\n", mean(satisfacao)))
cat(sprintf("Mediana: %.2f\n", median(satisfacao)))
cat(sprintf("Moda: %s\n", paste(get_all_modes(satisfacao), collapse = ", ")))
cat(sprintf("Desvio Padrão amostral: %.2f\n", sd(satisfacao)))
cat(sprintf("Amplitude: %.2f\n", max(satisfacao) - min(satisfacao)))
  1. Histograma:
plt.figure(figsize=(10, 6))
sns.histplot(satisfacao, bins=np.arange(4.5, 10.6, 1), kde=True, color='teal', edgecolor='black')
plt.title('Distribuição das Pontuações de Satisfação do Usuário')
plt.xlabel('Pontuação de Satisfação')
plt.ylabel('Frequência')
plt.xticks(np.arange(5, 11, 1))
plt.grid(axis='y', linestyle='--', alpha=0.7)
plt.show()
library(ggplot2)
df_satisfacao <- data.frame(Satisfacao = satisfacao)

ggplot(df_satisfacao, aes(x = Satisfacao)) +
    geom_histogram(binwidth = 1, fill = "teal", color = "black", alpha = 0.7) +
    geom_density(aes(y = after_stat(count * 1)), color = "darkblue", size = 1) +
    labs(title = 'Distribuição das Pontuações de Satisfação do Usuário',
        x = 'Pontuação de Satisfação', y = 'Frequência') +
    scale_x_continuous(breaks = 5:10) +
    theme_minimal()
  1. Box Plot:
plt.figure(figsize=(8, 5))
sns.boxplot(y=satisfacao, color='lightcoral')
plt.title('Box Plot das Pontuações de Satisfação do Usuário')
plt.ylabel('Pontuação de Satisfação')
plt.grid(axis='y', linestyle='--', alpha=0.7)
plt.show()
library(ggplot2)
df_satisfacao <- data.frame(Satisfacao = satisfacao)

ggplot(df_satisfacao, aes(y = Satisfacao)) +
    geom_boxplot(fill = "lightcoral") +
    labs(title = 'Box Plot das Pontuações de Satisfação do Usuário',
        y = 'Pontuação de Satisfação') +
    theme_minimal()
  1. Interpretação das medidas e gráficos:

    • As medidas de tendência central (média, mediana, moda) estão todas próximas a 8, indicando que a satisfação geral é alta. A média ligeiramente abaixo da mediana pode sugerir um leve viés à esquerda (mais valores altos que baixos, embora não muito pronunciado).
    • O desvio padrão de \(\approx 1.34\) e a amplitude de 5 (de 5 a 10) indicam que há alguma variabilidade nas pontuações, mas a maioria dos usuários está concentrada nas pontuações mais altas (6 a 10).
    • O histograma mostra uma distribuição levemente assimétrica à esquerda, com a maioria das pontuações agrupadas em 8, 9 e 7.
    • O box plot confirma esta concentração. Não há outliers aparentes, o que sugere que não houve respostas extremamente incomuns de satisfação (nem muito baixas, nem muito altas em relação ao restante dos dados).
    • Conclusão: A satisfação do usuário com o novo recurso é geralmente alta, com a maioria dos usuários classificando-o entre 7 e 9. Há uma boa consistência nas respostas, e a distribuição não apresenta problemas significativos como outliers extremos.

Referências Bibliográficas

BUSSAB, Luiz O. de M.; MORETTIN, Pedro A. Estatı́stica Básica. 9. ed. São Paulo: Saraiva, 2017.