Quando um conjunto A é considerado um subconjunto de um conjunto B?

Teoria de Conjuntos

O estudo da teoria de conjuntos visa oportunizar o aprendizado de relações básicas desenvolvidas em operações matemáticas e na resolução de problemas. Além disso, o estudo da teoria de conjutnos fornece elementos que podem servir de base para o aprendizado de programação e também de bancos de dados.

Ao obter coleções de elementos classificados a partir de certas características, estamos formando conjuntos. Os animais vertebrados, por exemplo, podem ser divididos em cinco classes: peixes, anfíbios, répteis, mamíferos e aves. Cada uma dessas classes de animais forma um conjunto. Na matemática, a ideia de conjunto é fundamental e está presente em diversos conceitos. Podemos formar conjuntos a partir de elementos de diferentes naturezas, tais como objetos, pessoas e números.

Exemplos
• Conjunto dos números naturais menores que 6: A = {1, 2, 3, 4, 5}
• Conjunto das vogais do nosso alfabeto: B = {a, e, i, o, u}
• Conjunto dos continentes: C = {África, América, Ásia, Europa, Oceania}
• Conjunto dos números pares positivos menores que 100: D = {2, 4, 6, 8, …, 100}

Neste trabalho será apresentado um material elaborado pelos autores que visa oportunizar o aprendizado de teoria de conjuntos com a complementação de atividades usuais presentes em livros didátivos com procedimentos computacionais dessenvolvidos no software R e através do seu GUI RStudio.

O software R é uma linguagem e, ao mesmo tempo, um ambiente computacional estatístico que permite a realização de cálculos, simulações e desenvolvimento de modelos. Permitindo a realização de uma grande variedade de cálculos matemáticos, estatísticos, construção de gráficos e simulações (BECHER; MACHADO, 2018.

Uma característica muito importane e útil do R é que ele permite o acréscimo de packages, que são extensões desenvolvidas e distribuidas por usuários que facilitam a realização de certos procedimentos ou adicionam novas funcionalidades. No estudo da teoria de conjuntos além do R e do RStudio também precisaremos do package VennDiagram.


Representando Conjuntos

Cada componente de um conjunto é denominado elemento e, de maneira geral, os conjuntos são indicados por letras maiúsculas e seus elementos ou são dispostos entre chaves separados por vírgula ou ainda podem ser indicados a partir da Regra ou Lei de Formação que indica quais são os seus elementos.

Exemplos
• Conjunto dos números naturais impares menores que 10: A = {1, 3, 5, 7, 9}
• Conjunto dos números maiores que 10 e menores que 20: B = {x|x é um número maior que 10 e menor do que 20}

Um conjunto também pode ser indicado por meio de uma figura chamada Diagrama de Venn. Quando um elemento compõe um conjunto, dizemos que ele elemento pertence ao conjunto. De maneira semelhante, quando ele não compõe o conjunto, dizemos que ele não pertence ao conjunto.

Exemplo:

Podemos escrever que: \(7\in E\) ou, quando o elemento não pertence ao conjunto \(8 \notin E\).


Exercícios
  1. Determine a lei de formação de cada cojunto e faça a representação por meio de um diagrama de Venn.
  1. Conjunto das notas músicais;
  2. Estados da região sul do Brasil;
  3. Números pares, maiores que 0 e menores que 10.
  1. Relacione cada elemento abaixo com os conjuntos A = {x|x é par e divisor de 20} e B = {x|x2 é quadrado perfeito}.
  1. 4
  2. 6
  3. 10
  4. 16
  5. 25
  6. 50
  1. O conjunto D é formado pelos números quadrados perfeitos ímpares menores que 150. Quantos elementos pertencem ao conjunto D?

  2. (Unifor - CE, Adaptada) Seja o número 6X3Y, em que X e Y substituem os algarismos das centenas e das unidades, respectivamente. Determine o total de pares de valores (X, Y) que tornam tal número divisível por 15 e escreva a lei de formação do conjunto destes pares, fazendo a uma representação através de um diagrama de Venn.


Como criar conjuntos no R?

Para criar-se conjuntos no R o modo mais intuitivo e simples é procedermos a digitação dos elementos diretamente na linha de comando. Cabe notar que neste processo também devemos indicar o nome do conjunto no qual os elementos ficaram armazenados. O que é feito através do comando c que indica para o R combinar ou concatenar os valores mencionados.
No caso de valores numéricos basta digitarmos os valores diretamente, entretanto no caso de elementos alfabuméricos é preciso colocá-los entre aspas.


Quando dois conjuntos são iguais?

Dois conjuntos A e B são iguais quando eles possuem os mesmos elementos, ainda que algum deles possa ser repetido. Ou seja, dois conjuntos são iguais quando possuem os mesmo elementos, independente da quantidade. Se a igualdade for verificada escrevemos \(A = B\).
Por outro lado, dois conjuntos não são iguais quando pelo menos um dos elementos pertence a apenas um dos conjuntos e, nestes casos escrevemos \(A\neq B\).
Por exemplo, o conjunto A={x|x é um número maior que -2 e menor ou igual a 4} e o conjunto B={-1, 0, 1, 2, 3, 4} possuem os mesmo elementos e, assim os conjuntos A e B sáo ditos iguais.


Trés formas de criar conjuntos sequenciais no R

A forma mais simples para gerar um sequência no R é usando :. Neste caso basta indicarmos o inicio e o final da sequência. Por exemplo: 1:10 irá produzir uma sequência e números inteiros que inicia em 1 e termina em 10.
A segunda forma de gerar sequências é com o uso do comando seq. Este comando permite a criação de sequências com intervalo diferente de um inteiro. Por exemplo: seq(1, 10, 2) irá gerar uma sequência que inicia no número 1 e terá um intervalo de duas unidades até o próximo termo, sendo o último termo da sequência igual a 10 ou então o menor valor que respeito o intervalo indicado. Com o comando seq é possível gerar sequências decrescentes especificando o intervalo com um valor negativo.
Por fim, a terceira forma de gerar conjuntos sequenciais é usando o comando rep. Neste comando devemos indicar o valor que será repetido e quantas vezes isso acontecerá. Por exemplo: rep(2,5) irá criar um sequência com o número 2 repetido 5 vezes. Já se quisermos especificar um número de repetições diferentes para cada valor podemos fazer: rep(c("A", "B", "C"), c(3, 4, 2)).

Conjuntos unitário, vazio, universo e subconjunto

  • Um conjunto A que possui um único elemento é chamado de conjunto unitário. Os conjuntos A={4} e B={x|x é um número primo par} são exemplos de conjuntos unitários.
  • Por outro lado, dizemos que A é um conjunto vazio quando ele não possui elemento algum. Podemos indicar um conjunto vazio por { }. Um exemplo de conjunto vazio é A={x|x é um número impar divisível por 2}.
  • Chamamos de conjunto universo e indicamos por U, aquele conjunto ao qual pertencem todos os elementos considerados em determinado situação.
  • Quando todos os elementos de um cojunto W pertencem a um outro conjunto P, dizemos que W é subconjunto de P, ou seja, todos os elementos do conjunto W estão contidos no conjunto P.
    • Todo conjunto é subconjunto dele mesmo.
    • O conjunto vazio, por convenção, é subconjunto de qualquer conjunto.
    • Se um conjunto A possuir n elementos, então existirão \(2^{n}\) subconjuntos de A.

Exercícios
  1. Determine quais dos conjuntos abaixo são iguais.
  1. A={x|x é um número inteiro maior que 1}
  2. B={x|X é 36}
  3. C={x|x é um número natural negativo}
  4. D={ }
  5. E={2,3}
  6. F={x|x é a solução da equação \(x^{2}-5x+6=0\)}
  7. G={x|x é primo e divisor de 84}
  8. H={2, 3, …}
  9. I={6}
  10. J={2, 3, 7}
  1. Classifique as afirmações abaixo em verdadeira ou falsa.
  1. Se A={x|x é primo e \(14<x<17\)}, então A é vazio.
  2. Todo conjunto unitário possui mais de um elemento.
  3. A equação \(3x+20=0\) não possui solução no conjunto dos números naturais.
  4. O conjunto solução da equação \(x^{2}=0\) é vazio.

Criando diagramas Venn no R

Para criamos diagramas Venn no R vamos utilizar um package chamado VennDiagram. Iniciamos abrindo o RStuido e depois carregando o VennDiagram digitando:

library(VennDiagram)

Uma vez carregado o package podemos começar as representações. Vamos iniciar representando apenas um conjunto. Para isso primeiro vamos delimitar o número de elementos do conjunto para depois fazermos a sua representação com a ajuda do VennDiagram. Neste caso vamos armazenar o número de elementos na variável a porém poderíamos informar diretamente na linha de comando.

a1<- 22
draw.single.venn(area = a1, category = "Area 1")

Algumas características do diagrama criado podem ser alteradas pelos seguintes comandos:
lty = retira a linha ou altera a cor
fill = cor de preenchimento
alpha = transparência

draw.single.venn( area = a1, category = "Area 1", lty = "blank", fill = "blue", alpha =.3)

Depois de aprender a fazer a representação do diagrama de um conjunto vamos passar para o passo seguinte que é representar dois conjuntos. A primeira coisa a fazer é criar o vetor indicando a quantidade de elementos do segundo conjunto a2<- 20.

Feita a criação do segundo vetor vamos criar o diagrama com dois conjuntos.

draw.pairwise.venn(area1 = a1, area2 = a2, cross.area = 11, category = c("Area 1", "Area 2"))

Da mesma forma como foi feito com a represntação de um único conjunto também podemos alterar a cor de preenchimento, as linhas e a transparência repectivamente com fill, lty e alpha. Contudo, aqui também incluímos o parâmetro cat.pos que define a posição das legendas dos conjuntos e varia entre 0 e 360 graus.
Observe que indicamos através das variáveis a1 e a2 a quantidade de elementos dos conjuntos e a quantidade de elementos da interseção é indicada no parâmetro cross.area dentro do comando draw.pairwise.venn. Contudo, como já mencionado, em construções simples poderíamos indicar diretamente no comando draw.pairwise.venn todos os valores.

A seguir vamos refazer o diagrama anterior alterando algumas características.

draw.pairwise.venn(a1, a2, 11, category = c("Area 1", "Area 2"), lty = rep("blank", 2), fill = c("light blue", "red"), alpha = c(0.3, 0.2), cat.pos = c(0, 0))

Se quisermos fazer a representação de dois conjuntos disjuntos, ou seja, que não possuem nenhuma interseção devemos definir o parâmetro cross.areacomo 0, para indicar que não existem elementos em comum.

draw.pairwise.venn(area1 = a1, area2 = a2, cross.area = 0, category = c("Area 1", "Area 2"), cat.pos = c(0, 180))

Então… agora vamos começar a deixar as coisas um pouco mais complexas com a representação de 3 conjuntos.
Da mesma forma como foi feito antes, uma vez que vamos reaproveitar os dois vetores anteriormente criados, o primeiro passo é criar o vetor indicativo da quantidade de elementos do terceiro conjunto a3<- 14.

Na sequência usamos a função draw.triple.venndo package VennDiagram para fazer a representação desejada mas, observe que é necessário indicar também o valor das interseções entre os três conjuntos nos parâmetros n12, n23, n13 e n123.

draw.triple.venn(area1 = a1, area2 = a2, area3 = a3, n12 = 11, n23 = 4, n13 = 5, n123 = 2)

Para adicionar alguns efeitos que ajudam na hora de analisar o diagrama podemos proceder da mesma forma como foi feito com os diagramas mais simples.

draw.triple.venn(area1 = a1, area2 = a2, area3 = a3, n12 = 11, n23 = 4, n13 = 5, n123 = 2, category = c("Area 1", "Area 2", "Area 3"), lty = "blank", fill = c("skyblue", "yellow", "pink"))

Automatizando a contagem dos elementos de um conjunto

Já vimos como criar diagramas utilizando o package VennDiagram vamos tormar o processo um pouco mais automatizado e interessante, com o R não só podemos criar os diagramas mas também faze-lo contar os elementos de cada conjunto e suas respecitivas interseções utilizando os comandos que aprendemos há pouco.
Antes de tudo primeiro criaremos quatro vetores e também uma paleta de cores. Os vetores serão os nossos conjuntos e cada um terá 300 números, sorteados pelo R aleatóriamente entre 1 e 1000.
Uma paleta é um conjunto de corres que usaremos para representar os conjuntos quando criarmos os diagramas. Note que não precisamos definir uma paleta pois o R já tem cores pré-definidas contudo, como desejamos mostrar que é possível escolher as cores adotamos este procedimento.

set1<- sample(1:1000, 300)
set2<- sample(1:1000, 300)
set3<- sample(1:1000, 300)
set4<- sample(1:1000, 300)
colors<- c("#6b7fff", "#c3db0f", "#ff4059", "#2cff21")

Para calcularmos as quantidades de elementos de cada vetor utilizaremos a função length e, para encontrarmos a interseção dos conjuntos criados(vetores) usaremos a função intersect que encontra a interseção entre os conjuntos.

length(set1)
## [1] 300
intersect(set1, set2)
##   [1] 126 548 841 319 778 385 365 278 975  23 499 545 656 665 430 706  14 387
##  [19] 158 803 433 853 624 847 529 807 637 349 550 241 777  37 252 884 395 400
##  [37] 298 393 754 474 618 384 956 675 748 905 170 625  11 686 865 161 696 538
##  [55] 750 789 549 668 991 709 405 180 729 216 146 813 685  87 796 143 479 100
##  [73] 531 855  30  25 207 144 678 133 497  81 375 348 186 580 332 942 175 899
##  [91]   4 773 936 999 774 911   2 972 863 705
length(intersect(set1, set2))
## [1] 100

Os resultados apresentados acima exemplicam o uso das funções lengthe intersecte como podemos utilizá-las, ficando como exercício verificar as outras relações.

Podemos agora então adaptar o comando draw.triple.venn para fazer todo o trabalho.

draw.triple.venn(area1 = length(set1), area2 = length(set2), area3 = length(set3), n12 = length(intersect(set1, set2)), n23 = length(intersect(set2, set3)), n13 = length(intersect(set1, set3)), n123 = length(intersect(intersect(set1, set2), set3)), category = c("Set 1", "Set 2", "Set3"), fill = colors[1:3])

Como podemos verificar os resultados?

Para saber quem, qual caso, corresponde as características pesquisadas podemos usar o comando which. Neste primeiro exemplo existe apenas um caso que cumpre os três critérios estabelecidos. A função irá retornar qual é este caso.

which((dante$cabelo == "loiro" & dante$hobby == "musica" & dante$desempenhomat == "bom"))
## [1] 2

Neste segundo exemplo dois casos irão cumprir os dois critérios de busca.

which (dante$cabelo == "loiro" & dante$hobby == "musica")
## [1]  2 16

Mas e se eu quiser visualizar estes casos? Observe que o comando whichapenas indica qual é mas não o exibe na tela.

dante[which((dante$cabelo == "loiro" & dante$hobby == "musica" & dante$desempenhomat == "bom")),]
##    nome sexo idade altura peso irmaos cabelo  hobby sapato manequim
## 2 Artur    M    16    174   71      1  loiro musica     40       40
##   desempenhomat
## 2           bom

O caso exibido acima mostra a segunda linha do dataframe que apenas havia sido indicada anteriormente. Por outro lado o exemplo a seguir apresentará os dois casos identificados no segundo exemplo da função which.

dante[which (dante$cabelo == "loiro" & dante$hobby == "musica"),]
##     nome sexo idade altura peso irmaos cabelo  hobby sapato manequim
## 2  Artur    M    16    174   71      1  loiro musica     40       40
## 16 Mauro    M    15    168   59      3  loiro musica     39       40
##    desempenhomat
## 2            bom
## 16  insuficiente

Eventualmente pode ser necessário que se faça uma ordenação do dataframe. Isso pode ajudar a verificar quais casos cumpriam certos critérios. Para fazer isso podemos usar o comando order.

dante[order(dante$idade),]
##        nome sexo idade altura peso irmaos   cabelo    hobby sapato manequim
## 5     Carla    F    14    168   60      1    loiro basquete     27       40
## 3     Aurea    F    15    163   61      0    loiro ciclismo     36       42
## 16    Mauro    M    15    168   59      3    loiro   musica     39       40
## 2     Artur    M    16    174   71      1    loiro   musica     40       40
## 4     Bruno    M    16    164   61      0 castanho  futebol     37       42
## 14    Lucia    F    16    162   57      1 castanho   musica     35       38
## 15   Marcia    F    16    174   60      4    preto ciclismo     38       38
## 13    Laura    F    17    168   57      2    preto  futebol     36       36
## 12     Jose    M    18    171   65      2    preto  futebol     40       40
## 20    Vania    F    18    173   63      2 castanho  futebol     39       40
## 6   Claudia    F    19    165   58      1    ruivo basquete     35       36
## 10 Fernanda    F    19    169   72      2    preto   musica     38       44
## 18 Patricia    F    20    170   59      0    loiro      ler     38       38
## 17    Nivea    F    21    172   61      2 castanho      ler     37       38
## 1   Antonio    M    22    169   70      2 castanho   musica     38       38
## 11  Geraldo    M    22    173   83      0 castanho      ler     39       46
## 9    Flavia    F    27    162   61      2    loiro  corrida     38       42
## 19    Paula    F    27    164   56      1    loiro  corrida     35       36
## 8     Edite    F    29    159   61      3 castanho      ler     37       40
## 7  Domingos    M    34    177   82      1 castanho  futebol     41       44
##    desempenhomat
## 5        regular
## 3   insuficiente
## 16  insuficiente
## 2            bom
## 4          otimo
## 14           bom
## 15       regular
## 13           bom
## 12           bom
## 20           bom
## 6            bom
## 10       regular
## 18         otimo
## 17           bom
## 1          otimo
## 11           bom
## 9          otimo
## 19       regular
## 8          otimo
## 7   insuficiente

Já se precisarmos fazer a ordenção em ordem descrescente.

dante[order(dante$idade, decreasing = TRUE),]
##        nome sexo idade altura peso irmaos   cabelo    hobby sapato manequim
## 7  Domingos    M    34    177   82      1 castanho  futebol     41       44
## 8     Edite    F    29    159   61      3 castanho      ler     37       40
## 9    Flavia    F    27    162   61      2    loiro  corrida     38       42
## 19    Paula    F    27    164   56      1    loiro  corrida     35       36
## 1   Antonio    M    22    169   70      2 castanho   musica     38       38
## 11  Geraldo    M    22    173   83      0 castanho      ler     39       46
## 17    Nivea    F    21    172   61      2 castanho      ler     37       38
## 18 Patricia    F    20    170   59      0    loiro      ler     38       38
## 6   Claudia    F    19    165   58      1    ruivo basquete     35       36
## 10 Fernanda    F    19    169   72      2    preto   musica     38       44
## 12     Jose    M    18    171   65      2    preto  futebol     40       40
## 20    Vania    F    18    173   63      2 castanho  futebol     39       40
## 13    Laura    F    17    168   57      2    preto  futebol     36       36
## 2     Artur    M    16    174   71      1    loiro   musica     40       40
## 4     Bruno    M    16    164   61      0 castanho  futebol     37       42
## 14    Lucia    F    16    162   57      1 castanho   musica     35       38
## 15   Marcia    F    16    174   60      4    preto ciclismo     38       38
## 3     Aurea    F    15    163   61      0    loiro ciclismo     36       42
## 16    Mauro    M    15    168   59      3    loiro   musica     39       40
## 5     Carla    F    14    168   60      1    loiro basquete     27       40
##    desempenhomat
## 7   insuficiente
## 8          otimo
## 9          otimo
## 19       regular
## 1          otimo
## 11           bom
## 17           bom
## 18         otimo
## 6            bom
## 10       regular
## 12           bom
## 20           bom
## 13           bom
## 2            bom
## 4          otimo
## 14           bom
## 15       regular
## 3   insuficiente
## 16  insuficiente
## 5        regular

Outra função que pode ajudar, caso se deseje verificar quais casos estão cumprindo certos critérios, é a função table. Principalmente para fazermos tabelas cruzando duas ou mais variáveis.

table(dante$desempenhomat, dante$sexo)
##               
##                F M
##   bom          5 3
##   insuficiente 1 2
##   otimo        3 2
##   regular      4 0

Uma outra função que pode, eventualmente, ajudar a veririficar quantos casos(individuos) estão em cada subconjunto é a função summary.

summary(dante)
##      nome               sexo               idade           altura     
##  Length:20          Length:20          Min.   :14.00   Min.   :159.0  
##  Class :character   Class :character   1st Qu.:16.00   1st Qu.:164.0  
##  Mode  :character   Mode  :character   Median :18.50   Median :168.5  
##                                        Mean   :20.05   Mean   :168.2  
##                                        3rd Qu.:22.00   3rd Qu.:172.2  
##                                        Max.   :34.00   Max.   :177.0  
##       peso           irmaos       cabelo             hobby          
##  Min.   :56.00   Min.   :0.0   Length:20          Length:20         
##  1st Qu.:59.00   1st Qu.:1.0   Class :character   Class :character  
##  Median :61.00   Median :1.5   Mode  :character   Mode  :character  
##  Mean   :63.85   Mean   :1.5                                        
##  3rd Qu.:66.25   3rd Qu.:2.0                                        
##  Max.   :83.00   Max.   :4.0                                        
##      sapato         manequim    desempenhomat     
##  Min.   :27.00   Min.   :36.0   Length:20         
##  1st Qu.:36.00   1st Qu.:38.0   Class :character  
##  Median :38.00   Median :40.0   Mode  :character  
##  Mean   :37.15   Mean   :39.9                     
##  3rd Qu.:39.00   3rd Qu.:42.0                     
##  Max.   :41.00   Max.   :46.0

Especifiamente, caso seja necessário calcular estatisticas por variável mas divididas por subgrupos podemos empregar o comando tapply. Contudo observe que a função indicada para ser aplicada precisa estar adequada ao tipo de dado que consta da varíavel em análise.

tapply(dante$idade, dante$sexo, mean)
##        F        M 
## 19.84615 20.42857

Ou então:

tapply(dante$desempenhomat, dante$sexo, summary)
## $F
##    Length     Class      Mode 
##        13 character character 
## 
## $M
##    Length     Class      Mode 
##         7 character character

Referências

BECHER, E. L.; MACHADO, L. B. Conhecendo o software R e suas possibilidades para o ensino de Estatística. In.: Anais do XIII Encontro Gaúcho de Educação Matemática. Santa Maria, 2018.

Quando um conjunto A é subconjunto de um conjunto B?

Subconjuntos. Quando todos os elementos de um conjunto A qualquer pertencem a um outro conjunto B, diz-se, então, que A é um subconjunto de B, ou seja A B.

Quantos subconjuntos tem o conjunto a?

Se um conjunto A possui n elementos, então o número de subconjuntos de A é igual 2n. São 3 elementos. Portanto teremos 2³ subconjuntos de B, ou seja, a partir do conjunto B podem ser formados 8 subconjuntos.

Quando um conjunto é subconjunto?

Definição de subconjuntos Dados os conjuntos A e B, dizemos que B é subconjunto de A se todos os elementos de B também forem elementos de A. Nesse caso, temos: Podemos ler essa definição da seguinte maneira: B é subconjunto de A se, e somente se, para todo x, se x pertence ao conjunto A, então x pertence ao conjunto B.

O que entendemos por conjunto diferença entre A é B?

A diferença entre A e B é o conjunto formado pelos elementos que pertencem a A e não pertencem a B. Notação A – B.