Por favor, salve o teste em sua pasta diretório.
diag.tu() package:unknown R Diagnóstico de turmas Descrição: A função diag.tu salva um .csv com as médias, podendo ser média ponderada ou comum; gera e salva gráficos de diagnóstico; lista e salva os nomes de alunos com médias baixas; e pode gerar um teste de ANOVA comparando as médias das turmas. Argumentos: nomes = “character”. Nome da coluna ou vetor que contem o nome dos alunos. notas = “numeric”. Data.frame contendo as colunas de interesse. prof = “character”. Vetor contendo o nome do professor. pesos = “numeric”. Vetor contendo um peso por coluna de notas, referente ao cálculo da média ponterada. Exemplo: “c(peso para prova 1, peso para prova 2 (...))”. Padrão média não-ponderada. corte = “numeric”. Valor inteiro do corte que a escola considera entre nota azul e vermelha. Ex.: 5. turma = “character”. Nome da coluna ou vetor referente à qual turma pertencem os alunos, na mesma ordem de nomes. Máximo recomendado de 10 turmas. graf = Padrão (b) cria boxplots por turma. Caso (h) substitui pelo histograma por turmas. stt = Argumento por padrão FALSE, caso TRUE faz um teste tipo anova das medias das turma. Uso: diag.tu<-function(nomes, prof, notas, pesos=NULL, corte, turma, graf="b", stt=FALSE) Detalhes: A função faz um breve diagnóstico de turmas, calculando as médias por aluno (ponderada ou não), e gerando gráficos de boxplot ou histogramas, conforme o interesse do educador ou coordenador. A saída apresenta os nomes dos alunos que tiveram notas baixas. A Função oferece também a possibilidade de realizar um teste tipo ANOVA, a fim de detectar diferenças reais entre as turmas. Avisos: Para que os gráficos sejam legíveis, se atenha ao máximo de 10 turmas por vez. É necessário atenção às classes dos argumentos. A função não é capaz de detectar possíveis notas faltantes, por isso é sempre bom averiguar o banco de notas. Autora: Giulia Baldaconi S. Bispo giulia.bispo@usp.br / gi.baldaconi@gmail.com Exemplos: ##CSV## #Médias não ponderadas, gráfico “b” e com teste estatístico. Por favor, salve o teste em sua pasta diretório. teste<-read.csv("teste_diagtu.csv",sep=";", as.is=T) turmas<-teste$Turma nome<-teste$Alunos notas<-data.frame(teste$P1,teste$P2,teste$Seminario,teste$P3) prof<-"Prof.Xis" diag.tu(nomes=nome, prof=prof, notas=notas, corte=6, turma=turmas, stt=T) ##Vetores## #Média ponderada com histograma, de um ano inteiro. grad<-seq(0,10, by=0.25) altas<-seq(6,10, by=0.25) baixas<-seq(0,7, by=0.25) p1<-sample(grad,280,replace=T) p2<-sample(altas,280,replace=T) p3<-sample(grad,280,replace=T) p4<-sample(baixas,280,replace=T) p5<-sample(baixas,280,replace=T) p6<-sample(altas,280,replace=T) p7<-sample(grad,280,replace=T) p8<-sample(altas,280,replace=T) pfinal<-sample(altas,280,replace=T) prec<-sample(altas,280,replace=T) seminar<-sample(altas,280,replace=T) notasano<-data.frame(p1,p2,p3,p4,p5,p6,p7,p8,pfinal,prec,seminar) nomes<-rep("fulano",280) X<-"Prof.Xis" turma<-c(rep("1A",30), rep("1B",20), rep("1C",30), rep("1D", 20), rep("2A",30), rep("2B",30), rep("2C",30), rep("3A",30), rep("3B",30), rep("3C",30)) pesos<-c(1,2,1,2,1,2,1,3,4,1,1) corte<-6 diag.tu(nomes=nomes, prof=X, notas=notasano, corte=6, pesos=pesos, turma=turma, graf="h", stt=F)
diag.tu <- function(nomes, prof, notas, pesos=NULL, corte, turma, graf="b", stt=FALSE) {#Normalmente escolas tem muitos alunos, então coloquei essa primeira mensagem pra pessoa ler enquanto o R trabalha: cat("\t Bem vindo! Isso pode levar alguns segundos, favor aguarde. É sempre bom verificar se todas as notas foram colocadas em seus devidos lugares, para que ninguem seja prejudicado ;). Caso a funcao de erros relacionados a NAs, verifique seus dados. \n") #Testando as premissas dos argumentos if(missing(nomes)) stop("insira coluna Nomes dos Alunos") # Caso o usuario nao insira $nomes a funcao emite um aviso if(missing(prof)) stop("insira coluna Nome do Professor") # Caso o usuario nao insira o $prof a funcao emite um aviso if(missing(notas)) stop("insira coluna Notas dos Alunos") # Caso o usuario nao insira $$notas, a funcao emite um aviso if(missing(corte)) stop("insira a Nota de Corte") # Caso o usuario nao insira a nota considerada corte na escola, a funcao emite um aviso ### if(class(nomes)!="character") # Caso nomes nao seja da classe correta { stop ("nomes precisa ser character") # A funcao emite um aviso } if(class(prof)!="character") # Caso profs nao seja da classe correta { stop ("prof precisa ser character") # A funcao emite um aviso } if(class(notas)!="data.frame") # Caso notas nao seja DA CLASSE CORRETA { stop ("notas precisa ser um data.frame numerico") # A funcao emite um aviso } if(class(corte)!="numeric") # Caso a nota de corte nao seja DA CLASSE CORRETA { stop ("o corte precisa ser numerico") # A funcao emite um aviso } ### Calculo das medias if(is.null(pesos)) #pesos tem padrão NULL, na ausencia deles, faz media comum: { medias<-apply(notas,1,mean) #fazendo a media simples } if(length(pesos) != 0) #caso pesos exista, ele calcula a media ponderada, mas antes testa algumas premissas: { if(class(pesos)!="numeric") # Caso os pesos nao sejam DA CLASSE CORRETA { stop ("pesos precisam ser numericos") # A funcao emite um aviso } if(dim(notas)[2]!= length(pesos)) # Caso o numero de colunas de notas seja diferente do n de pesos { stop("Insira pesos para todas as notas, em igual ordem") # A funcao emite um aviso solicitando a correcao } else{} #premissas cumpridas! segue normalmente medias<-rep(NA, nrow(notas)) #abrindo um vetor vazio para guardar os resultados do for de i umporum<-matrix(ncol=ncol(notas), nrow=nrow(notas)) #matriz vazia pra resultados do for de j por linha for(i in 1:(length(medias))) { for(j in 1:nrow(notas)) #multiplicara as notas pelos pesos delas { for (m in 1:ncol(notas)) #abre for para a dimensao m da matriz por linha { umporum[j,m]<-pesos[m]*notas[j,m] #e guarda aqui } } denominador<-sum(pesos) #soma os pesos medias[i]<-(sum(umporum[i,]))/denominador #calcula e guarda as medias ponderadas por aluno } } DIAG_tu<-data.frame(nomes,turma,medias) #criando o data.frame de output write.csv(DIAG_tu, file="DIAG_tu.csv") #salvando os resultados das medias. vermelhas<-nomes[(medias<corte)==T] #alunos com medias vermelhas serao listados no console write.table(vermelhas, file="ATENCAO_para.txt", sep=",") #e serao salvos num .txt ##Graficos## if(graf=="b") #padrão boxplot { colorir<-rgb(runif(nlevels(as.factor(turma))),runif(nlevels(as.factor(turma))),runif(nlevels(as.factor(turma)))) #Cria um vetor de cores para as caixinhas, aleatorios e adaptaveis ao numero de turmas que vier x11() #abre uma janela para o boxplot boxplot(medias~turma, las=1, xlab="Distribuicao de medias por turma", ylab=" ", main=prof, col=colorir, bty="l") #gera o boxplot por turma savePlot(filename="DIAG_tu.png", type="png", device=dev.cur()) #salva o grafico gerado } if(graf=="h") #histograma { fator.turma<-as.factor(turma) #transforma turma em fator, para sabermos os níveis inseridos pelo usuário nro.turmas<-nlevels(as.factor(turma)) #quantos níveis tem, ou seja, quantas turmas? colorir<-rgb(runif(nlevels(as.factor(turma))),runif(nlevels(as.factor(turma))),runif(nlevels(as.factor(turma)))) #Cria um vetor de cores para as caixinhas x11() #abrindo a janela para os histogramas if(nro.turmas<2) #se tiver so uma turma, a janela nao precisa ser dividida { par(mfrow=c(1,1)) #um por um } else{ #se tiver mais do que 1 turma pares <- function(x) {x %% 2 == 0} #crio uma funcao pra descobrir se o nro de turmas e par. Ela testa se o resto da divisão de x por 2 e = 0. if(pares(nro.turmas)==TRUE) #caso seja par, divido a janela desse jeito { par(mfrow=c(2,((nro.turmas)/2))) #dividindo a janela de um jeito BEM generico } else{par(mfrow=c(2,((nro.turmas+1)/2)))} #se for impar, divido desse outro jeito generico } turma.tal<-rep(NA, nro.turmas) #criando um vetor vazio para os títulos dos graficos for(t in 1:nlevels(as.factor(turma))) #abrindo o for que vai gerar histogramas { for(k in 1:nro.turmas) #abrindo o for que vai gerar os titulos dos histogramas { turma.tal[k]<-levels(fator.turma)[k] #gerando titulos para niveis do fator turma } hist(medias[turma==levels(fator.turma)[t]], bty="l", xlab="Distribuicao de notas", ylab="Frequencia das notas", main=turma.tal[t], col=sample(colorir,1)) #varios histogramas } savePlot(filename="DIAG_tu.png", type="png", device=dev.cur()) #salva o grafico gerado } cat("\t Pode conferir sua pasta diretorio, os arquivos DIAG_tu e ATENCAO_para ja estao salvos la! \n") #poe na tela!! if(stt==FALSE){return(list(DIAG_tu,vermelhas))} #caso nao tenha stt, retorna a lista com as medias e a lista de nomes de alunos que precisam de uma ajuda extra if(stt==TRUE){ #caso tenha, a funcao gera o anova das medias por turma stts<-aov(medias~turma) #faz o teste anova(stts) #mas mostra só a FAMOSA TABELA DO ANOVA return(list(DIAG_tu,vermelhas,anova(stts))) #retorna medias, alunos que precisam de ajuda e o teste! } ### ## ## ## #### Agradeco ao corpo docente, em especial aos monitores(as) e suas ajudas inusitadas (ate no corredor)### ##### }