Executando verificação de segurança...
0

Computação Científica e Análise de Dados - Utilizando Python para criar um modelo classificatório em uma base de dados de cursos online

1. Motivação e Regressão Logística

Suponha que você possua uma plataforma que oferece cursos online de tecnologia, chamada N_Tech, e um ótimo algoritmo de recomendação de cursos. A plataforma oferece acesso a todos os cursos por pacote (mensal, semestral e anual) ou acesso por curso (compra individual). A pergunta que fez o algoritmo de recomendação ser útil foi: “Quais cursos devo recomendar para quais alunos para que seja maximizada a probabilidade de compra dos cursos (seja adesão ao pacote ou individual) ?”.
No entanto, as perguntas tratadas e respondidas neste trabalho são: “Dado que um aluno comprou e está consumindo um (ou mais) curso(s), ele irá concluí-lo(s)? Quais as probabilidades dele concluir ou não ?”. Afinal, tão importante quanto vender um curso pode ser manter o aluno na plataforma (talvez até mais!). Pois, se a plataforma oferece acesso aos conteúdos por uma mensalidade e um determinado aluno não apresenta nenhuma chance de concluir os cursos que iniciou, é razoável supor que o mesmo pode cancelar a qualquer momento. Mas, caso haja um algoritmo esperto que classifica os alunos com base nas probabilidades de conclusão ou não conclusão do(s) curso(s), pode servir de base para, por exemplo, o time de negócios entrar em contato com o aluno e oferecer algum pacote com benefícios interessantes.
Durante o curso de Computação Científica e Análise de Dados, foram desenvolvidos temas como a Regressão Linear ou Não Linear que, dado um conjunto de dados, é possível prever o próximo elemento do conjunto. Por exemplo, com um conjunto de pares (tempo(h), temperatura(°C)), é possível prever a temperatura numa hora futura. Não irei aprofundar neste tema pois o objetivo é apenas chegar a Regressão Logística. Diferentemente das duas regressões citadas anteriormente, a Logística é um algoritmo de classificação. Nela, quando o modelo é treinado com um conjunto de dados, utiliza-se o modelo para classificar um dado entre 2 categorias (por isso, é conhecida como Regressão Logística Binária, porque classifica em uma categoria ou em outra, exclusivamente).
Apesar de ser um algoritmo de classificação, não de predição, nota se o termo regressão no nome, que remete a predição. Mas o nome é regressão logística porque é a função logística (sigmóide) aplicada à Regressão Linear!
p = 1 / (1 + e⁻y)
onde y é o da regressão linear e p é a probabilidade de uma dada instância pertencer a classe analisada.
Ou seja:
p = 1 / (1 + e⁻(b0+b1x1+...+bnxn))

2. Dataset

No contexto da N_Tech, o CTO fez um levantamento com vários dados de vários alunos, como o tempo dedicado ao curso, número de questionários respondidos, nota média dos questionários, entre outros, incluindo se o aluno terminou ou não o curso. Assim, após treinar o nosso modelo com os dados levantados, é possível passar um conjunto de dados referente a um aluno em um curso e o algoritmo irá retornar se o aluno concluirá ou não o curso, incluindo a probabilidade associada.
Os dados foram dispostos neste repositório e abaixo irei descrever melhor cada atributo presente na base de dados:
1. UserID: Identificador único do usuário.
2. CourseCategory - Categoria do curso (Programação, Negócios, Artes e etc.).
3. TimeSpentOnCourse - Tempo total investido pelo usuário no curso (em horas).
4. NumberOfVideosWatched - Número total de vídeos assistidos pelo usuário.
5. NumberOfQuizzesTaken - Número total de questionários realizados pelo usuário.
6. QuizScores - Nota média dos questionários (em percentual).
7. CompletionRate - Percentual de conclusão do curso para o usuário.
8. DeviceType - Tipo de dispositivo utilizado (Desktop ou Mobile).
9. CourseCompletion - Status de conclusão do curso (0: Não concluído | 1: Concluído). Este é nosso atributo alvo

Há 9.000 registros de alunos, então o modelo será treinado correlacionando os atributos TimeSpentOnCourse, NumberOfVideosWatched, NumberOfQuizzesTaken, QuizScores e CompletionRate com o atributo alvo CourseCompletion. Assim, quando eu passar estes dados de um novo aluno, o modelo será capaz de categorizar se este aluno pertence ao CourseCompletion = 0 ou CourseCompletion = 1, baseado nos dados do treinamento.

3. Análise exploratória dos dados

Antes de partir para o treinamento e os resultados, é importante tomar ciência de como estão os registros. Dessa forma, confira aqui os gráficos dos atributos destacados acima.

Histograma de Quantidade de Alunos por TimeSpentOnCourse

Onde o eixo Y é o número de alunos para cada valor no eixo X, que representa o número de horas que o aluno dedicou ao curso. Nota se que vai de zero a cem horas.

Histograma de Quantidade de Alunos por NumberOfVideosWatched

Onde o eixo Y é o número de alunos para cada valor no eixo X, que representa o número de videoaulas que o aluno assistiu no curso. Nota se que vai de zero a vinte vídeoaulas.

Histograma de Quantidade de Alunos por NumberOfQuizzesTaken

Onde o eixo Y é o número de alunos para cada valor no eixo X, que representa o número de questionários que o aluno respondeu no curso. Nota se que vai de zero a dez questionários.

Histograma de Quantidade de Alunos por QuizScores

Onde o eixo Y é o número de alunos para cada valor no eixo X, que representa a nota média dos questionários que o aluno respondeu no curso, em percentual.

Histograma de Quantidade de Alunos por CompletionRate

Onde o eixo Y é o número de alunos para cada valor no eixo X, que representa o percentual de conclusão do curso.

Histograma de Quantidade de Alunos por CourseCompletion

4. Treinamento e classificações

O scikitlearn disponibiliza o módulo LogisticRegression() que contém os métodos que serão utilizados neste projeto. Antes de utilizar qualquer método, é uma prática comum e necessária em ciência de dados dividir a base de dados em um conjunto para treinamento e outro para testes. No nosso contexto, X será a matriz, onde cada vetor representa os atributos de um aluno em um curso, com os atributos sendo os listados acima, exceto o atributo alvo e Y será um vetor do atributo alvo de cada aluno em cada curso, onde o modelo irá relacionar cada vetor de X com um elemento de Y. No código, é possível notar que 20% da base de dados será separada para o conjunto de testes.
Voltando aos métodos, o primeiro deles é o .fit(X_Treino), que treina o modelo com o conjunto de dados X_Treino. Após o treinamento, o próximo passo é tentar prever quais seriam as classificações dos nossos elementos do conjunto de testes, para compará-los com os valores reais. Para isso, faz se Y_Teste_Previsoes = Funcao_Logistica.predict(X_Teste) e então Y_Teste_Previsoes conterá as classificações de cada vetor de aluno de X_Teste.
Com isso, é possível comparar o vetor Y_Teste_Previsoes e Y_Teste e ver em quais classificações nosso modelo acertou. Confira aqui uma imagem retirada do notebook jupyter do projeto.

Com este modelo em mãos, é possível passar os dados de qualquer aluno de um dado curso e prever se o mesmo irá concluir ou não. Além disso, o scikitlearn também oferece o método .predict_proba(x_teste), que ao invés de retornar as previsões de classificação do conjunto, retorna as probabilidades de cada vetor de alunos do conjunto pertencer a uma classificação ou a outra.
A título de exemplo, criei os alunos Natan, Maria, João, Paulo e Pedro, que aderiram a um curso na plataforma após o levantamento dos dados, ou seja, nunca tiveram seus dados consumidos pelo modelo. Dessa forma, para mostrar a utilidade do modelo, este seria o retorno que o time de negócios ou marketing da N_Tech obteriam ao executar o modelo sob os dados destes alunos. Por fim, o output do modelo poderá ser utilizado para tomada de decisões e estratégias do negócio.

5. Acurácia e Matriz de Confusão

Apesar da penúltima imagem não convencer muito pois parece que o modelo erra mais que acerta, é importante recorrer a métricas confiáveis para determinar se o modelo é de fato ruim ou se é confiável. Para isso, usa-se a acurácia, que é, em outras palavras, a precisão do modelo. O método accuracy_score(y_teste, y_previsoes_teste) do scikitlearn calcula a acurácia com base nos valores reais e previstos. Dessa forma, o modelo obteve uma acurácia de aproximadamente 80%, que é um bom valor.
Além da acurácia, outra métrica interessante é a matriz de confusão, que exibe um comparativo entre os acertos e os erros para cada uma das duas categorias a serem previstas. A matriz de confusão que temos é:

[[931 143]
 [216 510]]

Onde lê-se: 931 previsões iguais a zero onde os valores reais eram iguais a zero (Acerto), 143 previsões iguais a zero onde os valores reais eram iguais a um (Falso Negativo),
216 previsões iguais a um onde os valores reais eram iguais a zero (Falso Positivo) e
510 previsões iguais a um onde os valores reais eram iguais a um (Acerto);
Disso, pode se afirmar que o modelo é mais assertivo no caso onde o aluno não conclui o curso. Para justificar esse fato, devemos lembrar que a base de dados não é igualmente dividida entre alunos que concluíram e não concluíram. Pelo Histograma de Quantidade de Alunos por CourseCompletion é possível notar que há mais registros de alunos que não concluíram o curso, então o modelo contou com mais dados de treinamento, melhorando a acurácia desse caso. Ou seja, se houvesse mais dados de alunos que concluíram o curso, o modelo seria mais assertivo também neste caso, melhorando a acurácia total.

Referências

REMIGIO, Matheus. Regressão Logística — Logistic Regression. Medium. 17 de Agosto de 2020. Disponível em: . Acesso em 14 de julho de 2024

Data Viking. Youtube, 202. Curso Machine Learning - Regressão Logística - Python. Disponível em . Acesso em 03 de Julho de 2024.

Carregando publicação patrocinada...