Category

Hackeando o R

Análise de Fundos Imobiliários com R e Python

By | Hackeando o R, Python

Fundos Imobiliários são fundos de investimentos que compreendem empreendimentos imobiliarios, sejam em sua forma física (tijolo) ou em títulos financeiros viculados ao mercado imobiliário (papel). No post de hoje, mostraremos como criar um análise dos retornos de fundos imobiliário utilizando o R e o Python.

O objetivo do post será construir um código em R e Python para analisar o retorno e o risco de cinco fundos imobiliários escolhidos aleatoriamente no período de 01/07/2021 até 01/07/2022. Trataremos da importação dos preços dos fundos, do calculo do retorno mensal, anualizado e acumulado, e por fim do desvio padrão anualizado (como medida de risco passado). Iremos também construir gráficos para entender os resultados obtido.

Análise com o R

No R, iremos utilizar o pacote {tidyquant}, que funciona como um wrapper de funções de outro pacotes de manipulação e cálculo de dados financeiros. O {tidyquant} permitirá utilizarmos os dados em uma estrutura tidy.

Análise com o Python

No Python, importaremos os dados com a biblioteca pandas datareader e o yfinance, bem como utilizaremos o pandas e o numpy para realizar o cálculos dos retornos e do desvio padrão.

__________________________________________________

Quer saber mais?

Veja nossos cursos da trilha de Finanças Quantitativas.

_________________________________________________

O que é Teste de Hipóteses

By | Hackeando o R

Teste de hipóteses é uma formulação estatística que visa confirmar ou negar determinada suposição de uma população, utilizando dados amostrais. A condução desse tipo de teste é de extrema importância para a área cientifica e de análise de dados, visto que é através destes métodos que pode-se estabelecer com maior confiança a afirmação de uma suposição. Neste post de hoje, introduziremos o teste de hipóteses e realizaremos um exemplo utilizando o R.

Ao analisarmos qualquer fato da vida real, sempre realizamos suposições, de forma a tentar estabelecer o que pode ser verdadeiro ou falso. De fato, através de interpretações e da lógica, podemos supor e inferir sensos comuns, entretanto, podemos realmente afirmar tudo desta forma?

As Hipóteses que criamos a partir desses sensos podem, de fato, serem testadas, através de métodos estatísticos. Utilizaremos um exemplo neste instante: ao pensarmos em todos os fatos históricos e sociais, (a depender, vivência) podemos supor que homens tendem a serem promovidos em uma proporção maior que mulheres. De fato, essa e qualquer suposição podem carregar altas cargas de subjetividade, então como podemos nos livrar ao máximo dessa subjetividade e afirmar com alta certeza uma suposição?

Para obter uma ideia sobre como podemos realizar esse procedimento, realizamos o Teste de Hipóteses, no qual podemos separar em sete passos.

Hipótese

A Hipótese, como dito, é uma suposição, e essa suposição é um parâmetro de população.  Obviamente, não iremos conseguir realizar um teste na população, portanto, é necessário utilizar uma amostra para estimar esse ponto. Ou seja, através de um parâmetro populacional estabelecido, iremos estimar o seu ponto amostral. Existem diversos parâmetros populacionais. Abaixo elencamos três importantes.

Parâmetro Populacional Notação Ponto Estimado Símbolos
Proporção da População \rho Proporção da Amostra \hat{\rho}
Média populacional \mu Média amostral Média populacional\hat{\mu}
Diferença na proporção da população \rho_1 - \rho_2 Diferença na proporção da amostra \hat{\rho_1 }- \hat{\rho_2}

No exemplo acima, o parâmetro da população de interesse é a diferença na proporção de populações \hat{\rho_1 }- \hat{\rho_2}
$$. Devemos utilizar desse meio para realizar um estudo.

Teste de Hipótese

O Teste de Hipótese  consiste em teste entre duas hipóteses (suposições) que competem entre si:

  • A Hipótese Nula (H0),  supõe que não há nenhum efeito ou diferença de um grupo para outro. Representa que "não há nada acontecendo".
  • A Hipóteses Alternativa (Ha) é a suposição que "compete" com a Hipótese Nula, e tenta se opor a ela.

Sendo assim, é possível criar as Hipóteses da seguinte maneira:

  1. H0: homens e mulheres são promovidos na mesma taxa.
  2. Ha: homens são promovidos a uma taxa maior que mulheres
  3. Ha: mulheres são promovidas a uma taxa maior que homens
  4. Ha: Há uma diferença na taxa de promoção de mulheres em relação aos homens.

A escolha das hipóteses acima será crucial para a montagem e verificação do estudo, bem como cada hipótese será analisada de uma forma diferente, a depender da forma que foi criada.  Se a busca é por uma diferença na proporção de homens que são promovidos a uma taxa maior que mulheres,  significa que a hipótese é unicaudal (o mesmo para o  contrário), se a alternativa diz que há apenas uma diferença nas taxas de promoção, não importando se maior ou menor, dizemos que é uma hipótese bicaudal. Essa diferenciação será útil para quando quisermos descobrir se o parâmetro estimado é significativo.

Para simplificar, escolheremos apenas uma hipótese alternativa: homens são promovidos a uma taxa maior que mulheres (unicaudal a direita). Portanto, o teste fica dessa forma:

  • H0: \hat{\rho_h}- \hat{\rho_m} = 0
  • Ha: \hat{\rho_h}- \hat{\rho_m} > 0

Teste Estatístico

O Teste Estatístico é um ponto a ser estimado, isto é, dentre as N quantidades de observações da amostra, iremos criar a estimativa de um único ponto calculado, que neste caso é a diferença na proporção da amostra entre duas categorias \hat{\rho_h}- \hat{\rho_m}

Teste Estatístico Observado

Teste Estatístico Observado é o valor encontrado através do teste estatístico postulado no passo anterior, ou seja, é a estimativa na vida real da estatística amostral calculada. Portanto, devemos encontrar esse valor da diferença de proporções com \hat{\rho_h}- \hat{\rho_m}

Distribuição Nula

A Distribuição Nula é a distribuição da amostra do teste estatístico assumindo que a hipótese nula H0 é verdadeira. Vamos dizer que não há discriminação de gênero em promoções de emprego no problema pesquisado (que significa dizer sob H0), então, sob H0, como o teste estatístico varia devido a uma variação amostral?  Veja bem, o ponto estimado é calculado com base nos dados da amostra, se os valores da amostra variarem, a estimativa do ponto também irá mudar, correto? Portanto, como a diferença na proporção amostral  \hat{\rho_h}- \hat{\rho_m}, irá variar devido a amostragem sob H0? Esse é um passo delicado, visto que existe diversas formas de realizar o procedimento.

O procedimento acima chama-se distribuição amostral, e devemos ter em mente que a distribuição nula é a distribuição amostral assumindo que a hipótese nula H0 é verdadeira.

p-valor

O p-valor é a probabilidade de obter o teste estatístico sob H0 (lembrando que supomos que H0 é verdadeiro) de forma que o valor do teste seja extremo. Basicamente: o quão surpresos ficaríamos com o resultado encontrado no teste estatístico observado? Seria difícil dizer o quanto um valor na diferença nas proporções para diferentes amostras seria significativo e deveria ser considerado ou não. No caso do exemplo, na hipótese de que não há discriminação de promoções, caso o teste estatístico observado tenha um valor extremo, deveríamos considerar de que há de fato uma discriminação de promoções, o que nos levaria a rejeitar H0. Ou seja, o p-valor nos ajudará a quantificar a probabilidade de ocorrência desse valor extremo.

Nível de Significância

É recomendado definir em testes de hipóteses o nível de significância do estudo, denotado por α. Esse valor define a área que devemos aplicar o p-valor, isto é, se o p-valor ficar abaixo de α, devemos rejeitar a hipótese nula H0. Ao contrário, se o p-valor ficar acima de α, não podemos rejeitar H0.

Conduzindo o teste de hipóteses

Os passos citados acima fazem parte de um framework construído por Allen Downey, nomeado de "There is only one test", que facilitou o processo do teste de hipóteses para qualquer variável e teste estatístico. Para conduzir o teste de hipóteses, utilizaremos o pacote {infer}, que possui funções criadas voltadas para este fim e foram totalmente baseadas nos passos de Alllen Downey.

Workflow - Teste de Hipóteses com o pacote {infer}

 

Workflow - "There is only one test" Allen Downey

 

A primeira imagem, retirada do site do pacote {infer}, demonstra o workflow de suas função e dos procedimentos do teste de hipótese. Na segunda imagem, o workflow construído por Allen Downey através do artigo "There is Only one test". Veja as similaridade entre as imagens. As funções do pacote representam os passos propostos por Allen Downey. Cada função é proposta da seguinte forma:

specify() -  Específica as variáveis de interesse ou que devem se relacionar do data frame;

hyphotesize() - Define a Hipótese nula H0. Ou seja, cria um modelo para o universo, assumindo H0 como verdadeiro;

generate() - "Mistura" a amostra, assumindo H0 como verdadeiro;

calculate() - Calcula o teste estatístico de interesse, tanto o observado, quanto o simulado;

visualize() - Visualiza o resultado da distribuição nula e computa o p-valor para comparar a distribuição nula com o teste estatístico observado.

Exemplo com {infer}

Realizamos toda a explicação do Teste de Hipóteses utilizando como exemplo a discriminação na promoção de mulheres em empresas. Para continuar com o mesmo exemplo no R, utilizaremos o dataset promotions, que contém dados de uma pesquisa realizada na década de 1970, no qual foi distribuído currículo idênticos de empregados em empresas da indústria bancária, apenas diferenciando-se pelo nome da pessoa (permitindo supor o sexo da pessoa).

O dataset possui 48 observações, contendo a coluna com o nome "decision", identificando se houve promoção ou não, e outra coluna chamada "gender" identificando se o currículo entregado era de uma mulher ou de um homem. A coluna "id" apenas identificado as observações.

O primeiro passo, além de carregar os pacotes, é examinar o dataset, conduzindo uma breve análise exploratória.

É possível perceber que de fato houve uma diferença no tratamento entre homens e mulheres neste caso. A questão é: podemos dizer que é significativo? É possível realizar uma inferência deste problema? Seguimos com as funções do pacote {infer} para realizar o teste de hipóteses.

Primeiro definimos a construção da distribuição nula. Veja que seguimos todos os passos descritos acima. Definimos a formula da especificação (já intuitivamente pensando no parâmetro a ser estimado), a hipótese nula, a criação da amostragem, sendo gerado 1000 repetições através da permutação. Calculamos a distribuição referenciando o parâmetro (diff in props - diferença em proporções) e a ordem que queremos calcular.

Em seguida, construímos o teste estatístico observado, utilizando apenas duas funções: specify e calculate.

Por fim, podemos obter o p-valor com a função get_p_value, bem como podemos visualizar onde se encontra dentro da distribuição nula. Vemos que de fato, o p-valor é menor que 5% e que obtemos um teste estatístico observado extrema, nos levando a rejeitar a hipótese de que homens e mulheres são promovidos na mesma taxa.

Quer saber mais?

Veja nossos cursos de R e Python aplicados para a Análise de Dados e Economia

_____________________________________________

Referências

Downey, Allen. There is Only one test

Kim, Y. Albert. Ismay, Chester. Statistical Inference via Data Science A ModernDive into R and the Tidyverse

Agregando e Juntando dados no R

By | Hackeando o R

As ferramentas mais poderosas para a Análise de dados com o R estão contidas no pacote {dplyr}, parte da família do {tidyverse}, que proporciona verbs (funções), que ajudam o usuário a resolver problemas de manipulação de dados de forma extremamente simples. Neste post de hoje, mostraremos, através do principais verbs do pacote, como é possível agregar e juntar dados.

Agregação

Agregação de dados é basicamente agregar observações de categorias referenciadas em uma coluna, ou mesmo, agregar diversas colunas, para realizar operações, em geral matemáticas e estatísticas, de forma que possamos resumir informações.

Os dois verbos principais para agregar e realizar operações do {dplyr}, respectivamente, são o group_by() e summarise(). Com group_by(), agrupamos a coluna inserida dentro da função. Em seguida, utilizamos a função summarise(), para escolhermos o nome da nova coluna a ser criada e a referenciamos em conjunto com a função da operação matemática ou estatística que desejamos escolhendo a coluna que queremos  aplicar o calculo.  Abaixo, utilizamos o dataset iris, que contém amostras sobre tamanhos de sépalas e pétalas de três diferentes espécies de flores como exemplos.

Neste primeiro exemplo, agrupamos as observações da coluna Species, ou seja, agrupamos as três espécies diferentes (categorias das observações), em seguida, utilizamos summarise(), escolhendo o nome da nova coluna, que será mean_petal, e calculamos a média da coluna Petal.Length com mean(). O resultado será a média de Petal.Length para cada espécie.

Nem sempre é necessário utilizarmos summarise, como no exemplo abaixo, no qual a função count() permite calcular a contagem do número de observações do data frame, porém, agrupados pelas categorias de Species.

E se quisermos aplicar algum calcular para diversas colunas? Poderíamos nomear e realizar o cálculo dentro de summarise para cada uma, entretanto, não seria viável caso tivéssemos inúmeras colunas para calcular. Para tanto, podemos utilizar a função across(), que permite aplicar a função do cálculo para cada coluna do data frame que escolhermos. Abaixo, escolhemos a coluna Sepal.Length até Petal.Width, utilizando dois pontos (:).

A função across() também permite que sejam aplicadas condições para o cálculo de colunas em conjunto com outros verbs. Vejamos abaixo a utilização de where(), que permite utilizarmos uma condição para a aplicação da função. A condição colocada em where() é de que para toda coluna numérica (is.numeric()), seja aplicado o cálculo da média. O ~ em mean, significa que toda a operação à esquerda do operador seja em função do parte direita, isto é, será aplicado a média para toda a condição satisfeita.

Juntar dados

É quase certeza que ao trabalhar com dados, iremos nos deparar com a missão de juntar data frames. Por sorte, o pacote {dplyr} também nos fornece formas de juntar diferentes data frames. Os verbs utilizados para realizar esse procedimento são conhecidos como _joins(). Cada um com um nome diferente, possuindo um comportamento único.

A ideia principal do _joins é simples: a junção do data frame só pode ocorrer caso eles tenham colunas com observações em comum, de forma que eles sejam relacionais.

Utilizaremos os datasets do pacote {nycflights13}, contendo os datasets flights e airports.

Começaremos selecionando apenas algumas colunas do dataset flights para que possamos diminuir o seu tamanho.

Nosso objetivo aqui será juntar o data frame flights_r com o data frame airports, para que possamos encontrar os voos que se relacionam com os aeroportos através das transportadores aéreas (coluna carrier).

Para juntar as colunas em comum, podemos utilizar o left_join, como o nome diz, juntaremos as observações da coluna do data frame da esquerda, para encaixar na coluna em comum com o data frame da direita. Exemplificando: inner_join(x, y...) Temos que x é o data frame da esquerda, e y é o data frame da direita. Abaixo, juntamos as colunas de flights_r em airlines.

Veja que citamos também o argumento by = "carrier" no segundo exemplo. Esse procedimento é utilizado caso seja necessário especificar o nome da coluna para que a função reconhece qual desejamos juntar.

Caso quisermos realizar o procedimento contrário de left_join(), utilizamos o right_join(). Abaixo o exemplo possui um resultado similar, a diferença é que está sendo juntado as observações da direita na da esquerda.

E caso quisermos juntar os dados em comum de ambos os data frame, sem exceção? Podemos utilizar o verb inner_join(). Abaixo, utilizando os data sets band_members e band_instrument, juntamos a coluna name, para observações em comum de ambos os data frames.

E para juntar todos os dados? Podemos utilizar o verb full_join, abaixo, juntamos todos os dados de band_members e band_instruments2, veja que desta vez especificamos a coluna para ser juntada, devido ao fato de que band_instruments2 possui a coluna de nomes diferentes.

Quer saber mais?

Veja nossos cursos de R e Python aplicados para a Análise de Dados e Economia

_____________________________________________

Estatística vs Analytics vs Data Science

By | Hackeando o R

Algo que sempre gera dúvidas para aqueles que estão entrando na área de dados refere-se as áreas de atuação, bem como a relação entre cada uma. Obviamente, Estatística não é o mesmo que Data Analytics, bem como também são diferentes de Data Science. Apesar disto, estão totalmente interligadas. No post de hoje, explicamos brevemente as diferenças das três áreas e aplicamos exemplos de demonstração de suas finalidade.

Para esclarecer toda a confusão que é gerada sobre as áreas, definimos brevemente da seguinte forma:

  • Estatística é uma área que está mais preocupada com os métodos de coleta, analise e apresentação dos dados. O objetivo é buscar o relacionamentos de variáveis, descrever suas características e ser cuidadosa na área de inferência e criação de hipóteses.
  • Data Analytics é uma área que não está preocupada com os métodos de avaliação das variáveis (sendo menos rigorosos que a estatística), e sim está mais preocupado com os resultados que se encontram com os objetivos do negócios. Deste modo, por mais que certas características são significativas em um estudo estatísticos, para o DA, isto pode ser inútil caso não agregue valor para o negócio.
  • Data Science está também interligado com a estatística, porém é focada em resultados, isto é, o Cientista de Dados está preocupado com os objetivos do negócio em mente, de forma a criar produtos sofisticados, com algoritmos que predizem variáveis dentro de um sistema que gera essas previsões instantaneamente. A sua utilização é muito interligada com o uso de Machine Learning.

É possível baixar os dados através do seguinte link.

Vamos investigar a relação entre duas variáveis do dataset: mpg e origin. O quanto a origem do carro pode estar relacionada a variação de mpg? E se confirmada essa relação, além de origin, quais variáveis podemos adicionar para criar um modelo de previsão?

Primeiro, analisamos a distribuição de mpg por origem do carro por meio de um histograma. Observamos que o  número de carros construídos no EUA são maiores em relação a Asia e Europa. Além disso, vemos onde os dados estão centralizado, bem como as assimetrias que se formam.

Com um boxplot, podemos entender melhor os percentis dos valores de mpg por origem. Vemos que Asia possui uma mediana de mpg maior que Europa e EUA.

Com os insights retirado dos gráficos, podemos descobrir se a variável origin exerce uma influência na variável dependente.

Obviamente, a análise estatística é mais robusta e preciosista, com a formulação de um objetivo de estudo e criação de testes de hipóteses. Aqui, fizemos um simples passeio sobre o conteúdo que a área trata.

A partir daqui, iremos estar concentrados em prever o mpg do carro utilizando a regressão linear. A questão, é que o nosso objetivo aqui não será buscar de fato buscar relacionamentos estatísticos, e sim entregar uma previsão de mpg dos carros (e aqui apenas lidaremos com o workflow do {tidymodels}, e não trataremos de toda a infraestrutura criada por um time de Data Science). O objetivo de ensino aqui será somente diferenciar os objetivos de uma área para a outra.

Com as considerações feitas, podemos prosseguir com o nosso modelo. Além de origin, vamos adicionar outra variável, que será weight.

Podemos ver a relação através de um gráfico de dispersão.

Ao especificar e rodar o modelo, construímos as previsões com a fução predict() e comparamos os resultados com os dados de teste.

Quer saber mais?

Veja nossos cursos de R e Python aplicados para a Análise de Dados e Economia

_____________________________________________

Hackeando o R: Como formatar datas

By | Hackeando o R

Todos já tiveram dificuldades ao tentar lidar com datas no R, seja por problemas de importação ou por qualquer transformação nos dados. No post de hoje, ensinamos a melhor forma de transformar dados em data no R.

No R existem diferentes tipos de dados: character, factor, logical, integer, double, date e etc. O comportamento padrão do R para reconhecimento de dados possui uma hierarquia, portanto, é possível que ao ser importado determinado conjunto de dados, eles não estejam em sua forma ideal (isto é, no seu tipo correto).

Para tanto, o pacote {lubridate} nos ajuda na missão de realizar transformações de dados em data de forma fácil funcionando em conjunto com outros pacotes da família do {tidyverse}.

No exemplo abaixo, retiramos os dados da Pesquisa Industrial Mensal direto do Sidra, utilizando o pacote {sidrar}. Na estrutura do objeto importado, vemos como o R lidou com a coluna de data, bem como o formato em que as observações estão em "anomês" (200201). O ideal é transformar no tipo de dado date e obter um formato de data mais interessante, talvez como "ano-dia-mes".

Para obter a transformação para tipo date, podemos utilizar a função ym(), que permite, através de um formato pré-estabelecido de ano e mês, como as observações se encaixam, transformar em tipo date e em um formato mais amigável (2002-01-01).

E caso não tivermos o formato de ano e mês, e sim em outro formato? Qual função ou formato podemos utilizar ? A função guess_formats() retorna o formato que o R (e consequentemente as funções do {lubridate}) reconhece para realizar a transformação. Colocamos na função os valores e a ordem do formato das observações. Com o resultado, utilizamos a função parse_date_time(), do mesmo modo que utilizamos a função ym(), porém, especificando o formato retornado por guess_formats().

Veja que utilizamos o formato "%Y%0M%, entregue por guess_formats, porém, que na prática, possui o mesmo resultado anterior.

____________________________________________

Quer saber mais?

Veja nossos cursos de R e Python aplicados para a Análise de Dados e Economia

_____________________________________________

Receba diretamente em seu e-mail gratuitamente nossas promoções especiais
e conteúdos exclusivos sobre Análise de Dados!

Assinar Gratuitamente