-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmedias_francais.html
693 lines (617 loc) · 27.3 KB
/
medias_francais.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
<style type="text/css" media="screen">
/*
.nodes-image {
margin:-100;
}
*/
@import url("//maxcdn.bootstrapcdn.com/font-awesome/4.4.0/css/font-awesome.min.css");
.imageblock .content img, .image img {max-width: 900px;max-height: 300px;}
.deck h3, .deck h4 {display: block !important;margin-bottom:8px;margin-top:5px;}
.listingblock {margin:8px;}
.pull-bottom {position:relative;bottom:1em;}
.admonitionblock td.icon [class^="fa icon-"]{font-size:2.5em;text-shadow:1px 1px 2px rgba(0,0,0,.5);cursor:default}
.admonitionblock td.icon .icon-note:before{content:"\f05a";color:#19407c}
.admonitionblock td.icon .icon-tip:before{content:"\f0eb";text-shadow:1px 1px 2px rgba(155,155,0,.8);color:#111}
.admonitionblock td.icon .icon-warning:before{content:"\f071";color:#bf6900}
.admonitionblock td.icon .icon-caution:before{content:"\f06d";color:#bf3400}
.admonitionblock td.icon .icon-important:before{content:"\f06a";color:#bf0000}
.admonitionblock.note.speaker { display:none; }
</style>
<style type="text/css" media="screen">
/* #editor.maximize-editor .CodeMirror-code { font-size:24px; line-height:26px; } */
</style>
<article class="guide" ng-controller="AdLibDataController">
<carousel class="deck container-fluid">
<!--slide class="row-fluid">
<div class="col-sm-3">
<h3>Guide de chargement des médias français/francophones</h3>
<p class="lead">Information</p>
<!dl>
</dl>
</div>
<div class="col-sm-9">
<figure>
<img style="width:300px" src=""/>
</figure>
</div>
</slide-->
<slide class="row-fluid">
<div class="col-sm-12">
<h3>Guide de chargement des médias français/francophones</h3>
<br/>
<div>
<div class="paragraph">
<p>Jérôme BATON
v0.6, 2018-07-25
:toc: right
:imagesdir: images</p>
</div>
<div class="paragraph">
<p>Ce guide est écrit en asciidoc et convertit en html.</p>
</div>
<div class="paragraph">
<p>Son URL d’origine est <a href="https://wadael.github.io/presse_fr/medias_francais.adoc" class="bare">https://wadael.github.io/presse_fr/medias_francais.adoc</a></p>
</div>
<h4>Description</h4>
<div class="paragraph">
<p>Ce guide a pour vocation de nous faire comprendre qui possède quoi dans les médias français en jouant avec quelques données tout en apprenant certaines fonctionnalités de Neo4j.</p>
</div>
<div class="paragraph">
<p>Cela nous permettra de voir:</p>
</div>
<div class="ulist">
<ul>
<li>
<p>Comment charger ces informations</p>
</li>
<li>
<p>Appliquer différents algorithmes</p>
</li>
<li>
<p>répondre à quelques questions</p>
</li>
</ul>
</div>
<div class="admonitionblock note">
<table>
<tr>
<td class="icon">
<i class="fa icon-note" title="Note"></i>
</td>
<td class="content">
Ce guide n’a aucune prétention journalistique et n’est pas le résultat de longues heures d’enquêtes. Juste l’occasion de jouer avec des données publiques pour en tirer quelques informations.
</td>
</tr>
</table>
</div>
</div>
</div>
</slide>
<slide class="row-fluid">
<div class="col-sm-12">
<h3>Récupération des informations</h3>
<br/>
<div>
<div class="paragraph">
<p>Les informations sur les médias français sont partagées par Le Monde Diplomatique, à cette adresse <a href="https://github.com/mdiplo/Medias_francais" class="bare">https://github.com/mdiplo/Medias_francais</a>.</p>
</div>
<div class="paragraph">
<p>Merci beaucoup à eux.</p>
</div>
<div class="paragraph">
<p>Récupérez les deux fichiers .tsv et déposez-les dans le répertoire import de votre instance Neo4j.</p>
</div>
<div class="paragraph">
<p>Il s’agit de fichiers texte comparables à des fichiers CSV mis à part que le délimiteur est la tabulation et non la virgule.</p>
</div>
<div class="paragraph">
<p>De ce fait, nous pourrons utiliser notre chère instruction LOAD CSV.</p>
</div>
</div>
</div>
</slide>
<slide class="row-fluid">
<div class="col-sm-12">
<h3>Modélisation</h3>
<br/>
<div>
<div class="paragraph">
<p>Le fichier <em>medias_francais.tsv</em> contient des entités qui peuvent être des Personnes physiques, des personnes morales ou des médias.</p>
</div>
<div class="paragraph">
<p>Le fichier <em>relations_medias_francais.tsv</em> contient les relations entre ces entités. Le champs 'valeur' indique le degré de possession de l’entité 'source' sur l’entité 'cible'. Cela permettra de créer une relation 'POSSEDE' entre les entités</p>
</div>
<h4>Etiquettes</h4>
<div class="paragraph">
<p>Les étiquettes que j’envisage sont: Entite, Personne_Morale, Personne_Physique et Média.</p>
</div>
<div class="paragraph">
<p>Par rapport aux données en entrée, il faut donc faire des transformations mineures lors de l’import.</p>
</div>
<div class="paragraph">
<p>Il faudrait passer de</p>
</div>
<div class="ulist">
<ul>
<li>
<p>Média à Media (optionnel)</p>
</li>
<li>
<p>Personne morale à Personne_Morale</p>
</li>
<li>
<p>Personne physique à Personne_Physique</p>
</li>
</ul>
</div>
<div class="paragraph">
<p>Il faut au minimum se débarasser des espaces pour ne pas avoir à entourer les noms avec des guillements inversés (altgr+7).</p>
</div>
<div class="paragraph">
<p>Vu le faible volume de données, la création d’index n’est pas utile pour ne pas avoir à attendre les requêtes.</p>
</div>
<div class="paragraph">
<p>Néanmoins, elle se fera lors de la création de la contrainte suivante :</p>
</div>
<div class="listingblock">
<div class="content">
<pre mode="cypher" class="highlight pre-scrollable programlisting cm-s-neo code runnable standalone-example ng-binding" data-lang="cypher" lang="cypher"><!--code class="cypher language-cypher"-->CREATE CONSTRAINT ON (e:Entite) ASSERT e.nom IS UNIQUE<!--/code--></pre>
</div>
</div>
</div>
</div>
</slide>
<slide class="row-fluid">
<div class="col-sm-12">
<h3>Chargement des données</h3>
<br/>
<div>
<h4>Le code</h4>
<div class="paragraph">
<p>Pour chargers les données, je vous propose ces codes.</p>
</div>
<div class="listingblock">
<div class="content">
<pre mode="cypher" class="highlight pre-scrollable programlisting cm-s-neo code runnable standalone-example ng-binding" data-lang="cypher" lang="cypher"><!--code class="cypher language-cypher"-->LOAD CSV WITH HEADERS FROM 'file:///medias_francais.tsv' AS line FIELDTERMINATOR '\t'
MERGE (node0:Entite{nom: line.nom})
FOREACH(uselessVar IN CASE WHEN trim(line.`rangChallenges`) <> "" THEN [1] ELSE [] END | SET node0.rangchallenges= toInt(line.`rangChallenges`))
FOREACH(uselessVa IN CASE WHEN trim(line.`mediaType`) <> "" THEN [1] ELSE [] END | SET node0.mediaEchelle = line.`mediaType`)
FOREACH(uselessV IN CASE WHEN trim(line.`mediaPeriodicite`) <> "" THEN [1] ELSE [] END | SET node0.mediaPeriodicite = line.`mediaPeriodicite`)
FOREACH(useless IN CASE WHEN trim(line.`mediaEchelle`) <> "" THEN [1] ELSE [] END | SET node0.mediaEchelle = line.`mediaEchelle`)
FOREACH(u IN CASE WHEN trim(line.commentaire) <> "" THEN [1] ELSE [] END | SET node0.commentaire = line.commentaire)
WITH node0,line
CALL apoc.create.addLabels(node0,[replace(line.`typeLibelle`," ","_")]) YIELD node
RETURN node<!--/code--></pre>
</div>
</div>
<div class="paragraph">
<p>Et pour charger le deuxième fichier, le code est:</p>
</div>
<div class="listingblock">
<div class="content">
<pre mode="cypher" class="highlight pre-scrollable programlisting cm-s-neo code runnable standalone-example ng-binding" data-lang="cypher" lang="cypher"><!--code class="cypher language-cypher"-->LOAD CSV WITH HEADERS FROM 'file:///relations_medias_francais.tsv' AS ligne FIELDTERMINATOR '\t'
MERGE (nodeO:Entite{nom: ligne.origine})
MERGE (nodeC:Entite{nom: ligne.cible})
MERGE (nodeO)-[p:POSSEDE]->(nodeC)
FOREACH(u IN CASE WHEN trim(ligne.valeur) <> "" THEN [1] ELSE [] END | SET p.valeur = toInt(ligne.valeur))
FOREACH(u IN CASE WHEN trim(ligne.source) <> "" THEN [1] ELSE [] END | SET p.source = ligne.source)
FOREACH(u IN CASE WHEN trim(ligne.datePublication) <> "" THEN [1] ELSE [] END | SET p.datePublication = ligne.datePublication)<!--/code--></pre>
</div>
</div>
</div>
</div>
</slide>
<slide class="row-fluid">
<div class="col-sm-12">
<h3>Aperçu</h3>
<br/>
<div>
<div class="paragraph">
<p>Utilisons le Neo4j Browser pour jeter un oeil sur les données chargées. Voyons qui possède quoi avec cette requête.</p>
</div>
<div class="listingblock">
<div class="content">
<pre mode="cypher" class="highlight pre-scrollable programlisting cm-s-neo code runnable standalone-example ng-binding" data-lang="cypher" lang="cypher"><!--code class="cypher language-cypher"-->MATCH paf = (pp:Personne_physique)-[:POSSEDE*]->(m:Média)
RETURN paf<!--/code--></pre>
</div>
</div>
</div>
</div>
</slide>
<slide class="row-fluid">
<div class="col-sm-12">
<h3>Pagerank</h3>
<br/>
<div>
<div class="paragraph">
<p>Lançons un petit PageRank, histoire de voir. C’est un algorithme qui permet d’identifier les noeuds les plus connectés (cela nécessite d’aoir installé APOC).</p>
</div>
<div class="listingblock">
<div class="content">
<pre mode="cypher" class="highlight pre-scrollable programlisting cm-s-neo code runnable standalone-example ng-binding" data-lang="cypher" lang="cypher"><!--code class="cypher language-cypher"-->MATCH (node:Entite)
WITH collect(node) AS nodes
CALL apoc.algo.pageRank(nodes) YIELD node, score
RETURN node.nom, score
ORDER BY score DESC<!--/code--></pre>
</div>
</div>
<div class="paragraph">
<p>La requête nous renvoie en premier les noeuds les plus connectés.</p>
</div>
<div class="paragraph">
<p>De façon surprenante, le top 3 que j’obtiens avec les données courantes est</p>
</div>
<table class="table tableblock frame-all grid-all" style="width: 100%;">
<colgroup>
<col style="width: 50%;">
<col style="width: 50%;">
</colgroup>
<tbody>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">"La Tribune"</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">0.69473</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">"Hima Groupe"</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">0.64087</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">"Arte"</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">0.62095</p></td>
</tr>
</tbody>
</table>
<div class="paragraph">
<p>Faisons de même pour les personnes morales. Le top 3 devient</p>
</div>
<table class="table tableblock frame-all grid-all" style="width: 100%;">
<colgroup>
<col style="width: 50%;">
<col style="width: 50%;">
</colgroup>
<tbody>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">"Hima Groupe"</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">0.64087</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">"Groupe Rossel La Voix"</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">0.51337</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">"Lagardère Active"</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">0.49425</p></td>
</tr>
</tbody>
</table>
<div class="paragraph">
<p>N’étant pas pas familier des médias, je ne connais pas ces sociétés.</p>
</div>
<div class="paragraph">
<p>Passons aux personnes physiques:</p>
</div>
<div class="listingblock">
<div class="content">
<pre mode="cypher" class="highlight pre-scrollable programlisting cm-s-neo code runnable standalone-example ng-binding" data-lang="cypher" lang="cypher"><!--code class="cypher language-cypher"-->MATCH (no:Personne_physique) WITH collect(no) AS nodes
CALL apoc.algo.pageRankWithConfig(nodes,{types:'POSSEDE'}) YIELD node, score
RETURN node.nom, score
ORDER BY score DESC<!--/code--></pre>
</div>
</div>
<div class="paragraph">
<p>Et là, chose surprenante, tous les individus listés ont un score de 0.15</p>
</div>
<div class="paragraph">
<p>Ce qui signifie qu’ils ont tous les même nombre de connections. Ah …​</p>
</div>
<div class="paragraph">
<p>Alors, cherchons qui possède le plus de médias.</p>
</div>
<div class="listingblock">
<div class="content">
<pre mode="cypher" class="highlight pre-scrollable programlisting cm-s-neo code runnable standalone-example ng-binding" data-lang="cypher" lang="cypher"><!--code class="cypher language-cypher"-->MATCH (pp:Personne_physique)-[p:POSSEDE]->(m:Média)
RETURN pp.nom, collect(m.nom) as titres, size(collect(m.nom)) as nbTitres ORDER BY nbTitres DESC<!--/code--></pre>
</div>
</div>
<div class="paragraph">
<p>Le surprenant résultat est normal, il n’indique que les possessions directes.</p>
</div>
<div class="paragraph">
<p>Voici de quoi obtenir un résultat plus parlant, en utilisant toujours la relation POSSEDE mais aussi de façon indirecte, avec la prise en compte de la possession de personne morale qui possède le média.</p>
</div>
<div class="listingblock">
<div class="content">
<pre mode="cypher" class="highlight pre-scrollable programlisting cm-s-neo code runnable standalone-example ng-binding" data-lang="cypher" lang="cypher"><!--code class="cypher language-cypher"-->MATCH (pp:Personne_physique)-[p:POSSEDE*]->(m:Média)
RETURN pp.nom, collect(m.nom) as titres, size(collect(m.nom)) as nbTitres ORDER BY nbTitres DESC<!--/code--></pre>
</div>
</div>
<div class="paragraph">
<p>Cela nous donne un résultat plus crédible.</p>
</div>
</div>
</div>
</slide>
<slide class="row-fluid">
<div class="col-sm-12">
<h3>Corrélation nombre de médias et rang Challenges ?</h3>
<br/>
<div>
<div class="paragraph">
<p>Voyons maintenant si le rang donné par le magazine Challenges et le nombre de journaux possédés sont en rapport.
D’après vous ?</p>
</div>
<div class="paragraph">
<p>Voici la requête Cypher</p>
</div>
<div class="listingblock">
<div class="content">
<pre mode="cypher" class="highlight pre-scrollable programlisting cm-s-neo code runnable standalone-example ng-binding" data-lang="cypher" lang="cypher"><!--code class="cypher language-cypher"-->MATCH (pp:Personne_physique)-[p:POSSEDE*..]->(m:Média)
RETURN coalesce(toInt(pp.rangchallenges),0) as rang, size(collect(m.nom)) as nbTitres ORDER BY rang ASC<!--/code--></pre>
</div>
</div>
<div class="paragraph">
<p>Pour visualiser le résultat rapidement, j’utilise Spoon (:play spoon.html) qui me permet d’obtenir ce graphique, avec en x le rang, et en y le nombre de titres</p>
</div>
<div class="imageblock">
<div class="content">
<img src="https://wadael.github.io/presse_fr/images/barchart_presse_01.png" alt="barchart presse 01">
</div>
</div>
<div class="paragraph">
<p>Le rang 0 est attibué aux personnes n’ayant pas de rang renseigné. De ce fait, la première colonne est haute.</p>
</div>
<div class="paragraph">
<p>Benoitement, je m’attendais à une belle pente descendante.
Il n’en est rien. Soit.</p>
</div>
</div>
</div>
</slide>
<slide class="row-fluid">
<div class="col-sm-12">
<h3>Aggrégation de données</h3>
<br/>
<div>
<div class="paragraph">
<p>Une liste de médias est un bon point de départ.
Mais …​.</p>
</div>
<div class="paragraph">
<p>Il y a d’autres informations qui seraient intéressantes d’intégrer, comme le montant des aides étatiques, les volumes de diffusion.</p>
</div>
<div class="paragraph">
<p>En tant que contribuable français, je voudrais voir à quels journaux et par extension à quelles personnes bénéficient les aides de l’état à la presse.</p>
</div>
<div class="paragraph">
<p>Il y a aussi le nombre d’exemplaires par média qui me semble pertinent afin de voir le poids des individus sur la diffusion des informations.</p>
</div>
<h4>Aides à la presse</h4>
<div class="paragraph">
<p>J’ai trouvé les montants sur un site qui archive le web <a href="http://archive.wikiwix.com/cache/?url=https%3A%2F%2Fwww.data.gouv.fr%2Ffr%2Fdatasets%2Faides-a-la-presse-classement-des-titres-de-presse-aides%2F">ici</a>, <a href="https://www.data.gouv.fr/fr/datasets/aides-a-la-presse-classement-des-titres-de-presse-aides/">là</a> pour les années 2012 à 2016.</p>
</div>
<div class="paragraph">
<p>Cela est, comme souvent, proposé au format xls, donc une conversion vers le format csv s’avère nécessaire. Premier ralentissement.</p>
</div>
<div class="paragraph">
<p>Ensuite, le MATCHing se fera sur le nom du média hors, les noms ne suivent pas la même nomenclature.</p>
</div>
<div class="paragraph">
<p>Le Figaro et Figaro (Le) ne sont pas la même chose pour l’instruction MATCH.
De plus, tous les bénéficiaires ne sont pas forcément des médias. Deuxième ralentissement.</p>
</div>
<div class="paragraph">
<p>Pour preuve, les deux bénéficiaires les plus importants sont:</p>
</div>
<table class="table tableblock frame-all grid-all" style="width: 100%;">
<colgroup>
<col style="width: 50%;">
<col style="width: 50%;">
</colgroup>
<tbody>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">SOCIETE COMMUNE POUR LES INFRASTRUCTURES DE LA DISTRIBUTION DE LA PRESSE</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">4 419 926,00 €</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">IMPRIMERIE DE L’AVESNOIS</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">2 503 123,00 €</p></td>
</tr>
</tbody>
</table>
<div class="paragraph">
<p>D’autres bénéficiaires sont des sites internet regroupés, comme j7.agefi.fr; agefi.fr; L’Agefi Hebdo Magazine pour 159 708,00 €</p>
</div>
<div class="paragraph">
<p>Ce premier fichier trouvé n’est pas utilisable en l’état.</p>
</div>
<h4>Volumes</h4>
<div class="paragraph">
<p>Pour les médias de presse écrite, les volumes de diffusion annuels seraient aussi un bon indicateur.
Quels sont les titres qui recoivent le plus par exemplaire, et par extension quelle personne physique reçoit le plus de subventions.</p>
</div>
</div>
</div>
</slide>
<slide class="row-fluid">
<div class="col-sm-12">
<h3>Coup double !</h3>
<br/>
<div>
<div class="paragraph">
<p>J’ai trouvé <a href="https://www.data.gouv.fr/fr/datasets/r/6f66e292-c4d9-439e-916d-26257107833a">une URL</a> qui correspond à un fichier CSV ayant à la fois des indications sur le volume des ventes et les aides reçues.</p>
</div>
<div class="paragraph">
<p>Une petite vérification avant d’écrire l’import: faire afficher les informations voulues des cinq premières lignes</p>
</div>
<div class="paragraph">
<p>Certains journaux sont indiqués avec leur site web. Cela va nécessiter une séparation, à réaliser avec l’instruction split, puis de prendre le premier élément.</p>
</div>
<div class="listingblock">
<div class="content">
<pre mode="cypher" class="highlight pre-scrollable programlisting cm-s-neo code runnable standalone-example ng-binding" data-lang="cypher" lang="cypher"><!--code class="cypher language-cypher"-->WITH "file:///aides-a-la-presse-classement-des-titres-de-presse-aides.csv" AS url
LOAD CSV WITH HEADERS FROM url AS ligne FIELDTERMINATOR ";"
RETURN ligne.`Bénéficiaires`, split( ligne.`Bénéficiaires`,"/"), ligne.`Total des aides individuelles (en €)`,ligne.`Diffusion annuelle (en exemplaires`, ligne.`Année` LIMIT 5<!--/code--></pre>
</div>
</div>
<div class="paragraph">
<p>Ce contenu sera inséré dans un nouveau noeud 'Statistique' relié au noeud Média via une relation 'DECRIT'.</p>
</div>
<div class="paragraph">
<p>Je vous propose le code suivant pour l’intégration de ce fichier</p>
</div>
<div class="paragraph">
<p>Déjà, on va devoir ajouter un champs à tous les médias</p>
</div>
<div class="listingblock">
<div class="content">
<pre mode="cypher" class="highlight pre-scrollable programlisting cm-s-neo code runnable standalone-example ng-binding" data-lang="cypher" lang="cypher"><!--code class="cypher language-cypher"-->MATCH (m:Média)
SET m.upNom = toUpper(m.nom)
RETURN count(m)<!--/code--></pre>
</div>
</div>
<div class="listingblock">
<div class="content">
<pre mode="cypher" class="highlight pre-scrollable programlisting cm-s-neo code runnable standalone-example ng-binding" data-lang="cypher" lang="cypher"><!--code class="cypher language-cypher"-->WITH "file:///aides-a-la-presse-classement-des-titres-de-presse-aides.csv" AS url
LOAD CSV WITH HEADERS FROM url AS ligne FIELDTERMINATOR ";"
MERGE(m:Média {upNom:toUpper( split( ligne.`Bénéficiaires`,"/")[0] ) })
SET m.nom=split( ligne.`Bénéficiaires`,"/")[0]
CREATE (s:Statistique { annee: toInt(ligne.`Année`), totalAides: toInt(ligne.`Total des aides individuelles (en €)`), diffusionAnnuelle: toInt(ligne.`Diffusion annuelle (en exemplaires`) })
CREATE (m)<-[d:DECRIT]-(s)
RETURN m,d,s<!--/code--></pre>
</div>
</div>
</div>
</div>
</slide>
<slide class="row-fluid">
<div class="col-sm-12">
<h3>Qui touche le plus d’euros ?</h3>
<br/>
<div>
<div class="paragraph">
<p>Qui (par extension) touche le plus d’aides étatiques ? et pour combien de médias presse ?</p>
</div>
<div class="listingblock">
<div class="content">
<pre mode="cypher" class="highlight pre-scrollable programlisting cm-s-neo code runnable standalone-example ng-binding" data-lang="cypher" lang="cypher"><!--code class="cypher language-cypher"-->MATCH (pp:Personne_physique)-[p:POSSEDE*..]->(m:Média)<--(s:Statistique)
RETURN pp.nom, coalesce(toInt(pp.rangchallenges),0) as rangChallenges, size(collect(m.nom)) as nbTitres, sum(s.totalAides) AS jackpot ORDER BY jackpot DESC<!--/code--></pre>
</div>
</div>
<div class="paragraph">
<p>De belles sommes, de quoi être très euro.</p>
</div>
<div class="paragraph">
<p>Cependant, avant de crier au loup, il faudrait vérifier que les journaux sont bénéficiaires et à quel pourcentage ils sont possédés par les personnes citées.</p>
</div>
<div class="paragraph">
<p>Ce qui se requête comme ceci.</p>
</div>
<div class="listingblock">
<div class="content">
<pre mode="cypher" class="highlight pre-scrollable programlisting cm-s-neo code runnable standalone-example ng-binding" data-lang="cypher" lang="cypher"><!--code class="cypher language-cypher"-->MATCH path=(p:Personne_physique)-[o:POSSEDE*]->(m:Média)
RETURN p.nom, m.nom, reduce(prod=1.0, x in relationships(path) | prod*coalesce( x.valeur, 0.0 )/100 ) as pourcentagePossession
ORDER BY pourcentagePossession DESC<!--/code--></pre>
</div>
</div>
<div class="paragraph">
<p>Je remercie Stefan Armbruster de Neo4j qui m’a rappelé l’existence de la fonction reduce.</p>
</div>
</div>
</div>
</slide>
<slide class="row-fluid">
<div class="col-sm-12">
<h3>Bonus - Un peu d’R</h3>
<br/>
<div>
<div class="paragraph">
<p>J’aime bien voir d’autres langages de temps en temps, surtout quand cela fait bien le job et surtout : rapidement.</p>
</div>
<div class="paragraph">
<p>Pour obtenir des représentations graphiques rapidement, le <a href="https://www.r-project.org/">langage R</a> est ce qui est le plus indiqué</p>
</div>
<div class="paragraph">
<p>Suivent comment obtenir deux représentations graphiques des aides obtenues par personnes.</p>
</div>
<h4>Pie chart</h4>
<div class="paragraph">
<p>J’ai récupéré les résultats via la sortie texte du Neo4j browser, puis dans le tableur, j’ai transformé les colonnes en lignes afin de faire ce petit programme en R</p>
</div>
<div class="listingblock">
<div class="content">
<pre mode="cypher" class="highlight pre-scrollable programlisting cm-s-neo code runnable standalone-example ng-binding" data-lang="r" lang="r"><!--code class="r language-r"-->group=c("Bernard Arnault","Famille Hutin","Famille Hurbain","Famille Lemoine","Famille Baylet","Xavier Niel","Matthieu Pigasse","Arnaud Lagardère","Bernard Tapie","Famille Mohn","Yves de Chaisemartin","Famille Saint-Cricq","François Pinault","Philippe Hersant","Édouard Coudurier")
value=c(18454766,7240740,2970948,2806813,2317190,1565190,1565190,1533157,1077799,550688 ,250628 ,243025 ,219387,43018,11565)
pie(value, group)<!--/code--></pre>
</div>
</div>
<div class="paragraph">
<p>Ce qui permet d’obtenir ce chart, illisible</p>
</div>
<div class="imageblock">
<div class="content">
<img src="https://wadael.github.io/presse_fr/images/press_pie.png" alt="pie chart">
</div>
</div>
<h4>Treemap</h4>
<div class="paragraph">
<p>Un treemap va partager les aires d’un rectangle entre les éléments d’un tableau, à hauteur de leurs valeurs.</p>
</div>
<div class="imageblock">
<div class="content">
<img src="https://wadael.github.io/presse_fr/images/treemap_presse.png" alt="Treemap">
</div>
</div>
<div class="listingblock">
<div class="content">
<pre mode="cypher" class="highlight pre-scrollable programlisting cm-s-neo code runnable standalone-example ng-binding" data-lang="r" lang="r"><!--code class="r language-r"-->library(treemap)
group=c("Bernard Arnault","Famille Hutin","Famille Hurbain","Famille Lemoine","Famille Baylet","Xavier Niel","Matthieu Pigasse","Arnaud Lagardère","Bernard Tapie","Famille Mohn","Yves de Chaisemartin","Famille Saint-Cricq","François Pinault","Philippe Hersant","Édouard Coudurier")
value=c(18454766,7240740,2970948,2806813,2317190,1565190,1565190,1533157,1077799,550688 ,250628 ,243025 ,219387,43018,11565)
data=data.frame(group,value)
# treemap
treemap(data,index="group",vSize="value",type="index")<!--/code--></pre>
</div>
</div>
</div>
</div>
</slide>
<slide class="row-fluid">
<div class="col-sm-12">
<h3>Qui touche le plus de lecteurs ?</h3>
<br/>
<div>
<div class="listingblock">
<div class="content">
<pre mode="cypher" class="highlight pre-scrollable programlisting cm-s-neo code runnable standalone-example ng-binding" data-lang="cypher" lang="cypher"><!--code class="cypher language-cypher"-->MATCH (pp:Personne_physique)-[p:POSSEDE*..]->(m:Média)<--(s:Statistique)
RETURN pp.nom, coalesce(toInt(pp.rangchallenges),0) as rangChallenges, size(collect(m.nom)) as nbTitres, sum(s.diffusionAnnuelle) AS targetSize ORDER BY targetSize DESC<!--/code--></pre>
</div>
</div>
</div>
</div>
</slide>
<slide class="row-fluid">
<div class="col-sm-12">
<h3>Auto-promotion</h3>
<br/>
<div>
<div class="paragraph">
<p>Si vous cherchez un ouvrage pour en apprendre plus sur Neo4j, je vous conseille mon livre, <strong>en anglais</strong>, vous le trouverez partout (Fnac, Amazon) notamment sur le site de mon éditeur (Packt Publishing) qui fait régulièrement des promotions <a href="https://www.packtpub.com/big-data-and-business-intelligence/learning-neo4j-3x-second-edition?referrer=wadael">Learning Neo4j, Second Edition</a></p>
</div>
<div class="paragraph">
<p>et si vous avez besoin d’un consultant compétent sur Neo4j, contactez moi via <a href="https://www.linkedin.com/in/jeromebaton/">LinkedIn</a> ou par email: monNomMonPrenom indiqués en début et fin de ce document suivis de .<a href="mailto:[email protected]">[email protected]</a> (collés,sans accents)</p>
</div>
<div class="imageblock">
<div class="content">
<img src="https://wadael.github.io/presse_fr/images/B05824_cover.png" alt="B05824 cover">
</div>
</div>
<div class="paragraph">
<p>Merci d’avoir lu ma publicité :)</p>
</div>
<div class="paragraph">
<p>jerome baton</p>
</div>
</div>
</div>
</slide>
</carousel>
</article>