{"id":389,"date":"2015-10-01T06:12:49","date_gmt":"2015-10-01T06:12:49","guid":{"rendered":"http:\/\/blog.tiran.info\/?p=389"},"modified":"2017-12-05T14:19:35","modified_gmt":"2017-12-05T13:19:35","slug":"partitionnement-via-k-means-avec-r","status":"publish","type":"post","link":"https:\/\/blog.tiran.stream\/?p=389","title":{"rendered":"Partitionnement via k-means avec R"},"content":{"rendered":"<p style=\"text-align: justify;\">Dans la continuit\u00e9 du <a href=\"http:\/\/blog.tiran.info\/partitionnement-via-k-means-avec-oracle\">pr\u00e9c\u00e9dent billet<\/a>, j&rsquo;essaye ici de r\u00e9aliser un partitionnement via k-means \u00e0 l&rsquo;aide de R.\u00a0Les m\u00eames donn\u00e9es de votes sont utilis\u00e9es et elles sont acc\u00e9d\u00e9es directement en base \u00e0 l&rsquo;aide de <a href=\"http:\/\/blog.tiran.info\/connexion-roracle\">RODBC<\/a>.<\/p>\n<p style=\"text-align: justify;\">En pratique, on r\u00e9cup\u00e8re les donn\u00e9es de la vue V_VOTES_PART (contenant le codage des votes sous forme de variables indicatrices) au sein du dataframe votes2part:<\/p>\n<pre>&gt; library(ROracle)\r\nLe chargement a n\u00e9cessit\u00e9 le package : DBI\r\nWarning message:\r\nle package \u2018DBI\u2019 a \u00e9t\u00e9 compil\u00e9 avec la version R 3.2.1 \r\n&gt; ora = Oracle()\r\n&gt; cnx = dbConnect(ora, username=&quot;rafa&quot;, password=&quot;rafa&quot;, dbname=&quot;S1401037:1521\/STATPDB&quot;)\r\n&gt; votes2part &lt;- dbGetQuery(cnx, &quot;select * from v_votes_part&quot;)\r\n&gt; dbDisconnect(cnx)\r\n[1] TRUE\r\n&gt;<\/pre>\n<p style=\"text-align: justify;\">Le dataframe votes2part contient 497 lignes et 194 colonnes:<\/p>\n<pre>&gt; dim(votes2part)\r\n[1] 497 194\r\n&gt;<\/pre>\n<p style=\"text-align: justify;\">Le partitionnement est effectu\u00e9 \u00e0 l&rsquo;aide de la commande kmeans \u00e0 laquelle on passe le dataframe votes2part \u00e0 l&rsquo;exception des champs DEPUTE et PARTI (colonnes 1 et 2) ainsi que le nombre de partitions souhait\u00e9es: 6.<\/p>\n<pre>&gt; clu &lt;- kmeans(votes2part[,3:dim(votes2part)[2]],6)\r\n&gt;<\/pre>\n<p style=\"text-align: justify;\">On construit ensuite un nouveau dataframe (res) regroupant pour chaque ligne de votes2part le parti d&rsquo;origine du d\u00e9put\u00e9 ainsi que la partition auquel le k-means l&rsquo;a affect\u00e9.<\/p>\n<p style=\"text-align: justify;\">Cela permet de produire une table de contingence afin de visualiser la performance du partitionnement:<\/p>\n<pre>&gt; res &lt;- data.frame(clu$cluster,votes2part$PARTI)\r\n&gt; distrib &lt;- table(res$votes2part.PARTI,res$clu.cluster)\r\n&gt; distrib\r\n \r\n                                                           1   2   3   4   5   6\r\n  Groupe de l&#039;union des d\u00e9mocrates et ind\u00e9pendants         0   0  22   0   0   0\r\n  Groupe de la gauche d\u00e9mocrate et r\u00e9publicaine            7   0   1   0   0   0\r\n  Groupe \u00e9cologiste                                       16   0   0   0   0   0\r\n  Groupe Les R\u00e9publicains                                  0   0   0   0 184   0\r\n  Groupe radical, r\u00e9publicain, d\u00e9mocrate et progressiste   0  11   0   1   0   1\r\n  Groupe socialiste, r\u00e9publicain et citoyen                0   3   0 216   0  35\r\n&gt;<\/pre>\n<p style=\"text-align: justify;\">A l&rsquo;aide d&rsquo;un barplot, on peut aussi repr\u00e9senter graphiquement la distribution de l&rsquo;origine des d\u00e9put\u00e9s au sein de chaque partition:<\/p>\n<pre>&gt; colpartis &lt;- c(&quot;mediumpurple&quot;, &quot;red&quot;, &quot;green3&quot;, &quot;lightskyblue&quot;, &quot;lemonchiffon&quot;, &quot;lightpink&quot;)\r\n&gt; barplot(distrib, main=&quot;Distribution des d\u00e9put\u00e9s par partition&quot;,xlab=&quot;Partition&quot;, col=colpartis, legend=rownames(distrib), args.legend = list(x = &quot;topleft&quot;, bty = &quot;n&quot;, inset=c(0, 0)))\r\n&gt;<\/pre>\n<p><a href=\"https:\/\/blog.tiran.stream\/wp-content\/uploads\/2015\/09\/kmeans1.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-391 size-large\" src=\"https:\/\/blog.tiran.stream\/wp-content\/uploads\/2015\/09\/kmeans1.png\" alt=\"kmeans1\" width=\"648\" height=\"501\" \/><\/a><\/p>\n<p>&nbsp;<\/p>\n<p>On voit que le partitionnement est relativement efficace.<\/p>\n<p>En revanche, si on r\u00e9it\u00e8re l&rsquo;op\u00e9ration, on constate un r\u00e9sultat diff\u00e9rent:<\/p>\n<pre>&gt; clu &lt;- kmeans(votes2part[,3:dim(votes2part)[2]],6)\r\n&gt; res &lt;- data.frame(clu$cluster,votes2part$PARTI)\r\n&gt; distrib &lt;- table(res$votes2part.PARTI,res$clu.cluster)\r\n&gt; distrib\r\n \r\n                                                           1   2   3   4   5   6\r\n  Groupe de l&#039;union des d\u00e9mocrates et ind\u00e9pendants         0   0   0   0   0  22\r\n  Groupe de la gauche d\u00e9mocrate et r\u00e9publicaine            8   0   0   0   0   0\r\n  Groupe \u00e9cologiste                                        0   0   0   0  16   0\r\n  Groupe Les R\u00e9publicains                                  0  32 101  51   0   0\r\n  Groupe radical, r\u00e9publicain, d\u00e9mocrate et progressiste   0   0   0   0  13   0\r\n  Groupe socialiste, r\u00e9publicain et citoyen                0   0   0   0 254   0\r\n&gt; \r\n&gt; barplot(distrib, main=&quot;Distribution des d\u00e9put\u00e9s par partition&quot;,xlab=&quot;Partition&quot;, col=colpartis, legend=rownames(distrib), args.legend = list(x = &quot;topleft&quot;, bty = &quot;n&quot;, inset=c(0, 0)))\r\n&gt;<\/pre>\n<p style=\"text-align: justify;\"><a href=\"https:\/\/blog.tiran.stream\/wp-content\/uploads\/2015\/09\/kmeans2.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-392 size-large\" src=\"https:\/\/blog.tiran.stream\/wp-content\/uploads\/2015\/09\/kmeans2.png\" alt=\"kmeans2\" width=\"648\" height=\"501\" \/><\/a><\/p>\n<p style=\"text-align: justify;\">En fait, la performance du k-means est tr\u00e8s d\u00e9pendante du choix des points initiaux. Sans pr\u00e9cision particuli\u00e8re, ceux-ci sont choisis al\u00e9atoirement et, par cons\u00e9quent, deux ex\u00e9cutions successives ne produisent pas le m\u00eame r\u00e9sultat.<\/p>\n<p style=\"text-align: justify;\">L&rsquo;impl\u00e9mentation par Oracle du k-means semble en revanche d\u00e9terministe, plusieurs ex\u00e9cutions successives produisant le m\u00eame r\u00e9sultat.<\/p>\n<p style=\"text-align: justify;\">N\u00e9anmoins, contrairement \u00e0 l&rsquo;impl\u00e9mentation d&rsquo;Oracle, la fonction kmeans de R accepte que l&rsquo;on sp\u00e9cifie les points (<a href=\"https:\/\/en.wikipedia.org\/wiki\/Centroid\" target=\"_blank\" rel=\"noopener\">centro\u00efdes<\/a>) initiaux. Dans notre cas, puisqu&rsquo;on connait les chefs de groupes parlementaires, on peut fournir cette information \u00e0 la fonction:<\/p>\n<pre>&gt; centers &lt;- votes2part[which(votes2part$DEPUTE %in% c(&quot;Bruno Le Roux&quot;,&quot;Christian Jacob&quot;,&quot;Philippe Vigier&quot;,&quot;Roger-G\u00e9rard Schwartzenberg&quot;,&quot;Fran\u00e7ois de Rugy&quot;,&quot;Andr\u00e9 Chassaigne&quot;)),3:dim(votes2part)[2]]\r\n&gt; clu &lt;- kmeans(votes2part[,3:dim(votes2part)[2]],centers)\r\n&gt; res &lt;- data.frame(clu$cluster,votes2part$PARTI)\r\n&gt; distrib &lt;- table(res$votes2part.PARTI,res$clu.cluster)\r\n&gt; distrib\r\n \r\n                                                           1   2   3   4   5   6\r\n  Groupe de l&#039;union des d\u00e9mocrates et ind\u00e9pendants         0   0  22   0   0   0\r\n  Groupe de la gauche d\u00e9mocrate et r\u00e9publicaine            0   0   0   8   0   0\r\n  Groupe \u00e9cologiste                                        0   0   0   0  16   0\r\n  Groupe Les R\u00e9publicains                                  0 184   0   0   0   0\r\n  Groupe radical, r\u00e9publicain, d\u00e9mocrate et progressiste   1   0   0   0   0  12\r\n  Groupe socialiste, r\u00e9publicain et citoyen              251   0   0   0   0   3\r\n&gt; \r\n&gt; barplot(distrib, main=&quot;Distribution des d\u00e9put\u00e9s par partition&quot;,xlab=&quot;Partition&quot;, col=colpartis, legend=rownames(distrib), args.legend = list(x = &quot;topright&quot;, bty = &quot;n&quot;, inset=c(-0.3, 0)))\r\n&gt;<\/pre>\n<p style=\"text-align: justify;\"><a href=\"https:\/\/blog.tiran.stream\/wp-content\/uploads\/2015\/09\/kmeans-center.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-393 size-large\" src=\"https:\/\/blog.tiran.stream\/wp-content\/uploads\/2015\/09\/kmeans-center.png\" alt=\"kmeans-center\" width=\"648\" height=\"501\" \/><\/a><\/p>\n<p style=\"text-align: justify;\">Cette fois le r\u00e9sultat du partitionnement est excellent (et d\u00e9terministe)!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Dans la continuit\u00e9 du pr\u00e9c\u00e9dent billet, j&rsquo;essaye ici de r\u00e9aliser un partitionnement via k-means \u00e0 l&rsquo;aide de R.\u00a0Les m\u00eames donn\u00e9es<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"colormag_page_container_layout":"default_layout","colormag_page_sidebar_layout":"default_layout","footnotes":""},"categories":[4,12],"tags":[],"class_list":["post-389","post","type-post","status-publish","format-standard","hentry","category-clustering","category-r"],"_links":{"self":[{"href":"https:\/\/blog.tiran.stream\/index.php?rest_route=\/wp\/v2\/posts\/389","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.tiran.stream\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.tiran.stream\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.tiran.stream\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.tiran.stream\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=389"}],"version-history":[{"count":1,"href":"https:\/\/blog.tiran.stream\/index.php?rest_route=\/wp\/v2\/posts\/389\/revisions"}],"predecessor-version":[{"id":1160,"href":"https:\/\/blog.tiran.stream\/index.php?rest_route=\/wp\/v2\/posts\/389\/revisions\/1160"}],"wp:attachment":[{"href":"https:\/\/blog.tiran.stream\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=389"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.tiran.stream\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=389"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.tiran.stream\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=389"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}