Pular para o conteúdo
N2 · tópico 2 de 7

Lab 1: DataFrames em R com a base de diabetes (Pima)

A base Cai na prova

768 pacientes mulheres, com 21 anos ou mais, de origem indígena Pima. Cada linha é uma paciente.

ColunaSignificado
Pregnanciesnúmero de gestações
Glucoseglicose no plasma (mg/dL)
BloodPressurepressão diastólica (mm Hg)
SkinThicknessdobra cutânea do tríceps (mm)
Insulininsulina após 2 horas (μU/mL)
BMIIMC (kg/m²)
DiabetesPedigreeFunctioníndice de histórico familiar
Ageidade (anos)
Outcome1 = 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

ComandoO 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$Glucoseuma 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 zeros

4. 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.8034

Ligaçã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 = mediana

7. 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          # vetor

diabetes$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: 140

Saídas reais da base (conferidas)

Histograma da pressão (breaks = 15): o R arredonda pra classes de 10 em 10, de 0 a 130.

Classe0 a 1010 a 2020 a 3030 a 4040 a 5050 a 6060 a 7070 a 8080 a 9090 a 100100 a 110110 a 120120 a 130
Pacientes350322494217228127251111

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):

LinhaSignificaGrupo 0 (sem diabetes)Grupo 1 (com diabetes)
1bigode inferior5678
2Q193119
3mediana107140
4Q3125167
5bigode superior173199

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.