{"id":570518,"date":"2025-05-27T22:20:01","date_gmt":"2025-05-27T21:20:01","guid":{"rendered":"https:\/\/blog.jetbrains.com\/?post_type=pycharm&#038;p=570518"},"modified":"2025-09-15T09:40:26","modified_gmt":"2025-09-15T08:40:26","slug":"limpeza-de-dados-em-ciencia-de-dados","status":"publish","type":"pycharm","link":"https:\/\/blog.jetbrains.com\/pt-br\/pycharm\/2025\/05\/limpeza-de-dados-em-ciencia-de-dados\/","title":{"rendered":"Limpeza de dados em ci\u00eancia de dados"},"content":{"rendered":"<p>Nesta s\u00e9rie de postagens de blog sobre ci\u00eancia de dados, j\u00e1 falamos sobre <a href=\"https:\/\/blog.jetbrains.com\/pycharm\/2024\/10\/how-to-get-data\/\">de onde extrair dados<\/a> e como <a href=\"https:\/\/blog.jetbrains.com\/pycharm\/2024\/10\/data-exploration-with-pandas\/\" target=\"_blank\" rel=\"noreferrer noopener\">explorar esses dados usando o pandas<\/a>, mas embora esses dados sejam excelentes para o aprendizado, n\u00e3o s\u00e3o semelhantes \u00e0quilo que chamaremos de &#8220;dados do <em>mundo real<\/em>&#8220;. Dados para aprendizado costumam j\u00e1 ter sido limpos e submetidos a uma curadoria para permitirem que voc\u00ea aprenda rapidamente, sem precisar se aventurar no mundo da limpeza de dados, mas dados do mundo real t\u00eam problemas e s\u00e3o desordenados. Dados do mundo real precisam ser limpos antes de poderem nos dar insights \u00fateis. Este \u00e9 o assunto desta postagem de blog.\u00a0<\/p>\n<p>Problemas com dados podem se originar do comportamento dos pr\u00f3prios dados, da maneira como eles foram reunidos ou at\u00e9 da maneira como eles foram introduzidos. Podem acontecer erros e descuidos em todas as etapas da jornada.\u00a0<\/p>\n<p>Aqui estamos falando especificamente da limpeza de dados e n\u00e3o da transforma\u00e7\u00e3o de dados. A limpeza de dados garante que as conclus\u00f5es \u00e0s quais voc\u00ea chegar a partir dos seus dados possam ser generalizadas para a popula\u00e7\u00e3o que voc\u00ea definir. J\u00e1 a transforma\u00e7\u00e3o de dados envolve tarefas como converter o formato dos dados, normaliz\u00e1-los e agreg\u00e1-los.\u00a0<\/p>\n<h2 class=\"wp-block-heading\">Por que a limpeza de dados \u00e9 importante?<\/h2>\n<p>A primeira coisa que precisamos entender a respeito de conjuntos de dados \u00e9 o que eles representam. A maioria dos conjuntos de dados \u00e9 uma amostra que representa uma popula\u00e7\u00e3o mais ampla. Ao trabalhar com essa amostra, voc\u00ea poder\u00e1 extrapolar (ou <em>generalizar<\/em>) os seus achados para essa popula\u00e7\u00e3o. Por exemplo, usamos um <a href=\"https:\/\/www.kaggle.com\/datasets\/prevek18\/ames-housing-dataset\" target=\"_blank\" rel=\"noopener\">conjunto de dados<\/a> nas duas postagens anteriores deste blog. Em linhas gerais, aquele conjunto de dados \u00e9 a respeito de vendas de casas, mas ele s\u00f3 cobre uma \u00e1rea geogr\u00e1fica pequena, um per\u00edodo limitado de tempo e n\u00e3o todas as casas em potencial naquela \u00e1rea e per\u00edodo. Ele \u00e9 uma amostra de uma popula\u00e7\u00e3o maior.\u00a0<\/p>\n<p>Seus dados precisam ser uma amostra representativa da popula\u00e7\u00e3o mais ampla \u2014 por exemplo, todas as vendas de casas naquela \u00e1rea durante um determinado per\u00edodo. Para garantir que nossos dados sejam uma amostra representativa da popula\u00e7\u00e3o mais ampla, precisamos primeiro definir os limites da nossa popula\u00e7\u00e3o.\u00a0<\/p>\n<p>Como voc\u00ea pode imaginar, geralmente n\u00e3o \u00e9 pr\u00e1tico trabalhar com a popula\u00e7\u00e3o inteira, exceto talvez no caso de dados de censos. Ent\u00e3o, voc\u00ea precisa decidir quais s\u00e3o os seus limites. Esses limites podem ser geogr\u00e1ficos, demogr\u00e1ficos, baseados no tempo ou em a\u00e7\u00f5es (tais como a\u00e7\u00f5es transacionais), ou espec\u00edficos de determinados setores da economia. H\u00e1 in\u00fameras maneiras de definir a sua popula\u00e7\u00e3o, mas para poder generalizar os seus dados de forma confi\u00e1vel, isso \u00e9 algo que voc\u00ea precisa fazer antes de limpar os seus dados.<\/p>\n<p>Em resumo, se voc\u00ea estiver planejando usar os seus dados para qualquer tipo de an\u00e1lise ou <a href=\"https:\/\/blog.jetbrains.com\/pycharm\/2022\/06\/start-studying-machine-learning-with-pycharm\/\">aprendizado de m\u00e1quina<\/a>, precisar\u00e1 de algum tempo para limpar os dados e assim garantir que voc\u00ea possa confiar nos seus insights e generaliz\u00e1-los para o <em>mundo real<\/em>. Limpar os seus dados resulta em an\u00e1lises mais precisas e, no que diz respeito ao aprendizado de m\u00e1quina, tamb\u00e9m em melhorias de desempenho.<\/p>\n<p>Sem limpar os seus dados, voc\u00ea corre o risco de ter problemas, como n\u00e3o conseguir generalizar o seu aprendizado \u00e0 popula\u00e7\u00e3o mais ampla de forma confi\u00e1vel, estat\u00edsticas imprecisas de resumo e visualiza\u00e7\u00f5es incorretas. Se voc\u00ea estiver usando os seus dados para treinar modelos de aprendizado de m\u00e1quina, isso tamb\u00e9m pode levar a erros e a previs\u00f5es imprecisas.<\/p>\n<p align=\"center\">\n    <a class=\"jb-download-button\" href=\"https:\/\/jb.gg\/m8p92h\" target=\"_blank\" rel=\"noopener\"><br \/>\n        Experimente o PyCharm Professional gratuitamente<br \/>\n    <\/a>\n<\/p>\n<h2 class=\"wp-block-heading\">Exemplos de limpeza de dados<\/h2>\n<p>Vamos dar uma olhada em cinco tarefas que voc\u00ea pode usar para limpar os seus dados. Esta n\u00e3o \u00e9 uma lista completa, mas \u00e9 um bom lugar para come\u00e7ar quando voc\u00ea obtiver alguns dados do mundo real.<\/p>\n<h3 class=\"wp-block-heading\">Desduplica\u00e7\u00e3o de dados<\/h3>\n<p>A duplica\u00e7\u00e3o \u00e9 um problema, porque pode distorcer os seus dados. Imagine que voc\u00ea esteja tra\u00e7ando um histograma, no qual voc\u00ea esteja usando a frequ\u00eancia dos pre\u00e7os de venda. Se houver duplica\u00e7\u00f5es de um mesmo valor, voc\u00ea acabar\u00e1 obtendo um histograma com um padr\u00e3o impreciso, baseado em pre\u00e7os duplicados.\u00a0<\/p>\n<p>Incidentalmente, quando dizemos que a duplica\u00e7\u00e3o \u00e9 um problema em conjuntos de dados, estamos falando da duplica\u00e7\u00e3o de linhas inteiras, cada uma delas referente a uma \u00fanica observa\u00e7\u00e3o. Haver\u00e1 valores duplicados nas colunas e isso \u00e9 esperado. Estamos falando apenas de observa\u00e7\u00f5es duplicadas.\u00a0<\/p>\n<p>Felizmente para n\u00f3s, h\u00e1 um <a href=\"https:\/\/pandas.pydata.org\/pandas-docs\/stable\/reference\/api\/pandas.DataFrame.duplicated.html\" target=\"_blank\" rel=\"noopener\">m\u00e9todo do pandas<\/a> que podemos usar para nos ajudar a detectar se h\u00e1 algum dado duplicado. Se precisarmos de um lembrete, podemos usar o chat do <a href=\"https:\/\/www.jetbrains.com\/ai\/\" target=\"_blank\" rel=\"noopener\">JetBrains AI<\/a>, com um prompt como este:<\/p>\n<p><em>Code to identify duplicate rows<\/em><\/p>\n<p>E este \u00e9 o c\u00f3digo resultante:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">duplicate_rows = df[df.duplicated()]\nduplicate_rows<\/pre>\n<p>Este c\u00f3digo presume que a sua dataframe tem o nome de <code>df<\/code><em>. <\/em>Se ela tiver outro nome, certifique-se de mud\u00e1-lo.\u00a0<\/p>\n<p>N\u00e3o h\u00e1 dados duplicados no <a href=\"https:\/\/www.kaggle.com\/datasets\/prevek18\/ames-housing-dataset\" target=\"_blank\" rel=\"noopener\">conjunto de dados da Ames Housing<\/a>, que estivemos usando, mas se voc\u00ea tiver vontade de experimentar o m\u00e9todo do pandas descrito acima, d\u00ea uma olhada no <a href=\"https:\/\/www.kaggle.com\/datasets\/cites\/cites-wildlife-trade-database\" target=\"_blank\" rel=\"noopener\">banco de dados do CITES Wildlife Trade<\/a> e veja se encontra dados duplicados usando esse m\u00e9todo.<\/p>\n<p>Depois de identificar duplica\u00e7\u00f5es no seu conjunto de dados, voc\u00ea precisa remov\u00ea-las, para evitar distorcer os seus resultados. Novamente, voc\u00ea pode obter o c\u00f3digo para isso atrav\u00e9s do JetBrains AI, com um prompt como este:<\/p>\n<p><em>Code to drop duplicates from my dataframe\u00a0<\/em><\/p>\n<p>O c\u00f3digo resultante elimina as duplica\u00e7\u00f5es, reinicializa o \u00edndice da sua dataframe e depois mostra-a como uma nova dataframe chamada df_cleaned:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">df_cleaned = df.drop_duplicates()\ndf_cleaned.reset_index(drop=True, inplace=True)\ndf_cleaned<\/pre>\n<p>H\u00e1 outras fun\u00e7\u00f5es do pandas que voc\u00ea pode usar para um <a href=\"https:\/\/pandas.pydata.org\/pandas-docs\/stable\/reference\/api\/pandas.DataFrame.drop_duplicates.html\" target=\"_blank\" rel=\"noopener\">gerenciamento avan\u00e7ado de dados duplicados<\/a>, mas isto basta para voc\u00ea come\u00e7ar a desduplicar o seu conjunto de dados.<\/p>\n<h3 class=\"wp-block-heading\">Como lidar com valores implaus\u00edveis<\/h3>\n<p>Podem ocorrer valores implaus\u00edveis quando os dados forem informados incorretamente ou algo der errado no processo de reuni-los. No caso do nosso <a href=\"https:\/\/www.kaggle.com\/datasets\/prevek18\/ames-housing-dataset\" target=\"_blank\" rel=\"noopener\">conjunto de dados da Ames Housing<\/a>, um valor implaus\u00edvel poderia ser um pre\u00e7o de venda negativo ou um valor num\u00e9rico em &#8220;estilo do telhado&#8221;.<\/p>\n<p>Identificar valores implaus\u00edveis no seu conjunto de dados depende de uma abordagem ampla, que inclui dar uma olhada nas suas <a href=\"https:\/\/blog.jetbrains.com\/pycharm\/2024\/10\/data-exploration-with-pandas\/#summary-statistics\">estat\u00edsticas de resumo<\/a>, verificar as regras de valida\u00e7\u00e3o de cada coluna, definidas pelo coletor dos dados, e observar quaisquer pontos de dados que caiam fora dessa valida\u00e7\u00e3o, al\u00e9m de usar visualiza\u00e7\u00f5es para identificar padr\u00f5es ou qualquer coisa que pare\u00e7a an\u00f4mala.\u00a0<\/p>\n<p>\u00c9 melhor voc\u00ea cuidar dos valores implaus\u00edveis, pois eles podem acrescentar ru\u00eddo e causar problemas com a sua an\u00e1lise. Por\u00e9m, a forma de lidar com eles \u00e9 um tanto aberta a interpreta\u00e7\u00f5es. Se n\u00e3o houver muitos valores implaus\u00edveis para o tamanho do seu conjunto de dados, talvez voc\u00ea queira remover os registros que os contiverem. Por exemplo, se voc\u00ea tiver identificado um valor implaus\u00edvel na linha 214 do seu conjunto de dados, poder\u00e1 usar a <a href=\"https:\/\/pandas.pydata.org\/pandas-docs\/stable\/reference\/api\/pandas.DataFrame.drop.html\" target=\"_blank\" rel=\"noopener\">fun\u00e7\u00e3o &#8220;drop&#8221; do pandas<\/a> para remover essa linha.\u00a0<\/p>\n<p>Mais uma vez, o JetBrains AI pode gerar o c\u00f3digo necess\u00e1rio, com um prompt como este:\u00a0<\/p>\n<p><em>Code that drops index 214 from <\/em><em>#df_cleaned<\/em><\/p>\n<p>Observe que em <a href=\"https:\/\/www.jetbrains.com\/help\/pycharm\/jupyter-notebook-support.html\" target=\"_blank\" rel=\"noopener\">notebooks do Jupyter no PyCharm<\/a>, \u00e9 poss\u00edvel usar o sinal &#8220;#&#8221; como prefixo para indicar ao JetBrains AI Assistant que est\u00e1 sendo fornecido contexto adicional \u2014 neste caso, que a dataframe tem o nome de <code>df_cleaned<\/code>.<\/p>\n<p>O c\u00f3digo resultante remover\u00e1 aquele dado observado da sua dataframe, reinicializar\u00e1 o \u00edndice e o mostrar\u00e1:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">df_cleaned = df_cleaned.drop(index=214)\ndf_cleaned.reset_index(drop=True, inplace=True)\ndf_cleaned<\/pre>\n<p>Outra estrat\u00e9gia popular para lidar com valores implaus\u00edveis \u00e9 imput\u00e1-los, ou seja, substitu\u00ed-los por um valor diferente e plaus\u00edvel, com base em uma estrat\u00e9gia definida. Uma das estrat\u00e9gias mais comuns \u00e9 usar o valor da mediana no lugar do valor implaus\u00edvel. Como a mediana n\u00e3o \u00e9 afetada por valores at\u00edpicos, ela costuma ser escolhida para isso pelos cientistas de dados, mas da mesma forma, o valor da m\u00e9dia ou da moda dos seus dados pode ser mais apropriada em algumas situa\u00e7\u00f5es.\u00a0<\/p>\n<p>Como alternativa, se voc\u00ea tiver conhecimento espec\u00edfico sobre aquele conjunto de dados e a forma como os dados foram obtidos, poder\u00e1 substituir o valor implaus\u00edvel por outro mais significativo. Se voc\u00ea estiver envolvido no processo de coleta de dados ou souber como ele foi feito, talvez esta op\u00e7\u00e3o seja indicada para voc\u00ea.\u00a0<\/p>\n<p>A escolha de como lidar com valores implaus\u00edveis depender\u00e1 da preval\u00eancia deles no seu conjunto de dados, de como os dados foram coletados e de como voc\u00ea pretende definir a sua popula\u00e7\u00e3o, al\u00e9m de outros fatores, como o seu conhecimento espec\u00edfico.\u00a0<\/p>\n<h3 class=\"wp-block-heading\">Formata\u00e7\u00e3o dos dados<\/h3>\n<p>\u00c9 comum observar problemas de formata\u00e7\u00e3o atrav\u00e9s das suas <a href=\"https:\/\/blog.jetbrains.com\/pycharm\/2024\/10\/data-exploration-with-pandas\/#summary-statistics\">estat\u00edsticas de resumo<\/a> ou de <a href=\"https:\/\/blog.jetbrains.com\/pycharm\/2024\/10\/data-exploration-with-pandas\/#graphs\">visualiza\u00e7\u00f5es<\/a> iniciais que voc\u00ea fa\u00e7a para ter uma ideia da forma dos seus dados. Valores num\u00e9ricos n\u00e3o definidos todos com o mesmo n\u00famero de casas decimais ou varia\u00e7\u00f5es de ortografia, como &#8220;primeiro&#8221; e &#8220;1\u00ba&#8221;, s\u00e3o exemplos de formata\u00e7\u00e3o inconsistente. Dados formatados incorretamente tamb\u00e9m podem ter implica\u00e7\u00f5es para o uso de mem\u00f3ria pelos seus dados.<\/p>\n<p>Ap\u00f3s identificar problemas de formata\u00e7\u00e3o no seu conjunto de dados, \u00e9 preciso padronizar os valores. Dependendo do problema que estiver havendo, normalmente isso envolve definir o seu pr\u00f3prio padr\u00e3o e aplicar as mudan\u00e7as. Mais uma vez, a biblioteca pandas tem algumas fun\u00e7\u00f5es \u00fateis para isso, como <a href=\"https:\/\/pandas.pydata.org\/pandas-docs\/stable\/reference\/api\/pandas.DataFrame.round.html\" target=\"_blank\" rel=\"noopener\">round<\/a>. Se voc\u00ea quiser arredondar a coluna &#8220;SalePrice&#8221; para duas casas decimais, pode pedir o c\u00f3digo ao JetBrains AI:<\/p>\n<p><em>Code to round <\/em><em>#SalePrice<\/em><em> to two decimal places\u00a0<\/em><\/p>\n<p>O c\u00f3digo resultante far\u00e1 o arredondamento e imprimir\u00e1 as primeiras 10 linhas para voc\u00ea verific\u00e1-las:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">df_cleaned['SalePrice'] = df_cleaned['SalePrice].round(2)\ndf_cleaned.head()<\/pre>\n<p>Outro exemplo: talvez haja casos de ortografia inconsistente \u2014 por exemplo, valores &#8220;1Story&#8221; e &#8220;OneStory&#8221; na coluna &#8220;HouseStyle&#8221; e voc\u00ea est\u00e1 certo de que eles significam a mesma coisa. Voc\u00ea pode usar este prompt para obter c\u00f3digo para isso:<\/p>\n<p><em>Code to change all instances of <\/em><em>#OneStory<\/em><em> to <\/em><em>#1Story<\/em><em> in <\/em><em>#HouseStyle<\/em><em>\u00a0<\/em><\/p>\n<p>O c\u00f3digo resultante faz exatamente isso e substitui todas as ocorr\u00eancias de &#8220;OneStory&#8221; por &#8220;1Story&#8221;:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">df_cleaned[HouseStyle'] = df_cleaned['HouseStyle'].replace('OneStory', '1Story')<\/pre>\n<h3 class=\"wp-block-heading\">Tratamento de valores at\u00edpicos<\/h3>\n<p>Valores at\u00edpicos s\u00e3o muito comuns em conjuntos de dados, mas a forma de trat\u00e1-los \u2014 se voc\u00ea for trat\u00e1-los \u2014 depende muito do contexto. Uma das maneiras mais f\u00e1ceis de identificar valores at\u00edpicos \u00e9 atrav\u00e9s de um diagrama de caixas, que usa as bibliotecas <a href=\"https:\/\/seaborn.pydata.org\/generated\/seaborn.boxplot.html\" target=\"_blank\" rel=\"noopener\">seaborn<\/a> e <a href=\"https:\/\/matplotlib.org\/stable\/api\/_as_gen\/matplotlib.pyplot.figure.html\" target=\"_blank\" rel=\"noopener\">matplotlib<\/a>. Se voc\u00ea precisar de uma revis\u00e3o r\u00e1pida, j\u00e1 discuti diagramas de caixas em uma postagem anterior, sobre <a href=\"https:\/\/blog.jetbrains.com\/pycharm\/2024\/10\/data-exploration-with-pandas\/\">como explorar dados com o pandas<\/a>.\u00a0<\/p>\n<p>Para este diagrama de caixas, vamos usar &#8220;SalePrice&#8221; no nosso <a href=\"https:\/\/www.kaggle.com\/datasets\/prevek18\/ames-housing-dataset\" target=\"_blank\" rel=\"noopener\">conjunto de dados de im\u00f3veis residenciais da Ames<\/a>. Novamente, vamos usar o JetBrains AI para gerar o c\u00f3digo, com um prompt como este:<\/p>\n<p><em>Code to create a box plot of <\/em><em>#SalePrice<\/em><em>\u00a0<\/em><\/p>\n<p>E este \u00e9 o c\u00f3digo resultante, que precisaremos executar:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">import seaborn as sns\nimport matplotlib.pyplot as plt\n\n# Create a box plot for SalePrice\nplt.figure(figsize=(10, 6))\nsns.boxplot(x=df_cleaned['SalePrice'])\nplt.title('Box Plot of SalePrice')\nplt.xlabel('SalePrice')\nplt.show()<\/pre>\n<p>O diagrama de caixas nos diz que h\u00e1 uma assimetria positiva, porque a linha vertical da mediana, dentro da caixa azul, est\u00e1 \u00e0 esquerda do centro. Uma assimetria positiva diz que h\u00e1 mais pre\u00e7os de casas na parte mais barata da escala, o que n\u00e3o surpreende. O diagrama de caixas tamb\u00e9m nos diz visualmente que h\u00e1 muitos valores at\u00edpicos no lado direito. \u00c9 um pequeno n\u00famero de casas muito mais caras que a mediana dos pre\u00e7os.<\/p>\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" width=\"1600\" height=\"1054\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2025\/01\/image.png\" alt=\"\" class=\"wp-image-536439\" \/><\/figure>\n<p>Talvez voc\u00ea queira aceitar esses valores at\u00edpicos, pois \u00e9 razo\u00e1vel esperar um pequeno n\u00famero de casas com pre\u00e7os maiores que os da maioria. Por\u00e9m, isso depende da popula\u00e7\u00e3o para a qual voc\u00ea quer poder generalizar os dados e das conclus\u00f5es \u00e0s quais voc\u00ea deseja chegar a partir dos seus dados. Colocando limites claros em torno do que faz ou n\u00e3o faz parte da sua popula\u00e7\u00e3o, voc\u00ea poder\u00e1 decidir de forma informada se os valores at\u00edpicos dos seus dados ser\u00e3o ou n\u00e3o um problema.\u00a0<\/p>\n<p>Por exemplo, se a sua popula\u00e7\u00e3o consistir de pessoas que n\u00e3o ir\u00e3o comprar mans\u00f5es caras, talvez voc\u00ea possa eliminar esses valores at\u00edpicos. Por outro lado, se os seus dados demogr\u00e1ficos inclu\u00edrem pessoas das quais se pode esperar com razo\u00e1vel certeza que comprem casas caras, talvez voc\u00ea queira manter esses valores, pois eles ser\u00e3o relevantes para a sua popula\u00e7\u00e3o.<\/p>\n<p>Falei aqui dos diagramas de caixas como uma maneira de identificar valores at\u00edpicos, mas h\u00e1 outras op\u00e7\u00f5es, como gr\u00e1ficos de dispers\u00e3o e histogramas, que podem rapidamente lhe mostrar se h\u00e1 valores at\u00edpicos nos seus dados, para que voc\u00ea possa tomar uma decis\u00e3o informada sobre se precisa fazer algo a respeito deles.<\/p>\n<p>Geralmente, o tratamento de valores at\u00edpicos cai em duas categorias \u2014 exclu\u00ed-los ou usar estat\u00edsticas de resumo menos propensas a eles. No primeiro caso, precisamos saber exatamente em que linhas est\u00e3o esses valores.\u00a0<\/p>\n<p>At\u00e9 agora, vimos discutindo apenas como identificar valores at\u00edpicos visualmente, mas h\u00e1 maneiras diferentes de determinar quais dados observados s\u00e3o at\u00edpicos ou n\u00e3o. Uma abordagem comum \u00e9 usar um m\u00e9todo chamado <em>escore Z modificado<\/em>. Antes de olharmos como e por que o escore Z \u00e9 modificado, vamos defini-lo como:<\/p>\n<p><em>Escore Z =<\/em> (<em>valor do ponto de dados<\/em> \u2013 <em>m\u00e9dia<\/em>) \/ <em>desvio-padr\u00e3o<\/em><\/p>\n<p>A raz\u00e3o pela qual modificamos o escore Z para detectarmos valores at\u00edpicos \u00e9 que tanto a m\u00e9dia quanto o desvio-padr\u00e3o s\u00e3o propensos a serem influenciados por valores at\u00edpicos, devido \u00e0 forma como s\u00e3o calculados. O escore Z modificado \u00e9 definido como:<\/p>\n<p><em>Escore Z modificado =<\/em> (<em>valor do ponto de dados<\/em> \u2013 <em>mediana<\/em>) \/ <em>mediana dos desvios absolutos<\/em><\/p>\n<p>Como aprendemos ao falarmos das <a href=\"https:\/\/blog.jetbrains.com\/pycharm\/2024\/10\/data-exploration-with-pandas\/#summary-statistics\">estat\u00edsticas de resumo<\/a>, a mediana n\u00e3o \u00e9 afetada por valores at\u00edpicos. A <em>mediana dos desvios absolutos<\/em> \u00e9 o valor <em>mediano<\/em> dos desvios absolutos da <em>mediana<\/em> do conjunto de dados. Por exemplo, se o seu conjunto de dados contiver estes valores:<\/p>\n<p>1, 2, 2, 2,<strong> 3<\/strong>, 3, 3, 5,9<\/p>\n<p>ent\u00e3o a sua <em>mediana<\/em> \u00e9 3, pois este \u00e9 o valor na metade do conjunto de dados. Os desvios do seu valor de 3 na mediana s\u00e3o os seguintes, na ordem apresentada acima:<\/p>\n<p>2, 1, 1, 1, 0, 0, 0, 2, 5<\/p>\n<p>Ao ordenarmos estes valores em ordem crescente, obtemos:<\/p>\n<p>0, 0, 0, 1, <strong>1<\/strong>, 1, 2, 2, 5<\/p>\n<p>Isso significa que neste exemplo, a <em>mediana dos desvios absolutos<\/em> \u00e9 1.<\/p>\n<p>Como calcular o escore Z modificado do nosso conjunto de dados para o pre\u00e7o de venda (SalePrice)? Vamos dar o seguinte prompt no JetBrains AI:<\/p>\n<p><em>Given:<\/em><\/p>\n<p><em>Modified Z-score = (data point value \u2013 median) \/ median absolute deviation<\/em><\/p>\n<p><em>Calculate the Modified Z-score for <\/em><em>#SalePrice<\/em><em>\u00a0<\/em><\/p>\n<p>Isso resulta no seguinte c\u00f3digo:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">import pandas as pd\nfrom scipy.stats import median_abs_deviation\n\n\n# Assuming 'data' is your DataFrame and it contains the 'SalePrice' column\n\n\n# Calculate the median for the SalePrice column\nmedian_sale_price = data['SalePrice'].median()\n\n\n# Calculate the Median Absolute Deviation (MAD) for the SalePrice column\nmad_sale_price = median_abs_deviation(data['SalePrice'], scale='normal')\n\n\n# Calculate the Modified Z-scores for the SalePrice column\ndata['Modified_Z_Score'] = (data['SalePrice'] - median_sale_price) \/ mad_sale_price\n\n\n# Display the first few rows with the Modified Z-scores\nprint(data[['SalePrice', 'Modified_Z_Score']].head())<\/pre>\n<p>Ao instalarmos os pacotes necess\u00e1rios e executarmos este c\u00f3digo, podemos ver que j\u00e1 fizemos parte do trabalho, mas agora precisamos decidir o que seria um valor at\u00edpico de SalePrice, com base no escore Z modificado. Aqui, o consenso geral \u00e9 de que qualquer valor \u2265 3 ou \u2264 \u22123 \u00e9 at\u00edpico, mas vale observar que, como a maioria das decis\u00f5es estat\u00edsticas, esta defini\u00e7\u00e3o pode e deve ser ajustada ao seu conjunto de dados. &lt;=-3 however, it\u2019s worth noting that like most statistical decisions, it can and should be tailored to your dataset.\u00a0<\/p>\n<p>Vamos passar outro prompt para o JetBrains AI, para podermos refinar melhor nossa sa\u00edda:<\/p>\n<p><em>Just list those that have a <\/em><em>#Modified_Z_Score<\/em><em> of 3 or above or -3 or below\u00a0<\/em><\/p>\n<p>Vou substituir este trecho de c\u00f3digo pelas linhas relevantes acima:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># Filter the rows where the Modified Z-score is 3 or above, or -3 or below\noutliers = data[(data['Modified_Z_Score'] &gt;= 3) | (data['Modified_Z_Score'] &lt;= -3)]\n\n\n# Print all the filtered rows, showing their index and SalePrice\noutliers = (outliers[[&#039;SalePrice&#039;, &#039;Modified_Z_Score&#039;]])\noutliers<\/pre>\n<p>Modifiquei este c\u00f3digo para salvar os valores at\u00edpicos em uma nova dataframe chamada &#8220;outliers&#8221; e imprimi-los para eu poder visualiz\u00e1-los.\u00a0<\/p>\n<p>Nossa pr\u00f3xima etapa ser\u00e1 remover esses valores at\u00edpicos da nossa dataframe. Mais uma vez, podemos usar o JetBrains AI para gerar o c\u00f3digo, com um prompt como este:<\/p>\n<p><em>Create a new dataframe without the outliers\u00a0<\/em><\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">data_without_outliers = data.drop(index=outliers.index)\n\n\n# Display the new DataFrame without outliers\nprint(data_without_outliers)<\/pre>\n<p>Nossa nova dataframe, data_without_outliers, exclui os valores nos quais a vari\u00e1vel SalePrice \u00e9 considerada at\u00edp\u00edca.\u00a0<\/p>\n<p>Podemos atualizar o c\u00f3digo do nosso diagrama de caixas para considerar a nova dataframe. O diagrama ainda mostra uma assimetria positiva, como esperado, mas os valores considerados at\u00edpicos foram removidos:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">import seaborn as sns\nimport matplotlib.pyplot as plt\n\n\n# Create a box plot for SalePrice\nplt.figure(figsize=(10, 6))\nsns.boxplot(x=data_without_outliers['SalePrice'])\nplt.title('Box Plot of SalePrice')\nplt.xlabel('SalePrice')\nplt.show()<\/pre>\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" width=\"1572\" height=\"1076\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2025\/01\/image-1.png\" alt=\"\" class=\"wp-image-536450\" \/><\/figure>\n<p>Antes de terminarmos, vamos dar uma olhada em que porcentagem dos dados observados foi removida da nossa dataframe, pois n\u00f3s os consideramos valores at\u00edpicos com base em &#8220;SalePrice&#8221;.<\/p>\n<p>Podemos usar um prompt como este:<\/p>\n<p><em>Calculate the percentage of observations removed between #data and #data_without_outliers<\/em><\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># Calculate the number of observations in the original and filtered DataFrames\noriginal_count = len(data)\nfiltered_count = len(data_without_outliers)\n\n# Calculate the number of removed observations\nremoved_count = original_count - filtered_count\n\n# Calculate the percentage of observations removed\npercentage_removed = (removed_count \/ original_count) * 100\n\n# Display the percentage\nprint(f\"Percentage of observations removed: {percentage_removed:.2f}%\")<\/pre>\n<p>O PyCharm diz que 5,67% dos dados observados foram removidos.<\/p>\n<p>Como j\u00e1 mencionei antes, se voc\u00ea for manter os valores at\u00edpicos, considere usar valores de resumo menos propensos a serem afetados por eles, como a <em>mediana<\/em> e o <em>intervalo entre quartis<\/em>. Talvez voc\u00ea queira usar essas medidas para formar as suas conclus\u00f5es ao trabalhar com conjuntos de dados que voc\u00ea sabe conterem valores at\u00edpicos, n\u00e3o removidos porque eles s\u00e3o relevantes para a popula\u00e7\u00e3o que voc\u00ea definiu e as conclus\u00f5es que voc\u00ea pretende obter.<\/p>\n<h3 class=\"wp-block-heading\">Valores faltando<\/h3>\n<p>A maneira mais f\u00e1cil de identificar valores faltando no seu conjunto de dados \u00e9 atrav\u00e9s das suas estat\u00edsticas de resumo. Como lembrete, na sua dataframe, clique em <em>Show Column Statistics<\/em> no lado direito e depois selecione <em>Compact<\/em>. Os valores que estiverem faltando nas colunas ser\u00e3o mostrados em vermelho, como voc\u00ea pode ver no caso de &#8220;Lot Frontage&#8221; no <a href=\"https:\/\/www.kaggle.com\/datasets\/prevek18\/ames-housing-dataset\" target=\"_blank\" rel=\"noopener\">conjunto de dados de im\u00f3veis residenciais da Ames<\/a>:<\/p>\n<p><img decoding=\"async\" loading=\"lazy\" width=\"624\" height=\"123\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2025\/09\/AD_4nXdeSNdJvl9sk5Z8QXEJCr5rhDMI5GTGmaRdqvkIufNS8QZNQi-1QwDF1LQgTS_e9vm0B-pSKa5o2aZnNZEmPiAzvoaOjvRxmOICDRzuM_0iWumPGH_UWyR07Q8xTrzIUnYvL7-j-3.png\"><\/p>\n<p>H\u00e1 tr\u00eas tipos de faltas de dados a serem consideradas:<\/p>\n<ul>\n<li>Dados faltando de forma completamente aleat\u00f3ria<\/li>\n<li>Dados faltando de forma aleat\u00f3ria<\/li>\n<li>Dados faltando de forma n\u00e3o aleat\u00f3ria<\/li>\n<\/ul>\n<h3 class=\"wp-block-heading\">Dados faltando de forma completamente aleat\u00f3ria<\/h3>\n<p>Dados faltando de forma completamente aleat\u00f3ria significam que isso ocorreu inteiramente por acaso e que o fato de eles estarem faltando n\u00e3o tem rela\u00e7\u00e3o com as outras vari\u00e1veis do conjunto de dados. Isso pode ocorrer quando algu\u00e9m se esquece de responder a uma pergunta da pesquisa, por exemplo.\u00a0<\/p>\n<p>Dados faltando de forma completamente aleat\u00f3ria s\u00e3o raros, mas tamb\u00e9m est\u00e3o entre os mais f\u00e1ceis de se lidar. Se voc\u00ea tiver um n\u00famero relativamente pequeno de dados observados faltando de forma completamente aleat\u00f3ria, a abordagem mais comum \u00e9 excluir essas observa\u00e7\u00f5es, porque isso n\u00e3o afetar\u00e1 a integridade do seu conjunto de dados e, por conseguinte, as conclus\u00f5es que voc\u00ea espera obter.\u00a0<\/p>\n<h3 class=\"wp-block-heading\">Dados faltando de forma aleat\u00f3ria<\/h3>\n<p>Dados faltando de forma aleat\u00f3ria n\u00e3o t\u00eam um padr\u00e3o aparente, mas t\u00eam um padr\u00e3o subjacente que podemos explicar atrav\u00e9s das outras vari\u00e1veis que medimos. Por exemplo, algu\u00e9m n\u00e3o respondeu uma pergunta da pesquisa por causa da forma como os dados foram coletados.<\/p>\n<p>Mais uma vez no nosso <a href=\"https:\/\/www.kaggle.com\/datasets\/prevek18\/ames-housing-dataset\" target=\"_blank\" rel=\"noopener\">conjunto de dados de im\u00f3veis residenciais da Ames<\/a>, considere que talvez a vari\u00e1vel &#8220;Lot Frontage&#8221; esteja faltando mais vezes para casas vendidas por determinadas imobili\u00e1rias. Nesse caso, essa falta pode ser por causa de pr\u00e1ticas inconsistentes de entrada de dados por algumas imobili\u00e1rias. Se isso for verdade, a falta dos dados de &#8220;Lot Frontage&#8221; estar\u00e1 relacionada \u00e0 forma como a imobili\u00e1ria que vendeu a propriedade coletou os dados. Isso \u00e9 uma caracter\u00edstica observada, n\u00e3o da pr\u00f3pria vari\u00e1vel &#8220;Lot Frontage&#8221;.\u00a0<\/p>\n<p>Quando houver dados faltando de forma aleat\u00f3ria, voc\u00ea ir\u00e1 querer entender por que isso aconteceu, o que costuma envolver uma investiga\u00e7\u00e3o de como os dados foram coletados. Depois de entender por que os dados est\u00e3o faltando, voc\u00ea poder\u00e1 decidir o que fazer. Uma das abordagens mais comuns para lidar com dados faltando de forma aleat\u00f3ria \u00e9 imputar os valores. J\u00e1 falamos disso a respeito de valores implaus\u00edveis, mas essa tamb\u00e9m \u00e9 uma estrat\u00e9gia v\u00e1lida para dados faltando. H\u00e1 v\u00e1rias op\u00e7\u00f5es que voc\u00ea pode escolher, com base na popula\u00e7\u00e3o que voc\u00ea definiu e nas conclus\u00f5es que voc\u00ea deseja tirar, incluindo usar vari\u00e1veis correlatas, como, neste exemplo, o tamanho da casa, o ano de constru\u00e7\u00e3o e o pre\u00e7o de venda. Se voc\u00ea compreender o padr\u00e3o por tr\u00e1s dos dados faltando, geralmente poder\u00e1 usar informa\u00e7\u00f5es de contexto para imputar os valores, o que garantir\u00e1 que as rela\u00e7\u00f5es entre os dados do seu conjunto sejam preservadas.\u00a0\u00a0<\/p>\n<h3 class=\"wp-block-heading\">Dados faltando de forma n\u00e3o aleat\u00f3ria<\/h3>\n<p>Por fim, dados faltando de forma n\u00e3o aleat\u00f3ria ocorrem quando a probabilidade de eles faltarem est\u00e1 relacionada a dados n\u00e3o observados. Isso significa que a falta dos dados depende dos dados n\u00e3o observados.\u00a0<\/p>\n<p>Vamos voltar uma \u00faltima vez ao nosso conjunto de dados de im\u00f3veis residenciais da Ames e ao fato de que est\u00e3o faltando dados de &#8220;Lot Frontage&#8221;. Uma hip\u00f3tese para os dados estarem faltando de forma n\u00e3o aleat\u00f3ria \u00e9 os vendedores decidirem deliberadamente n\u00e3o informar &#8220;Lot Frontage&#8221;, por considerarem que a frente do lote \u00e9 <em>pequena<\/em> demais e que isso poderia reduzir o pre\u00e7o de venda da casa. Se a probabilidade de faltarem dados de &#8220;Lot Frontage&#8221; depender do pr\u00f3prio comprimento da frente do lote (que n\u00e3o foi observado), frentes menores ter\u00e3o uma probabilidade menor de serem informadas, o que significa que a falta desse dado estar\u00e1 diretamente relacionada ao valor dele.<\/p>\n<h3 class=\"wp-block-heading\">Visualiza\u00e7\u00e3o da falta de dados<\/h3>\n<p>Sempre que faltarem dados, voc\u00ea precisar\u00e1 determinar se h\u00e1 algum padr\u00e3o. Se houver um padr\u00e3o, ent\u00e3o haver\u00e1 um problema que voc\u00ea provavelmente ter\u00e1 de resolver antes de poder generalizar os seus dados.\u00a0<\/p>\n<p>Uma das maneiras mais f\u00e1ceis de procurar padr\u00f5es \u00e9 atrav\u00e9s de visualiza\u00e7\u00f5es em mapa de calor. Antes de entrarmos no c\u00f3digo, vamos excluir as vari\u00e1veis que n\u00e3o t\u00eam dados faltando. Para obtermos esse c\u00f3digo, podemos usar o seguinte prompt no JetBrains AI:<\/p>\n<p><em>Code to create a new dataframe that contains only columns with missingness\u00a0<\/em><\/p>\n<p>Aqui est\u00e1 nosso c\u00f3digo:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># Identify columns with any missing values\ncolumns_with_missing = data.columns[data.isnull().any()]\n\n# Create a new DataFrame with only columns that have missing values\ndata_with_missingness = data[columns_with_missing]\n\n# Display the new DataFrame\nprint(data_with_missingness)<\/pre>\n<p>Antes de executar este c\u00f3digo, altere a \u00faltima linha, para podermos aproveitar o \u00f3timo layout de dataframes do PyCharm:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">data_with_missingness<\/pre>\n<p>Agora \u00e9 o momento de criarmos um mapa de calor. Mais uma vez, daremos ao JetBrains AI um c\u00f3digo como este:<\/p>\n<p><em>Create a heatmap of <\/em><em>#data_with_missingness<\/em><em> that is transposed<\/em><\/p>\n<p>E este \u00e9 o c\u00f3digo resultante:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">import seaborn as sns\nimport matplotlib.pyplot as plt\n\n\n# Transpose the data_with_missingness DataFrame\ntransposed_data = data_with_missingness.T\n\n\n# Create a heatmap to visualize missingness\nplt.figure(figsize=(12, 8))\nsns.heatmap(transposed_data.isnull(), cbar=False, yticklabels=True)\nplt.title('Missing Data Heatmap (Transposed)')\nplt.xlabel('Instances')\nplt.ylabel('Features')\nplt.tight_layout()\nplt.show()<\/pre>\n<p>Observe que removi &#8220;cmap=&#8217;viridis'&#8221; dos argumentos do mapa de calor, pois eu o acho dif\u00edcil de visualizar.\u00a0<\/p>\n<figure class=\"wp-block-image\"><img decoding=\"async\" loading=\"lazy\" width=\"1600\" height=\"1065\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2025\/01\/image-24.png\" alt=\"\" class=\"wp-image-537110\" \/><\/figure>\n<p>Este mapa de calor sugere que pode haver um padr\u00e3o de falta, porque as mesmas vari\u00e1veis est\u00e3o faltando em diversas linhas. Em um grupo, podemos ver que &#8220;Bsmt Qual&#8221;, &#8220;Bsmt Cond&#8221;, &#8220;Bsmt Exposure&#8221;, &#8220;BsmtFin Type 1&#8221; e &#8220;Bsmt Fin Type 2&#8221; est\u00e3o todas faltando das mesmas observa\u00e7\u00f5es. Em outro grupo, podemos ver que &#8220;Garage Type&#8221;, &#8220;Garage Yr Bit&#8221;, &#8220;Garage Finish&#8221;, &#8220;Garage Qual&#8221; e &#8220;Garage Cond&#8221; est\u00e3o todos faltando nos mesmos dados observados.<\/p>\n<p>Todas essas vari\u00e1veis referem-se a por\u00f5es e garagens, mas h\u00e1 outras vari\u00e1veis tamb\u00e9m referentes a eles que n\u00e3o est\u00e3o faltando. Uma poss\u00edvel explica\u00e7\u00e3o \u00e9 que, ao coletar os dados, perguntas diferentes sobre garagens e por\u00f5es podem ter sido feitas em imobili\u00e1rias diferentes e talvez nem todas elas tenham sido registradas com tantos detalhes quanto no conjunto de dados. Essas situa\u00e7\u00f5es s\u00e3o comuns com dados que voc\u00ea n\u00e3o coletou pessoalmente. Se voc\u00ea precisar saber mais sobre dados faltando no seu conjunto de dados, poder\u00e1 explorar a forma como esses dados foram coletados.<\/p>\n<h2 class=\"wp-block-heading\">Melhores pr\u00e1ticas em limpeza de dados<\/h2>\n<p>Como j\u00e1 mencionei, definir a sua popula\u00e7\u00e3o tem alta prioridade na lista das melhores pr\u00e1ticas em limpeza de dados. Saiba o que voc\u00ea quer alcan\u00e7ar e como voc\u00ea deseja generalizar os seus dados antes de come\u00e7ar a limp\u00e1-los.\u00a0<\/p>\n<p>Voc\u00ea precisa garantir que todos os seus m\u00e9todos sejam reproduz\u00edveis, porque isso se correlaciona a dados limpos. Situa\u00e7\u00f5es n\u00e3o reproduz\u00edveis podem ter um impacto significativo mais adiante. Por isso, recomendo manter os seus notebooks do Jupyter organizados e em sequ\u00eancia, al\u00e9m de aproveitar os recursos do Markdown para documentar a sua tomada de decis\u00f5es em cada etapa, especialmente na limpeza.\u00a0<\/p>\n<p>Ao limpar dados, voc\u00ea deve trabalhar de forma incremental, modificando a dataframe e n\u00e3o o arquivo em CSV ou banco de dados original e garantindo que voc\u00ea fa\u00e7a tudo com c\u00f3digo reproduz\u00edvel e bem documentado.<\/p>\n<h2 class=\"wp-block-heading\">Resumo<\/h2>\n<p>A limpeza de dados \u00e9 um assunto extenso e pode ter muitos desafios. Quanto maior for o conjunto de dados, mais desafiador ser\u00e1 o processo de limpeza. Voc\u00ea precisar\u00e1 ter em mente a sua popula\u00e7\u00e3o para poder generalizar mais amplamente as suas conclus\u00f5es, equilibrando compromissos entre remover e imputar valores faltando, por um lado, e compreender por que esses dados est\u00e3o faltando, por outro.\u00a0<\/p>\n<p>Pense em si mesmo como a voz dos dados. Voc\u00ea conhece a jornada pela qual os dados passaram e sabe como manteve a integridade dos dados em todas as etapas. Voc\u00ea \u00e9 a pessoa mais indicada para documentar essa jornada e compartilh\u00e1-la com outras pessoas.\u00a0<\/p>\n<p align=\"center\">\n    <a class=\"jb-download-button\" href=\"https:\/\/jb.gg\/m8p92h\" target=\"_blank\" rel=\"noopener\"><br \/>\n        Experimente o PyCharm Professional gratuitamente<br \/>\n    <\/a>\n<\/p>\n\n\n<p><em>Artigo original em ingl\u00eas por:<\/em><br><\/p>\n\n\n    <div class=\"about-author \">\n        <div class=\"about-author__box\">\n            <div class=\"row\">\n                <div class=\"about-author__box-img\">\n                    <img decoding=\"async\" src=\"https:\/\/secure.gravatar.com\/avatar\/193dd3accbb2e467f1b46a7f38ea929d?s=200&#038;r=g\" width=\"200\" height=\"200\" alt=\"Helen Scott\" loading=\"lazy\"  class=\"avatar avatar-200 wp-user-avatar wp-user-avatar-200 photo avatar-default\">\n                <\/div>\n                <div class=\"about-author__box-text\">\n                                            <h4>Helen Scott<\/h4>\n                                                        <\/div>\n            <\/div>\n        <\/div>\n    <\/div>\n","protected":false},"author":1086,"featured_media":571230,"comment_status":"closed","ping_status":"closed","template":"","categories":[952],"tags":[],"cross-post-tag":[],"acf":[],"_links":{"self":[{"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/pycharm\/570518"}],"collection":[{"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/pycharm"}],"about":[{"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/types\/pycharm"}],"author":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/users\/1086"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/comments?post=570518"}],"version-history":[{"count":7,"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/pycharm\/570518\/revisions"}],"predecessor-version":[{"id":601568,"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/pycharm\/570518\/revisions\/601568"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/media\/571230"}],"wp:attachment":[{"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/media?parent=570518"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/categories?post=570518"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/tags?post=570518"},{"taxonomy":"cross-post-tag","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/cross-post-tag?post=570518"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}