Permalink
Switch branches/tags
Nothing to show
Find file Copy path
Fetching contributors…
Cannot retrieve contributors at this time
598 lines (408 sloc) 31.4 KB
%\documentclass[12pt]{article}
\documentclass[espaco=simples,appendix=Name]{abnt}
%\usepackage{abntex}
\usepackage{multirow}
\usepackage[brazil]{babel}
\usepackage[T1]{fontenc}
\usepackage[utf-8]{inputenc}
\usepackage{hyperref}
\usepackage{times}
\usepackage{listings}
\usepackage[dvips]{graphicx}
\usepackage[num]{abntcite} % citacoes do abntex
\usepackage{tabela-simbolos} % tabelas de simbolos do abntex
\usepackage{dsfont} % fonte
\usepackage{fancyvrb}
\newcommand{\code}[1] {\textbf{#1}}
\citeoption{abnt-full-initials=yes}
\lstset{language=Ruby,caption=Exemplo,label=Ruby, numbers=left, frame=single}
\title{Estatística aplicada à linguagem de programação Ruby}
\author{Jônatas Davi Paganini}
\date{fevereiro de 2010}
\begin{document}
\maketitle
\chapter{Introdução}
Este trabalho é composto por duas raízes básicas de estudo: A estatística aplicada e programação básica na linguagem Ruby. O primeiro busca explicar as fórmulas e exibir os passos para chegar a um determinado resultado. A segunda tem como objetivo automatizar o processamento das fórmulas e passos realizados anteriormente.
O estudo da estatística é simples e objetivo, cada dado é captado por uma pesquisa com algum objetivo, é executado em um determinado tempo e local. Em outras palavras, uma pesquisa deve ser composta pelos elementos básicos: O quê, quando e quem.
Através do estudo da estatística, exemplo de cálculos práticos, este artigo procura abordar o uso da linguagem de programação Ruby como ferramenta para automatizar os cálculos estatísticos e codificação das fórmulas e decomposição do raciocíonio lógico. Através dos exemplos práticos de codificação, cada assunto será codificado, e os novos elementos da linguagem de programação Ruby, serão explicados, após o seu uso, tornando o ensino da programação, uma formalidade do assunto precedido.
Este estudo pretende abordar o conteúdo de forma suscinta, tornado a linguagem de programação apenas uma ferramenta simples para ajudar a automatizar o processo. Através deste, será possível experimentar diversas abordagens da linguagem de programação para resolução dos problemas. Neste artigo serão apresentados a resolução de problemas do tipo estatístico.
\chapter{Estatística descritiva}
A estatística descritiva, é a técnica usada para resumir, comparar, observar e descrever informações relevantes de um ou mais conjuntos de dados. Um conjunto de dados pode ser análisado básicamente em dois passos: organização e método.
Segundo Jairo e Gilberto \cite{cursoEstatistica}, a estatística descritiva, como o próprio nome sugere, se constitui num conjunto de técnicas que objetivam descrever, analisar e interpretar os dados numéricos de uma população ou amostra.
\section{ Distribuição de frequência }
\subsection { Na estatística }
Dado uma pesquisa realizada na turma do último ano de sistemas de informação, no ano de 2010, buscando saber mais informações a respeito da faixa etária da turma foram obtidas as seguintes idades:
23, 31, 31, 21, 31, 26, 31, 22, 22, 24, 31, 21, 22, 20, 22, 31, 21, 20
A partir das idades (dados) coletados acima serão analisados e classificados os dados. Os dados acima exibidos estão na forma bruta, ou seja, aleatória e desorganizada.
Codificando em Ruby é possível representar os mesmos dados brutos através de um vetor de números, e podem ser atribuídos a uma variável chamada \code{dados\_brutos}.
\lstinputlisting[linerange=1-2, caption=Atribuindo dados brutos a uma variável]{estatistica.rb}
No exemplo acima, dados\_brutos é o nome da variável que recebe o vetor de números. O operador \code{=}(igual) identifica que a variável dados\_brutos é igual ao vetor declarado posteriormente.
Um vetor ou \textit{Array} é delimitado pelo compilador Ruby através dos caractéres de abertura de colchetes para iniciar os elementos e fechamento de colchetes para declarar o fim dos elementos.
A quebra de linhas e espaços em branco não fazem diferença alguma para o compilador, pois os dados acima estão dispostos em duas linhas para ficar mais legível para estudo.
\section { Análise e classificação dos dados }
O primeiro passo para entender e análisar os dados com mais facilidade é ordenar os elementos por ordem crescente ou decrescente, neste caso será utilizado ordem crescente.
\subsection { Rol }
Este método de organização consiste em ordenar os dados em ordem crescente ou decrescente, de forma que permita identificar e contar com facilidade os elementos de cada valor.
20, 20, 21, 21, 21, 22, 22, 22, 22, 23, 24, 26, 31, 31, 31, 31, 31, 31
\subsection { Implementando Rol em Ruby }
Observando a sequência dos números acima, é possível realizar o mesmo procedimento utilizando um método de ordenação dos valores no vetor. Este método é chamado de \code{sort} e nativamente ordena os elementos de um \textit{Array}.
\lstinputlisting[linerange=3-3,
caption=Atribuindo dados brutos a uma variável]{estatistica.rb}
Neste caso, sabe-se que uma váriavel \code{rol} recebe o resultado do método de ordenação \code{sort} referente aos \code{dados\_brutos}.
Inspecionando o resultado da variável \code{rol}, temos o seguinte vetor:
\lstinputlisting[linerange=4-4,
caption=Inspecionando a variável rol]{estatistica.rb}
Através do método \code{p} é possível imprimir em tela os valores de um objeto em Ruby. Este método tem o objetivo de ajudar o programador a entender como funciona o código e visualizar as propriedades de uma variável. No exemplo anterior, foi usado para visualizar se a ordem das idades que estão na variável \code{rol} está correta.
\subsection { Frequência absoluta (fi) }
Sabendo que o rol já está organizado, é possível inserir as frequências absolutas dos dados. A primeira informação a se extrair do \code{rol} é a \code{frequência absoluta}, também caracterizado pela sigla \code(fi). O \code{fi} é determinada pelo número de repetições de cada dado da consulta. Neste exemplo, é dada pela quantidade de alunos com a mesma idade.
Desta forma teríamos a seguinte classificação:
20, 20
21, 21, 21
22, 22, 22, 22
23
24
26
31, 31, 31, 31, 31, 31
Conforme os números acima, é possível concluir que a frequência absoluta dos alunos com 20 anos de idade é 2, assim como, 21 é 3, 26 é 1 e existem 6 alunos com 31 anos.
Entendendo que o objetivo deste cálculo é contar os dados com mesmo valor, já é possível avançar este passo na programação.
\subsection { Implementando a frequência absoluta (fi) em Ruby }
Sabendo que a variável \code{rol} possuí as idades ordenadas, existem várias formas de implementar a solução. A primeira forma, aborda a contagem de elementos de cada tipo, e o amarzenamento dele é feito através de um \code{Hash}. Este tipo de elemento, funciona como uma estrutura, que permite adicionar chaves com um determinado valor. Esta chave, pode ser um objeto de qualquer tipo, e também é possível recuperar ou estabelecer um valor para uma chave.
O algorítmo que será criado, consiste em criar um \code{Hash} ou seja, uma variável que possua várias chaves e valores. E cada chave, será representada pela própria idade, e o valor, será a quantidade de vezes que aquela idade passou está presente no \code{rol}.
Senão existir um \code(fi) para aquela idade, então será adicionado o valor 1 para aquela idade.
Caso contrário, se encontrar a idade, será adicionado mais 1 na frequência absoluta desta idade.
\lstinputlisting[linerange=5-12, label=fi,
caption=criando o fi]{estatistica.rb}
O código acima é iniciado pela declaração de uma nova variável, que se chama \code{fi} e sabe-se que é do tipo \code{Hash}, pois é inicializada com chaves(\code{\{\}}).
Logo na linha 2, é iniciado uma iteração(método \code{each}) com cada \code{idade} do \code{rol}. Esta variável (\code{idade}) é declarada após o método \code{each} e reconhecida pelo \textbf{bloco} delimitado por \code{do} e \code{end}(linhas 6 e 12). As variáveis de bloco, declaradas após \code{do}(linha 6) só funcionam dentro do bloco(\code{do..end}) e são interpoladas pelo caracter \code{|}.
Para simplificar a explicação, é possível acompanhar na prática como este código funciona. A variável em foco neste momento, é \code{fi}, ou seja, o \code{Hash} de \code{idades} com suas respectivas \textbf{quantidades}.
Usando o método \code{p} na variável \code{fi}, é possível acompanhar passo a passo, as frequências absolutas sendo somadas.
Uma simples inspeção pode ser adicionada, como neste fragmento de código:
\begin{lstlisting}[caption=Inspecionando a soma dos elementos, emph=2]
p fi
\end{lstlisting}
Se o código acima for adicionado após a linha 6 da listagem do fi \ref{fi}, então irá imprimir as seguintes linhas:
\begin{lstlisting}[caption=inspeção da variável \code{fi} ]
{}
{20=>1}
{20=>2}
{20=>2, 21=>1}
{20=>2, 21=>2}
{20=>2, 21=>3}
{22=>1, 20=>2, 21=>3}
{22=>2, 20=>2, 21=>3}
{22=>3, 20=>2, 21=>3}
{22=>4, 20=>2, 21=>3}
{22=>4, 23=>1, 20=>2, 21=>3}
{22=>4, 23=>1, 24=>1, 20=>2, 21=>3}
{22=>4, 23=>1, 24=>1, 20=>2, 26=>1, 21=>3}
{22=>4, 23=>1, 24=>1, 31=>1, 20=>2, 26=>1, 21=>3}
{22=>4, 23=>1, 24=>1, 31=>2, 20=>2, 26=>1, 21=>3}
{22=>4, 23=>1, 24=>1, 31=>3, 20=>2, 26=>1, 21=>3}
{22=>4, 23=>1, 24=>1, 31=>4, 20=>2, 26=>1, 21=>3}
{22=>4, 23=>1, 24=>1, 31=>5, 20=>2, 26=>1, 21=>3}
{22=>4, 23=>1, 24=>1, 31=>6, 20=>2, 26=>1, 21=>3}
\end{lstlisting}
Observe como na primeira iteração o \code{fi} está vazio, e logo a idade \code{20} (linha 2) ganha a primeira quantidade \code{1}. Na segunda vez, o \code{fi} para idade 20 já existe, então acrescenta-se mais \code{1} ao \code{fi} desta \code{idade}(executa o código do \code{else}). Na próxima linha o ciclo se inicia novamente com a \textbf{idade 21}, fazendo com que a variável \code{fi} ganhe uma quantidade 1 para a idade 21.
\subsection { Entendendo o funcionamento de um Hash }
A classe \code{Hash} não possúi ordenação, por este motivo, a impressão dos elementos acima, não manteve a mesma sequência entre as idades e as quantidades respectivas, mas manteve consistência nos valores.
Este tipo de objeto também pode ser declarado da seguinte forma:
\begin{lstlisting}[caption=Sintaxe de declaração de um \code{Hash}]
aluno = {
:nome => "jonatas",
:idade => 23
}
\end{lstlisting}
No código acima, uma variável chamada aluno foi declarada, esta variável é um tipo de \code{Hash}, e é delimitada por abertura de chaves e fechamento de chaves. Os elementos internos como \code{:nome} e \code{:idade} são conhecidos como chaves, e \code{"jonatas"} e 23 são seus respectivos valores. Desta forma é possível acessar os valores através das chaves, e as chaves devem ficar entre colchetes, conforme o exemplo abaixo.
\begin{lstlisting}[caption=Usufruindo dos métodos do \code{Hash}]
puts aluno[:nome]
aluno[:idade] += 10
\end{lstlisting}
A primeira linha do código anterior imprime o nome do aluno(\code{jonatas}), enquanto a segunda, adiciona mais 10 anos a chave \code{:idade}. O mesmo exemplo da segunda linha poderia ser escrito da seguinte forma:
\begin{lstlisting}[caption=Somando 10 anos a chave :idade]
aluno[:idade] = aluno[:idade] + 10
\end{lstlisting}
Desta forma é possível deduzir que uma atribuição de uma nova chave em um \code{Hash}, é da mesma forma como a concatenação de um valor.
\begin{lstlisting}[caption=Atribuindo o valor 23 para a chave :idade da variável aluno]
aluno[:idade] = 23
\end{lstlisting}
\section { Tabelas Estatísticas }
Existem várias exigências para a criação de uma tabela estatística, e estas, se encaixam em uma estrutura de:
\begin{itemize}
\item{cabeçalho}
\item{corpo}
\item{rodapé}
\end{itemize}
A tabela estatística, Com estes três elementos descritos de forma coerente, é possível ler os dados de uma tabela sem esforço.
O primeiro passo, é declarar o cabeçalho, que deve conter informações suficientes para responder \code{o quê}, \textbf{quando} e \textbf{onde}. Deve primeiramente descrever \textbf{o quê} está demonstrando, deve apresentar uma data ou ano explicando \textbf{quando} ocorreu a pesquisa ou fato. E por último, deve apresentar a fonte dos dados, de \textbf{onde} eles vieram.
\begin{table}
\caption{Pesquisa da idade dos alunos do curso do quarto ano de Sistemas de Informação da Unipar de Francisco Beltrão, no ano de 2010.}
\begin{tabular}{|l|c|}
\hline
Idade & Frequência Absoluta (\code{fi}) \\ \hline
20 & 2 \\
21 & 3 \\
22 & 4 \\
23 & 1 \\
24 & 1 \\
26 & 1 \\
31 & 6 \\
\hline
\end{tabular}
\small{Fonte: Unipar}
\end{table}
\subsection { Frequência Relativa }
Em uma pesquisa, têm-se o número de participantes, por exemplo, na tabela acima consta um total de 18 alunos com idades entre 20 e 31 anos. A frequência relativa é determinada pela razão entre a frequência absoluta (fi) e o número total de elementos (como o total de alunos), ou seja, a frequência relativa, é o percentual equivalente na amostra. \ref{tabela FR}
A frequência relativa de um valor é dada por:
\begin{equation}
\label{fr}
fr = \frac{Fi}{n} * 100
\end{equation}
\begin{table}
\caption{Pesquisa da idade dos alunos do curso do quarto ano de Sistemas de Informação da Unipar de Francisco Beltrão, no ano de 2010.}
\label{tabela FR}
\begin{tabular}{|l|c|c|}
\hline
Idade & Frequência Absoluta (\code{fi}) & Frequência Relativa (\code{fr}) \\ \hline
20 & 2 & 2 / 18 \\
21 & 3 & 3 / 18 \\
22 & 4 & 4 / 18 \\
23 & 1 & 1 / 18 \\
24 & 1 & 1 / 18 \\
26 & 1 & 1 / 18 \\
31 & 6 & 6 / 18 \\
\hline
\begin{math}
\sum
\end{math} & 18 & 18 / 18 = 100\% \\
\hline
\end{tabular}
\small{Fonte: Unipar}
\end{table}
Sendo assim, é possível transformar os mesmos valores em percentuais, como o exemplo da tabela \ref{tabela FR percentual}.
\begin{table}
\caption{Pesquisa da idade dos alunos do curso do quarto ano de Sistemas de Informação da Unipar de Francisco Beltrão, no ano de 2010.}
\label{tabela FR percentual}
\begin{tabular}{|l|c|c|c|}
\hline
Idade & \code{fi} & \code{fr} & \code{fr\%} \\ \hline
20 & 2 & 2 / 18 & 11,11 \\
21 & 3 & 3 / 18 & 16,66 \\
22 & 4 & 4 / 18 & 22,22 \\
23 & 1 & 1 / 18 & 5,55 \\
24 & 1 & 1 / 18 & 5,55 \\
26 & 1 & 1 / 18 & 5,55 \\
31 & 6 & 6 / 18 & 16,66 \\
\hline
\begin{math}
\sum
\end{math} & 18 & 18 / 18 & 100,00 \% \\
\hline
\end{tabular}
\small{Fonte: Unipar}
\end{table}
% \small{
% Legenda:
% \code{fi}: Frequência absoluta
% \code{fr}: Frequência relativa
% \code{fr\%}: Frequência relativa percentual
% }
% frequencia relativa
% fac
% fad
% ponto medio
% moda
% media aritmética
% dispersão e medidas
% interessante: distribuição normal
\subsection { Implementando a frequência relativa (fr) em Ruby }
Sabe-se que a construção da frequência absoulta (\code{fi}) através da codificação Ruby, está representado através da instância de uma variável chamada \code{fi} e é do tipo \code{Hash}. Para \textbf{cada dado da variável fi} existe uma frequência absoluta, e através do método \code{each}, é possível iterar sobre cada dado e sua frequência absoluta:
\lstinputlisting[firstline=15, lastline=15, caption=Iterando sobre cada dado e frequência absoluta.]{estatistica.rb}
A linha acima é a declaração de que \code{cada (each)} dado e frequência absoluta da variável fi, será utilizado nas próximas linhas através da variável \code{idade} que representa a própria idade usada na pesquisa, acompanhado da variável \code{frequencia\_absoulta}. Desta forma é possível realizar o cálculo da frequência relativa(fr) de cada frequência absoluta, usando o mesmo \ref{fr} cálculo antes representado, mas agora usando as variáveis disponíveis.
\lstinputlisting[firstline=13, lastline=17, caption=Iterando sobre cada dado e frequência absoluta.]{estatistica.rb}
Como a frequência relativa também possuí um dado e valor, será usado o mesmo tipo de variável da frequência absoluta, por este motivo é inicializado da mesma forma(linha 13).
A variável \code{n} recebe o tamanho da amostra. Como a variável \code{dados\_brutos} é do tipo \code{Array}, ou seja, é um vetor de elementos, ela possui uma propriedade chamada \code{size} que traduzindo do inglês para português significa \code{tamanho}. No caso desta pesquisa o total é \code{18}, ou seja, a quantidade de alunos pesquisados a respeito de suas idades.
Da mesma forma como é iterado sobre o \code{rol} para encontrar o \code{fi}, a frequência relativa (\code{fr}) de cada \code{idade} é igual (\code{=}) a frequência absoluta(\code{frequencia\_absoluta}) dividído ( \code{/} ) pela quantidade de alunos da pesquisa (\code{n}) e multiplicado por 100 (\code{ * 100 }).
\subsection{ Frequência absoluta acumulada}
Este dado é composto da soma das frequências absolutas dos valores inferiores ou iguais ao valor dado. \ref{tabela FAC percentual}
\begin{table}
\caption{Pesquisa da idade dos alunos do curso do quarto ano de Sistemas de Informação da Unipar de Francisco Beltrão, no ano de 2010.}
\label{tabela FAC percentual}
\begin{tabular}{|l|c|c|c|c|}
\hline
Idade & \code{fi} & \code{fr} & \code{fr\%} & \code{fac}\\ \hline
20 & 2 & 2 / 18 & 11,11 & 2 \\
21 & 3 & 3 / 18 & 16,66 & 5 \\
22 & 4 & 4 / 18 & 22,22 & 9 \\
23 & 1 & 1 / 18 & 5,55 & 10 \\
24 & 1 & 1 / 18 & 5,55 & 11 \\
26 & 1 & 1 / 18 & 5,55 & 12 \\
31 & 6 & 6 / 18 & 16,66 & 18 \\
\hline
\begin{math}
\sum
\end{math} & 18 & 18 / 18 & 100,00 \% & \\
\hline
\end{tabular}
\small{Fonte: Unipar}
\end{table}
\subsection{ Implementando a frequência absoluta acumulada (fac) em Ruby}
Em Ruby, da mesma maneira como é criado a frequência relativa e absoluta, é necessário iterar sobre os elementos e contar as suas frequências absolutas. A diferença é que o valor agora deve ser acumulado, somando a frequência absoluta(\code{fi}) da \code{idade } à frequência absoluta acumulada até o item anterior. Quando iniciar, não existindo frequência acumulada anterior, o acumulado inicia com o valor da primeira frequência absoluta.
Desta forma, a obtenção dos frequências absolutas acumuladas das idades é estruturada na seguinte regra:
\begin{itemize}
\label{algoritmo fac}
\item{Buscar todas as idades únicas em ordem crescente}
\item{Iterar sobre cada uma, pegando sua frequência absoluta}
\item{\code{Senão} houver frequência \code{acumulada}}
\subitem{Então o valor \code{acumulado} é igual a frequência absoluta(\code{fi}) da \code{idade} }
\item{\code{Senão}}
\subitem{O valor acumulado é igual a soma dele mesmo(\code{acumulado}) \code{mais} a frequência absoluta da idade(\code{fi[idade]}.}
\end{itemize}
Com base no algorítmo anterior é possível construir o programa em Ruby.
\lstinputlisting[firstline=20, lastline=20, caption=Buscar todas as idades únicas em ordem crescente]{estatistica.rb}
A variável \code{fi}, como já mencionado anteriormente, é do tipo \code{Hash}, que é uma variável que permite muitas chaves(\code{keys}) e valores(\code{values}). Nesta situação, as chaves (\code{keys}) são as próprias idades das frequências absolutas(\code{values}). Como é necessário iterar sobre cada idade de ascendente, para trabalhar com idades únicas é usado:
\begin{lstlisting}[caption=Inspecionando apenas as idades das frequências absolutas]
p fi.keys
\end{lstlisting}
O comando acima imprime o conteúdo de uma variável do tipo \code{Array} semelhante a esta, que representa todas as idades de forma única e desorganizada:
\begin{lstlisting}[caption=Idades das frequências absolutas podem ser usadas com o método de acesso]
[22, 23, 24, 31, 20, 26, 21]
\end{lstlisting}
O próximo passo é organizar os elementos, como feito nos dados brutos para se transformar em rol. Apenas adicionando o método sort.
\begin{lstlisting}[caption=Ordenando as idades das frequências absolutas com o método \code{sort}]
p fi.keys.sort
\end{lstlisting}
As idades quando ordenadas da forma acima são representadas:
\begin{lstlisting}[caption=Idades das frequências absolutas ordenadas pelo método \code{sort}]
[20, 21, 22, 23, 24, 26, 31]
\end{lstlisting}
Com as variáveis dispostas como no caso anterior, é possível iniciar a iteração sobre cada idade de forma ascendente. Para isso é usado o método \code{each}. Antes de iniciar o cálculo, é necessário inicializar a variável que irá acumular o valor.
Quando uma váriavel é inicializada com \code{nil}, é equivalente ao negação \code{false}, desta forma, é possível verificar \textbf{senão acumulado} ainda, da mesma maneira que o valor \code{false}.
\lstinputlisting[firstline=21, lastline=21, caption=Verificação da existência de um valor acumulado]{estatistica.rb}
Seguindo a especificação do algorítmo anteriormente abordado \ref{algoritmo fac}, \code{Senão} houver frequência \code{acumulada}, Então o valor \code{acumulado} é igual a frequência absoluta(\code{fi}) da \code{idade}
\lstinputlisting[firstline=22, lastline=22, caption=Valor acumulado é inicializado com a frequência absoluta da idade inicial]{estatistica.rb}
Quando a variável acumulada receber o primeiro valor, então nas próximos idades, a frequência absoluta da idade será somada ao valor já existente.
Usando a estrutura condicional \code{if}, é possível verificar uma condição lógica, a negação desta estrutura é utilizada através do comando \code{else}, que é permitido apenas dentro de uma declaração \code{if}. No código que compara a não existência do valor acumulado, a existência do mesmo é garantida no bloco \code{else}: linha 23.
\lstinputlisting[firstline=21, lastline=25, caption=Buscar todas as idades únicas em ordem crescente]{estatistica.rb}
Dentro do bloco \code{else}, representado neste caso apenas pela linha 24, é atribuido o valor acumulado a soma dele mesmo com a frequência absoluta existente. O operador \code{+=} (lê-se "mais igual") é utilizado para fazer esta atribuição. A atribuição desta forma é correspondente à:
\begin{lstlisting}[caption=Operador \code{+=} escrito de outra maneira ]
acumulado = acumulado + fi[idade]
\end{lstlisting}
Seguindo estes passos é possível atribuir o \code{fac} de cada idade com o valor acumulado:
\lstinputlisting[firstline=26, lastline=26, caption=fac da idade recebe o valor acumulado]{estatistica.rb}
O cálculo do \code{fac} completo, trata-se então por percorrer todos as frequências acumuladas \code{fi}, acumulando o valor no novo \code{Hash} atribuído a variável \code{fac} o valor \code{acumulado} da frequência absoluta em ordem crescente.
\lstinputlisting[firstline=18, lastline=27, caption=fac da idade recebe o valor acumulado]{estatistica.rb}
O uso da variável \code{acumulado} atribuído \code{nil} na linha 19, representa a verificação da inicialização da variável ainda não existente. O valor \code{nil} trata-se também como um valor \code{false} permitindo usar a sintaxe \code{if not acumulado}, que também poderia ser inicializado com 0 e comparado usando \code{if acumulado == 0}.
\begin{lstlisting}[caption=Usando acumulado com valor inicial 0]
fac = {}
acumulado = 0
fi.keys.sort.each do |idade|
if acumulado == 0
acumulado = fi[idade]
else
acumulado += fi[idade]
end
fac[idade] = acumulado
end
\end{lstlisting}
A abordagem atribuindo \code{nil} ao valor \code{acumulado}, torna-se interessante pela clareza de uma inicialização, e garantia a respeito de uma possível frequência acumulado igual à 0. Em outras palavras, se a frequência da primeira classe fosse 0, então o algorítmo iria falhar. Outra estratégia bastante abordada é o uso de um iterador numérico que permite saber qual é o indice do elemento, podendo assim, acumular a partir do primeiro item.
Considerando que o iterador é inicializado com 0, então é possível comparar ao iterador e não usar a variável com o valor acumulado.
\begin{lstlisting}[caption=Usando acumulado através do iterador \code{indice}, label=usa indice]
fac = {}
acumulado = nil
fi.keys.sort.each_with_index do |idade, indice|
if indice == 0
acumulado = fi[idade]
else
acumulado += fi[idade]
end
fac[idade] = acumulado
end
\end{lstlisting}
Usando o método \code{each\_with\_index} é possível resgatar o valor do iterador através da segunda variável do bloco: \code{indice}. A comparação acontece da mesma forma, e garante que apenas na primeira interação o valor acumulado será a frequência absoluta inicial.
\subsection{Blocos e escopo de variáveis}
Uma observação importante, é que os blocos de código, \code{do..end} tratam-se de um sub-código, o qual mantém um escopo em suas variáveis. Por este motivo, é necessário que a variável \code{acumulado} exista antes deste bloco.
Quando a variável é inicializada dentro do bloco, ela perde a referência após o fim do bloco, e na iteração seguinte sobre os elementos, torna a não existir, perdendo o valor acumulado anteriormente. Desta forma, é extremamente necessário a declaração da variável \code{acumulado = nil} antes da iteração \code{each}.
O escopo de variáveis em Ruby é claramente explicado no uso da variável indice no exemplo anterior\ref{usa indice} em que a variável indice, apenas está disponível enquanto iterando sobre os dados, trazendo em seu valor, o indice da iteração, ou seja, qual é a vez que está iterando.
Os valores dos indices iniciam em zero e vão até o último elemento do vetor, sendo este o número de elementos do vetor subtraído de 1.
Após a linha 10, a variável indice deixa de existir, pois saiu do seu escopo de uso. Com isso, sabe-se que quando é necessário utilizar depois de um bloco, a variável deve ser declarada antes, para não perder a referência após o bloco.
\subsection{Criação de métodos}
Métodos são ações procedurais com algum objetivo específico. Em ruby, são representados por blocos de código definidos entre palavras \code{def} e \code{end}. Os métodos podem receber parâmetros e devolver algum resultado. Por exemplo, se quiser criar um método que faz uma soma, pode-se deduzir um nome para o método como \code{soma} e receber parâmetros neste método, ou seja, os valores que serão somados.
\begin{lstlisting}[caption=implementando um método de soma]
def soma numero, outro_numero
numero + outro_numero
end
\end{lstlisting}
O exemplo anterior mostra a declaração de um método com o nome soma, que recebe dois parâmetros, número e outro número. A declaração de parenteses no nome do método é opcional, assim como no seu uso.
A maioria das linguagem de programação coloca parenteses na idêntificação de parâmetros, então pode ser escrito assim.
\begin{lstlisting}[caption=implementando um método de soma usando parenteses alternativo]
def soma(numero, outro_numero)
numero + outro_numero
end
\end{lstlisting}
Após este código acima ser compilado, é possível executar ele, ou seja, usufruir do método que soma usando a seguinte sintaxe:
\begin{lstlisting}[caption=usufruindo do método de soma]
soma(1, 2)
soma 3, 4
end
\end{lstlisting}
As duas sintaxes acima podem ser executadas e o método responderá por 3 e 7 na mesma ordem.
O método acima não está encapsulado em uma classe, então pode ser executado apartir do módulo Kernel. Mas também poderia ser declarado dentro de uma classe.
\subsection{Criação de classes}
Uma classe é um conjunto de comportamentos que é definido por algum tipo, divisão, qualidades, atributos etc. Essa definição, permite compartilhar comportamentos e definir estes atributos. Por exemplo:
\begin{lstlisting}[caption=Criando uma classe, label=classePesquisa]
class Pesquisa
attr_reader :rol, :fi
def initialize(dados_brutos)
@rol = dados_brutos.sort
@fi = {}
calcular_fi
end
def calcular_fi
@rol.each do |idade|
if not @fi[idade]
@fi[idade] = 1
else
@fi[idade] += 1
end
end
@fi
end
end
\end{lstlisting}
O método \code{initialize} é o método que representa a instância de uma classe, e deve ser invocado através do método \code{new}. Este tipo de método também é conhecido como método construtor, por ser responsável por esta característica. Dentro deste método, uma variável de instância chamada \code{@rol} é definido recebendo os dados brutos como parâmetro e já colocando-os em ordem.
Após esta chamada, o método \code{calcular\_fi} é chamado, e atribui todas as frequências absolutas neste momento.
Um método de instância só pode ser executado com a instância de um objeto da classe Pesquisa. Anteriormente, os dados brutos estavam sendo representados pela classe \code{Array}, agora, será parte de uma pesquisa e apenas será sua característica inicial no método construtor. Um objeto é representado por a instância de uma classe, e uma classe é a definição do comportamento deste objeto.
Anteriormente, foi utilizado a classe Array, que tem um método \code{each} que permite iterar sobre \code{cada} elemento do Array.
Da mesma forma os métodos podem ser definidos e utilizados após a instância da classe. Para criar uma instância de uma nova classe, é necessário utilizar o método \code{new}, e neste caso recebe os dados brutos na inicialização da classe:
\begin{lstlisting}[caption=Criando uma classe]
objeto = Pesquisa.new([23, 31, 31, 21, 31, 26, 31, 22, 22,
24, 31, 21, 22, 20, 22, 31, 21, 20])
objeto.rol
objeto.fi
\end{lstlisting}
Na primeira linha, uma váriavel chamada \code{objeto} foi declarada, recebendo a nova instância da classe \code{Pesquisa}. Após, foi executado o método rol, que exibe o valor da variável \code{@rol}, que foi atribuído na inicialização da classe. O método \code{rol} e \code{fi} podem ser acessados pela declaração do método \code{attr\_reader}\ref{classePesquisa}.
\subsection{ Atributos da classe }
Atributos da classe, são características que pertêncem aquela classe. Em ruby, é possível definir atributos através do método \code{attr\_accessor} e eles ser usados dentro dos métodos de instância.
\begin{lstlisting}[caption=Criando uma classe com atributos]
class Pessoa
attr_accessor :nome
def apresentar_se
print "oi, eu sou " + @nome
end
end
\end{lstlisting}
A classe acima declara um atributo de acesso chamado nome, com o uso deste método, é possível definir um nome para a instância da pessoa, usando o sinal de atribuição (=).
\begin{lstlisting}[caption=Usando uma classe com métodos e atributos de acesso]
estudante = Pessoa.new
estudante.nome = "Jonatas Davi Paganini"
estudande.apresentar_se
\end{lstlisting}
A segunda linha pode ser lida como: O \code{nome} do \code{estudante} é igual a "Jonatas Davi Paganini" ou \code{estudande.nome} é igual a "Jonatas Davi Paganini".
\bibliographystyle{plainat}
\begin{thebibliography}{9}
\bibitem{cursoEstatistica}
Simon da Fonseca, Jairo; Martins, Gilberto de Andrade.
Curso de Estatística.
Sexta edição, São Paulo, SP. Editora ATLAS S.A., 1996.
\end{thebibliography}
\end{document}