Logo Passei Direto
Buscar
Material
páginas com resultados encontrados.
páginas com resultados encontrados.
left-side-bubbles-backgroundright-side-bubbles-background

Crie sua conta grátis para liberar esse material. 🤩

Já tem uma conta?

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

left-side-bubbles-backgroundright-side-bubbles-background

Crie sua conta grátis para liberar esse material. 🤩

Já tem uma conta?

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

left-side-bubbles-backgroundright-side-bubbles-background

Crie sua conta grátis para liberar esse material. 🤩

Já tem uma conta?

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

left-side-bubbles-backgroundright-side-bubbles-background

Crie sua conta grátis para liberar esse material. 🤩

Já tem uma conta?

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

left-side-bubbles-backgroundright-side-bubbles-background

Crie sua conta grátis para liberar esse material. 🤩

Já tem uma conta?

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

left-side-bubbles-backgroundright-side-bubbles-background

Crie sua conta grátis para liberar esse material. 🤩

Já tem uma conta?

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

left-side-bubbles-backgroundright-side-bubbles-background

Crie sua conta grátis para liberar esse material. 🤩

Já tem uma conta?

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

left-side-bubbles-backgroundright-side-bubbles-background

Crie sua conta grátis para liberar esse material. 🤩

Já tem uma conta?

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

left-side-bubbles-backgroundright-side-bubbles-background

Crie sua conta grátis para liberar esse material. 🤩

Já tem uma conta?

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

left-side-bubbles-backgroundright-side-bubbles-background

Crie sua conta grátis para liberar esse material. 🤩

Já tem uma conta?

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

Prévia do material em texto

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 
Expenditures) 
São despesas em investimento, projetos, protótipos, 
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 
(Pareto) 
Gráfico que apresenta dados comparativos em 
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 
Corretiva 
É toda intervenção que tenha como objetivo a 
recuperação dos itens ou equipamentos após a 
ocorrência de falhas. 
Manutenção 
Preventiva 
É toda intervenção que tenha como objetivo a redução 
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 
(Operational 
Expenditures) 
São despesas com a operação, manutenção planejada 
e não planejada e reformas. 
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 
manutenção 
É uma sequência lógica de atividades de 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ênciase 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 
 
𝑓(𝑡) = 
𝑑𝐹(𝑡)
𝑑𝑡
= lim
∆𝑡 →0
𝐹(𝑡+∆𝑡)−𝐹(𝑡)
∆𝑡
= lim
∆𝑡 →0
Pr(𝑡<𝑇<𝑡+∆𝑡)
∆𝑡
 (2.2) 
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 
falha 
Critério: Ocorrência da Causa Escala 
Muito alta 
> 100 por mil itens (> 1 em 10) 10 
50 por mil itens (1 em 20) 9 
Alta 
20 por mil itens (1 em 50) 8 
10 por mil itens (1 em 100) 7 
Moderada 
5 por mil itens (1 em 200) 6 
2 por mil itens (1 em 500) 5 
1 por mil itens (1 em 1.000) 4 
Baixa 
0.5 por mil itens (1 em 2.000) 3 
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) 
Categoria (Processo) 
Critério: 
Severidade do efeito no processo 
Escala 
Falha ao atingir requisitos 
de segurança ou 
regulatórios 
Efeito potencial relacionado à segurança do 
operador da máquina ou da montagem, sem 
aviso. 
10 
Efeito potencial relacionado à segurança do 
operador da máquina ou da montagem, com 
aviso. 
9 
Perda ou degradação da 
função primária / Quebra 
de linha 
> 50 % do produto deve ser jogado fora. 
Linha deve ser parada. 
8 
< 50 % do produto deve ser jogado fora. 
Diminuição da velocidade da linha. 
7 
Perda ou degradação da 
função secundária / 
Retrabalho for a da 
estação 
> 50 % da produção deve ser retrabalhada 
fora da linha 
6 
< 50 % da produção deve ser retrabalhada 
fora da linha 
5 
Distúrbio / 
Retrabalho na estação 
> 50 % da produção deve ser retrabalhada na 
estação 
4 
< 50 % da produção deve ser retrabalhada na 
estação 
3 
Inconveniência na visão da operação ou do 
operador 
2 
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 
detecção 
Probabilidade 
da falha 
Critério: Ocorrência da falha Escala 
Sem 
oportunidade de 
detecção 
Quase 
impossível 
Sem controle de processo corrente; 
Não pode ser detectado ou não é 
analisado. 
10 
Quase impossível 
de se detectar em 
qualquer estágio 
Muito remota 
Modo ou causa da falha não é 
facilmente detectado(a). 
9 
Detecção do 
problema no pós-
processamento 
Remota 
Detecção do modo de falha pelo 
operador no pós-processamento por 
meios visuais, táteis ou audíveis. 
8 
Detecção do 
problema na fonte 
Muito baixa 
Detecção do modo de falha pelo 
operador na estação por meios 
visuais, táteis ou audíveis. 
7 
Detecção do 
problema no pós-
processamento 
Baixa 
Detecção do modo de falha pelo 
operador na estação – utilização de 
dispositivo de leitura de parâmetros. 
6 
Detecção do 
problema na fonte 
Moderada 
Detecção do modo de falha pelo 
operador na estação – utilização de 
dispositivo de leitura de parâmetros 
ou controles automáticos. 
5 
Detecção do 
problema no pós-
processamento 
Moderadamente 
alta 
Detecção do modo de falha no pós-
processamento através de controles 
automáticos; bloqueio da peça para 
evitar futuro processamento. 
4 
Detecção do 
problema na fonte 
Alta 
Detecção do modo de falha na 
estação através controles 
automáticos; bloqueia 
3 
 
 
automaticamente a peça na estação. 
Prevenção do 
problemas 
Muito alta 
Detecção do modo de falha na 
estação através controles 
automáticos; previne peças 
discrepantes de serem produzidas. 
2 
Detecção não 
aplicável; 
prevenção de 
erros 
Quase certa 
Prevenção do modo/causa da falha 
como o resultado do projeto de 
fixação, projeto da máquina ou 
projeto da peça. 
1 
 
Os valores de cada fator diferem de acordocom 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 temconsequê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 
https://www.anaconda.com/products/individual
 
 
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 novoselementos 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, quandose é 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 quaisbibliotecas 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 
Finalidade;Custos (kR$) 
Energia;40 
Equipamentos;34 
Contratação;55 
Treinamento;43 
dados_linha.csv 
Frequencia;Energia;Equipamento; 
Contratacao;Treinamento 
Trimestre 1;8;6;20;18 
Trimestre 2;9;8;18;10 
Trimestre 3;11;9;10;10 
Trimestre 4;12;11;7;5 
 
 
Dados_disp.csv 
Custos (kR$);Temperatura (°C) 
10;22 
12.5;13 
13;12 
7;21 
11;14 
7;13 
8;15 
9;17 
11;17 
12;17 
10.5;17 
13;16 
7.5;12 
8.5;13 
9.5;15 
11.5;15 
 
Dados_1.csv 
Pessoas;Temperatura 
1;22,4393438 
3;16,30419725 
3;24,61834553 
3;20,53833014 
5;21,83088392 
6;10,84802358 
6;19,62528902 
11;16,98368126 
11;10,21182846 
11;12,20501642 
11;14,42880798 
12;27,15392133 
12;12,84723751 
12;23,4158638 
12;15,49816945 
12;27,00025855 
15;23,92918848 
15;21,28139047 
15;23,57819599 
16;13,28153362 
16;28,30246315 
16;14,65807578 
16;16,86132887 
17;15,31291135 
17;11,91717975 
 
 
6;28,43277788 
7;13,63712904 
8;16,75539146 
8;20,28605028 
9;14,37843674 
9;12,9301081 
9;13,70780713 
9;13,09103691 
9;13,49361779 
10;24,07205194 
10;15,56433795 
10;26,63432824 
10;27,59226416 
10;19,16332201 
10;26,68214848 
11;9,295979536 
11;13,42872036 
12;14,24945577 
13;18,46467511 
13;13,27844025 
13;7,38666146 
13;27,30030391 
13;10,77290283 
14;19,21496104 
14;17,67688098 
14;22,33072026 
14;23,6274631 
14;20,30240407 
14;12,3004326 
15;26,32198153 
15;9,703313583 
15;12,39295188 
15;13,76712661 
15;25,78249398 
17;11,92110802 
17;14,04227263 
17;16,73313068 
17;9,195946996 
18;7,949972632 
18;10,56994565 
18;10,21101999 
18;19,88741536 
19;13,72383854 
19;11,40270802 
19;8,118841748 
20;14,84622571 
21;8,872678777 
22;15,06503016 
22;9,012658456 
24;25,90761441 
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.

Mais conteúdos dessa disciplina