<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Network Analytics &#8211; Smals Research</title>
	<atom:link href="https://staging.smalsresearch.be/tag/network-analytics/feed/" rel="self" type="application/rss+xml" />
	<link>https://staging.smalsresearch.be</link>
	<description></description>
	<lastBuildDate>Tue, 16 Jun 2026 11:20:20 +0000</lastBuildDate>
	<language>en-GB</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>

<image>
	<url>https://staging.smalsresearch.be/wp-content/uploads/2026/01/cropped-cropped-Smals_Research-32x32.png</url>
	<title>Network Analytics &#8211; Smals Research</title>
	<link>https://staging.smalsresearch.be</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Le marché du travail salarié en Belgique : une analyse réseau (partie 3/3)</title>
		<link>https://staging.smalsresearch.be/le-marche-du-travail-salarie-en-belgique-une-analyse-reseau-partie-3-3/</link>
					<comments>https://staging.smalsresearch.be/le-marche-du-travail-salarie-en-belgique-une-analyse-reseau-partie-3-3/#respond</comments>
		
		<dc:creator><![CDATA[Vandy Berten]]></dc:creator>
		<pubDate>Tue, 24 Jul 2018 07:00:27 +0000</pubDate>
				<category><![CDATA[[FR]]]></category>
		<category><![CDATA[Blog post]]></category>
		<category><![CDATA[big data]]></category>
		<category><![CDATA[egov]]></category>
		<category><![CDATA[Graph Databases]]></category>
		<category><![CDATA[Network Analytics]]></category>
		<guid isPermaLink="false">/?p=11689</guid>

					<description><![CDATA[Dans le premier article de notre série consacrée à l&#8217;analyse réseau du marché du travail en Belgique, nous avons présenté les données constituant le graphe (ou réseau) de Dimona, sur lequel se base cette série de trois articles, et montré quelques métriques, permettant par exemple d&#8217;évaluer le nombre de personnes actives à un moment donné, [&#8230;]]]></description>
										<content:encoded><![CDATA[<p style="text-align: justify;">Dans le <a href="/le-marche-du-travail-salarie-en-belgique-une-analyse-reseau-partie-1/">premier article de notre série</a> consacrée à l&#8217;analyse réseau du marché du travail en Belgique, nous avons présenté les données constituant le graphe (ou réseau) de Dimona, sur lequel se base cette série de trois articles, et montré quelques métriques, permettant par exemple d&#8217;évaluer le nombre de personnes actives à un moment donné, ou le nombre d&#8217;employeurs par travailleurs et vice-versa.</p>
<p style="text-align: justify;">Dans <a href="/le-marche-du-travail-salarie-en-belgique-une-analyse-reseau-partie-2-3/">le second article</a>, nous avons vu que le graphe pouvait être découpé en sous-graphes, soit en considérant les composantes connexes, soit en y calculant des communautés.</p>
<p style="text-align: justify;">Dans ce troisième et dernier article, nous allons nous intéresser dans un premier temps à la notion d&#8217;homophilie, pour ensuite parler du concept de projection d&#8217;un graphe (biparti).</p>
<h1 style="text-align: justify;">Homophilie</h1>
<p style="text-align: justify;">En sociologie, le terme &#8220;homophilie&#8221; (déjà exploité <a href="/un-fraudeur-ne-fraude-jamais-seul/">dans un blog précédent</a>) désigne le fait pour une personne d&#8217;avoir plus d&#8217;affinité avec les personnes similaires à elle-même (&#8220;qui se ressemble s&#8217;assemble&#8221;). Par extension, en théorie des réseaux, on dira qu&#8217;un réseau est homophile si, dans le voisinage immédiat d&#8217;un nœud, on aura tendance à trouver des nœuds similaires à ce nœud. La notion de similarité peut vouloir dire beaucoup de choses : pour des personnes, partager des centres d&#8217;intérêts, une ethnie, un niveau de formation ou socio-économique, une religion&#8230; pour des entreprises, être actif dans le même secteur, dans la même région, voire même être également enclins à frauder.</p>
<p style="text-align: justify;">Nous allons ici voir dans quelle mesure le marché du travail belge est &#8220;homophile&#8221;, et cela selon deux caractéristiques : la province de l&#8217;employeur, et ses codes NACE. Nous nous poserons donc la question suivante : un travailleur employé par une société située en province X (ou exerçant dans le domaine X) va-t-il, s&#8217;il change d&#8217;employeur, favoriser une entreprise de la même province (ou du même domaine) ?</p>
<h2 style="text-align: justify;">Homophilie par province</h2>
<h3 style="text-align: justify;">Aperçu général</h3>
<p style="text-align: justify;">En premier lieu, nous allons évaluer, pour chaque province, la proportion de travailleurs qui travaillent dans cette province, puis changent de travail pour un employeur dans une autre province. Le nombre obtenu pourrait ainsi être interprété comme une mesure de la &#8220;fidélisation&#8221; d&#8217;une province.</p>
<p style="text-align: justify;">Il nous faut donc calculer deux valeurs pour chaque province :</p>
<ul style="text-align: justify;">
<li>Le nombre de personnes qui, sur la période étudiée, y ont eu un emploi</li>
<li>Le nombre de personnes qui, après un emploi dans cette province, ont trouvé un emploi dans une autre.</li>
</ul>
<p style="text-align: justify;"><span class="collapseomatic " id="id6a315b63e5a5f"  tabindex="0" title="Requêtes Cypher"    >Requêtes Cypher</span><div id="target-id6a315b63e5a5f" class="collapseomatic_content ">
<p style="text-align: justify;">Nombre total de travailleurs par province :</p>
<pre>MATCH (c:Company)--(p:People)
RETURN c.Province, COUNT(DISTINCT p)</pre>
<p style="text-align: justify;">Nombre total de personnes ayant quitté la province :</p>
<pre>MATCH (c1:Company)-[r1]-(w:People)-[r2]-(c2:Company) 
WHERE 
   c1 &lt;&gt; c2 
   AND r1.START &lt;= r2.START 
   AND coalesce(c1.Province, "null") &lt;&gt; c2.Province
RETURN c1.Province, COUNT(DISTINCT p)</pre>
<p style="text-align: justify;"></div>
<p style="text-align: justify;">Combinées, ces données nous permettent d&#8217;obtenir le graphique suivant :</p>
<p style="text-align: justify;"><a href="/wp-content/uploads/2018/06/Mover_ratio_per_province.png"><img fetchpriority="high" decoding="async" class="alignleft wp-image-11792" src="/wp-content/uploads/2018/06/Mover_ratio_per_province.png" alt="" width="450" height="300" srcset="https://staging.smalsresearch.be/wp-content/uploads/2018/06/Mover_ratio_per_province.png 900w, https://staging.smalsresearch.be/wp-content/uploads/2018/06/Mover_ratio_per_province-300x200.png 300w, https://staging.smalsresearch.be/wp-content/uploads/2018/06/Mover_ratio_per_province-768x512.png 768w" sizes="(max-width: 450px) 100vw, 450px" /></a></p>
<p style="text-align: justify;">Notons que la colonne &#8220;Bruxelles&#8221; est particulière : c&#8217;est dans la capitale que la plupart des entreprises actives sur tout le territoire (ministères, chaînes de magasins&#8230;) ont leur siège social. Le fait que son employeur soit renseigné à Bruxelles ne veut donc pas dire que l&#8217;on travaille dans cette ville.</p>
<p style="text-align: justify;">Le graphique nous indique que 63% des personnes ayant travaillé dans le Brabant Flamand ont ensuite trouvé un emploi ailleurs, alors que seuls 46 % des travailleurs liégeois ont quitté leur province. En termes d&#8217;homophilie, on peut donc estimer que Liège est plus &#8220;homophile&#8221; que le Brabant Flamand : dans le &#8220;voisinage&#8221; de Liège (les autres employeurs des travailleurs d&#8217;employeurs liégeois), on trouve une plus grande proportion d&#8217;entreprises Liégeoises qu&#8217;on ne trouve d&#8217;entreprises (flamo-)brabançonnes dans le voisinage du Brabant Flamand.</p>
<p style="text-align: justify;">Notons que ce constat ne dit rien des raisons : les liégeois ne sont pas nécessairement &#8220;pantouflards&#8221;, il se peut que les conditions de travail y soient si bonnes que rares sont ceux qui veulent aller voir ailleurs.</p>
<h3 style="text-align: justify;">Aperçu détaillé</h3>
<p style="text-align: justify;">Si l&#8217;on veut une vue plus détaillée de cette notion d&#8217;homophilie provinciale, on peut aussi comparer, pour chaque province P, les deux répartitions suivantes :</p>
<ul style="text-align: justify;">
<li>La répartition du voisinage de P, c&#8217;est-à-dire les provinces où travaillent tous les travailleurs qui ont d&#8217;abord travaillé pour une entreprise situé en province P</li>
<li>La répartition générale des travailleurs par province.</li>
</ul>
<p style="text-align: justify;">Pour la répartition générale, nous allons calculer le nombre de personnes ayant eu, au cours de ce 15 dernières années, un emploi dans chaque province.</p>
<p style="text-align: justify;"><img decoding="async" class="wp-image-11789 alignright" src="/wp-content/uploads/2018/06/Worker_per_province.png" alt="" width="450" height="300" srcset="https://staging.smalsresearch.be/wp-content/uploads/2018/06/Worker_per_province.png 900w, https://staging.smalsresearch.be/wp-content/uploads/2018/06/Worker_per_province-300x200.png 300w, https://staging.smalsresearch.be/wp-content/uploads/2018/06/Worker_per_province-768x512.png 768w" sizes="(max-width: 450px) 100vw, 450px" /></p>
<p style="text-align: justify;">Comme nous souhaitons obtenir une distribution, la somme de toutes nos colonnes doit être égale à 1 (ou 100%). Nous divisons donc chaque colonne par la somme de toutes les colonnes. Cette valeur est supérieure à la population totale, car chaque travailleur ayant travaillé dans deux provinces sera compté 2 fois. Ce qui compte, ce n&#8217;est pas la hauteur absolue d&#8217;une colonne, mais sa hauteur par rapport aux autres colonnes.</p>
<p style="text-align: justify;">Nous obtenons le graphique ci-contre.</p>
<p style="text-align: justify;"><span class="collapseomatic " id="id6a315b63e5b29"  tabindex="0" title="Requêtes Cypher"    >Requêtes Cypher</span><div id="target-id6a315b63e5b29" class="collapseomatic_content ">
<p style="text-align: justify;">Nombre total de travailleurs par province :</p>
<pre>MATCH (c:Company)--(p:People)
RETURN c.Province, COUNT(DISTINCT p)</pre>
<p style="text-align: justify;"></div>
<p style="text-align: justify;">Nous calculons ensuite, pour chaque province P, le nombre de personnes qui, après un emploi dans cette province P, ont eu un autre emploi dans cette même province, ce qui nous donne la série de graphiques ci-dessous.</p>
<p style="text-align: justify;"><span class="collapseomatic " id="id6a315b63e5b7e"  tabindex="0" title="Requête Cypher"    >Requête Cypher</span><div id="target-id6a315b63e5b7e" class="collapseomatic_content ">
<pre>MATCH (c1:Company)-[r1]-(p:People)-[r2]-(c2:Company) 
WHERE c1 &lt;&gt; c2 AND r1.START &lt;= r2.START
RETURN c1.Province, c2.Province, COUNT(DISTINCT p)</pre>
<p style="text-align: justify;"></div>
<p style="text-align: justify;"><a href="/wp-content/uploads/2018/06/Homophily.png" target="_blank" rel="noopener"><img decoding="async" class="alignleft wp-image-11793 size-large" src="/wp-content/uploads/2018/06/Homophily-1024x512.png" alt="" width="688" height="344" srcset="https://staging.smalsresearch.be/wp-content/uploads/2018/06/Homophily-1024x512.png 1024w, https://staging.smalsresearch.be/wp-content/uploads/2018/06/Homophily-1536x768.png 1536w, https://staging.smalsresearch.be/wp-content/uploads/2018/06/Homophily-2048x1024.png 2048w, https://staging.smalsresearch.be/wp-content/uploads/2018/06/Homophily-300x150.png 300w, https://staging.smalsresearch.be/wp-content/uploads/2018/06/Homophily-768x384.png 768w" sizes="(max-width: 688px) 100vw, 688px" /></a></p>
<p style="text-align: justify;">Notons qu&#8217;il est difficile de comparer la vue générale que nous avons montrée ci-dessus avec cette série de graphiques, pour plusieurs raisons :</p>
<ul style="text-align: justify;">
<li>La série de graphiques montre comment se sont comportés ceux qui ont changé de travail. On ne compte donc pas ceux qui n&#8217;ont jamais changé d&#8217;employeurs, ce qui représente un peu plus de 42 % des travailleurs, comme mentionné dans <a href="/le-marche-du-travail-salarie-en-belgique-une-analyse-reseau-partie-1/">notre premier blog</a> .</li>
<li>Un travailleur qui a d&#8217;abord travaillé à Bruxelles, pour ensuite partir à Namur et puis à Mons, en Hainaut, sera repris à la fois dans les transferts Bruxelles-Namur, mais également Bruxelles-Hainaut. On ne peut donc pas sommer les migrations entre une province et les autres pour connaitre le nombre de personnes ayant quitté la province.</li>
<li>Si la hauteur absolue d&#8217;une colonne dans le graphique général a un sens (proportion de travailleurs ayant quitté la province), elle n&#8217;en a pas vraiment la série de graphiques qui suit.</li>
</ul>
<p style="text-align: justify;">Quelques observations peuvent être faites :</p>
<ul style="text-align: justify;">
<li>La répartition du voisinage de Bruxelles diffère peu de la répartition globale des travailleurs : cela s&#8217;explique très probablement par ce qui a déjà été évoqué, la plupart des grandes structures ayant leur siège social à Bruxelles</li>
<li>En dehors de Bruxelles, le voisinage d&#8217;une province reste majoritairement dans la même région (Flandre ou Wallonie)</li>
</ul>
<h2 style="text-align: justify;">Homophilie par secteur (Code NACE)</h2>
<p style="text-align: justify;">Nous avons réalisé une analyse similaire sur base des Code NACE (<a href="/le-marche-du-travail-salarie-en-belgique-une-analyse-reseau-partie-1/">décrits dans notre premier article</a>), précisant le secteur d&#8217;activité, à nouveau en excluant les contrats d&#8217;intérim. Nous nous posons la question suivante : le &#8220;voisinage d&#8217;un secteur&#8221; (à savoir les entreprises dans lesquelles travaillent les travailleurs d&#8217;entreprises du dit secteur) est-il différenciable de l&#8217;ensemble de la population des entreprises ?</p>
<p style="text-align: justify;">Nous présentons pour ce faire <a href="/wp-content/uploads/2018/06/Homophily_NACE_NOINTERIM.pdf" target="_blank" rel="noopener">les graphiques accessibles dans ce document joint</a>.</p>
<p style="text-align: justify;">Pour chaque page, correspondant à un code NACE (de premier niveau), on trouve sur la première ligne la comparaison entre la distribution des codes NACE des entreprises en général (en bleu) et la distribution des entreprises employant au moins un travailleur ayant été embauché par une entreprise du code NACE concerné. À gauche, la comparaison se fait sur base du nombre d&#8217;entreprises. À droite, sur base du nombre de travailleurs. En titre, le coefficient de correlation (selon <a href="https://en.wikipedia.org/wiki/Pearson_correlation_coefficient">la méthode de Pearson</a>) indique à quel point le voisinage du secteur analysé diffère de la distribution globale. Proche de 1, il sera quasiment indifférenciable, plus on s&#8217;en éloigne, plus spécifique sera le voisinage du secteur analysé.</p>
<p style="text-align: justify;">Les graphiques du bas, indiquent, pour chaque code NACE, le ratio entre les deux colonnes du graphique du haut. Il s&#8217;agit d&#8217;une autre façon de voir les secteurs surreprésentés (au dessus de la ligne pointillée rouge) et sous-représentés (en dessous de la ligne).</p>
<p style="text-align: justify;">Nous constatons que pour quasiment tous les secteurs, ce même secteur est sur-représenté dans le voisinage, montrant que le phénomène d&#8217;homophilie est observé. La sur-représentation présente cependant des grandes variations : à peine perceptible pour le commerce (code G), très importante pour des secteurs très spécialisés (et concernant très peu de monde), comme les activités extra-territoriales (code U) ou l&#8217;extraction (code B).</p>
<p style="text-align: justify;">Nous laissons au lecteur le choix d&#8217;aller plus loin dans l&#8217;analyse, en identifiant par exemple des secteurs &#8220;associés&#8221; (souvent sur-représentés ensemble).</p>
<h1 style="text-align: justify;">Projection biparti</h1>
<figure id="attachment_11764" aria-describedby="caption-attachment-11764" style="width: 300px" class="wp-caption alignleft"><a href="/wp-content/uploads/2018/05/bipartite_projection.png"><img loading="lazy" decoding="async" class="wp-image-11764 size-medium" src="/wp-content/uploads/2018/05/bipartite_projection-300x271.png" alt="" width="300" height="271" srcset="https://staging.smalsresearch.be/wp-content/uploads/2018/05/bipartite_projection-300x271.png 300w, https://staging.smalsresearch.be/wp-content/uploads/2018/05/bipartite_projection.png 653w" sizes="auto, (max-width: 300px) 100vw, 300px" /></a><figcaption id="caption-attachment-11764" class="wp-caption-text">Graphe biparti (à gauche), représentant les liens entre employés et employeurs, et ses deux projections biparti (à droite), représentant le réseau des collègues (en haut) et le réseaux des employeurs (en bas). Les poids, en bleu, indiquent respectivement le nombre d&#8217;employeurs et d&#8217;employés en commun.</figcaption></figure>
<p style="text-align: justify;">Lorsque l&#8217;on a un graphe biparti, c&#8217;est-à-dire un graphe avec deux types de nœuds A et B (comme par exemple travailleur et employeur) et des arcs qui vont uniquement entre un nœud du type A et un nœud du type B (comme par exemple les relations de travail), on peut réaliser ce qu&#8217;on appelle une projection biparti. Il s&#8217;agit d&#8217;un graphe qui ne comportera que des nœuds d&#8217;un type A (resp. B), et qui aura un arc entre deux nœuds x<sub>1</sub> et x<sub>2</sub> s&#8217;il existe dans le graphe d&#8217;origine un nœud du type B (resp. A), lié à x<sub>1</sub> et à x<sub>2</sub>. Il existe toujours deux projections d&#8217;un graphe biparti : une pour chaque type de nœud. Dans le cas qui nous occupe, nous aurons un graphe reprenant la totalité des employeurs, et un lien entre deux employeurs s&#8217;il existe une personne ayant travaillé pour les deux employeurs, et un graphe reprenant la totalité des travailleurs, avec un lien entre deux travailleurs s&#8217;ils ont un jour été collègue (en supposant deux personnes collègues si elles ont travaillé pour un même employeur, mais pas nécessairement en même temps).</p>
<p style="text-align: justify;">Les arcs créés dans la projection biparti sont souvent associée à un poids, qui peut par exemple avoir pour valeur le nombre de nœuds &#8220;compressés&#8221; dans la projection : il peut s&#8217;agit du nombre de travailleurs partagés dans le cas de la projection sur les employeurs, ou du nombre d&#8217;entreprises dans lequel les deux extrémités de la relation ont été collègues.</p>
<p style="text-align: justify;">Pour l&#8217;analyse qui suit, nous n&#8217;avons pas considéré les travailleurs intérimaires, qui, par nature, changent souvent d&#8217;employeurs, et pourraient fausser les impressions. Nous n&#8217;avons par ailleurs considéré que <a href="/le-marche-du-travail-salarie-en-belgique-une-analyse-reseau-partie-2-3/">la composante géante (voir notre article précédent)</a>. Par définition, il n&#8217;y aura pas de travailleurs en commun entre deux entreprises faisant partie de deux composantes connexes distinctes.</p>
<p style="text-align: justify;">Nous n&#8217;avons pas pu réaliser l&#8217;analyse qui suit dans la base de donnée Neo4j, n&#8217;ayant trouvé aucune fonctionnalité permettant de réaliser les projections voulues. Nous avons utilisé la librairie <a href="https://igraph.org">igraph</a>.</p>
<p style="text-align: justify;"><span style="color: #000000; font-weight: bold;">Projection par entreprise</span></p>
<p style="text-align: justify;">La première projection que nous avons réalisée est la projection par entreprise. Elle comporte un peu plus de 530 000 employeurs, et 22 millions de liens. En regardant le poids de ces liens (indiquant dont le nombre de travailleurs partagés), on en trouve 18.6 millions ayant la valeur 1. Il y a donc 18.6 millions de couples d&#8217;employeurs ne partageant qu&#8217;un seul travailleur. Les valeurs les plus intéressantes se trouvent à l&#8217;autre extrémité : il existe deux employeurs se partageant 37 350 travailleurs ! Nous y trouvons ensuite un triplet d&#8217;employeurs qui se partagent deux par deux, respectivement, 11 000, 10 000 et 7 000 travailleurs.</p>
<p style="text-align: justify;">Le premier est le fait d&#8217;une société nationale, qui a une structure juridique séparée pour la gestion de ses ressources humaines. Chaque travailleur y est déclaré dans les deux structures. Le second concerne un organisme de gestion d&#8217;artistes, divisé en plusieurs structures juridiques distinctes. On trouve aussi un chaîne de grands magasins de près de 140 000 salariés (dont un très grand nombre de jobistes), partageant 5 800 travailleurs avec un ministère de 250 000 salariés. Il n&#8217;est bien sûr pas surprenant que deux aussi gros employeurs partagent autant de personnel. L&#8217;essentiel de ce que l&#8217;on voit par la suite est du même acabit : de très gros employeurs, liés entre eux par un nombre de salariés qui est dans l&#8217;absolu élevé, mais pas relativement au nombre d&#8217;employés respectif. Une analyse plus approfondie, où l&#8217;on placerait en poids la proportion de personnel partagé (par exemple, avec la <a href="https://fr.wikipedia.org/wiki/Indice_et_distance_de_Jaccard">distance de Jaccard</a>) apporterait un autre éclairage. On pourrait par exemple détecter des transferts d&#8217;entreprises, des rachats ou des fusions. Nous n&#8217;irons pas plus loin ici dans cette analyse.</p>
<h2 style="text-align: justify;">Projection par travailleur</h2>
<p style="text-align: justify;">La projection par travailleur pose un problème de taille : elle est très largement plus volumineuse que celle par entreprise. Nous sommes parvenus à déterminer qu&#8217;elle devait comporter un peu plus de 7 millions de nœuds, et pas loin de 400 millions d&#8217;arcs, mais, en utilisant la libraire igraph sur un serveur ayant à sa disposition 64 GB de mémoire, nous n&#8217;avons pas réussi à la calculer. Cependant, nous voulions principalement mettre en évidence les couples de personnes partageant de nombreux employeurs.</p>
<p style="text-align: justify;"><span class="collapseomatic " id="id6a315b63e5c0d"  tabindex="0" title="Cliquer ici pour voir comment nous avons malgré tout pu contourner cette limitation"    >Cliquer ici pour voir comment nous avons malgré tout pu contourner cette limitation</span><div id="target-id6a315b63e5c0d" class="collapseomatic_content ">
<p style="text-align: justify;">Dès lors, nous pouvions d&#8217;entrée de jeu éliminer de nos données tous les employeurs ayant moins de deux travailleurs. En effet, un employeur avec un seul travailleur ne pourra par définition pas être un employeur commun entre deux personnes. Cette simplification n&#8217;aura aucun impact sur la projection, ces employeurs supprimés n&#8217;étant jamais considérés comme &#8220;en commun&#8221; entre deux travailleurs, et donc n&#8217;apparaissent dans aucun poids.</p>
<figure id="attachment_11766" aria-describedby="caption-attachment-11766" style="width: 400px" class="wp-caption alignleft"><a href="/wp-content/uploads/2018/05/projection_simplification.png"><img loading="lazy" decoding="async" class="wp-image-11766" src="/wp-content/uploads/2018/05/projection_simplification.png" alt="" width="400" height="377" srcset="https://staging.smalsresearch.be/wp-content/uploads/2018/05/projection_simplification.png 653w, https://staging.smalsresearch.be/wp-content/uploads/2018/05/projection_simplification-300x283.png 300w" sizes="auto, (max-width: 400px) 100vw, 400px" /></a><figcaption id="caption-attachment-11766" class="wp-caption-text">Simplification d&#8217;un graphe avant projection. Les noeuds &#8220;i&#8221; et &#8220;3&#8221; sont supprimés. À droite : les projections originale (en haut) et simplifiée (en bas).</figcaption></figure>
<p style="text-align: justify;">Dans le même ordre d&#8217;idée, si nous voulons trouver tous les couples de travailleurs partageant au moins, mettons, 10 employeurs, nous pouvons également éliminer tous les travailleurs ayant moins de 10 employeurs (pour avoir 10 employeurs en commun avec un autre travailleur, il faut avoir soi-même au moins 10 employeurs). Cette dernière simplification supprimera des nœuds dans la projection résultante, mais uniquement des nœuds qui, dans la projection, ne seront liés à aucun nœud avec un poids supérieur ou égale au seuil fixé (10 dans notre exemple). L&#8217;illustration ci-dessous montre un graphe biparti (vert et orange), pour lequel on veut réaliser la projection &#8220;verte&#8221;, avec un seuil fixé à 4.</p>
<p style="text-align: justify;">Avec la première simplification, le nœud orange &#8220;i&#8221; (degré = 1, inférieur à 2) est supprimé. Avec la seconde simplification, le nœud vert &#8220;3&#8221; (degré = 3, inférieur au seuil 4) est supprimé lui aussi. Les deux projections (complète et simplifiée) sont ensuite montrées sur la droite. On y voit qu&#8217;en dehors de la suppression du nœud 3, les poids sur les arcs sont identiques.</p>
<p style="text-align: justify;"></div>
<p style="text-align: justify;">Le résultat de cette projection nous montre que bon nombre de travailleurs partagent un grand nombre d&#8217;employeur avec d&#8217;autre salariés. Par exemple, 32 couples de travailleurs (au total, 24 travailleurs), partagent deux par deux plus de 30 employeurs (jusqu&#8217;à 46), comme illustré ci-dessous, où chaque nœud représente un travailleur, et les labels sur les arcs le nombre d&#8217;employeurs commun entre deux travailleurs.</p>
<figure id="attachment_11772" aria-describedby="caption-attachment-11772" style="width: 688px" class="wp-caption alignleft"><a href="/wp-content/uploads/2018/05/shared_employers_trh30.png"><img loading="lazy" decoding="async" class="wp-image-11772 size-large" src="/wp-content/uploads/2018/05/shared_employers_trh30-1024x294.png" alt="" width="688" height="198" srcset="https://staging.smalsresearch.be/wp-content/uploads/2018/05/shared_employers_trh30-1024x294.png 1024w, https://staging.smalsresearch.be/wp-content/uploads/2018/05/shared_employers_trh30-300x86.png 300w, https://staging.smalsresearch.be/wp-content/uploads/2018/05/shared_employers_trh30-768x221.png 768w, https://staging.smalsresearch.be/wp-content/uploads/2018/05/shared_employers_trh30.png 1297w" sizes="auto, (max-width: 688px) 100vw, 688px" /></a><figcaption id="caption-attachment-11772" class="wp-caption-text">Projection par travailleur, en fixant un seuil à 30 (on ne garde donc que les travailleurs partageant 30 employeurs en commun ou plus). Chaque nœud représente un travailleur, le label sur les arcs indique le nombre d&#8217;employeurs en commun.</figcaption></figure>
<p style="text-align: justify;">Une analyse plus approfondie ce ces différents clusters mets en avant certains secteurs : le cluster de gauche concerne des employés embauchés essentiellement en tant que travailleurs occasionnels dans le secteur de la collecte de fruits et légumes ; celui du milieu des entreprises des arts du spectacles. Il s&#8217;agit de deux secteurs pour lesquels on change fréquemment d&#8217;employeur entre chaque &#8220;prestation&#8221; (une saison de collecte ou une tournée de spectacle).</p>
<p style="text-align: justify;">Pour chacune des relations affichées sur le réseau ci-dessus, nous avons également calculé la <a href="https://fr.wikipedia.org/wiki/Indice_et_distance_de_Jaccard">distance de Jaccard</a>, qui indique le ratio entre le nombre de voisins communs entre deux nœuds, et le nombre total de voisins de ces deux nœuds. Il se situe à chaque fois entre 25 et 45 %. Ceci indique que nous ne sommes donc pas dans une situation similaire à celle évoquée ci-dessus (pour la projection par employeur), ou deux &#8220;super-employeurs&#8221; avaient toutes les chances de partager quelques salariés, mais bien dans des situations ou deux travailleurs partagent une partie importante de leurs employeurs. Il y a donc fort à parier que, dans beaucoup de cas, il s&#8217;agisse de personnes qui cherchent du travail ensemble. Ceci pourrait être corroboré en menant une analyse plus fine, et en ne considérant qu&#8217;un employeur n&#8217;est commun entre deux travailleurs que si les périodes d&#8217;engagement coïncident. Nous avons mené cette observation manuellement pour les relations les plus fortes, et observé que c&#8217;était le cas dans la majorité des relations de travail.</p>
<h1 style="text-align: justify;">Conclusions</h1>
<p style="text-align: justify;">Cette série d&#8217;articles a mis en lumière la puissance que l&#8217;analyse réseau, en combinaison avec une base de données orientée graphes, pouvait offrir. La gamme de résultats est très large : on peut à la fois obtenir des métriques offrant une vue très générale (le nombre de travailleurs à un moment donné, le nombre moyen d&#8217;employeurs par travailleur&#8230;), mais également isoler facilement des comportements qui sortent du lot (travailleurs changeant anormalement souvent d&#8217;employeur, employeurs ayant du personnel extrêmement fidèle&#8230;). L&#8217;analyse réseau est donc à la fois un excellent complément de l&#8217;analyse statistique classique, mais est également un outil de très grande valeur pour détecter la fraude ou les erreurs et autres problèmes de qualité dans les données.</p>
<p style="text-align: justify;">Il va de soi que, en combinaison avec des experts soit du marché de l&#8217;emploi, soit en statistiques, de nombreuses autres observations pourraient être faites. Certaines de celles-ci pourraient également être obtenues avec des techniques statistiques classiques, mais beaucoup nécessiteraient un travail démesuré, voire même seraient tout simplement impossibles.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://staging.smalsresearch.be/le-marche-du-travail-salarie-en-belgique-une-analyse-reseau-partie-3-3/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Le marché du travail salarié en Belgique : une analyse réseau (partie 2/3)</title>
		<link>https://staging.smalsresearch.be/le-marche-du-travail-salarie-en-belgique-une-analyse-reseau-partie-2-3/</link>
					<comments>https://staging.smalsresearch.be/le-marche-du-travail-salarie-en-belgique-une-analyse-reseau-partie-2-3/#respond</comments>
		
		<dc:creator><![CDATA[Vandy Berten]]></dc:creator>
		<pubDate>Tue, 26 Jun 2018 07:00:20 +0000</pubDate>
				<category><![CDATA[[FR]]]></category>
		<category><![CDATA[Blog post]]></category>
		<category><![CDATA[big data]]></category>
		<category><![CDATA[egov]]></category>
		<category><![CDATA[Graph Databases]]></category>
		<category><![CDATA[Network Analytics]]></category>
		<guid isPermaLink="false">/?p=11563</guid>

					<description><![CDATA[Dans notre article précédent, nous avons montré quelques éléments d&#8217;analyse réseau appliquée à la base de données &#8220;Dimona&#8221;, qui recense, en Belgique, les relations de travail entre tous les employeurs et leurs employés. Nous y avons principalement analysé la notion de degré, permettant de voir le nombre d&#8217;employeurs par employé, et le nombre d&#8217;employés par [&#8230;]]]></description>
										<content:encoded><![CDATA[<p style="text-align: justify;">Dans <a href="/le-marche-du-travail-salarie-en-belgique-une-analyse-reseau-partie-1/">notre article précédent</a>, nous avons montré quelques éléments d&#8217;analyse réseau appliquée à la base de données &#8220;Dimona&#8221;, qui recense, en Belgique, les relations de travail entre tous les employeurs et leurs employés. Nous y avons principalement analysé la notion de degré, permettant de voir le nombre d&#8217;employeurs par employé, et le nombre d&#8217;employés par employeur.</p>
<p style="text-align: justify;"><a href="/wp-content/uploads/2018/04/Dimona.png"><img loading="lazy" decoding="async" class="alignleft wp-image-11593 size-medium" src="/wp-content/uploads/2018/04/Dimona-300x221.png" alt="" width="300" height="221" srcset="https://staging.smalsresearch.be/wp-content/uploads/2018/04/Dimona-300x221.png 300w, https://staging.smalsresearch.be/wp-content/uploads/2018/04/Dimona.png 428w" sizes="auto, (max-width: 300px) 100vw, 300px" /></a>Nous allons maintenant examiner deux façons de découper le réseau en plusieurs &#8220;sous-réseau&#8221; : dans un premier temps une découpe par &#8220;composante connexe&#8221;, ensuite par détection de communauté.</p>
<p style="text-align: justify;">Rappelons que nous considérons un graphe (ou réseau) selon le modèle présenté ci-contre : nous avons deux types de nœuds (travailleurs et employeurs) ; la relation entre un travailleur et un employeur indique les dates de début et fin (si applicable) de contrat, ainsi qu&#8217;un &#8220;worker code&#8221;, décrivant une série de catégories présentées dans l&#8217;article précédent.</p>
<h1 style="text-align: justify;">1. Composante connexe</h1>
<p style="text-align: justify;">En partant d&#8217;un travailleur donné, on peut, en parcourant le graphe, trouver tous ses collègues, actuels ou anciens, via le lien &#8220;travailleur→employeur&#8221;, puis &#8220;employeur→travailleur&#8221;. Si, à partir de ces collègues, on re-parcourt le graphe de la même façon, on obtiendra les &#8220;collègues de collègues&#8221; du travailleur de départ. <a href="/wp-content/uploads/2018/06/composante_connexe.png"><img loading="lazy" decoding="async" class="size-medium wp-image-11895 alignright" src="/wp-content/uploads/2018/06/composante_connexe-243x300.png" alt="" width="243" height="300" srcset="https://staging.smalsresearch.be/wp-content/uploads/2018/06/composante_connexe-243x300.png 243w, https://staging.smalsresearch.be/wp-content/uploads/2018/06/composante_connexe.png 521w" sizes="auto, (max-width: 243px) 100vw, 243px" /></a>En continuant de la sorte tant que l&#8217;on tombe sur des travailleurs que l&#8217;on n&#8217;a pas encore rencontrés, on parcourt ainsi une &#8220;<a href="https://fr.wikipedia.org/wiki/Graphe_connexe">composante connexe</a>&#8220;, soit un ensemble (maximal) de nœuds pour lequel il existe un chemin entre chaque paire de nœuds. Tous les nœuds d&#8217;un graphe ne font pas nécessairement partie de la même composante connexe : si deux travailleurs font partie de deux composantes connexes distinctes, il n&#8217;existe pas de chemin &#8220;(ex-)collègue de (ex-)collègue de (ex-)collègue &#8230;&#8221; entre ces deux travailleurs.</p>
<p style="text-align: justify;">Le graphe ci-contre illustre un réseau composé de trois composantes connexes : une en haut à gauche, composée de 4 nœuds ; une seconde en bas à droite, de 5 nœuds ; une dernière, plus importante, entre les deux.</p>
<h2 style="text-align: justify;">Composante géante</h2>
<p style="text-align: justify;">On appellera &#8220;composante géante&#8221; la plus grande composante connexe d&#8217;un graphe. Si on effectue ce calcul sur notre graphe de Dimona, on obtiendra une composante effectivement géante : elle est composée de 8 149 146 de nœuds, dont 581 065 entreprises et  7 568 081 travailleurs.</p>
<p style="text-align: justify;">En d&#8217;autres mots, si l&#8217;on considère toutes les relations de travail de ces 15 dernières années, 99.5% des travailleurs ayant été actifs sur cette période sont &#8220;(ex-)collègue de (ex-)collègue de (ex-)collègue &#8230;&#8221; entre eux, via 95 % des entreprises. Ceci en considérant que deux personnes sont collègues si elles ont eu le même employeur, simultanément ou non. Le monde du travail (belge) peut donc être vu comme un &#8220;petit monde&#8221;, théorisé par <a href="https://fr.wikipedia.org/wiki/%C3%89tude_du_petit_monde">Milgram dans son paradoxe éponyme.</a></p>
<h1 style="text-align: justify;">Diamètre</h1>
<p style="text-align: justify;">En analysant de plus près cette composante géante, on voit que son diamètre, soit le nombre de relations du plus long &#8220;plus court chemin&#8221; entre deux nœuds, est de 20. Ce qui veut dire que, pour 99.5% des travailleurs actifs sur la période, il n&#8217;est jamais nécessaire de passer par plus de 9 (ex-)collègues intermédiaires pour &#8220;connecter&#8221; deux travailleurs.</p>
<figure id="attachment_11589" aria-describedby="caption-attachment-11589" style="width: 1288px" class="wp-caption alignleft"><a href="/wp-content/uploads/2018/04/Diameter.png"><img loading="lazy" decoding="async" class="wp-image-11589 size-full" src="/wp-content/uploads/2018/04/Diameter.png" alt="" width="1288" height="253" srcset="https://staging.smalsresearch.be/wp-content/uploads/2018/04/Diameter.png 1288w, https://staging.smalsresearch.be/wp-content/uploads/2018/04/Diameter-300x59.png 300w, https://staging.smalsresearch.be/wp-content/uploads/2018/04/Diameter-768x151.png 768w, https://staging.smalsresearch.be/wp-content/uploads/2018/04/Diameter-1024x201.png 1024w" sizes="auto, (max-width: 1288px) 100vw, 1288px" /></a><figcaption id="caption-attachment-11589" class="wp-caption-text">Plus long &#8220;plus court chemin&#8221; qu&#8217;il est possible de faire dans Dimona. De longueur 20, il nécessite 9 travailleurs intermédiaires pour relier A et K.</figcaption></figure>
<p style="text-align: justify;">En moyenne, il faut 1.5 collègues intermédiaires pour chaque paire de travailleurs (longueur moyenne du plus court chemin entre deux nœuds : 5), et dans 99 % des cas, 3 travailleurs intermédiaires sont suffisants (percentile 0.99 = 8, comme entre A et E, dans la figure ci-dessus).</p>
<p style="text-align: justify;">Si l&#8217;on prend deux travailleurs (faisant partie de la composantes géantes, soit pour l&#8217;essentiel n&#8217;étant pas le seul salarié d&#8217;une entreprise) au hasard, il y a 59% de chances qu&#8217;ils aient un collègue en commun, en prenant la définition large de collègue, voulant dire &#8220;ayant eu un employeur en commun, mais pas nécessairement en même temps&#8221;.</p>
<p style="text-align: justify;">Notons qu&#8217;une partie de ce qui explique ce &#8220;petit monde&#8221; est ce qu&#8217;on appelle les &#8220;super-connecteurs&#8221; : il s&#8217;agit de nœuds ayant un degré très élevé. Tous les enseignants (du même régime linguistique) sont par exemple employés par le même ministère.</p>
<p style="text-align: justify;">Notons également que même si l&#8217;on s&#8217;intéresse à une période plus petite, la composante géante reste importante : si l&#8217;on ne considère que les relations de travail entre 2013 et 2017, la composante fera alors 6 253 490 nœuds, dont 5 907 213 travailleurs, soit 99% des 5 966 745 travailleurs actifs sur cette période-là. On descend à 96% en ne regardant que les relations de travail en 2017.</p>
<p style="text-align: justify;"><span class="collapseomatic " id="id6a315b63e8771"  tabindex="0" title="Requêtes Cypher"    >Requêtes Cypher</span><div id="target-id6a315b63e8771" class="collapseomatic_content ">
<p style="text-align: justify;">Création des partitions :</p>
<p style="text-align: justify;"><code>CALL algo.unionFind(NULL, NULL, {write:true, partitionProperty:"partition"})</code><br />
<code>YIELD nodes, setCount, loadMillis, computeMillis, writeMillis;</code></p>
<p style="text-align: justify;">Création des partitions pour les relations entre 2013 et 2017 :</p>
<p style="text-align: justify;"><code>CALL algo.unionFind(</code><br />
<code> "MATCH (p) RETURN id(p) as id",</code><br />
<code> "MATCH (p1)-[r]-&gt;(p2) WHERE r.START &lt;= '2017-12-31' AND (r.END IS NULL or r.END &gt;= '2013-01-01') RETURN id(p1) as source, id(p2) as target",</code><br />
<code> {graph:'cypher', write:true, partitionProperty :'partition2013_2017'}</code><br />
<code>);</code></p>
<p style="text-align: justify;">Nombre de partitions en fonction de la taille :</p>
<p style="text-align: justify;"><code>MATCH (n)</code><br />
<code>WITH DISTINCT (n.partition) AS partition, COUNT(*) AS partition_size</code><br />
<code> WITH partition_size, COUNT(partition) AS nb_partitions</code><br />
<code>RETURN partition_size, nb_partitions</code><br />
<code> ORDER BY partition_size</code></p>
<p style="text-align: justify;"></div>
<h1 style="text-align: justify;">Autres composantes connexes</h1>
<p style="text-align: justify;">Le réseau complet de Dimona, sur base des relations de 2003 à 2017, est composé de 28 224 composantes connexes. Nous venons de voir que la très grande majorité des nœuds font partie de la même composante connexe.</p>
<p style="text-align: justify;">À l&#8217;autre extrémité, nous avons un grand nombre de composantes connexes toutes petites : 22 013 d&#8217;entre elles sont composées de deux nœuds, donc un travailleur et un employeur. Ce qui veut donc dire que l&#8217;on a 22 013 travailleurs qui n&#8217;ont eu qu&#8217;un seul employeur durant les 15 ans de notre analyse, et dont ils ont été l&#8217;unique employé. On peut imaginer que pour beaucoup d&#8217;entre eux, il s&#8217;agit de personnes qui, au lieu de choisir un statut d&#8217;indépendant, ont préféré créer leur propre société pour s&#8217;y engager. Ceci pourrait être confirmé en croisant ces données avec celles de la <a href="https://economie.fgov.be/fr/themes/entreprises/banque-carrefour-des">Banque Carrefour des Entreprises</a>, organisme officiel auprès duquel doivent s&#8217;inscrire toutes les entreprises (y compris ceux qui ne sont pas des employeurs, comme les indépendants, les professions libérales&#8230;), et y préciser le noms des fondateurs, gérants ou administrateurs.</p>
<p style="text-align: justify;">On trouve également 4 300 partitions de taille 3 (deux employeurs et un travailleur, ou un employeur et deux travailleurs) et un peu plus de 1 100 partitions de taille 4.</p>
<p style="text-align: justify;">Restent ensuite un peu moins de 800 partitions de taille variant entre 5 et 61.</p>
<p style="text-align: justify;">Nous pouvons identifier quelques &#8220;patterns&#8221; :</p>
<ul style="text-align: justify;">
<li><strong>&#8220;Schéma en étoile&#8221;</strong> : un seul travailleur, et de 3 (121 fois) à 6 (3 fois) sociétés. Notons que l&#8217;on trouve aussi ce schéma dans la composante connexe géante : nous avons ainsi 25 travailleurs ayant été le seul travailleur de plus de 10 entreprises sur les 15 dernières années (mais ces travailleurs ont été également engagés par d&#8217;autres employeurs).<br />
<span class="collapseomatic " id="id6a315b63e87b4"  tabindex="0" title="Requête Cypher"    >Requête Cypher</span><div id="target-id6a315b63e87b4" class="collapseomatic_content "><code>MATCH (n1:Company)--(p:People) </code><br />
<code>WHERE size((n1)--()) = 1 </code><br />
<code>WITH p, COUNT(DISTINCT n1) as nb_comp WHERE nb_comp &gt;= 10 </code><br />
<code>RETURN p, nb_comp </code><br />
<code>ORDER BY nb_comp DESC </code><br />
<code>LIMIT 100</code><br />
</div>Nous voyons principalement deux explications à ces étoiles :</p>
<ul style="list-style-type: circle;">
<li>&#8220;<strong>Faux indépendants</strong>&#8221; : schéma similaire à celui décrit plus haut, si ce n&#8217;est que la personne a ici choisi de créer plusieurs sociétés, sans jamais engager d&#8217;autre personnes qu&#8217;elle-même (et sans jamais, sur la période considérée, avoir travaillé pour un autre employeur).</li>
<li><strong>&#8220;Salarié partagé&#8221; : </strong>l&#8217;observation d&#8217;un certain nombre de ces cas montre également des groupes d&#8217;entreprises dont l&#8217;essentiel de l&#8217;activité est basée sur des personnes non-salariées et qui se partagent un salarié pour accomplir des tâches administratives. On trouve ainsi beaucoup de fabriques d&#8217;églises, ou des syndics de copropriétés, mais également des sociétés créées par des indépendants, non par pour s&#8217;y engager eux-mêmes, mais pour y engager une personne à temps partiel.</li>
</ul>
</li>
</ul>
<ul style="text-align: justify;">
<li><strong>&#8220;Entreprise étrangère temporaire&#8221;</strong> : Une série importante de &#8220;clusters&#8221; nous faisant penser à un groupe de travailleurs étrangers, venus en Belgique pour créer une société, puis repartir peu de temps après. Le fait qu&#8217;il s&#8217;agisse de travailleurs &#8220;temporaires&#8221; explique qu&#8217;ils n&#8217;aient pas d&#8217;autres relations dans Dimona, leur historique de travail s&#8217;étant déroulé à l&#8217;étranger. Quelques éléments en attestent. On trouve :
<ul>
<li>Des schémas avec essentiellement des travailleurs étrangers : plus de 2000 clusters sans aucun travailleur ayant la nationalité belge,</li>
<li>620 clusters avec aucun travailleur ayant un numéro NISS, mais uniquement un numéro BIS. Il s&#8217;agit donc de travailleurs temporaires. (cf <a href="/le-marche-du-travail-salarie-en-belgique-une-analyse-reseau-partie-1/#NISS_BIS">explications dans notre premier article</a>)</li>
<li>224 clusters où il s&#8217;est écoulé moins d&#8217;un an entre le premier engagement et la fin du dernier contrat. Pour 320 cas, il y a eu moins de deux ans.</li>
</ul>
</li>
<li><strong>&#8220;Travailleurs très fidèles&#8221;</strong> : Une quarantaine de cas d&#8217;entreprises avec entre 5 et 9 travailleurs, presque tous avec un numéro NISS. Nous sommes donc dans le cas d&#8217;entreprise avec un personnel très fidèle : sur 15 ans, aucun des travailleurs n&#8217;a eu d&#8217;autre employeur que celui-là.</li>
</ul>
<h1 style="text-align: justify;">Fidélité</h1>
<p style="text-align: justify;">Une partie des composantes connexes nous donnent des exemples d&#8217;entreprises avec un personnel très fidèle. Une autre façon de le calculer est de recherche des entreprises où il y a une longue période durant lequel tout le personnel qui a un jour été présent a travaillé simultanément. Autrement dit, entre l&#8217;engagement le plus tardif et le premier départ, il s&#8217;est écoulé une longue période.</p>
<p style="text-align: justify;">On trouve par exemple 103 entreprises d&#8217;au moins 5 travailleurs où ce délai est de 10 ans, et 353 entreprises où ce délai est de 5 ans.</p>
<p style="text-align: justify;"><span class="collapseomatic " id="id6a315b63e87d9"  tabindex="0" title="Requête Cypher"    >Requête Cypher</span><div id="target-id6a315b63e87d9" class="collapseomatic_content ">
<p style="text-align: justify;"><code>MATCH (n:Company)-[r]-()</code><br />
<code>WHERE size( (n)--())&gt;=5</code><br />
<code>WITH n, MIN(toInteger(r.DAYS_SINCE_START)) - MAX(toInteger(r.DAYS_SINCE_END)) AS delay</code><br />
<code>WHERE delay&gt; 3650 </code><br />
<code>RETURN count(n)</code></p>
<p style="text-align: justify;"></div>
<h1 style="text-align: justify;">2. Détection de Communautés</h1>
<p style="text-align: justify;">En général, quand on observe un réseau, on constate qu&#8217;il n&#8217;est pas &#8220;uniforme&#8221; : il y a des &#8220;zones&#8221; plus denses, avec beaucoup de connexions entre les nœuds de ces zones, et il y a moins de connexions entre deux nœuds faisant partie de &#8220;zones&#8221; distinctes. Dans la terminologie de la théorie des graphes, on parle de &#8220;communautés&#8221;. Typiquement, si on regarde le réseau constitué de l&#8217;ensemble des connaissances d&#8217;une personne, où un lien entre deux personnes indiquent qu&#8217;elles se connaissent, on observera en général une série de communautés, correspondant à des groupes de la vie réelle par rapport à la personne dont on analyse le réseau : les membres de famille, les collègues, les camarades de classe &#8230; Plus de détails <a href="/ce-quun-reseau-social-peut-nous-apprendre/">peuvent être trouvés dans ce blog</a>.</p>
<p style="text-align: justify;">Nous avons appliqué un algorithme de détection de communautés (<a href="https://en.wikipedia.org/wiki/Label_Propagation_Algorithm">méthode par propagation de labels</a>) sur notre graphe, et avons regardé dans quelle mesure on pouvait caractériser les différentes communautés. Pour ce faire, nous avons examiné deux caractéristiques de chaque entreprise (la province de son siège social et son ou <a href="/le-marche-du-travail-salarie-en-belgique-une-analyse-reseau-partie-1/">ses code(s) NACE</a>), pour comparer la distribution de ces données au sein d&#8217;une communauté par rapport à la distribution pour l&#8217;ensemble de la population.</p>
<p style="text-align: justify;">Nous constatons que la plupart des communautés détectées par l&#8217;algorithme ont un &#8220;comportement&#8221; assez éloigné de la moyenne nationale. Ce qui veut dire que les travailleurs, lorsqu&#8217;ils changent de travail, ont tendance à changer soit pour un employeur localisé dans la même province, soit travaillant dans le même secteur. Ce n&#8217;est en soi pas une découverte surprenante, mais l&#8217;analyse réseau permet de le formaliser.</p>
<figure id="attachment_11693" aria-describedby="caption-attachment-11693" style="width: 688px" class="wp-caption alignleft"><a href="/wp-content/uploads/2018/05/com_1.jpg"><img loading="lazy" decoding="async" class="wp-image-11693 size-large" src="/wp-content/uploads/2018/05/com_1-1024x535.jpg" alt="" width="688" height="359" srcset="https://staging.smalsresearch.be/wp-content/uploads/2018/05/com_1-1024x535.jpg 1024w, https://staging.smalsresearch.be/wp-content/uploads/2018/05/com_1-1536x803.jpg 1536w, https://staging.smalsresearch.be/wp-content/uploads/2018/05/com_1-300x157.jpg 300w, https://staging.smalsresearch.be/wp-content/uploads/2018/05/com_1-768x401.jpg 768w, https://staging.smalsresearch.be/wp-content/uploads/2018/05/com_1.jpg 1577w" sizes="auto, (max-width: 688px) 100vw, 688px" /></a><figcaption id="caption-attachment-11693" class="wp-caption-text">Première communauté détectée par l&#8217;algorithme de &#8220;Label propagation&#8221;. Les colonnes bleues indiquent la proportion d&#8217;entreprise localisée dans la province de la colonne en Belgique, les colonnes orange cette même proportion dans la communauté représentée.</figcaption></figure>
<p style="text-align: justify;">Les données des 100 plus grosses communautés <a href="/wp-content/uploads/2018/05/communities.pdf" target="_blank" rel="noopener">sont visibles dans ce document.</a> On peut par exemple y voir que la plus grande communauté détectée (54.000 employeurs, 750.000 travailleurs) est composée très largement d&#8217;entreprises localisées en Flandre Occidentale. En effet, comme le montre le graphique ci-dessus, alors que 10% des entreprises en Belgique sont localisées dans cette province (colonne bleue), 71% des entreprises de la communauté concernées y sont. Dans le même ordre d&#8217;idées, la troisième communauté comprend trois fois plus d&#8217;entreprises de l&#8217;<a href="https://fr.wikipedia.org/wiki/Horeca">Horeca</a> (Hotels, restaurants, cafés) que la moyenne nationale.</p>
<p style="text-align: justify;">La 8<sup>ème</sup> communauté, représentée ci-dessous, combine deux aspects : les 580 entreprises qui la composent sont quasi exclusivement localisée en Wallonie et à Bruxelles (soit les deux régions de Belgique où l&#8217;on parle majoritairement français), et travaillent dans le secteur de l&#8217;enseignement.</p>
<h1 style="text-align: justify;"><a href="/wp-content/uploads/2018/05/com_8.jpg"><img loading="lazy" decoding="async" class="alignleft size-large wp-image-11694" src="/wp-content/uploads/2018/05/com_8-969x1024.jpg" alt="" width="688" height="727" srcset="https://staging.smalsresearch.be/wp-content/uploads/2018/05/com_8-969x1024.jpg 969w, https://staging.smalsresearch.be/wp-content/uploads/2018/05/com_8-284x300.jpg 284w, https://staging.smalsresearch.be/wp-content/uploads/2018/05/com_8-768x812.jpg 768w, https://staging.smalsresearch.be/wp-content/uploads/2018/05/com_8.jpg 1059w" sizes="auto, (max-width: 688px) 100vw, 688px" /></a>La suite&#8230;</h1>
<p style="text-align: justify;">Dans le troisième blog de cette série, nous examinerons deux notions : celle d&#8217;homophilie, et celle de projection. La première nous permettra de voir à quel point les travailleurs changent de région de travail ou de domaine d&#8217;activité. La seconde permettra de calculer un certaine forme de proximité entre deux travailleurs, au travers du nombre d&#8217;employeurs qu&#8217;ils ont eu en commun.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://staging.smalsresearch.be/le-marche-du-travail-salarie-en-belgique-une-analyse-reseau-partie-2-3/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Le marché du travail salarié en Belgique : une analyse réseau (partie 1/3)</title>
		<link>https://staging.smalsresearch.be/le-marche-du-travail-salarie-en-belgique-une-analyse-reseau-partie-1/</link>
					<comments>https://staging.smalsresearch.be/le-marche-du-travail-salarie-en-belgique-une-analyse-reseau-partie-1/#respond</comments>
		
		<dc:creator><![CDATA[Vandy Berten]]></dc:creator>
		<pubDate>Wed, 30 May 2018 12:26:29 +0000</pubDate>
				<category><![CDATA[[FR]]]></category>
		<category><![CDATA[Blog post]]></category>
		<category><![CDATA[big data]]></category>
		<category><![CDATA[egov]]></category>
		<category><![CDATA[Graph Databases]]></category>
		<category><![CDATA[Network Analytics]]></category>
		<guid isPermaLink="false">/?p=11561</guid>

					<description><![CDATA[Le marché du travail nécessite partout une attention constante de la part des autorités. Cette attention ne peut se faire qu&#8217;en ayant une connaissance descriptive approfondie du secteur, raison pour laquelle de nombreuses analyses statistiques sont faites en permanence dans ce domaine (ONSS, Statbel, SPF Emploi, Actiris&#8230;). Si ces analyses sont incontournables, nous avons montré [&#8230;]]]></description>
										<content:encoded><![CDATA[<p style="text-align: justify;">Le marché du travail nécessite partout une attention constante de la part des autorités. Cette attention ne peut se faire qu&#8217;en ayant une connaissance descriptive approfondie du secteur, raison pour laquelle de nombreuses analyses statistiques sont faites en permanence dans ce domaine (<a href="https://www.rsz.fgov.be/fr/statistiques/statistiques-en-ligne">ONSS</a>, <a href="https://statbel.fgov.be/fr">Statbel</a>, <a href="https://emploi.belgique.be/fr">SPF Emploi</a>, <a href="https://www.actiris.be/marchemp/tabid/211/language/fr-BE/Statistiques-sur-le-marche-du-travail-bruxellois.aspx">Actiris</a>&#8230;). Si ces analyses sont incontournables, nous avons montré dans nos précédents blogs [à propos de Facebook : <a href="/ce-quun-reseau-social-peut-nous-apprendre/">1</a>, <a href="/facebook-peut-on-vraiment-cacher-sa-liste-damis/">2</a>, à propos de la lutte contre fraude : <a href="/un-fraudeur-ne-fraude-jamais-seul/">3</a>, <a href="/un-fraudeur-ne-fraude-jamais-seul-partie-2/">4</a>] à quel point un type particulier d&#8217;analyse &#8211; l&#8217;analyse réseau &#8211; pouvait apporter un nouvel éclairage particulièrement intéressant. Dans une série de trois articles, nous allons montrer toute la puissance offerte par l&#8217;analyse des réseaux, en symbiose avec les bases de données orientées graphes, dans une large gammes d&#8217;observations, qui se veulent complémentaires des analyses statistiques classiques.</p>
<p style="text-align: justify;">Dans notre travail au quotidien pour notre principal partenaire, l&#8217;<a href="https://www.onss.fgov.be/">Office National de la Sécurité Sociale</a> belge, nous sommes amenés à traiter un certain nombre de bases de données, dont celle de <a href="https://www.socialsecurity.be/site_fr/employer/applics/dimona/general/about.htm">Dimona (<strong>D</strong>éclaration <strong>Im</strong>médiate/<strong>On</strong>middellijke <strong>A</strong>angifte)</a>, application auprès de laquelle chaque employeur (y compris les administrations) en Belgique doit déclarer, au plus tard le jour de son engagement, quel salarié il compte employer, pour quelle période et pour quel type de travail. Il s&#8217;agit donc des travailleurs salariés et pas des indépendants.</p>
<p style="text-align: justify;">Ce type de données se prête particulièrement bien à une modélisation de réseau : nous avons deux types de nœuds ou entités (travailleurs et employeurs), et des relations entre ces nœuds, correspondant aux déclarations. Dans le cas présent, une relation connectera toujours un travailleur et un employeur (et jamais deux travailleurs ou deux employeurs) : on parlera donc d&#8217;un <a href="https://fr.wikipedia.org/wiki/Graphe_biparti">réseau (ou graphe) biparti</a>.</p>
<p style="text-align: justify;"><strong>Disclaimer </strong>: il s&#8217;agit ici d&#8217;un exemple d&#8217;analyse rapide menée par un &#8220;data scientist&#8221;, spécialiste de l&#8217;analyse réseau, et pas d&#8217;un spécialiste du monde du travail ou de l&#8217;économie. Il ne s&#8217;agit en rien d&#8217;une analyse menée par ou pour l&#8217;ONSS.</p>
<h1 style="text-align: justify;">Données et modèle</h1>
<p style="text-align: justify;">Pour les besoins de notre analyse, nous avons créé un modèle (anonymisé et simplifié) d&#8217;une partie de la base de données de Dimona dans une base de données orientée graphe (<a href="/graph-db-vs-rdbms/">Neo4j</a>). Les requêtes &#8220;Cypher&#8221;, langage d&#8217;interrogation de Neo4j, seront visibles optionnellement en cliquant sur les liens adéquats (<span class="expandall">cliquer ici pour tout ouvrir</span>).</p>
<p style="text-align: justify;">La base de données de production de Dimona est une base de données Oracle, comportant principalement trois tables : une décrivant les employeurs, une décrivant les travailleurs, et une pour les déclarations, correspondant à la relation entre un employeur et un travailleur. Sont également inclus les contrats d&#8217;intérim. Les deux premières tables nous permettront de créer les entités, la dernière les relations.</p>
<p style="text-align: justify;">Pour les employeurs, nous gardons la province de son siège social, ainsi que son <a href="https://statbel.fgov.be/fr/propos-de-statbel/methodologie/classifications/nace-bel-2008">code NACEBEL de premier niveau, </a>lettre entre A et U décrivant le code d&#8217;activité principale de la société. Cette liste est donnée dans la table ci-dessous, chaque société peut en avoir un ou plusieurs.</p>
<p style="text-align: justify;"><span class="collapseomatic " id="id6a315b63eb299"  tabindex="0" title="Liste des codes NACEBEL"    >Liste des codes NACEBEL</span><div id="target-id6a315b63eb299" class="collapseomatic_content ">
<table style="height: 768px; font-size: 10px;" width="383">
<tbody>
<tr>
<td style="width: 42.7273px;">A</td>
<td style="width: 620.909px;">Agriculture, sylviculture et pêche</td>
</tr>
<tr>
<td style="width: 42.7273px;">B</td>
<td style="width: 620.909px;">Industries extractives</td>
</tr>
<tr>
<td style="width: 42.7273px;">C</td>
<td style="width: 620.909px;">Industrie manufacturière</td>
</tr>
<tr>
<td style="width: 42.7273px;">D</td>
<td style="width: 620.909px;">Production et distribution d&#8217;électricité, de gaz, de vapeur et d&#8217;air conditionné</td>
</tr>
<tr>
<td style="width: 42.7273px;">E</td>
<td style="width: 620.909px;">Production et distribution d&#8217;eau; assainissement, gestion des déchets et dépollution</td>
</tr>
<tr>
<td style="width: 42.7273px;">F</td>
<td style="width: 620.909px;">Construction</td>
</tr>
<tr>
<td style="width: 42.7273px;">G</td>
<td style="width: 620.909px;">Commerce; réparation de véhicules automobiles et de motocycles</td>
</tr>
<tr>
<td style="width: 42.7273px;">H</td>
<td style="width: 620.909px;">Transports et entreposage</td>
</tr>
<tr>
<td style="width: 42.7273px;">I</td>
<td style="width: 620.909px;">Hébergement et restauration</td>
</tr>
<tr>
<td style="width: 42.7273px;">J</td>
<td style="width: 620.909px;">Information et communication</td>
</tr>
<tr>
<td style="width: 42.7273px;">K</td>
<td style="width: 620.909px;">Activités financières et d&#8217;assurance</td>
</tr>
<tr>
<td style="width: 42.7273px;">L</td>
<td style="width: 620.909px;">Activités immobilières</td>
</tr>
<tr>
<td style="width: 42.7273px;">M</td>
<td style="width: 620.909px;">Activités spécialisées, scientifiques et techniques</td>
</tr>
<tr>
<td style="width: 42.7273px;">N</td>
<td style="width: 620.909px;">Activités de services administratifs et de soutien</td>
</tr>
<tr>
<td style="width: 42.7273px;">O</td>
<td style="width: 620.909px;">Administration publique</td>
</tr>
<tr>
<td style="width: 42.7273px;">P</td>
<td style="width: 620.909px;">Enseignement</td>
</tr>
<tr>
<td style="width: 42.7273px;">Q</td>
<td style="width: 620.909px;">Santé humaine et action sociale</td>
</tr>
<tr>
<td style="width: 42.7273px;">R</td>
<td style="width: 620.909px;">Arts, spectacles et activités récréatives</td>
</tr>
<tr>
<td style="width: 42.7273px;">S</td>
<td style="width: 620.909px;">Autres activités de services</td>
</tr>
<tr>
<td style="width: 42.7273px;">T</td>
<td style="width: 620.909px;">Activités des ménages en tant qu&#8217;employeurs; activités indifférenciées des ménages en tant que producteurs de biens et services pour usage propre</td>
</tr>
<tr>
<td style="width: 42.7273px;">U</td>
<td style="width: 620.909px;">Activités extra-territoriales</td>
</tr>
</tbody>
</table>
<p style="text-align: justify;"></div>
<p style="text-align: justify;"><a id="NISS_BIS"></a>Pour les travailleurs, nous utiliserons principalement la nationalité, et la nature du numéro national : chaque citoyen a besoin, pour pouvoir travailler en Belgique, d&#8217;un numéro d&#8217;identification de la sécurité sociale (NISS), parfois appelé &#8220;<a href="https://fr.wikipedia.org/wiki/Num%C3%A9ro_de_registre_national">numéro national</a>&#8220;. Lorsqu&#8217;un travailleur étranger arrive en Belgique, il se voit attribuer un numéro temporaire (numéro BIS), jusqu&#8217;à ce que sa situation soit considérée comme permanente (il reçoit alors le cas échéant un numéro NISS comme chaque citoyen Belge).</p>
<p style="text-align: justify;">Concernant les relations, nous considérons les dates de début et, si elle est définie, de fin. Les déclarations concernant des contrats à durée indéterminée, tant qu&#8217;ils ne sont pas terminés, n&#8217;ont pas de fin renseignée dans Dimona. Nous gardons également  un &#8220;worker code&#8221;, code donné par l&#8217;administration indiquant un certain nombre de catégories. En voici quelques exemples :</p>
<ul style="text-align: justify;">
<li>STU : travailleurs étudiants</li>
<li>BCW : travailleurs du secteur de la construction (Build &amp; Construction Workers)</li>
<li>EXT : travailleurs occasionnels</li>
<li>IVT : travailleurs en formation (Individual vocational training)</li>
<li>OTH : autres</li>
</ul>
<p style="text-align: justify;">Nous avons considéré les relations de 2003 à 2017, ce qui nous fait une période de 15 ans. Nous avons donc ignoré les déclarations avec une date de fin d&#8217;activité antérieure au 1er janvier 2003, ou une date de début supérieure au 31 décembre 2017. Nous avons donc des relations ayant commencé avant 2003, mais ayant une date de fin après début 2003, ou pas de date de fin. Remarquons que la déclaration Dimona ne précise pas le régime de travail (temps plein ou temps partiel).</p>
<p style="text-align: justify;">Pour les contrats d&#8217;intérim, on considère dans le modèle que l&#8217;employeur est la société où s&#8217;effectue le travail, et pas l&#8217;agence d&#8217;intérim.</p>
<p style="text-align: justify;">Dans l&#8217;image ci-dessous, on considère un travailleur A, de nationalité française, ayant travaillé, comme apprenti (Worker code: IVT), auprès de l&#8217;entreprise B, de 2015 à 2017. <a href="/wp-content/uploads/2018/04/Dimona.png"><img loading="lazy" decoding="async" class="alignleft size-full wp-image-11593" src="/wp-content/uploads/2018/04/Dimona.png" alt="" width="428" height="316" srcset="https://staging.smalsresearch.be/wp-content/uploads/2018/04/Dimona.png 428w, https://staging.smalsresearch.be/wp-content/uploads/2018/04/Dimona-300x221.png 300w" sizes="auto, (max-width: 428px) 100vw, 428px" /></a>Il y a été collègue avec C, Belge, qui y a d&#8217;abord travaillé les 3 premiers mois de 2015 comme étudiant, puis jusqu&#8217;à fin 2016 avec un contrat normal, avant de changer d&#8217;employeur pour aller travailler dès début 2017 auprès de D. B est une société ICT (NACE: J), et D un société commerciale (NACE: G).</p>
<h1 style="text-align: justify;">Comptage</h1>
<p style="text-align: justify;">Une première analyse simple que l&#8217;on peut faire sur le graphe (ou réseau) décrit ci-dessus consiste à compter les nœuds qui le compose. On peut dans un premier temps compter les nœuds, en distinguant bien sûr les nœuds &#8220;Travailleurs&#8221; des nœuds &#8220;Employeurs&#8221;. On trouve, dans Dimona :</p>
<ul style="text-align: justify;">
<li>7 828 000 travailleurs</li>
<li>645 634 employeurs</li>
</ul>
<p style="text-align: justify;"><span class="collapseomatic " id="id6a315b63eb2d5"  tabindex="0" title="Requêtes Cypher"    >Requêtes Cypher</span><div id="target-id6a315b63eb2d5" class="collapseomatic_content ">
<p style="text-align: justify;">Nombre de travailleurs :</p>
<p style="text-align: justify;"><code>MATCH (n:People)</code><br />
<code>RETURN COUNT(n)</code></p>
<p style="text-align: justify;">Nombre de sociétés/employeurs :</p>
<p style="text-align: justify;"><code>MATCH (n:Company)</code><br />
<code>RETURN COUNT(n)</code></p>
<p style="text-align: justify;"></div>
<p style="text-align: justify;">Ce comptage reprend cependant la totalité des travailleurs et employeurs présent dans Dimona, même s&#8217;ils n&#8217;ont jamais travaillé ou engagé, ou s&#8217;ils ne l&#8217;ont plus fait depuis le début de la période que l&#8217;on considère (2003-2017). On peut s&#8217;intéresser au nombre de nœuds ayant ou moins une relation (c&#8217;est-à-dire les nœuds avec un degré supérieur ou égal à un, le degré d&#8217;un nœud désignant le nombre de relations auxquelles il est connecté), ce qui correspond aux travailleurs ayant eu un emploi durant la période, peu importe sa durée, ou aux employeurs ayant engagé du personnel :</p>
<ul style="text-align: justify;">
<li>7 604 515 travailleurs</li>
<li>611 646 employeurs</li>
</ul>
<p style="text-align: justify;"><span class="collapseomatic " id="id6a315b63eb2fa"  tabindex="0" title="Requêtes Cypher"    >Requêtes Cypher</span><div id="target-id6a315b63eb2fa" class="collapseomatic_content ">
<p style="text-align: justify;">Nombre de travailleurs avec au moins une relation :</p>
<p style="text-align: justify;"><code>MATCH (n:People)--()</code><br />
<code>RETURN COUNT(DISTINCT n)</code></p>
<p style="text-align: justify;">Nombre de sociétés/employeurs avec au moins une relation :</p>
<p style="text-align: justify;"><code>MATCH (n:Company)--()</code><br />
<code>RETURN COUNT(DISTINCT n)</code></p>
<p style="text-align: justify;"></div>
<p style="text-align: justify;">Comme expliqué plus haut, les relations ont un certain nombre d&#8217;attributs, dont les dates de début et de fin. On peut donc aisément compter les travailleurs ayant eu (au moins) un employeur durant un période déterminée [a, b]. Ils doivent donc avoir une relation dont :</p>
<ul style="text-align: justify;">
<li>la date de début est inférieure ou égale à &#8216;b&#8217; ;</li>
<li>la date de fin est supérieure ou égale à &#8216;a&#8217; ou bien nulle (pour les contrats à durée indéterminée).</li>
</ul>
<p style="text-align: justify;">Nous comptons alors :</p>
<ul style="text-align: justify;">
<li>4 918 234 employés pour l&#8217;année 2017 (même pour un jour) ;</li>
<li>4 334 252 employés durant le mois de décembre 2017 ;</li>
<li>4 276 094 employés au 1<sup>er</sup> décembre 2017.</li>
</ul>
<p style="text-align: justify;"><span class="collapseomatic " id="id6a315b63eb31b"  tabindex="0" title="Requêtes Cypher"    >Requêtes Cypher</span><div id="target-id6a315b63eb31b" class="collapseomatic_content ">
<p style="text-align: justify;"><code>MATCH (n:People)-[r]-()</code><br />
<code>WHERE r.START &lt;= $end_period AND (r.END IS NULL or r.END &gt;= $start_period)</code><br />
<code>return count(DISTINCT n) as nb_people</code></p>
<p style="text-align: justify;"></div>
<p style="text-align: justify;">Ce comptage peut être fait mois par mois, et donner le graphique suivant :</p>
<p style="text-align: justify;"><a href="/wp-content/uploads/2018/04/Nb_workers_lim0.png"><img loading="lazy" decoding="async" class="alignleft wp-image-11573 size-full" src="/wp-content/uploads/2018/04/Nb_workers.png" alt="" width="864" height="576" srcset="https://staging.smalsresearch.be/wp-content/uploads/2018/04/Nb_workers.png 900w, https://staging.smalsresearch.be/wp-content/uploads/2018/04/Nb_workers-300x200.png 300w, https://staging.smalsresearch.be/wp-content/uploads/2018/04/Nb_workers-768x512.png 768w" sizes="auto, (max-width: 864px) 100vw, 864px" /></a></p>
<p style="text-align: justify;">Remarquez que le graphique n&#8217;a pas &#8220;0 travailleurs&#8221; comme base : cela permet de mieux observer la variabilité, mais peut quelque peu tromper l&#8217;impression de croissance. Le nombre de travailleurs est passé de 3.46 millions (janvier 2003), à 4.33 millions (décembre 2017), soit une progression de 25 %. En cliquant sur le graphique, vous obtiendrez une version démarrant à 0.</p>
<p style="text-align: justify;">On constatera l&#8217;aspect périodique du tracé, avec un pic à chaque mois d&#8217;août. On peut, en décomposant les travailleurs en fonction du &#8220;worker code&#8221; de leur relations, obtenir le graphique suivant, qui montre que l&#8217;essentiel de la périodicité est imputable jobs étudiants (worker code STU), massivement disponibles en juillet et août, nettement moins durant le reste de l&#8217;année. La croissance globale est, elle, due à la croissante des relations &#8220;OTH&#8221;, largement majoritaires. On observe également une périodicité dans les emplois occasionnels (&#8220;EXT&#8221;), beaucoup exploités dans le tourisme, ou dans la collecte des fruits, deux secteurs plus actifs en été.</p>
<p style="text-align: justify;"><a href="/wp-content/uploads/2018/04/Nb_workers_wcode.png"><img loading="lazy" decoding="async" class="alignleft size-full wp-image-11597" src="/wp-content/uploads/2018/04/Nb_workers_wcode.png" alt="" width="1500" height="900" /></a></p>
<p style="text-align: justify;">Notons qu&#8217;il s&#8217;agit du nombre de personnes ayant travaillé chaque mois : rien ne dit qu&#8217;ils ont travaillé tout le mois. Il se peut que le temps de travail global ait diminué, mais qu&#8217;il ait été réparti sur plus de travailleurs.</p>
<h1 style="text-align: justify;">Degré</h1>
<p style="text-align: justify;">Dans un graphe, le degré d&#8217;un nœud est défini comme étant le nombre de relations liées à ce nœud. Une variante consiste à considérer le nombre de voisins au lieu du nombre de relations, ce qui peut différer s&#8217;il peut exister plusieurs arcs entre deux nœuds, typiquement parce qu&#8217;un travailleur, pour la même société, a travaillé avec plusieurs type de contrats différents. On parle alors de multi-graphe.</p>
<p style="text-align: justify;">On va considérer ci-dessous cette seconde définition : le degré d&#8217;un travailleur indique donc le nombre de ses employeurs, et le degré d&#8217;un employeur indique le nombre de ses travailleurs.</p>
<h2 style="text-align: justify;">Les employeurs</h2>
<p style="text-align: justify;">Si l&#8217;on regarde le nombre d&#8217;employés par employeur, on observe les éléments suivants :</p>
<ul style="text-align: justify;">
<li>136 868 entreprises ont eu, sur les 15 années considérées, uniquement un salarié. Dans de nombreux cas, il s&#8217;agit probablement d&#8217;indépendants ayant créé leur propre entreprise pour s&#8217;y engager, pour des raisons d&#8217;optimisation fiscale.</li>
<li>382 728 employeurs ont eu 10 travailleurs ou moins.</li>
<li>3 employeurs ont eu plus de 100 000 travailleurs (il s&#8217;agit de deux ministères et d&#8217;une grande chaîne de supermarchés).</li>
<li>96 employeurs ont eu plus de 10 000 travailleurs, 1 721 plus de 1 000 travailleurs.</li>
<li>En moyenne, les employeurs actifs sur la période ont (eu) 33.56 travailleurs ; 50 % des entreprises ont (eu) 5 travailleurs ou moins (médiane).</li>
</ul>
<p style="text-align: justify;">Notons qu&#8217;il s&#8217;agit du nombre total : on ne fait donc pas la différence entre une petite entreprise avec un très grand <em>turn-over</em> et une grande entreprise avec des salariés très fidèles.</p>
<h2 style="text-align: justify;">Les travailleurs</h2>
<p style="text-align: justify;">Si l&#8217;on regarde au contraire, le nombre d&#8217;employeurs par employé, et en excluant les contrats d&#8217;intérim, on observe que 3 123 405 travailleurs n&#8217;ont pas changé d&#8217;employeurs sur toute la période, soit 43 % de tous les travailleurs actifs durant cette période, et  21 % ont changé une fois d&#8217;employeur. Plus de détails dans le graphique ci-dessous :</p>
<p style="text-align: justify;"><a href="/wp-content/uploads/2018/04/Nb_emp_per_wrk.png"><img loading="lazy" decoding="async" class="alignleft size-full wp-image-11577" src="/wp-content/uploads/2018/04/Nb_emp_per_wrk.png" alt="" width="1080" height="576" /></a></p>
<p style="text-align: justify;">À l&#8217;autre extrémité, toujours en excluant les contrats d&#8217;intérim, on observe un travailleur ayant eu &#8230; 110 employeurs ! 63 travailleurs ont eu 50 employeurs ou plus, 99% des travailleurs ont eu 11 employeurs ou moins.</p>
<p style="text-align: justify;"><span class="collapseomatic " id="id6a315b63eb344"  tabindex="0" title="Requête Cypher"    >Requête Cypher</span><div id="target-id6a315b63eb344" class="collapseomatic_content ">
<p style="text-align: justify;"><code>MATCH (p:People)--(c:Company)</code><br />
<code>WITH p, COUNT(DISTINCT c) AS nb_emp</code><br />
<code>WITH nb_emp, count(p) AS nb_pers</code><br />
<code>RETURN nb_emp, nb_pers </code><br />
<code>ORDER BY nb_emp ASC</code></p>
<p style="text-align: justify;"></div>
<p style="text-align: justify;">En moyenne, sur les 15 années considérées, les travailleurs belges ont eu 2.59 employeurs différents. Une analyse par &#8220;worker code&#8221; (non détaillée ici) nous montre que certains secteurs (travail étudiant, travail occasionnel, construction&#8230;) génèrent plus de rotation, ce qui, dans certains cas, n&#8217;est pas surprenant.</p>
<h2 style="text-align: justify;">Cumul d&#8217;emplois</h2>
<p style="text-align: justify;">Si l&#8217;on fait le même décompte sur un seul jour, on aura une image du nombre de personnes cumulant plusieurs emplois simultanés : si l&#8217;on considère le 1<sup>er</sup> décembre 2017, 95.7% des travailleurs actifs à cette date n&#8217;ont qu&#8217;un seul employeur, 3.9 % en ont 2. On trouve encore quelques cas extrêmes : un travailleur a, à la date indiquée, 20 employeurs ; 67 en ont 10 ou plus.</p>
<p style="text-align: justify;">Notons que ces comportement extrêmes sont susceptibles d&#8217;intéresser les administrations : il peut bien sûr s&#8217;agit de travailleurs &#8220;hyperactifs&#8221; ; il se peut aussi que les données soient de mauvaise qualité, et qu&#8217;une série de fins de contrat n&#8217;aient pas été signalées par les employeurs (pour le cas des emplois simultanés). Mais il peut aussi s&#8217;agir de comportement frauduleux, lié à de l&#8217;emploi fictif.</p>
<p style="text-align: justify;"><span class="collapseomatic " id="id6a315b63eb366"  tabindex="0" title="Requête Cypher"    >Requête Cypher</span><div id="target-id6a315b63eb366" class="collapseomatic_content ">
<p style="text-align: justify;"><code>MATCH (p:People)-[r]-(c:Company)</code><br />
<code>WHERE r.START &lt;= $end_period AND (r.END IS NULL or r.END &gt;= $start_period)</code><br />
<code>WITH p, count(DISTINCT c) AS nb_emp</code><br />
<code>WITH nb_emp, count(p) AS nb_pers</code><br />
<code>RETURN nb_emp, nb_pers </code><br />
<code>ORDER BY nb_emp ASC</code></p>
<p style="text-align: justify;"></div>
<h1 style="text-align: justify;">La suite&#8230;</h1>
<p style="text-align: justify;">Dans les deux prochains blogs, nous continuerons notre analyse du réseau du marché du travail en Belgique. Nous verrons dans un premier temps que l&#8217;écrasante majorité des salariés en Belgique sont en fait &#8220;collègues de (ex-)collègues de (ex-)collègues&#8221;, formant ainsi ce que nous appellerons une composante connexe géante. Nous examinerons les travailleurs et employeurs qui ne font pas partie de la composante géante. Nous verrons également qu&#8217;il est possible de détecter des &#8220;communautés&#8221; dans le réseau, et qu&#8217;elles ne sont pas homogènes. Nous verrons également qu&#8217;en général, les travailleurs qui changent d&#8217;employeur restent dans la même région géographique, et dans le même secteur d&#8217;activité.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://staging.smalsresearch.be/le-marche-du-travail-salarie-en-belgique-une-analyse-reseau-partie-1/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Gérer les doublons dans une Graph Database</title>
		<link>https://staging.smalsresearch.be/gerer-les-doublons-dans-une-graph-database/</link>
					<comments>https://staging.smalsresearch.be/gerer-les-doublons-dans-une-graph-database/#respond</comments>
		
		<dc:creator><![CDATA[Vandy Berten]]></dc:creator>
		<pubDate>Tue, 19 Dec 2017 07:44:45 +0000</pubDate>
				<category><![CDATA[[FR]]]></category>
		<category><![CDATA[Blog post]]></category>
		<category><![CDATA[data quality]]></category>
		<category><![CDATA[Data Quality Tools]]></category>
		<category><![CDATA[egov]]></category>
		<category><![CDATA[Graph Databases]]></category>
		<category><![CDATA[Information management]]></category>
		<category><![CDATA[methodology]]></category>
		<category><![CDATA[Neo4j]]></category>
		<category><![CDATA[Network Analytics]]></category>
		<guid isPermaLink="false">/?p=11184</guid>

					<description><![CDATA[Dans nos blogs précédents (1, 2, 3, 4), nous avons mis en évidence le fait que les structures de graphes étaient très adaptées à la recherche de comportement frauduleux. En étant plongés quotidiennement dans des données issues de diverses bases de données officielles, nous sommes également confrontés en permanence à la présence d&#8217;une grande quantité [&#8230;]]]></description>
										<content:encoded><![CDATA[<p style="text-align: justify;">Dans nos blogs précédents (<a href="/un-fraudeur-ne-fraude-jamais-seul/">1</a>, <a href="/un-fraudeur-ne-fraude-jamais-seul-partie-2/">2</a>, <a href="/bases-de-donnees-relationnelles-adequates-pour-des-relations/">3</a>, <a href="/graph-db-vs-rdbms/">4</a>), nous avons mis en évidence le fait que les structures de graphes étaient très adaptées à la recherche de comportement frauduleux. En étant plongés quotidiennement dans des données issues de diverses bases de données officielles, nous sommes également confrontés en permanence à la présence d&#8217;une grande quantité d&#8217;information de mauvaise qualité (<a href="/dix-bonnes-pratiques-pour-ameliorer-et-maintenir-la-qualite-des-donnees/">1</a>, <a href="/ameliorer-la-qualite-de-linformation-du-stemma-codicum-au-data-tracking/">2</a>). Nous allons voir dans ce blog comment des recherches de fraudes peuvent être réalisées même si les données déclarées sont de mauvaise qualité.</p>
<p style="text-align: justify;">Certaines parties de cet article, plus techniques, seront masquées. Si les détails vous intéressent, il vous suffira de cliquer sur les liens « Cliquer ici pour plus de détails », ou de c<span class="expandall">liquer ici pour montrer toutes les parties d&#8217;un seul coup.</span></p>
<p style="text-align: justify;">Supposons qu&#8217;un organisme public soit responsable de la gestion de la sous-traitance entre entreprises, et que, chaque fois qu&#8217;une entreprise fait appel à un sous-traitant, elle doive le déclarer auprès de cet organisme. Les données issues de ces déclarations peuvent alors être vues comme un graphe, dans lequel un nœud représente une entreprise, et une relation entre deux nœuds A et B, le fait que B est un sous-traitant de A. Si A sous-traite auprès de B, et B auprès de C, on notera cela de la façon suivante (en s&#8217;inspirant de la notation de <a href="https://www.neo4j.org">Cypher, langage de Neo4j</a>) :</p>
<pre style="text-align: center;">(A)--&gt;(B)--&gt;(C)</pre>
<p style="text-align: justify;">Imaginons une loi (un peu simpliste et fantaisiste) disant qu&#8217;une entreprise ne peut pas être sa propre sous-traitante, ni directement, ni indirectement. Les structures suivantes seraient donc considérées comme « frauduleuses » :</p>
<pre style="text-align: center;">(A)--&gt;(A)
(A)--&gt;(B)--&gt;(C)--&gt;(A)</pre>
<p style="text-align: justify;">Du point de vue de la théorie des graphes, on veut en fait s’assurer qu’il n’y a pas de cycle dans le graphe de description des sous-traitances, graphe étant dirigé, puisque les arcs ont une direction. On parle dès lors de <a href="https://fr.wikipedia.org/wiki/Graphe_orient%C3%A9_acyclique">« Graphe Dirigé Acyclique » (DAG)</a>. Le schéma ci-dessous montre une structure acceptable, dans laquelle aucune entreprise n’est son propre sous-traitant, même indirectement.</p>
<p style="text-align: justify;"><a href="/wp-content/uploads/2017/11/DAG.png"><img loading="lazy" decoding="async" class="wp-image-11207 size-full aligncenter" src="/wp-content/uploads/2017/11/DAG.png" alt="" width="505" height="222" srcset="https://staging.smalsresearch.be/wp-content/uploads/2017/11/DAG.png 505w, https://staging.smalsresearch.be/wp-content/uploads/2017/11/DAG-300x132.png 300w" sizes="auto, (max-width: 505px) 100vw, 505px" /></a></p>
<p style="text-align: justify;">En Cypher (dont la syntaxe a été brièvement présentée dans <a href="/graph-db-vs-rdbms/">notre article précédent</a>), en supposant que les entreprises soient de type « Company », et les relations de type « Subcontractor », on pourra écrire la requête suivante, qui retournera une entreprise, et le cycle dont elle fait partie :</p>
<pre style="text-align: left;">(1)    MATCH p=(a:Company)-[:Subcontractor*]-&gt;(a)
       RETURN a, p</pre>
<p style="text-align: justify;">Pour des raisons de performances, il sera souvent préférable de limiter la longueur des cycles : (a:Company)-[:Subcontractor*..5]-&gt;(a).</p>
<h1 style="text-align: justify;">Qualité des données</h1>
<p style="text-align: justify;">Supposons maintenant que le système de déclaration ne soit pas très contraignant, et que, quand une entreprise déclare une sous-traitance, elle ne soit pas obligée de donner un identifiant officiel de l&#8217;entreprise en question (un numéro d&#8217;entreprise ou d&#8217;employeur attribué par l&#8217;état), mais puisse se contenter d&#8217;en donner le nom, et éventuellement l&#8217;adresse. On peut donc avoir une situation dans laquelle (A) déclare correctement sa sous-traitance vers (B) (c&#8217;est-à-dire avec un numéro d&#8217;entreprise officiel), idem pour (B) envers (C), mais par contre, (C) déclare sa sous-traitance vers (A) sans en préciser l&#8217;identifiant, mais uniquement le nom. On aura dans la base de données associée à la déclaration, deux nœuds, avec les attributs suivants :</p>
<ul style="text-align: justify;">
<li>(A) : ID : 12345, Nom : « Mon Entreprise SA »</li>
<li>(A&#8217;) : ID : &lt;vide&gt;, Nom : « Mon Entreprise SA »</li>
</ul>
<p style="text-align: justify;">L&#8217;organisme récoltant les données n&#8217;a ici aucun moyen de s&#8217;assurer que les entreprises (A) et (A&#8217;) sont en fait la même entreprise. Il existe des multitudes de synonymes d&#8217;entreprise. On trouve des « Coiffeur Rolland » dans bon nombre de villes, et les boulangeries « La baguette dorée » sont légion.</p>
<p style="text-align: justify;">La cycle ci-dessus devient alors une chaîne (non fermée) : (A)&#8211;&gt;(B)&#8211;&gt;(C)&#8211;&gt;(A&#8217;) , et la recherche évoquée plus haut ne permet plus de détecter le comportement frauduleux.</p>
<h1 style="text-align: justify;">L&#8217;approche classique</h1>
<p style="text-align: justify;">Une approche classique de ce problème consiste à utiliser des outils de « Data Quality » (comme l’outil open-source <a href="https://openrefine.org/">OpenRefine</a>, ou le logiciel commercial <a href="https://www.trilliumsoftware.com/">Trillium</a> aux fonctionnalités beaucoup plus avancées), pour, en fonction de critères définis, fusionner certains enregistrements de la base de données. On peut par exemple décider que si on trouve deux enregistrements avec exactement le même nom d’entreprise, se trouvant dans la même rue, on les fusionne en considérant qu’il s’agit de la même entreprise. On peut par ailleurs décider que si les deux noms sont similaires, mais ont la même adresse, alors on les fusionne également.</p>
<p style="text-align: justify;">Les outils, en particulier les suites professionnelles comme Trillium, permettent de définir finement le degré de proximité que l&#8217;on acceptera entre deux dénominations ou adresses (ou, plus généralement, toute information) pour les considérer comme « identiques » (on ne va pas uniquement considérer des chaînes de caractères exactement identiques). Par ailleurs, nous n&#8217;évoquons ici que la problématique de la détection de (présomption de) doublons : le domaine de la « Data Quality » s&#8217;intéresse à bien d&#8217;autres aspects : incohérence de données, comparaison entre différentes sources, profilage des données, standardisation&#8230;</p>
<p style="text-align: justify;">Notons qu’on va souvent effectuer cette fusion non pas dans les données de production, mais dans une copie servant à faire des analyses et des recherches de fraude.</p>
<p style="text-align: justify;">Mais cette approche, très efficace dans de nombreuses situations, a principalement deux limites :</p>
<ul style="text-align: justify;">
<li style="text-align: justify;">Elle permet de fusionner des informations tabulaires plates (une entreprise avec un nom, une adresse, éventuellement une catégorie d’entreprise, le nom du gérant, voire des dates de création ou autres événements), mais est plus complexe pour des structures plus élaborées. On s’en sort encore sans trop de dommages si on considère que chaque entreprise peut avoir plusieurs adresses (correspondant à plusieurs implantations, ou à l’historique du siège principal), mais si l’on veut considérer, en l’absence d’adresse, les travailleurs communs aux « deux » entreprises, ou les administrateurs (ou autres client, fournisseur…), cette approche relativement statique n’est plus tenable.</li>
<li style="text-align: justify;">Elle impose de choisir, avant l’analyse des données, les critères de fusion. Or il s’avère parfois utile de faire ce choix plus tard dans l’analyse, soit parce que, en fonction de l’analyse, on veut être plus ou moins stricte sur la façon de faire cette fusion, soit parce que, dans une analyse particulière, on veut identifier un schéma passant par plusieurs « chemin de duplicatas », n’ayant pas tous le même degré de certitude.</li>
</ul>
<p style="text-align: justify;">Nous proposons dès lors une approche qui combine à la fois les possibilités offertes par les bases de données orientées graphes (« Graph Databases ») et les outils de gestion de qualité de données (« Data Quality tools »).</p>
<h1 style="text-align: justify;">Une autre approche</h1>
<p style="text-align: justify;">L’approche que nous décrivons ici permet de traiter les doublons d’entreprises, mais une approche très similaire pourra être utile pour détecter les doublons de personnes, ou de toute autre entité.</p>
<p style="text-align: justify;">La première étape de notre approche consistera à identifier les entreprises dont le nom est identique, ou similaire (selon un niveau d&#8217;exigence que l&#8217;on peut définir). Dans cette première étape, on ne considère que le nom de l’entreprise, et pas les autres attributs (adresses, travailleurs…)</p>
<p style="text-align: justify;"><span class="collapseomatic " id="id6a315b63ee092"  tabindex="0" title="Cliquer ici pour plus de détails à propos de cette première étape."    >Cliquer ici pour plus de détails à propos de cette première étape.</span><div id="target-id6a315b63ee092" class="collapseomatic_content ">
<p style="text-align: justify;">Pour cette étape, l’utilisation d’un outil de « Data Quality » pourra s’avérer être un allié précieux. On peut cependant effectuer avec des outils classiques (R, Python avec Pandas…) de traitement de données une partie (basique) de ces opérations. Supposons deux enregistrements avec pour nom « Ma Société S.A. », et « MA SOCIETE ». Nous effectuons les opérations suivantes sur ces deux chaînes de caractères :</p>
<ul style="text-align: justify;">
<li style="text-align: justify;">Mettre tous les noms en majuscules : « MA SOCIÉTÉ S.A. » et « MA SOCIETE »</li>
<li style="text-align: justify;">Enlever tous les accents et autres signes diacritiques (cédilles, trémas…) : « MA SOCIETE S.A. » et « MA SOCIETE »</li>
<li style="text-align: justify;">Enlever les symboles non-alpha numériques : « MA SOCIETE SA » et « MA SOCIETE »</li>
<li style="text-align: justify;">Enlever les formes légales (SA, SARL, SPRL…) : « MA SOCIETE » et « MA SOCIETE »</li>
</ul>
<p style="text-align: justify;">Notons que pour cette dernière étape, il faudra être prudent : il est fréquent qu’une entreprise, pour diverses raisons, se sépare en plusieurs entités juridiquement distinctes, mais portant le même nom (mise à part éventuellement la forme légale rajoutée en suffixe). Pour certaines analyses, il est important de considérer qu’il s’agit bien de deux entreprises ; pour d’autres, en revanche, on préférera les traiter comme une même entité. Plutôt que de supprimer la forme légale, on peut préférer la déplacer dans un champ distinct.</p>
<p style="text-align: justify;">On peut aller encore un peu plus loin avec des approches plus « fuzzy », permettant d’accepter des fautes de frappe : « Ma Société » et « Ma Socéité » ne donneront pas la même version « nettoyée », mais sont néanmoins très proches. Avec des méthodes telles que les distances de <a href="https://fr.wikipedia.org/wiki/Distance_de_Levenshtein">Levenshtein</a> ou de <a href="https://fr.wikipedia.org/wiki/Distance_de_Jaro-Winkler">Jaro-Winkler</a>, souvent utilisées avec une méthode de regroupement comme le <a href="https://fr.wikipedia.org/wiki/Metaphone">Metaphone</a> ou le <a href="https://fr.wikipedia.org/wiki/Soundex">Soundex</a>. Nous ne donnerons pas plus de détails ici, mais un outil comme Trillium permet des stratégies bien plus élaborées que ce que nous décrivons ici.</p>
<p style="text-align: justify;"></div>
<p style="text-align: justify;">Après ces étapes de nettoyage, toutes les entreprises (ou plus précisément tous les enregistrements d’entreprise) dont le nom est considéré comme identique ou presque, seront regroupées (mais pas fusionnés). Dans notre base de données, on créera alors un nœud d’un nouveau type (nous avions déjà implicitement un type de nœud « Company »), que nous appellerons « Denomination_group »</p>
<p style="text-align: justify;"><a href="/wp-content/uploads/2017/11/Denomination_group.png"><img loading="lazy" decoding="async" class="wp-image-11210 size-full aligncenter" src="/wp-content/uploads/2017/11/Denomination_group.png" alt="" width="509" height="302" srcset="https://staging.smalsresearch.be/wp-content/uploads/2017/11/Denomination_group.png 509w, https://staging.smalsresearch.be/wp-content/uploads/2017/11/Denomination_group-300x178.png 300w" sizes="auto, (max-width: 509px) 100vw, 509px" /></a></p>
<h1 style="text-align: justify;">Gestion des adresses</h1>
<p style="text-align: justify;">En parallèle avec cette gestion de dénomination, il s’agira également de traiter les adresses dont on dispose pour une entreprise. Il peut s’agir d’une seule adresse, mais également de plusieurs adresses par entreprise, soit parce que celle-ci dispose de plusieurs sites, soit parce que l’on dispose de l’historique des adresses.</p>
<p style="text-align: justify;"><span class="collapseomatic " id="id6a315b63ee0d3"  tabindex="0" title="Cliquer ici pour plus de détails à propos de la qualité des adresses"    >Cliquer ici pour plus de détails à propos de la qualité des adresses</span><div id="target-id6a315b63ee0d3" class="collapseomatic_content ">
<p style="text-align: justify;">Un problème que l’on rencontre presque systématiquement quand des adresses sont collectées, en particulier lorsqu&#8217;elles viennent de pays différents, est leur absence de normalisation. Une même adresse pourra être écrite dans un enregistrement « Avenue Fonsny, 20, 1060 Saint-Gilles, Belgique », puis « Av. Fonsny, 20-22, 1060 Bruxelles, Belgique ». Nous avons par ailleurs en Belgique, et en particulier à Bruxelles, la difficulté supplémentaire que les adresses peuvent être écrites dans deux langues : « Fonsnylaan 20, 1060 Brussel ». Pour éviter de passer à côté d’un grand nombre d’erreurs, il est indispensable, pour effectuer ce nettoyage, de passer par un outil adapté (comme par exemple Trillium). Ces outils disposent de bases de connaissance permettant même de corriger des adresses erronément introduites, comme par exemple « Avenue Fonsny 20, 1160 Bruxelles » (au lieu de 1060).</p>
<p style="text-align: justify;"></div>
<p style="text-align: justify;">Une fois les adresses normalisées, on va considérer dans notre base de données un nœud par rue, et un lien (avec en attribut le numéro de la boite) entre une entreprise et la rue où celle-ci a un siège.<br />
Nous pourrions éventuellement considérer un nœud par adresse (et non par rue), mais cela fera exploser le nombre de nœuds, et donnera moins de souplesse par la suite, comme nous le verrons plus loin.</p>
<p style="text-align: justify;"><a href="/wp-content/uploads/2017/11/MaSociete.png"><img loading="lazy" decoding="async" class="alignleft wp-image-11212 size-full" src="/wp-content/uploads/2017/11/MaSociete.png" alt="" width="570" height="368" /></a></p>
<h1 style="text-align: justify;">Autres liens</h1>
<p style="text-align: justify;">On peut imaginer qu’un organisme dispose d’autres informations. Par exemple, un système dans lequel les entreprises doivent déclarer leurs travailleurs, et où le contrôle au niveau de l’entreprise est faible (ce qui est typiquement le cas des travailleurs « détachés », ayant leur employeur dans un pays A, mais travaillant – généralement temporairement – dans un pays B. Ils doivent alors être déclarés dans le pays B, mais qui peut alors difficilement imposer un système d’identification standardisé).<br />
Dans de tels cas, on pourrait utiliser les travailleurs comme entités supplémentaires. On peut aussi se servir des administrateurs ou des gérants si l’on dispose de ce type d’information.</p>
<h1 style="text-align: justify;">Combiner noms et adresses</h1>
<p style="text-align: justify;">Considérons maintenant plusieurs enregistrements dans notre base de données de sous-traitance. Nous supposons que « Ma Société » a déménagé, on trouve donc des données à deux adresses différentes :</p>
<table>
<thead>
<tr>
<td></td>
<td><strong>ID national</strong></td>
<td><strong>Dénomination</strong></td>
<td><strong>Adresse</strong></td>
</tr>
</thead>
<tbody>
<tr>
<td>1</td>
<td></td>
<td>Ma société S.A</td>
<td>Avenue Fonsny 20</td>
</tr>
<tr>
<td>2</td>
<td></td>
<td>MA SOCIETE</td>
<td>Boulevard Industriel 25</td>
</tr>
<tr>
<td>3</td>
<td>1234</td>
<td>Ma Société</td>
<td>Avenue Fonsny 20</td>
</tr>
<tr>
<td>4</td>
<td>1234</td>
<td>Ma Société</td>
<td>Boulevard Industriel 25</td>
</tr>
</tbody>
</table>
<p style="text-align: justify;">On aura dans notre base de données graphes trois nœuds « Company » : (-, « Ma société S.A »), (-, « MA SOCIETE »), et (1234, « Ma Société »), et deux rues : « Avenue Fonsny » et « Boulevard Industriel » (nous supposons que les adresses ont été normalisées au préalable), comme on peut le voir dans la figure ci-dessus.</p>
<p style="text-align: justify;">Les versions nettoyées des trois sociétés donnent la même chaîne de caractères, et seront regroupées autour d’un nœud « Denomination_group », comme le montre le schéma ci-dessus.</p>
<p style="text-align: justify;">On pourra maintenant rechercher un cycle entre deux compagnies A1 et A2, avec de forts soupçons de doublons.</p>
<pre style="text-align: justify;">(2)    MATCH
      (A1:Company)-[:Subcontractor*]-&gt;(A2:Company),
      (A1)--&gt;(:Denomination_group)&lt;--(A2),
      (A1)--&gt;(:Street)&lt;--(A2)
      RETURN …</pre>
<p style="text-align: justify;">La première ligne indique donc qu’il y a un chemin de sous-traitance entre A1 et A2 ; la seconde que A1 et A2 portent le même nom (après nettoyage, ou éventuellement après application d’un algorithme tel que la distance de Levenshtein), et la troisième que A1 et A2 sont renseignées dans la même rue.</p>
<p style="text-align: justify;"><a href="/wp-content/uploads/2017/11/GlobalSchema.png"><img loading="lazy" decoding="async" class="size-full wp-image-11215 aligncenter" src="/wp-content/uploads/2017/11/GlobalSchema.png" alt="" width="503" height="591" srcset="https://staging.smalsresearch.be/wp-content/uploads/2017/11/GlobalSchema.png 503w, https://staging.smalsresearch.be/wp-content/uploads/2017/11/GlobalSchema-255x300.png 255w" sizes="auto, (max-width: 503px) 100vw, 503px" /></a></p>
<p style="text-align: justify;">Dans le schéma ci-dessus, la requête (1) plus haut aurait retourné la chaîne</p>
<p style="text-align: justify;">(C1)&#8211;&gt;(C2)&#8211;&gt;(C3)&#8211;&gt;(C1).</p>
<p style="text-align: justify;">La requête (2) retournera quant à elle</p>
<p style="text-align: justify;">(C10)&#8211;&gt;(C3)&#8211;&gt;(C1)&#8211;&gt;(C2)&#8211;&gt;(C9),</p>
<p style="text-align: justify;">avec D1 comme nœud « Denomination_group » et S1 comme « Street », A1 et A2 correspondant respectivement à C10 et C9.</p>
<p style="text-align: justify;"><span class="collapseomatic " id="id6a315b63ee0f8"  tabindex="0" title="Cliquer ici pour plus de détails à propos des adresses identiques"    >Cliquer ici pour plus de détails à propos des adresses identiques</span><div id="target-id6a315b63ee0f8" class="collapseomatic_content ">
<p style="text-align: justify;">La requête (2) ci-dessus explicite qu&#8217;il est suffisant que deux entreprises de même nom (ou presque) partagent la même rue pour être considérées comme des doublons. Si l&#8217;on veut être plus sévère, et imposer exactement la même adresse (après standardisation), il suffira de rajouter une contrainte sur les relations entre les nœuds « Company » et les nœuds « Street », imposant le même numéro de maison :</p>
<pre style="text-align: justify;">(2bis) MATCH
      (A1:Company)-[:Subcontractor*]-&gt;(A2:Company),
      (A1)--&gt;(:Denomination_group)&lt;--(A2),
      (A1)-[str1:Address]-&gt;(:Street)&lt;-[str2:Address]-(A2)
      <span style="color: #0000ff;">WHERE str1.NUMBER = str2.NUMBER</span>
      RETURN …</pre>
<p style="text-align: justify;"></div>
<p style="text-align: justify;">On peut aussi imaginer que l’on va considérer comme fortement suspect deux entreprises de même nom, ayant un même sous-traitant (sans considérer les adresses, qui pourraient être souvent manquantes) :</p>
<pre>(3)     MATCH
       (A1:Company)-[:Subcontractor*]-&gt;(A2:Company),
       (A1)--&gt;(: Denomination_group)&lt;--(A2),
       (A1)- [:Subcontractor]-&gt;(B:Company)&lt;- [:Subcontractor]-(A2)
        RETURN …
</pre>
<p style="text-align: justify;">Cette requête retournera alors</p>
<p style="text-align: justify;">(C6)&#8211;&gt;(C1)&#8211;&gt;(C2)&#8211;&gt;(C3)&#8211;&gt;(C4),</p>
<p style="text-align: justify;">C5 correspondant à B, et D3 au « Denomination_group ».</p>
<p style="text-align: justify;"><span class="collapseomatic " id="id6a315b63ee124"  tabindex="0" title="Cliquer ici pour voir comme gérer plusieurs duplicatas"    >Cliquer ici pour voir comme gérer plusieurs duplicatas</span><div id="target-id6a315b63ee124" class="collapseomatic_content ">
<p style="text-align: justify;">Notons que dans les deux requêtes ci-dessus, une seule entreprise de la chaîne peut avoir été mal encodée (une fois en A1, une fois en A2). Il n’est pas très difficile d’imaginer une requête où deux entreprises de la chaîne sont dédoublées. On peut même appliquer une contrainte différente dans les deux doublons :</p>
<pre>(4)     MATCH
       (A1:Company)-[:Subcontractor*]-&gt;(B1:Company) --&gt;(:Duplication_group)
           &lt;-- (B2:Company)-[:Subcontractor*]-&gt;(A2:Company),
       (A1)--&gt;(:Duplication_group)&lt;--(A2),
       (A1)--&gt;(:Street)&lt;--(A2)
       RETURN …</pre>
<p style="text-align: justify;">Dans cette requête, on se satisfait du fait que B1 et B2 aient le même nom, par contre on imposera en plus à A1 et A2 d’avoir également la même adresse. Cette requête n’aurait pas été possible si l’on avait dû décider au préalable des règles à appliquer pour déterminer des doublons, et les règles auraient dès lors dues être les mêmes pour A1 vs A2 que pour B1 vs B2. On laisse ensuite à un être humain le soin de déterminer, en fonction de sa connaissance métier et d&#8217;information qui ne seraient pas dans la base de données, si B1 et B2 sont effectivement des enregistrements correspondant à la même entreprise.</p>
<p style="text-align: justify;">Dans le schéma ci-dessus, la première ligne correspond au chemin</p>
<p style="text-align: justify;">(C10)&#8211;&gt;(C3)&#8211;&gt;(C1)&#8211;&gt;(C7)&#8211;&gt;(D2)&lt;&#8211;(C8)&#8211;&gt;(C2)&#8211;&gt;(C9)</p>
<p style="text-align: justify;">(avec A1 : C10, B1 : C7, B2 : C8 et A2 : C9).</p>
<p style="text-align: justify;"></div>
<h1 style="text-align: justify;">Technique hybrides</h1>
<p style="text-align: justify;">Plutôt que de gérer la totalité des doublons dans la base de données graphes, en se servant uniquement des Data Quality tools pour corriger les adresses et détecter les homonymes d&#8217;entreprises, on peut aussi considérer une technique hybride. On peut par exemple considérer une première phase, basée sur un Data Quality tool, de fusion de tous les enregistrements qui constituent à coup sûr un doublon (ou avec un niveau de certitude choisi) : par exemple, exactement la même dénomination, exactement la même adresse (les outils avancés permettent bien sûr de faire des choses bien plus complexes que ceci, gérant des dénominations similaires plutôt qu&#8217;exactes). Nous avons par exemple dans une base de données que nous exploitons plus de 1000 fois la même entreprise décrite, avec le même nom et la même adresse (mais où le numéro d&#8217;entreprise n&#8217;a pas été déclaré).</p>
<p style="text-align: justify;">Les données ainsi « compactées » pourront alors être intégrées dans une base de données graphe, dans laquelle on recherchera des structures de doublons plus complexes (en se servant également d&#8217;autres informations, comme les travailleurs ou mandataires communs, ou plus généralement le voisinage), ou plus faible.</p>
<p style="text-align: justify;">On pourrait aussi utiliser les techniques décrites ci-dessus pour fusionner, directement dans la base de données graphe, tous les nœuds considérés comme des doublons. Cela permettra de simplifier les requêtes par la suite, tout en permettant de garder une certaine souplesse : on fusionnera uniquement les cas « sûrs » (selon des critères que l&#8217;on devra définir), et laissera la possibilité de considérer des doublons moins certains dans les requêtes.</p>
<h1 style="text-align: justify;">Conclusion</h1>
<p style="text-align: justify;">Notre expérience dans la lutte contre la fraude nous a montré ces dernières années qu&#8217;il est primordial de tenir compte de la qualité des données sur lesquelles on travaille. Mais elle nous a aussi montré que, dans le cadre d&#8217;un travail de « datamining », traiter la totalité de la problématique de qualité en amont, dans une phase de pré-traitement, n&#8217;est pas toujours optimal. Le degré de certitude exigé peut varier d&#8217;une analyse à l&#8217;autre et une certaine souplesse peut être nécessaire dans des phases plus avancées.</p>
<p style="text-align: justify;">Néanmoins, en aucun cas il ne sera envisageable de se passer des outils de Data Quality :</p>
<ul>
<li style="text-align: justify;">Nous n&#8217;évoquons ici que l&#8217;aspect « détection de (présomption de) doublons » ; les outils de Data Quality ont de nombreuses autres fonctionnalités indispensables.</li>
<li style="text-align: justify;">Notre approche suppose que l&#8217;on est capable de déterminer que deux dénominations d&#8217;entreprises sont « considérées comme identiques », même s&#8217;il y a des différentes orthographiques ou syntaxiques. Si l&#8217;on veut pour ce faire utiliser des méthodes plus avancées que des simples distances de Levenshtein, l&#8217;utilisation d&#8217;outil adapté sera nécessaire.</li>
<li style="text-align: justify;">Nous supposons également que nous sommes capable d&#8217;identifier que deux adresses sont identiques, ce qui est bien plus complexe que de vérifier la similitude entre deux chaînes de caractères. Pour cette tâche, l&#8217;utilisation d&#8217;outils disposant de base de connaissance sera indispensable.</li>
</ul>
<p style="text-align: justify;">L&#8217;approche que nous proposons ici permet de combiner, pour la problématique du dédoublonnage et dans le cadre d&#8217;une analyse effectuée sur une base de données graphe, travail partiel de Data Quality en pré-traitement et analyse métier tenant compte des résultats obtenus. L&#8217;idée générale sera d&#8217;appliquer le principe de « Keep the power where it belongs » : combiner de façon optimale un outil de Data Quality (pour la comparaison de contenus textuels) et Graph Database (pour l&#8217;exploitation des relations).</p>
<p style="text-align: justify;">En appliquant cette méthodologie sur des cas concrets, de multiples cas problématiques (c&#8217;est-à-dire des suspicions de fraude) ont pu être trouvés et soumis à divers services d&#8217;inspection, que des analyses plus classiques n&#8217;avaient jusqu&#8217;ici pas permis de déceler.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://staging.smalsresearch.be/gerer-les-doublons-dans-une-graph-database/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Graph DB vs RDBMS</title>
		<link>https://staging.smalsresearch.be/graph-db-vs-rdbms/</link>
					<comments>https://staging.smalsresearch.be/graph-db-vs-rdbms/#respond</comments>
		
		<dc:creator><![CDATA[Vandy Berten]]></dc:creator>
		<pubDate>Wed, 10 May 2017 10:49:59 +0000</pubDate>
				<category><![CDATA[[NL]]]></category>
		<category><![CDATA[Blog post]]></category>
		<category><![CDATA[big data]]></category>
		<category><![CDATA[Graph Databases]]></category>
		<category><![CDATA[Information management]]></category>
		<category><![CDATA[Network Analytics]]></category>
		<category><![CDATA[software engineering]]></category>
		<guid isPermaLink="false">/?p=10505</guid>

					<description><![CDATA[Dans l&#8217;article précédent, nous exprimions que les bases de données relationnelles n&#8217;étaient pas toujours la meilleure solution quand il s&#8217;agissait de focaliser une analyse sur les relations (ce qui peut en effet sembler un petit peu contradictoire et ironique). Nous suggérons au lecteur de d&#8217;abord lire l&#8217;article en question, car nous nous baserons sur les [&#8230;]]]></description>
										<content:encoded><![CDATA[<p style="text-align: justify;">Dans <a href="/bases-de-donnees-relationnelles-adequates-pour-des-relations">l&#8217;article précédent</a>, nous exprimions que les bases de données relationnelles n&#8217;étaient pas toujours la meilleure solution quand il s&#8217;agissait de focaliser une analyse sur les relations (ce qui peut en effet sembler un petit peu contradictoire et ironique). Nous suggérons au lecteur de d&#8217;abord lire l&#8217;article en question, car nous nous baserons sur les exemples qui y sont présents.</p>
<h1 style="text-align: justify;">Base de données orientée graphe</h1>
<p style="text-align: justify;">Les bases de données orientées graphe (ou <em>Graph DB</em>) placent les relations au cœur du problème, et plus particulièrement le parcours de ces relations. Elles ont pour but à la fois d&#8217;éviter à l&#8217;utilisateur (plus précisément à la personne interrogeant la base de données) de se préoccuper de la façon dont sont structurées et implémentées les relations, et d&#8217;offrir un mécanisme plus efficace que les JOIN pour parcourir les relations.</p>
<p style="text-align: justify;">Un des leaders des bases de données orientées graphe est Neo4j<a href="#neo4j"><sup>2</sup></a>. Dans la suite de cet article, nous utiliserons son langage de requête, &#8220;Cypher&#8221; (proche de SQL).</p>
<h1 style="text-align: justify;">Syntaxe : plus proche du modèle</h1>
<p style="text-align: justify;">Si nous reprenons l<a href="/bases-de-donnees-relationnelles-adequates-pour-des-relations#workers">&#8216;exemple de l&#8217;article précédent</a>, avec les travailleurs et les entreprises, nous pourrions naturellement représenter notre modèle comme dans la figure ci-contre. <a href="/wp-content/uploads/2017/02/GraphDB_graphmodel.png"><img loading="lazy" decoding="async" class="alignright size-medium wp-image-10498" src="/wp-content/uploads/2017/02/GraphDB_graphmodel-300x99.png" alt="" width="300" height="99" srcset="https://staging.smalsresearch.be/wp-content/uploads/2017/02/GraphDB_graphmodel-300x99.png 300w, https://staging.smalsresearch.be/wp-content/uploads/2017/02/GraphDB_graphmodel.png 365w" sizes="auto, (max-width: 300px) 100vw, 300px" /></a>Deux &#8220;nœuds&#8221; (ou entités), l&#8217;un de type &#8220;Worker&#8221;, l&#8217;autre de type &#8220;Company&#8221;, sont liées par une relation &#8220;WORKS_FOR&#8221;. Les nœuds ont des attributs (ici : &#8220;Name&#8221;), les relations peuvent également en avoir (non représentées dans le schéma). Dans le langage &#8220;Cypher&#8221;, la <a href="/bases-de-donnees-relationnelles-adequates-pour-des-relations#workers_SQL">requête SQL décrite dans l&#8217;article précédent</a> permettant de retrouver les travailleurs employés par la compagnie &#8220;Smals&#8221; pourra s&#8217;écrire de la façon suivante :</p>
<p style="text-align: justify;"><code>MATCH (w:Worker)-[:WORKS_FOR]-&gt;(c:Company {c.Name:"Smals"})<br />
RETURN w.Name</code></p>
<p style="text-align: justify;">Dans cette requête, les nœuds sont symbolisés par des parenthèses, alors que les relations le sont par des crochets au milieu d&#8217;une flèche. Nous précisons ici que nous recherchons les travailleurs (w), ayant une relation de type &#8220;WORKS_FOR&#8221; avec une compagnie (c) dont l&#8217;attribut &#8220;Name&#8221; vaut &#8220;Smals&#8221;. Remarquons que nous devons juste préciser le type de la relation, et non comment elle est implémentée, contrairement aux requêtes SQL décrites précédemment. Par ailleurs, ce modèle vaut aussi bien pour le cas où un travailleur ne peut être employé que par une entreprise que pour le cas où il peut travailler pour plusieurs sociétés.</p>
<p style="text-align: justify;">Nous avons donc une requête très proche du schéma métier que l&#8217;on a dessiné. En exagérant à peine, il suffit d&#8217;avoir dessiné au tableau la requête que l&#8217;on veut exécuter pour pouvoir directement l&#8217;écrire.</p>
<h2 style="text-align: justify;">Autre exemple</h2>
<p style="text-align: justify;">Considérons un exemple un petit peu plus complexe, dans lequel nous fusionnons les deux exemples de l&#8217;article précédent : nous avons donc des personnes, des compagnies, des relations de travail entre personnes et compagnies, ainsi que des relations d&#8217;amitié entre les personnes.</p>
<p style="text-align: justify;">Si nous voulons connaître la liste de collègue de Bob que celui-ci apprécie, nous écrirons ceci :</p>
<p style="text-align: justify;"><code>MATCH<br />
(bob:Person {Name:"Bob"})-[:LIKES]-&gt;(colleague:Person),<br />
</code><code>(bob)-[:WORKS_FOR]-&gt;(:Company)&lt;-[:WORKS_FOR]-(colleague)</code><br />
<code>RETURN colleague.Name</code></p>
<p style="text-align: justify;">La première partie de la requête cherche une relation de type &#8220;LIKES&#8221; entre un nœud, de type Person (dénommé &#8220;bob&#8221; dans la requête), dont l&#8217;attribut &#8220;Name&#8221; vaut &#8220;Bob&#8221;, et un autre nœud de type Person (dénommé &#8220;colleague&#8221;). Grâce à la seconde partie, nous ne considérons ce nœud &#8220;colleague&#8221; que si l&#8217;on trouve deux relations &#8220;WORKS_FOR&#8221;, liant &#8220;bob&#8221; et &#8220;colleague&#8221; à une même compagnie.</p>
<p style="text-align: justify;">Si l&#8217;on veut maintenant plutôt savoir quelles sont les personnes qui aiment Bob dans sa société, on changera simplement &#8220;-[:LIKES]-&gt;&#8221; par &#8220;<strong>&lt;</strong>-[:LIKES]-&#8220;, sans devoir, comme c&#8217;était le cas avec SQL, mettre à jour une série de clés. Et si le sens de la relation importe peu, on écrira simplement &#8220;-[:LIKES]-&#8220;.</p>
<p style="text-align: justify;">On peut également s&#8217;intéresser à des chemins de plus d&#8217;une relation : les amis des amis seront dénotés &#8220;-[:LIKES<strong>*2</strong>]-&#8221; ; si l&#8217;on veut un chemin de longueur entre 4 et 6, on écrira &#8220;-[:LIKES<strong>*4..6</strong>]-&#8220;, et si la longueur importe peu, &#8220;-[:LIKES<strong>*</strong>]-&#8220;.</p>
<h2 style="text-align: justify;">Gestion des clés</h2>
<p style="text-align: justify;">Les requêtes Cypher décrites ci-dessus ne comprennent aucune clé, qu&#8217;elle soit primaire ou étrangère. La gestion des clés ne sert en effet souvent qu&#8217;à gérer les relations, et cette gestion est complètement déléguée à la base de données. On peut bien sûr avoir des clés &#8220;métier&#8221; : identifiant national, numéro de TVA, numéro d&#8217;employé&#8230; mais elles seront alors traitées comme les autres attributs.</p>
<p style="text-align: justify;">Chaque attribut, comme dans une base de données relationnelle classique, pourra à la demande, recevoir une contrainte d&#8217;unicité (pour les clés métier), ou être indexée, pour une recherche rapide (comme typiquement pour l&#8217;attribut &#8220;Name&#8221; décrit ci-dessus). Il n&#8217;y aura par contre pas lieu de décrire des contraintes d&#8217;intégrité référentielle, (permettant dans une base de données relationnelle de s&#8217;assurer qu&#8217;une clé étrangère existe bien comme clé primaire de la table référencée), ni pour le concepteur de la base de données, ni pour le développeur de requête.</p>
<h2 style="text-align: justify;">Un parcours plus efficace</h2>
<p style="text-align: justify;">L&#8217;implémentation du moteur est ici très différente du cas de la base de données relationnelle. Reprenons la requête évoquée plus haut :</p>
<p style="text-align: justify;"><code>MATCH (w:Worker)-[WORKS_FOR]-&gt;(c:Company {c.name:"Smals"})</code><br />
<code>RETURN w.name</code></p>
<p style="text-align: justify;">Une fois qu&#8217;on a trouvé le nœud &#8220;Smals&#8221; (grâce à un index, typiquement), celui-ci contient directement une liste de pointeurs, lui permettant de trouver les nœuds &#8220;Worker&#8221; concernés dans un temps qui ne dépendra pas de la taille de la base de données, mais uniquement du nombre de nœuds directement voisins. Le parcours d&#8217;index nécessaire pour un &#8220;<code>JOIN</code>&#8221; classique est donc évité.</p>
<p style="text-align: justify;">C&#8217;est grâce à ce mécanisme d&#8217;arithmétique de pointeur qu&#8217;une requête Cypher peut être exécutée beaucoup plus rapidement qu&#8217;une requête SQL classique comprenant un certain nombre de &#8220;<code>JOINs</code>&#8220;.</p>
<p style="text-align: justify;">Certains auteurs considèrent par ailleurs que c&#8217;est cette caractéristique qui définit une base de données orientée graphe : dans une telle base de données, chaque nœud contient une référence qui permet d&#8217;accéder directement à tous ses voisins.</p>
<p style="text-align: justify;">Chez eBay, qui utilise Neo4j pour un système de routage de colis, <a href="https://neo4j.com/news/graph-databases-provide-crystal-ball-online-recommendations-wal-mart-ebay/">Volket Pacher (Senior Developper) explique</a> :</p>
<blockquote>
<p style="text-align: justify;">“We found Neo4j to be literally thousands of times faster than our prior MySQL solution, with queries that require 10-100 times less code. Today, Neo4j provides eBay with functionality that was previously impossible.”</p>
</blockquote>
<p style="text-align: justify;">Des recherches ont été menées<sup><a href="#ref2">2,</a><a href="#ref3">3</a></sup> pour comparer les performances entre Neo4j et une base de données relationnelle, dans le cas de l&#8217;exploration d&#8217;un réseau d&#8217;amitiés, comme présenté ci-dessus. Pour un réseau d&#8217;un million de nœuds, en moyenne 50 voisins par nœud et profondeur de 2 (amis d&#8217;amis), les performances des deux systèmes étaient comparables. Pour une profondeur de 3, les 30 secondes nécessaires au RDBMS ont été réduites à 170 millisecondes avec Neo4j. Il n&#8217;était donc plus envisageable d&#8217;utiliser le RDBMS dans un système interactif, alors que ça le restait pour Neo4j.</p>
<table style="height: 175px;" width="471">
<tbody>
<tr>
<td style="width: 89.5556px;"><strong>Depth</strong></td>
<td style="width: 303.778px;"><strong>RDBMS exec. time (s)</strong></td>
<td style="width: 260.222px;"><strong>Neo4j exe. time (s)</strong></td>
</tr>
<tr>
<td style="width: 89.5556px;">2</td>
<td style="width: 303.778px;">0.016</td>
<td style="width: 260.222px;">0.010</td>
</tr>
<tr>
<td style="width: 89.5556px;">3</td>
<td style="width: 303.778px;">30.264</td>
<td style="width: 260.222px;">0.168</td>
</tr>
<tr>
<td style="width: 89.5556px;">4</td>
<td style="width: 303.778px;">1543.505</td>
<td style="width: 260.222px;">1.359</td>
</tr>
<tr>
<td style="width: 89.5556px;">5</td>
<td style="width: 303.778px;">Unfinished</td>
<td style="width: 260.222px;">2.132</td>
</tr>
</tbody>
</table>
<p style="text-align: justify;">Pour une profondeur de 4, la base de données orientée graphe a permis de passer de 25 minutes à 1,3 secondes.</p>
<p style="text-align: justify;">Notons que cette amélioration notable de performances dans certaines circonstances ne se fait pas au prix de la cohérence de la base de données : Neo4j garantit en effet les <a href="https://fr.wikipedia.org/wiki/Propri%C3%A9t%C3%A9s_ACID" target="_blank" rel="noopener noreferrer">propriétés ACID</a>.</p>
<h1 style="text-align: justify;">Tout n&#8217;est pas rose</h1>
<p style="text-align: justify;">Au vu de ce qui est dit ci-dessus, doit-on tout simplement abandonner les bases de données relationnelles au profit des bases de données orientées graphe ? Certainement pas. Les <i>Graph DB</i> ont bien sûr quelques inconvénients. En voici quelques-uns (liste non exhaustives) :</p>
<ul style="text-align: justify;">
<li>Les Graph DB n&#8217;ont pas encore atteint la maturité des RDBMS : l&#8217;offre de produit est nettement plus réduite, la communauté également. La robustesse ou la haute disponibilité doivent encore faire leur preuve.</li>
<li>D&#8217;autres modèles de bases de données alternatives aux RDBMS, comme les bases Orienté Objets, un temps très à la mode, ne sont pas parvenu à s&#8217;imposer. Rien ne dit que les Graph DB pourront faire mieux.</li>
<li>Pour des recherches (&#8220;Trouver toutes les entités de type T&#8221;) ou des agrégations (&#8220;Quel est le salaire moyen par province&#8221;), une Graph DB ne sera pas efficace. Idem pour appliquer une même transformation à toutes les lignes d&#8217;une table.</li>
<li>Il faut être très attentif à l’explosion combinatoire. Par exemple, si l&#8217;on demande tous les chemins possibles entre deux nœuds, il ne faut pas grand chose pour que le nombre de ces chemins explose.</li>
<li>Neo4j repose sur le principe que chaque nœud peut avoir des attributs différents, déterminés à la création du nœud. Il est donc vite arrivé de faire une faute de frappe, et d&#8217;avoir deux noms d&#8217;attributs légèrement différents, et du coup inutilisables.</li>
</ul>
<h1 style="text-align: justify;">RDBMS ou Graph DB ?</h1>
<p style="text-align: justify;">Il existe probablement peu de situations dans laquelle une base de données orientée graphe pourra être la seule base de données d&#8217;une application. Une cohabitation sera dans la plupart des cas l&#8217;option la plus viable. Même <a href="https://www.youtube.com/watch?v=NO3C-CWykkY" target="_blank" rel="noopener noreferrer">Neo4j ne conseille pas nécessairement</a> d&#8217;envisager un environnement 100% <em>Graph DB</em>. Trois scenarii principaux peuvent se présenter :</p>
<ol style="text-align: justify;">
<li>Les données sont intimement connectées, et la plupart des requêtes concernent des parcours de relations. Dans ce cas très théorique seulement, une base de données orientée graphe unique peut s&#8217;envisager.</li>
<li>Certaines données sont intimement connectées, mais pas toutes. On peut alors envisager de gérer la partie &#8220;connectée&#8221; dans une <em>Graph DB</em>. L&#8217;application interroge alors la <em>Graph DB</em> avec Cypher, et la RDBMS avec SQL.</li>
<li>On peut également envisager une duplication complète synchronisée. En fonction des requêtes, l&#8217;application peut alors choisir soit Cypher, soit SQL.<br />
Un exemple classique consisterait à avoir toutes les données transactionnelles de production dans une RDBMS, et tout ce qui permet de faire des analyses (statistiques, recherche de fraudes, recommandations&#8230;) dans une copie &#8220;Graph DB&#8221; en lecture seule.</li>
</ol>
<p>Dans la plupart des cas, la question ne sera donc pas &#8220;RDBMS ou Graph DB&#8221;, mais plutôt &#8220;RDBMS <strong>et</strong> Graph DB&#8221;. La difficulté, que ça soit à la conception du système ou lors d&#8217;une migration, sera de déterminer le terrain de chacun.</p>
<h1 style="text-align: justify;">Conclusions</h1>
<p style="text-align: justify;">Si les bases de données orientées graphe n’ont pas vocation à remplacer les bases de données relationnelles dans toutes les circonstances, il existe de nombreuses situations où elles peuvent avoir un grand intérêt, seule ou en complément. En particulier quand on se focalise sur les relations qui existent entre des entités de type différent, plutôt qu’entre les attributs de ces entités.</p>
<p style="text-align: justify;">Le champ d&#8217;application des <em>Graph DB</em> est bien plus large que l&#8217;analyse ou la gestion des réseaux sociaux ; systèmes de recommandation en temps-réel, Master Data Management, détection de la fraude, gestion des infrastructures IT et des réseaux, sont autant de secteurs dans lesquelles des logiciels tels que Neo4j (mais également <a href="https://orientdb.com">OrientDB</a>, ou, dans une moindre mesure <a href="https://en.wikipedia.org/wiki/FlockDB">FlockDB</a>) s&#8217;avèrent particulièrement efficaces.</p>
<p style="text-align: justify;">L’adoption d’une base de données orientée graphe demande en général de penser ses données d’une façon complètement différente, mais souvent plus intuitive et plus proche de la réalité. La migration vers une <em>Graph DB</em> ne s&#8217;avère par toujours rentable, mais il serait judicieux, quand un nouveau projet démarre, d&#8217;au moins se demander si une base de données relationnelle est bien la solution la plus appropriée.</p>
<h1 style="text-align: justify;">Références</h1>
<ol>
<li style="text-align: justify;"><a id="ref1"></a>Graph Databases, New opportunities for connected data ; Ian Robinson,<br />
Jim Webber &amp; Emil Eifrem ; O’Reilly, 2015</li>
<li style="text-align: justify;"><a id="neo4j"></a><a href="https://www.neo4j.com">www.neo4j.com</a></li>
<li style="text-align: justify;"><a id="ref3"></a> Neo4j in Action. Aleksa Vukotic and Nicki Watt, Mannings, 2015.</li>
</ol>
]]></content:encoded>
					
					<wfw:commentRss>https://staging.smalsresearch.be/graph-db-vs-rdbms/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Bases de données relationnelles&#8230; adéquates pour des relations ?</title>
		<link>https://staging.smalsresearch.be/bases-de-donnees-relationnelles-adequates-pour-des-relations/</link>
					<comments>https://staging.smalsresearch.be/bases-de-donnees-relationnelles-adequates-pour-des-relations/#comments</comments>
		
		<dc:creator><![CDATA[Vandy Berten]]></dc:creator>
		<pubDate>Tue, 21 Mar 2017 08:02:40 +0000</pubDate>
				<category><![CDATA[[FR]]]></category>
		<category><![CDATA[Blog post]]></category>
		<category><![CDATA[big data]]></category>
		<category><![CDATA[Graph Databases]]></category>
		<category><![CDATA[Information management]]></category>
		<category><![CDATA[Network Analytics]]></category>
		<category><![CDATA[software engineering]]></category>
		<guid isPermaLink="false">/?p=10493</guid>

					<description><![CDATA[(Avertissement : cet article nécessite des connaissances élémentaires en bases de données). Les bases de données relationnelles servent à représenter des relations. Cette affirmation peut sembler un euphémisme. Pourtant, à y regarder de plus près, les choses ne sont peut-être pas si évidentes. Essayons de comprendre pourquoi au travers de quelques exemples simples. Bases de données [&#8230;]]]></description>
										<content:encoded><![CDATA[<p style="text-align: justify;"><span style="color: #999999;"><em>(Avertissement : cet article nécessite des connaissances élémentaires en bases de données).</em></span></p>
<p style="text-align: justify;">Les bases de données relationnelles servent à représenter des relations. Cette affirmation peut sembler un euphémisme. Pourtant, à y regarder de plus près, les choses ne sont peut-être pas si évidentes. Essayons de comprendre pourquoi au travers de quelques exemples simples.</p>
<h1 style="text-align: justify;">Bases de données relationnelles et relations</h1>
<p style="text-align: justify;"><a id="workers"></a>Supposons d&#8217;abord que l&#8217;on souhaite représenter des travailleurs, et les entreprises pour lesquelles ils travaillent, en supposant dans un premier temps qu&#8217;un travailleur ne travaille que pour une seule entreprise. <a href="/wp-content/uploads/2017/03/GraphDB_simplerelation.png"><img loading="lazy" decoding="async" class="alignleft wp-image-10608 size-full" src="/wp-content/uploads/2017/03/GraphDB_simplerelation.png" alt="" width="242" height="149" /></a>Une modélisation relationnelle simple consistera à utiliser deux tables : une première que nous appellerons &#8220;Workers&#8221;, et une seconde &#8220;Companies&#8221;. Typiquement, les deux tables posséderont une &#8220;clé primaire&#8221; (<em>primary key</em>) permettant d&#8217;identifier chaque ligne de façon unique (&#8220;ID&#8221; dans le schéma ci-contre). Chaque table possédera également des attributs tels que &#8220;Name&#8221;, ou des identifiants nationaux. Pour savoir quelle entreprise emploie un travailleur en particulier, il conviendra de placer une clé étrangère (<em>foreign key</em>) dans la table Workers, faisant référence à la clé primaire de la table Companies (Employer_id dans notre exemple).</p>
<p style="text-align: justify;">Dans ce premier schéma, on distingue bien deux types d&#8217;entité (à savoir des travailleurs et des entreprises), mais ce qui les lie est un attribut (&#8220;Employer_id&#8221;), qui n&#8217;est pas distinguable des autres attributs, tels que &#8220;Name&#8221;. Ce qui fait que cet attribut &#8220;joue le rôle d&#8217;une relation&#8221;, c&#8217;est que lorsque l&#8217;on exécutera une requête SQL, on précisera dans le &#8220;<code>JOIN</code>&#8221; quels sont les attributs à lier. Par exemple, pour obtenir la liste des employés de la société &#8220;Smals&#8221;, on écrira :</p>
<p style="text-align: justify;"><code><a id="workers_SQL"></a>SELECT Workers.Name<br />
</code><code>FROM Workers<br />
JOIN Companies<br />
ON Workers.Employer_ID = Companies.ID<br />
WHERE Companies.Name = 'Smals'</code></p>
<p style="text-align: justify;">La base de données elle-même, mise à part éventuellement la définition de contraintes d&#8217;intégrités (optionnelles) lorsqu&#8217;elles sont disponibles, n&#8217;a pas &#8220;conscience&#8221; de l&#8217;existence de la relation. C&#8217;est au développeur de l&#8217;application (et non au concepteur de la base de données) de préciser dans chaque requête, d&#8217;une part quelle est la structure de la table (<code>JOIN ... ON</code>), d&#8217;autre part la sélection qu&#8217;il désire obtenir (<code>WHERE ...</code>).</p>
<p style="text-align: justify;">Supposons maintenant qu&#8217;un travailleur puisse travailler pour plusieurs employeurs (on veut donc une relation &#8220;<em>many-to-many&#8221;</em>). Ou bien que l&#8217;on souhaite ajouter des attributs à la relation de travail (date de début, &#8230;). <a href="/wp-content/uploads/2017/03/GraphDB_relation-2.png"><img loading="lazy" decoding="async" class="alignleft wp-image-10611 size-medium" src="/wp-content/uploads/2017/03/GraphDB_relation-2-300x97.png" alt="" width="300" height="97" srcset="https://staging.smalsresearch.be/wp-content/uploads/2017/03/GraphDB_relation-2-300x97.png 300w, https://staging.smalsresearch.be/wp-content/uploads/2017/03/GraphDB_relation-2.png 372w" sizes="auto, (max-width: 300px) 100vw, 300px" /></a>Le modèle ci-dessus ne tient plus, et il faut rajouter une &#8220;table de jointure&#8221; (&#8220;<em>join table</em>&#8220;) que nous appellerons &#8220;Works_for&#8221;. La structure est alors représentée par le schéma ci-contre. Nous avons donc maintenant deux tables qui décrivent des entités (Workers et Companies), et une table qui décrit une relation (Works_for). Fondamentalement, mise à part l&#8217;utilisation qu&#8217;on en fait, rien ne permet de distinguer les tables qui jouent le rôle d&#8217;entité, de celles qui jouent le rôle de relation. En général, les tables représentant des entités peuvent être caractérisées par un nom commun (personne, société, facture, produit&#8230;), alors que les tables représentant des relations seront plus caractérisées par des verbes (travaille pour, achète, contient&#8230;).</p>
<p style="text-align: justify;">Le requête ci-dessus devient encore un peu plus complexe :</p>
<p style="text-align: justify;"><code>SELECT Workers.Name<br />
FROM Workers<br />
JOIN Works_for<br />
ON Workers.ID = Works_for.Worker_ID<br />
JOIN Companies<br />
ON Works_for.Company_ID = Companies.ID<br />
WHERE Companies.Name = 'Smals'</code></p>
<p style="text-align: justify;">On voit donc avec ces deux exemples que dans une base de données relationnelle, une relation peut être représentée de deux façons différentes :</p>
<ul style="text-align: justify;">
<li style="text-align: justify;">Soit en détournant le rôle d&#8217;un attribut, en transformant sa fonction &#8220;caractérisante&#8221; pour lui donner une fonction &#8220;relationnelle&#8221;,</li>
<li style="text-align: justify;">Soit en détournant le rôle d&#8217;une table, en transformant sa fonction &#8220;entité&#8221; au profit d&#8217;une fonction &#8220;relationnelle&#8221;.</li>
</ul>
<p style="text-align: justify;">Dans les deux cas, ce n&#8217;est pas le concepteur de la base de données qui assure les relations (bien qu&#8217;il puisse, optionnellement, définir les relations possibles via les contraintes d&#8217;intégrité), mais bien le développeur de requêtes SQL. Par ailleurs, le modèle relationnel requiert bien souvent une table distincte pour chaque type de relation.</p>
<p style="text-align: justify;">En termes de complexité, pour obtenir le résultat ci-dessus, le moteur du RDBMS doit d&#8217;abord trouver l&#8217;entrée dans la table &#8220;Companies&#8221; dont le nom est égal à &#8220;Smals&#8221;, dont il obtient l&#8217;ID. Il va ensuite rechercher dans la table &#8220;Works_for&#8221; la ou les entrées ayant l&#8217;attribut &#8220;Company_id&#8221; correspondant à l&#8217;ID trouvé ci-dessus, ce qui peut se faire, grâce à un index, dans un temps logarithmique par rapport au nombre d&#8217;entrées dans la table. Ensuite, il doit à nouveau chercher tous les travailleurs correspondant aux entrées qu&#8217;il vient de trouver, au prix d&#8217;une nouvelle recherche logarithmique. Le temps de réponse de la requête augmentera donc en fonction de la taille de données.</p>
<h1 style="text-align: justify;">Récursivité</h1>
<p style="text-align: justify;">Lorsque l&#8217;on s&#8217;intéresse à des relations exprimant plus un réseau qu&#8217;une hiérarchie, comme par exemple des relations d&#8217;amitiés (relations) entre des personnes (entités), ou des routes (succession de relations) empruntées par des données sur un réseau d&#8217;ordinateurs (entités), les choses se compliquent nettement si l&#8217;on désire utiliser une base de données relationnelle.</p>
<p style="text-align: justify;"><a href="/wp-content/uploads/2017/02/GraphDB_recursive1.png"><img loading="lazy" decoding="async" class="alignright wp-image-10501" src="/wp-content/uploads/2017/02/GraphDB_recursive1-273x300.png" alt="" width="199" height="218" /></a>Prenons un exemple simple dans lequel des personnes sont liées par des liens d&#8217;amitié (il pourrait s&#8217;agir d&#8217;ordinateurs et des connexions réseaux, de packages Java et des dépendances&#8230;). On veut représenter le schéma suivant, dans lequel une flèche entre Bob et Alice indique que Bob aime Alice, mais que la réciproque n&#8217;est pas vraie.</p>
<p style="text-align: justify;">Une représentation classique relationnelle consistera à considérer une table &#8220;People&#8221;, <a href="/wp-content/uploads/2017/02/GraphDB_recursive2.png"><img loading="lazy" decoding="async" class="alignleft size-medium wp-image-10502" src="/wp-content/uploads/2017/02/GraphDB_recursive2-300x137.png" alt="" width="300" height="137" srcset="https://staging.smalsresearch.be/wp-content/uploads/2017/02/GraphDB_recursive2-300x137.png 300w, https://staging.smalsresearch.be/wp-content/uploads/2017/02/GraphDB_recursive2.png 428w" sizes="auto, (max-width: 300px) 100vw, 300px" /></a>avec un attribut &#8220;Name&#8221;, et une clé primaire &#8220;ID&#8221;, et une table de jointure &#8220;Likes&#8221;, avec deux clés étrangères Liker_ID, Liked_ID, indiquant qui (Liker_ID) aime qui (Liked_ID). Si l&#8217;on veut répondre à la question toute simple &#8220;Quelles sont les personnes que Bob aime&#8221; (Alice et Charline, en l&#8217;occurrence), il faudra écrire la requête suivante :</p>
<p style="text-align: justify;"><code>SELECT p1.Name<br />
FROM People p1 JOIN Likes </code><br />
<code>     ON Likes.Liked_ID = p1.ID</code><br />
<code>JOIN People p2</code><br />
<code>     ON Likes.Liker_ID = p2.ID</code><br />
<code>WHERE p2.Name = "Bob"<br />
</code></p>
<p style="text-align: justify;">Dans cette requête, deux lignes (la première et la dernière) indiquent ce que le développeur veut réellement, les quatre autres précisent comment la relation est structurée dans la base de données.</p>
<p style="text-align: justify;">Pour retrouver la réciproque, à savoir &#8220;Qui aime Bob ?&#8221;, il faudra modifier une série d&#8217;éléments de la requête, pour inverser les relations considérées.</p>
<p style="text-align: justify;">Si l&#8217;on voulait suggérer à Bob de nouveaux amis, un système de recommandation classique chercherait à lui présenter les personnes qu&#8217;aiment les personnes que Bob aime, sur le principe de &#8220;les amis de mes amis sont mes amis&#8221;. Une relation d&#8217;amitié de degré 2, en quelque sorte. La question, en l&#8217;apparence toute simple, nécessite une requête particulièrement difficile à lire, et donc à vérifier ou à maintenir :</p>
<p style="text-align: justify;"><code>SELECT p1.Name</code><br />
<code>FROM People p1 JOIN Likes l1 </code><br />
<code>   ON l1.Liked_ID = p1.ID</code><br />
<code>JOIN Likes l2 </code><br />
<code>   ON l1.Liker_ID = l2.Liked_ID</code><br />
<code>JOIN People p2</code><br />
<code>   ON l2.Liker_ID = p2.ID</code><br />
<code>WHERE p2.Name = "Bob" AND p1.ID&lt;&gt;p2.ID</code></p>
<p style="text-align: justify;">À nouveau, deux lignes (la première et la dernière) concernent le développeur de l&#8217;application ; toutes les autres devraient principalement être de la responsabilité du concepteur de la base de données (en tout cas si l&#8217;on considérait que celle-ci devait en effet gérer les relations).</p>
<p style="text-align: justify;">Ce genre de requête ne pourrait tout simplement plus se faire raisonnablement si la liste des utilisateurs contenait plusieurs millions de personnes et que l&#8217;on voulait s&#8217;intéresser aux amitiés de degré 4 ou 5. Certaines bases de données incluent certes la syntaxe non-standard &#8220;CONNECT BY&#8221;, comme par exemple Oracle, mais celle-ci, si elle simplifie bien l&#8217;écriture de la requête, ne simplifie en rien la complexité sous-jacente de l&#8217;exécution de la requête.</p>
<p style="text-align: justify;">Une problématique très similaire se présente si l&#8217;on voulait répondre, dans l&#8217;exemple employeur-travailleur précédent, à la question, à nouveau relativement simple : &#8220;donner la liste de tous les anciens collègues des travailleurs d&#8217;une entreprise X&#8221; : une succession de JOINs et de multiples passages par la table &#8220;Works_for&#8221; seront nécessaires pour trouver l&#8217;entreprise de départ, tous ses travailleurs, tous les anciens employeurs de ces travailleurs, et puis enfin les travailleurs de ces employeurs.</p>
<h1 style="text-align: justify;">Bases de données orientées graphe</h1>
<p style="text-align: justify;">Les systèmes de gestion bases de données relationnelles (RDBMS) sont matures, très performants dans la plupart des cas, et ont largement fait leur preuve depuis 30 ans. Il n&#8217;y a aucun doute sur le fait qu&#8217;elles géreront encore à juste titre la grande majorité des données dans les années à venir. Mais elles connaissent un certain nombre de limitations, et une nouvelle famille de bases de données, dites NoSQL (pour Not Only SQL) essaye depuis quelques années de répondre aux faiblesses des RDBMS. La famille NoSQL se divise principalement en quatre sous familles : &#8220;Key-value&#8221;, &#8220;Column&#8221;, &#8220;Document&#8221;, et &#8220;Graph databases&#8221;. C&#8217;est cette dernière famille qui nous intéresse ici, et qui a émergé sur le constat suivant :</p>
<blockquote><p>&#8220;Facebook, for example, was founded on the idea that while there’s value in discrete information about people—their names, what they do, etc.—there’s even more value in the relationships between them.&#8221;<a href="#ref1"><sup>1</sup></a></p></blockquote>
<p style="text-align: justify;">Les bases de données orientées graphes (ou <em>graph databases</em>), qui s&#8217;intéressent à la modélisation de données dans lesquelles les relations sont au cœur du métier, ont un double objectif :</p>
<ol style="text-align: justify;">
<li>Offrir un langage de requêtage (<em>querying language</em>) dans lequel le développeur décrit les relations qu&#8217;il veut rechercher, sans devoir se préoccuper de la façon dont ces relations sont implémentées;</li>
<li>Mettre en place un moteur particulièrement efficace pour gérer le parcours des relations (en opposition avec le mécanisme de &#8220;Join&#8221; des RDBMS, réputé lourd, en particulier lorsqu&#8217;ils sont multiples).</li>
</ol>
<p style="text-align: justify;">Pour en donner un avant-goût, en Cypher, le langage de requêtage de Neo4j<a href="#neo4j"><sup>2</sup></a>, un des leaders des bases de données orientées graphes, la requête ci-dessus exprimant la relation d&#8217;amitié de degré 2 s&#8217;écrira de la façon suivante :</p>
<p style="text-align: justify;"><code>MATCH (p1:Person {Name:"Bob"} ) -[:Likes*2]-&gt; (p2:Person)</code><br />
<code>WHERE p1 &lt;&gt; p2</code><br />
<code>RETURN p2.Name</code></p>
<p style="text-align: justify;">Historiquement, les bases de données relationnelles ont été introduites pour combler les lacunes des <a href="https://fr.wikipedia.org/wiki/Syst%C3%A8me_de_gestion_de_base_de_donn%C3%A9es#Histoire" target="_blank" rel="noopener noreferrer">bases de données hiérarchiques et réseaux</a>. On les a appelé &#8220;relationnelles&#8221; parce que, dans le contexte de l&#8217;époque, elle permettaient de mieux représenter les relations. Il peut sembler ironique qu&#8217;à l&#8217;heure actuelle, on revienne à des organisations en réseau parce qu&#8217;avec l&#8217;évolution de la technologie, on estime aujourd&#8217;hui que les bases de données relationnelles ne représentent pas bien les relations&#8230;</p>
<h1 style="text-align: justify;">Conclusion</h1>
<p style="text-align: justify;">Les quelques exemples ci-dessus ont eu pour but de montrer que, si on veut mettre au cœur d&#8217;une analyse les relations entre des entités plutôt que ces entités elles-mêmes, les bases de données relationnelles ne sont pas forcément le meilleur candidat. Elles ont d&#8217;une part l&#8217;inconvénient de repousser au développeur de l&#8217;application l&#8217;implémentation des relations, et d&#8217;autre part de nécessiter l&#8217;exécution d&#8217;une machinerie très lourde.</p>
<p style="text-align: justify;"><a href="/graph-db-vs-rdbms/" target="_blank" rel="noopener noreferrer">Dans un prochain article</a>, nous expliquerons plus en détails comment fonctionne une base de données orientées graphe (en particulier Neo4j<a href="#neo4j"><sup>2</sup></a>), et comment elles peuvent répondre aux problématiques détaillées ci-dessus. Il va de soi que les bases de données orientées graphes ne sont pas un remplaçant universel des bases de données relationnelles, et ne sont pas du tout adéquates dans un certain nombre de circonstances. Mais nous verrons qu&#8217;elles peuvent être très complémentaires aux RDBMS, en les surpassent largement, dans certains cas spécifiques, tant en termes de performances qu&#8217;en terme de lisibilité ou d&#8217;expressivité.</p>
<h1 style="text-align: justify;">Références</h1>
<ol>
<li style="text-align: justify;"><a id="ref1"></a>Graph Databases, New opportunities for connected data ; Ian Robinson, Jim Webber &amp; Emil Eifrem ; O’Reilly, 2015. <a href="https://graphdatabases.com/">http://graphdatabases.com/</a></li>
<li style="text-align: justify;"><a id="neo4j"></a><a href="https://www.neo4j.com">www.neo4j.com</a></li>
<li style="text-align: justify;"><a href="/publications/document/?docid=160">Quick Review 72: Neo4j &#8211; Graph database management system</a> ; Smals Research, 2016</li>
</ol>
]]></content:encoded>
					
					<wfw:commentRss>https://staging.smalsresearch.be/bases-de-donnees-relationnelles-adequates-pour-des-relations/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
			</item>
		<item>
		<title>Un fraudeur ne fraude jamais seul, partie 2</title>
		<link>https://staging.smalsresearch.be/un-fraudeur-ne-fraude-jamais-seul-partie-2/</link>
					<comments>https://staging.smalsresearch.be/un-fraudeur-ne-fraude-jamais-seul-partie-2/#respond</comments>
		
		<dc:creator><![CDATA[Vandy Berten]]></dc:creator>
		<pubDate>Tue, 13 Dec 2016 07:55:41 +0000</pubDate>
				<category><![CDATA[[FR]]]></category>
		<category><![CDATA[Blog post]]></category>
		<category><![CDATA[big data]]></category>
		<category><![CDATA[Fraud]]></category>
		<category><![CDATA[Network Analytics]]></category>
		<category><![CDATA[social]]></category>
		<guid isPermaLink="false">/?p=10209</guid>

					<description><![CDATA[Dans l&#8217;article précédent, nous expliquions plusieurs scénarios dans lesquels des données de type &#8220;réseau&#8221; (à savoir un ensemble d&#8217;entités ou nœuds, comme des personnes ou des sociétés, reliées par un ensemble de liens ou relations, comme une relation de travail ou un lien d&#8217;amitié) sont collectées, et dans lesquels on cherche à identifier soit des structures particulières (comme dans le cas [&#8230;]]]></description>
										<content:encoded><![CDATA[<p style="text-align: justify;">Dans <a href="/un-fraudeur-ne-fraude-jamais-seul/">l&#8217;article précédent</a>, nous expliquions plusieurs scénarios dans lesquels des données de type &#8220;réseau&#8221; (à savoir un ensemble <em>d&#8217;entités </em>ou<em> </em><i>nœuds</i>, comme des personnes ou des sociétés, reliées par un ensemble de <em>liens</em> ou <em>relations, </em>comme une relation de travail ou un lien d&#8217;amitié) sont collectées, et dans lesquels on cherche à identifier soit des structures particulières (comme dans le cas de <a href="/un-fraudeur-ne-fraude-jamais-seul/#spider"><em>spider constructions</em></a>), soit des entités ayant des caractéristiques définies.</p>
<p style="text-align: justify;">L&#8217;analyse de réseau (souvent appelée en anglais <em>social network analytics</em>) reprend l&#8217;ensemble des techniques algorithmiques permettant d&#8217;extraire certaines informations utiles à partir des données d&#8217;un réseau. Nous allons ici présenter quelques éléments de base de ce type d&#8217;analyse.</p>
<h2 style="text-align: justify;">Simplifier</h2>
<figure id="attachment_10217" aria-describedby="caption-attachment-10217" style="width: 300px" class="wp-caption alignright"><a href="/wp-content/uploads/2016/12/network-e1481209058686.png"><img loading="lazy" decoding="async" class="wp-image-10217 size-medium" src="/wp-content/uploads/2016/12/network-e1481209058686-300x300.png" width="300" height="300" srcset="https://staging.smalsresearch.be/wp-content/uploads/2016/12/network-e1481209058686-300x300.png 300w, https://staging.smalsresearch.be/wp-content/uploads/2016/12/network-e1481209058686-150x150.png 150w, https://staging.smalsresearch.be/wp-content/uploads/2016/12/network-e1481209058686-768x768.png 768w, https://staging.smalsresearch.be/wp-content/uploads/2016/12/network-e1481209058686.png 1024w" sizes="auto, (max-width: 300px) 100vw, 300px" /></a><figcaption id="caption-attachment-10217" class="wp-caption-text">Réseau composé de personnes suspectes (P1-P5, orange), leurs employeurs (C1-C6, verts), les autres employés de ces employeyrs (a-t, bleu).</figcaption></figure>
<p style="text-align: justify;">Lorsqu&#8217;un organisme de contrôle (inspecteurs fiscaux ou sociaux, services de police ou de renseignements) collecte des données &#8220;réseau&#8221;, il est rapidement confronté à un volume très important de données. Supposons que l&#8217;organisme en question ait 5 personnes dans le collimateur (P1-P5, en orange dans le réseau ci-contre), soupçonnées d&#8217;activités criminelles ou frauduleuses dans le cadre de leur travail, et voudrait d&#8217;une part déterminer les liens qui existent entre ces 5 personnes, et d&#8217;autre part identifier d&#8217;autres personnes qui pourraient être très proches de suspects, et mériteraient donc une attention particulière.</p>
<p style="text-align: justify;">Une façon simple de faire serait de s&#8217;intéresser aux employeurs (présents et passés, en vert) de ces 5 personnes, puis à tous les autres employés de ces employeurs (en bleu, de &#8220;a&#8221; à &#8220;r&#8221;). Cela permettrait d&#8217;identifier des collègues en commun, et de voir à quel point les autres collègues sont liés.</p>
<h3 style="text-align: justify;">Supprimer les super-connecteurs</h3>
<p style="text-align: justify;">Le problème d&#8217;une telle recherche est que si l&#8217;un des suspects a travaillé pour une très grosse entreprise (un ministère, une société de transport public, une grande chaîne de magasin&#8230;), ce nœud va faire exploser la taille du réseau, le rendant totalement inexploitable.</p>
<figure id="attachment_10219" aria-describedby="caption-attachment-10219" style="width: 300px" class="wp-caption alignleft"><a href="/wp-content/uploads/2016/12/network-superconnecteurs.png"><img loading="lazy" decoding="async" class="wp-image-10219 size-medium" src="/wp-content/uploads/2016/12/network-superconnecteurs-300x300.png" width="300" height="300" srcset="https://staging.smalsresearch.be/wp-content/uploads/2016/12/network-superconnecteurs-300x300.png 300w, https://staging.smalsresearch.be/wp-content/uploads/2016/12/network-superconnecteurs-150x150.png 150w, https://staging.smalsresearch.be/wp-content/uploads/2016/12/network-superconnecteurs-768x768.png 768w, https://staging.smalsresearch.be/wp-content/uploads/2016/12/network-superconnecteurs.png 1024w" sizes="auto, (max-width: 300px) 100vw, 300px" /></a><figcaption id="caption-attachment-10219" class="wp-caption-text">Réseau original après la suppression du super-connecteur &#8220;C4&#8221;, en ne gardant que la composante connexe principale.</figcaption></figure>
<p style="text-align: justify;">Un exemple similaire apparaît si l&#8217;on veut retrouver des couples d&#8217;entreprises prétendument distinctes mais n&#8217;étant séparées que fictivement, en se basant entre autres sur leur adresse : certaines tours de bureaux dans des grandes villes sont parfois le siège social de plus de 1000 entreprises.</p>
<p style="text-align: justify;">Une technique classique consiste alors à ignorer de tels nœuds (entreprise, adresse), que l&#8217;on peut qualifier de super-connecteurs, ou à tout le moins de les masquer provisoirement. On y perd potentiellement des informations importantes, mais l&#8217;on rend le reste du réseau exploitable. Moins d&#8217;information donc, mais plus de valeur.</p>
<p style="text-align: justify;">Typiquement, la suppression de ces super-connecteurs va avoir pour conséquence de diviser le réseau en plus petits groupes, appelés &#8220;composantes connexes&#8221;, qui pourront être étudiées individuellement (cf image ci-dessus, où seule la plus grande composante connexe a été gardée).</p>
<p style="text-align: justify;">Techniquement parlant, le degré d&#8217;un nœud désigne le nombre de ses relations. Par exemple, le degré d&#8217;un nœud &#8220;Travailleur&#8221; sera le nombre de ses employés, et le degré d&#8217;un nœud &#8220;Entreprise&#8221; correspondra au nombre de ses travailleurs. Les super-connecteurs sont donc des nœuds avec un haut degré.</p>
<h3 style="text-align: justify;">Supprimer les feuilles isolées</h3>
<figure id="attachment_10220" aria-describedby="caption-attachment-10220" style="width: 300px" class="wp-caption alignright"><a href="/wp-content/uploads/2016/12/network-feuilles.png"><img loading="lazy" decoding="async" class="wp-image-10220 size-medium" src="/wp-content/uploads/2016/12/network-feuilles-300x300.png" width="300" height="300" srcset="https://staging.smalsresearch.be/wp-content/uploads/2016/12/network-feuilles-300x300.png 300w, https://staging.smalsresearch.be/wp-content/uploads/2016/12/network-feuilles-150x150.png 150w, https://staging.smalsresearch.be/wp-content/uploads/2016/12/network-feuilles-768x768.png 768w, https://staging.smalsresearch.be/wp-content/uploads/2016/12/network-feuilles.png 1024w" sizes="auto, (max-width: 300px) 100vw, 300px" /></a><figcaption id="caption-attachment-10220" class="wp-caption-text">Suppression des feuilles (nœuds de degré 1) n&#8217;étant pas un des nœuds orange (au cœur de l&#8217;analyse).</figcaption></figure>
<p style="text-align: justify;">À l&#8217;autre extrémité, une &#8220;feuille&#8221;, c&#8217;est-à-dire un nœud de degré 1, connecté à un et un seul nœud, a souvent peu de valeur lorsque l&#8217;on veut établir des connexions entre des personnes ou d&#8217;autres entités. Il est souvent intéressant, en tout cas dans une phase de l&#8217;analyse, d&#8217;éliminer toutes les feuilles qui ne sont pas les nœuds à l&#8217;origine de l&#8217;analyse (les 5 individus évoqués ci-dessus, dans l&#8217;exemple cité). L&#8217;image ci-contre illustre ce filtre. Avec ce filtre, il ne reste que deux &#8220;nouveaux collègues&#8221;. On voit en particulier que &#8220;r&#8221; a été collègue avec chacun des nœuds orange, via les sociétés C2, C3 et C5, et mérite peut-être une attention particulière.</p>
<p style="text-align: justify;">On peut même aller plus loin si on veut observer uniquement la &#8220;colonne vertébrale&#8221; d&#8217;un réseau, à savoir uniquement les nœuds principaux : on supprime alors tous les deux de degré inférieur à une valeur définie.</p>
<p style="text-align: justify;">Une technique alternative, appelée &#8220;k-core&#8221;, consiste à supprimer tous les nœuds de degré 1 (plus généralement, de degré k). De ce fait, des nœuds, qui avant avait un degré deux, mais étaient connectés à un nœud que l&#8217;on vient de supprimer, se retrouvent avec un degré de 1 (par exemple C6 dans la figure ci-dessus). Le filtre &#8220;k-core&#8221; les supprime également, jusqu&#8217;à ce que plus aucun nœud du réseau n&#8217;ait un degré inférieur à deux (plus généralement k+1).</p>
<h2 style="text-align: justify;">Distance</h2>
<p style="text-align: justify;">Après avoir collecté une série de nœuds et relations (provenant éventuellement de plusieurs sources), on peut se demander si deux individus, deux entreprises, deux organisations&#8230; ont des chances d&#8217;être en contact, même s&#8217;il n&#8217;existe pas de relation directe entre les deux. Différentes notions de &#8220;distance&#8221; permettent d&#8217;évaluer la proximité entre deux nœuds d&#8217;un réseau.</p>
<h3 style="text-align: justify;">Plus court chemin</h3>
<p style="text-align: justify;">La mesure de la distance la plus classique consiste à compter le nombre minimum de relations qu&#8217;il faut parcourir pour joindre deux nœuds. Dans l&#8217;exemple ci-dessus, le travailleur P1 et son entreprise C1 sont à une distance de 1, deux collègues seront à une distance de 2, et P3 et C5 à une distance de 3. On parle de nœuds voisins pour désigner deux nœuds séparés d&#8217;une distance 1.</p>
<p style="text-align: justify;">Différent algorithmes, dont les plus connus sont <a href="https://fr.wikipedia.org/wiki/Algorithme_de_Dijkstra" target="_blank" rel="noopener">Dijkstra</a> et <a href="https://fr.wikipedia.org/wiki/Algorithme_A*" target="_blank" rel="noopener">A*</a>, permettent de calculer efficacement cette distance.</p>
<h3 style="text-align: justify;">Similarité de Jaccard</h3>
<p style="text-align: justify;">La similarité de Jaccard entre deux nœuds N<sub>1</sub> et N<sub>2</sub> d&#8217;un réseau désigne le ratio entre le nombre de nœuds étant des voisins communs de N<sub>1</sub> et N<sub>2</sub>, et le nombre total de voisins de N<sub>1</sub> et N<sub>2</sub>. Si l&#8217;on parle d&#8217;un réseau d&#8217;amitié comme Facebook, une similarité de Jaccard de 1 entre deux personnes signifierait que tous leurs amis sont communs, c&#8217;est-à-dire qu&#8217;aucun des deux n&#8217;a d&#8217;ami qui n&#8217;est pas également ami avec l&#8217;autre. Une similarité de 0 indique que deux personnes n&#8217;ont aucun ami en commun. Dans l&#8217;exemple de Facebook, une similarité élevée indique qu&#8217;il y a beaucoup de chances que les deux individus se connaissent, même s&#8217;ils ne sont pas &#8220;amis Facebook&#8221;. En d&#8217;autres termes, si deux personnes ont 1000 amis chacun sur un réseau social, mais seulement 50 en commun, ils seront considérés comme moins proches que deux personnes ayant chacun 100 amis, dont 50 en commun.</p>
<p style="text-align: justify;">Dans notre exemple tout en haut de la page, P1 et P4 ont une similarité de Jaccard de 0,5 (2 voisins communs &#8211; C1 et C4 &#8211; et 4 au total &#8211; C1, C3, C4, C5), alors que P2 et P3 ont une similarité de 0.25 (1 voisin commun, 4 au total). Alors qu&#8217;en terme de distance simple, P1 et P4 sont séparés, comme P2 et P3, d&#8217;une distance de 2, la similarité de Jaccard nous enseigne que le premier couple est plus similaire que le second.</p>
<h2 style="text-align: justify;">Centralité</h2>
<figure id="attachment_10224" aria-describedby="caption-attachment-10224" style="width: 300px" class="wp-caption alignright"><a href="/wp-content/uploads/2016/12/network-betweenness.png"><img loading="lazy" decoding="async" class="wp-image-10224 size-medium" src="/wp-content/uploads/2016/12/network-betweenness-300x300.png" width="300" height="300" srcset="https://staging.smalsresearch.be/wp-content/uploads/2016/12/network-betweenness-300x300.png 300w, https://staging.smalsresearch.be/wp-content/uploads/2016/12/network-betweenness-150x150.png 150w, https://staging.smalsresearch.be/wp-content/uploads/2016/12/network-betweenness-768x768.png 768w, https://staging.smalsresearch.be/wp-content/uploads/2016/12/network-betweenness.png 1024w" sizes="auto, (max-width: 300px) 100vw, 300px" /></a><figcaption id="caption-attachment-10224" class="wp-caption-text">Taille des nœuds en fonction de leur &#8220;betweenness centrality&#8221;.</figcaption></figure>
<p style="text-align: justify;">Dans un réseau, tous les nœuds n&#8217;ont pas le même poids, la même importance. Il existe plusieurs façons de mesurer ce que l&#8217;on appelle la &#8220;centralité&#8221; d&#8217;un nœud. La mesure la plus simple, la &#8220;<a href="https://en.wikipedia.org/wiki/Centrality#Degree_centrality" target="_blank" rel="noopener">centralité de degré</a>&#8220;, consiste à dire qu&#8217;un nœud de degré plus important est plus central. La &#8220;centralité d&#8217;intermédiarité&#8221; (<a href="https://en.wikipedia.org/wiki/Betweenness_centrality" target="_blank" rel="noopener"><em>betweenness centrality</em></a>) évalue elle à quel point un nœud sert d&#8217;intermédiaire entre les autres nœuds. Le &#8220;<a href="https://en.wikipedia.org/wiki/PageRank" target="_blank" rel="noopener">PageRank</a>&#8221; de Google est également un algorithme de centralité : il consiste à considérer que la centralité se diffuse via les liens. Si une page web importante A possède un lien vers une autre page web B, B héritera d&#8217;une partie de l&#8217;importance de A.</p>
<p style="text-align: justify;">L&#8217;illustration ci-contre adapte la taille des nœuds en fonction de leur &#8220;betweenness centrality&#8221;. On y voit que le nœud &#8220;r&#8221; évoqué ci-dessus attire particulièrement l&#8217;attention par sa position centrale dans le réseau (en tant qu&#8217;intermédiaire).</p>
<h2 style="text-align: justify;"> Pour conclure</h2>
<p>Si cet article présente l&#8217;utilisation de l&#8217;analyse de réseau dans le cas de la fraude, son utilisation est beaucoup plus large que ça. Elle permet également de modéliser des réseaux d&#8217;ordinateurs ou de télécommunication (serveurs/routeurs reliés entre eux par des câbles ou autre), des processus d&#8217;entreprises (tel service transmet tel document/demande/formulaire à tel autre service), d&#8217;usinage (une machine reçoit certaines pièces, produit une nouvelle pièce qui transite vers une autre machine), ou pour des analyses plus conceptuelles (liens entre des langues, des lois, des idées politiques&#8230;).</p>
<p>Il va de soi que les techniques utilisées en réalité sont beaucoup plus complexes que ce qui est présenté ci-dessus, ultra-simplifié à des fins pédagogiques. Mais la philosophie reste la même.</p>
<p><span style="color: #999999;">Illustrations réalisée avec Gephi (www.gephi.org)</span></p>
]]></content:encoded>
					
					<wfw:commentRss>https://staging.smalsresearch.be/un-fraudeur-ne-fraude-jamais-seul-partie-2/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Un fraudeur ne fraude jamais seul</title>
		<link>https://staging.smalsresearch.be/un-fraudeur-ne-fraude-jamais-seul/</link>
					<comments>https://staging.smalsresearch.be/un-fraudeur-ne-fraude-jamais-seul/#respond</comments>
		
		<dc:creator><![CDATA[Vandy Berten]]></dc:creator>
		<pubDate>Tue, 09 Aug 2016 08:58:48 +0000</pubDate>
				<category><![CDATA[Blog post]]></category>
		<category><![CDATA[big data]]></category>
		<category><![CDATA[egov]]></category>
		<category><![CDATA[Fraud]]></category>
		<category><![CDATA[Network Analytics]]></category>
		<category><![CDATA[social]]></category>
		<guid isPermaLink="false">/?p=9761</guid>

					<description><![CDATA[Depuis toujours, certains essayent d&#8217;obtenir davantage que ce que la société veut leur accorder. Et depuis tout aussi longtemps, la société met un certain nombre de moyens en place pour prévenir ces abus. Aujourd&#8217;hui, la fraude occupe des équipes entières dans toutes les grandes banques, les assurances ou les institutions publiques et services de police et [&#8230;]]]></description>
										<content:encoded><![CDATA[<p style="text-align: justify;">Depuis toujours, certains essayent d&#8217;obtenir davantage que ce que la société veut leur accorder. Et depuis tout aussi longtemps, la société met un certain nombre de moyens en place pour prévenir ces abus. Aujourd&#8217;hui, la fraude occupe des équipes entières dans toutes les grandes banques, les assurances ou les institutions publiques et services de police et de renseignements. Si les techniques &#8220;classiques&#8221; (analyse individuelle et manuelle de dossiers, contrôles sur le terrain&#8230;) ont encore de beaux jours devant elles, tous ces organismes ont maintenant à leur disposition de très grandes quantités d&#8217;informations numériques à partir desquelles elles essayent de mettre en évidence des comportements suspects.</p>
<h1 style="text-align: justify;">Techniques classiques</h1>
<p style="text-align: justify;">Voyons quelques techniques, ultra-simplifiées ici à titre d&#8217;illustration, d&#8217;analyse de données permettant de suspecter des fraudes, et qui nécessiteront bien sûr, ensuite, une investigation plus approfondie.</p>
<h2 style="text-align: justify;"> Détection &#8220;d&#8217;outlier&#8221;</h2>
<p style="text-align: justify;">On peut raisonnablement estimer que, dans la restauration, le chiffre d&#8217;affaire et le nombre d&#8217;employés soient corrélés, c&#8217;est-à-dire que, en général et pour une même classe de restaurant et une même région, une enseigne avec plus de personnel aura un chiffre d&#8217;affaire plus important (les deux mesures étant liées à un troisième facteur, à savoir le nombre de tables ou de clients). Un organisme tel que le ministère des finances, qui possède ces deux données, pourrait donc dessiner un graphique en nuage de points, dans lesquels chaque point représente un restaurant ; sa position sur l&#8217;axe des abscisses représente son nombre d&#8217;employés et sur l&#8217;axe des ordonnées son chiffre d&#8217;affaire, tel qu&#8217;illustré ci-contre (données totalement fictives). <a href="/wp-content/uploads/2016/06/correlations.png"><img loading="lazy" decoding="async" class="alignleft size-medium wp-image-9795" src="/wp-content/uploads/2016/06/correlations-300x184.png" alt="correlations" width="300" height="184" srcset="https://staging.smalsresearch.be/wp-content/uploads/2016/06/correlations-300x184.png 300w, https://staging.smalsresearch.be/wp-content/uploads/2016/06/correlations-768x470.png 768w, https://staging.smalsresearch.be/wp-content/uploads/2016/06/correlations.png 799w" sizes="auto, (max-width: 300px) 100vw, 300px" /></a></p>
<p style="text-align: justify;">Dans l&#8217;exemple ci-contre, le point orange en haut à gauche représente un restaurant ayant soit un chiffre d&#8217;affaire particulièrement élevé (par rapport à son nombre d&#8217;employés), soit un nombre d&#8217;employés très bas (par rapport à son chiffre d&#8217;affaire). On pourrait dès lors suspecter qu&#8217;une partie du personnel ne soit pas déclaré, voire, pire, que du blanchiment d&#8217;argent soit en cours dans ce restaurant.</p>
<p style="text-align: justify;">De façon similaire, on pourrait suspecter dans le cas du point rouge (en bas) qu&#8217;il corresponde à un restaurant qui cache une partie de son chiffre d&#8217;affaire, ce qui pourrait inciter le service d&#8217;inspection à envoyer un de ses inspecteurs. En général, on appelle &#8220;outlier&#8221; une observation statistique qui se distingue nettement de la grande majorité des données. Il va de soi que dans la réalité, on fait ce genre d&#8217;exercice sur plus que deux variables.</p>
<h2 style="text-align: justify;">Analyse du comportement</h2>
<p style="text-align: justify;">Les voleurs de cartes de crédit ont souvent un comportement d&#8217;achat en ligne différent d&#8217;un utilisateur classique. Par exemple, un fraudeur utilisera souvent plusieurs numéros de cartes de crédit depuis le même ordinateur (et donc depuis la même adresse IP). On sait aussi que, souvent, un fraudeur qui vient de voler un numéro de carte de crédit commence par l&#8217;essayer sur un faible montant, puis ensuite effectue une série d&#8217;achats plus conséquents. Par ailleurs, un même numéro volé peut avoir été revendu à plusieurs personnes ; un même numéro utilisé depuis deux ordinateurs très distants sur un court laps de temps peut être également considéré comme suspect. En combinant ce genre de règles, on peut établir un score, qui, s&#8217;il dépasse un seuil défini, déclenche un processus de vérification (comme par exemple un appel téléphonique au propriétaire de la carte).</p>
<h2 style="text-align: justify;">Techniques de &#8220;Machine learning&#8221;</h2>
<p style="text-align: justify;">Comme la plupart des sociétés, les banques n&#8217;aiment pas prendre de risque, à moins qu&#8217;ils soient maîtrisés ou que le gain soit à hauteur du risque. Pour évaluer le risque qu&#8217;un client ne rembourse pas un crédit, les banques se servent souvent de techniques d&#8217;apprentissage automatique (<em>machine learning</em>). L&#8217;une d&#8217;entre elles consiste à fournir à un algorithme les données d&#8217;un grand nombre de crédit accordés par le passé (montant, nombre de mensualité, âge du créditeur, salaire, économies, situation familiale, autres crédits en cours, nombre de remboursements en retard, niveau d&#8217;études&#8230;), de façon à évaluer, lorsqu&#8217;un nouveau crédit est demandé, s&#8217;il doit être considéré comme risqué ou non. Autrement dit, on regardera si, dans une situation similaire (par rapport au créditeur et au crédit), les remboursements se passent en général bien ou non. Il s&#8217;agit de techniques de classification qui ont de nombreuses applications.</p>
<h2 style="text-align: justify;">Paradoxe du faux positif</h2>
<p style="text-align: justify;">Un des grands arguments des opposants à l&#8217;utilisation de données massives par les services de police et de renseignement est connu sous le nom du &#8220;paradoxe du faux positif&#8221;. Supposons que, parmi la population belge, que nous arrondirons à 10 millions d&#8217;individus, il y ait 100 terroristes susceptibles de passer à l&#8217;action, et que, sur base d&#8217;une combinaison de techniques présentées ci-dessus (basées, par exemple, sur les méta-données de ses communications téléphoniques et par courriel, ou sur base du comportement sur les réseaux sociaux), on établisse un test qui identifie un terroriste, avec une fiabilité de 99 %, c&#8217;est-à-dire que 99 % des individus testés seront correctement catégorisés (et 1 % sera mal catégorisé). Avec un tel test, 99 des 100 terroristes seront (en moyenne) correctement identifiés par notre test (un seul individu sera donc un &#8220;faux négatif&#8221;). Ce qui peut sembler encourageant&#8230; mais cela signifie également que, parmi les (presque) 10 millions de personnes fiables, 1 %, soit 100&#8217;000 personnes, seront également qualifiées de terroristes (il s&#8217;agit donc de faux positifs). On aura donc que parmi le groupe de 100&#8217;099 personnes considérées par le test comme terroriste,  moins d&#8217;un pour-cent sera en fait effectivement terroriste. Il ne sera clairement pas possible de tous les mettre sur écoute, ou de le faire surveiller.</p>
<p style="text-align: justify;">Pour neutraliser le terrorisme en se basant uniquement sur des données collectées, il faudra donc un test beaucoup plus fiable que celui à 99 % évoqué ci-dessus.</p>
<h2 style="text-align: justify;">Garbage In, Garbage Out</h2>
<p style="text-align: justify;">Par ailleurs, les chiffres présentés ci-dessous ne seront atteints que si les données sont de bonne qualité, c&#8217;est-à-dire que les données encodées correspondent à la réalité observable : les adresses des entreprises sont toujours correctes, un nom n&#8217;a pas mal été orthographié et confondu avec une autre personne&#8230; si ce n&#8217;est pas le cas, les résultats des algorithmes seront bien entendu encore moins fiables. D&#8217;où l&#8217;adage &#8220;garbage in, garbage out&#8221; : si on donne des données de mauvaise qualité à un algorithme, aussi performant soit-il, le résultat sera de mauvaise qualité. Or dans la réalité, il est d&#8217;une part impossible, à partir du moment où une personne encode des données, de s&#8217;assurer qu&#8217;elles soient toujours correctes, et d&#8217;autre part, la réalité évolue toujours plus vite que les données la représentant.</p>
<h2 style="text-align: justify;">Limites</h2>
<p style="text-align: justify;">Une caractéristique commune des méthodes présentées ci-dessous est que l&#8217;on analyse le comportement ou la position d&#8217;une entité en la comparant ensuite à des repères calculés au préalable (typiquement basés sur l&#8217;ensemble des autres entités). Mais on ne considère pas une entité dans sa relation avec d&#8217;autres entités. Or en général, les fraudeurs et criminels n&#8217;agissent pas seuls. Un entrepreneur monte une structure financière parce qu&#8217;un de ses collègues l&#8217;a fait avec succès avant lui ; une personne entre dans le monde de la délinquance parce qu&#8217;elle est en contact avec des gens qui en font déjà partie. C&#8217;est de façon générale ce que les sociologues appellent l&#8217;<a href="https://en.wikipedia.org/wiki/Homophily">homophilie</a> : qui se ressemble s&#8217;assemble, toute personne est influencée par son environnement et ses relations (à ne pas confondre avec l&#8217;acception plus répandue de l&#8217;homophilie concernant l&#8217;orientation sexuelle).</p>
<p style="text-align: justify;">De plus en plus, on s&#8217;intéresse au réseau social des entités considérées. Par réseau social, on n&#8217;entend bien sûr pas Facebook ou Twitter, mais un ensemble d&#8217;entités (personnes, entreprise, lieu&#8230;) et les relations qui existent entre elles (l&#8217;individu I travaille pour ou dirige l&#8217;entreprise E, qui a son siège social à l&#8217;adresse A, I<sub>1 </sub>a téléphoné à I<sub>2</sub>&#8230;).</p>
<h1 style="text-align: justify;">Analyse de réseaux sociaux</h1>
<p style="text-align: justify;">Un réseau (ou un graphe) est donc une abstraction mathématique qui représente un ensemble d&#8217;entités (appelées nœuds), dont certaines sont reliées entre elles (au travers de liens, ou d&#8217;arcs). Un <a href="/ce-quun-reseau-social-peut-nous-apprendre/" target="_blank" rel="noopener">blog y a déjà été consacré il y a quelques temps</a>. Dans la majorité des pays du monde, les services officiels, tels que ceux liés à la sécurité sociale, au ministère des finances ou de l&#8217;économie, disposent d&#8217;un grand nombre d&#8217;informations pouvant être vues comme un réseau :</p>
<ul style="text-align: justify;">
<li>Une personne P travaille, est gérante ou administratrice d&#8217;une entreprise E. P et E sont les nœuds, l&#8217;arc est la relation de travail ;</li>
<li>Une entreprise E a son siège social à l&#8217;adresse A (éventuellement commune à d&#8217;autres entreprises) ;</li>
<li>Une entreprise E<sub>1</sub> sous-traite une partie d&#8217;un travail, comme un chantier de construction, auprès d&#8217;une entreprise E<sub>2</sub>.</li>
</ul>
<p style="text-align: justify;">Pour chacune de ces relations, l&#8217;arc peut disposer d&#8217;un certain nombre de labels ou d&#8217;attributs : date de début, date de fin, type de relation (&#8220;travailleur&#8221;, &#8220;gérant&#8221;, &#8220;siège social&#8221;&#8230;), éventuellement poids de la relation (nombre de parts d&#8217;un actionnaire, montant financier d&#8217;une sous-traitance&#8230;).</p>
<p style="text-align: justify;">Des services de police ou de renseignements peuvent également disposer d&#8217;autres informations :</p>
<ul style="text-align: justify;">
<li>Une personne P<sub>1</sub> téléphone à une personne P<sub>2</sub> ;</li>
<li>Une personne P<sub>1</sub> est le père/frère/cousin d&#8217;une personne P<sub>2</sub> ;</li>
<li>Une personne P a été vue à l&#8217;endroit X.</li>
</ul>
<h2 style="text-align: justify;"><a id="spider"></a>Faillite organisée</h2>
<p style="text-align: justify;">Une technique de fraude sociale répandue consiste à créer une société, y engager du personnel et le rémunérer, éventuellement commander des fournitures et, juste avant de devoir payer les charges sociales ou les fournisseurs, s&#8217;arranger pour mettre la société en faillite. Il suffit alors de recommencer le même processus, idéalement dans une autre région pour ne pas tomber sur les mêmes juges ou curateurs. Ce type de fraude est connu sur le nom de &#8220;spider construction&#8221; (<a href="https://web.archive.org/web/20191120041225/http://www3.cs.stonybrook.edu/~leman/pubs/15-ASONAM-ActiveInferenceforFraud.pdf" target="_blank" rel="noopener">ref1</a>, <a href="https://ieeexplore.ieee.org/document/6785796" target="_blank" rel="noopener">ref2</a>). Le schéma est en général complexe : on a par exemple deux associés, qui s&#8217;associent chaque fois à des personnes différentes pour créer différentes sociétés fictives ; avec de temps en temps des sous-traitants complices, de temps en temps victimes. <a href="/wp-content/uploads/2016/08/spin-constructie.png"><img loading="lazy" decoding="async" class="alignleft wp-image-9856 size-medium" src="/wp-content/uploads/2016/08/spin-constructie-285x300.png" width="285" height="300" srcset="https://staging.smalsresearch.be/wp-content/uploads/2016/08/spin-constructie-285x300.png 285w, https://staging.smalsresearch.be/wp-content/uploads/2016/08/spin-constructie.png 534w" sizes="auto, (max-width: 285px) 100vw, 285px" /></a>Un fraudeur peut par ailleurs être gérant d&#8217;une compagnie, puis administrateur d&#8217;une autre et comptable de la troisième.</p>
<p style="text-align: justify;">La figure ci-contre illustre un exemple, dans lequel trois sociétés (1, 2, 3, marquées par une croix rouge) ont déjà fait faillite, et par lesquelles les deux individus du milieu sont passés. Par ailleurs, une société a été sous-traitante pour les trois sociétés en question. La société 4 mérite toute l&#8217;attention des inspecteurs : elle partage à la fois les deux personnes &#8220;suspectes&#8221;, ainsi que le sous-traitant potentiellement complice.</p>
<h2 style="text-align: justify;">Homophilie et diffusion</h2>
<p style="text-align: justify;">La technique précédente ne présuppose aucune connaissance par rapport au caractère frauduleux de certaines personnes. Mais souvent, les services d&#8217;inspection ont un historique et ont déjà pu découvrir de nombreux cas de fraude. Cette connaissance peut alors être utilisée. On se base alors sur le principe de l&#8217;homophilie déjà évoqué ci-dessus : on a plus de chance de trouver un fraudeur (ou plus généralement un criminel) dans l&#8217;entourage proche d&#8217;un autre fraudeur qu&#8217;en inspectant une personne ou une entreprise totalement au hasard. On constate également que plus une entreprise est liée à une entreprise où de la fraude a été mise à jour (beaucoup de responsables en commun, des sous-traitants identiques&#8230;), plus y a de la chance d&#8217;y trouver de la fraude.</p>
<p style="text-align: justify;"><a href="/wp-content/uploads/2016/08/homophily.png"><img loading="lazy" decoding="async" class="alignright size-medium wp-image-9877" src="/wp-content/uploads/2016/08/homophily-300x298.png" alt="homophily" width="300" height="298" srcset="https://staging.smalsresearch.be/wp-content/uploads/2016/08/homophily-300x298.png 300w, https://staging.smalsresearch.be/wp-content/uploads/2016/08/homophily-150x150.png 150w, https://staging.smalsresearch.be/wp-content/uploads/2016/08/homophily.png 666w" sizes="auto, (max-width: 300px) 100vw, 300px" /></a>Dans l&#8217;exemple ci-contre, une fraude a été mise au jour au sein de la société B, au centre (macaron rouge). On va dès lors examiner toutes les entreprises &#8220;voisines&#8221;, c&#8217;est-à-dire ayant partagé des employés (pas nécessairement simultanément), travaillé sur des chantiers communs (s&#8217;il s&#8217;agit d&#8217;entreprises de construction), ou utilisant des mêmes fournisseurs ou sous-traitants. Une relation ayant duré plus longtemps sera considérée comme plus &#8220;forte&#8221; (lignes plus épaisses dans le schéma ci-contre).</p>
<p style="text-align: justify;">L&#8217;entreprise A étant plus fortement connectée à B que C, elle sera considérée comme plus à risque (macaron rose foncé pour A, pâle pour C). Par ailleurs, si A était également proche d&#8217;une autre entreprise aussi considérée comme à risque, cela ferait augmenter son &#8220;score de risque&#8221; en conséquence.</p>
<p style="text-align: justify;">Plus généralement, les techniques utilisées pour diffuser les scores de risques sont proches de l&#8217;algorithme <a href="https://fr.wikipedia.org/wiki/PageRank" target="_blank" rel="noopener">&#8220;PageRank&#8221; de Google</a>, utilisé pour trier les résultats d&#8217;une recherche. Plus une page est importante, plus elle donnera de l&#8217;importance aux pages vers lesquelles elle a des liens.</p>
<h2 style="text-align: justify;">Dynamique des réseaux</h2>
<p style="text-align: justify;"><a href="/wp-content/uploads/2016/07/phonecalls.png"><img loading="lazy" decoding="async" class="alignleft wp-image-9837" src="/wp-content/uploads/2016/07/phonecalls-459x1024.png" alt="phonecalls" width="300" height="670" srcset="https://staging.smalsresearch.be/wp-content/uploads/2016/07/phonecalls-459x1024.png 459w, https://staging.smalsresearch.be/wp-content/uploads/2016/07/phonecalls-134x300.png 134w, https://staging.smalsresearch.be/wp-content/uploads/2016/07/phonecalls.png 663w" sizes="auto, (max-width: 300px) 100vw, 300px" /></a>Dans le but d&#8217;éviter d&#8217;être repérés par la police, il n&#8217;est pas rare que deux individus ne se contactent jamais directement, mais passent systématiquement par un intermédiaire pour se transmettre des informations. Si l&#8217;on considère toutes les conversations téléphoniques entre les membres d&#8217;un groupe sous surveillance, comme illustré ci-contre, on pourrait penser que Charline n&#8217;est jamais en contact avec Bob, et que Danièle ne communique pas avec Frank.</p>
<p style="text-align: justify;">Mais si l&#8217;on observe ce réseau comme un film, en ne considérant que les contacts ayant eu lieu sur une fenêtre de temps relativement courte, on pourrait apercevoir que, chaque fois que Danièle contacte Éric, celui-ci contacte Frank dans la foulée (temps 1), et que dans les minutes qui suivent chaque appel de Charline à Éric, ce dernier appelle systématiquement Bob (temps 2).</p>
<p style="text-align: justify;">On peut donc en conclure que Danièle et Frank sont plus que probablement en contact (indirect), ainsi que Charline et Bob, et que, dans les deux cas Éric sert d&#8217;intermédiaire.</p>
<p style="text-align: justify;">De façon générale, si l&#8217;on peut déjà obtenir beaucoup d&#8217;information d&#8217;un réseau &#8220;statique&#8221;, considérer sa composante dynamique ou temporelle apporte souvent de nombreux renseignements précieux.</p>
<h1 style="text-align: justify;">Conclusions</h1>
<p style="text-align: justify;">L&#8217;analyse de réseaux sociaux (ou Social Network Analytics) est une des grandes tendances du moment en matière de lutte contre la fraude. Les grands fournisseurs de logiciels que sont SAS ou IBM mettent par ailleurs beaucoup de moyens dans le développement d&#8217;outils tels que <a href="https://support.sas.com/software/products/sna/" target="_blank" rel="noopener">SAS SNA</a> ou <a href="https://www-03.ibm.com/software/products/fr/ibase" target="_blank" rel="noopener">IBM I2</a>, avec pour cible tant les grandes sociétés privées (banques, assurances, télécommunication&#8230;) que les services publiques (sécurité sociale, finance, police&#8230;).</p>
<p style="text-align: justify;">Avec des outils d&#8217;analyse de réseaux dans des environnements &#8220;Big Data&#8221;, des outils comme <a href="https://spark.apache.org/graphx/" target="_blank" rel="noopener">GraphX </a>de <a href="https://spark.apache.org/" target="_blank" rel="noopener">Spark</a> (compatible avec <a href="https://fr.wikipedia.org/wiki/Hadoop" target="_blank" rel="noopener">Hadoop</a>) ouvrent encore de nouvelles possibilités, étant donné la quantité de plus en plus importante de données à la disposition des organismes, et la complexité de certains algorithmes.</p>
<p style="text-align: justify;">Il va de soi de ces nouvelles possibilités d&#8217;analyse posent des questions en matière de vie privée. On peut par exemple techniquement sans difficulté combiner des données officielles avec des données publiques <a href="/facebook-peut-on-vraiment-cacher-sa-liste-damis/" target="_blank" rel="noopener">collectées sur Facebook</a> ou Twitter. Ceux qui font donc ce genre d&#8217;analyse doivent s&#8217;assurer de le faire en conformité avec la loi. Et il va dans l&#8217;intérêt du citoyen lambda de faire attention à ce qu&#8217;il laisse trainer sur les réseaux sociaux.</p>
<p style="text-align: justify;">Références :</p>
<ul>
<li style="text-align: justify;">[book] &#8220;<a href="https://eu.wiley.com/WileyCDA/WileyTitle/productCd-1119133122.html"><em>Fraud Analytics ; using descriptive, predictive and social network techniques</em></a>&#8220;, B. Baesens, V. Van Vlasselaer &amp; W. Verkere, Winley, 2015</li>
<li style="text-align: justify;">
<p><a href="https://www.youtube.com/watch?v=6H5Lp3i05Cg" target="_blank" rel="noopener">Social Network Analysis for Fraud Detection</a> (B. Baesens, V. Van Vlasselaer)</li>
<li style="text-align: justify;">
<p><a href="https://www.youtube.com/watch?v=XYk4Xtad0Bg" target="_blank" rel="noopener">Social Networks for Fraud Analytics</a> (B. Baesens, V. Van Vlasselaer)</li>
</ul>
<p style="text-align: justify;"><span style="color: #999999;">Schémas réalisés avec yEd (<a style="color: #999999;" href="https://yed.yworks.com" target="_blank" rel="noopener">http://yed.yworks.com</a>)</span></p>
<p>&nbsp;</p>
]]></content:encoded>
					
					<wfw:commentRss>https://staging.smalsresearch.be/un-fraudeur-ne-fraude-jamais-seul/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
