# 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}")Reforço: Probabilidade Condicional, Teorema de Bayes, Estatística Descritiva e AED
Revisando e Praticando Conceitos Essenciais para Análise de Dados
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)
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;
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;
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):
-
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\).
-
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:
-
Probabilidade Condicional e Teorema de Bayes:
- 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})\)).
- Interprete o resultado para a equipe de desenvolvimento.
-
Estatística Descritiva e AED (Satisfação do Usuário):
- Calcule a média, mediana, moda, desvio padrão amostral e amplitude das pontuações de satisfação do usuário.
- Crie um histograma da distribuição das pontuações de satisfação.
- Crie um box plot das pontuações de satisfação.
- 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)\).
-
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))-
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]
-
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)))- 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()- Box Plot:
-
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.