Mise en place d'un indice de fragilité numérique à Orléans métropole

Julie Neury-Ormanni (2020)

Ce projet de fragilité numérique a été initié par Nadine Poisson, directrice du Département du Numérique et de la Ville Intelligente d'Orléans métropole. Selon l'enquête sur les conditions de vie des ménage (Insee, 2019), l'illectronisme affecte environ 17% de la population française, 67% des 75 ans ou plus, 44% des non diplômés. Les inégalités de maîtrise des outils numériques sont clivés suivant l'âge, le diplôme, le type de ménage et les disparités territoriales d'équipement. Avec la tendance actuelle de dématérialisation des démarches administratives et services publics, le savoir numérique est devenu un rouage indispensable de la vie publique. Dans ce contexte, l'indicateur de fragilité numérique développé par la MEDNUM en région Occitanie est appliquée sur les 22 communes (pour le moment 17 communes) de la métropole, à l'échelle de l'Iris. Cette échelle semble plus appropriée à une étude socio-démographique et donnera une précision plus fine de l'état de fragilité numérique de la métropole orléanaise.

Axes Indicateurs Maille Définitions Source de données Unité Année de collecte Méthode de calcul Lien avec l'accès aux démarches administratives et donc la fragilité numérique Nom données sources Open Data Soft Nom données traitées Open Data Soft
Accès aux interfaces numériques Taux de logement raccordable à la fibre Commune Désigne la part des locaux éligibles sur le territoire toute technologie confondue. Un local éligible est un logement pour lequel au moins un opérateur a relié le point de mutualisation à son nœud de raccordement optique, autrement dit le logement peut recevoir un réseau haut ou très haut débit en fonction de la technologie déployée. ARCEP % 2020 Moyenne par commune des taux de logements raccordables La couverture haut et très haut débit permet d'accéder aux sites des démarches dématérialisés. Déploiement du haut et très haut débit fixe T4-2018 - Par Point de mutualisation - Orléans Métropole Taux de logement raccordables à la fibre par commune_Orléans métropole
Accès aux interfaces numériques Taux de couverture mobile Commune Permet d’identifier au sein de chaque commune, des portions du territoire où le service mobile est disponible de celles où il ne l’est pas. Autrement dit, le service mobile sera disponible s’il y a au moins un opérateur disponible sur le territoire (ici la commune). ARCEP % 2020 Présence d'au moins une antenne mobile (tout opérateur confondu) sur la commune La couverture mobile permet aux usagers d'accéder à des applications des démarches dématérialisées. Antennes mobiles 2G/3G/4G - Orléans métropole Nombre d'antennes - réseaux mobiles - Orléans Métropole
Accès aux interfaces numériques Taux de pauvreté Commune Désigne un indicateur de précarité qui correspond à la proportion d’individus (ou de ménages) dont le niveau de vie est inférieur pour une année donnée à un seuil de pauvreté. Ce seuil est déterminé par rapport aux niveaux de vie de la population. En Europe, en 2016, un individu est pauvre si son niveau de vie est inférieur à 60 % (1 710 €) du niveau de vie médian de la population française, autrement dit si ses revenus mensuels sont inférieurs à 1 026 €. INSEE (Données non disponibles sur l'ensemble des communes, pour les données manquantes, le taux de pauvreté du département -ou moyen- a été pris en compte) % 2017 Le calcul du seuil de pauvreté se fonde sur les déclarations fiscales et le montant des prestations sociales des ménages. Ainsi, en découle le taux de pauvreté c’est-à-dire la proportion de personnes pauvres dans la population totale. L'enjeu de l’Etat concernant la dématérialisation des démarches administratives est d'autant plus important que cinq millions de français cumulent précarités sociales et numériques. Revenus et pauvreté des ménages 2017 - Orléans Métropole Revenus et pauvreté des ménages 2017 - Orléans Métropole
Accès aux interfaces numériques Médiane du revenu disponible par unité de consommation Commune Divise la population en deux parties égales : 50 % a un revenu supérieur et 50 % a un revenu inférieur du revenu médian. Le revenu fiscal par unité de consommation est une mesure des revenus déclarés au fisc et qui tient compte de la taille et de la composition des ménages. A Orléans métropole, il est de 21420 euros (Cette donnée sera réutilisée comme seuil pour le calcul de l'indicateur de fragilité numérique). INSEE 2017 La variable revenus joue un rôle important dans l'égalité d'accès aux démarches administratives en ligne : en 2017, 59 % des foyers à bas revenus ont accompli une démarche administrative en ligne contre 81 % pour les hauts revenus (CREDOC). Revenus et pauvreté des ménages 2017 - Orléans Métropole Revenus et pauvreté des ménages 2017 - Orléans Métropole
Accès aux interfaces numériques Taux de personnes bénéficiant des minimas sociaux Commune Complémentaire au taux de pauvreté, la proportion de personnes couvertes par les minimas sociaux informe de la proportion des ménages à revenu modeste. Les données récupérées sur le site de l'insee ne sont disponibles que pour les communes de plus de 10000 habitants ou possédant au moins un QPV. Les données manquantes ont été remplacées par 0 dans l'analyse. INSEE % 2018 Bénéficiaires des prestations légales versées par les CAF au 31/12/2018_Orléans métropole Bénéficiaires des prestations légales versées par les CAF au 31/12/2018_Orléans métropole
Accès à l'information Part des ménages d'une personne Iris Un ménage désigne l'ensemble des occupants d'un même logements mêmes s'ils n'ont aucun lien de parenté (en cas de cohabitation, par exemple). Un ménage peut être composé que d'une seule personne. INSEE % 2017 Nombre de personnes vivant seules divisé par la population légale totale Isolement face à l'apprentissage d'utilisation du matériel numérique Recensement 2017: Individus localisés au canton des communes d'Orléans Métropole Informations 2017 (âge de population, chômage, immigration) sur la population d'Orléans Métropole
Accès à l'information Part des familles monoparentales Iris L’expression « famille monoparentale » désigne les situations de personnes veuves, séparées, divorcées, abandonnées, ou célibataires qui n’ont pas de vie maritale et qui exercent seules la charge d’un ou plusieurs enfant(s) de moins de 20 ans. INSEE % 2017 Nombre de personnes vivant dans une famille monoparentale divisé par la population légale totale Si des données chiffrées sur les compétences numériques des femmes en situation de monoparentalité ou de fragilité n’existent pas, alors de nombreuses informations concernant leur niveau de vie, leur situation financière, et leur précarité incitent à identifier des problématiques communes qui pourraient les toucher dans le domaine des nouvelles technologies. Recensement 2017: Individus localisés au canton des communes d'Orléans Métropole Informations 2017 (âge de population, chômage, immigration) sur la population d'Orléans Métropole
Accès à l'information Services publics Iris Désigne les principaux types d'organismes locaux (mairie, préfecture, CAF…) utiles pour les démarches des usagers soit à titre d'information ou soit à titre d'accompagnement de l'usager. Parmi les services publics, la base de données comprend les Caisses d'Allocations Familiales, les postes de police et de gendarmerie, les bureaux de poste, les tribunaux (grande instance, instance, commerce), les conseils des prud'hommes, les réseaux spécialisés pôle emploi, les centres de formation pour adulte, les aides à domicile pour personnes agées et handicapées, la Direction Régionale des Finances Publiques, les directions départementales des finances publiques, les maisons de justice et du droit, les conseils départementaux d'accès au droit, les préfectures, les sous-préfectures. INSEE, TOPOS 2020 Nombre d'équipement par Iris Les usagers peuvent se rendre dans des services publics pour se renseigner sur les démarches administratives ou encore se faire accompagner pour accomplir leurs démarches. Ainsi, il est important d'évaluer le nombre de services publics disponibles en fonction de la taille de population de de l'Iris. Base Permanente des Equipements (Ensemble) géolocalisée - Orléans métropole Nombre d'équipements par IRIS_Orléans Métropole_fragilité numérique_2019
Accès à l'information Part des immigrés Iris Nombre d'immigrés par Iris INSEE % 2017 Nombre d'immigrés divisé par la population légale totale Les immigrés peuvent ne pas savoir lire ou parler correctement le français, limitant donc les utilisations des démarches dématérialisées. Recensement 2017: Individus localisés au canton des communes d'Orléans Métropole Informations 2017 (âge de population, chômage, immigration) sur la population d'Orléans Métropole
Compétence administrative Part des personnes âgée de 15 à 29 ans Iris L’âge est une variable quantitative nécessaire à une analyse statistique. INSEE % 2017 Nombre de personnes âgées de 15 à 29 ans divisé par la population légale totale Les usages et les équipements du numérique diffèrent principalement en fonction de l’âge des individus : entre les plus jeunes (15 - 29 ans) et leurs aînés (65 ans et plus). Les plus âgés utilisent deux fois moins internet que les plus jeunes. Recensement 2017: Individus localisés au canton des communes d'Orléans Métropole Informations 2017 (âge de population, chômage, immigration) sur la population d'Orléans Métropole
Compétence administrative Part des chômeurs Iris Désigne la part de la population de 15 à 65 ans au chômage. Le chômage représente l’ensemble des personnes privée d’emploi et en recherchant un. INSEE % 2017 Nombre de chômeurs de 15 à 65 ans divisé par la population légale totale Parmi les 13 millions de français éloignés du numérique, il y a une surreprésentation des plus âgés, des ouvriers, des personnes peu diplômées et des « sans activité professionnelle » d'après France Statégie. Recensement 2017: Individus localisés au canton des communes d'Orléans Métropole Informations 2017 (âge de population, chômage, immigration) sur la population d'Orléans Métropole
Compétences numériques Part des personnes âgées de 65 ans et plus Iris L’âge est une variable quantitative nécessaire à une analyse statistique. INSEE % 2017 Nombre de personnes âgées de plus de 65 ans divisé par la population légale totale Les usages et les équipements du numérique diffèrent principalement en fonction de l’âge des individus : entre les plus jeunes (15 - 29 ans) et leurs aînés (65 ans et plus). Recensement 2017: Individus localisés au canton des communes d'Orléans Métropole Informations 2017 (âge de population, chômage, immigration) sur la population d'Orléans Métropole
Compétences numériques Part des personnes non scolarisées de 15 ans/+ sans diplôme ou au plus un BEPC, brevet des collèges ou DNB Iris Un individu est considéré diplômé s’il dispose au minimum du BEPC (Brevet d’Etudes du PremierCycle). INSEE % 2017 Nombre de personnes non scolarisées de 15 ans/+ sans diplôme ou peu diplômées divisé par la population légale totale Le niveau de diplôme importe car 9 diplômés du supérieur sur 10 utilisent internet pour réaliser leurs démarches administratives contre seulement un quart des non diplômés (26 %) Recensement 2017: Individus localisés au canton des communes d'Orléans Métropole Informations 2017 (âge de population, chômage, immigration) sur la population d'Orléans Métropole

Les données énumérées et décrites dans le tableau ci-dessus sont disponibles sur la plateforme Open Data Orléans Métropole (https://data.orleans-metropole.fr/pages/home/). Tous ces indicateurs ont été regroupés sur un seul jeu de données (Données pour le calcul d'indicateur de fragilité numérique), téléchargeable en .csv sur la plateforme et l'API. Les jointures ont été établies sur les Iris lorsque c'était possible ou grâce aux coordonnées géographique (processeur: Récupérer les divisions administratives). Les données nécessaires ont été sélectionnées via Python afin de vérifier les doublons et d'homogénéiser les codes utilisés (notamment ceux des Iris qui n'étaient pas notés de la même manière d'un jeu de donnée à l'autre).

La librairie pandas a été utilisée pour l'import, les extractions et le nettoyage des données. La librairie numpy a été utilisé pour faciliter la gestion de certaines tables.

In [2]:
import pandas as pd
In [25]:
import numpy as np

Les jeu de données sont récupérés sur les différentes plateformes des données publics, ajouter à https://data.orleans-metropole.fr/pages/home/ et extraites en.csv à partir de la plateforme ou directement depuis l'API. Certains jeux de données ont été enregistrés sur un disque local pour les divers traitements.

Pour faciliter la lecture, les mots clés 'chemin d'accès' seront utilisés dans la formules de code pour les jeux de données qui ont été enregistrés sur le disque local.

A partir des données brutes de recensement,un premier nettoyage a été effectué en ne sélectionnant que les cantons où sont situées les 22 communes d'Orléans. Ces données ont ensuite été converties en .csv pour être publiées sur Open Data Orléans Métropole et traitées par la suite (Recensement 2017: Individus localisés au canton des communes d'Orléans Métropole). Le recensement repose sur une collecte d’informations annuelle,concernant successivement toutes les communes au cours d’une période de cinq ans. Les communes de moins de 10 000 habitants réalisent une enquête de recensement portant sur toute leur population une fois tous les cinq ans. Les communes de plus de 10 000 habitants tiennent à jour un répertoire exhaustif de logements et font tous les ans une enquête par sondage auprès d’un échantillon représentant 8 % de leurs logements.En cumulant cinq enquêtes, l'ensemble des habitants des communes de moins de 10 000 habitants et 40 % environ de la population des communes de 10 000 habitants ou plus sont pris en compte. En 2017, seules 17 communes ont pu être utilisé pour cette étude de fragilité. Les communes non irisées possédant la nomenclature 'ZZZZZZZZZ', il n' a pas été possible de les identifier.

In [ ]:
RP = pd.read_csv(r"chemin d'accès\FD_INDCVIZB_2017.csv", delimiter = ';')
RPinsee_canton = RP[(RP['CANTVILLE'] == 4505)|(RP['CANTVILLE'] == 4506) |(RP['CANTVILLE'] == 4512) |(RP['CANTVILLE'] == 4515) |(RP['CANTVILLE'] == 4518) |(RP['CANTVILLE'] == 4519) |(RP['CANTVILLE'] == 4520) |(RP['CANTVILLE'] == 4599)]
RPinsee_canton.to_csv (r"chemin d'accès\RPinsee_canton.csv", index = False, header=True)

A partir des données brutes,un premier nettoyage a été effectué en ne sélectionnant que les 22 communes d'Orléans métropole. Ces données ont ensuite été converties en .csv pour être publiées sur Open Data Orléans Métropole et traitées par la suite(Bénéficiaires des prestations légales versées par les CAF au 31/12/2018_Orléans métropole).

Clé primaire:Iris (CODGEO)

In [ ]:
CAF = pd.read_csv(r"chemin d'accès\data_CAF2018_iris.csv", delimiter = ';')
CAF_orleans_metro = CAF[(CAF['DEPCOM'] == '45034')|(CAF['DEPCOM'] == '45043')|(CAF['DEPCOM'] == '45072')|(CAF['DEPCOM'] == '45075')|(CAF['DEPCOM'] == '45089')|(CAF['DEPCOM'] == '45100')|(CAF['DEPCOM'] == '45147')|(CAF['DEPCOM'] == '45169')|(CAF['DEPCOM'] == '45194')|(CAF['DEPCOM'] == '45197')|(CAF['DEPCOM'] == '45232')|(CAF['DEPCOM'] == '45234')|(CAF['DEPCOM'] == '45235')|(CAF['DEPCOM'] == '45272')|(CAF['DEPCOM'] == '45274')|(CAF['DEPCOM'] == '45282')|(CAF['DEPCOM'] == '45284')|(CAF['DEPCOM'] == '45285')|(CAF['DEPCOM'] == '45286')|(CAF['DEPCOM'] == '45298')|(CAF['DEPCOM'] == '45302')|(CAF['DEPCOM'] == '45308')]
CAF_orleans_metro.to_csv (r"chemin d'accès\CAF_orleans_metro.csv", index = False, header=True)

Cette table servira principalement à lier les communes et les iris pour les jeu de données ne contenant pas l'information Iris. Les jointures géographiques seront effectuées directement sur Open Data Orléans Métropole avec le processeur 'jointure géographique' sur les iris 2019. Seuls les Iris des 22 communes d'Orléans ont été sélectionnées. Ce jeu de données a été publié sur Open Data Orléans Métropole (Table de référence des IRIS 2020 - Orléans Métropole).

Clé primaire: Iris (CODE_IRIS) et Commune (DEPCOM)

In [ ]:
iris = pd.read_excel(r"chemin d'accès\reference_IRIS_geo2020_modif.xlsx")
iris_om = iris[(iris['DEPCOM'] == '45034')|(iris['DEPCOM'] == '45043')|(iris['DEPCOM'] == '45072')|(iris['DEPCOM'] == '45075')|(iris['DEPCOM'] == '45089')|(iris['DEPCOM'] == '45100')|(iris['DEPCOM'] == '45147')|(iris['DEPCOM'] == '45169')|(iris['DEPCOM'] == '45194')|(iris['DEPCOM'] == '45197')|(iris['DEPCOM'] == '45232')|(iris['DEPCOM'] == '45234')|(iris['DEPCOM'] == '45235')|(iris['DEPCOM'] == '45272')|(iris['DEPCOM'] == '45274')|(iris['DEPCOM'] == '45282')|(iris['DEPCOM'] == '45284')|(iris['DEPCOM'] == '45285')|(iris['DEPCOM'] == '45286')|(iris['DEPCOM'] == '45298')|(iris['DEPCOM'] == '45302')|(iris['DEPCOM'] == '45308')]
iris_om.to_csv (r"chemin d'accès\reference_iris_om.csv", index = False, header=True)

Le jeu de donnée ici importé est issu des extractions réalisées ci-dessus à partir des données de recensement brutes. Plusieurs indicateurs vont être calculés.

Clé primaire: Canton (CANTVILLE) et Iris (IRIS)

  • Import du jeu de donnée
In [18]:
#RPinsee = pd.read_csv(r"C:\Users\neury\Documents\Python\sorties\RPinsee_canton_17.csv", delimiter = ',')
RPinsee = pd.read_csv("https://data.orleans-metropole.fr/api/v2/catalog/datasets/recensement-individu-localise-au-canton-des-communes-dorleans-metropole-2017/exports/csv?limit=-1&select=*&timezone=UTC&delimiter=%3B&apikey=10c35d0b43b07cd01107198942a6db6f77c6cb338cdbd6b4c3f2d56d", delimiter=';')
C:\Users\neury\Anaconda3\lib\site-packages\IPython\core\interactiveshell.py:3071: DtypeWarning: Columns (2,3,4,10,11,12,16,18,19,24,27,28,34,35,39,40,41,48,54,59,61,64,65,71,73,74,75,76) have mixed types.Specify dtype option on import or set low_memory=False.
  has_raised = await self.run_ast_nodes(code_ast.body, cell_name,
  • Nettoyage des données

Afin d'homogénéiser les codes des iris les codes marqués 'ZZZZZZZZZ' concernant les communes non irisées ont été remplacés par les codes iris référencés dans la table de référence des Iris, à l'aide la fonction suivante:

In [20]:
moncarac='ZZZZZZZZZ'
def myfunc(x,y,replacechar):
    if x == 4505 and y == replacechar:
        return '452720000'
    elif x ==4506 and y == replacechar:
        return '451970000'
    elif x ==4512 and y == replacechar:
        return '452820000'
    elif x ==4515 and y == replacechar:
        return '452350000'
    elif x ==4518 and y ==replacechar:
        return '453080000'
    elif x == 4599 and y == '45234XXXX':
        return '452342104'
    elif x == 4518 and y == '45284XXXX':
        return '452840304'
    else:
        return y

RPinsee['iris'] = RPinsee.apply(lambda x: myfunc(x.cantville, x.iris, moncarac), axis=1)

Les autres communes non irisées ne faisant pas partie des communes d'Orléans métropole ou ne pouvant être identifiées ont été supprimées:

In [21]:
RPinsee.drop(RPinsee[RPinsee['iris']=='ZZZZZZZZZ'].index, inplace = True)

On scinde le code des iris pour retrouver les communes auxquels ils appartiennent. Et on place ce résultat dans la colonne 'depcom' (code insee des communes).

In [22]:
RPinsee['depcom'] = RPinsee['iris'].str.slice(stop=5)
  • Création du dataframe et calculs

Le dataframe qui va accueillir les données pour calculer les indicateurs a été créé à partir de la fonction '.groupby'. Cette fonction groupe les données à partir des index choisis (ici un multiindex canton et commune). La fonction '.count()' indique que l'on souhaite obtenir le nombre de cellules à valeur non-nulle respectant les conditions renseignées.

In [25]:
mycolumns = ['cantville','nummi','aged','dipl','empl','etud','immi','infam','inper','inperf','iris','nperr','sfm','tact','typfc', 'depcom']
RPinsee_tmt = RPinsee[mycolumns]
table = RPinsee_tmt.groupby(['cantville','depcom','iris']).count()
#Garder la première colonne et la renommer car elle indique la population légale totale
table.rename(columns={'nummi':'POPLEG'}, inplace = True)
#Effacer le reste des colonnes
table.drop(['aged','dipl','empl','etud','immi','infam','inper','inperf','nperr','sfm','tact','typfc'],axis = 'columns', inplace = True)

Ci-après, le code permettant d'ajouter les colonnes qui correspondent aux données recherchées. On compte pour chaque Iris le nombres de personnes correspondant aux conditions.

In [27]:
# Le nombre de personnes âgées de plus de 65 ans:
table['NB65+'] =RPinsee_tmt[RPinsee_tmt['aged'] > 65].groupby(['cantville','depcom','iris'])['aged'].count()
# Le nombre de personnes âgées de 15 à 29 ans:
table['NB15_29'] = RPinsee_tmt[(RPinsee_tmt ['aged']>15) & (RPinsee_tmt['aged'] < 30)].groupby(['cantville','depcom','iris'])['aged'].count()
# Le nombre de personnes vivant en famille monoparentale:
table['NBMONOFAM'] = RPinsee_tmt[(RPinsee_tmt ['sfm']== '21') | (RPinsee_tmt['sfm']== '22')| (RPinsee_tmt ['sfm']== '40')].groupby(['cantville','depcom','iris'])['aged'].count()
# Le nombre de personnes vivant dans un ménage d'une personne:
table['NBMEN1P'] = RPinsee_tmt[(RPinsee_tmt ['nperr']== '1')].groupby(['cantville','depcom','iris'])['nperr'].count()
# Le nombre de personnes de plus de 15 ans, non scolarisées, non ou peu diplômées:
table['NB15NSCONDIPL'] = RPinsee_tmt[(RPinsee_tmt['aged'] >15)&(RPinsee_tmt['etud']==2)&((RPinsee_tmt['dipl']=='01')|(RPinsee_tmt['dipl']=='02')|(RPinsee_tmt['dipl']=='03')|(RPinsee_tmt['dipl']=='11')|(RPinsee_tmt['dipl']=='12'))].groupby(['cantville','depcom','iris'])['aged'].count()
# Le nombre de personnes entre 15 et 64 ans au chômage:
table['NBCHOM15_64'] = RPinsee_tmt[(RPinsee_tmt['aged'] >15)&(RPinsee_tmt['aged']<65)&(RPinsee_tmt['tact']==12)].groupby(['cantville','depcom','iris'])['aged'].count()
# Le nombre de personnes immigrées:
table['NBIMMI'] = RPinsee_tmt[(RPinsee_tmt['immi'] == 1)].groupby(['cantville','depcom','iris'])['aged'].count()

Pour le nombre de ménage total d'un Iris, on effectue un '.nunique()' sur les numéros d'anonymisation des logements, qui correspond au nombre de valeurs différentes (pour chaque Iris).

In [28]:
# Le nombre de ménages total d'un Iris:
table["NBMENTOT"] = RPinsee_tmt.groupby(['cantville','depcom','iris'])['nummi'].nunique()

Pour calculer la part de population qui correspond aux critères, il suffit de diviser par la population légale totale. Le code ci-dessous permet d'automatiser l'alimentation des colonnes à partir d'une simple division par la colonne 'POPLEG'.

In [29]:
listcol = ['NBMONOFAM','NB15_29','NB65+','NBIMMI','NBMEN1P','NBCHOM15_64','NB15NSCONDIPL']
for l in listcol:
    newcol = "Part" + l 
    table[newcol] = table[l]/table['POPLEG']
In [30]:
table
Out[30]:
POPLEG NB65+ NB15_29 NBMONOFAM NBMEN1P NB15NSCONDIPL NBCHOM15_64 NBIMMI NBMENTOT PartNBMONOFAM PartNB15_29 PartNB65+ PartNBIMMI PartNBMEN1P PartNBCHOM15_64 PartNB15NSCONDIPL
cantville depcom iris
4505 45272 452720000 3458 691 458 262.0 396 626 141 139 1456 0.075766 0.132447 0.199826 0.040197 0.114517 0.040775 0.181029
4506 45147 451470101 70 11 15 3.0 7 27 2 2 13 0.042857 0.214286 0.157143 0.028571 0.100000 0.028571 0.385714
451470102 542 126 83 51.0 58 137 31 72 211 0.094096 0.153137 0.232472 0.132841 0.107011 0.057196 0.252768
451470103 1119 94 211 156.0 105 168 76 184 426 0.139410 0.188561 0.084004 0.164433 0.093834 0.067918 0.150134
451470201 1159 105 189 293.0 164 259 169 360 480 0.252804 0.163072 0.090595 0.310613 0.141501 0.145815 0.223469
... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
4599 45234 452342002 746 53 142 115.0 30 179 121 260 395 0.154155 0.190349 0.071046 0.348525 0.040214 0.162198 0.239946
452342101 838 221 142 64.0 49 163 37 111 483 0.076372 0.169451 0.263723 0.132458 0.058473 0.044153 0.194511
452342102 709 231 65 26.0 45 133 21 94 386 0.036671 0.091678 0.325811 0.132581 0.063470 0.029619 0.187588
452342103 1258 34 1078 1.0 381 120 99 201 812 0.000795 0.856916 0.027027 0.159777 0.302862 0.078696 0.095390
452342104 64 1 13 7.0 1 6 7 9 29 0.109375 0.203125 0.015625 0.140625 0.015625 0.109375 0.093750

111 rows × 16 columns

  • Export

Une fois ces calculs effectués, le dataframe est exporté en format .csv et publié sur Open Data Orléans Métropole('Informations 2017 (âge de population, chômage, immigration) sur la population d'Orléans métropole pour déterminer un indice de fragilité numérique par IRIS (données traitées de RP 2017)').

In [31]:
table.to_csv (r"chemin d'accès\population_canton_iris_RPinsee2017.csv", index = True, header=True)

Cette table va permettre de récupérer le taux de logement raccordable moyen par commune, en récupérant le nombre de logement par commune et le nombre de logement raccordables à la fibre par commune. Clé primaire: Commune (Code INSEE)

  • Import des jeux de donnée

Le jeu de données sur le déploiement de la fibre a été filtré sur les 22 communes d'Orléans via la plateforme Open Data Soft et enregistrés sur le disque local. Le jeu de données sur le nombre de logement par commune a été récupéré sur le site d el'insee et mis en ligne sur la plateforme Open Data Soft puis enregistré sur le disque local.

In [8]:
ftth = pd.read_csv(r"chemin d'accès\deploiement-du-haut-et-tres-haut-debit-fixe-par-point-de-mutualisation-orleans-2018.csv", delimiter = ';')
log = pd.read_csv(r"chemin d'accès\logement_com.csv")
In [9]:
log = log.rename(columns = {'COM':'Code INSEE','P17_LOG':'NBLOG'})
Out[9]:
LIBCOM Code INSEE NBLOG
0 Boigny-sur-Bionne 45034 908.530491
1 Bou 45043 441.566045
2 Chanteau 45072 571.000000
3 Chécy 45089 3669.305346
4 Combleux 45100 264.931237
5 Fleury-les-Aubrais 45147 9835.620763
6 Ingré 45169 3813.988055
7 La Chapelle-Saint-Mesmin 45075 4611.100671
8 Mardié 45194 1191.042927
9 Marigny-les-Usages 45197 613.500684
10 Olivet 45232 11400.017383
11 Orléans 45234 66027.413027
12 Ormes 45235 1606.809810
13 Saint-Cyr-en-Val 45272 1552.000000
14 Saint-Denis-en-Val 45274 3178.658228
15 Saint-Hilaire-Saint-Mesmin 45282 1396.621821
16 Saint-Jean-de-Braye 45284 9720.479984
17 Saint-Jean-de-la-Ruelle 45285 7618.859184
18 Saint-Jean-le-Blanc 45286 4555.325603
19 Saint-Pryvé-Saint-Mesmin 45298 2622.489068
20 Saran 45302 6802.029392
21 Semoy 45308 1314.340574
  • Création du dataframe et calculs

Le dataframe est créé à partir de la fonction '.groupby' sur les codes Insee des communes et la fonction '.sum()' qui additionne les valeurs de la même condition commune.

In [10]:
table = ftth.groupby(['Code INSEE'])['Logements raccordables','Commune'].sum()
<ipython-input-10-43f1c83a4d66>:1: FutureWarning: Indexing with multiple keys (implicitly converted to a tuple of keys) will be deprecated, use a list instead.
  table = ftth.groupby(['Code INSEE'])['Logements raccordables','Commune'].sum()

Le nombre total de logement par commune est joint à la table groupant le nombre total de logement raccordable à la fibre par commune. Cette jointure permet de calculer la proportion de logement raccordable à la fibre par commune.

In [14]:
ftth_com = table.merge(log, on=['Code INSEE'])
In [15]:
ftth_com['Logements raccordables / commune']= ftth_com['Logements raccordables']/ftth_com['NBLOG']
Out[15]:
Code INSEE Logements raccordables LIBCOM NBLOG Logements raccordables / commune
0 45034 847 Boigny-sur-Bionne 908.530491 0.932275
1 45043 448 Bou 441.566045 1.014571
2 45072 513 Chanteau 571.000000 0.898424
3 45075 4670 La Chapelle-Saint-Mesmin 4611.100671 1.012773
4 45089 3907 Chécy 3669.305346 1.064779
5 45100 251 Combleux 264.931237 0.947416
6 45147 9960 Fleury-les-Aubrais 9835.620763 1.012646
7 45169 3356 Ingré 3813.988055 0.879919
8 45194 1097 Mardié 1191.042927 0.921042
9 45197 649 Marigny-les-Usages 613.500684 1.057864
10 45232 11441 Olivet 11400.017383 1.003595
11 45234 19145 Orléans 66027.413027 0.289955
12 45235 1434 Ormes 1606.809810 0.892452
13 45272 1486 Saint-Cyr-en-Val 1552.000000 0.957474
14 45274 3062 Saint-Denis-en-Val 3178.658228 0.963300
15 45282 928 Saint-Hilaire-Saint-Mesmin 1396.621821 0.664460
16 45284 4217 Saint-Jean-de-Braye 9720.479984 0.433826
17 45285 6207 Saint-Jean-de-la-Ruelle 7618.859184 0.814689
18 45286 3685 Saint-Jean-le-Blanc 4555.325603 0.808943
19 45298 2227 Saint-Pryvé-Saint-Mesmin 2622.489068 0.849193
20 45302 5973 Saran 6802.029392 0.878120
21 45308 1114 Semoy 1314.340574 0.847573

Pour les proportions de logement qui dépassent les 100%, les valeurs sont ramenées au maximum 100%. Cette erreur est due à la différence des années des données. Le nombre de logement par commune date de 2017, le nombre de logement raccordable par commune date de 2018. Les données de logements raccordables les plus récentes possibles ont été jointes sans prendre les données les plus récentes qui datent de 2020 pour éviter un trop grand écart entre les années des données. Cependant, il y a une trop forte extension entre le déploiement de lfibre de 2017 et 2018 pour pouvoir prendre en compte les données de 2017 sur la fibre, beaucoup trop obsolète.

In [27]:
a = np.array(ftth_com['Logements raccordables / commune'].values.tolist())
In [28]:
ftth_com['Logements raccordables / commune'] = np.where(a > 0.9999, 1.0, a).tolist()
  • Export

Une fois ces calculs effectués, le dataframe est exporté en format .csv et publié sur Open Data Orléans Métropole(Taux de logement raccordables à la fibre par commune_Orléans métropole).

In [30]:
ftth_com.to_csv(r"chemin d'accès\deploiement_ftth_om.csv")

A partir des données récupérées sur monresaumobile (ARCEP), ce jeu de données a été préalablement filtré sur les 22 communes d'Orléans puis le processeur de jointure géographique (récupérer les divisions administratives) sur open data soft a permis de récupérer les codes des iris à partir des coordonnées géographiques. A partir de l'API (V2 bêta),une aggrégation 'count()as' est réalisée (get /{source}/datasets/{dataset_id}/aggregate)pour calculer le nombre d'antenne par commune (group_by)

Clé primaire: Iris (code_iris)

Ce jeu de données est ensuite publié sur open data orléans métropole et sera mis à jour tous les mois.

Ces données contiennent seulement les équipements qui nous intéressent pour l'étude de fragilité (cf. tableau des indicateurs ci dessus). Les équipements sociaux manquants ont été rajoutés à partir des informations de TOPOS (bde2). Ces données vont permettre de calculer le nombre d'équipement par Iris. Les équipements sélectionnés pour l'étude de fragilité sont énumérés dans le tableau des indicateurs. Ils ont été choisis selon l'étude de MEDNUM.

Clé primaire: Iris (IRIS)

  • Import du jeu de donnée
In [ ]:
bde1=pd.read_csv(r"chemin d'accès\base-permanente-des-equipements-ensemble-geolocalisee-orleans-metropole_modif.csv", delimiter=';')
bde2=pd.read_excel(r"chemin d'accès\equipement sociaux manquants.xlsx")
  • Concaténation des dataframe et sélection des équipements
In [ ]:
bde = pd.concat([bde1, bde2])
bde_om=bde[(bde['code_com']==45034)|(bde['code_com']==45043)|(bde['code_com']==45072)|(bde['code_com']==45075)|(bde['code_com']==45089)|(bde['code_com']==45100)|(bde['code_com']==45147)|(bde['code_com']==45169)|(bde['code_com']==45194)|(bde['code_com']==45197)|(bde['code_com']==45232)|(bde['code_com']==45234)|(bde['code_com']==45235)|(bde['code_com']==45272)|(bde['code_com']==45274)|(bde['code_com']==45282)|(bde['code_com']==45284)|(bde['code_com']==45285)|(bde['code_com']==45286)|(bde['code_com']==45298)|(bde['code_com']==45302)|(bde['code_com']==45308)]
bde_frag = bde_om[(bde_om['description']=='Bibliothèque')|(bde_om['description']=="Personnes âgées\xa0: services d'aide")|(bde_om['description']=="Adultes handicapés\xa0: services d'aide")|(bde_om['description']=="Autres établissements pour adultes et familles en difficulté")|(bde_om['description']=="DRFiP (Direction régionale des Finances publiques)")|(bde_om['description']=="Police")|(bde_om['description']=="Tribunal de commerce (TCO)")|(bde_om['description']=="Gendarmerie")|(bde_om['description']=="Conseil de prud'hommes (CPH)")|(bde_om['description']=="Cour d'appel (CA)")|(bde_om['description']=="Tribunal d'instance (TI)")|(bde_om['description']=="Réseau de proximité Pôle emploi")|(bde_om['description']=="Conseil départemental d'accès au droit (CDAD)")|(bde_om['description']=="GRETA")|(bde_om['description']=="Maison de justice et du droit")|(bde_om['description']=="Tribunal de grande instance (TGI)")|(bde_om['description'] == 'Bureau de poste')|(bde_om['description'] == 'CAF')|(bde_om['description'] == 'Préfecture')|(bde_om['description'] == 'Mairie')]
bde_frag = bde_frag.drop(columns = ['an','type','qualite_geocodage','nom_dep','nom_EPCI','nom_com','code_ISO',])
  • Homogénéisation des codes Iris

Les codes Iris des communes non irisées correspondent aux codes Insee des communes, suivis de 0000 (Exemple: Saint Cyr en Val est une commune non irisée de code Insee '45272'. Ce code est repris pour le code Iris alors qu'il devrait être '452720000'. La fonction ci-dessous permet de le modifier avec la bonne nomenclature). Pour corriger les codes Iris des communes Iris, qui, dans ce document, n'ont pas été écrits selon la nomenclature précédente, mais remplacés par les codes des communes, la fonction suivante a été appliquée sur la colonne des Iris.

In [ ]:
def multiply(x):
    if x < 1000000:
        return x*10000
    else:
        return x
bde_frag['IRIS'] = bde_frag.apply(lambda x: multiply(x.IRIS), axis=1)
  • Création du dataframe et calculs
In [ ]:
table = bde_frag.groupby(['code_com','IRIS'])['categorie','REG'].count()
table.drop(['REG'],'columns',inplace = True)
table.rename(columns = {'categorie':'Nombre equipement'})
  • Export

Le dataframe est exporté au format .csv et publié sur Open Data Orléans Métropole(Nombre d'équipements par IRIS_Orléans Métropole_fragilité numérique_2019).

In [ ]:
table.to_csv (r"chemin d'accès\nombre_equipement_orleans_metropole_2019.csv", index = True, header=True)

Les jeux de données énumérés dans la parties précédentes ont été regroupés sous un seul jeu de données à l'aide des processeurs de jointure de Open Data Orléans Métropole. Seules 17 communes sur 22 sont renseignées pour l'année 2017 du fait du déroulement des recensements expliqué dans la partie 'Collecte et extraction à partir des données brutes'.

  • Import du jeu de données

Le jeu de données est directement importé depuis la plateforme Open Data Orléans Métropole avec l'url ci-dessous.

In [59]:
indic = pd.read_csv('https://data.orleans-metropole.fr/explore/dataset/donnees-calcul-indicateur-fragilite-numerique-orleans-metropole/download/?format=csv&timezone=Europe/Berlin&lang=fr&use_labels_for_header=true&csv_separator=%3B', delimiter = ';')
  • Préparation des données

Pour faciliter les codes et éviter les apostrophes ou tout autre caractère qui viendrait déranger le code, les noms des colonnes 'à risque' sont renommées.

In [61]:
indic = indic.rename(columns={"Nombre d'antennes":"couverture_mobile", 'Tx pauvreté':'Tx_pauvre', 'Logements raccordables / commune':'Taux logements raccordables'})

Pour les équipements (antennes, services publics, fibres) et le nombre de personnes couverte par les minimas sociaux, les NaN sont remplacés par 0 car on estime que si la valeur est manquante, c'est qu'il n'y a pas d'équipement à cet endroit. Le remplacement est effectué à l'aide de la fonction suivante:

In [62]:
indic_na_zero = indic[["couverture_mobile",'Taux logements raccordables','NBequip', 'PERCOU']]
for l in indic_na_zero:
    newcol = l + 'bis'
    indic[newcol] = indic[l].fillna(0)

Pour les autres variables (ex: taux de pauvreté), les valeurs manquantes sont remplacés par la moyenne des 17 communes (cf. MEDNUM qui avait remplacé par les moyennes régionales). Le remplacement est effectué à l'aide de la fonction suivante:

In [64]:
for i in indic.columns[indic.isnull().any(axis=0)]:
    indic[i].fillna(indic[i].mean(),inplace=True)

Le nombre d'équipement disponible par individu est calculé en divisant le nombre d'équipement disponible par IRIS par le nombre d'habitant de l'IRIS.

In [65]:
indic['equip_ind']= indic['NBequipbis']/indic['POPLEG']

Le nombre de personnes couvertes par les minimas sociaux est transformé en pourcentage de la population de la commune. Pour cela une colonne du nombre d'habitant par commune est ajoutée.

In [66]:
popcom = indic.groupby(['depcom'])['POPLEG', 'iris'].sum()
<ipython-input-66-9e9dd2a66f6b>:1: FutureWarning: Indexing with multiple keys (implicitly converted to a tuple of keys) will be deprecated, use a list instead.
  popcom = indic.groupby(['depcom'])['POPLEG', 'iris'].sum()
Out[66]:
POPLEG iris
depcom
45075 2032 1803000410
45089 1726 1352670306
45147 8275 4063232216
45169 1888 1806760410
45197 2431 451970000
45232 7965 4070881820
45234 44183 20355350984
45235 828 452350000
45272 3458 452720000
45274 1497 1358220306
45282 615 452820000
45284 7813 4075561920
45285 6188 3622800836
45286 1724 1811440410
45298 1212 905960203
45302 6297 2718120621
45308 1910 453080000
In [67]:
indic['taux_percou'] = indic['PERCOUbis']/indic['POPLEG']
popcom = popcom.drop(columns = ['iris'])
popcom = popcom.rename(columns={'POPLEG':'POPCOM'})
In [69]:
indic = indic.merge(popcom, how='inner', on='depcom')
indic = indic.rename(columns={'POPCOM_y':'POPCOM'})
In [48]:
indic['taux_percou'] = indic['PERCOUbis']/indic['POPCOM']

La couverture mobile est estimée par rapport à la présence d'au moins une antenne mobile sur la commune. Ainsi, seules des valeurs sont possibles pour cette variable: si il y a au moins une antenne, 100% sinon 0%.

In [71]:
indic.loc[(indic.couverture_mobilebis > 0), 'couverture_mobilebis']=100

La non couverture mobile est estimée à partir des résultats précédents de couverture.

In [72]:
indic['non_couv_mobile']= 100-indic['couverture_mobilebis']

Les variables sont ensuite séparées en deux groupes. Celles qui seront comparées à la moyenne de chaque commune et celles qui seront comparées à la moyenne de chaque Iris. Un dataframe regroupant les moyennes des variables par commune est donc créé.

In [78]:
group = indic[['depcom','Tx_pauvre','non_couv_mobile','Taux logements raccordablesbis','taux_percou']]
com = group.groupby(['depcom']).mean()
  • Etape 1: attribuer des points et calculer le score de chaque variable à partir du coefficient multiplicateur en comparant à la moyenne (de la commune ou de l'Iris)

Pour les variables comparées à la moyenne des Iris:

In [76]:
listcol1 = ['PartNBMONOFAM', 'PartNB15_29',
       'PartNB65+', 'PartNBIMMI', 'PartNBMEN1P', 'PartNBCHOM15_64',
       'PartNB15NSCONDIPL','equip_ind']
for l in listcol1:
    newcol = "pt_" + l 
    indic[newcol] = ((indic[l]-indic[l].mean())/indic[l].mean()+1)*100

Pour les variables comparées à la moyenne des communes:

In [81]:
listcol2 = ['Tx_pauvre', 'non_couv_mobile',
       'Taux logements raccordablesbis','taux_percou']
for l in listcol2:
    newcol = "pt_" + l 
    indic[newcol] = ((indic[l]-com[l].mean())/com[l].mean()+1)*100

Pour le revenu médian, les revenus médians des communes sont comparés au revenu médian d'Orléans Métropole qui est de 21420 euros (INSEE,2017).

In [83]:
#Revenu médian sur Orléans métropole: 21420 euros
m = 21420
indic['pt_Medrev'] = ((m-indic['Medrev'])/m+1)*100
  • Etape 2: construire le scoring total pour un axe du modèle

Les indicateurs de fragilité numérique sont classés selon deux problématiques: l'accès et les compétences. Les scores sont calculés à partir du regroupement des variables qui correspondent à ces problématiques. La MEDNUM a dégagé 4 axes principaux dans lesquelles classer ces variables: l'accès au numérique, l'accès à l'information, les compétences administratives, les compétences numériques. Les variables sont reliées à l'axe du modèle correspondant et les scores sont additionnés par axe.

In [85]:
indic['acces_numerique']= (indic['pt_Medrev']+indic['pt_Tx_pauvre']+indic['pt_non_couv_mobile']+indic['pt_Taux logements raccordablesbis'])*100/400
indic['acces_info']= (indic['pt_PartNBMONOFAM']+ indic['pt_PartNBMEN1P']+indic['pt_equip_ind']+indic['pt_PartNBIMMI'])*100/400
indic['competence_administrative'] = (indic['pt_PartNB15_29']+indic['pt_PartNBCHOM15_64']+indic['pt_taux_percou'])*100/300
indic['competence_numerique'] = (indic['pt_PartNB65+']+indic['pt_PartNB15NSCONDIPL'])*100/200
  • Etape 3: calculer les scoring globaux
In [87]:
indic['acces_global'] = (indic['acces_numerique']+indic['acces_info'])*100/200
indic['competence_global'] = (indic['competence_administrative']+indic['competence_numerique'])*100/200
indic['score_global'] = (indic['acces_global']+indic['competence_global'])*100/200
In [90]:
indic_fragi = indic[['cantville','depcom','LIBCOM','iris','LIB_IRIS','geom', 'centroid','POPLEG','POPCOM','acces_numerique','acces_info','competence_administrative','acces_global','competence_global','score_global']]
indic_fragi.to_csv (r"C:\Users\neury\Documents\Python\Sorties\indic_fragi.csv", index = True, header=True)