Análise - Grupos de pesquisa do RJ

Sem código

In [1]:
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
%matplotlib inline
import seaborn as sns
sns.set_style('whitegrid')
from pivottablejs import pivot_ui
import warnings; warnings.simplefilter('ignore')

Dados obtidos com CNPQ-DGP Webscrapper em 03/07/17.

In [2]:
df = pd.read_excel('Grupos_Lista.xls')
In [3]:
df['Ano de Formação'] = df['Ano de Formação'].fillna(0.0).astype(int)        
In [4]:
df.head()
Out[4]:
Nome do Grupo Instituição Líder(es) Área Localidade Ano de Formação Grande Área
0 \tCulturas e saberes urbanos e as modalidades ... UFRJ Margareth Aparecida Campos da Silva Pereira Arquitetura e Urbanismo Rio de Janeiro 2009 Ciências Sociais Aplicadas; Arquitetura e Urba...
1 \tMetodologias, bases de dados e ferramentas d... CNEN Antonio Carlos de Oliveira Barroso Engenharia Nuclear São Paulo 2006 Engenharias; Engenharia Nuclear
2 A IMPORTÂNCIA DO ESTÍMULO DO LAÇO SOCIAL NO T... USU Alexandra de Gouvêa Vianna Psicologia Rio de Janeiro 2015 Ciências Humanas; Psicologia
3 Administração Institucional de Conflitos e ac... UVA/RJ Maria Stella Faria de Amorim Direito Rio de Janeiro 2015 Ciências Sociais Aplicadas; Direito
4 Alimentação para Coletividades UFF Roseane Moreira Sampaio Barbosa Nutrição Niterói 2012 Ciências da Saúde; Nutrição

Adicionando a coluna: Mesorregião

In [5]:
BL = ["Casimiro de Abreu", "Rio das Ostras", "Silva Jardim", "Araruama", "Armação dos Búzios", "Arraial do Cabo", "Cabo Frio", "Iguaba Grande", "São Pedro da Aldeia", "Saquarema"]
CF = ["Cantagalo", "Carmo", "Cordeiro", "Macuco", "Bom Jardim", "Duas Barras", "Nova Friburgo", "Sumidouro", "Santa Maria Madalena", "São Sebastião do Alto", "Trajano de Moraes", "Areal", "Comendador Levy Gasparian", "Paraíba do Sul", "Sapucaia", "Três Rios"]
NOF = ["Bom Jesus do Itabapoana", "Italva", "Itaperuna", "Laje do Muriaé", "Natividade", "Porciúncula", "Varre-Sai", "Aperibé", "Cambuci", "Itaocara", "Miracema", "Santo Antônio de Pádua", "São José de Ubá"]
NF = ["Campos dos Goytacazes", "Cardoso Moreira", "São Fidélis", "São Francisco de Itabapoana", "São João da Barra", "Carapebus", "Conceição de Macabu", "Macaé", "Quissamã"]
SF = [" Angra dos Reis", "Barra do Piraí", "Barra Mansa", "Itatiaia", "Paraty", "Pinheiral", "Piraí", "Porto Real", "Quatis", "Resende", "Rio Claro", "Rio das Flores", "Valença",  "Volta Redonda"]
MRJ = ["Itaguaí", "Belford Roxo", "Mesquita", "Nova Iguaçu", "Queimados", "Teresópolis", "Rio de Janeiro", "Mendes", "Nilópolis", "Petrópolis", "Engenheiro Paulo de Frontin", "Itaboraí", "Japeri", "Magé", "Mangaratiba", "Miguel Pereira", "Paracambi", "Paty do Alferes", "Rio Bonito", "São João de Meriti", "Seropédica", "Tanguá", "Guapimirim", "Maricá", "Vassouras", "Cachoeiras de Macacu", "Duque de Caxias", "Niterói", "São Gonçalo", "São José do Vale do Rio Preto"]
lista_geral = BL+ CF+ NOF+ NF+ SF+ MRJ
In [6]:
def MesoR(Mun):
    MR = "NaN"
    for cid in lista_geral:
     if cid in Mun:
        Mun= cid
    
    if Mun in BL:
        MR = "Baixada Litorânea"
    if Mun in CF:
        MR = "Centro Fluminense"
    if Mun in NOF:
        MR = "Noroeste Fluminense"
    if Mun in NF:
        MR = "Norte Fluminense"
    if Mun in SF:
        MR = "Sul Fluminense"
    if Mun in MRJ:
        MR = "Metropolitana do Rio de Janeiro"
    return MR
In [7]:
df['Localidade'].fillna("NaN",inplace=True)
df['Mesorregião'] = df['Localidade'].apply(lambda x: MesoR(x))
In [8]:
df = df[df['Mesorregião'] != "NaN"]
df.head()
Out[8]:
Nome do Grupo Instituição Líder(es) Área Localidade Ano de Formação Grande Área Mesorregião
0 \tCulturas e saberes urbanos e as modalidades ... UFRJ Margareth Aparecida Campos da Silva Pereira Arquitetura e Urbanismo Rio de Janeiro 2009 Ciências Sociais Aplicadas; Arquitetura e Urba... Metropolitana do Rio de Janeiro
2 A IMPORTÂNCIA DO ESTÍMULO DO LAÇO SOCIAL NO T... USU Alexandra de Gouvêa Vianna Psicologia Rio de Janeiro 2015 Ciências Humanas; Psicologia Metropolitana do Rio de Janeiro
3 Administração Institucional de Conflitos e ac... UVA/RJ Maria Stella Faria de Amorim Direito Rio de Janeiro 2015 Ciências Sociais Aplicadas; Direito Metropolitana do Rio de Janeiro
4 Alimentação para Coletividades UFF Roseane Moreira Sampaio Barbosa Nutrição Niterói 2012 Ciências da Saúde; Nutrição Metropolitana do Rio de Janeiro
5 BRISA: Territórios Sensíveis UFF Walmeri Kellen Ribeiro Artes Rio de Janeiro 2017 Lingüística, Letras e Artes; Artes Metropolitana do Rio de Janeiro

Gráfico com número de grupos fundados por ano no estado do Rio de Janeiro:

In [9]:
plt.figure(figsize=(12,6))
plt.title("Grupos criados x Ano")
ax = sns.countplot(df.sort_values('Ano de Formação')['Ano de Formação'][1:])
ax.set(ylabel="# Grupos")
ax.set_xticklabels(df.sort_values('Ano de Formação')['Ano de Formação'][1:].unique(), rotation=90)
plt.tight_layout()

Gráfico com número de grupos fundados, cumulativos por ano no estado do Rio de Janeiro:

In [10]:
cumulativo = np.cumsum(df.sort_values('Ano de Formação')['Ano de Formação'][1:].value_counts(sort = False).sort_index())
fig = plt.figure(figsize=(10,8))
plt.title("Grupos criados (Cumulativo) x Ano")
plt.xlabel("# Grupos")
plt.ylabel("Ano")
plt.plot(df.sort_values('Ano de Formação')['Ano de Formação'][1:].unique(),cumulativo)
Out[10]:
[<matplotlib.lines.Line2D at 0x22437bd7f98>]

Gráfico com número de grupos fundados, cumulativos por ano no estado do Rio de Janeiro e mesorregiões (Interativo):

In [11]:
import plotly.tools as tls   
from plotly.offline import init_notebook_mode, iplot_mpl
import cufflinks as cf
cf.go_offline()
In [12]:
cumulativo = np.cumsum(df.sort_values('Ano de Formação')['Ano de Formação'][1:].value_counts(sort = False).sort_index())
cumulativoBL = np.cumsum(df[df['Mesorregião'] == "Baixada Litorânea"].sort_values('Ano de Formação')['Ano de Formação'][1:].value_counts(sort = False).sort_index())
cumulativoCF = np.cumsum(df[df['Mesorregião'] == "Centro Fluminense"].sort_values('Ano de Formação')['Ano de Formação'][1:].value_counts(sort = False).sort_index())
cumulativoNF = np.cumsum(df[df['Mesorregião'] == "Norte Fluminense"].sort_values('Ano de Formação')['Ano de Formação'][1:].value_counts(sort = False).sort_index())
cumulativoNOF = np.cumsum(df[df['Mesorregião'] == "Noroeste Fluminense"].sort_values('Ano de Formação')['Ano de Formação'][1:].value_counts(sort = False).sort_index())
cumulativoSF = np.cumsum(df[df['Mesorregião'] == "Sul Fluminense"].sort_values('Ano de Formação')['Ano de Formação'][1:].value_counts(sort = False).sort_index())
cumulativoMRJ = np.cumsum(df[df['Mesorregião'] == "Metropolitana do Rio de Janeiro"].sort_values('Ano de Formação')['Ano de Formação'][1:].value_counts(sort = False).sort_index())

fig = plt.figure(figsize=(10,8))
plt.title("Grupos criados (Cumulativo) x Ano")
plt.xlabel("# Grupos")
plt.ylabel("Ano")
plt.xlim(1949,2017)
plt.plot(df[df['Mesorregião'] == "Baixada Litorânea"].sort_values('Ano de Formação')['Ano de Formação'][1:].unique(),cumulativoBL, label='BL')
plt.plot(df[df['Mesorregião'] == "Centro Fluminense"].sort_values('Ano de Formação')['Ano de Formação'][1:].unique(),cumulativoCF, label='CF')
plt.plot(df[df['Mesorregião'] == "Norte Fluminense"].sort_values('Ano de Formação')['Ano de Formação'][1:].unique(),cumulativoNF, label='NF')
plt.plot(df[df['Mesorregião'] == "Noroeste Fluminense"].sort_values('Ano de Formação')['Ano de Formação'][1:].unique(),cumulativoNOF, label='NOF')
plt.plot(df[df['Mesorregião'] == "Sul Fluminense"].sort_values('Ano de Formação')['Ano de Formação'][1:].unique(),cumulativoSF, label='SF')
plt.plot(df[df['Mesorregião'] == "Metropolitana do Rio de Janeiro"].sort_values('Ano de Formação')['Ano de Formação'][1:].unique(),cumulativoMRJ, label='MRJ')
plt.plot(df.sort_values('Ano de Formação')['Ano de Formação'][1:].unique(),cumulativo, label='Geral')
plt.legend(bbox_to_anchor=(1.05, 1), loc=2, borderaxespad=0.)

iplot_mpl(fig)  

Tabela Dinâmica:

In [13]:
df['Grande Área']= df['Grande Área'].apply(lambda x: x.split(";")[0])
In [14]:
pivot_ui(df, rows=['Mesorregião'],cols=['Grande Área'])
Out[14]:
In [15]:
def highlight_max(data, color='yellow'):
    '''
    highlight the maximum in a Series or DataFrame
    '''
    attr = 'background-color: {}'.format(color)
    if data.ndim == 1:  # Series from .apply(axis=0) or axis=1
        is_max = data == data.max()
        return [attr if v else '' for v in is_max]
    else:  # from .apply(axis=None)
        is_max = data == data.max().max()
        return pd.DataFrame(np.where(is_max, attr, ''),
                            index=data.index, columns=data.columns)

Distribuição dos grupos na mesorregião, por grande área:

In [16]:
aux = pd.pivot_table(df[['Área','Mesorregião','Grande Área']], index=['Mesorregião'],
...                     columns=['Grande Área'], aggfunc='count', fill_value= 0)  

mrq = aux['Área']
mrq.style.apply(highlight_max, axis=1)
Out[16]:
Grande Área Ciências Agrárias Ciências Biológicas Ciências Exatas e da Terra Ciências Humanas Ciências Sociais Aplicadas Ciências da Saúde Engenharias Lingüística, Letras e Artes Outra
Mesorregião
Baixada Litorânea 1 6 9 7 5 8 7 5 0
Centro Fluminense 0 9 2 2 13 9 7 2 0
Metropolitana do Rio de Janeiro 142 628 605 1005 782 755 476 353 12
Noroeste Fluminense 4 1 10 20 9 3 0 1 0
Norte Fluminense 25 16 17 65 47 9 19 1 0
Sul Fluminense 7 1 18 8 25 11 25 0 1

Em porcentagem:

In [17]:
mrqp = mrq.replace("-",0)
for region in df['Mesorregião'].unique():
    mrqp.loc[region] = (mrqp.loc[region]/sum(mrqp.loc[region]))*100
mrqp.style.format("{:.2f}%")
Out[17]:
Grande Área Ciências Agrárias Ciências Biológicas Ciências Exatas e da Terra Ciências Humanas Ciências Sociais Aplicadas Ciências da Saúde Engenharias Lingüística, Letras e Artes Outra
Mesorregião
Baixada Litorânea 2.08% 12.50% 18.75% 14.58% 10.42% 16.67% 14.58% 10.42% 0.00%
Centro Fluminense 0.00% 20.45% 4.55% 4.55% 29.55% 20.45% 15.91% 4.55% 0.00%
Metropolitana do Rio de Janeiro 2.98% 13.20% 12.72% 21.12% 16.44% 15.87% 10.00% 7.42% 0.25%
Noroeste Fluminense 8.33% 2.08% 20.83% 41.67% 18.75% 6.25% 0.00% 2.08% 0.00%
Norte Fluminense 12.56% 8.04% 8.54% 32.66% 23.62% 4.52% 9.55% 0.50% 0.00%
Sul Fluminense 7.29% 1.04% 18.75% 8.33% 26.04% 11.46% 26.04% 0.00% 1.04%

Em gráfico:

In [18]:
i = 0
f, axs = plt.subplots(2,3,figsize=(12,10))
f.suptitle("Grande área x Mesorregião")
for region in df['Mesorregião'].unique():
    i+=1
    plt.subplot(2, 3, i)
    ax = sns.barplot(x=df[df['Mesorregião']==region]['Mesorregião'], y=df['Ano de Formação'], data=df,hue=df['Grande Área'], estimator=lambda x: len(x) / len(df[df['Mesorregião']==region]) * 100)
    ax.set(ylabel="Porcentagem")
    ax.legend_.remove()
        
plt.tight_layout()
plt.subplots_adjust(top=0.9)
plt.legend(bbox_to_anchor=(1.05, 1), loc=2, borderaxespad=0.)
Out[18]:
<matplotlib.legend.Legend at 0x2243937b710>

Distribuição dos grupos no estado do RJ, por mesorregião:

In [19]:
A = (df['Mesorregião'].value_counts() / len(df))*100
explode = (0, 0.4, 0.5, 0.6,0.7,0.8)
fig1, ax1 = plt.subplots(figsize=(10,8))
ax1.pie(A.values, explode=explode, labels=A.index, autopct='%1.1f%%',
        shadow=True)
ax1.axis('equal')  # Equal aspect ratio ensures that pie is drawn as a circle.
plt.tight_layout()
plt.show()

Grupos criados por ano e cumulativo no RJ:

In [20]:
Ncumulativo = df.sort_values('Ano de Formação')['Ano de Formação'][1:].value_counts(sort = False).sort_index()
cumulativo = np.cumsum(df.sort_values('Ano de Formação')['Ano de Formação'][1:].value_counts(sort = False).sort_index())
fig = plt.figure(figsize=(10,8))
plt.title("Grupos criados (Cumulativo) x Ano")
plt.ylabel("# Grupos")
plt.xlabel("Ano")
plt.plot(df.sort_values('Ano de Formação')['Ano de Formação'][1:].unique(),cumulativo,label="Cumulativo")
plt.plot(df.sort_values('Ano de Formação')['Ano de Formação'][1:].unique(),Ncumulativo,label="Por Ano")
plt.legend(bbox_to_anchor=(1.05, 1), loc=2, borderaxespad=0.)
iplot_mpl(fig)  

Distribuição dos grupos por município (Mapa):

In [21]:
MunCd = {
"Itatiaia": "Itatiaia",
"PReal": "Porto Real",
"Resende": "Resende",
"Mendes": "Mendes",
"BPirai": "Barra do Piraí",
"BMansa": "Barra Mansa",
"Pinheiral": "Pinheiral",
"Pirai": "Piraí",
"Quatis": "Quatis",
"RClaro": "Rio Claro",
"VRedonda": "Volta Redonda",
"Paracambi": "Paracambi",
"Seropedica": "Seropédica",
"Valenca": "Valença",
"EPFrontin": "Engenheiro Paulo de Frontin",
"Japeri": "Japeri",
"MPereira": "Miguel Pereira",
"Nilopolis": "Nilópolis",
"NIguacu": "Nova Iguaçu",
"Queimados": "Queimados",
"RFlores": "Rio das Flores",
"Vassouras": "Vassouras",
"Mesquita": "Mesquita",
"SJMeriti": "São João de Meriti",
"BRoxo": "Belford Roxo",
"DCaxias": "Duque de Caxias",
"PAlferes": "Paty do Alferes",
"Petropolis": "Petrópolis",
"Areal": "Areal",
"CLGasparian": "Comendador Levy Gasparian",
"PSul": "Paraíba do Sul",
"TRios": "Três Rios",
"Guapimirim": "Guapimirim",
"Itaborai": "Itaboraí",
"Mage": "Magé",
"Marica": "Maricá",
"Niteroi": "Niterói",
"RBonito": "Rio Bonito",
"Tangua": "Tanguá",
"Sumidouro": "Sumidouro",
"Carmo": "Carmo",
"SJVRPreto": "São José do Vale do Rio Preto",
"Sapucaia" : "Sapucaia",
"Teresopolis": "Teresópolis",
"CMacacu": "Cachoeiras de Macacu",
"NFriburgo": "Nova Friburgo",
"Saquarema": "Saquarema",
"SJardim": "Silva Jardim",
"LMuriae": "Laje do Muriaé",
"Miracema": "Miracema",
"SAPadua": "Santo Antônio de Pádua",
"Aperibe": "Aperibé",
"BJardim": "Bom Jardim",
"Cantagalo": "Cantagalo",
"Cordeiro": "Cordeiro",
"DBarras": "Duas Barras",
"Itaocara": "Itaocara",
"Macuco": "Macuco",
"SSAlto": "São Sebastião do Alto",
"TMoraes": "Trajano de Moraes",
"SPDA": "São Pedro da Aldeia",
"ABuzios": "Armação dos Búzios",
"ACabo": "Arraial do Cabo",
"CFrio": "Cabo Frio",
"CAbreu": "Casimiro de Abreu",
"Araruama": "Araruama",
"ROstras": "Rio das Ostras",
"IGrande": "Iguaba Grande",
"Varre-Sai": "Varre-Sai",
"Cambuci": "Cambuci",
"Itaperuna": "Itaperuna",
"Natividade": "Natividade",
"Porciuncula": "Porciúncula",
"SJUba": "São José de Ubá",
"CMacabu": "Conceição de Macabu",
"Carapebus": "Carapebus",
"SMMadalena": "Santa Maria Madalena",
"BJItabapoana": "Bom Jesus do Itabapoana",
"CGoytacazes": "Campos dos Goytacazes",
"CMoreira": "Cardoso Moreira",
"Italva": "Italva",
"Quissama": "Quissamã",
"SFItabapoana": "São Francisco de Itabapoana",
"SFidelis": "São Fidélis",
"SJBarra": "São João da Barra",
"Paraty": "Paraty",
"AReis": "Angra dos Reis",
"Macae": "Macaé",
"Itaguai": "Itaguaí",
"RJ": "Rio de Janeiro",
"Mangaratiba": "Mangaratiba",
"SGoncalo": "São Gonçalo",
}
In [22]:
from pylab import *
cmap = cm.get_cmap('Blues', df['Localidade'].value_counts().nunique())   
for i in range(cmap.N):
    rgb = cmap(i)[:3] # will return rgba, we take only first 3 so we get rgb
In [23]:
lista = []
aux = []
count=-1
for i in df['Localidade'].value_counts(ascending = True):
    if i not in aux:
        count+=1
    aux.append(i)
    lista.append(count)
ref = pd.DataFrame(data=lista, index=df['Localidade'].value_counts(ascending = True).index)
In [29]:
from lxml import etree
f = open('RJ-CNPQ-DGP.svg')
doc = etree.fromstring(f.read().encode('utf-8'))
In [31]:
for i in doc[7]:
    i.attrib['style'] = "fill: white; stroke:#000000; stroke-width:80"
    cormapa = "fill: white; stroke:#000000; stroke-width:80"
    i.attrib['onmouseout'] = cormapa
    i.attrib['onmouseout'] = "mouseOut(evt,'white', this.id)"
    i.attrib['onmouseover'] = i.attrib['onmouseover'].replace("Desc.", "0 Grupo(s)")
    i.attrib['onclick'] = i.attrib['onmouseover']
                    
    if MunCd[i.attrib['id']] in ref.index:
        count = ref.loc[MunCd[i.attrib['id']]][0]
        if df['Localidade'].value_counts(ascending = True)[MunCd[i.attrib['id']]] == df['Localidade'].value_counts(ascending = True).unique()[count]:
            cormapa = "fill: "+ matplotlib.colors.rgb2hex(cmap(count)[:3])
            i.attrib['style'] = cormapa
            i.attrib['onmouseout'] = 'mouseOut(evt,"'+ matplotlib.colors.rgb2hex(cmap(count)[:3]) +'", this.id)'
            Descricao = str(df['Localidade'].value_counts(ascending = True)[MunCd[i.attrib['id']]])
            i.attrib['onmouseover'] = i.attrib['onmouseover'].replace("0", Descricao)
            i.attrib['onclick'] = i.attrib['onmouseover']
            
            for j in i:
                j.text = MunCd[i.attrib['id']] 
                        
     
        
    
for i in doc[15]:
        i.text = "0"
for i in doc[16]:
        i.text = str(max(df['Localidade'].value_counts(ascending = True)))
        
for i in doc[17]:
        i.text = "#Grupos x Município"
        
for i in doc[2]:
        for j in i:
            if j.attrib['id'] == "stop4883":
                corbarra = matplotlib.colors.rgb2hex(cmap(max(ref.values)[0])[:3])
                j.attrib['style'] = "stop-color:"+ corbarra + ";stop-opacity:1;"  #fim escala
            if j.attrib['id'] == "stop4885":
                corbarra = matplotlib.colors.rgb2hex(cmap(min(ref.values)[0])[:3])
                j.attrib['style'] = "stop-color:"+ corbarra + ";stop-opacity:1;"  #inicio escala
   
In [32]:
mapa =etree.tostring(doc)
with open('RJ_Grupos.svg','w') as f:
        f.write(mapa.decode('utf-8'))
In [33]:
%%HTML
<figure>
      <embed type="image/svg+xml" src="RJ_Grupos.svg" width="1100" />
    </figure>

Obs:
No computador, ao passar o mouse sobre o município o mapa exibe seu nome.
Em celulares e tablets, é necessário clicar no município para exibir o nome.



image/svg+xmlItatiaiaPorto RealResendeMendesBarra do PiraíBarra MansaPinheiralPiraíQuatisRio ClaroVolta RedondaParacambiSeropédicaValencaEngenheiro Paulo de FrontinJaperiMiguel PereiraNilópolisNova IguaçuQueimadosRio das FloresVassourasMesquitaSão João de MeritiBelford RoxoDuque de CaxiasPaty do AlferesPetrópolisArealComendador Levy GasparianParaiba do SulTrês RiosGuapimirimItaboraiMageMaricáNiteróiRio BonitoTanguaSumidouroCarmoSao Jose do Vale do Rio PretoSapucaiaTeresópolisCachoeiras de MacacuNova FriburgoSaquaremaSilva JardimLaje do MuriaeMiracemaSanto Antônio de PáduaAperibeBom JardimCantagaloCordeiroDuas BarrasItaocaraMacucoSao Sebastiao do AltoTrajano de MoraesSao Pedro da AldeiaArmacao dos BuziosArraial do CaboCabo FrioCasimiro de AbreuAraruamaRio das OstrasIguaba GrandeVarre-SaiCambuciItaperunaNatividadePorciunculaSao Jose de UbaConceicao de MacabuCarapebusSanta Maria MadalenaBom Jesus do ItabapoanaCampos dos GoytacazesCardoso MoreiraItalvaQuissamãSao Francisco de ItabapoanaSao FidelisSao Joao da BarraParatyAngra dos ReisMacaéItaguaiRio de JaneiroMangaratibaSão GonçaloBaixada LitoraneaNoroeste FluminenseCentro FluminenseMetropolitana do Rio de JaneiroSul FluminenseNorte FluminenseEseeeeeee0 3319 #Grupos x Município
In [ ]: