Commit f158cc6d authored by Myriam Begel's avatar Myriam Begel

Cartes + Bar au lieu de Pie

parent e9b5001f
......@@ -4,4 +4,13 @@ Analyse des données ouvertes du Grand Débat National
## Données
Grand Débat National. Les données originales ont été téléchargées sur [https://www.data.gouv.fr/fr/datasets/donnees-ouvertes-du-grand-debat-national/](https://www.data.gouv.fr/fr/datasets/donnees-ouvertes-du-grand-debat-national/) mise à jour le 17/02/2019. Ces données sont sous licence [Licence Ouverte Etalab](https://github.com/etalab/licence-ouverte/blob/master/LO.md)
### Grand Débat National
Les données originales ont été téléchargées sur [https://www.data.gouv.fr/fr/datasets/donnees-ouvertes-du-grand-debat-national/](https://www.data.gouv.fr/fr/datasets/donnees-ouvertes-du-grand-debat-national/) mise à jour le 17/02/2019. Ces données sont sous [Licence Ouverte Etalab](https://github.com/etalab/licence-ouverte/blob/master/LO.md)
### Départements
Le contour des départements provient de [https://github.com/gregoiredavid/france-geojson](https://github.com/gregoiredavid/france-geojson) sous [Licence Ouverte Etalab](https://github.com/etalab/licence-ouverte/blob/master/LO.md), édition 2018.
La population des départements provient des données de l'INSEE sur le recensement 2016 _(2014 pour la Nouvelle-Calédonie, 2017 pour Mayotte et la Polynésie française, 2018 pour Wallis-et-Futuma)_. La population utilisée est la population municipale.
### Code postaux valides
Les données originales ont été téléchargées sur [https://www.data.gouv.fr/fr/datasets/base-officielle-des-codes-postaux/](https://www.data.gouv.fr/fr/datasets/base-officielle-des-codes-postaux/) sous [Licence Ouverte Etalab](https://github.com/etalab/licence-ouverte/blob/master/LO.md), mis à jour le 11/12/2017.
\ No newline at end of file
bokeh==1.0.4
dash==0.37.0
dash-bootstrap-components==0.3.4
dash-core-components==0.43.1
......@@ -7,6 +8,7 @@ dash-renderer==0.18.0
dash-table==3.4.0
Flask==1.0.2
Flask-Compress==1.4.0
geopandas==0.4.0
matplotlib==3.0.2
nltk==3.4
numpy==1.16.1
......
......@@ -3,7 +3,7 @@ import dash_core_components as dcc
import dash_html_components as html
import dash_bootstrap_components as dbc
from flask import Flask
from flask import Flask, send_from_directory
import numpy as np
import pandas as pd
......@@ -21,6 +21,14 @@ external_stylesheets = [dbc.themes.BOOTSTRAP]
DATA_PATH = '../data/raw/LA_TRANSITION_ECOLOGIQUE.csv'
INTERIM_PATH = '../data/interim/'
FIG_PATH = '../figures/'
red = '#d62728'
blue = '#1f77b4'
grey = '#c3c4c4'
green = '#2ca02c'
orange = '#ff7f0e'
brown = '#8c564b'
purple = '#9467bd'
data = pd.read_csv(DATA_PATH)
cols_d = {c[:4]: c[7:] for c in list(data.columns)[11:]}
......@@ -32,6 +40,17 @@ q154 = pd.read_csv(INTERIM_PATH + 'Q154.csv', index_col=0)
q160 = pd.read_csv(INTERIM_PATH + 'Q160.csv', index_col=0)
q207 = pd.read_csv(INTERIM_PATH + 'Q207.csv', index_col=0)
pers_dep = pd.read_csv(INTERIM_PATH + 'transition_personnes_par_departement.csv', index_col=0)
with open('../figures/transition_contributeurs.html', 'r') as f:
map_contrib = f.read()
with open('../figures/transition_contributeurs_per100000.html', 'r') as f:
map_contrib_100000 = f.read()
with open('../figures/transition_q154_map.html', 'r') as f:
map_q154 = f.read()
intro_md = '''
Les données originales ont été téléchargées sur [https://www.data.gouv.fr/fr/datasets/donnees-ouvertes-du-grand-debat-national/](https://www.data.gouv.fr/fr/datasets/donnees-ouvertes-du-grand-debat-national/) mises à jour le 17/02/2019. Ces données sont sous [Licence Ouverte Etalab](https://github.com/etalab/licence-ouverte/blob/master/LO.md).
......@@ -40,78 +59,115 @@ Le code-source de ce site est [disponible, sous licence libre](https://gitlab.be
Cette analyse vous est fournie par [Myriam Bégel](https://myriam.begel.fr).
'''
def figure_barh(q154):
return dict(
data=[go.Bar(
x=[round(q154['id'].iloc[i]/sum(q154['id'])*100, 1)],
y=[q154.index.name],
width=0.5,
orientation='h',
name=q154.index[i],
hoverinfo='name+text',
text=[str(round(q154['id'].iloc[i]/sum(q154['id'])*100, 1))+'%'],
textposition = 'auto',
marker=dict(color=q154['colors'].iloc[i]))
for i in range(len(q154))],
layout=go.Layout(
xaxis=dict(range=[0,100], zeroline=False),
yaxis=dict(automargin=True),
barmode='stack',
height=350)
)
app = dash.Dash(name=__name__, external_stylesheets=external_stylesheets, server=server, url_base_pathname='/grand-debat/')
app.css.config.serve_locally = True
app.scripts.config.serve_locally = True
app.layout = html.Div(children=[dbc.Container([
html.Link(
rel='stylesheet',
href='/css/stylesheet.css'
),
html.H1(children='Grand débat national'),
html.H2(children='Analyse statistique des résultats'),
dcc.Markdown(intro_md),
html.H3(children='La transition écologique'),
# Répartition géographique des contributeurs
html.H4('Répartition géographique des contributeurs'),
html.Iframe(
srcDoc=map_contrib,
height='500px',
width='100%'
),
html.Iframe(
srcDoc=map_contrib_100000,
height='500px',
width='100%'
),
html.P('Nombre de contributeurs total: %d' % pers_dep['values'].sum()),
html.P('Nombre de contributeurs avec un code postal invalide: %d' % pers_dep[pers_dep['code'] == 'Mauvais code postal']['values']),
#'Q160 - Quel est aujourd'hui pour vous le problème concret le plus important dans le domaine de l'environnement ?',
html.H4(children=cols_d['Q160']),
dcc.Graph(
id='Q160',
figure=dict(
data=[go.Pie(
labels=q160.index,
values=q160['id'],
marker=dict(colors=q160['colors'])
)]
)
id='Q160barh',
figure=figure_barh(q160)
),
html.P("Le groupe 'Les quatres réponses proposées' est approximatif et basé sur quelques mots clés."),
#'Q161 - Que faudrait-il faire selon vous pour apporter des réponses à ce problème ?',
#'Q146 - Diriez-vous que votre vie quotidienne est aujourd'hui touchée par le changement climatique ?',
html.H4(children=cols_d['Q146']),
dcc.Graph(
id='Q146',
figure=dict(
data=[go.Pie(
labels=q146.index,
values=q146['id'],
marker=dict(colors=q146['colors']))]
)
id='Q146barh',
figure=figure_barh(q146)
),
html.P('Le Oui est majoritaire dans chaque département.'),
#'Q147 - Si oui, de quelle manière votre vie quotidienne est-elle touchée par le changement climatique ?',
#'Q148 - À titre personnel, pensez-vous pouvoir contribuer à protéger l'environnement ?',
html.H4(children=cols_d['Q148']),
dcc.Graph(
id='Q148',
figure=dict(
data=[go.Pie(
labels=q148.index,
values=q148['id'],
marker=dict(colors=q148['colors']))]
)
id='Q148barh',
figure=figure_barh(q148)
),
html.P('Le Oui est majoritaire dans chaque département.'),
#'Q149 - Si oui, que faites-vous aujourd'hui pour protéger l'environnement et/ou que pourriez-vous faire ?',
#'Q150 - Qu'est-ce qui pourrait vous inciter à changer vos comportements comme par exemple mieux entretenir et régler votre chauffage, modifier votre manière de conduire ou renoncer à prendre votre véhicule pour de très petites distances ?',
#'Q151 - Quelles seraient pour vous les solutions les plus simples et les plus supportables sur un plan financier pour vous inciter à changer vos comportements ?',
#'Q152 - Par rapport à votre mode de chauffage actuel, pensez-vous qu'il existe des solutions alternatives plus écologiques ?',
html.H4(children=cols_d['Q152']),
dcc.Graph(
id='Q152',
figure=dict(
data=[go.Pie(
labels=q152.index,
values=q152['id'],
marker=dict(colors=q152['colors']))]
)
id='Q152barh',
figure=figure_barh(q152)
),
html.P('Le Non est majoritaire dans le Lot (106 contre 97) et en Corse du Sud (34 contre 30).'),
#'Q153 - Si oui, que faudrait-il faire pour vous convaincre ou vous aider à changer de mode de chauffage ?',
#'Q154 - Avez-vous pour vos déplacements quotidiens la possibilité de recourir à des solutions de mobilité alternatives à la voiture individuelle comme les transports en commun, le covoiturage, l'auto-partage, le transport à la demande, le vélo, etc. ?',
html.H4(children=cols_d['Q154']),
dcc.Graph(
id='Q154',
figure=dict(
data=[go.Pie(
labels=q154.index,
values=q154['id'],
marker=dict(colors=q154['colors']))]
)
id='Q154barh',
figure=figure_barh(q154)
),
html.H5('Réponse prédominante par département'),
dbc.Row([
dbc.Col(html.Iframe(
srcDoc=map_q154,
height='500px',
width='100%'
), width=9),
dbc.Col([
html.Div([
html.Div('__', style={'background': blue, 'color': blue, 'display': 'inline'}),
html.Div(' Oui', style={'display': 'inline'})]),
html.Div([
html.Div('__', style={'background': red, 'color': red, 'display': 'inline'}),
html.Div(' Non', style={'display': 'inline'})]),
html.Div([
html.Div('__', style={'background': green, 'color': green, 'display': 'inline'}),
html.Div(" Je n'utilise pas la voiture pour des déplacements quotidiens", style={'display': 'inline'})]),
])
], no_gutters=False),
#'Q155 - Si oui, que faudrait-il faire pour vous convaincre ou vous aider à utiliser ces solutions alternatives ?',
#'Q207 - Si non, quelles sont les solutions de mobilité alternatives que vous souhaiteriez pouvoir utiliser ?',
html.H4(children=cols_d['Q207']),
......@@ -130,7 +186,7 @@ app.layout = html.Div(children=[dbc.Container([
),
html.P('''
Cette question offrait aux contributeurs plusieurs possibilités ainsi qu'un champ libre.
Plusieurs choix pouvaient être sélectionnés, ce qui explique que le pourcentage total ne somme pas à 100.
Plusieurs choix pouvaient être sélectionnés, ce qui explique que le pourcentage total dépasse 100.
Ne sont pas encore représentés les solutions du champ libre.'''),
#'Q157 - Et qui doit selon vous se charger de vous proposer ce type de solutions alternatives ?',
#'Q158 - Que pourrait faire la France pour faire partager ses choix en matière d'environnement au niveau européen et international ?',
......@@ -138,6 +194,10 @@ app.layout = html.Div(children=[dbc.Container([
])])
@app.server.route('/css/<path:path>')
def static_file(path):
static_folder = os.path.join(os.getcwd(), 'css')
return send_from_directory(static_folder, path)
if __name__ == '__main__':
app.run_server(debug=os.getenv('DEBUG'))
iframe {
border: none;
}
import numpy as np
import pandas as pd
from maputils import save_map
DATA_PATH = '../data/raw/LA_TRANSITION_ECOLOGIQUE.csv'
data = pd.read_csv(DATA_PATH)
......@@ -24,6 +25,58 @@ accents = {
ord('ô'): 'o'
}
# Contributeurs
def code_departement(code):
if code in zipcodes:
if code < 10000:
return '0' + str(code // 1000)
if code == 97133: # St Barthélemy
return '977'
if code == 97150: # St Martin
return '978'
if code > 97000: # Outre-mer
return str(code // 100)
if code >= 20000 and code < 20200: # Corse du Sud
return '2A'
if code >= 20200 and code < 21000: # Haute-Corse
return '2B'
else:
return str(code // 1000)
else:
return 'Mauvais code postal'
zipcodes = pd.read_csv('../data/interim/zipcodes.csv', header=None)
zipcodes = zipcodes[0].values
pop_dep = pd.read_csv('../data/raw/population_departements.csv').drop('nom', axis=1)
data['code'] = data['authorZipCode'].apply(code_departement)
pers_dep = data.groupby('code').count()['id'].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/transition_personnes_par_departement.csv'
)
# Generate maps
save_map(pers_dep, 'Contributeurs', 'Nombre de contributeurs',
'transition_contributeurs.html')
pers_dep.columns = ['code', 'raw_values', 'values']
save_map(pers_dep, 'Contributeurs pour 100000h',
'Nombre de contributeurs pour 100000 habitants',
'transition_contributeurs_per100000.html')
def order_rep(rep):
if rep == 'Pas de réponse':
return 5
if rep == 'Non':
return 1
if rep == 'Oui':
return 0
if rep == 'Autre':
return 4
if rep == 'Les quatres réponses proposées':
return 3
return 2
# Q146 - Q148 - Q152 - Q154
yn_questions = ["Q146 - Diriez-vous que votre vie quotidienne est aujourd'hui touchée par le changement climatique ?",
......@@ -31,19 +84,30 @@ yn_questions = ["Q146 - Diriez-vous que votre vie quotidienne est aujourd'hui to
"Q152 - Par rapport à votre mode de chauffage actuel, pensez-vous qu'il existe des solutions alternatives plus écologiques ?",
"Q154 - Avez-vous pour vos déplacements quotidiens la possibilité de recourir à des solutions de mobilité alternatives à la voiture individuelle comme les transports en commun, le covoiturage, l'auto-partage, le transport à la demande, le vélo, etc. ?"]
yn_data = data[['id'] + yn_questions]
yn_data = data[['id', 'code'] + yn_questions].copy()
yn_data.fillna('Pas de réponse', inplace=True)
yn_data.columns = [c[:4] for c in yn_data.columns]
for yn_q in yn_data.columns[1:]:
for yn_q in yn_data.columns[2:]:
df = yn_data.groupby(yn_q).count()
df = pd.DataFrame(df['id'])
if len(df) == 4:
df['colors'] = [green, red, blue, grey]
else:
df['colors'] = [red, blue, grey]
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])
# Q154 Map
yn_q = yn_data.columns[5]
tmp = yn_data.groupby(['code', yn_q]).count()['id'].reset_index()
tmp2 = tmp.merge(tmp.groupby('code').max()['id'].reset_index(), on='code')
tmp3 = tmp2[tmp2['id_x'] == tmp2['id_y']].drop(['id_y', 'id_x'], axis=1)
tmp3.columns = ['code', 'values']
save_map(tmp3, 'Réponse prédominante', '', '../figures/transition_q154_map.html', [green, red, blue, grey])
# Q160
pre_rep_160 = [
"La pollution de l'air",
......@@ -68,7 +132,11 @@ tout4_160 = [c for c in rep_160 if c.lower().find('s 4') > -1 and c not in tout_
all_160 = tout_160 + tout4_160
data_160[q160] = data_160[q160].apply(groupe_160)
data_160_ = data_160.groupby(q160).count()
data_160_.index.name = q160[:4]
data_160_['colors'] = [brown, blue, purple, orange, red, green ,grey]
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')
#Q207
......
This diff is collapsed.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment