Você está na página 1de 73

ENGENHARIA DE

CONFIABILIDADE
Sumário
TERMOS E DEFINIÇÕES 3
PARTE I - MÉTODOS QUANTITATIVOS E QUALITATIVOS 6
1. INTRODUÇÃO 7
2. ENGENHARIA DA CONFIABILIDADE – ABORDAGEM QUANTITATIVA 9
2.1 Medidas de confiabilidade 10
2.2 Métodos de estimação 11
2.3 Testes de aderência 11
2.4 Funções de densidade de probabilidade e de falha acumulada 12
2.5 Função confiabilidade 13
2.6 Função taxa de falha 13
2.7 Confiabilidade instantânea 14
2.8 Modelos de blocos 15
3. ENGENHARIA DA CONFIABILIDADE – ABORDAGEM QUALITATIVA 18
4. GESTÃO DA CONFIABILIDADE 22
PARTE II - PYTHON 28
5. INTRODUÇÃO À PROGRAMAÇÃO COM PYTHON 29
5.1 Introdução à programação 29
5.2 Conceitos básicos de python 35
5.3 Desenvolvendo funções e classes 40
5.4 Importação de dados 46
5.5 Tratamento de dados 50
5.6 Geração de gráficos 57
6. REFERÊNCIAS 73
TERMOS E DEFINIÇÕES

Atividade Ações que fazem parte de um processo com um


objetivo bem específico dentro da organização.
CAPEX (Capital São despesas em investimento, projetos, protótipos,
Expenditures) estoque inicial, testes, documentações, melhorias e
aquisições de ativos.
Defeito É a alteração das características de um item,
equipamento ou sistema operacional, em relação aos
seus requisitos, sem que tenha havido perda de
nenhuma das suas funções requeridas. Um defeito não
torna o item indisponível. Porém, se não reparado,
poderá levar à uma falha e consequentemente à
indisponibilidade do equipamento.
Falha É a perda total ou parcial da capacidade e um item ou
equipamento de desempenhar as suas funções
(NBR5462, 1994), não permitindo a sua utilização no
processo produtivo.
Gráfico de Pareto Gráfico que apresenta dados comparativos em
(Pareto) percentagem, em ordem decrescente, na forma de
barras e gráfico de linha dos percentuais acumulados.
Macroprocesso Grandes conjuntos de atividades pelos quais a
organização cumpre a sua missão, gerando valor.
Correspondem às funções da organização que devem
estar alinhadas aos objetivos de suas unidades
organizacionais.
Manutenabilidade O mesmo que manutenibilidade e mantenabilidade.
Consiste na capacidade de um item ser mantido ou
relocado em condições de executar suas funções
requeridas, sob condições de uso especificadas, quando
a Manutenção é executada sob condições determinadas
e mediante procedimentos prescritos. (ABNT NBR
5462/1994).
Manutenção É toda intervenção que tenha como objetivo a
Corretiva recuperação dos itens ou equipamentos após a
ocorrência de falhas.
Manutenção É toda intervenção que tenha como objetivo a redução
Preventiva e/ou eliminação de riscos de ocorrência de manutenção
corretiva, garantindo o funcionamento e confiabilidade
dos equipamentos.
MRO Manutenção, Reparos e Operações, engloba todo
material indireto não relacionado diretamente ao produto
e que são vitais para o contínuo funcionamento dos
ativos.
O.M. Ordem de Manutenção, representa a autorização
expressa da organização para que se realize um serviço
de manutenção ou melhoria em um de seus ativos.
OPEX São despesas com a operação, manutenção planejada
(Operational e não planejada e reformas.
Expenditures)
Pane Estado de um item caracterizado pela incapacidade de
desempenhar suas funções requeridas, excluindo a
incapacidade durante a manutenção preventiva ou
outras ações planejadas, ou pela falta de recursos
externos. Nota: uma pane é geralmente o resultado de
uma falha de um item, mas pode existir sem uma falha
anterior.
Plano de É uma sequência lógica de atividades de manutenção,
manutenção onde nele deve-se determinar o que fazer, periodicidade
e recursos necessários. O plano de manutenção deve
ser cadastrado no sistema SAP, antes do equipamento
ser liberado para operação e revisado conforme
necessidade.
Processo Uma sequência de atividades logicamente relacionadas
e que acrescentam valor a uma entrada, produzindo
uma saída para o cliente.
PCM Planejamento Programação e Controle da Manutenção.
PDM Plano Diretor da Manutenção.
Ramp-up Consiste no crescimento da produção após seu início de
operação (start-up) em um projeto finalizado e
recentemente colocado em operação, até atingir sua
capacidade nominal.
Start-up Período que compreende o final da
montagem/comissionamento e o atingimento de um
nível estável de operação, com os ativos atendendo as
suas funções requeridas, permitindo assim o
crescimento da produção até o valor nominal do projeto
(Ramp-up).
SGMA Sistema de Gestão da Manutenção de Ativos.
PARTE I - MÉTODOS
QUANTITATIVOS E QUALITATIVOS
1. INTRODUÇÃO
A norma brasileira ABNT NBR 5462 define os termos relacionados com a
confiabilidade e a mantenabilidade. Ao se ler a norma, percebe-se uma série de
conceitos sobre “defeito”, “falha” e “pane”. Lá, são indicadas diversas
configurações destes conceitos, tais como, “defeito crítico”, “defeito maior”, “falha
por fragilidade”, “falha primária”, “falha secundária”, “pane permanente”, “pane
temporária”, etc.
Primeiramente, será mostrado o conceito geral do que venha a ser um “defeito”,
uma “falha” e uma “pane”, e quando inicia e termina cada uma delas. Os
conceitos aludidos na NBR 5462:
Defeito - Qualquer desvio de uma característica de um item em relação aos seus
requisitos. Notas: a) Os requisitos podem, ou não, ser expressos na forma de
uma especificação. b) Um defeito pode, ou não, afetar a capacidade de um item
em desempenhar uma função requerida
Falha - Término da capacidade de um item desempenhar a função requerida.
Notas: a) Depois da falha, o item tem uma pane. b) A “falha” é um evento;
diferente de “pane” que é um estado. c) Este conceito, como definido, não se
aplica a itens compostos somente por software.
Pane - Estado de um item caracterizado pela incapacidade de desempenhar
uma função requerida, excluindo a incapacidade durante a manutenção
preventiva ou outras ações planejadas, ou pela falta de recursos externos. Nota:
uma pane é geralmente o resultado de uma falha de um item, mas pode existir
sem uma falha anterior.
Nota-se que os conceitos as vezes se sobrepõem, principalmente quando lemos
as notas que visam apoiar o entendimento dos conceitos.
Observando tais conceitos através da linha do tempo, representa-se a
progressão do estado do item/equipamento de acordo com seu atendimento ante
as suas funções requeridas.
Com a Figura 1.1, percebe-se que o primeiro estado de anormalidade
apresentado por um equipamento consiste no “defeito”, neste momento existe
uma anomalia, mas a mesma não afeta o atendimento às funções requeridas por
parte do equipamento.

Figura 1.1: Defeito, Falha e Pane no eixo do tempo.


Pode-se exemplificar tal situação como a descoberta, através da análise de
vibrações mecânicas, de uma folga em um rolamento que não gera alta
temperatura, nem vibração excessiva. No entanto, é considerada anormal, o que
provoca a emissão de um laudo para correção, acarretando assim uma
manutenção sob condição.
O defeito precede uma falha, uma vez que esta consiste em uma anomalia que
afeta alguma das funções requeridas. A existência da falha, mesmo que não
interrompa totalmente o funcionamento do equipamento, já confere ao mesmo
um estado de inconfiabilidade. Basta observarmos o conceito de confiabilidade
apresentado na NBR-5462: “capacidade de um item desempenhar uma função
requerida sob condições especificadas, durante um dado intervalo de tempo”.
Desta feita, ao não atender 100% das suas funções requeridas o item se
encontra em falha, perdendo assim a sua confiabilidade. A definição do momento
da perda da confiabilidade é importante, pois define quando terminam as ações
preventivas sobre o equipamento e iniciam as ações corretivas.
O surgimento da “falha” é o divisor de águas entre a manutenção corretiva e
preventiva, ou seja, toda ação de manutenção realizada antes da falha, inclusive
ações para correção de defeitos, são preventivas. Já as ações de manutenção
após o surgimento da falha são corretivas.
Muitas empresas adotam o início da manutenção corretiva como o surgimento
da “Pane”. Ela consiste na evolução da falha de forma a acarretar a parada total
do equipamento, de forma ao mesmo não atender nenhuma das suas funções
requeridas. Ao adotar a “Pane” como início da manutenção corretiva, a empresa
que assim o fizer, favorece a sua percepção de confiabilidade erroneamente,
proporcionando uma permissibilidade inadequada para eventos de falha, pois se
o equipamento falhar, e houver possibilidade de conviver com a mesma sem a
geração da pane, a situação pode ser encarada com normalidade, o que não é
adequado.
Alguns exemplos da degradação gerada por este entendimento, são cenas
espalhadas pelas plantas industriais mundo a fora, como mancais sendo
refrigerados na base da mangueira de água ou de ar comprimido, ou
equipamentos móveis com uma série de alarmes, mas operando mesmo assim,
pois enquanto não houver a pane geral, se insiste em sua operação.
Nota-se que o MTBF, de uma empresa que adota a falha como momento da
manutenção corretiva, é menor do que naquela em que se adota a pane, visto a
diminuição da contabilidade do número de “corretivas”, conferindo uma falsa
impressão de confiabilidade para aqueles que observam a pane como início das
ações corretivas.
𝐻𝑜𝑟𝑎𝑠 𝐷𝑖𝑠𝑝𝑜𝑛í𝑣𝑒𝑖𝑠
𝑀𝑇𝐵𝐹 = (1.1)
𝑁ú𝑚𝑒𝑟𝑜 𝑑𝑒 𝐶𝑜𝑟𝑟𝑒𝑡𝑖𝑣𝑎
2. ENGENHARIA DA CONFIABILIDADE – ABORDAGEM
QUANTITATIVA
A “Engenharia da Confiabilidade” fornece conceitos, técnicas e métodos teóricos
e práticos para auxiliar a tomada de decisão, os quais especificam, projetam e
testam as funções desempenhadas de uma atividade ou sistema em um período
de tempo determinado, sob condições específicas.
Essa análise visa a eliminação de falhas, obtendo alta performance e melhores
resultados operacionais, onde surge uma crescente ênfase no grau de
confiabilidade de equipamentos, matérias, sistemas e processos (FOGLIATO;
RIBEIRO, 2009).
No segmento de manutenção ela atua para melhorar a disponibilidade do
equipamento e com isso aumentar os índices operacionais e produtivos. Logo,
quanto maior o número de falhas menor é a confiabilidade (KARDEC; NASCIF,
2009).
Para Fogliatto e Ribeiro (2009) e Fernandes (2010), a confiabilidade é a
probabilidade de um produto ou serviço operar corretamente, isto é, de
desempenhar satisfatoriamente a função requerida durante um especificado
período de tempo sob condições de operação estabelecidas sem que apresente
falhas. Para tanto, alguns indicadores costumam ser utilizados para representar
a confiabilidade de um ativo físico: (i) tempo médio entre falha (MTBF); (ii) função
de confiabilidade (R(t)); e a (iii) função de risco (h(t)).
Cada uma dessas representações de confiabilidade enunciadas, deriva da
identificação da distribuição de probabilidade a qual, segundo Fogliatto e Ribeiro
(2009), descreve o comportamento aleatório de determinado fenômeno em
análise. Ao se conhecer a distribuição probabilística que melhor se ajusta aos
tempos até a falha de uma unidade em estudo é possível se fazer estimativas da
probabilidade de sobrevivência da unidade, bem como de outras medidas de
confiabilidade, dentre as quais aquelas anunciadas anteriormente.
Sob essa perspectiva, percebe-se que a modelagem matemática das
representações de confiabilidade é uma etapa que precede a tomada de decisão
nesse âmbito, o que faz com que tal estágio se configure como um elemento
imprescindível à análise de confiabilidade. Logo, faz-se necessário desenvolver
nos trabalhos as seguintes representações de confiabilidade:
i. Função de densidade de probabilidade f(t);
ii. Função de falha acumulada F(t);
iii. Curva de confiabilidade R(t);
iv. Função de taxa de falha λ(t), também conhecida como Função de risco h(t).
Antes de desenvolver sobre as representações da confiabilidade listadas
anteriormente, faz-se necessário realizar considerações sobre: (i) medidas de
confiabilidade; (ii) métodos de estimação e (iii) testes de aderência.

2.1 Medidas de confiabilidade


A fim de que o quadro de confiabilidade de um determinado equipamento ou
unidade possa ser descrito, algumas medidas são úteis. Para tanto, faz-se
necessária a abordagem probabilística das observações de falhas para que
algumas das funções possam ser enunciadas matematicamente.
Para Callegari-Jacques (2003), uma variável aleatória, tal como a vida útil de um
determinado equipamento, assume uma distribuição de frequências específica,
as quais podem apresentar formas variadas. As distribuições teóricas
disponíveis na literatura estatística configuram-se como modelos que buscam
representar o comportamento de determinado evento em função da frequência
de sua ocorrência. Isso permite realizar estimativas sem que se faça necessária
o acesso à totalidade das informações visto que o propósito da distribuição é
justamente o de determinar o comportamento do grupo de dados observado sob
determinado modelo teórico.
Assim, as distribuições de frequências são distribuições de probabilidade que
partem do pressuposto de que para cada evento existe uma probabilidade de
ocorrência associada (LEOTTI; BIRCK; RIBOLDI, 2005).
Existem várias distribuições dentro da estatística. Porém, na confiabilidade foca-
se nas distribuições de modelagem de processos de falhas contínuos. Estas
normalmente são representadas por distribuições Exponencial, Lognormal,
Gama e Weibull.
Tabela 2.1: Resumo das principais distribuições de probabilidade em
confiabilidade.
Tipo de Distribuição Características e Aplicações
Weibull Mais flexível das distribuições, modela falhas por fadiga ou
desgaste
Exponencial Normalmente empregada para equipamentos eletrônicos,
descrevendo sistemas de falhas constantes.
Gama Generalizada da distribuição exponencial, modela tempo de
falhas em sistemas com reparo ideal.
Lognormal Caracterizada por ser uma distribuição limitada à esquerda,
utilizada na modelagem de tempos até reparo em itens
reparáveis.
Em confiabilidade, pode-se ressaltar a distribuição de Weibull por ser mais
flexível na representação de amostras de tempos até falha de tamanho pequeno
(FOGLIATTO, RIBEIRO, 2009). A Tabela 2.1 apresenta uma explicação
resumida quanto essas distribuições principais e suas características de
utilização para modelar o comportamento dos sistemas.

2.2 Métodos de estimação


De forma geral, duas abordagens metodológicas são amplamente utilizadas para
a estimação dos parâmetros das representações de confiabilidade: método dos
mínimos quadrados e da máxima verossimilhança.
É importante frisar que algumas propriedades devem ser atendidas no que diz
respeito aos estimadores populacionais, são elas: a não tendenciosidade,
consistência, eficiência e suficiência.
Em análise de confiabilidade, as distribuições de probabilidade que são
geralmente utilizadas para descrever o comportamento de tempos até falha são,
segundo Folgliatto e Ribeiro (2009), exponencial, Weibull, Gamma e Lognormal.

2.3 Testes de aderência


Ao realizar-se a análise de ajuste de dados através de testes analíticos de
aderência, os testes mais utilizados, conforme afirmam Fogliatto e Ribeiro
(2009), são o qui-quadrado e o de Kolmogorov-Smirnov. Estes estão presentes
na maioria dos softwares especialistas em Confiabilidade como, por exemplo, o
Weibull.
Os testes de aderência se configuram como testes de hipóteses que, como o
próprio nome sugere, são utilizados para testar hipóteses a respeito das
distribuições dos dados, o que significa que a função construída a partir dos
dados coletados é comparada a distribuição teórica. Sendo assim, o método
varia de acordo com a função construída e a métrica de comparação. É através
da comparação das frequências amostrais juntamente das frequências teóricas
esperadas pelo modelo probabilístico que é possível certificar se uma
determinada distribuição se ajusta bem ou não aos dados amostrais.
Caso o analista opte por utilizar o Minitab® como software para análise, é
importante se atentar que a abordagem de estimação dos mínimos quadrados
no Minitab®, dois indicadores de ajuste são apresentados: (i) o coeficiente de
correlação de Pearson (r), o qual quanto mais próximo for seu valor a 1, melhor
o ajuste; e a (ii) estatística ajustada de Anderson Darling (AD) a qual, segundo
Silva et. al (2015), quanto menor seu valor melhor é o ajuste da distribuição aos
dados em análise.
É importante frisar que a estatística de AD é referenciada como ajustada pelo
fato de o software em ocasiões de análise de confiabilidade porque, conforme
afirma o Minitab (2019), o valor tradicional de Anderson-Darling não pode ser
calculado para dados censurados múltipla ou arbitrariamente e, por isso, para
fins de consistência, o software utiliza um valor ajustado dessa estatística.

2.4 Funções de densidade de probabilidade e de falha acumulada


A falha de um equipamento pode ser caracterizada pelo momento que o sistema
deixa de desempenhar sua função requerida conforme foi projetado. Todavia, há
a necessidade de se definir a falha de maneira quantitativa levando em
consideração a instabilidade e a deterioração do item. Na maioria das
circunstâncias, a degradação do desempenho é a principal falha para o
equipamento que leva ao desperdício tanto do produto quanto do tempo.
Pode-se definir a probabilidade de falha de um item em determinado período de
tempo (t;t + Δt ] em valores discretos. Assim, tem-se que o estado de um item
em um dado tempo t é definido por uma variável aleatória em X(t), onde:

X(t) = 1, se o item estiver funcionando no instante t; ou


0, se o item estiver em estado de falha no instante t.
Desta forma, T é uma variável aleatória, onde se tem o período de tempo a partir
do instante em que o item é posto em operação até o momento em que falha
pela primeira vez. Considera-se a função de distribuição F(t) dada por:

𝑡
𝐹(𝑡) = Pr (𝑇 ≤ 𝑡) = ∫0 𝑓 (𝑡)𝑑𝑡, 𝑡 > 0 (2.1)

onde a equação f (t) consiste na função de densidade de probabilidade definida


conforme a Equação 2.2

𝑑𝐹(𝑡) 𝐹(𝑡+∆𝑡)−𝐹(𝑡) Pr(𝑡<𝑇<𝑡+∆𝑡)


𝑓(𝑡) = = lim = lim (2.2)
𝑑𝑡 ∆𝑡 →0 ∆𝑡 ∆𝑡 →0 ∆𝑡

Dentro deste contexto, tem-se o MTTF, um critério utilizado na engenharia com


o objetivo de estipular a confiabilidade de um sistema ou equipamento. Esse
parâmetro é comumente utilizado em mecanismos com capacidade para
suportar as falhas, tornando-se útil nas tomadas de decisões referentes a
manutenção do sistema.


𝑀𝑇𝑇𝐹 = ∫0 𝑡. 𝑓(𝑡)𝑑𝑡 (2.3)
2.5 Função confiabilidade
A função confiabilidade R(t), pode ser obtida como um complemento da função
acumulada de falha F(t), resultando a Equação 2.4. Ao considerar um cenário
em que os componentes são testados, existem probabilidades de falhas e de
sucessos. A função R(t) é definida como a acumulação de sucesso no tempo, ou
seja, a probabilidade de que não existam falhas em um intervalo de tempo (t)
(FOGLIATTO e RIBEIRO, 2009).

𝑅(𝑡) = 1 − 𝐹(𝑡) (2.4)

2.6 Função taxa de falha


A taxa de falha é a frequência com que ocorre as falhas em um período de tempo,
medida pelo número de falhas para cada hora ou número de operações do
sistema ou do componente. Ela é representada por λ (t) e determinada pelas
Equação 2.5 e Equação 2.6

𝐹𝑟𝑒𝑞𝑢𝑒𝑛𝑐𝑖𝑎 𝑑𝑒 𝑓𝑎𝑙ℎ𝑎 𝑒𝑚 𝑢𝑚 𝑝𝑒𝑟í𝑜𝑑𝑜 𝑑𝑒 𝑡𝑒𝑚𝑝𝑜


𝜆= (2.5)
𝑁𝑢𝑚𝑒𝑟𝑜 𝑑𝑒 𝑓𝑎𝑙ℎ𝑎𝑠

ou,

1
𝜆(𝑡) = 𝑓(𝑡). (2.6)
𝑅(𝑡)

A análise do comportamento da taxa de falha de um equipamento ao longo do


tempo pode ser representada por uma curva que possui a forma de uma
banheira, a curva da banheira (bathtube curve), como na Figura 2.1. A curva
representa as fases da vida características de um sistema: mortalidade infantil,
maturidade e mortalidade senil. As fases estão associadas ao fator de forma γ,
que é um dos parâmetros de uma eventual distribuição de Weibull que descreva
a confiabilidade do item (SELLITTO, 2005).
No período de mortalidade infantil, a taxa de falhas é alta, porém decrescente.
As falhas preliminarmente são causadas por defeitos congênitos ou fraquezas,
erros de projeto, peças defeituosas, processos de fabricação inadequados, mão-
de-obra desqualificada, estocagem inadequada, instalação imprópria, partida
deficiente entre outras. A taxa de falhas diminui com o tempo, conforme os
reparos de defeitos eliminam componentes frágeis ou à medida que são
detectados e reparados erros de projeto ou de instalação. Neste período
acontecem falhas aleatórias.
Figura 2.1: Curva da banheira e ciclo de vida de equipamentos (Sellitto, 2005).

Na fase de maturidade, o valor médio da taxa de falha é constante, as falhas


ocorrem por causas aleatórias que pode assumir diversas naturezas, tais como:
sobrecargas aleatórias, problemas externos de alimentação elétrica, vibração,
impactos mecânicos, bruscas variações de temperatura, erros humanos de
operação entre outros. Falhas aleatórias podem ser reduzidas projetando
equipamentos mais robustos do que exige o meio em que opera ou padronizando
a operação. Nesta fase, torna-se mais importante a utilização de estratégia de
manutenção preditiva, ou seja, monitoramento para detectar o início da fase de
desgaste.
A fase de mortalidade senil, que representa o início do período final de vida do
item, é caracterizada pelo desgaste do componente, corrosão, fadiga, trincas,
deterioração mecânica, elétrica ou química, manutenção insuficiente entre
outros. Para produzir produtos com vida útil mais prolongada, deve-se atentar
para o projeto, utilizando materiais e componentes mais duráveis, um plano de
inspeção e manutenção que detecte que iniciou a mortalidade senil e a previna,
por substituição preventiva de itens.

2.7 Confiabilidade instantânea


A partir da equação 6, pode-se chegar na equação que define a Confiabilidade
de um item em determinado instante conhecido, conforme a Equação 2.7.

𝑡
𝑅(𝑡) = 𝑒𝑥𝑝 [− ∫0 ℎ(𝑡). 𝑑𝑡] = 𝑒 −𝜆.𝑡 (2.7)

Uma vez conhecidas as representações da confiabilidade, que leva ao principal


dos indicadores, no caso a confiabilidade R(t), pode-se encontrar a probabilidade
de sucesso dos itens, desde que os mesmos possuam um banco de dados
adequado para estudos da Confiabilidade.
Importante ressaltar que a confiabilidade de um item não representa a de um
sistema. Daí, surge a necessidade do estudo da modelagem de blocos.

2.8 Modelos de blocos


Para fins dos estudos da confiabilidade os arranjos em que os ativos físicos se
apresentam, podem adotar modelos de blocos em série, paralelo ou misto. Em
um sistema em série, todos os componentes devem funcionar para que o
sistema funcione, desta forma, o sistema funciona se todos os componentes
funcionarem, a Figura 2.2 ilustra a lógica do raciocínio.

Figura 2.2: Sistema em Série na Confiabilidade.

Desta forma, se a confiabilidade de apenas um item do sistema for zero,


considerando os componentes do sistema são estatisticamente independentes,
todo o sistema será nulo, visto a dependência, assim, a confiabilidade do sistema
em série é dada conforme a Equação 2.8.

𝑅𝑠 = ∏𝑛𝑖=1 𝑅𝑖 (2.8)
Onde:
Rs – Confiabilidade do Sistema
Ri – Confiabilidade do enésimo componente
N – Número de subsistemas ou componentes que formam o sistema

Exemplo 1:
Três subsistemas estão conectados em série formando um sistema, com as
seguintes confiabilidades em 100 horas. Qual a confiabilidade do sistema para
uma missão de 100 horas?

Figura 2.3: Sistema Exemplo 1.


Rs = R1 x R2 x R3
Rs = 0,9950 x 0,9870 x 0,9730
Rs = 0,9555 ou 95,55%

Observa-se que a confiabilidade do sistema é sempre menor que a confiabilidade


do pior componente.
Em um sistema em paralelo todos os componentes devem falhar para que o
sistema falhe, a Figura 2.4 ilustra o arranjo do mesmo.

Figura 2.4: Sistema em Paralelo na Confiabilidade.

Os componentes em operação simultânea as falhas não afetam desempenho


dos componentes sobreviventes, desta forma a equação 9 indica a confiabilidade
de um sistema em paralelo.

𝑅𝑠 = 1 − ∏𝑛𝑖=1(1 − 𝑅𝑖) .(2.9)

Exemplo 2:

Determine a confiabilidade em 100 horas para o sistema em paralelo.


Rs = 1 – [(1-0,9950) x (1-0,9870) x (1-0,9730)]
Rs = 1 – 0,000001755
Rs = 0,999998245 ou 99,99%
Já os sistemas chamados mistos, nada mais são do que sistemas que combinam
arranjos em série e em paralelo.
Figura 2.5: Sistema Exemplo 2.

A finalidade do diagrama de blocos é construir um método diagramático para


mostrar como a confiabilidade de componentes contribui para o sucesso ou falha
de um sistema complexo.
3. ENGENHARIA DA CONFIABILIDADE – ABORDAGEM QUALITATIVA
Na abordagem qualitativa da engenharia a confiabilidade, aborda-se uma série
de técnicas como a FTA e FMEA. Neste módulo será abordado o FMEA.
O método ‘Failure Mode and Effect Analysis (FMEA) é definido pela IEC 60812
como sendo uma técnica analítica, a qual explora os efeitos das falhas e mal
funcionamentos de componentes individuais. De acordo com (MCDERMOTT ET
AL. 2009), “um FMEA é um método sistemático de identificar e prevenir
problemas em produtos e processos antes que eles ocorram.” A norma
ISO 14971 afirma que o “FMEA é um procedimento sistemático de análise de um
sistema para identificar potenciais modos de falha, suas causas e efeitos na
performance (performance de uma montagem imediata e do sistema ou
processo por completo).” Em resumo, é uma abordagem baseada em equipe
que foca na melhoria da segurança e qualidade dos sistemas e também diminuir
os custos de um projeto.
O FMEA foi desenvolvido nos anos 60 primeiramente pela indústria militar
americana e aperfeiçoado pela NASA. Ele vem sendo utilizado há décadas em
diferentes áreas, especialmente nos setores aeroespaciais e automotivos, e hoje
em dia sendo vastamente difundido para o setor industrial.
Tabela 3.1: Escala de ocorrência para FMEA de processo (CARLSON, 2014)
Probabilidade da
Critério: Ocorrência da Causa Escala
falha
> 100 por mil itens (> 1 em 10) 10
Muito alta
50 por mil itens (1 em 20) 9
20 por mil itens (1 em 50) 8
Alta
10 por mil itens (1 em 100) 7
5 por mil itens (1 em 200) 6
Moderada 2 por mil itens (1 em 500) 5
1 por mil itens (1 em 1.000) 4
0.5 por mil itens (1 em 2.000) 3
Baixa
0.1 por mil itens (1 em 10.000) 2
Muito baixa < 0.01 por mil itens (< 1 em 100.000) 1

Para o FMEA, a falha de um produto ocorre quando o produto não funciona como
deveria ou quando tem um mal funcionamento de alguma forma. Mas, falhas não
são limitadas apenas a falhas com produtos, elas também ocorrem de erros de
um usuário durante a operação. Por isso, o FMEA deve focar nessas falhas para
trazer o produto perto dos 100% da satisfação do cliente.
A forma na qual um equipamento, uma máquina, um produto ou um processo
pode falhar é chamado de modo de falha. Cada modo de falha tem uma causa
raiz, um efeito em potencial e um risco relativo associado. Por isso, eles devem
ser avaliados para poderem ser priorizados e seus riscos reduzidos. Três fatores
determinam o risco de uma falha: severidade, ocorrência e detecção. A
severidade da falha mede a consequência dessa falha se ela ocorrer. A
ocorrência de uma falha significa a probabilidade de ela ocorrer. A detecção
representa a probabilidade da falha ser identificada antes do impacto de seu
efeito ser percebido.
Tabela 3.2: Escala de severidade para FMEA de processo (CARLSON, 2014)
Critério:
Categoria (Processo) Escala
Severidade do efeito no processo
Efeito potencial relacionado à segurança do
operador da máquina ou da montagem, sem 10
Falha ao atingir requisitos aviso.
de segurança ou
regulatórios Efeito potencial relacionado à segurança do
operador da máquina ou da montagem, com 9
aviso.
> 50 % do produto deve ser jogado fora.
Perda ou degradação da Linha deve ser parada. 8
função primária / Quebra
de linha < 50 % do produto deve ser jogado fora.
7
Diminuição da velocidade da linha.

Perda ou degradação da > 50 % da produção deve ser retrabalhada 6


função secundária / fora da linha
Retrabalho for a da < 50 % da produção deve ser retrabalhada
estação 5
fora da linha
> 50 % da produção deve ser retrabalhada na
4
estação
Distúrbio / < 50 % da produção deve ser retrabalhada na
3
Retrabalho na estação estação
Inconveniência na visão da operação ou do
2
operador
Sem efeito Sem efeito perceptível 1
Utilizando dados e conhecimento do processo, do sistema ou do produto, os
modos de falha e efeitos em potencial podem ser ranqueados usando esses 3
fatores, variando em uma escala de 1 a 10. A multiplicação dos valores dessas
escalas resulta em um valor entre 1 e 1.000. Este resultado é chamado de
Número de Priorização de Risco (NPR) e os modos de falha, podem assim, ser
avaliados: quanto maior o NPR, mais ações corretivas são necessárias. Valores-
gatilho podem ser definidos para confirmar se as ações tomadas foram
suficientes para diminuir o risco daquele modo de falha.
Tabela 3.3: Escala de detecção para FMEA de processo (CARLSON, 2014)
Oportunidade de Probabilidade
Critério: Ocorrência da falha Escala
detecção da falha
Sem Sem controle de processo corrente;
Quase
oportunidade de Não pode ser detectado ou não é 10
impossível
detecção analisado.
Quase impossível
Modo ou causa da falha não é
de se detectar em Muito remota 9
facilmente detectado(a).
qualquer estágio
Detecção do Detecção do modo de falha pelo
problema no pós- Remota operador no pós-processamento por 8
processamento meios visuais, táteis ou audíveis.
Detecção do modo de falha pelo
Detecção do
Muito baixa operador na estação por meios 7
problema na fonte
visuais, táteis ou audíveis.
Detecção do Detecção do modo de falha pelo
problema no pós- Baixa operador na estação – utilização de 6
processamento dispositivo de leitura de parâmetros.
Detecção do modo de falha pelo
Detecção do operador na estação – utilização de
Moderada 5
problema na fonte dispositivo de leitura de parâmetros
ou controles automáticos.
Detecção do modo de falha no pós-
Detecção do
Moderadamente processamento através de controles
problema no pós- 4
alta automáticos; bloqueio da peça para
processamento
evitar futuro processamento.

Detecção do Detecção do modo de falha na


Alta estação através controles 3
problema na fonte
automáticos; bloqueia
automaticamente a peça na estação.

Detecção do modo de falha na


Prevenção do estação através controles
Muito alta 2
problemas automáticos; previne peças
discrepantes de serem produzidas.
Detecção não Prevenção do modo/causa da falha
aplicável; como o resultado do projeto de
Quase certa 1
prevenção de fixação, projeto da máquina ou
erros projeto da peça.

Os valores de cada fator diferem de acordo com o tipo de FMEA que está sendo
utilizado. No geral, existem 3 tipos: Sistema, Produto e Processo. O FMEA de
sistema é usado nas etapas iniciais do desenvolvimento de um produto para
descobrir problemas e falhas funcionais de um sistema por completo (composto
de vários subsistemas) que poderia fazer com que o sistema por completo não
funcionasse como pretendido. O FMEA de produto é focado no projeto do
produto a nível de subsistema ou de componente. O FMEA de processo é
utilizado para descobrir problemas relacionados à manufatura do produto. Ele
enfatiza como o processo de manufatura pode ser melhorado para garantir que
o produto é construído de acordo com os requisitos de projeto de uma maneira
segura, com o mínimo tempo de parada, refugo e retrabalho. As escalas
utilizadas aqui nesta apostila levam em consideração o FMEA de processo e são
mostradas nas Tabela 3.1, Tabela 3.2 e Tabela 3.3.
4. GESTÃO DA CONFIABILIDADE
Suportada das análises estatísticas de confiabilidade (quantitativa), e gestão de
análises, métodos e ferramentas da confiabilidade (qualitativa). Faz-se
necessário abordar a gestão sobre este arcabouço de informações, técnicas e
métodos. Desta forma, explora-se toda a estrutura que permite aumentar a
confiabilidade dos ativos através, por exemplo, de planos de manutenção,
estrutura de locais de instalação “taxonomia”, definição de criticidade dos ativos,
engenharia da lubrificação, monitoramento preditivo, procedimentos técnico-
operacionais, entre outros.
Uma das principais entregas da engenharia de confiabilidade é a estratégia de
planos de manutenção e para isto é utilizado o conceito de RCM – Reliability
Centered Maintenance ou MCC – Manutenção Centrada em Confiabilidade.

Figura 4.1: Curva P-F.


Fonte: Adaptado MOUBRAY, John. SPES, 2000

O RCM é um processo usado para determinar o que deve ser feito para garantir
que um ativo continue a fazer aquilo que seu usuário espera no presente
contexto operacional. Gerenciar o risco das falhas e suas consequências. Evita
gerar ações desnecessárias que geram custos e inserem novos modos de falha
com as frequentes desmontagens, reparos e remontagens periódicas.
Não é uma cultura a ser inserida e nem tampouco uma ferramenta para gerar
apenas os planos de manutenção, mas sim uma ferramenta abrangente para
garantir a função dos ativos. Foi adaptado para indústria em geral por John
Moubray, chamado de RCMII e publicado em 1990 suportado pelo padrão SAE
JA1012.
O RCM baseia-se, além do estudo da função do ativo, também na análise da
estratégia a ser definida para a manutenção mais adequada conforme gráfico do
intervalo P-F (Falha Potencial / Funcional).

Figura 4.2: Padrão de desempenho.

A Curva PF (Potential Failure) é uma ferramenta analítica essencial para um


plano de manutenção que seja baseado em confiabilidade e esteja seguindo os
padrões RCM (Reliability Centered Maintenance).
Ponto P (Potencial): É o mesmo que dizer que existe o Modo de falha, ou um
“sintoma”. Como exemplos de sintomas de falhas, temos a elevação dos níveis
de vibração, elevação dos níveis de temperatura, um determinado vazamento,
etc., é qualquer alteração na forma de trabalho no equipamento antes da falha.
Sendo assim, pode-se dizer que é o momento em que a falha nasce no ativo.
Ela ainda é uma falha em estágio inicial e não compromete por completo o
funcionamento do equipamento, mas diminui sua performance a cada minuto
que se passa.
Ponto F (Funcional): O equipamento quebrou/ele não consegue desempenhar
o seu trabalho dentro do processo, ou seja, é a incapacidade de um sistema para
atender a um padrão de desempenho especificado em projeto.
Além do auxílio da curva P-F é importante também a definição dos planos de
manutenção com base no padrão de desempenho de cada tarefa.
O padrão de desempenho é característica técnica que garante que a tarefa está
sendo realizada como deve ser realizada, da maneira correta, com atribuições
corretas. As principais tarefas indicadas sob o conceito de manutenção centrada
em confiabilidade RCM são:
Tarefas sob condição: Qualquer tarefa sob condição (ou preditiva, ou centrada
em condição ou tarefa de monitoração de condição) escolhida deverá satisfazer
os seguintes critérios:
i. Deverá existir uma falha potencial claramente definida.
ii. Deverá existir um intervalo P-F (ou período de desenvolvimento de falha).
iii. O intervalo da tarefa será menor do que o menos intervalo P-F.
iv. Deverá fisicamente ser possível desempenhar a tarefa em intervalos
menores do que o intervalo P-F.
O tempo mais curto entre a descoberta de uma falha potencial e a ocorrência da
falha funcional (o intervalo P-F menos o intervalo da falha) será longo o suficiente
para que se possa agir de forma predeterminada para evitar, eliminar ou
minimizar as consequências do modo de falha.
Tarefas de Descarte Programadas: Qualquer tarefa de descarte programada
escolhida deverá obedecer aos seguintes critérios adicionais:
i. Deverá existir uma idade (preferivelmente demonstrável) claramente
definida na qual há um aumento na probabilidade condicional de falha em
consideração.
ii. Ocorrerá uma proporção suficientemente grande das ocorrências desse
modo de falha depois da idade para reduzir a probabilidade de falha
prematura a um nível que seja tolerável ao usuário do ativo.
Tarefas de Restauração Programada: Qualquer tarefa de restauração
programada escolhida obedecerá aos seguintes critérios adicionais:
i. Existirá uma idade (preferivelmente comprovável) claramente definida, na
qual há um aumento na probabilidade condicional do modo de falha em
consideração.
ii. Depois desta idade, deverá acontecer uma proporção suficientemente
grande de ocorrências desse modo de falha para reduzir a probabilidade
de falha prematura a um nível que seja tolerável para o usuário do ativo.
iii. A tarefa deverá restaurar a resistência à falha (condição) do componente
a um nível que seja tolerável ao usuário do ativo.
Figura 4.3: Detalhamento da atividade “Engenharia de Confiabilidade”.
Tarefas de Busca de Falhas: Qualquer tarefa escolhida satisfará os seguintes
critérios adicionais (a busca de falha não se aplica a modos de falhas evidentes):
i. A base sobre o qual o intervalo da tarefa é escolhido levará em conta a
necessidade de se reduzir a probabilidade da falha múltipla do sistema
protegido associado a um nível que seja tolerável ao usuário do ativo.
ii. A tarefa deverá confirmar que todos os componentes cobertos pela
descrição do modo de falha estão operacionais.
iii. A tarefa de busca de falha e o processo de seleção do intervalo a ela
associado devem levar em consideração qualquer probabilidade de que
a própria tarefa pode deixar a função oculta em estado de falha.
Outras definições que o RCM pode indicar são quanto a respeito de reprojeto e
run to failure (rodar até falhar).
Reprojeto: O processo de RCM deverá visar a obter o desempenho desejado
do sistema tal como está configurado e operado no momento pela aplicação de
tarefas programadas apropriadas.
Em casos nos quais tais tarefas não possam ser encontradas, podem ser
necessários pacote de reprojeto do ativo ou sistema, conforme os seguintes
critérios:
i. Nos casos nos quais a falha é oculta e a falha múltipla a ela associada
tem consequências de segurança ou ambientais, é compulsória um
pacote de reprojeto que reduza a probabilidade de falha múltipla a um
nível tolerável ao proprietário ou usuário do ativo.
ii. Nos casos nos quais o modo de falha é evidente e tem consequências de
segurança ou ambientais, é compulsória um pacote de reprojeto que
reduza a probabilidade de falha a um nível tolerável ao usuário do ativo.
iii. Nos casos nos quais o modo de falha é oculto e a falha múltipla a ele
associada não tem consequências de segurança ou ambientais, qualquer
pacote de reprojeto deve ser efetiva com relação a custos, na opinião do
usuário do ativo.
iv. Nos casos nos quais o modo de falha é evidente e não tem consequências
de segurança ou ambientais, qualquer pacote de reprojeto deve ser
efetivo com relação a custos, na opinião do usuário do ativo.
Rodar até falhar: Qualquer política selecionada deve atender os seguintes
critérios, como segue:
i. Em casos nos quais a falha é oculta e não há tarefa apropriada
programada, a falha múltipla associada não deverá ter consequências de
segurança ou ambientais.
ii. Em casos nos quais a falha é evidente e não há tarefa apropriada
programada, o modo de falha associado não terá consequências de
segurança ou ambientais.
Portanto, o RCM garante conceitos estruturados para bloqueio e definição de
tarefas de manutenção que permitem a confiabilidade dos ativos. A figura 4
ilustra o detalhamento para gestão dos estudos de confiabilidade.
PARTE II - PYTHON
5. INTRODUÇÃO À PROGRAMAÇÃO COM PYTHON
O ecossistema científico de bibliotecas open source de Python cresceu
substancialmente nos últimos 10 anos. A grande versatilidade dessa linguagem
de programação vem fazendo com que ela se torne uma das mais utilizadas nas
mais diversas áreas profissionais: desenvolvimento Web, ciências de dados,
estatística, confiabilidade, interfaces gráficas etc.
Dessa forma, este treinamento também se utiliza desta linguagem para que se
possa usufruir de suas vantagens e facilidades. Mas, antes de começar a
programar, tenha no seu computador a plataforma grátis Anaconda 3. Ela está
disponível no endereço https://www.anaconda.com/products/individual. A
linguagem utilizada neste treinamento será o Python 3.7. Uma vez instalado,
certifique-se de utilizar o “Spyder 3”. A Figura 5.1 mostra a interface do programa
e é lá que será desenvolvido o código.

Figura 5.1: Interface gráfica do Spyder 3.

5.1 Introdução à programação


Alguns pontos devem ser mostrados para uma boa prática de programação. O
que são dados, sistemas numéricos, variáveis, algoritmos, laços de decisão e,
programação orientada a objetos.

Dados e informações
Comumente são confundidos os conceitos de dados e de informação. Dados são
todas as observações documentadas ou resultados de medição. É qualquer tipo
de material em formato desorganizado que geralmente não tem significado
próprio isoladamente. Ou seja, é um fato sem qualquer contexto. Já informação
é o resultado do processamento dos dados originais, possuindo assim, valor e
significado.
Os dados são classificados em 4 categorias, mostradas na Figura 5.2. Esses
dados podem variar dependendo do que estão medindo. Dados ordinais discreto
seguem uma escala com uma relação de ordem entre eles: idade de uma
pessoa, notas escolares, e a posição no pódio após uma competição. Dados
nominais discretos são aqueles que não têm nenhuma relação de ordem como
pode ser observado nos nomes dos grupos, gêneros de seres humanos etc.
Além disso, dados cardinais discretos são aqueles que são contáveis dentro de
um intervalor como o número de estudantes em uma sala ou o número de falhas
em uma máquina. Dados contínuos são aqueles que possuem infinitos números
dentro de um intervalo, como pode ser visto na temperatura de uma sala.

Figura 5.2: Os 4 tipos de dados.

Sistemas de numeração
Nos sistemas digitais ou na computação, é frequente se recorrer a diferentes
sistemas numéricos para proceder à representação da informação digital. Alguns
dos mais utilizados são os seguintes:
• Decimal (base 10)
O sistema de numeração decimal usa dez algarismos e é o sistema mais
utilizado por seres humanos. Normalmente é utilizado para indicar
quantidades, e é constituído por dez algarismos: 0,1,2,3,4,5,6,7,8,9. No
sistema decimal cada algarismo tem um valor posicional, ou seja, cada
algarismo tem um peso de acordo com a sua posição na representação
do valor (unidades, centenas, dezenas...)
• Binário (base 2)
O sistema binário é o mais frequente no mundo da computação. São
utilizados 0 e 1 (pois facilita a representação de tensões). Os sistemas
digitais trabalham internamente com dois estados (ligado/desligado,
verdadeiro/falso, aberto/fechado). Ele utiliza os símbolos: 0, 1, sendo
cada símbolo designado por bit (binary digit).
• Octal (base 8)
O sistema octal foi muito utilizado no mundo da computação, como uma
alternativa mais compacta do sistema binário, na programação em
linguagem de máquina. Esse é um sistema de numeração de base 8, ou
seja, recorre a 8 símbolos (0,1,2,3,4,5,6,7) para a representação de um
determinado valor. Atualmente, o sistema hexadecimal é um dos mais
utilizados como alternativa viável ao sistema binário.
• Hexadecimal (base 16)
Sistema de numeração muito utilizado na programação de
microprocessadores, especialmente nos equipamentos de estudo e
sistemas de desenvolvimento. Utiliza os símbolos: 0,1,2,3,4,5,6,7,8,9 do
sistema decimal e as letras A,B,C,D,E,F. Equivalências:
A=10,B=11,C=12,D=13,E=14 e F=15. Utilizados em aplicações para
denominar cores, registradores e memória.

Variável
Uma variável em programação representa, através de símbolos, o conteúdo de
uma célula ou posição de memória. Por exemplo, se uma variável de nome x
possui o valor 10, significa que a posição de memória, representada pelo símbolo
x, armazena o valor 10. Em programação, podemos enxergar a memória como
um conjunto de posições que possuem um endereço e uma representação
simbólica (variável).
As variáveis podem ter nomes diversos, desde símbolos comuns na matemática,
como é o caso das variáveis x, y e z, até nomes como var, endereco, cpf etc.
Perceba também que os valores que as variáveis podem armazenar não se
limitam apenas a valores numéricos inteiros. Elas podem armazenar, por
exemplo, um conjunto de caracteres, como é o caso da variável z = ‘aula’, e
valores fracionários, como é o caso das variáveis y = 20,5 e var = -1.700,23.
As variáveis possuem escopo dentro de uma rotina ou todo o programa. São as
chamadas variáveis locais e globais. As variáveis locais são aquelas acessadas
apenas dentro de uma rotina ou função, e as variáveis globais são acessadas
em qualquer ponto do programa a qualquer momento.
As variáveis podem, por sua vez, ser representadas de forma primitiva (inteiros,
reais, caracteres...) ou de forma estruturada (vetores, registros, matrizes, listas).

Algoritmos
Um algoritmo é um conjunto de passos, numa determinada sequência, para
realizar uma tarefa. Este possui como características a Definição, Finitude,
Efetividade, Entradas e Saídas. Definição diz respeito de que os passos de um
algoritmo devem ser bem definidos, objetivando a clareza e evitando
ambiguidades. A Finitude diz que um algoritmo deve chegar ao seu fim após um
número finito de passos. A Efetividade diz que um algoritmo deve ser efetivo, ou
seja, suas operações devem ser básicas o suficiente para que possam, em
princípio, serem executadas de maneira exata e em um tempo finito. Um
algoritmo deve possuir zero ou mais Entradas. Estas são insumos ou
quantidades que são processados pelos algoritmos durante a execução de seus
passos. Um algoritmo deve possuir uma ou mais Saídas. Elas representam o
resultado do trabalhado realizado pelos algoritmos.
Existem algumas formas de se representar um algoritmo. As 3 mais utilizadas
são a Descrição Narrativa, Fluxograma e a Linguagem Algorítmica. Na descrição
narrativa Os algoritmos são expressos em linguagem natural (português, inglês,
francês, espanhol, etc.). Sua principal desvantagem se encontra no fato da
linguagem natural estar bem distante da linguagem utilizada pelos
computadores. Logo, a tradução de uma para a outra se torna uma atividade
bastante dispendiosa. Além disso, linguagens naturais são mais propensas a
ambiguidades. Muitas vezes uma palavra pode ter vários significados,
dependendo do contexto no qual são utilizadas. Em contrapartida, é bem mais
fácil elaborar um algoritmo por meio de uma linguagem com a qual já temos uma
certa familiaridade, do que através de linguagens que não são utilizadas com
frequência no dia a dia. Abaixo, um exemplo de algoritmo para fritar ovo.

1. Retire o ovo da geladeira.


2. Coloque a frigideira no fogo.
3. Coloque óleo na frigideira.
4. Quebre ovo, separando a casca.
5. Ponha a clara e a gema na frigideira.
6. Espere um minuto.
7. Apague o fogo.
8. Retire o ovo da frigideira

Uma outra forma é o uso de fluxograma. Consiste em se usar formas


geométricas padronizadas para descrever os passos a serem executados pelos
algoritmos. A vantagem de se fazer uso dos fluxogramas está na facilidade de
compreendê-los. Descrições de algoritmos mediante formas gráficas são mais
facilmente compreendidas do que descrições que envolvem apenas textos,
como mostrado na Figura 5.3. Além do mais, os fluxogramas possuem um
padrão mundial no que se refere à sua simbologia, tornando sua utilização
independente das peculiaridades das linguagens naturais.
Analisando-a com mais cuidado, é possível perceber que os fluxogramas tendem
a crescer bastante quando descrevem algoritmos constituídos de muitos passos,
o que dificulta tanto sua construção como sua visualização.

Figura 5.3: Formas geométricas para o fluxograma.

Além dessa desvantagem, por impor regras para sua utilização de acordo com
cada forma geométrica, há uma limitação no seu poder de expressão, se
comparado com a descrição narrativa. A Figura 5.4 mostra um exemplo de
fluxograma para o cálculo da média final de um aluno com base em suas notas
e classificá-lo como aprovado ou reprovado.

Figura 5.4: Algoritmo com fluxograma.

Por último, tem-se a linguagem algorítmica. A linguagem que o computador é


capaz de compreender tem grande influência na elaboração de algoritmos
projetados para ele. Seus passos não podem conter instruções desconhecidas
ou fazer referência a símbolos ou expressões que os computadores não
conseguem decifrar. Tal linguagem se baseia em conceitos e em arquiteturas de
hardware que determinam o funcionamento básico de um computador.
Dentre as existentes, a mais utilizada nos computadores atuais é a arquitetura
de von Neumann. Seu autor, John Von Neumann, propôs um modelo em que as
instruções e os dados ficam juntos na memória. O processador busca as
instruções na memória e as executa uma de cada vez, segundo o seguinte ciclo
de execução:
1. Busca instrução;
2. Decodifica instrução;
3. Executa instrução;
4. Volta para o passo 1 para buscar a instrução
seguinte na memória.

Um exemplo de algoritmo para multiplicar dois valores é mostrado abaixo

1. Escreva 2 na posição de memória nomeada de x.


2. Escreva 3 na posição de memória nomeada de y.
3. Multiplique x e y e o resultado escreva em z.

A linguagem algorítmica (pseudocódigo ou pseudo-linguagem), por sua vez,


consiste no emprego de uma linguagem intermediária entre a linguagem natural
e uma linguagem de programação. Esse meio termo resulta em uma linguagem
que se aproxima das construções de uma linguagem de programação, sem
exigir, no entanto, rigidez na definição das regras para utilização de suas
instruções. Geralmente, essa forma de representação de algoritmos é uma
versão reduzida de linguagens de alto nível como C e Pascal.

ALGORITMO
DECLARE nota1, nota2, M : NUMÉRICO
LEIA nota1
LEIA nota2
M ← (nota1 + nota2) / 2 (A posição de
memória, representada simbolicamente por
M, recebe o valor da soma de nota1 e
nota2, dividido por dois.)
SE M >= 7.0 ENTÃO
ESCREVA “Aprovado”
SENÃO
ESCREVA “Reprovado”
FIM-SE
FIM_ALGORITMO.

Para finalizar, existe uma estrutura de controle condicional essencial para as


linguagens de programação. Operações de atribuição, expressões e estruturas
de controle fazem parte do núcleo das linguagens de programação imperativas
e são, portanto, fundamentais para o aprendizado da programação. A principal
vantagem da forma de representação em linguagem algorítmica está na
facilidade com a qual um pseudocódigo pode ser transcrito para uma linguagem
de programação. Assim como os fluxogramas, a desvantagem fica por conta da
limitação do seu poder de expressão, devido às regras impostas para a
elaboração das instruções.

Laços de Decisão e Repetição


Um algoritmo depende de tomadas de decisão para realizar os procedimentos e
ações necessárias para retornar as saídas. Esses são os laços decião e
repetição e são os seguintes: “If-Else”, “While” e “For”. Estes se baseiam na
comparação e expressões lógicas. Um exemplo de um laço “If-Else” é dado
abaixo.
LEIA nota
SE nota >= 7 ENTÃO
ESCREVA "Aprovado"
SENÃO
ESCREVA "Reprovado"

Em relação aos laços “While” e “For”, estes são laçoeles são, no conceito
semelhantes, mas diferem na implementação via que código, que dependerá da
linguagem utilizada. Abaixo segue um exemplo de laço “While” e “For”.

LEIA nota
ENQUANTO nota <> -1 FAÇA
SE nota >= 7 ENTÃO
ESCREVA "Aprovado"
SENÃO
ESCREVA "Reprovado"
LEIA nota
FIM-ENQUANTO

5.2 Conceitos básicos de python


Para programar em Python 3, será necessário ter uma noção dos conceitos de
criação de variáveis, declaração de funções, declaração de classes, operações
matemáticas básicas e comentários.

Variáveis e tipos de dados


Para declarar variáveis, deve-se apenas digitar a variável e o valor a ela
atribuído. O Python já entende no valor qual é o tipo da variável de forma
otimizada, diferente de outras linguagens onde o usuário deve declarar o tipo da
variável. Abaixo seguem alguns exemplos de variáveis suportadas pelo Python.
Além das mostradas abaixo, existem também as seguintes estruturas de dados:
vetores, matrizes, séries de dados e frame de dados.

#esta variável é uma “string”


a = "Esta é uma string"
#esta variável é uma lista de dados
lista1 = ["aqui", 8, 9, ["lista", "dentro"]]
#esta variável é um inteiro
b = 10
#esta variável é um ponto flutuante
a = 19.5
#esta variável é uma tupla
tuplas = 1,2,3,4,"ultimo"
#esta variável é um dicionário
dicionario = {"deutsch":"português", "Dieb":"ladrao",
"Tür":"porta"}

Strings
Um tipo de variável é a string. Ela é composta por caracteres e forma um texto,
ou frases. Strings são escritas entre aspas simples ou duplas (“”, ‘’). Um exemplo
de como manipular uma string é dado abaixo. Para facilitar o entendimento do
código, são adicionados comentários após cada linha. Tudo que estiver após “#’
é um comentário em Python. Portanto, não é compilado pelo programa.

a = "Esta é uma string." #variável a recebe a string


print(a) #imprime a string na tela

b = " Imprimindo algo em conjunto." #variável b recebe a string


print (a + b) #imprime a e b na tela

O resultado de a + b na tela é “Esta é uma string. Imprimindo algo em


conjunto.”
Várias strings podem ser armazenadas em uma lista. O exemplo abaixo
demonstra isso.

lista1 = ["Este ","tem ","tudo."] #variável lista 1 recebe


várias #string ao mesmo tempo
print(lista1[0] + " " + lista1[1] + " " + lista1[2]) #imprime as
strings nas posições 0, 1 e 2 da lista1.
#o resultado de a + b na tela é “Esta é uma string. Imprimindo
#algo em conjunto.”

O resultado na tela é “Este tem tudo.”. Pode-se também adicionar novos


elementos na lista e também verificar o tamanho da lista, como mostrado
abaixo. O elemento adicionado será colocado na última posição. Também,
pode-se retirar o último elemento utilizando o “remove(elemento)”.

lista1.append("Com ") #adicionando “Com “ na lista


#o resultado será ["Este ","tem ","tudo.", "Com "]
len(lista1) #verificando o tamanho da lista
#o resultado será 4
lista1.remove("Com ") #retirando o último elemento da lista
#o resultado será ["Este ","tem ","tudo."]

Caso se queira imprimir na tela uma variável em uma posição específica, deve-
se adicionar { } na posição que se deseja e, após a string, deve-se escrever
“.format(nome_da_variável)” para mostrar que se quer formatar a string e quais
variáveis se quer mostrar. O resultado do comando será “Quero inserir a string
Esta é uma string.”

print("Quero inserir a string {}".format(a)) #imprime a string


#a na posição específica com as {}.
Números e operações
Para se trabalhar com números e operações, deve-se realizar a operação com
os símbolos normais da matemática, com exceção da potenciação, que se deve
utilizar “**”, de acordo com o modelo abaixo. Por padrão, toda a divisão realizada
em Python é retornada como um ponto flutuante.

5 + 2 #soma de 2 números -> 7


5 - 2 #subtração entre 2 números -> 3
5 / 2 #divisão entre 2 números -> 2.5
5 * 2 #multiplicação de 2 números -> 10
5 % 2 #módulo da divisão de 1 número -> 1
5 ** 2 #potência de 1 número1 -> 25

É possível a transformação de tipos de número em Python. Isso pode ser feito


utilizando funções já inseridas no Python. Abaixo seguem alguns exemplos.

int(5 / 3) #transforma em inteiro o resultado -> 1


int("34") #transforma em inteiro o resultado -> 34
float(5) #transforma em ponto flutuante -> 5.0
str(5) #transforma em string -> “5”

Laços de Decisão e Repetição


Em relação aos laços de decisão e repetição, temos as seguintes estruturas.
Para o laço “If-Else”, temos a estrutura abaixo e um exemplo verificando se um
número é maior que 20.

if condição: #verifica a condição


ação #resultado esperado se for verdade
else: #verifica a não-condição
ação falso #resultado esperado se for falso

if x > 20:
print("Número é maior que 20") #imprime a string > 20
else:
print("Número é menor que 20") #imprime a string < 20

Caso exista mais de uma condição, deve-se usar a seguinte estrutura. O


exemplo a seguir mostra se o número é maior que 20, se está entre 20 e 15, ou
se é menor que 15.

if condição 1: #verifica a condição 1


ação 1 #resultado esperado se for verdade 1
elif condição 2: #verifica a condição 2
ação 2 #resultado esperado se for verdade 2
else: #verifica a não-condição
ação falso #resultado esperado se for falso

if x > 20:
print("Número é maior que 20") #imprime a string > 20
elif x < 20 AND x >= 15:
print("Número entre 20 e 15 ") #imprime a string entre 15 e
#20, com 15 sendo inserido no intervalo
else:
print("Número é menor que 15") #imprime a string < 15

Para montar um laço “While”, deve-se montar a estrutura a seguir. É mostrado


na sequência um exemplo para imprimir o valor de um contador na tela até que
este alcance o valor de máximo antes de 10.

contador #inicialização de um contador


while condição: #condição para se manter no laço
ação #ação dentro do laço
atualização do contador #atualização do contador

i=0 #inicialização do contador i


while i < 10: #enquanto i for menor que 10
print(i) #imprima na tela o valor de i
i = i + 1 #atualiza o valor do contador
No caso do laço “For”, existe uma diferença na questão do contador. O próprio
laço atualiza o contador, facilitando a diminuição de erros por esquecimento da
atualização do mesmo. Abaixo segue a estrutura do laço “For” e o mesmo
exemplo acima realizado para o laço “While”. A função “range”, neste caso, entra
na condição para retornar os valores entre 0 e 10 para comparação.

for contador in condição: #condição para se manter no laço


ação #ação dentro do laço

for i in range(0,10): #enquanto i for menor que 10


print(i) #imprima na tela o valor de i

5.3 Desenvolvendo funções e classes


Funções e classes são formas bastantes utilizadas em programação para
aumentar o desempenho e reaproveitamento dos códigos. Funções fazem ações
para processar dados e retornar um resultado de operações e classes
representam as coisas no mundo. Exemplos de funções são ligar e desligar a
luz, ligar e desligar a TV, somar dois números, etc. Exemplos de classes são
avião, carro, TV, computador, etc.

Funções
Para se declarar uma função, é importante ter o algoritmo em mãos. As funções
podem ter 0 ou várias entradas (parâmetros) e devem ter retornar “nulo” ou
diferentes variáveis. A estrutura para se declarar uma função é descrita abaixo.
Percebe-se também os comentários escritos entre dois trios de aspas duplas ("""
comentários """). Estes têm a função de documentação da função e serve para
facilitar o entendimento do que foi feito. Este é o padrão utilizado pelos
desenvolvedores que utilizam Python.

def nome_funcao(arg1, arg2...): #declaração da função


"""Descrever o que faz a função

Args:
Escrever que parâmetros de entrada são utilizados

Returns:
Escrever quais são as saídas retornadas
"""
ações #realiza as ações
return variável(éis) de retorno #retorna as saídas

Um exemplo é uma função “escreve_ola”, que não pega nenhum parâmetro de


entrada, escreve “Olá Manutenção” e o valor da variável i tela e não retorna nada.

def escreve_ola():
"""Esta função imprime "Olá Manutenção" na tela

Args:
Nenhum

Returns:
Nenhum
"""
print("Olá Manutenção") #imprime na tela a string
i = 4 #atualiza a variavel i
print(i) #imprime na tela o valor da variavel

Um segundo exemplo é o cálculo da média de dois números, onde a média é o


retorno da função, e dois números servem como parâmetros de entrada.

def calcula_media(a,b):
"""Esta função calcula a média entre dois números

Args:
a : o primeiro número
b : o segundo número

Returns:
A média entre a e b
"""
return (a+b)/2 #soma os número e divide por 2

Para executar essas funções e obter informações sobre essas mesmas funções,
deve-se fazer da seguinte forma (lembrando que a segunda função retorna um
valor):

escreve_ola() #executa a função “escreve_ola”


help(escreve_ola) #obtem a documentação da função

M = calcula_media(5,8) #executa a função “calcula_media”


colocando 5 e 8 como parâmetros e retornando o resultado na
variável M
print(M) #imprime na tela o valor de M
help(calcula_media) #obtem a documentação da função

Pode-se também utilizar as funções em laços de repetição. O exemplo abaixo


armazena, em uma lista, 10 médias cujo parâmetros de entrada variam de
acordo com o valor do contador. Além disso, escreve-se na tela o conteúdo da
lista dentro do laço e ao final do programa.

Medias = [] #cria uma lista vazia


for i in range(0,10): #executa um laço de 10 números
Medias.append(calcula_media(i+4, i+7)) #calcula a media e
#adiciona na lista
print(Medias) #imprime a lista na tela
print(Medias) #imprime na tela ao fim do laço

Classes
As classes representam o nosso dia-a-dia. A interação entre instâncias de
classes (ou objetos) mostra como o nosso mundo funciona. As classes possuem
atributos e métodos. Atributos são as características da classe (ex.: patas de um
cachorro, número de dedos de uma pessoa, etc) e métodos são funções que
alteram o estado da classe. Porém, quando se é alterado o estado de um objeto,
o estado de outro objeto semelhante não é influenciado. Um exemplo é quando
se possui 2 TVs e se executa o método “ligar” em apenas uma delas. Uma TV
fica ligada, enquanto a outra se mantém desligada. A estrutura genérica para a
criação de uma classe é dada a seguir. A documentação de uma classe se
mantém semelhante à documentação de uma função, porém com nomenclaturas
diferentes. Percebe-se que o metodo1 necessita de entradas e retorna uma
saída, enquanto o metodo2 não necessita de entradas e não retorna nenhum
valor quando executado.

class nome_classe(object): #declaração da classe


"""Descrever o que é a classe
Args:
Escrever os parâmetros de entrada são utilizados

Atributes:
Escrever quais são os atributos
"""
def __ini__(self,arg1, arg2…): #método inicial objeto
ações #ações iniciais
def método1(self,arg10,arg20…): #método 1 definido usuário
ações 2 #ações 2 para alterar estados
return variáveis #retorna as variáveis
def método2(self): #método 2 definido usuário
ações 3 #ações 3 para alterar estado

Para ilustrar a criação da classe, toma-se como exemplo a criação de um


caminhão, onde se tem como atributos o número de portas, a identidade, a cor,
a marca, o número de pneus e como parâmetros a sua disponibilidade física (df),
o tempo médio entre falhas (mtbf) e o tempo médio de reparo entre as falhas
(mttr). As variáveis que se iniciam com “self”, são as variáveis internas da classe.
Todos métodos devem conter como primeiro, por padrão do Python, o “self”,
como poder ser visto no exemplo abaixo.

class Caminhao(object):
"""Esta classe cria um caminhao genérico
Args:
identidade : fala quem é o caminhao
marca : mostra o fabricante
cor : mostra a cor atual
pneus : indica o número de pneus atual
portas : indica o número de portas atual

Attributes:
df: disponibilidade física do caminhão
mtbf: tempo médio entre falhas
mttr: tempo médio para reparo
"""
def __init__(self,identidade,marca,cor,pneus,portas):
""" Este é o método inicial para criação do objeto
Args:
Nenhum

Returns:
Nenhum
"""
self.id = identidade #inicializa a identidade
self.marca = marca #inicializa a marca
self.cor = cor #inicializa a cor
self.pneus = pneus #inicializa o num de pneus
self.portas = portas #inicializa o num de portas
self.df=0 #inicializa a df
self.mttr=0 #inicializa o mttr
self.mtbf=0 #inicializa o mtbf

def reseta_cor(self):
"""Este método reseta a cor do caminhão para a cor de
fábrica
Args:
Nenhum

Returns:
Nenhum
"""
self.cor = "Amarelo" #reinicia a cor como amarelo

def display(self):
"""Este método mostra todos os atributos do caminhão

Args:
Nenhum

Returns:
Nenhum
"""

print(str(self.id) + " " + self.marca + " " + self.cor


+ " " + str(self.pneus) + " " + str(self.portas))

def atualizar_indicadores(self,df,mttr,mtbf):
"""Este método atualiza os indicadores do caminhão

Args:
Nenhum

Returns:
Nenhum
"""
self.df = df #atualiza a df
self.mttr = mttr #atualiza o mttr
self.mtbf = mtbf #atualiza o mtbf
A inicialização do objeto e sua manipulação se dão como mostrados abaixo.

#inicializa o objeto
caminhao_1 = Caminhao("7001","Liebherr","Branco",4,3)
caminhao_1.display() #acessa o método para mostrar os
#atributos do objeto
#Neste momento a saída na tela seria "7001 Liebherr Branco 4 3"
caminhao_1.reseta_cor() #reseta a cor do caminhão
caminhao_1.display() #acessa o método display
#Agora, a saída na tela seria "7001 Liebherr Amarelo 4 3"
#atualiza indicadores através do método do caminhao
caminhao_1.atualizar_indicadores(85,12,200)
print(caminhão.df) #mostra na tela o valor atual da df
print(caminhão.mttr) #mostra na tela o valor atual do mttr
print(caminhão.mtbf) #mostra na tela o valor atual do mtbf
#A saída na tela seria 85, 12, 200

5.4 Importação de dados


Neste treinamento, serão contempladas as seguintes formas de importação de
dados: arquivos de texto (txt, csv, xlsx,), banco de dados e via web.

Arquivos de texto
A primeira forma é a importação de dados vindos de arquivos de texto,
geralmente no formato “.csv”. Para ler esses dados será necessário importar um
módulo: pandas. A estrutura para ler esses dados é dada da seguinte forma:
importa-se o módulo pandas com o nome “pd” (para facilitar seu manuseio no
código). Após isso, cria-se uma lista para receber o conteúdo desse arquivo e se
utiliza a função ler o arquivo, como pode ser visto abaixo.

#1° Passo - Importação dos módulos


import pandas as pd #importa o módulo pandas

#2° Passo - Importação dos dados


dataset = [] #cria a lista
#adiciona o arquivo csv ex1.csv
dataset.append(pd.read_csv('ex1.csv',encoding='ISO-8859-1',
sep=";", header=0))
#adiciona o arquivo txt ex1.txt
dataset.append(pd.read_csv('ex1.txt',encoding='ISO-8859-1',
sep=",", header=None))
#adiciona o arquivo xlsx ex1.xlsx
dataset.append(pd.read_excel('ex1.xlsx',encoding='ISO-8859-1',
sep=";", header=0))

Utilizando a função do módulo pandas, acessada com “pd.read_csv”, realiza-se


a leitura dos dados do arquivo “ex1.csv”, sendo este armazenado na lista como
um frame de dados. O parâmetro “encoding” mostra qual o padrão que se quer
utilizar na hora de o programa entender os caracteres da forma correta. Neste
caso foi usado o padrão “ISSO-8859-1” por conta de caracteres especiais da
língua portuguesa. O parâmetro “sep” diz respeito a qual o tipo de separação
entre colunas é dado no arquivo lido. No caso do “csv” é dado como “;”. Já no
caso do arquivo “ex1.txt” é dado como “,”. Isso vai variar de arquivo para arquivo.
Portanto, deve-se ter certeza de qual é o separador utilizado para o arquivo.
Por último, é verificado se o arquivo possui um cabeçalho (header), que são os
nomes de cada coluna. Nos arquivos “csv” e “xlsx”, o header está na primeira
linha, ou seja, no arquivo será a linha “0”. No caso do arquivo “txt”, não existe
nome das colunas, portanto, é colocado como “None”.
Para a leitura do arquivo “xlsx” o que vai mudar é a função utilizada. Neste caso,
será a “pd.read_excel”. Os parâmetros são iguais para este exemplo. Porém,
existem outros parâmetros. Um deles é escolher uma planilha específica dentro
do arquivo que se deseja ler. Deve-se utilizar “sheet_name = número da planilha“
para importar a planilha desejada.

Conexão com banco de dados


Antes de se conectar a qualquer banco de dados, deve-se importar o conector
responsável pela importação desses dados. Existem diversos tipos de bancos
de dados, portanto, deve-se verificar qual o tipo utilizado onde se está
trabalhando. Neste treinamento, será utilizado o MySQL e, desta forma, o
conector será o mysql.connector. Para importá-lo, precisa-se ir primeiramente no
console do Anaconda, encontrado no menu iniciar do seu computador. Uma vez
aberto, deve-se digitar o comando “pip install mysql.connector”, como pode ser
vista na Figura 5.5 abaixo. O Anaconda fará isso automaticamente para o
usuário.

Figura 5.5: Importando o conector do MySQL.

Uma vez importado o módulo, deve-se desenvolver o código para importação


dos dados. Deve-se ter em mãos o endereço do servidor IP onde está instalado
o Bando de Dados, o nome do banco de dados, o usuário e sua respectiva senha.
Além disso, é necessário saber de qual tabela do banco de dados virão os dados.
Um exemplo é dado abaixo para um banco de dados que contém informações
de hospitais em uma determinada região.

#1° Passo - Importação dos módulos


import mysql.connector #importação do conector
from mysql.connector import Error #importação dos erros

#2° Passo - Importação dos dados


#Faz a tentativa de conexão. Em caso afirmativo, realiza as
#ações necessárias. Caso dê errado, o código pula para a parte
#de erros e, finalmente, fecha a conexão.
try:
#cria a conexão com o banco de dados
conexao = mysql.connector.connect(host="127.0.0.1",
database = "nome_do_banco",
user="usuario",
password = "senha_do_usuario")
#cria a “query” para buscar do banco de dados o que se deseja
#Neste caso, se deseja pegar a lista completa de hospitais
mySql_select_Query = "SELECT * FROM hospital"
cursor = conexao.cursor(buffered=True) #cria a o cursor
cursor.execute(mySql_select_Query) #executa o pedido
fetching_size=30 #número máximo requerido na lista
#armazena os dados recebidos em uma variável
dados = cursor.fetchmany(fetching_size)
#imprime na tela o número total de linhas recebidas
print("Número total de linhas: {}".format(cursor.rowcount))
#imprime na tela o número total de hospitais recebido,
#limitando a 30.
print("Imprimindo o número de hospitais:
{}".format(fetching_size))
except Error as e: #verifica qual o erro, quando ocorrer
#imprime na tela o erro
print("O erro atual é: {}".format(e))
finally: #corta a conexão quando acabarem as ações
if(conexao.is_connected()):
cursor.close() #finaliza o cursos
conexao.close() #finaliza a conexão
print("A conexao está terminada") #imprime na tela

Uma vez importados os dados, agora se deve trabalhar com a variável “dados”.

Conexão com Web


A última forma que será utilizada neste treinamento é a importação de dados da
web utilizando a leitura de arquivos json (JavaScript Object Notation), um dos
formatos mais utilizados para se trocar dados no mundo. Para importar os dados,
é necessário trazer para o código os módulos “json” e “requests”, já que se deve
conectar a uma página na internet que fornecer dados no formation json. O
exemplo abaixo mostra a importação dos dados sobre a evolução dos números
da CoVID-19 disponibilizados diariamente no site americano do projeto “Covid
Tracking”. Este site já disponibiliza os dados no formato json. São basicamente
2 passos a se realizar: a importação dos módulos e a leitura no site desses
dados, trazendo para uma variável a limpeza dos dados com apenas os números
necessários.
#1° Passo - Importação dos módulos
import json #importa o módulo json
import requests #importa o módulo requests

#2° Passo - Importação dos dados


#Cria a variável para receber os dados da página em questão
resposta = requests.get("https://covidtracking.com/api/v1/
us/daily.json")
#Quebra os dados json e os armazena em uma variável
dataset = json.loads(resposta.text)

5.5 Tratamento de dados


Uma vez importados os dados, deve-se trabalhá-los para os formatos que se
necessita, fazendo uma “limpeza” dos mesmos, para evitar erros nos passos
posteriores. Os dados são colocados de 2 formas: como uma matriz de dados
homogêneos (arrays) ou em um frame de dados heterogêneos (dataframes).
Como esses dados vêm de diferentes fontes, deve-se pensar em como
manipular esses dados, como retirar, limpar dados que estão faltantes e também
normalizar os dados.

Matrizes ou “Arrays”
Quando se deseja trabalhar com uma matriz de dados homogêneos, deve-se
utilizar o módulo numpy. Com este módulo, consegue-se manipular os dados
dentro do vetor ou da matriz da mesma forma que aprendido em álgebra linear.
Para isso, deve-se primeiro importar os módulos e os dados. Após a importação
dos dados transforma-se os dados obtidos em uma matriz homogênea. O
exemplo abaixo mostra a importação dos dados ia transformação em matriz
armazenando os dados em uma matriz T. com essa matriz podemos acessar um
elemento através do uso dos colchetes. também conseguimos realizar
operações matemáticas como adição, subtração, multiplicação, divisão e
exponenciação.

#1° Passo - Importação dos módulos


import numpy as np
import pandas as pd
#2° Passo - Importação dos dados
dataset = [] #cria a lista
#adiciona o arquivo csv ex1.csv
dataset.append(pd.read_csv('ex1.csv',encoding='ISO-8859-1',
sep=";", header=0))

#3º Passo – Manipulação dos dados


#armazenando o tipo de dados específico
Arquivo_1=dataset[0]
#verificando o tipo dos dados
T = np.array(Arquivo_1.iloc[:,[1,2,3]])
T[0][0] #acessando o elemento ‘00’
T = T + 2 #somando 2 aos elementos de T
T = T - 2 #subtraindo 2 dos elementos de T
T = T*2 #multiplicando os elementos de T
T = T/2 #dividindo os elementos de T por 2
T = T**2 #elevando os elementos ao quadrado
T = T*T #multiplicando a matriz T por outra
T.dtype #verificando o tipo dos dados de T
T.shape #verificando o formato da matriz T
print(T.shape) #imprimindo na tela o formato de T
T[:,0:2] #acessando uma seção da matriz T
t = T[0,0:3].copy() #copiando uma seção da matriz T
t[0:3] = 124 #atribuindo o valor 124 à seção
#específica da matriz t
T==125 #comparação booleana
t2 = T[T==125] #atribuindo à matriz t2 a seção de T
#resultante da comparação booleana
t2 = t2.T #realizando a transposta da matriz
T = T.sort() #organizando os dados da matriz T

Com essa mesma matriz, podemos saber qual o tipo dos dados inseridos na
matriz, podemos saber qual o seu formato e também podemos acessar uma
parte (seção) dessa matriz. Deve-se tomar cuidado ao acessar uma seção da
matriz, pois por padrão do Python, essa seção altera a matriz original. Para evitar
isso, deve-se fazer uma cópia da seção da matriz. Uma outra forma de acessar
seções da matriz é realizando lógicas booleanas. Isso serve para retirar apenas
valores específicos. Por fim, pode-se também organizar os valores da matriz
utilizando o método “.sort()”. Abaixo pode-se ver um exemplo de código para
manipular os dados da matriz.

Séries de dados
Uma série de dados é um vetor de dados com um índice. Para utilizar essa série
deve se importar o módulo pandas. Com uma série de dados, consegue-se
manipular dados de forma semelhante às matrizes. A maior diferença é que uma
série só possui uma coluna, diferentemente das matrizes. É como se trabalhasse
uma coluna e linhas do Excel onde cada linha é única. Com a série de dados,
pode-se retirar valores nulos, identificar valores não nulos e atualizar a série de
forma que fique no melhor formato que se esteja procurando.
Com o módulo pandas se pode transformar qualquer vetor em uma série de
dados. Pode-se também realizar operações matemáticas entre séries de dados
e alterar seus índices facilmente. Abaixo segue um exemplo da criação de
objetos transformados em séries de dados e manipulações dessas séries. Um
tipo de variável dicionário é considerada como a série de dados desde que se
tenha apenas um valor para cada índice.
#1° Passo - Importação dos módulos
import pandas as pd
#2° Passo - Obtenção dos dados
#criação do objeto que vira série de dados
obj1 = pd.Series([4,-6,7,8], index=['d','f','e','r'])
#criação do segundo objeto que vira série de dados a partir de um
#dictionary
obj2 = {'Recife':2000000, 'São Paulo':20000000, 'Maceió':1000000,
'Rio de Janeiro':12000000}
obj2 = pd.Series(obj2) #transformando em série de dados
obj2['Recife'] #acessando o índice Recife
obj2[2] #acessando o índice 2
obj1[obj1>2] #acessando as linhas onde os
#valores são maiores que 2
obj2[obj2<=2000000] #acessando as linhas onde os
#valores são menores ou iguais
#a 2000000
#criando uma lista de cidades
cidades = ['Recife','São Paulo', 'Maceió', 'Fortaleza']
#criando um novo objeto que recebe a lista de cidades como índices
#o detalhe está que só irá importar os dados dos valores que são
#comuns à lista e ao obj2. O que não tiver em obj2 será preenchido
#com “NaN”, ou Not a Number.
obj3 = pd.Series(obj2,index=cidades)
obj3.isnull() #retornar onde os valores são nulos
pd.notnull(obj3) #retornar onde os valores não nulos
obj3.notnull() #retornar onde os valores não nulos
obj21 = pd.Series(obj2) #transformando em serie de dados
obj3['Fortaleza']=23 #alterando o valor da coluna
obj4 = obj21 + obj3 #somando 2 frames e armazenando em
#outro
obj4.index.name = "Cidades" #inserindo o nome da coluna de índices
obj4.name = "População" #dando nome ao frame de dados obj4
#alterando os nomes dos índices de obj4
obj4.index=['Recife2','São Paulo', 'Maceió', 'Fortaleza', 'Rio de
Janeiro']
obj4.index[0] = 'Recife3' #alterando um índice em específico

Frame de dados ou ‘dataframes’


Um frame de dados é, diferentemente de uma matriz (array), uma matriz de
dados heterogêneos. É como uma tabela no Excel, onde existem diferentes tipos
de dados em diferentes colunas. Porém, uma coluna contém tipos de dados
iguais. Ou seja, um frame de dados é formado por várias séries de dados.
Os frames de dados servem para armazenar os dados de diferentes fontes e
representam os dados reais que são importados. É assim que se importa dados
de diferentes bancos de dados ou diferentes arquivos disponíveis nos
computadores.
Com o módulo pandas, consegue-se manipular os frames de dados. Pode-se
nomear as colunas acessar uma coluna em específico, dar nome ao frame de
dados dar nome aos índices, e criar novas colunas em frame de dados
existentes.
Também, consegue se retirar colunas ou valores específicos como valores nulos
ou valores que não possuem nada neles. Consegue-se também, realizar
operações matemáticas estatísticas com um ou vários frames de dados. Abaixo
segue um exemplo de um código mostrando como fazer Essas tarefas.
1° Passo - Importação dos módulos
import pandas as pd
import numpy as pd
#2° Passo - Obtenção dos dados
#criação do objeto que vira frame de dados
obj1 = {'cidade':['Recife','São Paulo', 'Maceió', 'Fortaleza'],
'ano':[2002,2003,2004,2005],
'pop':[10000,12000,23333,45675]}
df1 = pd.DataFrame(obj1) #transformando em serie de dados
df1.columns=['Cidade','Ano','População'] #nomeando as colunas
df1['Ano'] #acessando a coluna
df1.name ="Dados" #nomeando o frame
df1.index=['a','b','c','d'] #nomeando os índices
df1["coluna_nova"] = df1["Ano"]-2 #criando uma nova coluna
df1.values #verificando os valores do frame
#retirando a coluna criada e atualizando o frame de dados
df1 = df1.drop('coluna_nova',axis=1)
df1 = df1.drop('a') #retirando a linha ‘a’
df1['b':'d'] #retornando as linhas ‘b’, ‘c’ e ‘d’
df1[0:2] #retornando as linhas ‘b’ e ‘c’
df1 < 23333 #comparação lógica
df2 = df1[df1 < 2003] #retornando as linhas que têm valores
#menores que 2003 e armazenando em uma
#nova variável
df1.ix[['a','b'],1] #retornando coluna 1 e linhas ‘a’ e ‘b’
#retornando todos as colunas e linhas onde a população é maior
#que 10002 em df1
df1.ix[df1.População > 10002,:]
#criando uma matriz 3x3 de 0 a 8
df3 = pd.DataFrame(np.arange(9.).reshape(3,3))
#criando uma matriz 4x4 de 0 a 15
df4 = pd.DataFrame(np.arange(16.).reshape(4,4))
#subtraindo df4 de df3 e armazenando em df5
#fill_value serve para substituir os valores que seriam “NaN” pelo
#valor solicitado antes de realizar a operação. Desta forma, não
#se perde os valores originais
df5 = df3.add(df4, fill_value=1)
df3.mul(df4, fill_value=1)
df3.div(df4, fill_value=1)
df5.add(0,fill_value=3)
#realizando a soma direta dos frames e armazenando em df6
df6 = df3 + df4

Um ponto importante a se comentar é que existem momentos em que se deve


retirar dados faltantes. Para isso, não se usa mais o módulo pandas que, apesar
de possuir métodos para realizar essas tarefas, não são os mais adequados. O
que se usa hoje em dia é o módulo sklearn. Este módulo se adequa ao
tratamento de dados pois foi desenvolvido especificamente para trabalhar com
um grande volume de dados e inteligência artificial. Este módulo utiliza métodos
para tratar os dados faltantes de forma que não se altere as características
estatísticas da série de dados utilizado. Esses métodos englobam a média,
Pegou você já tirou calma mediana moda. Um exemplo de tratamento deste de
dados utilizando este módulo pode ser verificado abaixo.

#1° Passo - Importação dos módulos


import pandas as pd

#2° Passo - Importação dos dados


dataset = [] #cria a lista
#adiciona o arquivo csv ex1.csv
dataset.append(pd.read_csv('ex1.csv',encoding='ISO-8859-1',
sep=";", header=0))

#3º Passo – Manipulação dos dados


#armazenando o tipo de dados específico
Arquivo_1=dataset[0]
#manipulando uma das colunas
Arquivo_1["Plataforma"]=Arquivo_1["Plataforma"]/10
#armazenando uma coluna em uma nova variável
df = Arquivo_1["Plataforma"]
df = df.dropna() #retirando quem é “nulo”
#retirando todas as linhas completamente “nulas”
df.dropna(how='all')
#retirando todas as linhas completamente “nulas”
Arquivo_1.dropna(how='all')
#retirando todas as colunas completamente “nulas”
Arquivo_1.dropna(how='all', axis=1)
#criando uma matriz 3x3 de 0 a 8
df3 = pd.DataFrame(np.arange(9.).reshape(3,3))
#criando uma matriz 4x4 de 0 a 15
df4 = pd.DataFrame(np.arange(16.).reshape(4,4))
#armazenando a diferença em df5
df5 = df3 - df4
#retirando as linhas nulas e atualizando o frame
df5 = df5.dropna(how='all')
#retirando as colunas nulas e atualizando o frame
df5 = df5.dropna(how='all',axis=1)
#substituindo os valores nulos por 2000 em df
df.fillna(2000)

#utilizando sklearn para um tratamento mais robusto dos dados


#faltantes.
#primeiro se cria um objeto da classe “Imputer”, define=se a
#estratégia (média, mediana e moda)
#retira-se também as colunas que não são números. Todas as strings
#devem ser desconsideradas
from sklearn.preprocessing import Imputer
imputer = Imputer(missing_values = 'NaN', strategy = 'median',
axis=0)
Arquivo_1 = Arquivo_1.drop('MemTotal',axis=1)
Arquivo_1 = Arquivo_1.drop('Timestamp',axis=1)
#adequa o objeto aos dados que se quer trabalhar
imputer = imputer.fit(Arquivo_1)
#Transforma os dados com o objeto adequado e armazena num novo
#frame de dados.
Arq2 = imputer.transform(Arquivo_1)

Por último, vê-se a necessidade de normalizar as variáveis que se está


trabalhando. Para isso, utiliza-se o mesmo módulo sklearn. Um exemplo pode
ser verificado abaixo.

#criação do objeto partindo do objeto anterior


Arq3 = Arq2[:,[0,2]]
Arq3[1] = Arq3[1]*10 #manipulando uma coluna em específico
#Realizando o “Feature Scaling”
#importando a classe “StandardScaler” do sklearn
from sklearn.preprocessing import StandardScaler
sd_s = StandardScaler() #inicializando um novo objeto
Arq7 = sd_s.fit_transform(Arq3) #adequando os dados de Arq3
#e armazenando num novo frame

5.6 Geração de gráficos


Uma vez tratados os dados, pode-se gerar os gráficos relacionados a eles. Uma
das boas práticas que a empresa LEAN 4.0 utiliza é a separação em 5 blocos,
caso se queira visualizar os dados. Isso a ajuda a agilizar e reaproveitar os
códigos já criados em outras análises, deixando o foco nos gráficos em si. Os 5
blocos são mostrados na Figura 5.6.
Primeiramente (Bloco 1), deve-se importar os módulos necessários para
desenvolver o código. Mesmo que não se saiba quais bibliotecas inserir no
começo, deve-se ter esse primeiro bloco para organizar as bibliotecas e, dessa
forma, o código. As bibliotecas mais comuns são:
numpy = foco em trabalhar com dados
pandas = foco em trabalhar com dados
matplotlib.pyplot = foco na visualização de dados

Figura 5.6: Blocos para geração de gráficos.

Uma vez importadas a bibliotecas, deve-se buscar os dados de suas fontes,


sejam elas arquivos externos (txt, csv, xlsx, SQL…) ou inseridas de forma
manual (Bloco 2). Esses tipos de forma de importação de dados foram mostrados
nas subseções anteriores. É aqui, neste bloco, que serão criadas as variáveis
para receber os dados das fontes e acessadas as fontes dos dados
Com os dados recepcionados, utilizamos esse bloco (Bloco 3) para o tratamento
das variáveis e ajustes necessários dos dados que queremos utilizar. Aqui se
incluem os cálculos de “limpeza” dos dados e cálculos mais avançados que você
deseja fazer. Exemplos são os cálculos de indicadores e estatísticos. É aqui que
os dados passam de simples dados para informação. Por isso, esse bloco é de
extrema importância. Qualquer erro pode acarretar “sujeira” na informação
gerada.
Esse bloco (Bloco 4) contém o início da visualização. Aqui se incluem a escolha
do gráfico que se quer gerar e a inserção das informações geradas no Bloco 3.
Nesse bloco também pode ser necessário transformar o formato das
informações geradas. Isso se deve ao tipo de gráfico que se quer ter. Portanto,
o quanto antes souber qual o gráfico desejado, melhor para ajustar o resultado
do Bloco 3. Mas, caso não se saiba qual gráfico vai utilizar quando chegar nesta
etapa, não há motivos para preocupação. O Python ajuda a resolver isso
rapidamente com pouquíssimas linhas de código.
Por último (Bloco 5), com as informações tratadas e inseridas no tipo de gráfico
desejado, é necessário ajustar e refinar a visualização. Aqui serão ajustados os
nomes do título e eixos, assim como a escala dos dados e cores. Desta forma,
tem-se pronta a visualização de dados escolhida.
A seguir, serão disponibilizados os dados utilizados para geração dos gráficos.
Pode-se copiar esses dados e salvá-los diretamente em um arquivo csv, para
fins de prática.
dados.csv dados_linha.csv
Finalidade;Custos (kR$) Frequencia;Energia;Equipamento;
Energia;40 Contratacao;Treinamento
Equipamentos;34 Trimestre 1;8;6;20;18
Contratação;55 Trimestre 2;9;8;18;10
Treinamento;43 Trimestre 3;11;9;10;10
Trimestre 4;12;11;7;5

Dados_disp.csv 9;17
Custos (kR$);Temperatura (°C) 11;17
10;22 12;17
12.5;13 10.5;17
13;12 13;16
7;21 7.5;12
11;14 8.5;13
7;13 9.5;15
8;15 11.5;15

Dados_1.csv 11;16,98368126 15;23,92918848


Pessoas;Temperatura 11;10,21182846 15;21,28139047
1;22,4393438 11;12,20501642 15;23,57819599
3;16,30419725 11;14,42880798 16;13,28153362
3;24,61834553 12;27,15392133 16;28,30246315
3;20,53833014 12;12,84723751 16;14,65807578
5;21,83088392 12;23,4158638 16;16,86132887
6;10,84802358 12;15,49816945 17;15,31291135
6;19,62528902 12;27,00025855 17;11,91717975
6;28,43277788 12;14,24945577 17;11,92110802
7;13,63712904 13;18,46467511 17;14,04227263
8;16,75539146 13;13,27844025 17;16,73313068
8;20,28605028 13;7,38666146 17;9,195946996
9;14,37843674 13;27,30030391 18;7,949972632
9;12,9301081 13;10,77290283 18;10,56994565
9;13,70780713 14;19,21496104 18;10,21101999
9;13,09103691 14;17,67688098 18;19,88741536
9;13,49361779 14;22,33072026 19;13,72383854
10;24,07205194 14;23,6274631 19;11,40270802
10;15,56433795 14;20,30240407 19;8,118841748
10;26,63432824 14;12,3004326 20;14,84622571
10;27,59226416 15;26,32198153 21;8,872678777
10;19,16332201 15;9,703313583 22;15,06503016
10;26,68214848 15;12,39295188 22;9,012658456
11;9,295979536 15;13,76712661 24;25,90761441
11;13,42872036 15;25,78249398 24;17,02803434

Agora, serão mostrados os códigos para a criação dos seguintes gráficos: linha,
colunas, barras, histograma, dispersão e pareto.
Para o gráfico de linhas tem-se o seguinte código, baseado nos 5 Blocos. O
resultado é mostrado na Figura 5.7.

#Bloco 1 - Importar as bibliotecas necessárias


#Biblioteca para ler os dados de arquivo externo e trabalhar os
dados
import pandas as pd
#Biblioteca para gerar os gráficos
import matplotlib.pyplot as plt

#Bloco 2 - Importando os dados


#Criação de uma variável para recepcionar os dados
dataset = []
dataset.append(pd.read_csv("dados_linha.csv", sep = ";", decimal
= ",", header = 0, encoding = 'ISO-8859-1'))
#Bloco 3 - Passando os dados originais para uma nova variável
tipo #DataFrame (DF)
#Nova variável para trabalho, recebendo os dados originais no
formato #adequado para o gráfico
df_raw = []
#Retirando apenas os dados necessários para serem gerados
df_raw = pd.DataFrame(dataset[0].iloc[:,:].values)
#Renomeando a coluna dos dados obtidos
df_raw.columns =
["Temporada","Energia","Equipamento","Contratação","Treinamento"
]

#Bloco 4 – Escolhendo e inserindo os dados


#Criando a figura que recebe o gráfico
fig = plt.figure()
#Criando o gráfico de linhas propriamente dito
linha = fig.add_subplot(111)
#Inserindo os dados no gráfico, de cor específica
linha.plot(df_raw["Temporada"], df_raw["Energia"].values,color =
"#318498",marker=“o”)
#Inserindo os dados no gráfico, de cor específica
linha.plot(df_raw["Temporada"],
df_raw["Equipamento"].values,color = "red",marker=“o”)
#Inserindo os dados no gráfico, de cor específica
linha.plot(df_raw["Temporada"],
df_raw["Contratação"].values,color = "green",marker=“o”)
#Inserindo os dados no gráfico, de cor específica
linha.plot(df_raw["Temporada"],
df_raw["Treinamento"].values,color = "yellow",marker=“o”)

#Bloco 5 – Configurando o gráfico


#Ajustando o título do gráfico
linha.set_title('Pagamentos Realizados Trimestres
2018',fontsize=24)
#Eixo "x"
#Ajustando o título do eixo “x”
linha.set_xlabel("Temporada",fontsize=12)
#Eixo "y”
#Ajustando o título do eixo “y”
linha.set_ylabel("Custos (kR$)",fontsize=12)
#Legenda dos dados
linha.legend(["Energia","Equipamento","Contratação","Treinamento
"])
#Mostrando o gráfico
plt.show()

Figura 5.7: Gráfico de linhas

Para o gráfico de colunas, tem-se o seguinte código. O resultado é mostrado na


Figura 5.8.

#Bloco 1 - Importar as bibliotecas necessárias


#Biblioteca para ler os dados de arquivo externo e trabalhar os
dados
import pandas as pd
#Biblioteca para gerar os gráficos
import matplotlib.pyplot as plt

#Bloco 2 - Importando os dados


#Criação de uma variável para recepcionar os dados
dataset = []
dataset.append(pd.read_csv("dados.csv", sep = ";", decimal =
",", header = 0, encoding = 'ISO-8859-1'))

#Bloco 3 - Passando os dados originais para uma nova variável


tipo #DataFrame (DF)
#Nova variável para trabalho, recebendo os dados originais no
formato #adequado para o gráfico
df_raw = []
#Retirando apenas os dados necessários para serem gerados
df_raw = pd.DataFrame(dataset[0].iloc[:,:].values)
#Renomeando a coluna dos dados obtidos
df_raw.columns = ["Finalidade","Custos (kR$)"]

#Bloco 4 – Escolhendo e inserindo os dados


#Criação de uma nova variável para receber os dados desejados
numa #lista
df = df_raw["Custos (kR$)"].tolist()

#Criando a figura que recebe o gráfico


fig = plt.figure()
#Criando o gráfico de colunas propriamente dito
coluna = fig.add_subplot(111)
#Inserindo os dados no gráfico, de cor específica
coluna.bar(df_raw["Finalidade"].values, df, align='center',
color = "#318498")

#Bloco 5 – Configurando o gráfico


#Ajustando o título do gráfico
coluna.set_title('Pagamentos Realizados em 2018',fontsize=24)
#Eixo "x"
#Ajustando o título do eixo “x”
coluna.set_xlabel("Finalidade",fontsize=12)
#Eixo "y”
#Ajustando o título do eixo “y”
coluna.set_ylabel("Custos (kR$)",fontsize=12)
#Mostrando o gráfico
plt.show()

Figura 5.8: Gráfico de colunas

Para o gráfico de barras, tem-se o seguinte código. O resultado é mostrado na


Figura 5.9.

#Bloco 1 - Importar as bibliotecas necessárias


#Biblioteca para ler os dados de arquivo externo e trabalha-los
import pandas as pd
#Biblioteca para gerar os gráficos
import matplotlib.pyplot as plt

#Bloco 2 - Importando os dados


#Criação de uma variável para recepcionar os dados
dataset = []
dataset.append(pd.read_csv("dados.csv", sep = ";", decimal =
",", header = 0, encoding = 'ISO-8859-1'))

#Bloco 3 - Passando os dados originais para uma nova variável


tipo #DataFrame (DF)
#Nova variável para trabalho, recebendo os dados originais no
formato #adequado para o gráfico
df_raw = []
#Retirando apenas os dados necessários para serem gerados
df_raw = pd.DataFrame(dataset[0].iloc[:,:].values)
#Renomeando a coluna dos dados obtidos
df_raw.columns = ["Finalidade","Custos (kR$)"]

#Bloco 4 – Escolhendo e inserindo os dados


#Criação de uma nova variável para receber os dados desejados
numa #lista
df = df_raw["Custos (kR$)"].tolist()
#Criando a figura que recebe o gráfico
fig = plt.figure()
#Criando o gráfico de colunas propriamente dito
barra = fig.add_subplot(111)
#Inserindo os dados no gráfico, de cor específica
barra.barh(df_raw["Finalidade"].values, df, align='center',
color = "#318498")

#Bloco 5 – Configurando o gráfico


#Ajustando o título do gráfico
barra.set_title('Pagamentos Realizados em 2018',fontsize=24)
#Eixo "x"
#Ajustando o título do eixo “x”
barra.set_xlabel("Custos (kR$)",fontsize=12)
#Eixo "y”
#Ajustando o título do eixo “y”
barra.set_ylabel("Finalidade ",fontsize=12)
#Mostrando o gráfico
plt.show()
Figura 5.9: Gráfico de barras

Para o histograma, tem-se o seguinte código. O resultado é mostrado na


Figura 5.10.

#Bloco 1 - Importar as bibliotecas necessárias


#Biblioteca para ler os dados de arquivo externo e trabalhar os
#dados
import pandas as pd
#Biblioteca para gerar os gráficos
import matplotlib.pyplot as plt

#Bloco 2 - Importando os dados


#Criação de uma variável para recepcionar os dados
dataset = []
dataset.append(pd.read_csv("dados.csv", sep = ";", decimal = ","
, header = 0, encoding = 'ISO-8859-1'))

#Bloco 3 - Passando os dados originais para uma nova variável


#tipo DataFrame (DF)
#Nova variável para trabalho, recebendo os dados originais no
formato adequado para o gráfico
df_raw = []
#Retirando apenas os dados necessários para serem gerados
df_raw = pd.DataFrame(dataset[0].iloc[:,:].values)
#Renomeando a coluna dos dados obtidos
df_raw.columns = [“Pessoas"]

#Bloco 4 – Escolhendo e inserindo os dados


#Criando a figura que recebe o gráfico
fig = plt.figure()
#Criando o gráfico de histograma propriamente dito
histograma = fig.add_subplot(111)
#Inserindo os dados no gráfico, de cor específica
histograma.hist(x=df_raw["Pessoas"].values, bins=8,
facecolor="#318498")

#Bloco 5 - Configurando o gráfico


#Ajustando o título do gráfico
histograma.set_title('Número de Pessoas Atendidas em 1
Dia',fontsize=24)
#Eixo "x“
histograma.set_xticks([])
histograma.set_xticks([3,6,9,12,15,18,21,24,27])
histograma.set_xticklabels(['[0,3]','(3,6]','(6,9]','(9,12]','(1
2,15]','(15,18]','(18,21]','(21,24]','(24,Inf]'])
histograma.set_xlim(1,27)
#Ajustando o título do eixo "x" histograma.set_xlabel("Pessoas
Atendidas",fontsize=12)
#Eixo "y"
histograma.set_ylim(0,20)
histograma.set_yticks([])
histograma.set_yticks([0,20])
#Ajustando o título do eixo "y"
histograma.set_ylabel("Frequência Absoluta",fontsize=12)
#Mostrando o gráfico
plt.show()
Figura 5.10: Histograma

Para o diagrama de dispersão, tem-se o seguinte código. O resultado é mostrado


na Figura 5.11.

#Bloco 1 - Importar as bibliotecas necessárias


#Biblioteca para ler os dados de arquivo externo e trabalhar os
#dados
import pandas as pd
#Biblioteca para gerar os gráficos
import matplotlib.pyplot as plt

#Bloco 2 - Importando os dados


#Criação de uma variável para recepcionar os dados
dataset = []
dataset.append(pd.read_csv("dados.csv", sep = ";", decimal = ","
, header = 0, encoding = 'ISO-8859-1'))
#Bloco 3 - Passando os dados originais para uma nova variável
#tipo DataFrame (DF)
#Nova variável para trabalho, recebendo os dados originais no
formato adequado para o gráfico
df_raw = []
#Retirando apenas os dados necessários para serem gerados
df_raw = pd.DataFrame(dataset[0].iloc[:,:].values)
#Renomeando a coluna dos dados obtidos
df_raw.columns = ["Custos (kR$)","Temperatura (°C)"]

#Transformando o dado de string para ponto flutuante


df_raw["Custos (kR$)"] = df_raw["Custos (kR$)"].astype(float)
#Transformando o dado de string para ponto flutuante
df_raw["Temperatura (°C)"] = df_raw["Temperatura
(°C)"].astype(float)

#Bloco 4 – Escolhendo e inserindo os dados


#Criando a figura que recebe o gráfico
fig = plt.figure()
#Criando o gráfico de pareto propriamente dito
dispersao = fig.add_subplot(111)
#Inserindo os dados no gráfico, de cor específica
dispersao.scatter(x=df_raw["Custos (kR$)"].values,
y=df_raw["Temperatura (°C)"].values,color = "#318498",
marker=“o”)

#Bloco 5 - Configurando o gráfico


#Ajustando o título do gráfico
dispersao.set_title('Temperatura x Pagamentos Realizados em
2018',fontsize=20)
#Eixo "x“
#Ajustando o título do eixo “x”
dispersao.set_xlabel("Temperatura (°C)",fontsize=12)
#Ajustando os limites do eixo “x”
dispersao.set_xlim(6,14)
#Eixo "y"
#Ajustando o título do eixo “y” das colunas
dispersao.set_ylabel("Custos (kR$)",fontsize=12)
#Ajustando os limites do gráfico de coluna
dispersao.set_ylim(0,30)
#Mostrando o gráfico
plt.show()

Figura 5.11: Diagrama de dispersão

Por último, tem-se o diagrama de pareto. Para gerá-lo, tem-se o código abaixo.
O resultado é mostrado na Figura 5.12.

#Bloco 1 - Importar as bibliotecas necessárias


#Biblioteca para ler os dados de arquivo externo e trabalhar os
#dados
import pandas as pd
#Biblioteca para gerar os gráficos
import matplotlib.pyplot as plt

#Bloco 2 - Importando os dados


#Criação de uma variável para recepcionar os dados
dataset = []
dataset.append(pd.read_csv("dados.csv", sep = ";", decimal = ","
, header = 0, encoding = 'ISO-8859-1'))

#Bloco 3 - Passando os dados originais para uma nova variável


#tipo DataFrame (DF)
#Nova variável para trabalho, recebendo os dados originais no
formato adequado para o gráfico
df_raw = []
#Retirando apenas os dados necessários para serem gerados
df_raw = pd.DataFrame(dataset[0].iloc[:,:].values)
#Renomeando a coluna dos dados obtidos
df_raw.columns = ["Finalidade","Custos (kR$)"]
#Variável para receber os dados de forma tratada
df = df_raw.sort_values(by=["Custos (kR$)"], ascending=False)
#Variável para receber a frequência acumulada de cada categoria
df_l=df["Custos (kR$)"].cumsum()/df["Custos (kR$)"].sum()*100
#Transformando a variável em um dataframe, para ser inserida no
#gráfico
df_l=pd.DataFrame(df_l)

#Bloco 4 – Escolhendo e inserindo os dados


#Criando a figura que recebe o gráfico
fig = plt.figure()
#Criando o diagrama de pareto propriamente dito
pareto_barra = fig.add_subplot(111)
#Inserindo os dados no gráfico, de cor específica
pareto_barra.bar(df_raw["Finalidade"].values, df["Custos
(kR$)"].tolist(), align='center', color = "#318498")
pareto_linha = pareto_barra.twinx()
#Inserindo a linha
pareto_linha.plot(df_raw["Finalidade"].values, df_l,
color="green", marker="D", ms=7)

#Bloco 5 - Configurando o gráfico


#Ajustando o título do gráfico
pareto_barra.set_title('Pagamentos Realizados em
2018',fontsize=24)
#Eixo "x“
#Ajustando o título do eixo “x”
pareto_barra.set_xlabel("Finalidade",fontsize=12)
#Eixo "y"
#Ajustando o título do eixo “y” das colunas
pareto_barra.set_ylabel("Custos (kR$)",fontsize=12)
#Ajustando os limites do gráfico de coluna
pareto_barra.set_ylim(0,60)
#Ajustando o título do eixo “y” das linhas
pareto_linha.set_ylabel("Frequência Acumulada (%)",fontsize=12)
#Ajustando os limites do gráfico de linhas
pareto_linha.set_ylim(0,103)
#Mostrando o gráfico
plt.show()

Figura 5.12: Diagrama de Pareto


6. REFERÊNCIAS
ABNT:NBR 5462 – Definições da Confiabilidade.
CARLSON, C. S.:Understanding and Applying the Fundamentals of FMEAs. In
Proceedings of 2014 Annual Reliability and Maintainability Symposium, 2014
FOGLIATO, F.; RIBEIRO, J. L. D. Confiabilidade e manutenção industrial.
Elsevier Brasil, 2009.
IEC 60812, (2006) Analysis techniques for system reliability – Procedure for
failure mode and effect analysis (FMEA). Geneva: IEC.
KARDEC, A.; NASCIF, J. Manutenção-função estratégica. Qualitymark Editora
Ltda, 2009.
MCDERMOTT, R. E.; MIKULAK, R. J.; BEAUREGARD, M. R.: The Basics of
FMEA, 2nd Edition, CRC Press, New York, 2009.
MIL STANDARD 1629A, (1980) Procedures for Performing a Failure Mode,
Effect and Criticality Analysis. U.S. Department of Defence.
ROS, P. J.: Taguchi Techniques for quality engineering. 2nd Edition. New York:
McGraw-Hill, 1996.
TAGUCHI, G.; Chowdhury, S.; Wu, Y.: Taguchi’s Quality Engineering
Handbook. New Jersey, John Wiley & Sons, Inc, 2005.
TAGUCHI, G.: Introduction to Quality Engineering: Designing Quality into
Products and Processes. New York: Quality Resources, 1986.
TAGUCHI, G.: Introduction to Quality Engineering. Japan: Asian Productivity
Organization, 1990.
TIETJEN, T.; MUELLER, D. H.; DECKER, A.: FMEA Praxis: Das Komplettpaket
für Training und Anwendung. 3rd Edition. München: Hanser, 2011.
TOUTENBURG, H. ; KNOEFEL, P.; KREUZMAIR, I.; SCHOMAKER, M.;
WILLIAMS-BÖKER, D.: Six Sigma. Methoden und Statistik für die Praxis. 2nd
Edition. Berlin: Heidelberg, 2008.
UNAL, R.; DEAN, E. B.: Taguchi approach to design optimization for quality and
cost: an overview. In: Proceedings of the Annual Conference of the International
Society of Parametric Analysts, 1991.
VIANA, Herbert Ricardo Garcia. PCM – Planejamento e Controle da
Manutenção. Rio de Janeior: Qualitymark, edição de 2014.
VIANA, Herbert Ricardo Garcia. Fatores de sucesso na gestão da manutenção
de ativos. São Paulo: Bookstart, 2016.

Você também pode gostar