Este documento descreve a análise exploratória de dados de um conjunto de dados educacionais português e de matemática. Os dados foram importados e concatenados em uma única estrutura de dados com 1044 instâncias e 30 atributos, excluindo as variáveis de classe. As variáveis de classe foram armazenadas separadamente em uma estrutura com 3 colunas.
3. 22/04/22, 21:43 Descri_Check-point_2.ipynb - Colaboratory
https://colab.research.google.com/drive/1UCxicvH4joF0Yp7powygIxQ6waCb09V-#scrollTo=ae68b337&printMode=true 3/24
school sex age address famsize Pstatus Medu Fedu Mjob Fjob ... famrel freetime goout Dalc Walc health
0 GP F 18 U GT3 A 4 4 at_home teacher ... 4 3 4 1 1 3
1 GP F 17 U GT3 T 1 1 at_home other ... 5 3 3 1 1 3
2 GP F 15 U LE3 T 1 1 at_home other ... 4 3 2 2 3 3
3 GP F 15 U GT3 T 4 2 health services ... 3 2 2 1 1 5
4 GP F 16 U GT3 T 3 3 other other ... 4 3 2 1 2 5
... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
644 MS F 19 R GT3 T 2 3 services other ... 5 4 2 1 2 5
645 MS F 18 U LE3 T 3 1 teacher services ... 4 3 4 1 1 1
646 MS F 18 U GT3 T 1 1 other other ... 1 1 1 1 1 5
647 MS M 17 U LE3 T 3 1 services services ... 2 4 5 3 4 2
648 MS M 18 R LE3 T 3 2 services other ... 4 4 1 3 4 5
649 rows × 33 columns
#Vamos incluir uma coluna com o nome do curso ('Matemática ou Português')
port.insert(30,'Course Subject','Portuguese')
display(port)
4. 22/04/22, 21:43 Descri_Check-point_2.ipynb - Colaboratory
https://colab.research.google.com/drive/1UCxicvH4joF0Yp7powygIxQ6waCb09V-#scrollTo=ae68b337&printMode=true 4/24
school sex age address famsize Pstatus Medu Fedu Mjob Fjob ... famrel freetime goout Dalc Walc health
0 GP F 18 U GT3 A 4 4 at_home teacher ... 4 3 4 1 1 3
1 GP F 17 U GT3 T 1 1 at_home other ... 5 3 3 1 1 3
2 GP F 15 U LE3 T 1 1 at_home other ... 4 3 2 2 3 3
3 GP F 15 U GT3 T 4 2 health services ... 3 2 2 1 1 5
4 GP F 16 U GT3 T 3 3 other other ... 4 3 2 1 2 5
... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
644 MS F 19 R GT3 T 2 3 services other ... 5 4 2 1 2 5
645 MS F 18 U LE3 T 3 1 teacher services ... 4 3 4 1 1 1
646 MS F 18 U GT3 T 1 1 other other ... 1 1 1 1 1 5
647 MS M 17 U LE3 T 3 1 services services ... 2 4 5 3 4 2
648 MS M 18 R LE3 T 3 2 services other ... 4 4 1 3 4 5
649 rows × 33 columns
#Importando os dados do curso de matemática
mat=pd.read_csv('/student-mat.csv')
display(mat)
5. 22/04/22, 21:43 Descri_Check-point_2.ipynb - Colaboratory
https://colab.research.google.com/drive/1UCxicvH4joF0Yp7powygIxQ6waCb09V-#scrollTo=ae68b337&printMode=true 5/24
school sex age address famsize Pstatus Medu Fedu Mjob Fjob ... famrel freetime goout Dalc Walc health
0 GP F 18 U GT3 A 4 4 at_home teacher ... 4 3 4 1 1 3
1 GP F 17 U GT3 T 1 1 at_home other ... 5 3 3 1 1 3
2 GP F 15 U LE3 T 1 1 at_home other ... 4 3 2 2 3 3
3 GP F 15 U GT3 T 4 2 health services ... 3 2 2 1 1 5
4 GP F 16 U GT3 T 3 3 other other ... 4 3 2 1 2 5
... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
390 MS M 20 U LE3 A 2 2 services services ... 5 5 4 4 5 4
391 MS M 17 U LE3 T 3 1 services services ... 2 4 5 3 4 2
392 MS M 21 R GT3 T 1 1 other other ... 5 5 3 3 3 3
393 MS M 18 R LE3 T 3 2 services other ... 4 4 1 3 4 5
394 MS M 19 U LE3 T 1 1 other at_home ... 3 2 3 3 3 5
395 rows × 33 columns
#Adicionando a coluna "Subject course" para a base de dados de matemática
mat.insert(30,'Course Subject','Math')
school sex age address famsize Pstatus Medu Fedu Mjob Fjob ... freetime goout Dalc Walc health absenc
0 GP F 18 U GT3 A 4 4 at_home teacher ... 3 4 1 1 3
1 GP F 17 U GT3 T 1 1 at_home other ... 3 3 1 1 3
2 GP F 15 U LE3 T 1 1 at_home other ... 3 2 2 3 3
3 GP F 15 U GT3 T 4 2 health services ... 2 2 1 1 5
4 GP F 16 U GT3 T 3 3 other other ... 3 2 1 2 5
... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
390 MS M 20 U LE3 A 2 2 services services ... 5 4 4 5 4
391 MS M 17 U LE3 T 3 1 services services ... 4 5 3 4 2
392 MS M 21 R GT3 T 1 1 other other ... 5 3 3 3 3
393 MS M 18 R LE3 T 3 2 services other ... 4 1 3 4 5
394 MS M 19 U LE3 T 1 1 other at_home ... 2 3 3 3 5
395 rows × 34 columns
#Display com a inserção da nova coluna
display(mat)
6. 22/04/22, 21:43 Descri_Check-point_2.ipynb - Colaboratory
https://colab.research.google.com/drive/1UCxicvH4joF0Yp7powygIxQ6waCb09V-#scrollTo=ae68b337&printMode=true 6/24
#Juntando os dados para os cursos de português e matemática
students=pd.concat([mat,port],axis=0,ignore_index=True)
school sex age address famsize Pstatus Medu Fedu Mjob Fjob ... freetime goout Dalc Walc health absenc
0 GP F 18 U GT3 A 4 4 at_home teacher ... 3 4 1 1 3
1 GP F 17 U GT3 T 1 1 at_home other ... 3 3 1 1 3
2 GP F 15 U LE3 T 1 1 at_home other ... 3 2 2 3 3
3 GP F 15 U GT3 T 4 2 health services ... 2 2 1 1 5
4 GP F 16 U GT3 T 3 3 other other ... 3 2 1 2 5
... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
1039 MS F 19 R GT3 T 2 3 services other ... 4 2 1 2 5
1040 MS F 18 U LE3 T 3 1 teacher services ... 3 4 1 1 1
1041 MS F 18 U GT3 T 1 1 other other ... 1 1 1 1 5
1042 MS M 17 U LE3 T 3 1 services services ... 4 5 3 4 2
1043 MS M 18 R LE3 T 3 2 services other ... 4 1 3 4 5
1044 rows × 34 columns
display(students)
#Da base students, podemos selecionar apenas os atributos de cada estudante excluindo as classes que serão
#os valores a serem preditos do modelo. E então também podemos obter as classes separadamente
7. 22/04/22, 21:43 Descri_Check-point_2.ipynb - Colaboratory
https://colab.research.google.com/drive/1UCxicvH4joF0Yp7powygIxQ6waCb09V-#scrollTo=ae68b337&printMode=true 7/24
atributos=students.drop(columns=['Course Subject','G1','G2','G3'])
classes=students[['G1','G2','G3']]
Questão 1
#Resposta aos itens das questões 1
# Alternativa a)
#Determinando o número de atributos
num_atrib=len(atributos.columns) #O número de atributos é igual a 30
print('O número de atributos é igual a: ',num_atrib)
#Determinando o número de instâncias
num_instancias=len(atributos.index) #O número de instância é igual a 1044
print('O número de instâncias é igual a: ',num_instancias)
#Determinando o número de classes
num_classes=len(classes.columns) #O número de classes é igual a 30
print('O número de classes é igual a: ',num_classes)
O número de atributos é igual a: 30
O número de instâncias é igual a: 1044
O número de classes é igual a: 3
#Questão 1 item b)
#Vamos obter um info sobre a base atributos
atributos.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 1044 entries, 0 to 1043
9. 22/04/22, 21:43 Descri_Check-point_2.ipynb - Colaboratory
https://colab.research.google.com/drive/1UCxicvH4joF0Yp7powygIxQ6waCb09V-#scrollTo=ae68b337&printMode=true 9/24
#os atributos do tipo objeto são variáveis do tipo categórica
categorico=atributos.select_dtypes(include='object')
print('Os atributos do tipo categórico são: ', len(categorico.columns))
#Vamos ver os atributos que são do tipo inteiro
numerico=atributos.select_dtypes(include='int64')
print('Os atributos do tipo numerico são: ', len(numerico.columns))
#No entanto, apesar de 13 atributos aparecem como numéricos. No entanto, estes atributos são categóricos, uma vez que foram
#atributos a eles valores numéricos para especificar uma classe.
#Por exemplo o atributo Dalc correspondente ao consumo diário de alcool de cada estudante: onde 1 representa muito baixo
#e 5 representa muito alto. Isto, apesar de ser um número, na verdade se trata de uma variável categórica
#Assim sendo, na verdade apenas 2 atributos são numéricos verdadeiramente. Os quais são a idade ('age') e o número
#de faltas nas aulas ('Absences'). Posteriormente, estes dados serão transformados em numéricos
Os atributos do tipo categórico são: 17
Os atributos do tipo numerico são: 13
#Questão 1 c)
#Para os atributos categóricos
#Selecionando os indices dos atributos categóricos (excluindo age e absences)
index_cat=categorico.columns
#Criando um vetor de classes categoricas do tamanho do index_cat
classes_cat=np.zeros(len(index_cat))
#Calculando o número de classes existentes em cada variável categórica
for i in range(len(index_cat)):
classes_cat[i]=len(categorico.iloc[:,i].value_counts())
#Transformando a variável classes categóricas em uma série do Pandas
classes cat=pd.Series(classes cat,index=index cat)
10. 22/04/22, 21:43 Descri_Check-point_2.ipynb - Colaboratory
https://colab.research.google.com/drive/1UCxicvH4joF0Yp7powygIxQ6waCb09V-#scrollTo=ae68b337&printMode=true 10/24
school 2.0
sex 2.0
address 2.0
famsize 2.0
Pstatus 2.0
Mjob 5.0
Fjob 5.0
reason 4.0
guardian 3.0
schoolsup 2.0
famsup 2.0
paid 2.0
activities 2.0
nursery 2.0
higher 2.0
internet 2.0
romantic 2.0
dtype: float64
_ p ( _ , _ )
display(classes_cat) #Visualizando o número de classes existentes em cada variável categórica
#Questão 1 d) Variáveis numéricas
#Vamos passar o comando info para verificar o tipo das variáveis
display(numerico.info())
#Logo observa-se que todas as variáveis são escalares (não-vetores) do tipo inteira (Dtype: int64)
#Vamos passar o comando describe para ver as escalas presentes nos dados
display(numerico.describe())
11. 22/04/22, 21:43 Descri_Check-point_2.ipynb - Colaboratory
https://colab.research.google.com/drive/1UCxicvH4joF0Yp7powygIxQ6waCb09V-#scrollTo=ae68b337&printMode=true 11/24
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 1044 entries, 0 to 1043
Data columns (total 13 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 age 1044 non-null int64
1 Medu 1044 non-null int64
2 Fedu 1044 non-null int64
3 traveltime 1044 non-null int64
4 studytime 1044 non-null int64
5 failures 1044 non-null int64
6 famrel 1044 non-null int64
7 freetime 1044 non-null int64
8 goout 1044 non-null int64
9 Dalc 1044 non-null int64
10 Walc 1044 non-null int64
11 health 1044 non-null int64
12 absences 1044 non-null int64
dtypes: int64(13)
memory usage: 106.2 KB
None
age Medu Fedu traveltime studytime failures famrel freetime goout D
count 1044.000000 1044.000000 1044.000000 1044.000000 1044.000000 1044.000000 1044.000000 1044.000000 1044.000000 1044.000
mean 16.726054 2.603448 2.387931 1.522989 1.970307 0.264368 3.935824 3.201149 3.156130 1.494
std 1.239975 1.124907 1.099938 0.731727 0.834353 0.656142 0.933401 1.031507 1.152575 0.911
min 15.000000 0.000000 0.000000 1.000000 1.000000 0.000000 1.000000 1.000000 1.000000 1.000
25% 16.000000 2.000000 1.000000 1.000000 1.000000 0.000000 4.000000 3.000000 2.000000 1.000
50% 17.000000 3.000000 2.000000 1.000000 2.000000 0.000000 4.000000 3.000000 3.000000 1.000
75% 18.000000 4.000000 3.000000 2.000000 2.000000 0.000000 5.000000 4.000000 4.000000 2.000
max 22.000000 4.000000 4.000000 4.000000 4.000000 3.000000 5.000000 5.000000 5.000000 5.000
Como a maioria das variáveis númericas são representadas como categorias numéricas (0,1,2,3,4,5..). Logo, a escala fica na faixa que
corresponde a quantidade de classes existentes. Para a variável age que é verdadeiramente numérica, esta variável fica na faixa de 15 a 22
12. 22/04/22, 21:43 Descri_Check-point_2.ipynb - Colaboratory
https://colab.research.google.com/drive/1UCxicvH4joF0Yp7powygIxQ6waCb09V-#scrollTo=ae68b337&printMode=true 12/24
anos, que é idade aproximada de conclusão do ensino médio. Para a variável númerica absences (faltas) a ordem de grandeza está entre 0 a
75, que foram o menor e maior valor observado de faltas entre todos os alunos.
#Questão 1 e)
#Dados faltosos: Verificação pela função isnull
atributos.isnull().sum()
#Ou seja, observa-se pelo comando acima que a base de dados está limpa em termos de elementos faltantes, sendo
#zero para todas as variáveis (sejam elas categóricas ou numéricas)
school 0
sex 0
age 0
address 0
famsize 0
Pstatus 0
Medu 0
Fedu 0
Mjob 0
Fjob 0
reason 0
guardian 0
traveltime 0
studytime 0
failures 0
schoolsup 0
famsup 0
paid 0
activities 0
nursery 0
higher 0
internet 0
romantic 0
famrel 0
freetime 0
13. 22/04/22, 21:43 Descri_Check-point_2.ipynb - Colaboratory
https://colab.research.google.com/drive/1UCxicvH4joF0Yp7powygIxQ6waCb09V-#scrollTo=ae68b337&printMode=true 13/24
goout 0
Dalc 0
Walc 0
health 0
absences 0
dtype: int64
Questão 2
#A questão 2 envolve as primeiras manipulações com os dados para organizar a base:
#Vamos aplicar a transformação das variáveis discretas para numéricas
index_cat=categorico.columns
ordinal=OrdinalEncoder()
ordinal.fit(categorico)
cat_to_num=pd.DataFrame(ordinal.transform(categorico),columns=index_cat)
cat_to_num.head(10)
15. 22/04/22, 21:43 Descri_Check-point_2.ipynb - Colaboratory
https://colab.research.google.com/drive/1UCxicvH4joF0Yp7powygIxQ6waCb09V-#scrollTo=ae68b337&printMode=true 15/24
#Avaliando a base em termo das idades dos alunos
base_modificada['age'].value_counts(bins=5)
#Observa-se que há apenas 14 amostras entre as idades superiores a 19 até 22. Ou seja, serão eliminadas da base de dados
#valores de idade maiores que 19 anos, por não serem representativas na base
(14.992, 16.4] 475
(17.8, 19.2] 278
(16.4, 17.8] 277
(19.2, 20.6] 9
(20.6, 22.0] 5
Name: age, dtype: int64
#Removendo os dados de idade
BaseReduzida1=base_modificada.drop(base_modificada[base_modificada.age > 19].index)
#Observa que os 14 dados de idade acima de 19 anos foram eliminados
display(BaseReduzida1)
16. 22/04/22, 21:43 Descri_Check-point_2.ipynb - Colaboratory
https://colab.research.google.com/drive/1UCxicvH4joF0Yp7powygIxQ6waCb09V-#scrollTo=ae68b337&printMode=true 16/24
school sex address famsize Pstatus Mjob Fjob reason guardian schoolsup ... traveltime studytime failures fam
0 0.0 0.0 1.0 0.0 0.0 0.0 4.0 0.0 1.0 1.0 ... 2 2 0
1 0.0 0.0 1.0 0.0 1.0 0.0 2.0 0.0 0.0 0.0 ... 1 2 0
2 0.0 0.0 1.0 1.0 1.0 0.0 2.0 2.0 1.0 1.0 ... 1 2 3
3 0.0 0.0 1.0 0.0 1.0 1.0 3.0 1.0 1.0 0.0 ... 1 3 0
4 0.0 0.0 1.0 0.0 1.0 2.0 2.0 1.0 0.0 0.0 ... 1 2 0
... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
1039 1.0 0.0 0.0 0.0 1.0 3.0 2.0 0.0 1.0 0.0 ... 1 3 1
1040 1.0 0.0 1.0 1.0 1.0 4.0 3.0 0.0 1.0 0.0 ... 1 2 0
1041 1.0 0.0 1.0 0.0 1.0 2.0 2.0 0.0 1.0 0.0 ... 2 2 0
1042 1.0 1.0 1.0 1.0 1.0 3.0 3.0 0.0 1.0 0.0 ... 2 1 0
1043 1.0 1.0 0.0 1.0 1.0 3.0 2.0 0.0 1.0 0.0 ... 3 1 0
1030 rows × 30 columns
#Vamos avaliar agora a variável faltas absences
BaseReduzida1['absences'].value_counts(bins=4)
#Observa-se que 1003 dos 1030 dados restantes estão dispostos entre 0 a 18.75 faltas. Ou seja, isso quer dizer que igual
#acima de 19 faltas, há poucos dados que não são representativos no conjunto por isso serão excluídos.
(-0.076, 18.75] 1003
(18.75, 37.5] 22
(37.5, 56.25] 4
(56.25, 75.0] 1
Name: absences, dtype: int64
#Removendo os dados de absences
BaseReduzida1.drop(BaseReduzida1[BaseReduzida1.absences >= 19].index, inplace=True)
#Observa que os 26 dados de absences acima ou igual a 19 faltas foram eliminados
display(BaseReduzida1)
17. 22/04/22, 21:43 Descri_Check-point_2.ipynb - Colaboratory
https://colab.research.google.com/drive/1UCxicvH4joF0Yp7powygIxQ6waCb09V-#scrollTo=ae68b337&printMode=true 17/24
school sex address famsize Pstatus Mjob Fjob reason guardian schoolsup ... traveltime studytime failures fam
0 0.0 0.0 1.0 0.0 0.0 0.0 4.0 0.0 1.0 1.0 ... 2 2 0
1 0.0 0.0 1.0 0.0 1.0 0.0 2.0 0.0 0.0 0.0 ... 1 2 0
2 0.0 0.0 1.0 1.0 1.0 0.0 2.0 2.0 1.0 1.0 ... 1 2 3
3 0.0 0.0 1.0 0.0 1.0 1.0 3.0 1.0 1.0 0.0 ... 1 3 0
4 0.0 0.0 1.0 0.0 1.0 2.0 2.0 1.0 0.0 0.0 ... 1 2 0
... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
1039 1.0 0.0 0.0 0.0 1.0 3.0 2.0 0.0 1.0 0.0 ... 1 3 1
1040 1.0 0.0 1.0 1.0 1.0 4.0 3.0 0.0 1.0 0.0 ... 1 2 0
1041 1.0 0.0 1.0 0.0 1.0 2.0 2.0 0.0 1.0 0.0 ... 2 2 0
1042 1.0 1.0 1.0 1.0 1.0 3.0 3.0 0.0 1.0 0.0 ... 2 1 0
1043 1.0 1.0 0.0 1.0 1.0 3.0 2.0 0.0 1.0 0.0 ... 3 1 0
1003 rows × 30 columns
Como resultado do método de remoção de outliers a partir da contagem da frequência de aparição dos termos verdadeiramente numéricos
(age e absences). Foi possível remover 41 dados, trazendo a base de 1044 amostras para 1003 amostras, permanecendo com 30 atributos na
base de dados.
Questão 4
Questão 5
#Como métrica para seleção de determinados atributos, iremos utilizar um filtro baseada no coeficiente de
#Correlação de Pearson. A correlação de Pearson mede o grau de correlação linear entre duas variáveis
18. 22/04/22, 21:43 Descri_Check-point_2.ipynb - Colaboratory
https://colab.research.google.com/drive/1UCxicvH4joF0Yp7powygIxQ6waCb09V-#scrollTo=ae68b337&printMode=true 18/24
#Valores próximo a 1 indicam forte dependência linear positiva e valores próxima a -1 forte dependência linear negativa
#Valores de correlação perto de 0, indicam ausência de correlação linear.
#Obtém-se a correlação de Pearson diretamente pela função df.corr()
#Vamos importar a biblioteca matplotlib e seaborn para ver o gráfico de correlação
corr=BaseReduzida1.corr()
#Plot the heatmap of correlation matrix for features X
plt.figure(figsize=(25,18))
sns.heatmap(corr,annot=True,center=0)
19. 22/04/22, 21:43 Descri_Check-point_2.ipynb - Colaboratory
https://colab.research.google.com/drive/1UCxicvH4joF0Yp7powygIxQ6waCb09V-#scrollTo=ae68b337&printMode=true 19/24
<AxesSubplot:>
A partir da representação da Matriz de Correlação ( Perason) observa-se que a base acima é praticamente toda descorrelacionada. No
entanto, há dois termos de correlação cruzada que são maiores que 0.6. O que é uma correlação muito maior que os outros valores da base.
20. 22/04/22, 21:43 Descri_Check-point_2.ipynb - Colaboratory
https://colab.research.google.com/drive/1UCxicvH4joF0Yp7powygIxQ6waCb09V-#scrollTo=ae68b337&printMode=true 20/24
O primeiro termo de correlação cruzada entre fathers e mothers education que é igual a 0.65. Este fato deve ocorrer porque não é uma certa
tendência de que pessoas que tenham se formado no ensino superior se casem com pessoas de mesma condição, sendo que o mesmo
ocorre também para pessoas que não se formaram no ensino superior e tendem a casar com pessoas que também não tiveram acesso ao
ensino superior. Dessa forma, pode-se pressupor que ao utilizar apenas uma dessas métricas seja suficiente para a análise dos dados. Por
isso, será excluído fathers education, uma vez que usualmente a mãe em nossa sociedade é quem acaba tendo maior responsabilidade sobre
o filho. No entanto, ressalta-se que essa escolha é arbitrária e poderia ser mantida o atributo fathers education ao invés de mathers education.
O segundo termo de correlação cruzada alta é entre workday-alcohol-comsumption e weekend-alcohol-comsuption cujo valor é igual a 0.63.
Esta correlação alta infere-se com base no fato de que pessoas que consomem mais álcool em dias de semana (dias de trabalho) tendem a
também consumir mais álcool aos fins de semana. E como, o objetivo é predizer as notas finais dos cursos de matemática será escolhido
como atributo para se manter na base a variável Dalc (workday-alcohol-comsuption), uma vez que, se pressupõe que o consumo excessivo de
álcool durante a semana teria maior afeto na nota de um teste do que no consumo aos fins de semana.
Questão 6
#Eliminando os atributos Fedu e Walc
BaseReduzida2=BaseReduzida1.drop(columns=['Fedu','Walc'])
display(BaseReduzida2)
21. 22/04/22, 21:43 Descri_Check-point_2.ipynb - Colaboratory
https://colab.research.google.com/drive/1UCxicvH4joF0Yp7powygIxQ6waCb09V-#scrollTo=ae68b337&printMode=true 21/24
school sex address famsize Pstatus Mjob Fjob reason guardian schoolsup ... Medu traveltime studytime failure
0 0.0 0.0 1.0 0.0 0.0 0.0 4.0 0.0 1.0 1.0 ... 4 2 2
1 0.0 0.0 1.0 0.0 1.0 0.0 2.0 0.0 0.0 0.0 ... 1 1 2
2 0.0 0.0 1.0 1.0 1.0 0.0 2.0 2.0 1.0 1.0 ... 1 1 2
3 0.0 0.0 1.0 0.0 1.0 1.0 3.0 1.0 1.0 0.0 ... 4 1 3
4 0.0 0.0 1.0 0.0 1.0 2.0 2.0 1.0 0.0 0.0 ... 3 1 2
... ... ... ... ... ... ... ... ... ... ... ... ... ... ... .
1039 1.0 0.0 0.0 0.0 1.0 3.0 2.0 0.0 1.0 0.0 ... 2 1 3
1040 1.0 0.0 1.0 1.0 1.0 4.0 3.0 0.0 1.0 0.0 ... 3 1 2
1041 1.0 0.0 1.0 0.0 1.0 2.0 2.0 0.0 1.0 0.0 ... 1 2 2
1042 1.0 1.0 1.0 1.0 1.0 3.0 3.0 0.0 1.0 0.0 ... 3 2 1
1043 1.0 1.0 0.0 1.0 1.0 3.0 2.0 0.0 1.0 0.0 ... 3 3 1
1003 rows × 28 columns
Com isso a base reduzida eliminando os dois atributos anteriormente citados ficou com 1003 amostras e 28 atributos.
Questão 7
#Vamos aplicar a técnica de PCA para extração de atributos.
pca=PCA(n_components=12)
pca.fit(BaseReduzida2)
print('A porcentagem de variância explicada pelo PCA em cada direção ortogonal é: ',pca.explained_variance_ratio_)
print('A variância total explicada pelo modelo PCA é: ',np.sum(pca.explained_variance_ratio_),'%')
A porcentagem de variância explicada pelo PCA em cada direção ortogonal é: [0.52404636 0.06883044 0.06274128 0.04978905 0.03874
0.0271087 0.02447616 0.02240142 0.01944636 0.01814193 0.01709241]
A variância total explicada pelo modelo PCA é: 0.9095381871190333 %
Ou seja, transformando os 28 atributos (com 2 já removidos anteriormente - BaseReduzida2) do problema em 12 novas direções principais
que são combinações lineares destes 28 atributos. Será possível reduzir a dimensionalidade do problema original de 28 para 12 sem interferir
22. 22/04/22, 21:43 Descri_Check-point_2.ipynb - Colaboratory
https://colab.research.google.com/drive/1UCxicvH4joF0Yp7powygIxQ6waCb09V-#scrollTo=ae68b337&printMode=true 22/24
significativamente na variância captada pelo modelo. Uma vez que o modelo PCA com 12 atributos consegue explicar 90% do total variância
observada na base de dados original completa. A seguir iremos apresentar como a base de dados é transformada.
0 1 2 3 4 5 6 7 8 9 10 11
0 2.258322 1.144421 0.244795 -0.660412 -0.863878 0.508764 -0.738544 1.187843 -1.856944 -1.346022 -1.732801 -0.153472
1 0.155053 2.511152 -0.004079 0.513573 -0.315369 -0.570116 -1.368382 -0.206716 -0.688787 -0.042618 -0.044304 0.057420
2 6.191371 1.997491 0.808957 1.707169 0.845601 -1.750644 0.503036 -0.709853 0.240352 -0.180415 -0.020578 0.159295
3 -1.819603 -1.083187 -0.136213 2.501605 0.155695 -0.568213 0.044840 1.913987 -0.349452 -0.481550 -1.356821 0.483917
4 0.188476 -0.727425 -0.788204 1.844753 0.178152 -0.275915 -0.451374 0.260278 0.224789 -0.350927 -0.024004 -0.020368
... ... ... ... ... ... ... ... ... ... ... ... ...
998 0.251650 0.188222 -1.851403 0.240105 -0.436521 2.328089 -1.706025 -1.480079 0.789844 0.183064 -0.363848 0.585327
999 0.309896 -0.627946 1.717025 -1.893593 -2.276277 1.337052 -0.685832 -0.341805 -0.271531 0.800240 -0.008331 -0.660519
1000 2.240399 1.647629 -0.776463 3.178936 -1.325863 2.265280 1.538404 0.621457 1.156382 1.050953 -0.456935 -0.543449
1001 2.417901 -0.070697 0.262296 -2.685400 -2.119311 -0.216044 2.116586 0.433616 0.278001 0.053390 -0.221507 -0.312013
1002 0.299914 -0.306514 -1.977470 0.569296 -1.237650 1.480774 1.175720 -1.700767 0.523528 -1.392135 0.964070 1.329268
1003 rows × 12 columns
BaseReduzida3=pd.DataFrame(pca.fit_transform(BaseReduzida2))
display(BaseReduzida3)
Ou seja, eliminou-se de 28 atributos (BaseReduzida2) para 12 atributos (BaseReduzida3) captando 90% da variância explicada pelos dados
presentes na BaseReduzida2.
#Vamos por fim preencher a Tabela criando um dicionário e transformando em um dataframe
23. 22/04/22, 21:43 Descri_Check-point_2.ipynb - Colaboratory
https://colab.research.google.com/drive/1UCxicvH4joF0Yp7powygIxQ6waCb09V-#scrollTo=ae68b337&printMode=true 23/24
Número de Instâncias Número de Atributos
Base Original 1044 30
Base Reduzida 1 1003 30
Base Reduzida 2 1003 28
Base Reduzida 3 1003 12
colunas={'Número de Instâncias': ['1044','1003','1003','1003'],
'Número de Atributos': ['30','30','28','12']}
#Vamos agora transformar o dicionário em dataframe
tabela=pd.DataFrame(colunas,index=['Base Original','Base Reduzida 1','Base Reduzida 2','Base Reduzida 3'])
display(tabela)