quarta-feira, 14 de setembro de 2016

My new R package

Rspotify: Access to Spotify API via R

This package allows you to connect R to Spotify's API and get information about Songs, Albums, Artists and Users.
This is an experimental package built up with functions that I've created to attend my specific needs (meaning I wasn't really concerned with errors different than ones I got when it was written). Please, use it with caution.
So far I haven't uploaded a stable version to CRAN but you can download from GitHub using devtools, type:
In order to access many of the functions you need an authenticated token. You can get one accessing this link to create a Spotify app and get app_id, client_id and client_secret. (Don't forget to put http://localhost:1410/ in Redirect URIs)
keys <- spotifyOAuth("app_id","client_id","client_secret")
To get information about a specific user:
user <- getUser("t.mendesdantas",token=keys)
user$display_name # user name
# [1] "Tiago Dantas"
# [1] "t.mendesdantas" #user id
# [1] 46
To search for an artist:
# id                     name             popularity    genres    type      followers
# 3z6Gk257P9jNcZbBXJNX5i Regina Spektor   67            anti-folk artist    613837
To get information from an artist using the artist id:
To get information the albums available at spotify from a specific artist:
regina.albums$name #name of the albums
# [1] "Kubo and the Two Strings"                         
# [2] "What We Saw From The Cheap Seats"                 
# [3] "What We Saw From The Cheap Seats (Deluxe Version)"
# [4] "Live In London"                                   
# [5] "Far"                                              
# [6] "Far (Deluxe DMD)"                                 
# [7] "Begin To Hope"                                    
# [8] "Begin To Hope (Special Edition)"                  
# [9] "Begin To Hope (U.S. Version)"                     
# [10] "Soviet Kitsch (U.S. Version)"   
To get the songs from a specific album:
# getting the songs from the album "what we saw from the cheap seats"
#from Regina Spektor
regina.whatwesaw<-getAlbum("3Etyu2JmgiQTQztLz6RxDX") #"3Etyu2JmgiQTQztLz6RxDX" is theid for the album.
To get the features from a specific song:
# getting the song features from "Don't Leave Me [Ne Me Quitte Pas]" 
#from the album "what we saw from the cheap seats" from Regina Spektor
song<-getFeatures("0y5HWbAnJ6qrjeBuFL52hO",token=keys) #"0y5HWbAnJ6qrjeBuFL52hO" is the id for the album.
To get the playlists from a specific user:
wh.playlist <- getPlaylist("thewhitehouse",token=keys) #playlist from the White House
#id                                                              name       ownerid  tracks
#1 6ujhXmg8SXjdkdCZ2TchTY            The Bidens' 2016 Summer Playlist thewhitehouse      15
#2 2Zve7PqFSlGl0ojgGnhFTm   The President's 2016 Summer Playlist: Day thewhitehouse      17
#3 0BczR7bDaoKvn3MGPxS9Lx The President's 2016 Summer Playlist: Night thewhitehouse      18
#4 4FDHBIdHPNHCPBqftDc3lk                    Holidays with the Bidens thewhitehouse      17
#5 4qu9a0vwTMyTPpc2YI1GPw                    Holidays with the Obamas thewhitehouse      14
#6 3R2DGCLfGdVqqqN6rdQYr5   The First Lady's Day of the Girl Playlist thewhitehouse      20
#7 4RGLH5YuS6ldp7aCKaTWas        The President's Summer Playlist: Day thewhitehouse      20
#8 3fAriv8eMWELCwbWrhMKy2      The President's Summer Playlist: Night thewhitehouse      20

To get the songs from a specific playlist:
#E.g. getting the songs from "Top 100 tracks currently on Spotify" playlist
topsongs <- getPlaylistSongs("spotify","4hOKQuZbraPDIfaGbM3lKI",token=keys)
To get a dataframe with related artists:
#                 sourceID     sourceName                names popularity followers                        id
#1  3z6Gk257P9jNcZbBXJNX5i Regina Spektor                Feist         63    336016     6CWTBjOJK75cTE8Xv8u1kj
#2  3z6Gk257P9jNcZbBXJNX5i Regina Spektor            Kate Nash         57    158098     5vBKu1igxFo6g1sHADkIdg
#3  3z6Gk257P9jNcZbBXJNX5i Regina Spektor          Imogen Heap         56    183372     6Xb4ezwoAQC4516kI89nWz
#4  3z6Gk257P9jNcZbBXJNX5i Regina Spektor          Fiona Apple         59    239789     3g2kUQ6tHLLbmkV7T4GPtL
#5  3z6Gk257P9jNcZbBXJNX5i Regina Spektor            She & Him         55    234354     3CIRif6ZAedT7kZSPvj2A4
#6  3z6Gk257P9jNcZbBXJNX5i Regina Spektor    Ingrid Michaelson         68    355511     2vm8GdHyrJh2O2MfbQFYG0
#7  3z6Gk257P9jNcZbBXJNX5i Regina Spektor        A Fine Frenzy         54    130989     5dTYaRzOn4rXGBLH052EeQ
#8  3z6Gk257P9jNcZbBXJNX5i Regina Spektor          Anya Marina         44     23523     6xYBLeSMu1AqPsnUzEvx5n
#9  3z6Gk257P9jNcZbBXJNX5i Regina Spektor     Rachael Yamagata         48     44269     7w0qj2HiAPIeUcoPogvOZ6
#10 3z6Gk257P9jNcZbBXJNX5i Regina Spektor    Jenny Owen Youngs         44     12299     52mkFCABBeP3KjkWFA4M2H
#11 3z6Gk257P9jNcZbBXJNX5i Regina Spektor            Yael Naim         57     60798     3cHwmcXlo7XvovQcl5YxlQ
#12 3z6Gk257P9jNcZbBXJNX5i Regina Spektor            Frou Frou         46     48835     6MUyqmIQ35inLjch0YzIEG
#13 3z6Gk257P9jNcZbBXJNX5i Regina Spektor the bird and the bee         53     60498     65XA3lk0aG9XejO8y37jjD
#14 3z6Gk257P9jNcZbBXJNX5i Regina Spektor          The Pierces         48     51210     1ET1wIkDmuCBC80XcTr3Sg
#15 3z6Gk257P9jNcZbBXJNX5i Regina Spektor       Tegan and Sara         65    274481     5e1BZulIiYWPRm8yogwUYH
#16 3z6Gk257P9jNcZbBXJNX5i Regina Spektor                Lenka         57     91001     5g3uG8zZZANGT6YOssgjfC
#17 3z6Gk257P9jNcZbBXJNX5i Regina Spektor          KT Tunstall         59     99006     5zzrJD2jXrE9dZ1AklRFcL
#18 3z6Gk257P9jNcZbBXJNX5i Regina Spektor     Rufus Wainwright         57    118372     2PfBzriIMRsCXPDtSy9vg8
#19 3z6Gk257P9jNcZbBXJNX5i Regina Spektor        Laura Marling         59    181458     7B2edU3Q7btJoNsoHCNohM
#20 3z6Gk257P9jNcZbBXJNX5i Regina Spektor            Cat Power         61    288064     6G7OerKc3eBO9sVkRNopFC

Nice examples

One nice idea is to create networks of related artists. Eg. This is a network of related artists from the top 100 artists at spotify (Basically all you need to do is use getPlaylistSongs and getRelated to get the data).

Another example is to use getFeatures to extract features and play with that. In this example I use getFeatures and getPlaylistSongs to extract song features from the "What we saw from the cheap seats" from Regina Spektor and the song features from the Top 20 songs at spotify (extracted in august 2016). I assume that Reginas' songs are not very similar to the ones that make a lot of success...This is sad because her songs are awesome =( . Then I use Hierarchical cluster to see if Reginas' songs would stay in a different cluster based on its features.

Apparently it does! 8 out 11 of her songs would be in the same cluster (cluster on the right). From the 3 "misclassified" 2 were singles ("Don't Leave Me [Ne Me Quitte Pas]" and "All the Rowboats"). So it is not strange to see them in a cluster with the top 20 songs.
That's it! Hope you find this useful!

quarta-feira, 1 de junho de 2016

Finding Influential people on Instagram

I  use R at my job, in consultancy projects and in my Phd research. I spend most of the time trying to answer specific questions. This time the question is: "Can I find key/influential persons following a specific account?". I've developed a R code to answer the question, according to a specific Instagram account. As an example, check the case below:

Nubank case (https://www.instagram.com/nubankbrasil/)

Nubank is a Brazilian fintech that started small but now is a huge success . After checking their entire list of followers at Instagram (41k),  it became pretty clear that their marketing team should approach at least this accounts:

- raul_lemos (https://www.instagram.com/raul_lemos/)
- tfguidotti (https://www.instagram.com/tfguidotti/)
-fullmotosbrasil (https://www.instagram.com/fullmotosbrasil/)

ps1: I don't know any of these people (owners of the accounts) but their exposure is pretty high which means a that their posts have high impact on other accounts.

ps2: List is way bigger.

ps3: Nubank is just one example. Things can be done with any public account.

ps4: Please, do not waste your time and money using paid software. It's time to move forward. R is free. If you still want to spend money I recommend hiring someone to teach your team (it would be way less expensive anyway).

My linkedin: https://br.linkedin.com/in/tiagomendesdantas
My twitter: https://twitter.com/t_m_dantas

quarta-feira, 15 de abril de 2015



Hoje resolvi acessar a API do serviço de streaming de música Spotify, na minha opinião o melhor da categoria e um dos apps que mais utilizo. Só pra constar, odeio todo o conceito do potencial concorrente, Tidal.

Mais uma vez, tudo foi feito utilizando o software livre R.

As funções que criei fazem algumas coisas básicas como: baixar informações de usuários (seguidores,listas etc), baixar informação dos artistas e os artistas que o Spotify define como relacionados. Essa última informação permitiu que eu gerasse grafos. Para ilustrar, coloco aqui dois casos que permitem  visualizar  a rede de artistas relacionados de acordo com o Spotify. 

Interessante ver como cada artista se situa dentro da rede. Olhe com atenção os detalhes e veja como você consegue definir gêneros musicais pelas aglutinações naturais da rede. 

Clique nas imagens para ver com mais detalhes. 



Repare como os artistas de Pagode e Samba estão mais próximos, os de Axé, funk, Sertanejo e Rock também estão no que parecem ser um cluster. E a Cláudia  Leite é um híbrido nesses grupos?!

Obs: Obviamente a rede real é muito mais extensa e defini pontos de corte para melhor visualização. Caso gerasse os pontos de maneira indefinida poderia inclusive encontrar artistas de encontro entre a Anitta e os Beatles. Quantos passos seriam necessários?!

Aos que se interessarem nessa e em outras aplicações utilizando redes sociais e o R, recomendo o curso: Análise de dados de redes sociais utilizando o R oferecido como curso de extensão pela PUC-Rio.

segunda-feira, 6 de abril de 2015

R e WhatsApp

Fiz um WordCloud com as minhas conversas no WhatsApp com a Daiane (minha esposa)​ no início de 2012 e do meio de 2014 até hoje em dia. 

Mais uma vez fiz tudo utilizando o R e agora os dados do WhatsApp. 

"Moo" definitivamente caiu em desuso entre nós hehe!

Meus amigos mais próximos vão logo reconhecer as palavras que mais usamos.

Aos que se interessarem em aprender, recomendo o curso abaixo:
Análise de dados de Redes Sociais utilizando o R

segunda-feira, 16 de março de 2015

Ideologia de Políticos usando o Twitter

Utilizando dados do twitter, sua API e o R, resolvi estimar ideologia de políticos importantes no cenário nacional.A ideia é  calcular "Pontos ideais" levando em consideração os seguidores das contas do twitter de cada Político.

Estimar "Ideal Points" não é uma ideia nova e a interpretação do que de fato significam essas estimativas ainda são pontos de discussão. Entretanto, não é incomum associar os resultados a ideologia. 

Vemos, como era de se esperar, que políticos do DEM estão mais associados a direita, assim como políticos do PSOL estão mais associados a esquerda, de acordo com seus seguidores no Twitter.

Veja o gráfico abaixo:

- Próximo passo: Estimar "Pontos Ideais" pros usuários. Exemplo: Luciano Huck, Leonardo Boff e Jabour estão mais identificados, ideologicamente, com a esquerda ou com a direita?

Obs: Esse é só um exercício inicial... Preciso de um computador um pouco mais potente que meu MacBook Pro (i5 com 4gb) pra fazer esses cálculos. Quem tiver um super computador eu ofereço minha amizade verdadeira em troca de algumas (muitas) horas de processamento =)

Questões Técnicas :

O exercício foi possível e graças ao excelente artigo e documentação do Pablo Barberá da New York University (Birds of the Same Feather Tweet Together. Bayesian Ideal Point Estimation Using Twitter DataPolitical Analysis, 2015, 23 (1), 76-91).  O modelo dele estima Ideal Points não só para os Políticos (e outros), como também para os seguidores desses políticos. A probabilidade de um usuário do twitter  i seguir uma conta de um político j é dada por:

Nenhum dos parâmetros do modelo pode ser observado então fazer inferência, principalmente sobre theta e o phi (ideal points dos usuários e dos políticos) é problemático... 

A função de máxima verossimilhança é:

Já da pra ver que estimar isso é um verdadeiro INFERNO! pode ser bem complicado . A ideia é, então, partir pra simulação usando Markov Chain Monte Carlo (http://en.wikipedia.org/wiki/Markov_chain_Monte_Carlo). Usando distribuição Normal pra cada um dos parâmetros Alpha, Beta, Theta e Phi, a distribuição conjunta a posteriori é então:

 Agora é só simular e correr pro abraço!

quarta-feira, 28 de janeiro de 2015

Modelo de Volatilidade para Ação da Petrobras

Resolvi modelar a volatilidade da ação da Petrobras (PETR4). Para tal, ajustei um modelo Beta-Skew-t-Egarch, quem tiver interesse vale a pena olhar em http://www.econ.cam.ac.uk/dae/repec/cam/pdf/cwpe1236.pdf

O modelo tem várias vantagens em relação ao tradicional GARCH.

Fatos interessantes:
- O nível de volatilidade do papel está ficando cada vez mais próximo de 2008 quando houve a crise financeira Mundial. Se algum amigo seu, metido a "inteligente", falar que é uma boa hora pra comprar, fuja e rompa a amizade. A não ser que vc queira especular e não investir seu dinheiro, nem pense nisso.
- Repare na diferença entre os papeis do Bradesco e Petrobras (BBDC4 e PETR4), na segunda figura. A marca preta no gráfico em 2010 mostra o momento da posse da Dilma.

quarta-feira, 21 de janeiro de 2015

Dilma e Aécio no Facebook

Pensando no Aécio Neves e na Dilma Rousseff, fiz um gráfico usando o R e a API do Facebook. 

Desde o fim das eleições, o Slogan do Aécio Neves tem sido ‪#‎nãovamosnosdispersar‬. Bom, a frase é interessante mas parece que o político precisa de uma equipe mais atuante. Repare que a Dilma, assim como no período pré eleição, continua fazendo muito mais postagens no Facebook... 

Aécio, você vai precisar melhorar seu jogo. Uma derrota não foi suficiente? A eleição de 2018 já começou.