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.