{ "nbformat": 4, "nbformat_minor": 0, "metadata": { "colab": { "provenance": [], "toc_visible": true }, "kernelspec": { "name": "python3", "display_name": "Python 3" }, "language_info": { "name": "python" }, "gpuClass": "standard" }, "cells": [ { "cell_type": "markdown", "source": [ "# **Cabeçalho**\n", "\n", "Aluno 1 - NUSP - Graduação/Pós - Período\n", "\n", "Aluno 2 - NUSP - Graduação/Pós - Período" ], "metadata": { "id": "94b7gcfPWOpL" } }, { "cell_type": "markdown", "source": [ "# Aula 7 - 02/10 - O Problema de Classificação do Training DataSet" ], "metadata": { "id": "_ns7mAL7Sqmm" } }, { "cell_type": "markdown", "source": [ "## Codificando um Training DataSet" ], "metadata": { "id": "BZypLPpI0iTN" } }, { "cell_type": "markdown", "source": [ "

A prática da codificação humana, há muito tempo, desempenha um papel fundamental na organização e quantificação de textos. Após um pesquisador definir as categorias relevantes para sua pesquisa, a codificação humana envolve o processo manual de atribuir os documentos selecionados a uma dessas categorias. Embora a codificação humana anteceda as abordagens modernas de análise estatística de texto, ela continua a ser inestimável, especialmente quando se lida com conjuntos de dados menores e a codificação de conceitos complexos. Dominar a elaboração de um codebook eficiente e o treinamento dos codificadores desempenha um papel crucial no contexto dos métodos automatizados, uma vez que a codificação manual frequentemente serve como a base dos conjuntos de treinamento e validação para os classificadores estatísticos.\n", "\n", "

Embora a tarefa de atribuir manualmente documentos a categorias possa parecer simples à primeira vista, a codificação humana é, na verdade, bastante complexa. Ambiguidades na linguagem, a atenção limitada dos codificadores e conceitos sutis tornam a classificação confiável de documentos difícil, mesmo para especialistas (Grimmer e Stewart, 2013). As complicações surgem devido à natureza altamente contextual da linguagem, o que dificulta a criação de um codebook completo antecipadamente. Por essa razão, é recomendável uma fase exploratória e de descoberta, na qual um codebook preliminar e conciso seja elaborado para orientar os codificadores. Eles aplicam esse codebook a um conjunto inicial de documentos, identificando ambiguidades e categorias omitidas. Isso leva a revisões no codebook. Somente após os codificadores aplicarem o esquema de codificação aos documentos sem notar ambiguidades substanciais é que um esquema \"final\" estará pronto para ser usado em um conjunto separado de documentos para análise, garantindo assim a adequação do codebook sem risco de ajuste excessivo ao conjunto de documentos usado para seu desenvolvimento." ], "metadata": { "id": "G_3tX_YM0xt0" } }, { "cell_type": "markdown", "source": [ "### Características de um Bom Training DataSet" ], "metadata": { "id": "juMQNR6k_w5-" } }, { "cell_type": "markdown", "source": [ "

O objetivo da codificação humana é fornecer um mapeamento humano confiável desde os textos de interesse até as categorias nas quais o pesquisador está interessado. A criação desse mapeamento pode ser complicada, e, portanto, é essencial garantir que o conjunto de treinamento atenda alguns requisitos básicos.\n", "\n", "

Neuendorf (2016, Capítulo 1) identifica as seguintes características como vitais para um bom conjunto de dados ou conjunto de treinamento codificado por humanos:\n", "\n", "*

Objetividade-Intersubjetividade: A mensuração das categorias é objetiva, na medida em que a compreensão das categorias não é específica de uma determinada pessoa. Mesmo que não possa ser objetivo, Neuendorf (2016) defende que pelo menos deveria ter intersubjetividade, ou um entendimento compartilhado entre os pesquisadores.\n", "\n", "*

Um Design Prévio: Definir e redefinir categorias é uma parte importante do processo de pesquisa. No processo de codificação humana, as categorias podem precisar ser ainda mais refinadas. No entanto, é essencial que o conjunto de treinamento final seja construído com base em um codebook definitivo e aplicado a novos dados.\n", "\n", "*

Confiabilidade: A atribuição de textos para as categorias definidas deve ser confiável, na medida em que diferentes codificadores humanos devem produzir o mesmo mapeamento quando trabalham de forma independente.\n", "\n", "*

Validade: A medida deve refletir com precisão o conceito ou categoria de interesse. O rótulo de categoria atribuído à medida deve corresponder ao que estamos realmente avaliando.\n", "\n", "*

Generalização: Para criar um conjunto de treinamento, normalmente codificaremos apenas uma amostra de um conjunto muito maior de dados. O mapeamento que produzimos com codificação manual deve ser generalizável para todo o conjunto de dados e para a população final na qual o pesquisador está interessado.\n", "\n", "*

Replicabilidade: A medida deve poder ser replicada nos mesmos dados e, idealmente, em dados e contextos diferentes também." ], "metadata": { "id": "rh_FYLAUANrK" } }, { "cell_type": "markdown", "source": [ "### Etapas para Criar um Conjunto de Dados Codificado por Humanos" ], "metadata": { "id": "WRxy5VhVF-rf" } }, { "cell_type": "markdown", "source": [ "

Com esses objetivos em mente, consideramos inicialmente o cenário em que o pesquisador cria um conjunto de treinamento por meio da codificação manual. Dependendo das categorias que o pesquisador pretende mensurar e do tamanho da amostra destinada à codificação manual, esse processo pode variar de simples a um trabalho que se estende por semanas, meses ou até anos (Baumgartner, Jones e MacLeod, 1998). Independentemente da complexidade, existem algumas etapas e decisões fundamentais necessárias para criar um conjunto de dados codificados por humanos:" ], "metadata": { "id": "AKjmbKIaGmzj" } }, { "cell_type": "markdown", "source": [ "#### Construa um Codebook" ], "metadata": { "id": "UJi_dzW0G6XI" } }, { "cell_type": "markdown", "source": [ "

O livro de códigos ou codebook é o manual de instruções construído para orientar os codificadores na atribuição de documentos a categorias. Quando as categorias são criadas pelos pesquisadores, eles precisam elaborar seu próprio livro de códigos. Este livro não apenas define as categorias de interesse, mas também deve comunicá-las de maneira eficaz, assegurando assim a confiabilidade, validade e replicabilidade do processo. Isso pode significar fornecer textos de exemplo para cada categoria e descrever casos extremos. Em alguns casos, fluxogramas podem ser usados para auxiliar os codificadores na compreensão da hierarquia das categorias ou no tratamento de situações em que há uma grande quantidade de categorias (Krippendorff, 2012, p. 135)." ], "metadata": { "id": "jQQqwKezHL_o" } }, { "cell_type": "markdown", "source": [ "#### Selecione os Codificadores" ], "metadata": { "id": "qfw-3MSWJt6I" } }, { "cell_type": "markdown", "source": [ "

Para garantir a intersubjetividade, a confiabilidade e a replicabilidade, um dos princípios da codificação humana é que outros codificadores, além do pesquisador, rotulem os dados (Krippendorff, 2012, p. 131). Usar um conjunto separado de codificadores é um teste para saber se o pesquisador pode comunicar efetivamente as categorias a outras pessoas.\n", "\n", "

A próxima questão é quantos codificadores usar para rotular os dados. A melhor prática é que o pesquisador selecione pelo menos dois para criar os dados de treinamento. Isto permite ao pesquisador avaliar o nível de concordância entre os codificadores como uma medida de confiabilidade, que discutiremos com mais detalhes abaixo. O número total de codificadores que o pesquisador deve selecionar dependerá da precisão dos codificadores na rotulagem dos dados. Com codificadores treinados e com muita experiência na área de pesquisa, os pesquisadores poderão usar apenas dois codificadores no total. Com uma mão-de-obra menos treinada ou menos atenta, onde os codificadores podem ser mais imprecisos, podem ser necessárias muitas avaliações de cada ponto de dados para rotular os dados de forma confiável. Barberá et al. (2021) fornecem uma excelente visão geral e caracterização dessas compensações na seleção do número de codificadores." ], "metadata": { "id": "tFqr_TqsLnJ2" } }, { "cell_type": "markdown", "source": [ "#### Selecione os Documentos para Codificar" ], "metadata": { "id": "E73eG5eAM8tO" } }, { "cell_type": "markdown", "source": [ "

A seguir, o pesquisador deve selecionar quais e quantos documentos codificar. Para generalização e melhor desempenho do classificador, o conjunto de treinamento deve ser representativo do conjunto maior de dados que o pesquisador pretende codificar e também da população sobre a qual o pesquisador pretende fazer inferências. Uma maneira simples de garantir isso é extrair uma amostra aleatória simples do conjunto maior para o conjunto de treinamento.\n", "\n", "

A quantidade de documentos que devem ser utilizados no conjunto de treinamento dependerá do número de categorias e da confiabilidade dos codificadores. Quanto maior o número de categorias e menor a confiabilidade dos codificadores, maior será o número de documentos que o pesquisador precisará para criar um classificador confiável posteriormente (Barberá et al., 2021). A validação posterior do classificador pode ajudar a revelar se um número suficiente de documentos foi codificado para atingir a precisão desejada." ], "metadata": { "id": "OBTYR0HoNEnw" } }, { "cell_type": "markdown", "source": [ "#### Supervisione os Codificadores" ], "metadata": { "id": "CYEUW9xWOUcO" } }, { "cell_type": "markdown", "source": [ "

Para obter melhor desempenho, os pesquisadores devem treinar os codificadores antes de solicitar que rotulem o conjunto de treinamento. Isso envolve fazer com que os codificadores leiam cuidadosamente o codebook e façam perguntas. Muitas vezes também envolve pedir aos codificadores que rotulem uma amostra de textos e avaliar se compreenderam as instruções ou se as instruções precisam ser revisadas.\n", "\n", "

Uma vez treinados os codificadores e finalizado o codebook, os codificadores devem rotular os dados sem qualquer contato entre si ou com recursos externos ao próprio codebook (Krippendorff, 2012, p. 131). Isso garante que os dados de treinamento produzidos possam ser avaliados quanto à confiabilidade. Os dados finais de treinamento devem ser produzidos após a última revisão do codebook." ], "metadata": { "id": "oQ-tICzFOgto" } }, { "cell_type": "markdown", "source": [ "#### Verifique a Confiabilidade" ], "metadata": { "id": "74qJcHXLPAqL" } }, { "cell_type": "markdown", "source": [ "

A última etapa na criação de um conjunto de treinamento codificado por humanos é verificar a confiabilidade do intercodificador. Isso envolve comparar os rótulos nos mesmos documentos entre codificadores. Várias medidas diferentes podem ser usadas para comparar rótulos; duas métricas amplamente utilizadas são o Cohen's kappa (Landis e Koch, 1977) e o Krippendorff 's alpha (Krippendorff, 2012)." ], "metadata": { "id": "PQRXwmNlPIfw" } }, { "cell_type": "markdown", "source": [ "#### Controle os Possíveis Desvios de Conduta Humana" ], "metadata": { "id": "HW7Tf45oPpTs" } }, { "cell_type": "markdown", "source": [ "

Os pesquisadores devem estar cientes de dois tipos de “desvios” que podem ocorrer durante a codificação humana. Primeiro, os próprios codificadores podem mudar a forma como atribuem rótulos às categorias à medida que o processo de codificação avança. Isto pode ser devido a qualquer coisa, desde o cansaço com a codificação até novos insights obtidos durante o processo de codificação (Neuendorf, 2016, Capítulo 6). Para este tipo de desvio, pode ser útil para o pesquisador avaliar a confiabilidade em vários pontos do processo de codificação.\n", "\n", "

A codificação humana também pode ser afetada pela deriva de dados – onde um fluxo de conteúdo evolui ao longo do tempo, o que pode criar novas ambiguidades para o livro de códigos. Por exemplo, novas categorias podem evoluir, entrar em colapso ou fundir-se com outras à medida que os dados mudam ao longo do tempo. Se o livro de códigos for alterado com base no desvio, pode ser que os dados mais recentes sejam rotulados de forma diferente dos dados antigos. Nesta situação, uma rodada final de codificação pode ajudar a avaliar a confiabilidade final do novo livro de códigos (Krippendorff, 2012, 218)." ], "metadata": { "id": "PXmN3FsWQufr" } }, { "cell_type": "markdown", "source": [ "## Desafio - Mensurando a Confiabilidade da Codificação\n" ], "metadata": { "id": "NLM-PaQ47B9t" } }, { "cell_type": "markdown", "source": [ "

Nas últimas seis semanas, você se dedicou à codificação semanal de um conjunto de 40 tweets selecionados aleatoriamente. Esses tweets foram extraídos de um banco de dados que abrange todos os tweets publicados em 2020 e 2021 pelos candidatos a prefeito nas capitais brasileiras durante as eleições municipais de 2020.\n", "\n", "

Cada tweet foi avaliado por dois codificadores independentes, visando garantir a confiabilidade e a consistência da codificação. A intenção é que os conteúdos avaliados pela turma sejam empregados como um Training DataSet nas etapas subsequentes do curso.\n", "\n", "

Para atingir esse objetivo, entretanto, é fundamental garantir e comprovar a validade dos resultados obtidos até o momento. Conforme discutido nas seções anteriores, o conjunto de dados deve atender a uma série de requisitos para ser considerado válido e eficaz nos modelos de aprendizado de máquina. Caso contrário, estaríamos aplicando técnicas poderosas em dados que não têm utilidade alguma." ], "metadata": { "id": "pleOagKlvykY" } }, { "cell_type": "markdown", "source": [ "### A Tarefa" ], "metadata": { "id": "GaQ2Ifgavyki" } }, { "cell_type": "markdown", "source": [ "

Com base nas discussões realizadas em sala de aula e nas atividades de laboratório anteriores, o exercício dessa semana tem como objetivo introduzí-los aos desafios que os pesquisadores usualmente enfrentam ao construir um Training DataSet. Abordaremos os potenciais vieses e erros nos dados, além de explorar soluções alternativas que poderiam ser empregadas para melhorá-los.\n", "\n", "

Para realizar os exercícios propostos, tomaremos como base o conjunto de tweets dos candidatos à prefeitura nas capitais brasileiras em 2020, previamente categorizados pelos alunos da disciplina nas últimas seis semanas." ], "metadata": { "id": "f2jlnhVnpm8c" } }, { "cell_type": "code", "source": [ "## Prepara o Google Colab para carregar os dados de referência\n", "\n", "from google.colab import drive\n", "\n", "drive.mount('/content/drive')" ], "metadata": { "id": "m95LfBqnvp08", "colab": { "base_uri": "https://localhost:8080/" }, "outputId": "d99d94db-496b-4d41-8b8a-92cbb2db03a8" }, "execution_count": null, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "Mounted at /content/drive\n" ] } ] }, { "cell_type": "code", "source": [ "## Importa a biblioteca\n", "\n", "import pandas as pd\n", "\n", "## Carrega a base de dados com os tweets avaliados pelos alunos\n", "\n", "avaliacao_tweets_consolidado = pd.read_csv(\"/content/drive/MyDrive/FLS6513 FLP0442 - PLN na Ciência Política (Main)/Semana 7 (02-10)/Laboratório/Base_parcial_exercicio.csv\",\n", " encoding = 'utf-8')\n", "\n", "\n", "avaliacao_tweets_consolidado.head()" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 206 }, "id": "Kwguai4A4moo", "outputId": "9c75ab02-44c6-4082-f24d-adb2863f4457" }, "execution_count": null, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ " tweet_id sobre_vac posicao_vac cod semana \\\n", "0 1361290061510283008 Sim Favorável A129 semana2 \n", "1 1361290061510283008 Sim Favorável A107 semana2 \n", "2 1242614077085619968 Não Não aplicável A129 semana2 \n", "3 1242614077085619968 Não Não aplicável A440 semana2 \n", "4 1421419140842201088 Não Não aplicável A129 semana2 \n", "\n", " content \n", "0 #VacinaSim\\n#EleNão \\n\\nFora Bolsonaroooo!\\n\\n... \n", "1 #VacinaSim\\n#EleNão \\n\\nFora Bolsonaroooo!\\n\\n... \n", "2 Nesta quarta, 10 horas, começa o agendamento n... \n", "3 Nesta quarta, 10 horas, começa o agendamento n... \n", "4 Sigilo sobre o cartão corporativo de Bolsonaro... " ], "text/html": [ "\n", "

\n", "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
tweet_idsobre_vacposicao_vaccodsemanacontent
01361290061510283008SimFavorávelA129semana2#VacinaSim\\n#EleNão \\n\\nFora Bolsonaroooo!\\n\\n...
11361290061510283008SimFavorávelA107semana2#VacinaSim\\n#EleNão \\n\\nFora Bolsonaroooo!\\n\\n...
21242614077085619968NãoNão aplicávelA129semana2Nesta quarta, 10 horas, começa o agendamento n...
31242614077085619968NãoNão aplicávelA440semana2Nesta quarta, 10 horas, começa o agendamento n...
41421419140842201088NãoNão aplicávelA129semana2Sigilo sobre o cartão corporativo de Bolsonaro...
\n", "
\n", "
\n", "\n", "
\n", " \n", "\n", " \n", "\n", " \n", "
\n", "\n", "\n", "
\n", " \n", "\n", "\n", "\n", " \n", "
\n", "
\n", "
\n" ] }, "metadata": {}, "execution_count": 2 } ] }, { "cell_type": "markdown", "source": [ "Dicionário de variáveis\n", "\n", "- **tweet_id:** identificador único do tweet.\n", "- **sobre_vac:** o conteúdo do tweet é sobre vacinas e vacinação de Covid-19?\n", "- **posicao_vac:** avaliação do posicionamento do candidato em relação às vacinas e vacinação de Covid-19.\n", "- **cod:** código único do avaliador.\n", "- **semana:** semana em que o tweet foi avaliado.\n", "- **content:** conteúdo do tweet avaliado.\n" ], "metadata": { "id": "fMFmoiKk4rGs" } }, { "cell_type": "markdown", "source": [ "

1. Vamos começar com algumas estatísticas descritivas básicas:\n", "\n", "

a) Verifique quantos tweets únicos foram classificados pelos alunos no total e para cada semana. Em seguida, descreva os resultados encontrados. Você encontrou uma diferença muita extensa no número de tweets avaliados em cada semana? Se sim, de que forma isso poderia impactar na validade da codificação? Explique." ], "metadata": { "id": "qaDtnEaT6fQF" } }, { "cell_type": "code", "source": [ "## Calculando o número total de tweets únicos classificados\n", "\n", "total_tweets_unicos = avaliacao_tweets_consolidado['tweet_id'].nunique()\n", "\n", "## Agrupando os dados por semana e calculando o número de tweets únicos em cada semana\n", "\n", "tweets_por_semana = avaliacao_tweets_consolidado.groupby('semana')['tweet_id'].nunique().reset_index()\n", "\n", "## Exibindo o resultado\n", "\n", "print(\"\\nNúmero total de tweets únicos classificados: \", total_tweets_unicos)\n", "\n", "print(\"\\nNúmero de tweets únicos classificados por semana:\",\n", " end = '\\n\\n')\n", "\n", "print(tweets_por_semana)" ], "metadata": { "id": "XY4sJwp-6-tC", "colab": { "base_uri": "https://localhost:8080/" }, "outputId": "b3ea6c0b-9e57-484d-eafe-7d5d0fa933df" }, "execution_count": null, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "\n", "Número total de tweets únicos classificados: 2608\n", "\n", "Número de tweets únicos classificados por semana:\n", "\n", " semana tweet_id\n", "0 semana2 639\n", "1 semana3 633\n", "2 semana4 593\n", "3 semana5 553\n", "4 semana6 190\n" ] } ] }, { "cell_type": "markdown", "source": [ "**RESPOSTA:**\n", "\n", "Sim, há uma diferença extensa no número de tweets avaliados em cada semana. Isso poderia impactar na validade da codificação da seguinte forma: uma diferença extensa no número de tweets avaliados em cada semana pode introduzir vieses e incoerências nos resultados da codificação. Alguns avaliadores podem ter avaliado uma quantidade muito maior ou menor de tweets em comparação com outros, o que pode levar a resultados não representativos e menos confiáveis." ], "metadata": { "id": "itdsVYR3vRmR" } }, { "cell_type": "markdown", "source": [ "

b) Gere um sumário com as quantidades mínimas, médias e máximas de tweets avaliados por codificador e por semana. Qual o desvio-padrão em cada semana? E para todas as semanas? Interprete os resultados encontrados." ], "metadata": { "id": "bOc7vxFm7Tmb" } }, { "cell_type": "code", "source": [ "\n", "## Agrupando os dados por codificador e semana\n", "\n", "resumo = avaliacao_tweets_consolidado.groupby(['cod', 'semana'])['tweet_id'].nunique().reset_index()\n", "\n", "## Calculando as estatísticas\n", "\n", "estatisticas_por_semana = resumo.groupby('semana')['tweet_id'].agg(['min', 'mean', 'max', 'std']).reset_index().round(2)\n", "\n", "estatisticas_gerais = resumo['tweet_id'].agg(['min', 'mean', 'max', 'std']).reset_index().round(2)\n", "\n", "## Exibindo o resumo\n", "\n", "print(\"\\nQuantidades mínimas, médias e máximas de tweets avaliados por codificador e por semana:\\n\")\n", "\n", "print(estatisticas_por_semana)\n", "\n", "print(\"\\nQuantidades mínimas, médias e máximas de tweets avaliados por codificador para todas as semanas:\\n\")\n", "\n", "print(estatisticas_gerais)\n" ], "metadata": { "id": "LYEjs9yj8zOQ", "colab": { "base_uri": "https://localhost:8080/" }, "outputId": "f80d3c12-1e92-4f4d-d98b-e8cba5adca3f" }, "execution_count": null, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "\n", "Quantidades mínimas, médias e máximas de tweets avaliados por codificador e por semana:\n", "\n", " semana min mean max std\n", "0 semana2 7 38.83 40 6.02\n", "1 semana3 28 39.40 40 2.21\n", "2 semana4 30 39.38 40 2.06\n", "3 semana5 9 38.29 40 6.72\n", "4 semana6 39 39.60 40 0.55\n", "\n", "Quantidades mínimas, médias e máximas de tweets avaliados por codificador para todas as semanas:\n", "\n", " index tweet_id\n", "0 min 7.00\n", "1 mean 39.04\n", "2 max 40.00\n", "3 std 4.51\n" ] } ] }, { "cell_type": "markdown", "source": [ "

c) Verifique se existem tweets únicos classificados por apenas um codificador. Se sim, quantos são? Eles equivalem percentualmente a quanto da amostra total de tweets? Quais as possíveis implicações disso para a validade da codificação?" ], "metadata": { "id": "Y0NfvlvE8ztF" } }, { "cell_type": "code", "source": [ "## Encontrando os tweets únicos classificados por apenas um codificador\n", "\n", "tweets_por_codificador = avaliacao_tweets_consolidado.groupby('tweet_id')['cod'].nunique()\n", "\n", "tweets_uniques_por_codificador = tweets_por_codificador[tweets_por_codificador == 1]\n", "\n", "## Calculando o número de tweets únicos classificados por apenas um codificador\n", "\n", "num_tweets_uniques_por_codificador = len(tweets_uniques_por_codificador)\n", "\n", "## Calculando a porcentagem em relação à amostra total de tweets\n", "\n", "total_tweets = len(avaliacao_tweets_consolidado)\n", "\n", "percentual = round((num_tweets_uniques_por_codificador / total_tweets) * 100, 2)\n", "\n", "## Exibindo os resultados\n", "\n", "print(\"Número de tweets únicos classificados por apenas um codificador:\",\n", " num_tweets_uniques_por_codificador)\n", "\n", "print(\"\\nPorcentagem em relação à amostra total de tweets:\", percentual, \"%\")\n" ], "metadata": { "id": "4ZiJLgU-CrnE", "colab": { "base_uri": "https://localhost:8080/" }, "outputId": "d4b39519-46e8-46b0-d1f0-828041b48b14" }, "execution_count": null, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "Número de tweets únicos classificados por apenas um codificador: 922\n", "\n", "Porcentagem em relação à amostra total de tweets: 21.47 %\n" ] } ] }, { "cell_type": "markdown", "source": [ "**RESPOSTA:**\n", "\n", "Os tweets únicos classificados por apenas um codificador representam tweets que não foram revisados ou validados por outros avaliadores. Isso pode ter implicações significativas para a validade da codificação e a confiabilidade dos resultados. As possíveis implicações incluem:\n", "\n", "Viés Individual: Quando um único codificador é responsável por classificar um tweet, a interpretação e a avaliação desse tweet podem ser influenciadas pelas crenças, atitudes ou preconceitos pessoais desse avaliador. Isso pode resultar em uma classificação enviesada que não reflete necessariamente a realidade.\n", "\n", "Falta de Consenso: A falta de revisão por múltiplos avaliadores pode levar à falta de consenso sobre a classificação de determinados tweets. Isso pode resultar em ambiguidades e incertezas nos resultados, já que diferentes avaliadores podem interpretar o mesmo tweet de maneira diferente.\n", "\n", "Validade Questionável: A validade da codificação pode ser questionada quando não há um acordo entre avaliadores independentes. A validade se refere à medida em que os resultados refletem com precisão o que se pretende avaliar. Se apenas um codificador está envolvido, a validade pode ser comprometida devido à falta de confirmação independente." ], "metadata": { "id": "K30ljGp20DPK" } }, { "cell_type": "markdown", "source": [ "

2. Salve em um novo Data Frame apenas os tweets classificados por mais de uma pessoa. Na sequência, calcule:\n", "\n", "

a) A proporção de tweets classificados como relevantes e irrelevantes por codificador em cada uma das semanas. Em seguida, verifique se existe uma variabilidade muito alta na maneira como os codificadores estão classificando os tweets ao longo das semanas. Interprete os resultados encontrados." ], "metadata": { "id": "KYXbsw4e9RUh" } }, { "cell_type": "code", "source": [ "## Filtrando apenas os tweets classificados por mais de uma pessoa\n", "\n", "tweets_multiplos_codificadores = avaliacao_tweets_consolidado.groupby('tweet_id')['cod'].transform('nunique') > 1\n", "\n", "tweets_classificados_por_multiplos_codificadores = avaliacao_tweets_consolidado[tweets_multiplos_codificadores]\n", "\n", "## Agrupando por codificador, semana e tipo de classificação, contando o número de tweets\n", "\n", "contagem_tweets = tweets_classificados_por_multiplos_codificadores.groupby(['cod', 'semana', 'sobre_vac']).size().reset_index(name='contagem')\n", "\n", "## Calculando o total de tweets classificados por codificador por semana\n", "\n", "total_por_semana_codificador = contagem_tweets.groupby(['cod', 'semana']).sum('contagem').reset_index()\n", "\n", "## Mesclando as contagens com o total para calcular a proporção\n", "\n", "contagem_tweets_proporcao = pd.merge(contagem_tweets, total_por_semana_codificador, on=['cod', 'semana'], suffixes=('', '_total'))\n", "\n", "## Calculando a proporção em relação ao total de tweets classificados por codificador por semana\n", "\n", "contagem_tweets_proporcao['proporcao'] = (contagem_tweets_proporcao['contagem'] / contagem_tweets_proporcao['contagem_total']) * 100\n", "\n", "## Pivotando a tabela para obter as proporções como colunas\n", "\n", "proporcao_classificacoes = contagem_tweets_proporcao.pivot_table(index='cod', columns=['semana', 'sobre_vac'], values='proporcao', fill_value=0)\n", "\n", "## Arredondando os resultados\n", "\n", "proporcao_classificacoes = proporcao_classificacoes.round(2)\n", "\n", "## Calculando a variabilidade na classificação dos codificadores ao longo das semanas\n", "\n", "variabilidade_semanas = proporcao_classificacoes.std(axis=1).round(2)\n", "\n", "## Exibindo as proporções e a variabilidade\n", "\n", "print(\"Proporção de tweets classificados como relevantes e irrelevantes por codificador em cada semana:\\n\")\n", "\n", "print(proporcao_classificacoes)\n", "\n", "print(\"\\nVariabilidade na classificação dos codificadores ao longo das semanas:\\n\")\n", "\n", "print(variabilidade_semanas)\n" ], "metadata": { "id": "4NYyzyleAgoZ", "colab": { "base_uri": "https://localhost:8080/" }, "outputId": "7231cfe9-4bd6-4243-af63-cacef9f9aca3" }, "execution_count": null, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "Proporção de tweets classificados como relevantes e irrelevantes por codificador em cada semana:\n", "\n", "semana semana2 semana3 semana4 semana5 \\\n", "sobre_vac Não Sim Não Sim Não Sim Não Sim \n", "cod \n", "A107 7.50 92.50 13.51 86.49 10.71 89.29 5.26 94.74 \n", "A108 7.50 92.50 13.16 86.84 13.33 86.67 7.69 92.31 \n", "A127 10.00 90.00 12.82 87.18 17.24 82.76 10.34 89.66 \n", "A129 26.67 73.33 2.56 97.44 9.09 90.91 0.00 100.00 \n", "A165 21.21 78.79 18.42 81.58 4.00 96.00 13.64 86.36 \n", "A217 5.13 94.87 15.00 85.00 6.45 93.55 4.35 95.65 \n", "A249 8.57 91.43 5.26 94.74 17.65 82.35 3.85 96.15 \n", "A262 9.09 90.91 13.89 86.11 3.33 96.67 8.00 92.00 \n", "A301 7.50 92.50 11.11 88.89 10.71 89.29 6.67 93.33 \n", "A323 25.00 75.00 5.56 94.44 0.00 0.00 0.00 0.00 \n", "A326 59.46 40.54 47.37 52.63 60.00 40.00 50.00 50.00 \n", "A347 5.00 95.00 5.13 94.87 0.00 0.00 0.00 0.00 \n", "A374 5.56 94.44 17.14 82.86 22.58 77.42 43.48 56.52 \n", "A440 20.00 80.00 18.92 81.08 13.79 86.21 14.29 85.71 \n", "A455 19.44 80.56 32.43 67.57 0.00 0.00 20.00 80.00 \n", "A473 11.43 88.57 2.70 97.30 3.12 96.88 12.50 87.50 \n", "A478 18.75 81.25 27.78 72.22 41.38 58.62 0.00 0.00 \n", "A487 27.50 72.50 8.82 91.18 16.67 83.33 0.00 100.00 \n", "A505 10.00 90.00 13.89 86.11 0.00 0.00 0.00 0.00 \n", "A567 12.50 87.50 7.69 92.31 3.33 96.67 4.17 95.83 \n", "A757 0.00 0.00 11.54 88.46 4.76 95.24 0.00 0.00 \n", "A761 6.45 93.55 10.81 89.19 5.88 94.12 16.67 83.33 \n", "A789 7.41 92.59 3.03 96.97 6.90 93.10 0.00 0.00 \n", "A810 7.50 92.50 21.05 78.95 0.00 0.00 0.00 0.00 \n", "A814 24.14 75.86 11.76 88.24 6.25 93.75 8.00 92.00 \n", "A848 5.41 94.59 12.82 87.18 0.00 0.00 0.00 0.00 \n", "A886 0.00 100.00 0.00 0.00 0.00 0.00 0.00 0.00 \n", "A903 7.50 92.50 5.71 94.29 3.70 96.30 4.35 95.65 \n", "A907 15.00 85.00 45.71 54.29 31.03 68.97 0.00 0.00 \n", "A956 12.90 87.10 26.32 73.68 25.93 74.07 25.00 75.00 \n", "A978 11.76 88.24 2.63 97.37 6.25 93.75 0.00 100.00 \n", "\n", "semana semana6 \n", "sobre_vac Não Sim \n", "cod \n", "A107 100 0 \n", "A108 0 0 \n", "A127 0 0 \n", "A129 0 0 \n", "A165 0 0 \n", "A217 0 100 \n", "A249 0 0 \n", "A262 0 0 \n", "A301 0 100 \n", "A323 0 0 \n", "A326 0 0 \n", "A347 0 0 \n", "A374 0 0 \n", "A440 0 100 \n", "A455 0 0 \n", "A473 0 0 \n", "A478 0 0 \n", "A487 0 0 \n", "A505 0 0 \n", "A567 0 0 \n", "A757 0 0 \n", "A761 0 0 \n", "A789 0 0 \n", "A810 0 0 \n", "A814 0 0 \n", "A848 0 0 \n", "A886 0 0 \n", "A903 0 0 \n", "A907 50 50 \n", "A956 0 0 \n", "A978 0 0 \n", "\n", "Variabilidade na classificação dos codificadores ao longo das semanas:\n", "\n", "cod\n", "A107 45.17\n", "A108 42.94\n", "A127 41.17\n", "A129 44.64\n", "A165 40.18\n", "A217 46.47\n", "A249 44.46\n", "A262 44.52\n", "A301 45.31\n", "A323 35.28\n", "A326 22.09\n", "A347 39.55\n", "A374 36.05\n", "A440 39.31\n", "A455 33.81\n", "A473 45.53\n", "A478 31.78\n", "A487 41.67\n", "A505 36.22\n", "A567 45.89\n", "A757 38.08\n", "A761 43.44\n", "A789 44.42\n", "A810 35.42\n", "A814 41.66\n", "A848 37.63\n", "A886 31.62\n", "A903 47.13\n", "A907 28.30\n", "A956 33.80\n", "A978 47.42\n", "dtype: float64\n" ] } ] }, { "cell_type": "markdown", "source": [ "RESPOSTA:\n", "\n", "As proporções de tweets classificados como relevantes ou irrelevantes por codificador em cada semana fornecem insights sobre a consistência das classificações ao longo do tempo. A variabilidade na classificação dos codificadores ao longo das semanas é medida pelo desvio padrão das proporções. Se a variabilidade for alta, significa que os codificadores estão tendo dificuldades em manter uma consistência nas classificações de tweets relevantes e irrelevantes ao longo das semanas.\n", "\n", "A alta variabilidade pode ser uma preocupação, pois sugere que pode haver falta de alinhamento entre os codificadores em relação à variável \"sobre_vac\". Isso pode resultar em resultados menos confiáveis e pode ser indicativo de que uma orientação mais clara e critérios de classificação consistentes são necessários para garantir uma codificação mais confiável e objetiva." ], "metadata": { "id": "Oz5WN_PY3e6r" } }, { "cell_type": "markdown", "source": [ "

b) A proporção de tweets classificados como \"Favorável\", \"Neutro\", \"Desfavorável\" e \"Não Aplicável\" por codificador em cada uma das semanas. Em seguida, verifique se existe uma variabilidade muito alta na maneira como os codificadores estão classificando os tweets ao longo das semanas. Interprete os resultados encontrados." ], "metadata": { "id": "fgnVwsUqAfm0" } }, { "cell_type": "code", "source": [ "\n", "\n", "## Filtrando apenas os tweets classificados por mais de uma pessoa\n", "\n", "tweets_multiplos_codificadores = avaliacao_tweets_consolidado.groupby('tweet_id')['cod'].transform('nunique') > 1\n", "\n", "tweets_classificados_por_multiplos_codificadores = avaliacao_tweets_consolidado[tweets_multiplos_codificadores]\n", "\n", "## Agrupando por codificador, semana e tipo de classificação, contando o número de tweets\n", "\n", "contagem_tweets = tweets_classificados_por_multiplos_codificadores.groupby(['cod', 'semana', 'posicao_vac']).size().reset_index(name='contagem')\n", "\n", "## Calculando o total de tweets classificados por codificador por semana\n", "\n", "total_por_semana_codificador = contagem_tweets.groupby(['cod', 'semana']).sum('contagem').reset_index()\n", "\n", "## Mesclando as contagens com o total para calcular a proporção\n", "\n", "contagem_tweets_proporcao = pd.merge(contagem_tweets, total_por_semana_codificador, on=['cod', 'semana'], suffixes=('', '_total'))\n", "\n", "## Calculando a proporção em relação ao total de tweets classificados por codificador por semana\n", "\n", "contagem_tweets_proporcao['proporcao'] = (contagem_tweets_proporcao['contagem'] / contagem_tweets_proporcao['contagem_total']) * 100\n", "\n", "## Pivotando a tabela para obter as proporções como colunas\n", "\n", "proporcao_classificacoes = contagem_tweets_proporcao.pivot_table(index='cod', columns=['semana', 'posicao_vac'], values='proporcao', fill_value=0)\n", "\n", "## Arredondando os resultados\n", "\n", "proporcao_classificacoes = proporcao_classificacoes.round(2)\n", "\n", "## Calculando a variabilidade na classificação dos codificadores ao longo das semanas\n", "\n", "variabilidade_semanas = proporcao_classificacoes.std(axis=1).round(2)\n", "\n", "## Exibindo as proporções e a variabilidade\n", "\n", "print(\"Proporção de tweets classificados como 'Favorável', 'Neutro', 'Desfavorável' e 'Não Aplicável' por codificador em cada semana:\\n\")\n", "\n", "print(proporcao_classificacoes)\n", "\n", "print(\"\\nVariabilidade na classificação dos codificadores ao longo das semanas:\\n\")\n", "\n", "print(variabilidade_semanas)" ], "metadata": { "id": "8SY3wh2oCi5m", "colab": { "base_uri": "https://localhost:8080/" }, "outputId": "3cd6d409-d220-4d24-f6f3-bed1b1c975e3" }, "execution_count": null, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "Proporção de tweets classificados como 'Favorável', 'Neutro', 'Desfavorável' e 'Não Aplicável' por codificador em cada semana:\n", "\n", "semana semana2 semana3 \\\n", "posicao_vac Desfavorável Favorável Neutro Não aplicável Desfavorável \n", "cod \n", "A107 0.00 62.50 25.00 12.50 2.70 \n", "A108 0.00 75.00 10.00 15.00 2.63 \n", "A127 0.00 70.00 20.00 10.00 10.26 \n", "A129 0.00 66.67 10.00 23.33 7.69 \n", "A165 0.00 57.58 18.18 24.24 0.00 \n", "A217 0.00 56.41 38.46 5.13 0.00 \n", "A249 2.86 62.86 25.71 8.57 0.00 \n", "A262 3.03 75.76 0.00 21.21 0.00 \n", "A301 0.00 65.00 15.00 20.00 2.78 \n", "A323 2.50 45.00 30.00 22.50 2.78 \n", "A326 0.00 32.43 8.11 59.46 0.00 \n", "A347 2.50 62.50 27.50 7.50 0.00 \n", "A374 0.00 52.78 33.33 13.89 2.86 \n", "A440 5.00 57.50 0.00 37.50 5.41 \n", "A455 2.78 72.22 11.11 13.89 0.00 \n", "A473 8.57 51.43 25.71 14.29 5.41 \n", "A478 0.00 34.38 40.62 25.00 2.78 \n", "A487 5.00 52.50 12.50 30.00 5.88 \n", "A505 2.50 52.50 37.50 7.50 2.78 \n", "A567 2.50 72.50 12.50 12.50 5.13 \n", "A757 0.00 0.00 0.00 0.00 0.00 \n", "A761 9.68 41.94 9.68 38.71 0.00 \n", "A789 0.00 81.48 0.00 18.52 6.06 \n", "A810 0.00 72.50 17.50 10.00 2.63 \n", "A814 3.45 51.72 13.79 31.03 2.94 \n", "A848 2.70 67.57 8.11 21.62 0.00 \n", "A886 0.00 85.71 14.29 0.00 0.00 \n", "A903 0.00 67.50 22.50 10.00 0.00 \n", "A907 2.50 65.00 22.50 10.00 0.00 \n", "A956 0.00 67.74 12.90 19.35 7.89 \n", "A978 5.88 58.82 29.41 5.88 0.00 \n", "\n", "semana semana4 \\\n", "posicao_vac Favorável Neutro Não aplicável Desfavorável Favorável Neutro \n", "cod \n", "A107 67.57 13.51 16.22 3.57 53.57 25.00 \n", "A108 68.42 2.63 26.32 0.00 63.33 10.00 \n", "A127 71.79 5.13 12.82 0.00 65.52 17.24 \n", "A129 74.36 12.82 5.13 3.03 69.70 18.18 \n", "A165 71.05 10.53 18.42 0.00 68.00 16.00 \n", "A217 40.00 45.00 15.00 3.23 54.84 35.48 \n", "A249 63.16 31.58 5.26 5.88 44.12 35.29 \n", "A262 83.33 2.78 13.89 0.00 86.67 3.33 \n", "A301 50.00 16.67 30.56 0.00 39.29 17.86 \n", "A323 61.11 30.56 5.56 0.00 0.00 0.00 \n", "A326 44.74 7.89 47.37 0.00 23.33 20.00 \n", "A347 69.23 25.64 5.13 0.00 0.00 0.00 \n", "A374 51.43 25.71 20.00 0.00 35.48 38.71 \n", "A440 35.14 8.11 51.35 0.00 51.72 13.79 \n", "A455 54.05 8.11 37.84 0.00 0.00 0.00 \n", "A473 72.97 16.22 5.41 3.12 65.62 28.12 \n", "A478 30.56 36.11 30.56 0.00 37.93 20.69 \n", "A487 76.47 0.00 17.65 16.67 54.17 12.50 \n", "A505 58.33 25.00 13.89 0.00 0.00 0.00 \n", "A567 71.79 15.38 7.69 3.33 63.33 26.67 \n", "A757 73.08 11.54 15.38 0.00 71.43 14.29 \n", "A761 59.46 2.70 37.84 2.94 38.24 41.18 \n", "A789 66.67 12.12 15.15 0.00 41.38 37.93 \n", "A810 68.42 10.53 18.42 0.00 0.00 0.00 \n", "A814 73.53 8.82 14.71 0.00 87.50 6.25 \n", "A848 64.10 0.00 35.90 0.00 0.00 0.00 \n", "A886 0.00 0.00 0.00 0.00 0.00 0.00 \n", "A903 74.29 17.14 8.57 0.00 66.67 7.41 \n", "A907 34.29 28.57 37.14 3.45 27.59 44.83 \n", "A956 68.42 0.00 23.68 3.70 66.67 3.70 \n", "A978 73.68 23.68 2.63 0.00 53.12 40.62 \n", "\n", "semana semana5 \\\n", "posicao_vac Não aplicável Desfavorável Favorável Neutro Não aplicável \n", "cod \n", "A107 17.86 0.00 42.11 47.37 10.53 \n", "A108 26.67 3.85 69.23 3.85 23.08 \n", "A127 17.24 0.00 72.41 17.24 10.34 \n", "A129 9.09 3.33 86.67 10.00 0.00 \n", "A165 16.00 0.00 59.09 27.27 13.64 \n", "A217 6.45 4.35 65.22 26.09 4.35 \n", "A249 14.71 0.00 73.08 23.08 3.85 \n", "A262 10.00 0.00 92.00 0.00 8.00 \n", "A301 42.86 0.00 33.33 16.67 50.00 \n", "A323 0.00 0.00 0.00 0.00 0.00 \n", "A326 56.67 0.00 14.29 35.71 50.00 \n", "A347 0.00 0.00 0.00 0.00 0.00 \n", "A374 25.81 0.00 39.13 17.39 43.48 \n", "A440 34.48 4.76 61.90 19.05 14.29 \n", "A455 0.00 0.00 60.00 0.00 40.00 \n", "A473 3.12 0.00 62.50 25.00 12.50 \n", "A478 41.38 0.00 0.00 0.00 0.00 \n", "A487 16.67 7.69 88.46 0.00 3.85 \n", "A505 0.00 0.00 0.00 0.00 0.00 \n", "A567 6.67 4.17 70.83 20.83 4.17 \n", "A757 14.29 0.00 0.00 0.00 0.00 \n", "A761 17.65 16.67 33.33 33.33 16.67 \n", "A789 20.69 0.00 0.00 0.00 0.00 \n", "A810 0.00 0.00 0.00 0.00 0.00 \n", "A814 6.25 0.00 80.00 12.00 8.00 \n", "A848 0.00 0.00 0.00 0.00 0.00 \n", "A886 0.00 0.00 0.00 0.00 0.00 \n", "A903 25.93 0.00 78.26 8.70 13.04 \n", "A907 24.14 0.00 0.00 0.00 0.00 \n", "A956 25.93 0.00 75.00 8.33 16.67 \n", "A978 6.25 0.00 50.00 50.00 0.00 \n", "\n", "semana semana6 \n", "posicao_vac Favorável Neutro Não aplicável \n", "cod \n", "A107 0.0 0.0 100 \n", "A108 0.0 0.0 0 \n", "A127 0.0 0.0 0 \n", "A129 0.0 0.0 0 \n", "A165 0.0 0.0 0 \n", "A217 50.0 50.0 0 \n", "A249 0.0 0.0 0 \n", "A262 0.0 0.0 0 \n", "A301 100.0 0.0 0 \n", "A323 0.0 0.0 0 \n", "A326 0.0 0.0 0 \n", "A347 0.0 0.0 0 \n", "A374 0.0 0.0 0 \n", "A440 62.5 37.5 0 \n", "A455 0.0 0.0 0 \n", "A473 0.0 0.0 0 \n", "A478 0.0 0.0 0 \n", "A487 0.0 0.0 0 \n", "A505 0.0 0.0 0 \n", "A567 0.0 0.0 0 \n", "A757 0.0 0.0 0 \n", "A761 0.0 0.0 0 \n", "A789 0.0 0.0 0 \n", "A810 0.0 0.0 0 \n", "A814 0.0 0.0 0 \n", "A848 0.0 0.0 0 \n", "A886 0.0 0.0 0 \n", "A903 0.0 0.0 0 \n", "A907 0.0 50.0 50 \n", "A956 0.0 0.0 0 \n", "A978 0.0 0.0 0 \n", "\n", "Variabilidade na classificação dos codificadores ao longo das semanas:\n", "\n", "cod\n", "A107 28.38\n", "A108 26.97\n", "A127 26.84\n", "A129 29.20\n", "A165 24.57\n", "A217 23.18\n", "A249 24.29\n", "A262 34.22\n", "A301 26.87\n", "A323 18.32\n", "A326 21.95\n", "A347 21.21\n", "A374 19.05\n", "A440 22.77\n", "A455 24.06\n", "A473 24.28\n", "A478 17.45\n", "A487 27.03\n", "A505 18.78\n", "A567 26.76\n", "A757 22.50\n", "A761 18.64\n", "A789 24.36\n", "A810 21.98\n", "A814 29.32\n", "A848 21.60\n", "A886 19.75\n", "A903 28.06\n", "A907 21.28\n", "A956 27.01\n", "A978 25.26\n", "dtype: float64\n" ] } ] }, { "cell_type": "markdown", "source": [ "

3. Para prosseguir com os exercícios a partir deste ponto, será necessário reorganizar o formato dos dados, posicionando os avaliadores lado a lado.\n", "\n", "

Para fazer isso, crie um novo Data Frame que inclua as colunas 'tweet_id', 'semana', 'sobre_vac', 'posicao_vac' e 'cod' para os avaliadores 01 e 02.\n", "\n", "

O formato esperado está apresentado abaixo." ], "metadata": { "id": "idn-79-6wchU" } }, { "cell_type": "code", "source": [ "## Exemplo de cabeçalho do banco esperado\n", "\n", "pd.DataFrame(columns=[\"tweet_id\",\"semana\", \"sobre_vac_1\",\"posicao_vac_1\",\"cod_1\",\"sobre_vac_2\",\"posicao_vac_2\",\"cod_2\"])" ], "metadata": { "id": "XdYv9kmByyCL" }, "execution_count": null, "outputs": [] }, { "cell_type": "markdown", "source": [ "Uma abordagem eficaz para atribuir números sequenciais a elementos dentro de cada grupo é aplicar a função `groupby().cumcount()`." ], "metadata": { "id": "47VJG7420Nzf" } }, { "cell_type": "code", "source": [ "## Exemplo\n", "\n", "import pandas as pd\n", "\n", "dados = pd.DataFrame({\n", " 'Grupo': ['A', 'A', 'B', 'B', 'B', 'C', 'C', 'C', 'C'],\n", " 'Valor': [10, 15, 22, 18, 25, 30, 35, 40, 45]\n", "})\n", "\n", "dados['Contagem'] = dados.groupby('Grupo').cumcount() + 1\n", "\n", "dados" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 332 }, "id": "4Q_DTuEq0MtP", "outputId": "1d643841-edf0-4fa1-902b-289460299309" }, "execution_count": null, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ " Grupo Valor Contagem\n", "0 A 10 1\n", "1 A 15 2\n", "2 B 22 1\n", "3 B 18 2\n", "4 B 25 3\n", "5 C 30 1\n", "6 C 35 2\n", "7 C 40 3\n", "8 C 45 4" ], "text/html": [ "\n", "

\n", "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
GrupoValorContagem
0A101
1A152
2B221
3B182
4B253
5C301
6C352
7C403
8C454
\n", "
\n", "
\n", "\n", "
\n", " \n", "\n", " \n", "\n", " \n", "
\n", "\n", "\n", "
\n", " \n", "\n", "\n", "\n", " \n", "
\n", "
\n", "
\n" ] }, "metadata": {}, "execution_count": 8 } ] }, { "cell_type": "markdown", "source": [ "Use a função merge para combinar tabelas utilizando colunas-chave ou índices comuns como pontos de integração." ], "metadata": { "id": "1P8e__YV1Gh5" } }, { "cell_type": "code", "source": [ "## Exemplo\n", "\n", "import pandas as pd\n", "\n", "data1 = {'Cliente_ID': [1, 2, 3, 4],\n", " 'Nome': ['Alice', 'Bob', 'Carol', 'David']}\n", "\n", "df1 = pd.DataFrame(data1)\n", "\n", "data2 = {'Pedido_ID': [101, 102, 103, 104],\n", " 'Cliente_ID': [2, 1, 4, 3],\n", " 'Produto': ['Laptop', 'Mouse', 'Teclado', 'Monitor']}\n", "\n", "df2 = pd.DataFrame(data2)\n", "\n", "resultado = pd.merge(df1, df2, on='Cliente_ID', how='left')\n", "\n", "resultado" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 175 }, "id": "QkxRjL7G2Etw", "outputId": "243b863a-8253-469a-8d59-9a68fe74fbfc" }, "execution_count": null, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ " Cliente_ID Nome Pedido_ID Produto\n", "0 1 Alice 102 Mouse\n", "1 2 Bob 101 Laptop\n", "2 3 Carol 104 Monitor\n", "3 4 David 103 Teclado" ], "text/html": [ "\n", "
\n", "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
Cliente_IDNomePedido_IDProduto
01Alice102Mouse
12Bob101Laptop
23Carol104Monitor
34David103Teclado
\n", "
\n", "
\n", "\n", "
\n", " \n", "\n", " \n", "\n", " \n", "
\n", "\n", "\n", "
\n", " \n", "\n", "\n", "\n", " \n", "
\n", "
\n", "
\n" ] }, "metadata": {}, "execution_count": 7 } ] }, { "cell_type": "code", "source": [ "## Criando uma coluna adicional para distinguir os avaliadores 01 e 02\n", "\n", "tweets_classificados_por_multiplos_codificadores = tweets_classificados_por_multiplos_codificadores.assign(avaliador=tweets_classificados_por_multiplos_codificadores.groupby('tweet_id').cumcount() + 1)\n", "\n", "## Criando um novo DataFrame com a reorganização dos dados\n", "\n", "novo_dataframe = pd.pivot(tweets_classificados_por_multiplos_codificadores, index=['tweet_id', 'semana'], columns='avaliador', values=['sobre_vac', 'posicao_vac', 'cod'])\n", "novo_dataframe.columns = [f'{col[0]}_{col[1]}' for col in novo_dataframe.columns]\n", "\n", "## Resetando o índice\n", "\n", "novo_dataframe.reset_index(inplace=True)\n", "\n", "## Exibindo o novo DataFrame\n", "\n", "print(novo_dataframe.head())\n" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "CnzZvsHk4-Hp", "outputId": "22ec9045-2331-4c11-9fef-4c2be34247c3" }, "execution_count": null, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ " tweet_id semana sobre_vac_1 sobre_vac_2 posicao_vac_1 \\\n", "0 1214711768674700032 semana2 Não Não Não aplicável \n", "1 1217524257237969920 semana4 Não Não Não aplicável \n", "2 1218606587566259968 semana3 Não Não Não aplicável \n", "3 1223605623272750080 semana2 Não Não Não aplicável \n", "4 1223712803611120128 semana3 Não Não Não aplicável \n", "\n", " posicao_vac_2 cod_1 cod_2 \n", "0 Não aplicável A326 A505 \n", "1 Não aplicável A326 A956 \n", "2 Não aplicável A478 A810 \n", "3 Não aplicável A129 A903 \n", "4 Não aplicável A478 A810 \n" ] } ] }, { "cell_type": "markdown", "source": [ "

4. Agora vamos verificar o grau de concordância entre os avaliadores. Para isso, utilize o Data Frame criado no exercício 2 e calcule:\n", "\n", "

a) A proporção de tweets que receberam a mesma codificação de ambos os codificadores no que se refere a relevância do conteúdo avaliado para a pesquisa. Faça isso para cada uma das semanas e depois verifique se existe uma variabilidade muito alta no grau de concordância ao longo das semanas." ], "metadata": { "id": "asUc8pO6DUj-" } }, { "cell_type": "code", "source": [ "\n", "## Calculando a proporção de tweets com a mesma codificação pelos dois avaliadores\n", "\n", "novo_dataframe['mesma_cod_sobre_vac'] = novo_dataframe['sobre_vac_1'] == novo_dataframe['sobre_vac_2']\n", "\n", "## Calculando a proporção de concordância em porcentagem e arredondando para duas casas decimais\n", "\n", "novo_dataframe['mesma_cod_sobre_vac'] = (novo_dataframe['mesma_cod_sobre_vac'] * 100).round(2)\n", "\n", "## Agrupando por semana e calculando a média de concordância\n", "\n", "concordancia_semanas_sobre_vac = novo_dataframe.groupby('semana')['mesma_cod_sobre_vac'].mean().round(2)\n", "\n", "## Calculando a variabilidade na concordância ao longo das semanas\n", "\n", "variabilidade_concordancia_semanas_sobre_vac = concordancia_semanas_sobre_vac.std().round(2)\n", "\n", "## Exibindo a concordância nas semanas\n", "\n", "print(\"\\nConcordância na classificação de 'sobre_vac' por semana:\\n\")\n", "\n", "print(concordancia_semanas_sobre_vac)\n", "\n", "## Verificando a variabilidade na concordância\n", "\n", "print(\"\\nVariabilidade na concordância de 'sobre_vac' ao longo das semanas:\",\n", " variabilidade_concordancia_semanas_sobre_vac, \"%\")" ], "metadata": { "id": "MV5ozSkIGYiM", "colab": { "base_uri": "https://localhost:8080/" }, "outputId": "f89d998e-37d5-457c-fbfc-2be67bb698ea" }, "execution_count": null, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "\n", "Concordância na classificação de 'sobre_vac' por semana:\n", "\n", "semana\n", "semana2 86.50\n", "semana3 84.52\n", "semana4 82.67\n", "semana5 88.84\n", "semana6 75.00\n", "Name: mesma_cod_sobre_vac, dtype: float64\n", "\n", "Variabilidade na concordância de 'sobre_vac' ao longo das semanas: 5.28 %\n" ] } ] }, { "cell_type": "markdown", "source": [ "

b) A proporção de tweets que receberam a mesma codificação de ambos os codificadores no que se refere ao posicionamento sobre vacinas e vacinação de Covid-19. Faça isso para cada uma das semanas e depois verifique se existe uma variabilidade muito alta no grau de concordância ao longo das semanas." ], "metadata": { "id": "48UZ_siEGZCl" } }, { "cell_type": "code", "source": [ "\n", "## Calculando a proporção de tweets com a mesma codificação pelos dois avaliadores\n", "\n", "novo_dataframe['mesma_cod_posicao_vac'] = novo_dataframe['posicao_vac_1'] == novo_dataframe['posicao_vac_2']\n", "\n", "## Calculando a proporção de concordância em porcentagem e arredondando para duas casas decimais\n", "\n", "novo_dataframe['mesma_cod_posicao_vac'] = (novo_dataframe['mesma_cod_posicao_vac'] * 100).round(2)\n", "\n", "\n", "## Agrupando por semana e calculando a média de concordância\n", "\n", "concordancia_semanas_posicao_vac = novo_dataframe.groupby('semana')['mesma_cod_posicao_vac'].mean().round(2)\n", "\n", "## Calculando a variabilidade na concordância ao longo das semanas\n", "\n", "variabilidade_concordancia_semanas_posicao_vac = concordancia_semanas_posicao_vac.std().round(2)\n", "\n", "## Exibindo a concordância nas semanas\n", "\n", "print(\"\\nConcordância na classificação de 'posicao_vac' por semana:\\n\")\n", "\n", "print(concordancia_semanas_posicao_vac)\n", "\n", "## Verificando a variabilidade na concordância\n", "\n", "print(\"\\nVariabilidade na concordância de 'posicao_vac' ao longo das semanas:\",\n", " variabilidade_concordancia_semanas_posicao_vac, \"%\")\n" ], "metadata": { "id": "hhtpXLmXHdAF", "colab": { "base_uri": "https://localhost:8080/" }, "outputId": "df0cea1a-5e64-49ac-c0f2-455cfe28bbbf" }, "execution_count": null, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "\n", "Concordância na classificação de 'posicao_vac' por semana:\n", "\n", "semana\n", "semana2 67.68\n", "semana3 66.48\n", "semana4 60.23\n", "semana5 64.94\n", "semana6 50.00\n", "Name: mesma_cod_posicao_vac, dtype: float64\n", "\n", "Variabilidade na concordância de 'posicao_vac' ao longo das semanas: 7.21 %\n" ] } ] }, { "cell_type": "markdown", "source": [ "

5. Agora vamos olhar apenas para os tweets nos quais ocorreram algum tipo de discordância entre os codificadores. Para isso, crie um novo Data Frame contendo as avaliações discordantes para a variável posicao_vac.\n", "\n", "

Vamos avaliar se a divergência entre os codificadores é razoável, ou seja, se ocorreu discrepância em categorias que estão próximas em termos de contexto, como \"Favorável\" e \"Neutro\". Para essa avaliação, iremos associar valores numéricos a cada uma das categorias nesta variável.\n", "\n", "

a) Crie uma nova variável na qual as observações com valor \"Neutro\" sejam atribuídas como 0, as observações com valor \"Favorável\" sejam designadas como 1, as observações com valor \"Desfavorável\" sejam registradas como 3, e as observações com valor \"Não Aplicável\" sejam representadas por 7." ], "metadata": { "id": "tbBme3aYHdtE" } }, { "cell_type": "code", "source": [ "# Desativar temporariamente os avisos\n", "pd.options.mode.chained_assignment = None\n", "\n", "## Filtrando apenas as avaliações discordantes\n", "\n", "avaliacoes_discordantes = novo_dataframe[novo_dataframe['posicao_vac_1'] != novo_dataframe['posicao_vac_2']]\n", "\n", "## Criando um mapeamento de valores numéricos para as categorias\n", "\n", "mapeamento_categorias = {\n", " 'Neutro': 0,\n", " 'Favorável': 1,\n", " 'Desfavorável': 3,\n", " 'Não aplicável': 7\n", "}\n", "\n", "## Aplicando o mapeamento para criar novas variáveis numéricas\n", "\n", "avaliacoes_discordantes['posicao_vac_1_v2'] = avaliacoes_discordantes['posicao_vac_1'].map(mapeamento_categorias)\n", "\n", "avaliacoes_discordantes['posicao_vac_2_v2'] = avaliacoes_discordantes['posicao_vac_2'].map(mapeamento_categorias)\n", "\n", "## Exibindo o novo DataFrame com as avaliações discordantes e as novas variáveis numéricas\n", "\n", "print(avaliacoes_discordantes[['tweet_id', 'posicao_vac_1', 'posicao_vac_2', 'posicao_vac_1_v2', 'posicao_vac_2_v2']].head())\n" ], "metadata": { "id": "L6_ajd6iO01l", "colab": { "base_uri": "https://localhost:8080/" }, "outputId": "37e6be46-8602-41c9-a72a-27cba4dfe22b" }, "execution_count": null, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ " tweet_id posicao_vac_1 posicao_vac_2 posicao_vac_1_v2 \\\n", "10 1238081207671419904 Não aplicável Favorável 7 \n", "13 1239484259255140096 Desfavorável Neutro 3 \n", "15 1240005467822259968 Não aplicável Favorável 7 \n", "19 1240755003763059968 Não aplicável Favorável 7 \n", "29 1241892444377090048 Não aplicável Favorável 7 \n", "\n", " posicao_vac_2_v2 \n", "10 1 \n", "13 0 \n", "15 1 \n", "19 1 \n", "29 1 \n" ] } ] }, { "cell_type": "markdown", "source": [ "

b) Cada diferença absoluta corresponde a um tipo específico de divergência entre os codificadores. Por exemplo, uma diferença de 1 indica que um dos codificadores atribuiu o valor \"Neutro\" ao posicionamento, enquanto o outro atribuiu o valor \"Favorável\" e vice-versa. Sabendo disso, construa um Data Frame relacionando cada grau de diferença a uma combinação específica de posicionamentos. O novo banco deve possuir 04 variáveis:\n", "\n", "*

Avaliador01: Valor do posicionamento atribuído pelo avaliador 01;\n", "*

Avaliador02: Valor do posicionamento atribuído pelo avaliador 02;\n", "*

Diferenca: Módulo ou valor absoluto da diferença entre as avaliações 01 e 02; e\n", "*

Tipo: Tipo de combinação de posicionamentos. Por exemplo: Neutro - Favorável. Importante atribuir o mesmo tipo de combinação aos posicionamentos que somente estão com as posições trocadas.\n", "\n", "

Não esqueça de imprimir o novo Data Frame." ], "metadata": { "id": "SSyWAwEQk17j" } }, { "cell_type": "code", "source": [ "## Cria um DataFrame com as combinações de posicionamentos e diferenças\n", "\n", "df_combinacoes = pd.DataFrame(columns=['Avaliador01', 'Avaliador02', 'Diferenca', 'Tipo'])\n", "\n", "## Define as categorias possíveis de posicionamentos e seus valores correspondentes\n", "\n", "categorias_posicionamentos = {\n", " 'Neutro': 0,\n", " 'Favorável': 1,\n", " 'Desfavorável': 3,\n", " 'Não Aplicável': 7\n", "}\n", "\n", "## Lista para armazenar as combinações únicas a serem adicionadas ao DataFrame\n", "\n", "comb_to_add = []\n", "\n", "## Percorre todas as combinações possíveis\n", "\n", "for pos1 in categorias_posicionamentos:\n", " for pos2 in categorias_posicionamentos:\n", " # Calcula a diferença absoluta entre as avaliações com base nos valores correspondentes\n", " diferenca = abs(categorias_posicionamentos[pos1] - categorias_posicionamentos[pos2])\n", "\n", " # Mantém apenas as diferenças maiores que 0\n", " if diferenca > 0:\n", " # Define o tipo de combinação de posicionamentos\n", " tipo = f'{pos1} - {pos2}' if pos1 <= pos2 else f'{pos2} - {pos1}'\n", "\n", " # Verifica se o tipo já existe na lista de combinações únicas\n", " if tipo not in [item['Tipo'] for item in comb_to_add]:\n", " # Adiciona a combinação à lista de combinações únicas a serem adicionadas no banco final\n", " comb_to_add.append({'Avaliador01': pos1, 'Avaliador02': pos2, 'Diferenca': diferenca, 'Tipo': tipo})\n", "\n", "## Adiciona as combinações únicas da lista ao DataFrame\n", "\n", "df_combinacoes = pd.concat([df_combinacoes, pd.DataFrame(comb_to_add)], ignore_index=True)\n", "\n", "## Exibe o novo Data Frame sem combinações duplicadas e apenas com diferenças maiores que 0\n", "\n", "print(df_combinacoes)\n" ], "metadata": { "id": "Ha5Rf2zdpbbh", "colab": { "base_uri": "https://localhost:8080/" }, "outputId": "a3732701-0574-46fe-9034-0a457f1c2a79" }, "execution_count": null, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ " Avaliador01 Avaliador02 Diferenca Tipo\n", "0 Neutro Favorável 1 Favorável - Neutro\n", "1 Neutro Desfavorável 3 Desfavorável - Neutro\n", "2 Neutro Não Aplicável 7 Neutro - Não Aplicável\n", "3 Favorável Desfavorável 2 Desfavorável - Favorável\n", "4 Favorável Não Aplicável 6 Favorável - Não Aplicável\n", "5 Desfavorável Não Aplicável 4 Desfavorável - Não Aplicável\n" ] } ] }, { "cell_type": "markdown", "source": [ "

c) Calcule a diferença absoluta entre as avaliações feitos pelos codificadores e salve o resultado em uma variável chamada \"Diferenca\". Junte o Data Frame de avaliações discordantes com o Data Frame criado na alternativa anterior. Use a função merge." ], "metadata": { "id": "74rsuWDRO1dp" } }, { "cell_type": "code", "source": [ "## Calcula a diferença absoluta entre as avaliações dos codificadores\n", "\n", "avaliacoes_discordantes['Diferenca'] = abs(avaliacoes_discordantes['posicao_vac_1_v2'] - avaliacoes_discordantes['posicao_vac_2_v2'])\n", "\n", "## Junta o Data Frame de avaliações discordantes com o Data Frame anterior usando a função merge\n", "\n", "resultado_final = pd.merge(avaliacoes_discordantes, df_combinacoes, on='Diferenca', how='left')\n", "\n", "## Seleciona as colunas desejadas no DataFrame final\n", "\n", "resultado_final = resultado_final[[\"tweet_id\", \"semana\", \"sobre_vac_1\", \"posicao_vac_1\", \"posicao_vac_1_v2\", \"cod_1\", \"sobre_vac_2\", \"posicao_vac_2\", \"posicao_vac_2_v2\", \"cod_2\", \"Diferenca\", \"Tipo\"]]\n", "\n", "## Exibe o DataFrame resultante com as colunas selecionadas\n", "\n", "resultado_final.head()\n" ], "metadata": { "id": "Vknn6oH9TRCu", "colab": { "base_uri": "https://localhost:8080/", "height": 382 }, "outputId": "e3dc0263-b0d4-48df-e5c4-d74e20ed0fe1" }, "execution_count": null, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ " tweet_id semana sobre_vac_1 posicao_vac_1 posicao_vac_1_v2 \\\n", "0 1238081207671419904 semana3 Sim Não aplicável 7 \n", "1 1239484259255140096 semana2 Sim Desfavorável 3 \n", "2 1240005467822259968 semana4 Não Não aplicável 7 \n", "3 1240755003763059968 semana3 Não Não aplicável 7 \n", "4 1241892444377090048 semana2 Não Não aplicável 7 \n", "\n", " cod_1 sobre_vac_2 posicao_vac_2 posicao_vac_2_v2 cod_2 Diferenca \\\n", "0 A789 Sim Favorável 1 A323 6 \n", "1 A814 Não Neutro 0 A323 3 \n", "2 A129 Sim Favorável 1 A165 6 \n", "3 A907 Sim Favorável 1 A455 6 \n", "4 A129 Sim Favorável 1 A107 6 \n", "\n", " Tipo \n", "0 Favorável - Não Aplicável \n", "1 Desfavorável - Neutro \n", "2 Favorável - Não Aplicável \n", "3 Favorável - Não Aplicável \n", "4 Favorável - Não Aplicável " ], "text/html": [ "\n", "

\n", "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
tweet_idsemanasobre_vac_1posicao_vac_1posicao_vac_1_v2cod_1sobre_vac_2posicao_vac_2posicao_vac_2_v2cod_2DiferencaTipo
01238081207671419904semana3SimNão aplicável7A789SimFavorável1A3236Favorável - Não Aplicável
11239484259255140096semana2SimDesfavorável3A814NãoNeutro0A3233Desfavorável - Neutro
21240005467822259968semana4NãoNão aplicável7A129SimFavorável1A1656Favorável - Não Aplicável
31240755003763059968semana3NãoNão aplicável7A907SimFavorável1A4556Favorável - Não Aplicável
41241892444377090048semana2NãoNão aplicável7A129SimFavorável1A1076Favorável - Não Aplicável
\n", "
\n", "
\n", "\n", "
\n", " \n", "\n", " \n", "\n", " \n", "
\n", "\n", "\n", "
\n", " \n", "\n", "\n", "\n", " \n", "
\n", "
\n", "
\n" ] }, "metadata": {}, "execution_count": 75 } ] }, { "cell_type": "markdown", "source": [ "Em seguida, agrupe os resultados por semana e por grau de diferença e verifique a frequência de cada tipo de discordância. Quais as principais divergências encontradas entre os codificadores?" ], "metadata": { "id": "xsjcry1osFDJ" } }, { "cell_type": "code", "source": [ "## Agrupa os resultados por semana e grau de diferença, e conta a frequência de cada tipo de discordância\n", "\n", "frequencia_discordancias = resultado_final.groupby(['semana', 'Diferenca', 'Tipo']).size().reset_index(name='Frequencia')\n", "\n", "frequencia_discordancias_geral = resultado_final.groupby(['Diferenca', 'Tipo']).size().reset_index(name='Frequencia')\n", "\n", "## Ordena o DataFrame pela frequência em ordem decrescente\n", "\n", "frequencia_discordancias = frequencia_discordancias.sort_values(by=['semana', 'Frequencia'], ascending=[True, False])\n", "\n", "frequencia_discordancias_geral = frequencia_discordancias_geral.sort_values(by=['Frequencia'], ascending=False)\n", "\n", "## Exibe o DataFrame resultante\n", "\n", "print(\"Discordância por Semana\\n\\n\",frequencia_discordancias, end=\"\\n\\n\")\n", "\n", "print(\"Discordância Geral\\n\\n\",frequencia_discordancias_geral)\n" ], "metadata": { "id": "F98zSAc5swD7", "colab": { "base_uri": "https://localhost:8080/" }, "outputId": "ccb1ca2c-e35f-4e1a-e253-48986b11f921" }, "execution_count": null, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "Discordância por Semana\n", "\n", " semana Diferenca Tipo Frequencia\n", "0 semana2 1 Favorável - Neutro 66\n", "4 semana2 6 Favorável - Não Aplicável 60\n", "5 semana2 7 Neutro - Não Aplicável 34\n", "2 semana2 3 Desfavorável - Neutro 8\n", "1 semana2 2 Desfavorável - Favorável 1\n", "3 semana2 4 Desfavorável - Não Aplicável 1\n", "10 semana3 6 Favorável - Não Aplicável 69\n", "6 semana3 1 Favorável - Neutro 68\n", "11 semana3 7 Neutro - Não Aplicável 36\n", "8 semana3 3 Desfavorável - Neutro 5\n", "9 semana3 4 Desfavorável - Não Aplicável 5\n", "7 semana3 2 Desfavorável - Favorável 1\n", "12 semana4 1 Favorável - Neutro 56\n", "15 semana4 6 Favorável - Não Aplicável 44\n", "16 semana4 7 Neutro - Não Aplicável 36\n", "13 semana4 3 Desfavorável - Neutro 3\n", "14 semana4 4 Desfavorável - Não Aplicável 1\n", "17 semana5 1 Favorável - Neutro 36\n", "21 semana5 6 Favorável - Não Aplicável 30\n", "22 semana5 7 Neutro - Não Aplicável 18\n", "19 semana5 3 Desfavorável - Neutro 2\n", "18 semana5 2 Desfavorável - Favorável 1\n", "20 semana5 4 Desfavorável - Não Aplicável 1\n", "23 semana6 1 Favorável - Neutro 2\n", "24 semana6 6 Favorável - Não Aplicável 2\n", "\n", "Discordância Geral\n", "\n", " Diferenca Tipo Frequencia\n", "0 1 Favorável - Neutro 228\n", "4 6 Favorável - Não Aplicável 205\n", "5 7 Neutro - Não Aplicável 124\n", "2 3 Desfavorável - Neutro 18\n", "3 4 Desfavorável - Não Aplicável 8\n", "1 2 Desfavorável - Favorável 3\n" ] } ] }, { "cell_type": "markdown", "source": [ "

d) Os tipos de divergências encontradas entre os codificadores são muito drásticos? Ou seja, eles indicam algum problema mais grave no que diz respeito à qualidade dos dados? E em relação ao entendimento dos codificadores acerca das regras especificadas no codebook? Explique." ], "metadata": { "id": "UKswCYVRO1aT" } }, { "cell_type": "markdown", "source": [ "**RESPOSTA:**\n", "\n" ], "metadata": { "id": "M1yYfScOJAb_" } }, { "cell_type": "markdown", "source": [ "No geral, a natureza das discordâncias varia em termos de gravidade. Discordâncias mais comuns, como \"Favorável - Neutro\" e \"Favorável - Não Aplicável\", podem ser atribuídas a interpretações diferentes, mas não indicam necessariamente problemas graves nos dados. Discordâncias mais drásticas, como \"Desfavorável - Favorável\", são menos comuns e podem indicar problemas no entendimento das regras do codebook ou na qualidade da codificação." ], "metadata": { "id": "CV7P1JBhKcBL" } } ] }