...
 
Commits (3)
import dash_core_components as dcc
import dash_html_components as html
from dash.dependencies import Input, Output
import pandas as pd
import plotly.graph_objs as go
......@@ -19,6 +20,10 @@ extrema = extrema.loc[shortname]
# Data
data = pd.read_csv(DATA_PATH, low_memory=False, nrows=1)
cols_d = {c[:4]: c[7:] for c in list(data.columns)[11:]}
dataq = pd.read_csv(INTERIM_PATH +
'QUESTIONNAIRE_DEMOCRATIE_ET_CITOYENNETE.csv',
nrows=1)
colsq_d = {c[:3]: c[6:] for c in list(dataq.columns)[7:-1]}
with open('../figures/%s_contributeurs.html' % shortname, 'r') as f:
map_contrib = f.read()
......@@ -29,6 +34,14 @@ with open('../figures/%s_contributeurs_per100000.html' % shortname, 'r') as f:
layout = html.Div([
back,
html.H3(children='Démocratie et Citoyenneté'),
dcc.Tabs(id="tabs-dem", value='tab-1-dem', children=[
dcc.Tab(label='Questionnaire long', value='tab-1-dem'),
dcc.Tab(label='Questionnaire rapide', value='tab-2-dem'),
]),
html.Div(id='tabs-content-dem')
])
layout_long = html.Div([
# Répartition géographique des contributeurs
html.H4('Répartition géographique des contributions'),
html.Iframe(
......@@ -345,3 +358,52 @@ Un grand nombre de contributeurs évoquent un **service civique** ou un **servic
On retrouve également des thèmes communs à d'autres questions, comme **la limitation de vitesse à 80km/h**, la **prise en compte du vote blanc**, le **référendum d'initiative citoyenne**, le fait de **rendre le vote obligatoire**, le **tirage au sort de citoyens**, ainsi que la devise française **Liberté, égalité, fraternité**.
''')),
])
layout_rapide = html.Div([
#'Q11 - Selon vous, faut-il introduire une dose de proportionnelle pour certaines élections, lesquelles ?',
html.H4(children=colsq_d['Q11']),
#"Q12 - Pensez-vous qu'il serait souhaitable de réduire le nombre de parlementaires (députés + sénateurs = 925) ?",
html.H4(children=colsq_d['Q12']),
dcc.Graph(
id='Q12barh',
figure=figure_barh('Q12')
),
#'Q13 - Faut-il rendre le vote obligatoire ?',
html.H4(children=colsq_d['Q13']),
dcc.Graph(
id='Q13barh',
figure=figure_barh('Q13')
),
#'Q14 - Faut-il avoir davantage recours au référendum au niveau national ?',
html.H4(children=colsq_d['Q14']),
dcc.Graph(
id='Q14barh',
figure=figure_barh('Q14')
),
#'Q15 - Faut-il avoir davantage recours au référendum au niveau local ?',
html.H4(children=colsq_d['Q15']),
dcc.Graph(
id='Q15barh',
figure=figure_barh('Q15')
),
#'Q16 - Faut-il tirer au sort des citoyens non élus pour les associer à la décision publique ?',
html.H4(children=colsq_d['Q16']),
dcc.Graph(
id='Q16barh',
figure=figure_barh('Q16')
),
#"Q17 - Diriez-vous que l'application de la laïcité en France est aujourd'hui:"
html.H4(children=colsq_d['Q17']),
dcc.Graph(
id='Q17barh',
figure=figure_barh('Q21')
),
])
@app.callback(Output('tabs-content-dem', 'children'),
[Input('tabs-dem', 'value')])
def render_content(tab):
if tab == 'tab-1-dem':
return layout_long
elif tab == 'tab-2-dem':
return layout_rapide
import dash_core_components as dcc
import dash_html_components as html
from dash.dependencies import Input, Output
import pandas as pd
import plotly.graph_objs as go
......@@ -20,8 +21,12 @@ extrema = extrema.loc[shortname]
# Data
data = pd.read_csv(DATA_PATH, low_memory=False, nrows=1)
cols_d = {c[:4]: c[7:] for c in list(data.columns)[11:]}
dataq = pd.read_csv(INTERIM_PATH +
'QUESTIONNAIRE_LA_FISCALITE_ET_LES_DEPENSES_PUBLIQUES.csv',
nrows=1)
colsq_d = {c[:3]: c[6:] for c in list(dataq.columns)[7:-1]}
q206 = pd.read_csv(INTERIM_PATH + 'Q206.csv', index_col=0)
q206 = pd.read_csv('../data/processed/Q206.csv', index_col=0)
with open('../figures/%s_contributeurs.html' % shortname, 'r') as f:
map_contrib = f.read()
......@@ -32,7 +37,14 @@ with open('../figures/%s_contributeurs_per100000.html' % shortname, 'r') as f:
layout = html.Div([
back,
html.H3(children='La fiscalité et les dépenses publiques'),
dcc.Tabs(id="tabs-fisc", value='tab-1-fisc', children=[
dcc.Tab(label='Questionnaire long', value='tab-1-fisc'),
dcc.Tab(label='Questionnaire rapide', value='tab-2-fisc'),
]),
html.Div(id='tabs-content-fisc')
])
layout_long = html.Div([
# Répartition géographique des contributeurs
html.H4('Répartition géographique des contributions'),
html.Iframe(
......@@ -146,3 +158,34 @@ Par rapport aux institutions, des contributeurs demandent à **réduire le train
Les contributeurs parlent de nombreux autres sujets mais notre analyse montre ses limites pour analyser plus en profondeur les propositions. Sans préciser le contexte, mentionnons juste quelques autres thèmes abordés : les **entreprises*, le **service public**, la **sécurité sociale**, le **travail**, les **salaires**, les **plus riches** ou encore les **autres pays**.
'''),
])
layout_rapide = html.Div([
#"Q31 - Afin de réduire le déficit public de la France qui dépense plus qu'elle ne gagne, pensez-vous qu'il faut avant tout:",
html.H4(children=colsq_d['Q31']),
dcc.Graph(
id='Q31barh',
figure=figure_barh('Q31')
),
#'Q32 - Afin de baisser les impôts et réduire la dette, quelles dépenses publiques faut-il réduire en priorité ?',
html.H4(children=colsq_d['Q32']),
dcc.Graph(
id='Q32barh',
figure=figure_barh('Q32')
),
#"Q33 - Parmi les dépenses de l'Etat et des collectivités territoriales, dans quels domaines faut-il faire avant tout des économies ?",
html.H4(children=colsq_d['Q33']),
#"Q34 - Seriez-vous prêt à payer un impôt pour encourager des comportements bénéfiques à la collectivité comme la fiscalité écologique ou la fiscalité sur le tabac ou l'alcool ?"
html.H4(children=colsq_d['Q34']),
dcc.Graph(
id='Q34barh',
figure=figure_barh('Q34')
),
])
@app.callback(Output('tabs-content-fisc', 'children'),
[Input('tabs-fisc', 'value')])
def render_content(tab):
if tab == 'tab-1-fisc':
return layout_long
elif tab == 'tab-2-fisc':
return layout_rapide
import dash_core_components as dcc
import dash_html_components as html
import dash_bootstrap_components as dbc
from dash.dependencies import Input, Output
import pandas as pd
import plotly.graph_objs as go
......@@ -20,6 +21,14 @@ extrema = extrema.loc[shortname]
# Data
data = pd.read_csv(DATA_PATH, low_memory=False, nrows=1)
cols_d = {c[:4]: c[7:] for c in list(data.columns)[11:]}
dataq = pd.read_csv(INTERIM_PATH +
'QUESTIONNAIRE_ORGANISATION_DE_LETAT_ET_DES_SERVICES_PUBLICS.csv',
nrows=1)
colsq_d = {c[:3]: c[6:] for c in list(dataq.columns)[7:-1]}
q43 = pd.read_csv('../data/processed/Q43.csv', index_col=0)
q45 = pd.read_csv('../data/processed/Q45.csv', index_col=0)
q46 = pd.read_csv('../data/processed/Q46.csv', index_col=0)
with open('../figures/%s_contributeurs.html' % shortname, 'r') as f:
map_contrib = f.read()
......@@ -36,7 +45,14 @@ with open('../figures/%s_Q204_map.html' % shortname, 'r') as f:
layout = html.Div([
back,
html.H3(children='Organisation de l\'État et des services publiques'),
dcc.Tabs(id="tabs-org", value='tab-1-org', children=[
dcc.Tab(label='Questionnaire long', value='tab-1-org'),
dcc.Tab(label='Questionnaire rapide', value='tab-2-org'),
]),
html.Div(id='tabs-content-org')
])
layout_long = html.Div([
# Répartition géographique des contributeurs
html.H4('Répartition géographique des contributions'),
html.Iframe(
......@@ -347,3 +363,113 @@ On retrouve les **hauts-fonctionnaires** pointés du doigt de même que le **tra
D'autres thématiques abordées : la **justice**, la **santé** (notamment les **hôpitaux** et les **déserts médicaux**), l'**Éducation nationale**, la **sécurité sociale**, les **services publics**, les **collectivités locales**, les **personnes âgées**. Parmi des thèmes mineurs, on notera la demande d'enseignement des **langues régionales**.
'''),
])
layout_rapide = html.Div([
#'Q41 - Savez-vous quels sont les différents échelons administratifs (Etat, collectivités territoriales comme la région, la commune, opérateurs comme par exemple Pole Emploi ou la CAF) qui gèrent les différents services publics dans votre territoire ?',
html.H4(children=colsq_d['Q41']),
dcc.Graph(
id='Q41barh',
figure=figure_barh('Q41')
),
#'Q42 - Pensez-vous qu’il y a trop d’échelons administratifs en France ?',
html.H4(children=colsq_d['Q42']),
dcc.Graph(
id='Q42barh',
figure=figure_barh('Q42')
),
#'Q43 - Quels sont les niveaux de collectivités territoriales auxquels vous êtes le plus attaché ?',
html.H4(children=colsq_d['Q43']),
dcc.Graph(
id='Q43',
figure=dict(
data=[go.Bar(
x=q43['pourcentage'],
y=q43.index,
orientation='h',
marker=dict(color=q43['colors']))],
layout=go.Layout(
xaxis=dict(range=[0,100]),
yaxis=dict(automargin=True))
)
),
#"Q44 - Lorsqu'un déplacement est nécessaire pour effectuer une démarche administrative, quelle distance pouvez-vous parcourir sans difficulté ?",
html.H4(children=colsq_d['Q44']),
dcc.Graph(
id='Q44barh',
figure=figure_barh('Q44')
),
#'Q45 - Pour accéder à certains services publics, vous avez avant tout des besoins...',
html.H4(children=colsq_d['Q45']),
dcc.Graph(
id='Q45',
figure=dict(
data=[go.Bar(
x=q45['pourcentage'],
y=q45.index,
orientation='h',
marker=dict(color=q45['colors']))],
layout=go.Layout(
xaxis=dict(range=[0,100]),
yaxis=dict(automargin=True))
)
),
#'Q46 - Si vous rencontrez des difficultés pour effectuer vos démarches administratives sur Internet, de quel accompagnement souhaiteriez-vous bénéficier ?',
html.H4(children=colsq_d['Q46']),
dcc.Graph(
id='Q46',
figure=dict(
data=[go.Bar(
x=q46['pourcentage'],
y=q46.index,
orientation='h',
marker=dict(color=q46['colors']))],
layout=go.Layout(
xaxis=dict(range=[0,100]),
yaxis=dict(automargin=True))
)
),
#"Q47 - Seriez-vous d'accord pour qu'un agent public effectue certaines démarches à votre place ?",
html.H4(children=colsq_d['Q47']),
dcc.Graph(
id='Q47barh',
figure=figure_barh('Q47')
),
#'Q48 - Que pensez-vous du regroupement dans un même lieu de plusieurs services publics (Maisons de services au public) ?',
html.H4(children=colsq_d['Q48']),
dcc.Graph(
id='Q48barh',
figure=figure_barh('Q48')
),
#'Q49 - Que pensez-vous des services publics itinérants (bus de services publics) ?',
html.H4(children=colsq_d['Q49']),
dcc.Graph(
id='Q49barh',
figure=figure_barh('Q49')
),
#'Q50 - Que pensez-vous du service public sur prise de rendez-vous ?',
html.H4(children=colsq_d['Q50']),
dcc.Graph(
id='Q50barh',
figure=figure_barh('Q50')
),
#"Q51 - Que pensez-vous des agents publics polyvalents susceptibles de vous accompagner dans l'accomplissement de plusieurs démarches quelle que soit l'administration concernée ?",
html.H4(children=colsq_d['Q51']),
dcc.Graph(
id='Q51barh',
figure=figure_barh('Q51')
),
#'Q52 - Avez-vous déjà renoncé à des droits / des allocations en raison de démarches administratives trop complexes ?'
html.H4(children=colsq_d['Q52']),
dcc.Graph(
id='Q52barh',
figure=figure_barh('Q52')
),
])
@app.callback(Output('tabs-content-org', 'children'),
[Input('tabs-org', 'value')])
def render_content(tab):
if tab == 'tab-1-org':
return layout_long
elif tab == 'tab-2-org':
return layout_rapide
import dash_core_components as dcc
import dash_html_components as html
import dash_bootstrap_components as dbc
from dash.dependencies import Input, Output
import pandas as pd
import plotly.graph_objs as go
......@@ -20,8 +21,11 @@ extrema = extrema.loc[shortname]
# Data
data = pd.read_csv(DATA_PATH, low_memory=False, nrows=1)
cols_d = {c[:4]: c[7:] for c in list(data.columns)[11:]}
dataq = pd.read_csv(INTERIM_PATH + 'QUESTIONNAIRE_LA_TRANSITION_ECOLOGIQUE.csv', nrows=1)
colsq_d = {c[:3]: c[6:] for c in list(dataq.columns)[7:-1]}
q207 = pd.read_csv(INTERIM_PATH + 'Q207.csv', index_col=0)
q207 = pd.read_csv('../data/processed/Q207.csv', index_col=0)
q26 = pd.read_csv('../data/processed/Q26.csv', index_col=0)
# Maps
with open('../figures/%s_contributeurs.html' % shortname, 'r') as f:
......@@ -36,7 +40,14 @@ with open('../figures/transition_q154_map.html', 'r') as f:
layout = html.Div([
back,
html.H3(children='La transition écologique'),
dcc.Tabs(id="tabs-trans", value='tab-1-trans', children=[
dcc.Tab(label='Questionnaire long', value='tab-1-trans'),
dcc.Tab(label='Questionnaire rapide', value='tab-2-trans'),
]),
html.Div(id='tabs-content-trans')
])
layout_long = html.Div([
# Répartition géographique des contributeurs
html.H4('Répartition géographique des contributions'),
html.Iframe(
......@@ -228,3 +239,65 @@ L'analyse par les expressions les plus utilisées ne permet pas de mettre en ava
Cette question est encore plus ouverte que les précédentes et demanderait une lecture des réponses pour vraiment retranscrire les idées des contributeurs. Nous mettrons surtout ici en avant les thèmes évoqués par les contributeurs. Encore une fois les **transports** sont une préoccupation massive avec les **transports en communs**, la **voiture électrique**, que certains estiment d'ailleurs ne **pas** être une solution, ou encore le **transport aérien**. L'énergie est aussi beaucoup abordée avec le **nucléaire**, les **énergies renouvelables**, les **énergies fossiles**, ainsi que le **solaire**. La **pollution**, les **déchets**, notamment le **plastique**, ainsi que les **pesticides** sont cités de nombreuses fois. L'idée de **taxer** est très évoquée, pour les **gros pollueurs**, via le principe **pollueur/payeur** mais tout en gardant du **pouvoir d'achat**. Les **circuits courts** sont mis en avant avec l'**agriculture biologique** et un lobby demandant la **fin de l'élevage industriel** pour adopter des **pratiques de productions respecteuses des animaux et de l'environnement**. Le **réchauffement climatique**, la réduction des **gaz à effet de serre** sont aussi dans les débats. Les contributeurs demandent à agir au niveau **européen** et à penser sur le **long terme**. Dans les divers, on remarquera la **lutte contre l'obsolescence programmée**.
'''),
])
layout_rapide = html.Div([
#"Q21 - Pensez-vous que vos actions en faveur de l'environnement peuvent vous permettre de faire des économies ?",
html.H4(children=colsq_d['Q21']),
dcc.Graph(
id='Q21barh',
figure=figure_barh('Q21')
),
#"Q22 - Diriez-vous que vous connaissez les aides et dispositifs qui sont aujourd'hui proposés par l'Etat, les collectivités, les entreprises et les associations pour l'isolation et le chauffage des logements, et pour les déplacements ?",
html.H4(children=colsq_d['Q22']),
dcc.Graph(
id='Q22barh',
figure=figure_barh('Q22')
),
#'Q23 - Pensez-vous que les taxes sur le diesel et sur l’essence peuvent permettre de modifier les comportements des utilisateurs ?',
html.H4(children=colsq_d['Q23']),
dcc.Graph(
id='Q23barh',
figure=figure_barh('Q23')
),
#'Q24 - À quoi les recettes liées aux taxes sur le diesel et l’essence doivent-elles avant tout servir ?',
html.H4(children=colsq_d['Q24']),
dcc.Graph(
id='Q24barh',
figure=figure_barh('Q24')
),
#'Q25 - Selon vous, la transition écologique doit être avant tout financée :',
html.H4(children=colsq_d['Q25']),
dcc.Graph(
id='Q25barh',
figure=figure_barh('Q25')
),
#'Q26 - Et qui doit être en priorité concerné par le financement de la transition écologique ?',
html.H4(children=colsq_d['Q26']),
dcc.Graph(
id='Q26',
figure=dict(
data=[go.Bar(
x=q26['pourcentage'],
y=q26.index,
orientation='h',
marker=dict(color=q26['colors']))],
layout=go.Layout(
xaxis=dict(range=[0,100]),
yaxis=dict(automargin=True))
)
),
#'Q27 - Que faudrait-il faire pour protéger la biodiversité et le climat tout en maintenant des activités agricoles et industrielles compétitives par rapport à leurs concurrents étrangers, notamment européens ?'
html.H4(children=colsq_d['Q27']),
dcc.Graph(
id='Q27barh',
figure=figure_barh('Q27')
),
])
@app.callback(Output('tabs-content-trans', 'children'),
[Input('tabs-trans', 'value')])
def render_content(tab):
if tab == 'tab-1-trans':
return layout_long
elif tab == 'tab-2-trans':
return layout_rapide
......@@ -4,6 +4,15 @@ import dash_html_components as html
INTERIM_PATH = '../data/interim/'
FIG_PATH = '../figures/'
files = ['DEMOCRATIE_ET_CITOYENNETE', 'LA_TRANSITION_ECOLOGIQUE',
'LA_FISCALITE_ET_LES_DEPENSES_PUBLIQUES', 'ORGANISATION_DE_LETAT_ET_DES_SERVICES_PUBLICS']
shortnames = ['democratie', 'transition', 'fiscalite', 'organisation']
qfiles = ['QUESTIONNAIRE_DEMOCRATIE_ET_CITOYENNETE', 'QUESTIONNAIRE_LA_TRANSITION_ECOLOGIQUE',
'QUESTIONNAIRE_LA_FISCALITE_ET_LES_DEPENSES_PUBLIQUES',
'QUESTIONNAIRE_ORGANISATION_DE_LETAT_ET_DES_SERVICES_PUBLICS']
qshortnames = ['democratie-rapide', 'transition-rapide', 'fiscalite-rapide', 'organisation-rapide']
extrema = pd.read_csv(INTERIM_PATH + 'participation_gens_extrema.csv', index_col=0)
analyse = 'Analyse des expressions les plus utilisées'
......
......@@ -4,7 +4,7 @@ import sys
sys.path.append('../src')
import maputils
from maputils import save_map
from utils import (code_departement, accents,
from utils import (code_departement, accents, per,
red, green, blue, grey, brown, purple, orange)
def order_rep(rep):
......@@ -50,7 +50,93 @@ def main():
tmp['order'] = tmp.index
tmp['order'] = tmp['order'].apply(order_rep)
tmp = tmp.sort_values('order').drop('order', axis=1)
tmp.to_csv('../data/interim/%s.csv' % yn_q[:4])
tmp.to_csv('../data/processed/%s.csv' % yn_q[:4])
# Q142
q142 = df["Q142 - En matière d\'immigration, une fois nos obligations d\'asile "
"remplies, souhaitez-vous que nous puissions nous fixer des objectifs "
"annuels définis par le Parlement ?"]
na = q142.isna().sum() / N * 100.
q142 = q142.dropna().apply(lambda x : x.lower())
oui = q142.apply(lambda x: 'oui' in x and not 'non' in x).sum() / N * 100.
non = q142.apply(lambda x: 'non' in x and not 'oui' in x).sum() / N * 100.
nini = q142.apply(lambda x: not 'oui' in x and not 'non' in x).sum() / N * 100.
ouinon = q142.apply(lambda x: 'oui' in x and 'non' in x).sum() / N * 100.
df_ = [['Oui', oui, blue],
['Non', non, red],
['Ni oui, ni non', nini, brown],
['Oui et non', ouinon, orange],
['Pas de réponse', na, grey]
]
df_ = pd.DataFrame(df_, columns=['Q142', 'id', 'colors'])
df_.to_csv('../data/processed/Q142.csv', index=False)
# Q207
q207 = df["Q207 - Si non, quelles sont les solutions de mobilité "
"alternatives que vous souhaiteriez pouvoir utiliser ?"]
na = q207.isna().sum() / N * 100.
q207 = q207.dropna().apply(lambda x : x.lower())
oui = q207.apply(lambda x: 'oui' in x and not 'non' in x).sum() / N * 100.
non = q207.apply(lambda x: 'non' in x and not 'oui' in x).sum() / N * 100.
nini = q207.apply(lambda x: not 'oui' in x and not 'non' in x).sum() / N * 100.
ouinon = q207.apply(lambda x: 'oui' in x and 'non' in x).sum() / N * 100.
df_ = [['Oui', oui, blue],
['Non', non, red],
['Ni oui, ni non', nini, brown],
['Oui et non', ouinon, orange],
['Pas de réponse', na, grey]
]
df_ = pd.DataFrame(df_, columns=['Q207', 'id', 'colors'])
df_.to_csv('../data/processed/Q207.csv', index=False)
# Questionnaire
colors = {'Oui': blue, 'Non': red, 'Pas de réponse': grey, 'Je ne sais pas': brown,
'A améliorer': orange, 'Satisfaisante': blue, 'A modifier profondément': red,
'Législatives': green, 'Régionales': purple, 'Départementales': orange,
'Il ne faut pas introduire de proportionnelle': red}
order = {'Oui': 0, 'Non': 1, 'Pas de réponse': 5, 'Je ne sais pas': 2,
'A améliorer': 1, 'Satisfaisante': 0, 'A modifier profondément': 2,
'Législatives': 0, 'Régionales': 1, 'Départementales': 2,
'Il ne faut pas introduire de proportionnelle': 3}
# Choix unique
data = (pd.read_csv('../data/interim/QUESTIONNAIRE_DEMOCRATIE_ET_CITOYENNETE.csv',
low_memory=False)
.fillna('Pas de réponse'))
N = len(data)
yn_questions = ["Q12 - Pensez-vous qu'il serait souhaitable de "
"réduire le nombre de parlementaires (députés + sénateurs = 925) ?",
'Q13 - Faut-il rendre le vote obligatoire ?',
'Q14 - Faut-il avoir davantage recours au référendum au niveau national ?',
'Q15 - Faut-il avoir davantage recours au référendum au niveau local ?',
'Q16 - Faut-il tirer au sort des citoyens non élus pour les associer à la décision publique ?',
"Q17 - Diriez-vous que l'application de la laïcité en France est aujourd'hui:"]
yn_data = data[['id', 'code'] + yn_questions].copy()
yn_data.columns = ['id', 'code'] + [c[:3] for c in yn_questions]
for yn_q in yn_data.columns[2:]:
df = yn_data.groupby(yn_q).count()[['id']].reset_index()
df['colors'] = df[yn_q].apply(lambda x: colors[x])
df['order'] = df[yn_q].apply(lambda x: order[x])
df = df.sort_values('order').drop('order', axis=1)
df.to_csv('../data/processed/%s.csv' % yn_q, index=False)
# Q11
reps = ['Législatives', 'Régionales', 'Départementales', 'Il ne faut pas introduire de proportionnelle', 'Pas de réponse']
q = data["Q11 - Selon vous, faut-il introduire une dose"
" de proportionnelle pour certaines élections, lesquelles ?"]
df = []
for rep in reps[:3]:
cnt = q.apply(lambda x: rep in x and not reps[3] in x).sum()
df.append([rep, per(cnt, N), blue])
cnt = q.apply(lambda x: rep in x and reps[3] in x).sum()
df.append([rep + ' + Non', per(cnt, N), brown])
rep = reps[3]
cnt = q.apply(lambda x: rep in x and not '|' in x).sum()
df.append([rep, per(cnt, N), red])
cnt = q.apply(lambda x: rep in x and '|' in x).sum()
df.append([rep + ' + Oui', per(cnt, N), brown])
rep = reps[4]
cnt = q.apply(lambda x: rep in x).sum()
df.append([rep, per(cnt, N), grey])
pd.DataFrame(df, columns=['reponse', 'pourcentage', 'colors']).to_csv('../data/processed/Q11.csv', index=False)
if __name__ == '__main__':
main()
......@@ -4,11 +4,25 @@ import sys
sys.path.append('../src')
import maputils
from maputils import save_map
from utils import (code_departement, accents,
from utils import (code_departement, accents, per, has_other,
red, green, blue, grey, brown, purple, orange)
def per(v, N):
return round(v.sum()/N*100, 2)
colors = {'Oui': blue, 'Non': red, 'Pas de réponse': grey, 'Je ne sais pas': brown,
'Réduire la dépense publique': green,
'Augmenter les impôts': red,
'Faire les deux en même temps': purple,
'Les dépenses des collectivités territoriales': orange,
'Les dépenses de l\'Etat': green,
'Les dépenses sociales': purple,
}
order = {'Oui': 0, 'Non': 1, 'Pas de réponse': 7, 'Je ne sais pas': 4,
'Réduire la dépense publique': 0,
'Augmenter les impôts': 1,
'Faire les deux en même temps': 2,
'Les dépenses des collectivités territoriales': 0,
'Les dépenses de l\'Etat': 1,
'Les dépenses sociales': 2,
}
def main():
data = pd.read_csv('../data/interim/LA_FISCALITE_ET_LES_DEPENSES_PUBLIQUES.csv', low_memory=False)
......@@ -29,7 +43,49 @@ def main():
reps.append([rep, per(data_206.apply(lambda x: rep in x), N)])
res_206 = pd.DataFrame(reps, columns=['reponse', 'pourcentage'])
res_206['colors'] = [grey] + [blue] * 4
res_206.to_csv('../data/interim/%s.csv' % q206[:4], index=False)
res_206.to_csv('../data/processed/%s.csv' % q206[:4], index=False)
# Questionnaire
data = (pd.read_csv('../data/interim/QUESTIONNAIRE_LA_FISCALITE_ET_LES_DEPENSES_PUBLIQUES.csv',
low_memory=False)
.fillna('Pas de réponse'))
N = len(data)
# Choix unique
yn_questions = ["Q31 - Afin de réduire le déficit public de la France qui dépense plus qu'elle ne gagne, pensez-vous qu'il faut avant tout:",
"Q32 - Afin de baisser les impôts et réduire la dette, quelles dépenses publiques faut-il réduire en priorité ?",
"Q34 - Seriez-vous prêt à payer un impôt pour encourager des comportements bénéfiques à la collectivité comme "
"la fiscalité écologique ou la fiscalité sur le tabac ou l'alcool ?"]
yn_data = data[['id', 'code'] + yn_questions].copy()
yn_data.columns = ['id', 'code'] + [c[:3] for c in yn_questions]
for yn_q in yn_data.columns[2:]:
df = yn_data.groupby(yn_q).count()[['id']].reset_index()
df['colors'] = df[yn_q].apply(lambda x: colors[x])
df['order'] = df[yn_q].apply(lambda x: order[x])
df = df.sort_values('order').drop('order', axis=1)
df.to_csv('../data/processed/%s.csv' % yn_q[:3], index=False)
# Q33
reps = ["L'éducation et la recherche", 'La défense', 'La sécurité',
'Les transports', "L'environnement", "La politique du logement",
"Pas de réponse"]
q = data["Q33 - Parmi les dépenses de l\'Etat et des collectivités"
" territoriales, dans quels domaines faut-il faire avant tout des économies ?"]
df = []
for rep in reps[:-1]:
cnt = q.apply(lambda x: rep in x)
df.append([rep, per(cnt, N), blue])
autre = q[q.apply(lambda x: has_other(x, reps))]
df.append(['Autre', round(len(autre)/ N * 100, 2), brown])
rep = reps[-1]
cnt = q.apply(lambda x: rep in x)
df.append([rep, per(cnt, N), grey])
(pd.DataFrame(df, columns=['reponse', 'pourcentage', 'colors'])
.to_csv('../data/processed/Q33.csv', index=False))
autre = autre.apply(lambda x: x.split('|')[-1])
autre.to_csv('../data/interim/fiscalite-rapide-Q33-autre.csv', index=False, header=True)
if __name__ == '__main__':
main()
......@@ -4,7 +4,7 @@ import sys
sys.path.append('../src')
import maputils
from maputils import save_map
from utils import (code_departement, accents, detect_equality,
from utils import (code_departement, accents, detect_equality, per,
red, green, blue, grey, brown, purple, orange)
def order_rep(rep):
......@@ -16,6 +16,23 @@ def order_rep(rep):
return 0
return 2
colors = {'Oui': blue, 'Non': red, 'Pas de réponse': grey, 'Je ne sais pas': brown,
'Bonne chose': blue, 'Mauvaise chose': red,
"jusqu'à 5 kms" : green,
"jusqu'à 10 kms": blue,
"jusqu'à 15 kms": purple,
"jusqu'à 20 kms": orange,
"plus de 20 kms": red,
}
order = {'Oui': 0, 'Non': 1, 'Pas de réponse': 5, 'Je ne sais pas': 4,
'Bonne chose': 0, 'Mauvaise chose': 1,
"jusqu'à 5 kms" : 0,
"jusqu'à 10 kms": 1,
"jusqu'à 15 kms": 2,
"jusqu'à 20 kms": 3,
"plus de 20 kms": 4,
}
def main():
df = pd.read_csv('../data/interim/ORGANISATION_DE_LETAT_ET_DES_SERVICES_PUBLICS.csv', low_memory=False)
N = len(df)
......@@ -47,7 +64,7 @@ def main():
tmp['order'] = tmp.index
tmp['order'] = tmp['order'].apply(order_rep)
tmp = tmp.sort_values('order').drop('order', axis=1)
tmp.to_csv('../data/interim/%s.csv' % yn_q[:4])
tmp.to_csv('../data/processed/%s.csv' % yn_q[:4])
map_ques = ['Q170', 'Q204']
palettes = [[brown, red, blue, grey], [red, blue, grey, brown]]
......@@ -57,6 +74,60 @@ def main():
tmp2['values'] = tmp2.apply(detect_equality, axis=1)
tmp2 = tmp2['values'].reset_index()
save_map(tmp2, 'Réponse majoritaire', 'Réponse', 'organisation_%s_map.html' % yn_q, pal)
# Questionnaire
data = (pd.read_csv('../data/interim/QUESTIONNAIRE_ORGANISATION_DE_LETAT_ET_DES_SERVICES_PUBLICS.csv',
low_memory=False)
.fillna('Pas de réponse'))
N = len(data)
# Choix unique
yn_questions = ["Q41 - Savez-vous quels sont les différents échelons administratifs "
"(Etat, collectivités territoriales comme la région, la commune, opérateurs "
"comme par exemple Pole Emploi ou la CAF) qui gèrent les différents "
"services publics dans votre territoire ?",
"Q42 - Pensez-vous qu’il y a trop d’échelons administratifs en France ?",
"Q44 - Lorsqu'un déplacement est nécessaire pour effectuer une démarche "
"administrative, quelle distance pouvez-vous parcourir sans difficulté ?",
"Q47 - Seriez-vous d'accord pour qu'un agent public effectue certaines démarches à votre place ?",
"Q48 - Que pensez-vous du regroupement dans un même lieu de plusieurs "
"services publics (Maisons de services au public) ?",
"Q49 - Que pensez-vous des services publics itinérants (bus de services publics) ?",
"Q50 - Que pensez-vous du service public sur prise de rendez-vous ?",
"Q51 - Que pensez-vous des agents publics polyvalents susceptibles de vous accompagner "
"dans l'accomplissement de plusieurs démarches quelle que soit l'administration concernée ?",
"Q52 - Avez-vous déjà renoncé à des droits / des allocations en raison "
"de démarches administratives trop complexes ?"
]
yn_data = data[['id', 'code'] + yn_questions].copy()
yn_data.columns = ['id', 'code'] + [c[:3] for c in yn_questions]
for yn_q in yn_data.columns[2:]:
df = yn_data.groupby(yn_q).count()[['id']].reset_index()
df['colors'] = df[yn_q].apply(lambda x: colors[x])
df['order'] = df[yn_q].apply(lambda x: order[x])
df = df.sort_values('order').drop('order', axis=1)
df.to_csv('../data/processed/%s.csv' % yn_q[:3], index=False)
# QCM
qcm = ["Q43 - Quels sont les niveaux de collectivités territoriales auxquels vous êtes le plus attaché ?",
"Q45 - Pour accéder à certains services publics, vous avez avant tout des besoins...",
"Q46 - Si vous rencontrez des difficultés pour effectuer vos démarches administratives "
"sur Internet, de quel accompagnement souhaiteriez-vous bénéficier ?"]
reps_ = [["La région", "Le département", "La commune", "L'intercommunalité", "Pas de réponse"],
["Téléphoniques", "Numériques",
"Physiques pour pouvoir vous rendre sur place", "Pas de réponse"],
["Une formation numérique", "Une aide téléphonique"],
"Une prise en charge par un agent", "Pas de réponse"]
for col, reps in zip(qcm, reps_):
q = data[col]
df = []
for rep in reps[:-1]:
cnt = q.apply(lambda x: rep in x)
df.append([rep, per(cnt, N), blue])
rep = reps[-1]
cnt = q.apply(lambda x: rep in x)
df.append([rep, per(cnt, N), grey])
(pd.DataFrame(df, columns=['reponse', 'pourcentage', 'colors'])
.to_csv('../data/processed/%s.csv' % col[:3], index=False))
if __name__ == '__main__':
main()
import numpy as np
import pandas as pd
from maputils import save_map
from utils import (code_departement, accents, detect_equality,
from utils import (code_departement, accents, detect_equality, per,
red, green, blue, grey, brown, purple, orange)
def order_rep(rep):
......@@ -17,9 +17,6 @@ def order_rep(rep):
return 3
return 2
def per(v, N):
return round(v.sum()/N*100, 2)
def isin(x, z):
if x in z:
return 1
......@@ -40,6 +37,38 @@ def groupe_160(rep, all_160, pre_rep_160):
else:
return "Autre"
colors = {'Oui': blue, 'Non': red, 'Pas de réponse': grey, 'Je ne sais pas': brown,
'Cofinancer un plan d’investissement pour changer les modes de production': green,
'Taxer les produits importés qui dégradent l’environnement': orange,
'Modifier les accords commerciaux': purple,
'À financer des aides pour accompagner les Français dans la transition écologique ?': purple,
'À baisser d’autres impôts comme par exemple l’impôt sur le revenu ?': orange,
'À financer des investissements en faveur du climat ?': green,
'Les deux': green,
'Par le budget général de l’État': orange,
'Par la fiscalité écologique': purple,
'Les entreprises': brown,
'Les particuliers': purple,
'Les administrations': orange,
'Tout le monde': green,
}
order = {'Oui': 0, 'Non': 1, 'Pas de réponse': 5, 'Je ne sais pas': 4,
'Cofinancer un plan d’investissement pour changer les modes de production': 0,
'Taxer les produits importés qui dégradent l’environnement': 2,
'Modifier les accords commerciaux': 1,
'À financer des aides pour accompagner les Français dans la transition écologique ?': 1,
'À baisser d’autres impôts comme par exemple l’impôt sur le revenu ?': 2,
'À financer des investissements en faveur du climat ?': 0,
'Les deux': 2,
'Par le budget général de l’État': 1,
'Par la fiscalité écologique': 0,
'Les entreprises': 1,
'Les particuliers': 0,
'Les administrations': 2,
'Tout le monde': 4,
}
def main():
DATA_PATH = '../data/interim/LA_TRANSITION_ECOLOGIQUE.csv'
data = pd.read_csv(DATA_PATH, low_memory=False)
......@@ -63,7 +92,7 @@ def main():
df['order'] = df.index
df['order'] = df['order'].apply(order_rep)
df = df.sort_values('order').drop('order', axis=1)
df.to_csv('../data/interim/%s.csv' % yn_q[:4])
df.to_csv('../data/processed/%s.csv' % yn_q[:4])
# Q154 Map
yn_q = yn_data.columns[5]
......@@ -93,7 +122,7 @@ def main():
data_160_['order'] = data_160_.index
data_160_['order'] = data_160_['order'].apply(order_rep)
data_160_ = data_160_.sort_values(['order', 'id'], ascending=[True,False]).drop('order', axis=1)
data_160_.to_csv('../data/interim/Q160.csv')
data_160_.to_csv('../data/processed/Q160.csv')
#Q207
q207 = 'Q207 - Si non, quelles sont les solutions de mobilité alternatives que vous souhaiteriez pouvoir utiliser ?'
......@@ -101,7 +130,7 @@ def main():
data_207 = []
data_207.append(['Pas de réponse', per(col_207.isnull(), N), grey])
col_207 = col_207.dropna()
for rep in ['Vélo', 'Covoiturage', 'Auto partage']:
for rep in ['Auto partage', 'Covoiturage', 'Transport à la demande', 'Vélo',]:
data_207.append([
rep,
per(col_207.apply(lambda x: isin(rep.lower().translate(accents), x.lower().translate(accents))), N),
......@@ -110,7 +139,48 @@ def main():
'Transports en commun',
per(col_207.apply(lambda x: isin2and('transport', 'commun', x.lower().translate(accents))), N),
blue])
pd.DataFrame(data_207, columns=['reponse', 'pourcentage', 'colors']).to_csv('../data/interim/Q207.csv', index=False)
pd.DataFrame(data_207, columns=['reponse', 'pourcentage', 'colors']).to_csv('../data/processed/Q207.csv', index=False)
# Questionnaire
data = (pd.read_csv('../data/interim/QUESTIONNAIRE_LA_TRANSITION_ECOLOGIQUE.csv',
low_memory=False)
.fillna('Pas de réponse'))
N = len(data)
# Choix unique
yn_questions = ["Q21 - Pensez-vous que vos actions en faveur de l'environnement peuvent vous permettre de faire des économies ?",
"Q22 - Diriez-vous que vous connaissez les aides et dispositifs qui sont aujourd'hui proposés par l'Etat, les collectivités, les entreprises et les associations pour l'isolation et le chauffage des logements, et pour les déplacements ?",
'Q23 - Pensez-vous que les taxes sur le diesel et sur l’essence peuvent permettre de modifier les comportements des utilisateurs ?',
'Q24 - À quoi les recettes liées aux taxes sur le diesel et l’essence doivent-elles avant tout servir ?',
'Q25 - Selon vous, la transition écologique doit être avant tout financée :',
'Q27 - Que faudrait-il faire pour protéger la biodiversité et le climat tout en maintenant des activités agricoles et industrielles compétitives par rapport à leurs concurrents étrangers, notamment européens ?',]
yn_data = data[['id', 'code'] + yn_questions].copy()
yn_data.columns = ['id', 'code'] + [c[:3] for c in yn_questions]
for yn_q in yn_data.columns[2:]:
df = yn_data.groupby(yn_q).count()[['id']].reset_index()
df['colors'] = df[yn_q].apply(lambda x: colors[x])
df['order'] = df[yn_q].apply(lambda x: order[x])
df = df.sort_values('order').drop('order', axis=1)
df.to_csv('../data/processed/%s.csv' % yn_q, index=False)
# Q26
reps = ['Les particuliers', 'Les entreprises', 'Les administrations', 'Tout le monde', 'Pas de réponse']
q = data['Q26 - Et qui doit être en priorité concerné par le financement de la transition écologique ?']
df = []
for rep in reps[:3]:
cnt = q.apply(lambda x: rep in x and not reps[3] in x).sum()
df.append([rep, per(cnt, N), blue])
cnt = q.apply(lambda x: rep in x and reps[3] in x).sum()
df.append([rep + ' + Non', per(cnt, N), brown])
rep = reps[3]
cnt = q.apply(lambda x: rep in x and not '|' in x).sum()
df.append([rep, per(cnt, N), red])
cnt = q.apply(lambda x: rep in x and '|' in x).sum()
df.append([rep + ' + Oui', per(cnt, N), brown])
rep = reps[4]
cnt = q.apply(lambda x: rep in x).sum()
df.append([rep, per(cnt, N), grey])
pd.DataFrame(df, columns=['reponse', 'pourcentage', 'colors']).to_csv('../data/processed/Q26.csv', index=False)
if __name__ == '__main__':
main()
......@@ -2,7 +2,7 @@ import pandas as pd
import plotly.graph_objs as go
def figure_barh(filename):
df = pd.read_csv('../data/interim/%s.csv' % filename, index_col=0)
df = pd.read_csv('../data/processed/%s.csv' % filename, index_col=0)
return dict(
data=[go.Bar(
x=[round(df['id'].iloc[i]/sum(df['id'])*100, 1)],
......@@ -24,7 +24,7 @@ def figure_barh(filename):
def figure_bar(filename, title, x_col, y_col):
df = pd.read_csv('../data/interim/%s.csv' % filename)
df = pd.read_csv('../data/processed/%s.csv' % filename)
return dict(
data=[go.Bar(
x=df[x_col],
......
......@@ -43,6 +43,20 @@ layout_home = [
id='questionnaire_par_contrib',
figure=figure_questionnaire_par_contrib()
),
html.H4('Méthodologie'),
dcc.Markdown('''
Pour l'analyse des questions ouvertes, nous avons extrait les expressions les plus utilisées ainsi que leur occurence. Pour chaque question, nous avons lu ces expressions et nous avons ensuite rédigé une synthèse reprenant les principaux thèmes abordés. Lorsque le contexte d'une expression n'est pas évident, nous avons lu un certain nombre de contributions contenant l'expression. Cette synthèse n'a pas la prétention d'être exhaustive.
Plus en détail, voici les étapes pour l'extraction des expressions les plus utilisées:
- Séparation des mots et ponctuations
- Mise en minuscule
- Mise des mots sous forme canonique. Cette méthode utilise du machine learning et est imparfaite, générant parfois des formes canoniques inexistantes ou incorrectes. Comme la lecture des expressions est manuelle, nous repérons les formes inexactes et cela ne gêne en rien la compréhension et la synthèse.
- Suppression des symboles spéciaux (ponctuations, caractères arithmétiques)
- Suppression des "mots vides", mots très communs qui apportent peu de sémantique (par exemple "le", "ce", "que")
- Compte des apparitions de chaque mot, tri et sélection des 150 mots les plus fréquents
- Application du même traitement aux groupes de 2, 3 et 4 mots et sélection des 75 groupes les plus fréquents pour chaque taille de groupe
'''),
html.H4('Données'),
html.P("""Les données des contributions en ligne sur les questionnaires de la plateforme du Grand Débat National sont disponibles dans des formats ouverts. Cependant, ce sont les seules contributions qui sont à ce jour librement accessibles dans des formats ouverts. En effet, les comptes-rendus des débats locaux ont été téléversés sur la plateforme, sont accessibles mais ne peuvent bénéficier d'un traitement automatique. Par exemple, il y a des fichiers "images" à partir desquels il n'est pas aisé de récupérer le texte affiché."""),
html.P("""Les citoyens pouvaient également participer grâce à des questionnaires rapides sur la plateforme officielle. Malheureusement, les résultats ne sont pas à jour, la dernière version de ces données datant du 2 mars. De même, des cahiers de doléances ont été mis en place dans des mairies, des citoyens et organisations ont envoyés leurs contributions par voie postale mais rien n'est à ce jour disponible."""),
html.P("""Nous avons par conséquent un biais dans notre analyse qui ne se base ici que sur la portion des contributions numériques émanant donc uniquement de personnes maîtrisant suffisamment l'outil informatique."""),
......
......@@ -2,40 +2,39 @@ import numpy as np
import pandas as pd
import spacy
import nltk
from commons import files, shortnames
nlp = spacy.load('fr', disable=['parser', 'ner'])
files = ['DEMOCRATIE_ET_CITOYENNETE', 'LA_TRANSITION_ECOLOGIQUE',
'LA_FISCALITE_ET_LES_DEPENSES_PUBLIQUES', 'ORGANISATION_DE_LETAT_ET_DES_SERVICES_PUBLICS']
prefix = ['democratie', 'transition', 'fiscalite', 'organisation']
dem_q = [11, 13, 14, 16, 17, 19, 20, 22, 23, 25, 26, 27, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 42, 43, 44, 45, 46, 47]
trans_q = [11, 12, 14, 16, 17, 18, 20, 22, 23, 24, 25, 26]
fisc_q = [11, 12, 13, 14, 15, 16, 17, 18]
org_q = [11, 13, 15, 16, 19, 20, 21, 24, 25, 27, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43]
selected_q = [dem_q, trans_q, fisc_q, org_q]
for k in range(4):
f = files[k]
print(f)
df = pd.read_csv('../data/interim/%s.csv' % f, low_memory=False)
df2 = pd.DataFrame([], index=df['id'])
df = df.iloc[:, selected_q[k]]
questions = df.columns
for question in questions:
print(question)
reponses = df[question].values
rep_lemmas = []
for i,reponse in enumerate(reponses):
if i % 5000 == 0 :
print(i)
if type(reponse) == str:
doc = nlp(reponse.lower())
lemmas = [(token.lemma_, token.pos_) for token in doc]
else:
lemmas = None
rep_lemmas.append(lemmas)
df2[question] = rep_lemmas
df2.to_csv('../data/interim/%s-lemmatized.csv' % prefix[k])
def lemmatize(reponses):
rep_lemmas = []
for i,reponse in enumerate(reponses):
if i % 5000 == 0 :
print(i)
if type(reponse) == str:
doc = nlp(reponse.lower())
lemmas = [(token.lemma_, token.pos_) for token in doc]
else:
lemmas = None
rep_lemmas.append(lemmas)
return rep_lemmas
def main():
for k in range(4):
f = files[k]
print(f)
df = pd.read_csv('../data/interim/%s.csv' % f, low_memory=False)
df2 = pd.DataFrame([], index=df['id'])
df = df.iloc[:, selected_q[k]]
questions = df.columns
for question in questions:
print(question)
reponses = df[question].values
df2[question] = lemmatize(reponses)
df2.to_csv('../data/interim/%s-lemmatized.csv' % shortnames[k])
\ No newline at end of file
......@@ -105,3 +105,62 @@ cols = [
'Q189 - Y a-t-il d\'autres points sur l\'organisation de l\'Etat et des services publics sur lesquels vous souhaiteriez vous exprimer ?',
'code']
]
qcols = [['id',
'createdAt',
'publishedAt',
'updatedAt',
'authorId',
'authorType',
'authorZipCode',
'Q11 - Selon vous, faut-il introduire une dose de proportionnelle pour certaines élections, lesquelles ?',
"Q12 - Pensez-vous qu'il serait souhaitable de réduire le nombre de parlementaires (députés + sénateurs = 925) ?",
'Q13 - Faut-il rendre le vote obligatoire ?',
'Q14 - Faut-il avoir davantage recours au référendum au niveau national ?',
'Q15 - Faut-il avoir davantage recours au référendum au niveau local ?',
'Q16 - Faut-il tirer au sort des citoyens non élus pour les associer à la décision publique ?',
"Q17 - Diriez-vous que l'application de la laïcité en France est aujourd'hui:"],
['id',
'createdAt',
'publishedAt',
'updatedAt',
'authorId',
'authorType',
'authorZipCode',
"Q21 - Pensez-vous que vos actions en faveur de l'environnement peuvent vous permettre de faire des économies ?",
"Q22 - Diriez-vous que vous connaissez les aides et dispositifs qui sont aujourd'hui proposés par l'Etat, les collectivités, les entreprises et les associations pour l'isolation et le chauffage des logements, et pour les déplacements ?",
'Q23 - Pensez-vous que les taxes sur le diesel et sur l’essence peuvent permettre de modifier les comportements des utilisateurs ?',
'Q24 - À quoi les recettes liées aux taxes sur le diesel et l’essence doivent-elles avant tout servir ?',
'Q25 - Selon vous, la transition écologique doit être avant tout financée :',
'Q26 - Et qui doit être en priorité concerné par le financement de la transition écologique ?',
'Q27 - Que faudrait-il faire pour protéger la biodiversité et le climat tout en maintenant des activités agricoles et industrielles compétitives par rapport à leurs concurrents étrangers, notamment européens ?'],
['id',
'createdAt',
'publishedAt',
'updatedAt',
'authorId',
'authorType',
'authorZipCode',
"Q31 - Afin de réduire le déficit public de la France qui dépense plus qu'elle ne gagne, pensez-vous qu'il faut avant tout:",
'Q32 - Afin de baisser les impôts et réduire la dette, quelles dépenses publiques faut-il réduire en priorité ?',
"Q33 - Parmi les dépenses de l'Etat et des collectivités territoriales, dans quels domaines faut-il faire avant tout des économies ?",
"Q34 - Seriez-vous prêt à payer un impôt pour encourager des comportements bénéfiques à la collectivité comme la fiscalité écologique ou la fiscalité sur le tabac ou l'alcool ?"],
['id',
'createdAt',
'publishedAt',
'updatedAt',
'authorId',
'authorType',
'authorZipCode',
'Q41 - Savez-vous quels sont les différents échelons administratifs (Etat, collectivités territoriales comme la région, la commune, opérateurs comme par exemple Pole Emploi ou la CAF) qui gèrent les différents services publics dans votre territoire ?',
'Q42 - Pensez-vous qu’il y a trop d’échelons administratifs en France ?',
'Q43 - Quels sont les niveaux de collectivités territoriales auxquels vous êtes le plus attaché ?',
"Q44 - Lorsqu'un déplacement est nécessaire pour effectuer une démarche administrative, quelle distance pouvez-vous parcourir sans difficulté ?",
'Q45 - Pour accéder à certains services publics, vous avez avant tout des besoins...',
'Q46 - Si vous rencontrez des difficultés pour effectuer vos démarches administratives sur Internet, de quel accompagnement souhaiteriez-vous bénéficier ?',
"Q47 - Seriez-vous d'accord pour qu'un agent public effectue certaines démarches à votre place ?",
'Q48 - Que pensez-vous du regroupement dans un même lieu de plusieurs services publics (Maisons de services au public) ?',
'Q49 - Que pensez-vous des services publics itinérants (bus de services publics) ?',
'Q50 - Que pensez-vous du service public sur prise de rendez-vous ?',
"Q51 - Que pensez-vous des agents publics polyvalents susceptibles de vous accompagner dans l'accomplissement de plusieurs démarches quelle que soit l'administration concernée ?",
'Q52 - Avez-vous déjà renoncé à des droits / des allocations en raison de démarches administratives trop complexes ?']]
......@@ -3,6 +3,7 @@ import pandas as pd
import spacy
import nltk
from collections import Counter
from commons import files, shortnames
from nltk.collocations import (BigramCollocationFinder,
TrigramCollocationFinder, QuadgramCollocationFinder)
......@@ -31,11 +32,6 @@ def open_lemmatized(prefix):
index_col=0, converters=converters)
return df
files = ['DEMOCRATIE_ET_CITOYENNETE', 'LA_TRANSITION_ECOLOGIQUE',
'LA_FISCALITE_ET_LES_DEPENSES_PUBLIQUES', 'ORGANISATION_DE_LETAT_ET_DES_SERVICES_PUBLICS']
prefix = ['democratie', 'transition', 'fiscalite', 'organisation']
collocation_finders = [BigramCollocationFinder,
TrigramCollocationFinder, QuadgramCollocationFinder]
finders_name = ['bi', 'tri', 'quad']
......@@ -85,8 +81,8 @@ def most_common_ngrams(lemmas, collocation_finder, n=75):
def main():
for k in range(4):
print(files[k])
df = open_lemmatized(prefix[k])
ngrams_from_lemmatized(df, prefix[k])
df = open_lemmatized(shortnames[k])
ngrams_from_lemmatized(df, shortnames[k])
if __name__ == '__main__':
main()
......@@ -5,14 +5,16 @@ import numpy as np
import pandas as pd
from maputils import save_map
from utils import code_departement
from name_columns import cols
from name_columns import cols, qcols
import geopandas as gpd
from shapely.geometry import Point
import plotly.graph_objs as go
files = ['DEMOCRATIE_ET_CITOYENNETE', 'LA_TRANSITION_ECOLOGIQUE',
'LA_FISCALITE_ET_LES_DEPENSES_PUBLIQUES', 'ORGANISATION_DE_LETAT_ET_DES_SERVICES_PUBLICS']
shortnames = ['democratie', 'transition', 'fiscalite', 'organisation']
from commons import files, shortnames, qfiles, qshortnames
afiles = files + qfiles
ashortnames = shortnames + qshortnames
acols = cols + qcols
def replace_sep(x):
if type(x) == str:
......@@ -60,45 +62,56 @@ def department_events():
df = df.drop(['departement_pos', 'zipcode'], axis=1)
df.to_csv('../data/interim/EVENTS.csv', index=False)
def add_zipcodes():
print('Zip codes')
zipcodes = pd.read_csv('../data/raw/zipcodes.csv', header=None)
zipcodes = zipcodes[0].values
for f, shortname, columns in zip(files, shortnames, cols):
def add_departements_all():
print('Départements')
for f, shortname, columns in zip(afiles, ashortnames, acols):
print(f)
data = pd.read_csv('../data/raw/%s.csv' % f, low_memory=False)
data['code'] = data['authorZipCode'].apply(lambda x: code_departement(x, zipcodes))
data.columns = columns
if shortname == 'fiscalite':
data[columns[14]] = data[columns[14]].apply(replace_sep)
if shortname == 'transition':
data[columns[5]] = data[columns[5]].apply(replace_sep)
data.to_csv('../data/interim/%s.csv' % f, index=False)
ajout_departements(f, columns)
return
def contribution_map():
def ajout_departements(filename, columns):
zipcodes = pd.read_csv('../data/raw/zipcodes.csv', header=None)
zipcodes = zipcodes[0].values
data = pd.read_csv('../data/raw/%s.csv' % filename, low_memory=False)
if type(data['authorZipCode'].iloc[0]) != int:
data['authorZipCode'] = data['authorZipCode'].fillna('0').apply(eval)
data.columns = columns
data['code'] = data['authorZipCode'].apply(lambda x: code_departement(x, zipcodes))
#if shortname == 'fiscalite':
# data[columns[14]] = data[columns[14]].apply(replace_sep)
#if shortname == 'transition':
# data[columns[5]] = data[columns[5]].apply(replace_sep)
data.to_csv('../data/interim/%s.csv' % filename, index=False)
print('Ajout département %s' % filename)
def contribution_map(filename, shortname):
pop_dep = pd.read_csv('../data/raw/population_departements.csv').drop('nom', axis=1)
data = pd.read_csv('../data/interim/%s.csv' % filename, low_memory=False)
data = data[['authorId', 'code']].drop_duplicates()
pers_dep = data.groupby('code').count()['authorId'].reset_index()
pers_dep.columns = ['code', 'values']
pers_dep = pers_dep.merge(pop_dep, on='code', how='left')#left pour garder mauvais
pers_dep['values_per100000'] = (pers_dep['values'] /
pers_dep['population municipale'] * 100000).fillna(0).apply(int)
pers_dep = pers_dep.drop('population municipale', axis=1)
pers_dep.to_csv(
'../data/processed/%s_personnes_par_departement.csv' % shortname
)
save_map(pers_dep, 'Contributions', 'Nombre de contributions',
'%s_contributeurs.html' % shortname)
pers_dep.columns = ['code', 'raw_values', 'values']
save_map(pers_dep, 'Contributions pour 100000h',
'Nombre de contributions pour 100000 habitants',
'%s_contributeurs_per100000.html' % shortname)
print('Carte contribution %s' % filename)
def contribution_maps_all():
print('Cartes des contributions')
for f, shortname in zip(files, shortnames):
for f, shortname in zip(afiles, ashortnames):
print(f)
data = pd.read_csv('../data/interim/%s.csv' % f, low_memory=False)
data = data[['authorId', 'code']].drop_duplicates()
pers_dep = data.groupby('code').count()['authorId'].reset_index()
pers_dep.columns = ['code', 'values']
pers_dep = pers_dep.merge(pop_dep, on='code', how='left')#left pour garder mauvais
pers_dep['values_per100000'] = (pers_dep['values'] /
pers_dep['population municipale'] * 100000).fillna(0).apply(int)
pers_dep = pers_dep.drop('population municipale', axis=1)
pers_dep.to_csv(
'../data/interim/%s_personnes_par_departement.csv' % shortname
)
save_map(pers_dep, 'Contributions', 'Nombre de contributions',
'%s_contributeurs.html' % shortname)
pers_dep.columns = ['code', 'raw_values', 'values']
save_map(pers_dep, 'Contributions pour 100000h',
'Nombre de contributions pour 100000 habitants',
'%s_contributeurs_per100000.html' % shortname)
contribution_map(f, shortname)
print('EVENTS')
pop_dep = pd.read_csv('../data/raw/population_departements.csv').drop('nom', axis=1)
df = pd.read_csv('../data/interim/EVENTS.csv')
df2 = df.groupby('departement').count()['id'].reset_index()
df2.columns = ['code', 'values']
......@@ -109,42 +122,39 @@ def contribution_map():
def participation():
print('Participation')
nq = {'democratie': 37, 'transition': 16, 'fiscalite': 8, 'organisation': 32}
nq = {'democratie': 37, 'transition': 16, 'fiscalite': 8, 'organisation': 32,
'democratie-rapide': 7, 'transition-rapide': 7, 'fiscalite-rapide': 4, 'organisation-rapide': 12}
extrema = pd.DataFrame([], index=shortnames, columns=['0', '>3', 'maxiQ', 'maxiF'])
for f, shortname in zip(files, shortnames):
for f, shortname in zip(afiles, ashortnames):
print(shortname)
data = pd.read_csv('../data/interim/%s.csv' % f, low_memory=False)
N = len(data)
j = 6 if shortname.endswith('rapide') else 10
tmp0 = data.groupby('authorId').count()
tmp = tmp0.iloc[:, 10:-1].sum(axis=1).reset_index().groupby(0).count()
tmp.to_csv('../data/interim/%s_participation_gens.csv' % shortname, header=True)
tmp = tmp0.iloc[:, j:-1].sum(axis=1).reset_index().groupby(0).count()
tmp.to_csv('../data/processed/%s_participation_gens.csv' % shortname, header=True)
(tmp.loc[tmp.index <= 2 * nq[shortname]]
.to_csv('../data/interim/%s_participation_gens_bar.csv'
.to_csv('../data/processed/%s_participation_gens_bar.csv'
% shortname, header=True))
tmp1 = tmp0.groupby('id').count()['reference']
tmp1 = tmp0.groupby('id').count()['createdAt']
plus3 = tmp1.loc[tmp1.index > 2].sum()
extrema.loc[shortname] = [tmp.loc[0]['authorId'], plus3, tmp.index.max(), tmp1.index.max()]
extrema.loc[shortname] = [tmp.iloc[0]['authorId'], plus3, tmp.index.max(), tmp1.index.max()]
tmp2 = tmp0.sum()/N*100
tmp2.to_csv('../data/interim/%s_participation_question.csv' % shortname, header=True)
extrema.to_csv('../data/interim/participation_gens_extrema.csv')
tmp2.to_csv('../data/processed/%s_participation_question.csv' % shortname, header=True)
extrema.to_csv('../data/processed/participation_gens_extrema.csv')
def questionnaire_par_contributeur():
print('Questionnaires par contributeur')
dem = pd.read_csv('../data/interim/%s.csv' % files[0], low_memory=False)
trans = pd.read_csv('../data/interim/%s.csv' % files[1], low_memory=False)
fisc = pd.read_csv('../data/interim/%s.csv' % files[2], low_memory=False)
org = pd.read_csv('../data/interim/%s.csv' % files[3], low_memory=False)
dem = pd.DataFrame(dem.groupby('authorId').count().iloc[:, 10:-1].sum(axis=1))
trans = pd.DataFrame(trans.groupby('authorId').count().iloc[:, 10:-1].sum(axis=1))
fisc = pd.DataFrame(fisc.groupby('authorId').count().iloc[:, 10:-1].sum(axis=1))
org = pd.DataFrame(org.groupby('authorId').count().iloc[:, 10:-1].sum(axis=1))
contributeurs = (((dem
.merge(trans, left_index=True, right_index=True, how='outer'))
.merge(fisc, left_index=True, right_index=True, how='outer'))
.merge(org, left_index=True, right_index=True, how='outer')
)
df = pd.read_csv('../data/interim/%s.csv' % files[0], low_memory=False)
df = pd.DataFrame(df.groupby('authorId').count().iloc[:, 10:-1].sum(axis=1))
for f in files[1:]:
df1 = pd.read_csv('../data/interim/%s.csv' % f, low_memory=False)
df1 = pd.DataFrame(df1.groupby('authorId').count().iloc[:, 10:-1].sum(axis=1))
df = df.merge(df1, left_index=True, right_index=True, how='outer')
contributeurs = df
contributeurs['nb_contrib'] = 4 - contributeurs.isnull().sum(axis=1)
data = contributeurs.fillna(0).groupby('nb_contrib').count().iloc[:,0]
data.to_csv('../data/interim/nb_questionnaire.csv', header=True)
data.to_csv('../data/processed/nb_questionnaire.csv', header=True)
def per_date():
print('Events par date')
......@@ -152,10 +162,11 @@ def per_date():
df['date'] = pd.to_datetime(df['startAt']).apply(lambda x: x.date())
df2 = df.groupby('date').count()['id']
df2 = df2[df2.index < datetime.date(2019,4,1)]
df2.to_csv('../data/interim/events_per_date.csv', header=True)
df2.to_csv('../data/processed/events_per_date.csv', header=True)
print('Contributions par date')
for f, shortname in zip(files, shortnames):
for f, shortname in zip(afiles, ashortnames):
print(f)
df = pd.read_csv('../data/raw/%s.csv' % f, low_memory=False)
df['date'] = pd.to_datetime(df['publishedAt']).apply(lambda x: x.date())
(df.groupby('date').count()['id']
.to_csv('../data/interim/%s_per_date.csv' % shortname, header=True))
.to_csv('../data/processed/%s_per_date.csv' % shortname, header=True))
......@@ -4,9 +4,9 @@ import data_transition
import data_fiscalite
import data_organisation
pp.add_zipcodes()
pp.add_departements_all()
pp.department_events()
pp.contribution_map()
pp.contribution_maps_all()
pp.participation()
pp.per_date()
pp.questionnaire_par_contributeur()
......
......@@ -40,8 +40,17 @@ def code_departement(code, zipcodes):
else:
return 'Mauvais code postal'
def per(v, N):
return round(v.sum()/N*100, 2)
def detect_equality(row):
if row['Non'] == row['Oui']:
return 'Egalité Oui et Non'
else:
return row.idxmax()
def has_other(s, reps):
last = s.split('|')[-1]
if last in reps:
return False
return True