A base Cai na prova
768 pacientes mulheres, com 21 anos ou mais, de origem indígena Pima. Cada linha é uma paciente.
| Coluna | Significado |
|---|---|
Pregnancies | número de gestações |
Glucose | glicose no plasma (mg/dL) |
BloodPressure | pressão diastólica (mm Hg) |
SkinThickness | dobra cutânea do tríceps (mm) |
Insulin | insulina após 2 horas (μU/mL) |
BMI | IMC (kg/m²) |
DiabetesPedigreeFunction | índice de histórico familiar |
Age | idade (anos) |
Outcome | 1 = tem diabetes, 0 = não tem |
Atenção: zero em Glucose, BloodPressure, SkinThickness, Insulin e BMI significa valor não medido, não uma medida real. Os zeros puxam a média pra baixo.
Comandos
| Comando | O que faz |
|---|---|
df <- read.csv(url) | lê um CSV |
head(df) / head(df, n = 10) | primeiras 6 (ou n) linhas |
tail(df) / tail(df, n = 3) | últimas 6 (ou n) linhas |
dim(df) | linhas e colunas |
nrow(df) / ncol(df) | linhas / colunas |
names(df) ou colnames(df) | nomes das colunas |
str(df) | tipo de cada coluna e primeiros valores |
summary(df) | mínimo, quartis, média e máximo |
df$Glucose | uma coluna como vetor |
df[, c("Glucose", "Age")] | data frame só com essas colunas |
df[df$Age > 50, ] | filtra linhas (não esqueça a vírgula) |
df[df$Outcome == 1 & df$BMI > 30, ] | as duas condições (e) |
df[df$Age < 25 | df$Age > 60, ] | pelo menos uma (ou) |
subset(df, Age > 50, select = c(Age, BMI)) | filtro sem df$ |
sum(df$Age > 50) | conta quantos TRUE |
mean(df$Outcome) | média de 0/1 = proporção de 1 |
Criando um data frame (todas as colunas com o mesmo tamanho):
alunos <- data.frame( nome = c("Ana", "Bruno", "Carla"), idade = c(20, 22, 21), aprovado = c(TRUE, FALSE, TRUE))Exercícios do Lab 1
1. Lendo o CSV (10 pts)
url <- 'https://raw.githubusercontent.com/gazzola/pima_dataset/main/diabetes.csv'diabetes <- read.csv(url) # lê o CSV num data framehead(diabetes) # 6 linhas por padrãoprimeiras <- head(diabetes, n = 7) # 7 primeirasultimas <- tail(diabetes, n = 4) # 4 últimas (linhas 765 a 768)2. Dimensões, nomes, estrutura e summary (15 pts)
dimensoes <- dim(diabetes) # 768 9n_pacientes <- nrow(diabetes) # 768n_variaveis <- ncol(diabetes) # 9colunas <- colnames(diabetes)str(diabetes) # tipo de cada colunatipo_bmi <- class(diabetes$BMI) # "numeric" (tem casas decimais)tipo_idade <- class(diabetes$Age) # "integer" (idade inteira)summary(diabetes) # mínimo 0 em Glucose, BloodPressure e BMI: valor não medidomin_col <- min(diabetes$BMI) # 0max_col <- max(diabetes$BMI)3. Acessando uma coluna com $ (10 pts) Cai na prova: desvio padrão
valores <- diabetes$Glucosemedia <- mean(valores) # 120.89mediana <- median(valores) # 117desvio <- sd(valores) # 31.97, amostral (divide por n − 1)minimo <- min(valores) # 0maximo <- max(valores) # 199resumo_col <- summary(valores)n_zeros <- sum(valores == 0) # 5: TRUE vale 1, então a soma conta os zeros4. Criando um data frame (10 pts)
pacientes <- data.frame( id = c(303, 317, 738, 763), idade = c(27, 58, 62, 32), glicose = c(99, 133, 173, 145))pacientes$alerta <- pacientes$glicose >= 126 # FALSE TRUE TRUE TRUE ($ também cria coluna)dim_pacientes <- dim(pacientes) # 4 4str(pacientes)5. Filtrando linhas (20 pts) Cai na prova: probabilidade condicional pela frequência
glicose_alta <- diabetes[diabetes$Glucose > 155, ]n_glicose_alta <- nrow(glicose_alta) # 117diab_idade <- diabetes[diabetes$Outcome == 1 & diabetes$Age >= 43, ] # & = as duasextremos <- diabetes[diabetes$Age < 25 | diabetes$BMI > 37, ] # | = pelo menos umacom_imc <- diabetes[diabetes$BMI != 0, ] # tira os não medidosmedia_imc <- mean(com_imc$BMI) # maior que mean(diabetes$BMI)prop_diab_alta <- mean(glicose_alta$Outcome) # 0.8034Ligação com a teoria: prop_diab_alta = P(diabetes | glicose > 155) = 94 / 117 = 0,8034. Na base toda, P(diabetes) = 268 / 768 = 0,349. Saber que a glicose é alta muda muito a chance: os eventos são dependentes.
6. Resumo de um grupo filtrado (15 pts) Cai na prova: quartis e boxplot
grupo <- diabetes[diabetes$Pregnancies > 2 & diabetes$Age > 28, ]n_grupo <- nrow(grupo)summary(grupo)resumo_grupo <- summary(grupo$Glucose)q1 <- quantile(grupo$Glucose, .25) # 1º quartilq2 <- quantile(grupo$Glucose, .50) # medianaq3 <- quantile(grupo$Glucose, .75) # 3º quartilboxplot(grupo$Glucose, main = "Glicose do grupo") # caixa vai de q1 a q3, linha do meio = mediana7. Selecionando colunas e linhas (15 pts)
clinico <- diabetes[, c("Glucose", "BMI", "Age", "Outcome")] # data framebloco <- diabetes[1:6, 1:3]diab_gi <- diabetes[diabetes$Outcome == 1, c("Glucose", "Insulin")]obesas <- subset(diabetes, BMI > 37, select = c(Age, BMI, Outcome))glicose_mais_velhas <- diabetes[diabetes$Age > 57, ]$Glucose # vetordiabetes$Glucose devolve vetor (class dá "numeric"). diabetes[, c("Glucose", "BMI")] devolve data frame.
8. Histograma e boxplot (20 pts) Cai na prova
# histograma da pressão diastólica com 15 classes sugeridash <- hist(diabetes$BloodPressure, breaks = 15, main = "Pressão diastólica", xlab = "Pressão (mm Hg)")barras <- h$counts # altura de cada barraclasse_mais_comum <- h$breaks[which.max(h$counts)] # início da barra mais alta: 70boxplot(diabetes$Glucose) # uma caixa sób <- boxplot(Glucose ~ Outcome, data = diabetes, main = "Glicose por grupo") # uma caixa pra 0 e outra pra 1medianas <- b$stats[3, ] # 107 e 140median(diabetes$Glucose[diabetes$Outcome == 1]) # confere: 140Saídas reais da base (conferidas)
Histograma da pressão (breaks = 15): o R arredonda pra classes de 10 em 10, de 0 a 130.
| Classe | 0 a 10 | 10 a 20 | 20 a 30 | 30 a 40 | 40 a 50 | 50 a 60 | 60 a 70 | 70 a 80 | 80 a 90 | 90 a 100 | 100 a 110 | 110 a 120 | 120 a 130 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Pacientes | 35 | 0 | 3 | 2 | 24 | 94 | 217 | 228 | 127 | 25 | 11 | 1 | 1 |
Os 35 da primeira classe são os zeros (não medidos). Fora eles, a distribuição é aproximadamente simétrica em torno de 70.
b$stats de boxplot(Glucose ~ Outcome, data = diabetes):
| Linha | Significa | Grupo 0 (sem diabetes) | Grupo 1 (com diabetes) |
|---|---|---|---|
| 1 | bigode inferior | 56 | 78 |
| 2 | Q1 | 93 | 119 |
| 3 | mediana | 107 | 140 |
| 4 | Q3 | 125 | 167 |
| 5 | bigode superior | 173 | 199 |
b$n = 500 e 268. Outliers (b$out): o grupo 0 tem 14 (os 3 zeros, o 44 e dez valores acima de 173). O grupo 1 tem só 2 (os zeros).
Coluna Glucose: média 120,89 · desvio padrão 31,97 · variância 1022,25 · mediana 117 · 5 zeros · Q1 99 · Q3 140,25 · máximo 199.