sexta-feira, 18 de novembro de 2022

Boxplot (diagrama de caixa)

O boxplot – ou diagrama de caixa – é uma ferramenta gráfica da estatística descritiva que facilita a análise de variáveis quantitativas. Por ele se obtém informações sobre posição, dispersão, assimetria e valores extremos ou atípicos (outliers).

A construção do boxplot utiliza cinco medidas estatísticas: mínimo, máximo, mediana, primeiro quartil e terceiro quartil.

A caixa é delimitada pelos primeiro e terceiro quartis e é cortada pela mediana. As linhas são conhecidas como caudas da distribuição e indicam os limites superior e inferior da variável, isto é,  maior e menor valores desconsiderados os outliers.

Dado um conjunto ordenado de dados, o 1º quartil (ou quartil inferior) representa o valor observado aos 25% dos valores; o 2º quartil é a mediana (50% das observações são menores e 50% são maiores do que a mediana); e o 3º quartil (ou quartil superior) é o valor que aparece aos 75% da amostra.  

R facilita a criação do boxplot a partir de um vetor, conforme a figura abaixo.



Algoritmo Bubble Sort: implementação em R

O bubble sort é um algoritmo de ordenação simples e pouco eficiente.

Dado um vetor de tamanho n, percorrem-se seus elementos n-1 vezes, comparando-se os elementos adjacentes de 2 a 2. 

Se o segundo elemento desta comparação for menor do que o primeiro, o algoritmo troca a posição de ambos. 

A operação se repete até que todos os elementos estejam ordenados.

Abaixo, a implementação em R, em duas versões.

Observe que, na segunda, o programa testa condição para verificar se foi feita alguma troca na passagem e se encerra antecipadamente no caso de o vetor já estar completamente ordenado.




domingo, 6 de novembro de 2022

Rodando o RStudio no Docker

1. Tendo o Docker Desktop instalado no seu computador(1), baixe a imagem escolhida. No caso, vamos usar a rocker/rstudio. Então, no terminal (prompt de comando), digite:

docker pull rocker/rstudio


2. Instale e rode o contêiner digitando o seguinte comando no prompt de comando:


docker run --name rstudio01 -d -p 8787:8787 -v C:\Users\jepim\Desktop\ufv:/home/rstudio -e PASSWORD=rstudio rocker/rstudio


Obs.:

Nomeie o contêiner como preferir. No caso, usamos rstudio01

Substitua C:\Users\jepim\Desktop\ufv pelo caminho da pasta local que será acessada pelo contêiner


- -name: dá um nome para o contêiner

-d: “detached” (execução em segundo plano, sem os logs)

-p: seleção das portas (local e do contêiner)

-v: volumes (relaciona uma pasta local à uma pasta do contêiner)

-e: define variáveis de ambiente




3. Abra o navegador e acesse o RStudio em http://localhost:8787/


Username > rstudio


Password > rstudio






sexta-feira, 4 de novembro de 2022

Como usar o 'R' no Google Colab

Por padrão, o Google Colab roda o Python nas linhas de código.

Para criar um notebook com o interpretador R, basta usar o seguinte link e editar normalmente o seu código:

https://colab.research.google.com/notebook#create=true&language=r




domingo, 23 de outubro de 2022

Operações básicas com matrizes usando o NumPy

O NumPy (Numerical Python) é bastante eficiente no processamento de arrays.

Seu principal objeto é o N-dimensional array (ndarray) ou tensor. 

Matrizes são tensores com 2 dimensões (tensores de rank 2), de aplicação muito frequente.

Neste notebook reunimos as operações matriciais mais básicas do NumPy para o estudo do tema.

Para saber mais: http://www.opl.ufc.br/pt/post/numpy/

------------------------

import numpy as np


# Criando as matrizes

A = np.array([[1, -2, 3], [2, 0, 4]])

B = np.array([[2, 2, -4], [-1, 1, 0]])

display(A, B)


# Soma de matrizes

display(A+B)


# Subtração de matrizes

display (A-B)


# Multiplicação de uma matriz por um escalar

k = 3

display (k*A)


# Matriz oposta (de A)

display(-A)


# Multiplicação de matrizes

A = np.array([1, 2, 3])

B = np.array([[4], [5], [6]])

display(A, B)

display(A.dot(B))


# Criação de matriz identidade

I = np.identity(3)

display(I)


# Matriz inversa

A = np.array([[3, -2], [-1, 1]])

B = np.array([[1,2],[1,3]])

print('Inversas:')

display(np.linalg.inv(A))

display(np.linalg.inv(B))


# Matriz singular (não tem inversa)

A = np.array([[6, 3], [2, 1]])

display(np.linalg.inv(A))  # LinAlgError: Singular matrix


# Determinante de uma matriz quadrada

A = np.array([[2, 4], [-3, -1]])

display(np.linalg.det(A))

sábado, 22 de outubro de 2022

Descriptografando os dados de login salvos pelo Chrome

O Chrome oferece a facilidade de salvar senhas dos sites visitados.

As senhas são armazenadas no formato do SQLite3 (figura abaixo). No Windows, o banco de dados pode ser localizado em C:\Users\<nome do usuário>\AppData\Local\Google\Chrome\User Data\Default\Login Data.

Selecionando-se os campos action_url, username_value, password_value da tabela logins, obtemos as urls, usuários e senhas (criptografadas em AES).

A criptografia AES é do tipo simétrico. Isso quer dizer que a mesma chave é usada para criptografar e descriptografar o texto. Para aumentar a segurança, o processo de encriptação usa um "vetor de inicialização" (IV),  que corresponderá aos caracteres das posições 4-20 recuperados de password_value. A senha cifrada corresponderá aos caracteres da posição 21-(N-16), sendo N a última posição da "string".

A chave de criptografia/descriptografia está localizada no arquivo JSON existente em C:\Users\<nome do usuário>\AppData\Local\Google\Chrome\User Data\Local State, precedida da chave encrypted_key.

O código publicado no GitHub, escrito em Python, encontra a chave no arquivo Local State e a utiliza para descriptografar as senhas (password_value) da tabela logins do arquivo Login Data (banco de dados do SQLite3). 

Repositório: https://github.com/jespimentel/chrome-passwords

Referências: 



quarta-feira, 12 de outubro de 2022

Lista de datas com Python

O Python possui nativamente o módulo datetime, para trabalhar com datas e tempo.

O problema a ser resolvido demandava a criação de uma lista de datas (em formato ISO 8601) que compreendesse todos os dias entre uma data informada e o dia de hoje.

Foram usadas os seguintes métodos:

datetime.now(): para retornar a data/hora corrente;

datetime.strptime(): para retornar um data/hora no formato informado; 

datetime.timedelta(): para retornar a diferença entre datas.

Depois de obtida a diferença de dias entre a data fornecida e a atual (n), cria-se a lista a partir de um iterador finito (for ... in ...), que incrementa 1 dia a partir da data inicial e até o dia n+1.