diff --git a/.Rbuildignore b/.Rbuildignore new file mode 100644 index 0000000000000000000000000000000000000000..0f63be5362248cbab21c5b841084f504e53c3b69 --- /dev/null +++ b/.Rbuildignore @@ -0,0 +1,6 @@ +^propre\.ecln\.Rproj$ +^\.Rproj\.user$ +^devstuff\.R$ +^data-raw$ +^extdata$ +^LICENSE\.md$ diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..a65db9c215d44696a1cf568e06c044a138ddc953 --- /dev/null +++ b/.gitignore @@ -0,0 +1,6 @@ +.Rproj.user +.Rhistory +.RData +.Ruserdata +extdata/ +data/ diff --git a/DESCRIPTION b/DESCRIPTION new file mode 100644 index 0000000000000000000000000000000000000000..01bcea375cbfb3bd901a5b57e49ef4e93db686b8 --- /dev/null +++ b/DESCRIPTION @@ -0,0 +1,35 @@ +Package: propre.ecln +Title: What the Package Does (One Line, Title Case) +Version: 0.0.0.9000 +Authors@R: + person(given = "Maël", + family = "THEULIERE", + role = c("aut", "cre"), + email = "mael.theuliere@gmail.com", + comment = c(ORCID = "0000-0002-5146-699X")) +Description: What the package does (one paragraph). +License: GPL (>= 3) +Encoding: UTF-8 +LazyData: true +Roxygen: list(markdown = TRUE) +RoxygenNote: 7.1.1 +Imports: + COGiter, + dplyr, + lubridate, + stringr, + forcats, + ggforce, + ggplot2, + glue, + gouvdown, + scales, + magrittr, + rlang, + kableExtra, + knitr, + tidyr +Remotes: + MaelTheuliere/COGiter +Depends: + R (>= 2.10) diff --git a/LICENSE.md b/LICENSE.md new file mode 100644 index 0000000000000000000000000000000000000000..175443ce8855883fcbf0122a6bfba12ac4cfb49d --- /dev/null +++ b/LICENSE.md @@ -0,0 +1,595 @@ +GNU General Public License +========================== + +_Version 3, 29 June 2007_ +_Copyright © 2007 Free Software Foundation, Inc. <<http://fsf.org/>>_ + +Everyone is permitted to copy and distribute verbatim copies of this license +document, but changing it is not allowed. + +## Preamble + +The GNU General Public License is a free, copyleft license for software and other +kinds of works. + +The licenses for most software and other practical works are designed to take away +your freedom to share and change the works. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change all versions of a +program--to make sure it remains free software for all its users. We, the Free +Software Foundation, use the GNU General Public License for most of our software; it +applies also to any other work released this way by its authors. You can apply it to +your programs, too. + +When we speak of free software, we are referring to freedom, not price. Our General +Public Licenses are designed to make sure that you have the freedom to distribute +copies of free software (and charge for them if you wish), that you receive source +code or can get it if you want it, that you can change the software or use pieces of +it in new free programs, and that you know you can do these things. + +To protect your rights, we need to prevent others from denying you these rights or +asking you to surrender the rights. Therefore, you have certain responsibilities if +you distribute copies of the software, or if you modify it: responsibilities to +respect the freedom of others. + +For example, if you distribute copies of such a program, whether gratis or for a fee, +you must pass on to the recipients the same freedoms that you received. You must make +sure that they, too, receive or can get the source code. And you must show them these +terms so they know their rights. + +Developers that use the GNU GPL protect your rights with two steps: **(1)** assert +copyright on the software, and **(2)** offer you this License giving you legal permission +to copy, distribute and/or modify it. + +For the developers' and authors' protection, the GPL clearly explains that there is +no warranty for this free software. For both users' and authors' sake, the GPL +requires that modified versions be marked as changed, so that their problems will not +be attributed erroneously to authors of previous versions. + +Some devices are designed to deny users access to install or run modified versions of +the software inside them, although the manufacturer can do so. This is fundamentally +incompatible with the aim of protecting users' freedom to change the software. The +systematic pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we have designed +this version of the GPL to prohibit the practice for those products. If such problems +arise substantially in other domains, we stand ready to extend this provision to +those domains in future versions of the GPL, as needed to protect the freedom of +users. + +Finally, every program is threatened constantly by software patents. States should +not allow patents to restrict development and use of software on general-purpose +computers, but in those that do, we wish to avoid the special danger that patents +applied to a free program could make it effectively proprietary. To prevent this, the +GPL assures that patents cannot be used to render the program non-free. + +The precise terms and conditions for copying, distribution and modification follow. + +## TERMS AND CONDITIONS + +### 0. Definitions + +“This License” refers to version 3 of the GNU General Public License. + +“Copyright” also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + +“The Program” refers to any copyrightable work licensed under this +License. Each licensee is addressed as “you”. “Licensees” and +“recipients” may be individuals or organizations. + +To “modify” a work means to copy from or adapt all or part of the work in +a fashion requiring copyright permission, other than the making of an exact copy. The +resulting work is called a “modified version” of the earlier work or a +work “based on” the earlier work. + +A “covered work” means either the unmodified Program or a work based on +the Program. + +To “propagate” a work means to do anything with it that, without +permission, would make you directly or secondarily liable for infringement under +applicable copyright law, except executing it on a computer or modifying a private +copy. Propagation includes copying, distribution (with or without modification), +making available to the public, and in some countries other activities as well. + +To “convey” a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through a computer +network, with no transfer of a copy, is not conveying. + +An interactive user interface displays “Appropriate Legal Notices” to the +extent that it includes a convenient and prominently visible feature that **(1)** +displays an appropriate copyright notice, and **(2)** tells the user that there is no +warranty for the work (except to the extent that warranties are provided), that +licensees may convey the work under this License, and how to view a copy of this +License. If the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + +### 1. Source Code + +The “source code” for a work means the preferred form of the work for +making modifications to it. “Object code” means any non-source form of a +work. + +A “Standard Interface” means an interface that either is an official +standard defined by a recognized standards body, or, in the case of interfaces +specified for a particular programming language, one that is widely used among +developers working in that language. + +The “System Libraries” of an executable work include anything, other than +the work as a whole, that **(a)** is included in the normal form of packaging a Major +Component, but which is not part of that Major Component, and **(b)** serves only to +enable use of the work with that Major Component, or to implement a Standard +Interface for which an implementation is available to the public in source code form. +A “Major Component”, in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system (if any) on which +the executable work runs, or a compiler used to produce the work, or an object code +interpreter used to run it. + +The “Corresponding Source” for a work in object code form means all the +source code needed to generate, install, and (for an executable work) run the object +code and to modify the work, including scripts to control those activities. However, +it does not include the work's System Libraries, or general-purpose tools or +generally available free programs which are used unmodified in performing those +activities but which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for the work, and +the source code for shared libraries and dynamically linked subprograms that the work +is specifically designed to require, such as by intimate data communication or +control flow between those subprograms and other parts of the work. + +The Corresponding Source need not include anything that users can regenerate +automatically from other parts of the Corresponding Source. + +The Corresponding Source for a work in source code form is that same work. + +### 2. Basic Permissions + +All rights granted under this License are granted for the term of copyright on the +Program, and are irrevocable provided the stated conditions are met. This License +explicitly affirms your unlimited permission to run the unmodified Program. The +output from running a covered work is covered by this License only if the output, +given its content, constitutes a covered work. This License acknowledges your rights +of fair use or other equivalent, as provided by copyright law. + +You may make, run and propagate covered works that you do not convey, without +conditions so long as your license otherwise remains in force. You may convey covered +works to others for the sole purpose of having them make modifications exclusively +for you, or provide you with facilities for running those works, provided that you +comply with the terms of this License in conveying all material for which you do not +control copyright. Those thus making or running the covered works for you must do so +exclusively on your behalf, under your direction and control, on terms that prohibit +them from making any copies of your copyrighted material outside their relationship +with you. + +Conveying under any other circumstances is permitted solely under the conditions +stated below. Sublicensing is not allowed; section 10 makes it unnecessary. + +### 3. Protecting Users' Legal Rights From Anti-Circumvention Law + +No covered work shall be deemed part of an effective technological measure under any +applicable law fulfilling obligations under article 11 of the WIPO copyright treaty +adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention +of such measures. + +When you convey a covered work, you waive any legal power to forbid circumvention of +technological measures to the extent such circumvention is effected by exercising +rights under this License with respect to the covered work, and you disclaim any +intention to limit operation or modification of the work as a means of enforcing, +against the work's users, your or third parties' legal rights to forbid circumvention +of technological measures. + +### 4. Conveying Verbatim Copies + +You may convey verbatim copies of the Program's source code as you receive it, in any +medium, provided that you conspicuously and appropriately publish on each copy an +appropriate copyright notice; keep intact all notices stating that this License and +any non-permissive terms added in accord with section 7 apply to the code; keep +intact all notices of the absence of any warranty; and give all recipients a copy of +this License along with the Program. + +You may charge any price or no price for each copy that you convey, and you may offer +support or warranty protection for a fee. + +### 5. Conveying Modified Source Versions + +You may convey a work based on the Program, or the modifications to produce it from +the Program, in the form of source code under the terms of section 4, provided that +you also meet all of these conditions: + +* **a)** The work must carry prominent notices stating that you modified it, and giving a +relevant date. +* **b)** The work must carry prominent notices stating that it is released under this +License and any conditions added under section 7. This requirement modifies the +requirement in section 4 to “keep intact all notices”. +* **c)** You must license the entire work, as a whole, under this License to anyone who +comes into possession of a copy. This License will therefore apply, along with any +applicable section 7 additional terms, to the whole of the work, and all its parts, +regardless of how they are packaged. This License gives no permission to license the +work in any other way, but it does not invalidate such permission if you have +separately received it. +* **d)** If the work has interactive user interfaces, each must display Appropriate Legal +Notices; however, if the Program has interactive interfaces that do not display +Appropriate Legal Notices, your work need not make them do so. + +A compilation of a covered work with other separate and independent works, which are +not by their nature extensions of the covered work, and which are not combined with +it such as to form a larger program, in or on a volume of a storage or distribution +medium, is called an “aggregate” if the compilation and its resulting +copyright are not used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work in an aggregate +does not cause this License to apply to the other parts of the aggregate. + +### 6. Conveying Non-Source Forms + +You may convey a covered work in object code form under the terms of sections 4 and +5, provided that you also convey the machine-readable Corresponding Source under the +terms of this License, in one of these ways: + +* **a)** Convey the object code in, or embodied in, a physical product (including a +physical distribution medium), accompanied by the Corresponding Source fixed on a +durable physical medium customarily used for software interchange. +* **b)** Convey the object code in, or embodied in, a physical product (including a +physical distribution medium), accompanied by a written offer, valid for at least +three years and valid for as long as you offer spare parts or customer support for +that product model, to give anyone who possesses the object code either **(1)** a copy of +the Corresponding Source for all the software in the product that is covered by this +License, on a durable physical medium customarily used for software interchange, for +a price no more than your reasonable cost of physically performing this conveying of +source, or **(2)** access to copy the Corresponding Source from a network server at no +charge. +* **c)** Convey individual copies of the object code with a copy of the written offer to +provide the Corresponding Source. This alternative is allowed only occasionally and +noncommercially, and only if you received the object code with such an offer, in +accord with subsection 6b. +* **d)** Convey the object code by offering access from a designated place (gratis or for +a charge), and offer equivalent access to the Corresponding Source in the same way +through the same place at no further charge. You need not require recipients to copy +the Corresponding Source along with the object code. If the place to copy the object +code is a network server, the Corresponding Source may be on a different server +(operated by you or a third party) that supports equivalent copying facilities, +provided you maintain clear directions next to the object code saying where to find +the Corresponding Source. Regardless of what server hosts the Corresponding Source, +you remain obligated to ensure that it is available for as long as needed to satisfy +these requirements. +* **e)** Convey the object code using peer-to-peer transmission, provided you inform +other peers where the object code and Corresponding Source of the work are being +offered to the general public at no charge under subsection 6d. + +A separable portion of the object code, whose source code is excluded from the +Corresponding Source as a System Library, need not be included in conveying the +object code work. + +A “User Product” is either **(1)** a “consumer product”, which +means any tangible personal property which is normally used for personal, family, or +household purposes, or **(2)** anything designed or sold for incorporation into a +dwelling. In determining whether a product is a consumer product, doubtful cases +shall be resolved in favor of coverage. For a particular product received by a +particular user, “normally used” refers to a typical or common use of +that class of product, regardless of the status of the particular user or of the way +in which the particular user actually uses, or expects or is expected to use, the +product. A product is a consumer product regardless of whether the product has +substantial commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + +“Installation Information” for a User Product means any methods, +procedures, authorization keys, or other information required to install and execute +modified versions of a covered work in that User Product from a modified version of +its Corresponding Source. The information must suffice to ensure that the continued +functioning of the modified object code is in no case prevented or interfered with +solely because modification has been made. + +If you convey an object code work under this section in, or with, or specifically for +use in, a User Product, and the conveying occurs as part of a transaction in which +the right of possession and use of the User Product is transferred to the recipient +in perpetuity or for a fixed term (regardless of how the transaction is +characterized), the Corresponding Source conveyed under this section must be +accompanied by the Installation Information. But this requirement does not apply if +neither you nor any third party retains the ability to install modified object code +on the User Product (for example, the work has been installed in ROM). + +The requirement to provide Installation Information does not include a requirement to +continue to provide support service, warranty, or updates for a work that has been +modified or installed by the recipient, or for the User Product in which it has been +modified or installed. Access to a network may be denied when the modification itself +materially and adversely affects the operation of the network or violates the rules +and protocols for communication across the network. + +Corresponding Source conveyed, and Installation Information provided, in accord with +this section must be in a format that is publicly documented (and with an +implementation available to the public in source code form), and must require no +special password or key for unpacking, reading or copying. + +### 7. Additional Terms + +“Additional permissions” are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. Additional +permissions that are applicable to the entire Program shall be treated as though they +were included in this License, to the extent that they are valid under applicable +law. If additional permissions apply only to part of the Program, that part may be +used separately under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + +When you convey a copy of a covered work, you may at your option remove any +additional permissions from that copy, or from any part of it. (Additional +permissions may be written to require their own removal in certain cases when you +modify the work.) You may place additional permissions on material, added by you to a +covered work, for which you have or can give appropriate copyright permission. + +Notwithstanding any other provision of this License, for material you add to a +covered work, you may (if authorized by the copyright holders of that material) +supplement the terms of this License with terms: + +* **a)** Disclaiming warranty or limiting liability differently from the terms of +sections 15 and 16 of this License; or +* **b)** Requiring preservation of specified reasonable legal notices or author +attributions in that material or in the Appropriate Legal Notices displayed by works +containing it; or +* **c)** Prohibiting misrepresentation of the origin of that material, or requiring that +modified versions of such material be marked in reasonable ways as different from the +original version; or +* **d)** Limiting the use for publicity purposes of names of licensors or authors of the +material; or +* **e)** Declining to grant rights under trademark law for use of some trade names, +trademarks, or service marks; or +* **f)** Requiring indemnification of licensors and authors of that material by anyone +who conveys the material (or modified versions of it) with contractual assumptions of +liability to the recipient, for any liability that these contractual assumptions +directly impose on those licensors and authors. + +All other non-permissive additional terms are considered “further +restrictions” within the meaning of section 10. If the Program as you received +it, or any part of it, contains a notice stating that it is governed by this License +along with a term that is a further restriction, you may remove that term. If a +license document contains a further restriction but permits relicensing or conveying +under this License, you may add to a covered work material governed by the terms of +that license document, provided that the further restriction does not survive such +relicensing or conveying. + +If you add terms to a covered work in accord with this section, you must place, in +the relevant source files, a statement of the additional terms that apply to those +files, or a notice indicating where to find the applicable terms. + +Additional terms, permissive or non-permissive, may be stated in the form of a +separately written license, or stated as exceptions; the above requirements apply +either way. + +### 8. Termination + +You may not propagate or modify a covered work except as expressly provided under +this License. Any attempt otherwise to propagate or modify it is void, and will +automatically terminate your rights under this License (including any patent licenses +granted under the third paragraph of section 11). + +However, if you cease all violation of this License, then your license from a +particular copyright holder is reinstated **(a)** provisionally, unless and until the +copyright holder explicitly and finally terminates your license, and **(b)** permanently, +if the copyright holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + +Moreover, your license from a particular copyright holder is reinstated permanently +if the copyright holder notifies you of the violation by some reasonable means, this +is the first time you have received notice of violation of this License (for any +work) from that copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + +Termination of your rights under this section does not terminate the licenses of +parties who have received copies or rights from you under this License. If your +rights have been terminated and not permanently reinstated, you do not qualify to +receive new licenses for the same material under section 10. + +### 9. Acceptance Not Required for Having Copies + +You are not required to accept this License in order to receive or run a copy of the +Program. Ancillary propagation of a covered work occurring solely as a consequence of +using peer-to-peer transmission to receive a copy likewise does not require +acceptance. However, nothing other than this License grants you permission to +propagate or modify any covered work. These actions infringe copyright if you do not +accept this License. Therefore, by modifying or propagating a covered work, you +indicate your acceptance of this License to do so. + +### 10. Automatic Licensing of Downstream Recipients + +Each time you convey a covered work, the recipient automatically receives a license +from the original licensors, to run, modify and propagate that work, subject to this +License. You are not responsible for enforcing compliance by third parties with this +License. + +An “entity transaction” is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an organization, or +merging organizations. If propagation of a covered work results from an entity +transaction, each party to that transaction who receives a copy of the work also +receives whatever licenses to the work the party's predecessor in interest had or +could give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if the predecessor +has it or can get it with reasonable efforts. + +You may not impose any further restrictions on the exercise of the rights granted or +affirmed under this License. For example, you may not impose a license fee, royalty, +or other charge for exercise of rights granted under this License, and you may not +initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging +that any patent claim is infringed by making, using, selling, offering for sale, or +importing the Program or any portion of it. + +### 11. Patents + +A “contributor” is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The work thus +licensed is called the contributor's “contributor version”. + +A contributor's “essential patent claims” are all patent claims owned or +controlled by the contributor, whether already acquired or hereafter acquired, that +would be infringed by some manner, permitted by this License, of making, using, or +selling its contributor version, but do not include claims that would be infringed +only as a consequence of further modification of the contributor version. For +purposes of this definition, “control” includes the right to grant patent +sublicenses in a manner consistent with the requirements of this License. + +Each contributor grants you a non-exclusive, worldwide, royalty-free patent license +under the contributor's essential patent claims, to make, use, sell, offer for sale, +import and otherwise run, modify and propagate the contents of its contributor +version. + +In the following three paragraphs, a “patent license” is any express +agreement or commitment, however denominated, not to enforce a patent (such as an +express permission to practice a patent or covenant not to sue for patent +infringement). To “grant” such a patent license to a party means to make +such an agreement or commitment not to enforce a patent against the party. + +If you convey a covered work, knowingly relying on a patent license, and the +Corresponding Source of the work is not available for anyone to copy, free of charge +and under the terms of this License, through a publicly available network server or +other readily accessible means, then you must either **(1)** cause the Corresponding +Source to be so available, or **(2)** arrange to deprive yourself of the benefit of the +patent license for this particular work, or **(3)** arrange, in a manner consistent with +the requirements of this License, to extend the patent license to downstream +recipients. “Knowingly relying” means you have actual knowledge that, but +for the patent license, your conveying the covered work in a country, or your +recipient's use of the covered work in a country, would infringe one or more +identifiable patents in that country that you have reason to believe are valid. + +If, pursuant to or in connection with a single transaction or arrangement, you +convey, or propagate by procuring conveyance of, a covered work, and grant a patent +license to some of the parties receiving the covered work authorizing them to use, +propagate, modify or convey a specific copy of the covered work, then the patent +license you grant is automatically extended to all recipients of the covered work and +works based on it. + +A patent license is “discriminatory” if it does not include within the +scope of its coverage, prohibits the exercise of, or is conditioned on the +non-exercise of one or more of the rights that are specifically granted under this +License. You may not convey a covered work if you are a party to an arrangement with +a third party that is in the business of distributing software, under which you make +payment to the third party based on the extent of your activity of conveying the +work, and under which the third party grants, to any of the parties who would receive +the covered work from you, a discriminatory patent license **(a)** in connection with +copies of the covered work conveyed by you (or copies made from those copies), or **(b)** +primarily for and in connection with specific products or compilations that contain +the covered work, unless you entered into that arrangement, or that patent license +was granted, prior to 28 March 2007. + +Nothing in this License shall be construed as excluding or limiting any implied +license or other defenses to infringement that may otherwise be available to you +under applicable patent law. + +### 12. No Surrender of Others' Freedom + +If conditions are imposed on you (whether by court order, agreement or otherwise) +that contradict the conditions of this License, they do not excuse you from the +conditions of this License. If you cannot convey a covered work so as to satisfy +simultaneously your obligations under this License and any other pertinent +obligations, then as a consequence you may not convey it at all. For example, if you +agree to terms that obligate you to collect a royalty for further conveying from +those to whom you convey the Program, the only way you could satisfy both those terms +and this License would be to refrain entirely from conveying the Program. + +### 13. Use with the GNU Affero General Public License + +Notwithstanding any other provision of this License, you have permission to link or +combine any covered work with a work licensed under version 3 of the GNU Affero +General Public License into a single combined work, and to convey the resulting work. +The terms of this License will continue to apply to the part which is the covered +work, but the special requirements of the GNU Affero General Public License, section +13, concerning interaction through a network will apply to the combination as such. + +### 14. Revised Versions of this License + +The Free Software Foundation may publish revised and/or new versions of the GNU +General Public License from time to time. Such new versions will be similar in spirit +to the present version, but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Program specifies that +a certain numbered version of the GNU General Public License “or any later +version” applies to it, you have the option of following the terms and +conditions either of that numbered version or of any later version published by the +Free Software Foundation. If the Program does not specify a version number of the GNU +General Public License, you may choose any version ever published by the Free +Software Foundation. + +If the Program specifies that a proxy can decide which future versions of the GNU +General Public License can be used, that proxy's public statement of acceptance of a +version permanently authorizes you to choose that version for the Program. + +Later license versions may give you additional or different permissions. However, no +additional obligations are imposed on any author or copyright holder as a result of +your choosing to follow a later version. + +### 15. Disclaimer of Warranty + +THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER +EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE +QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE +DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + +### 16. Limitation of Liability + +IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY +COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS +PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, +INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE +OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE +WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + +### 17. Interpretation of Sections 15 and 16 + +If the disclaimer of warranty and limitation of liability provided above cannot be +given local legal effect according to their terms, reviewing courts shall apply local +law that most closely approximates an absolute waiver of all civil liability in +connection with the Program, unless a warranty or assumption of liability accompanies +a copy of the Program in return for a fee. + +_END OF TERMS AND CONDITIONS_ + +## How to Apply These Terms to Your New Programs + +If you develop a new program, and you want it to be of the greatest possible use to +the public, the best way to achieve this is to make it free software which everyone +can redistribute and change under these terms. + +To do so, attach the following notices to the program. It is safest to attach them +to the start of each source file to most effectively state the exclusion of warranty; +and each file should have at least the “copyright” line and a pointer to +where the full notice is found. + + <one line to give the program's name and a brief idea of what it does.> + Copyright (C) <year> <name of author> + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see <http://www.gnu.org/licenses/>. + +Also add information on how to contact you by electronic and paper mail. + +If the program does terminal interaction, make it output a short notice like this +when it starts in an interactive mode: + + <program> Copyright (C) <year> <name of author> + This program comes with ABSOLUTELY NO WARRANTY; for details type 'show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type 'show c' for details. + +The hypothetical commands `show w` and `show c` should show the appropriate parts of +the General Public License. Of course, your program's commands might be different; +for a GUI interface, you would use an “about box”. + +You should also get your employer (if you work as a programmer) or school, if any, to +sign a “copyright disclaimer” for the program, if necessary. For more +information on this, and how to apply and follow the GNU GPL, see +<<http://www.gnu.org/licenses/>>. + +The GNU General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may consider it +more useful to permit linking proprietary applications with the library. If this is +what you want to do, use the GNU Lesser General Public License instead of this +License. But first, please read +<<http://www.gnu.org/philosophy/why-not-lgpl.html>>. diff --git a/NAMESPACE b/NAMESPACE new file mode 100644 index 0000000000000000000000000000000000000000..530ca2f135052a4d5df942e1f59b37ac94f31ef6 --- /dev/null +++ b/NAMESPACE @@ -0,0 +1,70 @@ +# Generated by roxygen2: do not edit by hand + +export("%>%") +export(FormatCaractere) +export(FormatDate) +export(creer_graphique_evolution_annuelle) +export(data_prep) +export(graphique_evolution_trim) +export(graphique_investissement_locatif) +export(graphique_series_temporelles) +export(graphique_series_temporelles_prix) +export(tableau_synthese_annuel) +export(tableau_synthese_trimestrielle) +importFrom(COGiter,filtrer_cog) +importFrom(dplyr,arrange) +importFrom(dplyr,bind_rows) +importFrom(dplyr,case_when) +importFrom(dplyr,distinct) +importFrom(dplyr,filter) +importFrom(dplyr,full_join) +importFrom(dplyr,mutate) +importFrom(dplyr,pull) +importFrom(dplyr,select) +importFrom(forcats,fct_drop) +importFrom(forcats,fct_inorder) +importFrom(forcats,fct_recode) +importFrom(forcats,fct_relevel) +importFrom(ggforce,geom_mark_circle) +importFrom(ggplot2,aes) +importFrom(ggplot2,coord_flip) +importFrom(ggplot2,facet_wrap) +importFrom(ggplot2,geom_area) +importFrom(ggplot2,geom_bar) +importFrom(ggplot2,geom_label) +importFrom(ggplot2,geom_line) +importFrom(ggplot2,geom_point) +importFrom(ggplot2,ggplot) +importFrom(ggplot2,guides) +importFrom(ggplot2,labs) +importFrom(ggplot2,margin) +importFrom(ggplot2,position_dodge) +importFrom(ggplot2,scale_x_date) +importFrom(ggplot2,scale_y_continuous) +importFrom(ggplot2,theme) +importFrom(glue,glue) +importFrom(gouvdown,gouv_colors) +importFrom(gouvdown,scale_color_gouv_discrete) +importFrom(gouvdown,scale_fill_gouv_discrete) +importFrom(grid,unit) +importFrom(kableExtra,add_header_above) +importFrom(kableExtra,add_indent) +importFrom(kableExtra,kable_styling) +importFrom(kableExtra,row_spec) +importFrom(knitr,kable) +importFrom(lubridate,"%m-%") +importFrom(lubridate,`%m+%`) +importFrom(lubridate,days) +importFrom(lubridate,month) +importFrom(lubridate,quarter) +importFrom(lubridate,year) +importFrom(lubridate,years) +importFrom(lubridate,ymd) +importFrom(magrittr,"%>%") +importFrom(rlang,.data) +importFrom(scales,dollar_format) +importFrom(scales,format_format) +importFrom(stringr,str_c) +importFrom(stringr,str_replace) +importFrom(stringr,str_split_fixed) +importFrom(tidyr,spread) diff --git a/R/FormatDate.R b/R/FormatDate.R new file mode 100644 index 0000000000000000000000000000000000000000..af565092f722c7a12f93c9885cd307542b606d29 --- /dev/null +++ b/R/FormatDate.R @@ -0,0 +1,64 @@ +#' Conversion d'une date au mois ou trimestre en format date au jour. +#' +#' @param Periode caractère une date en format anneetrimestre ou anneemois +#' @param Periodicite caractère Trim si la date est en trimestre, Mois pour une date au mois +#' @param sep le séparateur entre l'année et le mois/trimestre +#' +#' @return une date au format date +#' @importFrom dplyr case_when +#' @importFrom lubridate ymd days `%m+%` +#' @importFrom stringr str_split_fixed str_c str_replace +#' @export +#' +#' @examples +#' FormatDate("2010-10", Periodicite = "Mois") + +#' @importFrom dplyr case_when +#' @importFrom lubridate ymd days +#' @importFrom stringr str_split_fixed str_c str_replace +FormatDate<-function(Periode,Periodicite,sep="-") { + + Periode1=stringr::str_split_fixed(Periode,sep,2)[,1] + Periode2=stringr::str_split_fixed(Periode,sep,2)[,2] + + if (Periodicite=="Trim") { + return( + lubridate::ymd(dplyr::case_when( + Periode2 %in% c("Q1","T1","1") ~ stringr::str_c(Periode1,"0331"), + Periode2 %in% c("Q2","T2","2") ~ stringr::str_c(Periode1,"0630"), + Periode2 %in% c("Q3","T3","3") ~ stringr::str_c(Periode1,"0930"), + Periode2 %in% c("Q4","T4","4") ~ stringr::str_c(Periode1,"1231") + ) + )) + } + if (Periodicite=="Mois") { + return( + lubridate::ymd(stringr::str_c(stringr::str_replace(Periode,sep,""),"01")) %m+% months(1) %m+% lubridate::days(-1) + ) + } +} + + +#' conversion d'une variable date en nommage trimestriel +#' +#' @param Periode date à convertire +#' +#' @return une chaine de caractère +#' @importFrom dplyr case_when +#' @importFrom lubridate year month +#' @export +#' +#' @examples +#' FormatCaractere("2010-10-01") +FormatCaractere<-function(Periode) { + trim<- dplyr::case_when( + lubridate::month(Periode) <=3 ~ "T1", + lubridate::month(Periode) <=6 ~ "T2", + lubridate::month(Periode) <=9 ~ "T3", + lubridate::month(Periode) <=12 ~ "T4" + ) + return( + paste0(lubridate::year(Periode),trim) + ) +} + diff --git a/R/creer_graphique_evolution_annuelle.R b/R/creer_graphique_evolution_annuelle.R new file mode 100644 index 0000000000000000000000000000000000000000..988c8ce65621411cf943d31dc07e2e804907d70b --- /dev/null +++ b/R/creer_graphique_evolution_annuelle.R @@ -0,0 +1,57 @@ +#' graphique barre sur un an +#' +#' @param data Le dataframe. +#' @param type_logement Collectifs ou individuels. +#' @param type_zone Liste des types de zonage à intégrer dans la facette. +#' @param titre Le titre du graphique. +#' @param bas_de_page Le bas de page du graphique. +#' +#' @return Un graphique ggplot2. +#' @importFrom dplyr filter mutate arrange +#' @importFrom ggplot2 ggplot aes geom_bar coord_flip geom_label facet_wrap scale_y_continuous labs position_dodge +#' @importFrom scales format_format +#' @importFrom lubridate %m-% +#' @export +creer_graphique_evolution_annuelle<-function(data = indic_ecln, + type_zone = c("R\u00e9gions","D\u00e9partements"), + type_logement = "collectif", + titre="", + bas_de_page=""){ + indic<-c("Encours - Appartements", + "Mises en vente - Appartements", + "Ventes - Appartements") + if (type_logement=="individuel") { + indic<- c("Encours - Maisons", + "Mises en vente - Maisons", + "Ventes - Maisons") + } + + df <- data %>% + dplyr::filter(.data$Indicateur %in% indic, + .data$TypeZone %in% type_zone, + .data$TypeIndicateur=="Cumul annuel", + .data$Periode==max(.data$Periode)|.data$Periode==max(.data$Periode) %m-% years(1)) %>% + dplyr::mutate(Periode=FormatCaractere(.data$Periode), + Indicateur=str_split_fixed(.data$Indicateur," - ",2)[,1]) %>% + dplyr::arrange(.data$Zone) + + ggplot2::ggplot(data = df, ggplot2::aes(x=.data$Periode,weight=.data$Valeur,fill=.data$Indicateur)) + + ggplot2::geom_bar(position=ggplot2::position_dodge())+ + ggplot2::coord_flip()+ + ggplot2::geom_label(data=df, + ggplot2::aes(label=format(round(.data$Valeur),big.mark = " "), + x=.data$Periode, + y=.data$Valeur, + group=.data$Indicateur), + position=position_dodge(0.9), + color="white", + fill="grey", + alpha=.2, + fontface="bold", + hjust=1.2 + )+ + ggplot2::facet_wrap(~.data$Zone,scales="free",ncol=4)+ + ggplot2::scale_y_continuous(labels=scales::format_format(big.mark=" "))+ + ggplot2::labs(title=titre,subtitle="R\u00e9alis\u00e9es sur les 12 derniers mois",x="Trimestre",y="", + caption=bas_de_page,fill="") +} diff --git a/R/data_prep.R b/R/data_prep.R new file mode 100644 index 0000000000000000000000000000000000000000..7eedd7b28af26d6c25e0b1948b5847a9c7235097 --- /dev/null +++ b/R/data_prep.R @@ -0,0 +1,68 @@ +#' datapreparation des données +#' +#' @param reg code region +#' @param abc TRUE si on veut garder les zonages abc +#' @param zone_a_secretiser listes des zonages à secretiser +#' @param marches_a_secretiser liste des marchés à secretiser : individuel, collectif, tous +#' +#' @importFrom COGiter filtrer_cog +#' @importFrom dplyr filter mutate arrange bind_rows +#' @importFrom forcats fct_relevel fct_drop fct_inorder +#' @importFrom lubridate years +#' @importFrom stringr str_split_fixed +#' @importFrom rlang .data +#' @return un dataframe filtré sur la région souhaitée +#' @export +data_prep <- function(reg, abc = TRUE, zone_a_secretiser = "", marches_a_secretiser = "") { + + + + if (abc == FALSE) { + result <- indic_ecln %>% + COGiter::filtrer_cog(reg = reg, garder_supra = ">") %>% + dplyr::mutate(TypeZone = forcats::fct_relevel(.data$TypeZone, "France", "R\u00e9gions", "D\u00e9partements", "Epci")) %>% + dplyr::arrange(.data$TypeZone, .data$Zone) %>% + dplyr::mutate( + Zone = forcats::fct_drop(.data$Zone), + Zone = forcats::fct_inorder(.data$Zone), + marche = stringr::str_split_fixed(.data$Indicateur, "-", n = 2)[, 2], + Valeur = ifelse(.data$Zone %in% zone_a_secretiser & + .data$marche %in% marches_a_secretiser, + NA, + .data$Valeur + ), + TauxEvolution12Mois = ifelse(.data$Zone %in% zone_a_secretiser & + .data$marche %in% marches_a_secretiser, + NA, + .data$TauxEvolution12Mois + ) + ) + } + if (abc == TRUE) { + result <- indic_ecln %>% + COGiter::filtrer_cog(reg = reg, garder_supra = ">") + + abc <- indic_ecln %>% + dplyr::filter(.data$TypeZone == "ABC") + + result <- dplyr::bind_rows(result, abc) + dplyr::mutate(TypeZone = forcats::fct_relevel(as.factor(.data$TypeZone), "France", "R\u00e9gions", "D\u00e9partements", "Epci", "ABC")) %>% + dplyr::arrange(.data$TypeZone, .data$Zone) %>% + dplyr::mutate( + Zone = forcats::fct_drop(.data$Zone), + Zone = forcats::fct_inorder(.data$Zone), + marche = stringr::str_split_fixed(.data$Indicateur, "-", n = 2)[, 2], + Valeur = ifelse(.data$Zone %in% zone_a_secretiser & + .data$marche %in% marches_a_secretiser, + NA, + .data$Valeur + ), + TauxEvolution12Mois = ifelse(.data$Zone %in% zone_a_secretiser & + .data$marche %in% marches_a_secretiser, + NA, + .data$TauxEvolution12Mois + ) + ) + } + return(result) +} diff --git a/R/globals.R b/R/globals.R new file mode 100644 index 0000000000000000000000000000000000000000..c29f011ef37ba66ae3d43fcb652ccb73ea31e7d7 --- /dev/null +++ b/R/globals.R @@ -0,0 +1,3 @@ +utils::globalVariables( + c("liste_zone","indic_ecln","%m-%") +) diff --git a/R/graphique_evolution_trim.R b/R/graphique_evolution_trim.R new file mode 100644 index 0000000000000000000000000000000000000000..895b670bfcd51a7d559435955cdf33bb23daac58 --- /dev/null +++ b/R/graphique_evolution_trim.R @@ -0,0 +1,102 @@ +#' graphique sur un territoire sur un indicateur en moyenne annuelle et valeur trimestrielle +#' +#' @param data Le dataframe avec les données ecln. +#' @param indicateur L'indicateur à visualiser. +#' @param zone Le territoire sur lequel visualiser l'indicateur. +#' @param titre Le titre du graphique. +#' +#' @return un ggplot2 +#' @export +#' @importFrom dplyr select distinct pull filter mutate +#' @importFrom forcats fct_recode +#' @importFrom ggforce geom_mark_circle +#' @importFrom ggplot2 ggplot aes geom_line geom_point margin theme labs guides scale_y_continuous scale_x_date +#' @importFrom glue glue +#' @importFrom gouvdown gouv_colors scale_color_gouv_discrete scale_fill_gouv_discrete +#' @importFrom grid unit +#' @importFrom lubridate quarter year +#' @importFrom stringr str_c +graphique_evolution_trim <- function(data = indic_ecln, + indicateur = "Ventes - Logements", + zone = "Pays de la Loire", + titre = "Ventes de logements neufs en Pays de la Loire") { + per <- data %>% + dplyr::select(.data$Periode) %>% + dplyr::distinct() %>% + dplyr::pull(.data$Periode) + + max_date <- max(per) + + sous_titre <- glue::glue("Au {label_rang(lubridate::quarter(max_date))} trimestre {lubridate::year(max_date)}") + label <- data %>% + dplyr::filter( + .data$Zone == zone, + .data$Indicateur == indicateur + ) %>% + dplyr::filter(.data$Periode == max(.data$Periode)) %>% + dplyr::mutate( + Valeur = ifelse(.data$TypeIndicateur == "Cumul annuel", .data$Valeur / 4, .data$Valeur), + TypeIndicateur = forcats::fct_recode(.data$TypeIndicateur, + "Moyenne annuelle" = "Cumul annuel", + "Valeur trimestrielle" = "Trimestriel" + ) + ) %>% + dplyr::mutate( + description = stringr::str_c( + format(round(.data$Valeur), big.mark = " "), + "\n", + ifelse(.data$TauxEvolution12Mois > 0, "+", ""), + format(round(.data$TauxEvolution12Mois, 1), big.mark = " ", decimal.mark = ","), + " %" + ), + label = ifelse(.data$TypeIndicateur %in% c("Valeur trimestrielle"), + FormatCaractere(.data$Periode), + "Moyenne\nannuelle" + ) + ) + + gg <- data %>% + dplyr::filter( + .data$Zone == zone, + .data$Indicateur == indicateur + ) %>% + dplyr::mutate( + Valeur = ifelse(.data$TypeIndicateur == "Cumul annuel", .data$Valeur / 4, .data$Valeur), + TypeIndicateur = forcats::fct_recode(.data$TypeIndicateur, + "Moyenne annuelle" = "Cumul annuel", + "Valeur trimestrielle" = "Trimestriel" + ) + ) %>% + ggplot2::ggplot() + + ggplot2::aes(x = .data$Periode, y = .data$Valeur, group = .data$TypeIndicateur, linetype = .data$TypeIndicateur, color = .data$TypeIndicateur) + + ggplot2::geom_line() + + ggplot2::geom_point(data = label, ggplot2::aes(x = .data$Periode, y = .data$Valeur, group = .data$TypeIndicateur, color = .data$TypeIndicateur)) + + ggforce::geom_mark_circle( + data = label, ggplot2::aes( + label = .data$label, + fill = .data$TypeIndicateur, + description = .data$description + ), + label.buffer = grid::unit(5, "mm"), + expand = grid::unit(2, "mm"), + label.margin = ggplot2::margin(2, 5, 2, 5, "mm"), + label.colour = "white", + alpha = .5, + label.fill = gouvdown::gouv_colors("bleu_france") + ) + + ggplot2::theme(legend.position = "bottom") + + gouvdown::scale_color_gouv_discrete(palette = "pal_gouv_qual2") + + gouvdown::scale_fill_gouv_discrete(palette = "pal_gouv_qual2") + + ggplot2::labs( + x = "", + y = "Nombre de ventes", + title = titre, + subtitle = sous_titre, + caption = "Source : ECLN\nMoyenne Annuelle : Valeur observ\u00e9e en moyenne sur les 4 derniers trimestres" + ) + + ggplot2::guides(fill = F) + + ggplot2::scale_y_continuous(labels = function(l) format(l, scientific = FALSE, big.mark = " ", decimal.mark = ","), limits = c(0, NA)) + + ggplot2::scale_x_date(date_breaks = "1 year", date_labels = "%Y", limits = c(min(per), max(per) + months(12))) + + return(gg) +} diff --git a/R/graphique_investissement_locatif.R b/R/graphique_investissement_locatif.R new file mode 100644 index 0000000000000000000000000000000000000000..f82df3765281d63237900952943982a787726c75 --- /dev/null +++ b/R/graphique_investissement_locatif.R @@ -0,0 +1,76 @@ +#' Graphique d'évolution de l'investissement locatif +#' +#' @param data le dataframe avec les données ecln +#' @param type_logement Appartements ou Maisons +#' @param type_indicateur cumul annuel ou valeur trimestrielle +#' @param type_zone liste des types de zonage à intégrer dans la facette +#' @param titre titre du graphique +#' @param soustitre sous titre du graphique +#' @param bas_de_page bas de page +#' +#' @return Un graphique ggplot2. +#' @export +#' @importFrom dplyr filter mutate +#' @importFrom forcats fct_drop +#' @importFrom ggplot2 ggplot aes geom_area scale_x_date scale_y_continuous labs facet_wrap +#' @importFrom scales format_format +#' @importFrom stringr str_split_fixed +#' +#' @examples +graphique_investissement_locatif <- function(data = indic_ecln, + type_logement = "Appartements", + type_zone = c("R\u00e9gions","D\u00e9partements"), + type_indicateur = "Cumul annuel", + titre = "", + soustitre = "", + bas_de_page = "") { + indic <- c( + "Ventes hors investissement locatif - Appartements", + "Ventes en investissement locatif - Appartements" + ) + if (type_logement == "Maisons") { + indic <- c( + "Ventes hors investissement locatif - Maisons", + "Ventes en investissement locatif - Maisons" + ) + } + + data_prep <- data %>% + dplyr::filter( + .data$Indicateur %in% indic, + .data$TypeIndicateur == type_indicateur, + .data$TypeZone %in% type_zone + ) %>% + dplyr::mutate( + Zone = forcats::fct_drop(.data$Zone), + Indicateur = stringr::str_split_fixed(.data$Indicateur, " - ", 2)[, 1] + ) + + + p <- ggplot2::ggplot( + data = data_prep, + ggplot2::aes( + x = .data$Periode, + y = .data$Valeur, + color = .data$Indicateur, + fill = .data$Indicateur, + group = .data$Indicateur + ) + ) + + ggplot2::geom_area(alpha = .5) + + ggplot2::scale_x_date(date_labels = "%y", date_breaks = "1 year") + + ggplot2::scale_y_continuous(labels = scales::format_format(big.mark = " ")) + + ggplot2::labs( + title = titre, + subtitle = soustitre, + x = "", + y = "", + fill = "", + color = "", + caption = bas_de_page + ) + if (nlevels(data_prep$Zone) > 1) { + p <- p + ggplot2::facet_wrap(~Zone, scales = "free", ncol = 4) + } + return(p) +} diff --git a/R/graphique_series_temporelles.R b/R/graphique_series_temporelles.R new file mode 100644 index 0000000000000000000000000000000000000000..6b38b31c57016f4a0710908652d02093c2a2970c --- /dev/null +++ b/R/graphique_series_temporelles.R @@ -0,0 +1,45 @@ +#' graphique en série temporelle à facette +#' +#' @param data Le dataframe avec les données ecln. +#' @param type_logement Appartements ou Maisons. +#' @param indicateurs Un vecteur d'indicateur à visualiser dans le graphique. +#' @param type_zone Liste des types de zonage à intégrer dans la facette. +#' @param titre Le titre du graphique. +#' @param bas_de_page Le bas de page du graphique. +#' @param ncol_facet Le nombre de colonnes dans la facette. +#' @return Un graphique ggplot2. +#' @export +#' @importFrom dplyr filter mutate +#' @importFrom ggplot2 ggplot aes geom_line facet_wrap scale_y_continuous scale_x_date labs +#' @importFrom gouvdown scale_color_gouv_discrete +#' @importFrom scales format_format +#' @examples +graphique_series_temporelles<-function(data=indic_ecln, + type_logement="Appartements", + indicateurs = c("Encours","Mises en vente","Ventes"), + type_zone = c("R\u00e9gions","D\u00e9partements"), + titre="", + bas_de_page="", + ncol_facet=4 +){ + indic <- paste0(indicateurs," - ",type_logement) + gg <- data %>% + dplyr::filter(.data$Indicateur %in% indic, + .data$TypeZone %in% type_zone, + .data$TypeIndicateur=="Cumul annuel") %>% + dplyr::mutate(Indicateur=str_split_fixed(.data$Indicateur," - ",2)[,1]) %>% + ggplot2::ggplot() + + ggplot2::aes(x=.data$Periode,y=.data$Valeur,color=.data$Indicateur,fill=.data$Indicateur,group=.data$Indicateur) + + ggplot2::geom_line(size=1.2)+ + ggplot2::facet_wrap(~.data$Zone,scales="free",ncol=ncol_facet)+ + ggplot2::scale_y_continuous(labels=scales::format_format(big.mark=" "),limits=c(0,NA)) + + ggplot2::scale_x_date(date_labels="%y",date_breaks = "1 year") + + gouvdown::scale_color_gouv_discrete(palette = "pal_gouv_qual2") + + ggplot2::labs(title=titre, + x="", + y="", + fill="", + color="", + caption=bas_de_page) + return(gg) +} diff --git a/R/graphique_series_temporelles_prix.R b/R/graphique_series_temporelles_prix.R new file mode 100644 index 0000000000000000000000000000000000000000..06c857ab5d2e605877451ea9347a8f40a8e368df --- /dev/null +++ b/R/graphique_series_temporelles_prix.R @@ -0,0 +1,64 @@ +#' graphique sur l'évolution du prix de vente des biens. +#' +#' @param data Le dataframe. +#' @param type_logement Appartements ou Maisons. +#' @param type_indicateur Cumul annuel ou valeur trimestrielle. +#' @param type_zone Liste des types de zonage à intégrer dans la facette. +#' @param titre Le titre du graphique. +#' @param bas_de_page Le bas de page du graphique. +#' +#' @return Un graphique ggplot2. +#' @export +#' @importFrom dplyr filter mutate +#' @importFrom forcats fct_drop +#' @importFrom ggplot2 ggplot aes geom_line geom_point theme scale_x_date scale_y_continuous labs facet_wrap +#' @importFrom scales dollar_format +#' @importFrom stringr str_split_fixed +#' @importFrom gouvdown scale_color_gouv_discrete +#' @examples +graphique_series_temporelles_prix<-function(data=indic_ecln, + type_logement="Appartements", + type_zone = c("R\u00e9gions","D\u00e9partements"), + type_indicateur = "Cumul annuel", + titre="", + bas_de_page=""){ + indic<-c("PrixM2 - Appartements") + if (type_logement=="Maisons") { + indic<- c("PrixPar - Maisons") + } + + data_prep<-data %>% + dplyr::filter(.data$Indicateur %in% indic, + .data$TypeIndicateur == type_indicateur, + .data$TypeZone %in% type_zone) %>% + dplyr::mutate(Zone = forcats::fct_drop(.data$Zone), + Indicateur=stringr::str_split_fixed(.data$Indicateur," - ",2)[,1]) + + + p<-ggplot2::ggplot(data_prep, + ggplot2::aes(x=.data$Periode, + y=.data$Valeur, + color=.data$Indicateur, + fill=.data$Indicateur, + group=.data$Indicateur)) + + ggplot2::geom_line(size=1.2)+ + ggplot2::geom_point(data= data %>% + dplyr::filter(.data$Indicateur %in% indic, + .data$TypeIndicateur == type_indicateur, + .data$TypeZone %in% type_zone, + .data$Periode==max(.data$Periode)))+ + ggplot2::theme(legend.position = "none")+ + ggplot2::scale_x_date(date_labels="%y",date_breaks = "1 year")+ + ggplot2::scale_y_continuous(labels=scales::dollar_format(big.mark=" ",decimal_mark=",",prefix="",suffix=" \u20ac"))+ + gouvdown::scale_color_gouv_discrete(palette = "pal_gouv_qual2") + + ggplot2::labs(title=titre, + x="", + y="", + fill="", + color="", + caption=bas_de_page) + if (nlevels(data_prep$Zone)>1){ + p<-p+ggplot2::facet_wrap(~Zone,scales="fixed",ncol=4) + } + return(p) +} diff --git a/R/indic_ecln.R b/R/indic_ecln.R new file mode 100644 index 0000000000000000000000000000000000000000..44abe766f17e661ad1ec2b10536cee8003a4b90c --- /dev/null +++ b/R/indic_ecln.R @@ -0,0 +1,16 @@ +#' Table contenant les différents indicateurs de la source ecln utiles pour la publication. +#' +#' @encoding UTF-8 +#' @format Table de `r nrow(indic_ecln)` lignes et `r ncol(indic_ecln)` colonnes: +#' \describe{ +#' \item{TypeZone}{Type de territoire} +#' \item{CodeZone}{Code du territoire} +#' \item{Zone}{Libellé du territoire} +#' \item{TypeIndicateur}{valeur cumulée sur 12 mois ou trimestrielle} +#' \item{Indicateur}{Liste des indicateurs} +#' \item{Periode}{Trimestre d'observation} +#' \item{valeur}{Valeur de l'indicateur pour la modalité de variable} +#' \item{TauxEvolution12Mois}{Evolution de l'indicateur sur 12 mois glissant} +#' } +#' @source \url{https://www.statistiques.developpement-durable.gouv.fr/enquete-sur-la-commercialisation-des-logements-neufs-ecln} +"indic_ecln" diff --git a/R/label_rang.R b/R/label_rang.R new file mode 100644 index 0000000000000000000000000000000000000000..97e4fe3b99725211b3017f92d7717a3cdef4b002 --- /dev/null +++ b/R/label_rang.R @@ -0,0 +1,12 @@ +label_rang <- function(x) { + if (x == 1) { + res <- paste0(x,"er") + } + if (x == 2) { + res <- paste0(x,"nd") + } + if (x > 2) { + res <- paste0(x,"\u00e8me") + } + return(res) +} diff --git a/R/tableau_synthese_annuelle.R b/R/tableau_synthese_annuelle.R new file mode 100644 index 0000000000000000000000000000000000000000..a7474d15308dcd6312b17210a4ebed313d637e7b --- /dev/null +++ b/R/tableau_synthese_annuelle.R @@ -0,0 +1,62 @@ +#' tableau de synthèse des données en cumul annuel +#' +#' @param data Le dataframe. +#' @param type_logement Collectifs ou individuels. +#' @param type_zone Liste des types de zonage à intégrer dans la facette. +#' @return Un table kable +#' @importFrom dplyr filter mutate pull select full_join arrange +#' @importFrom kableExtra kable_styling row_spec add_header_above add_indent +#' @importFrom knitr kable +#' @importFrom stringr str_split_fixed +#' @importFrom tidyr spread +#' @export +tableau_synthese_annuel<-function(data = indic_ecln, + type_zone = c("France","R\u00e9gions","D\u00e9partements"), + type_logement = "collectif" + ){ + indic<-c("Encours - Appartements", + "Mises en vente - Appartements", + "Ventes - Appartements", + "PrixM2 - Appartements") + if (type_logement=="individuel") { + indic<- c("Encours - Maisons", + "Mises en vente - Maisons", + "Ventes - Maisons", + "PrixPar - Maisons") + } + input<-indic_ecln %>% + dplyr::filter(.data$Indicateur %in% indic, + .data$TypeZone %in% type_zone, + .data$TypeIndicateur=="Cumul annuel", + .data$Periode==max(.data$Periode)) %>% + dplyr::mutate(Indicateur=stringr::str_split_fixed(.data$Indicateur,"-",2)[,1]) + + nombre_zone <- length(unique(input$CodeZone)) + nombre_fr_dep_reg <- length(unique(input %>% dplyr::filter(.data$TypeZone %in% c("R\u00e9gions","D\u00e9partements")) %>% dplyr::pull(.data$CodeZone))) + res<- input %>% + dplyr::select(.data$TypeZone,.data$Zone,.data$Indicateur,.data$Valeur) %>% + tidyr::spread(.data$Indicateur,.data$Valeur) %>% + dplyr::full_join( + input %>% + dplyr::select(.data$TypeZone,.data$Zone,.data$Indicateur,.data$TauxEvolution12Mois) %>% + tidyr::spread(.data$Indicateur,.data$TauxEvolution12Mois), + by=c("TypeZone","Zone") + ) %>% + dplyr::arrange(.data$Zone) %>% + dplyr::select(2,6,10,4,8,3,7,5,9) %>% + knitr::kable("html",col.names=c("Zone","Sur les 12 derniers mois","Evolution sur un an (en %)", + "Sur les 12 derniers mois","Evolution sur un an (en %)", + "En fin de p\u00e9riode","Evolution sur un an (en %)", + "Prix moyen sur les 12 derniers mois (en €)","Evolution sur un an (en %)"), + digits=c(0,0,1,0,1,0,1,0,1), + format.args=list(big.mark=" ",decimal.mark=",")) %>% + kableExtra::kable_styling(font_size = 12) %>% + kableExtra::row_spec(1:2, bold = T, background = "#f0f0f5") %>% + kableExtra::add_header_above(c(" "=1, "Ventes" = 2, "Mises en vente" = 2, "Encours" = 2,"Prix au m2"=2)) %>% + kableExtra::add_indent(c(3:nombre_zone)) + if("ABC" %in% type_zone){ + res<-res %>% + kableExtra::row_spec(nombre_fr_dep_reg:nombre_zone, bold = T, background = "#bebece") + } + return(res) +} diff --git a/R/tableau_synthese_trimestrielle.R b/R/tableau_synthese_trimestrielle.R new file mode 100644 index 0000000000000000000000000000000000000000..df9cc90eb10f178ff47d0e21b8f363ebd001da7a --- /dev/null +++ b/R/tableau_synthese_trimestrielle.R @@ -0,0 +1,56 @@ +#' Création du tableau de synthèse trimestrielle +#' +#' @param data Le dataframe. +#' @param type_logement Collectifs ou individuels. +#' +#' @return un tableau kable +#' @export +#' @importFrom dplyr filter mutate select full_join arrange +#' @importFrom kableExtra kable_styling row_spec add_header_above +#' @importFrom knitr kable +#' @importFrom stringr str_split_fixed +#' @importFrom tidyr spread +tableau_synthese_trimestrielle<-function(data = indic_ecln, + type_logement="collectif"){ + + indic<-c("Encours - Appartements", + "Mises en vente - Appartements", + "Ventes - Appartements", + "PrixM2 - Appartements") + if (type_logement=="individuel") { + indic<- c("Encours - Maisons", + "Mises en vente - Maisons", + "Ventes - Maisons", + "PrixPar - Maisons") + } + indic_ecln %>% + dplyr::filter(.data$Indicateur %in% indic, + .data$TypeZone %in% c("France","Régions"), + .data$TypeIndicateur != "Cumul annuel", + .data$Periode==max(.data$Periode)) %>% + dplyr::mutate(Indicateur=str_split_fixed(.data$Indicateur,"-",2)[,1]) %>% + dplyr::select(.data$TypeZone,.data$Zone,.data$Indicateur,.data$Valeur) %>% + tidyr::spread(.data$Indicateur,.data$Valeur) %>% + dplyr::full_join( + indic_ecln %>% + dplyr::filter(.data$Indicateur %in% indic, + .data$TypeZone %in% c("France","Régions"), + .data$TypeIndicateur!="Cumul annuel", + .data$Periode==max(.data$Periode)) %>% + dplyr::mutate(Indicateur=stringr::str_split_fixed(.data$Indicateur,"-",2)[,1]) %>% + dplyr::select(.data$TypeZone,.data$Zone,.data$Indicateur,.data$TauxEvolution12Mois) %>% + spread(.data$Indicateur,.data$TauxEvolution12Mois), + by=c("TypeZone","Zone") + ) %>% + dplyr::arrange(.data$Zone) %>% + dplyr::select(2,6,10,4,8,3,7,5,9) %>% + knitr::kable("html",col.names=c("Zone","Sur le dernier trimestre","Evolution sur un an (en %)", + "Sur le dernier trimestre","Evolution sur un an (en %)", + "En fin de p\u00e9riode","Evolution sur un an (en %)", + "Prix moyen sur le dernier trimestre (en €)","Evolution sur un an (en %)"), + digits=c(0,0,1,0,1,0,1,0,1), + format.args=list(big.mark=" ",decimal.mark=",")) %>% + kableExtra::kable_styling(font_size = 12) %>% + kableExtra::row_spec(1:2, bold = T, background = "#f0f0f5") %>% + kableExtra::add_header_above(c(" "=1, "Ventes" = 2, "Mises en vente" = 2, "Encours" = 2,"Prix au m2"=2)) +} diff --git a/R/utils-pipe.R b/R/utils-pipe.R new file mode 100644 index 0000000000000000000000000000000000000000..e79f3d80856576d6db32c9fb05cdbc02b28f4ff8 --- /dev/null +++ b/R/utils-pipe.R @@ -0,0 +1,11 @@ +#' Pipe operator +#' +#' See \code{magrittr::\link[magrittr:pipe]{\%>\%}} for details. +#' +#' @name %>% +#' @rdname pipe +#' @keywords internal +#' @export +#' @importFrom magrittr %>% +#' @usage lhs \%>\% rhs +NULL diff --git a/data-raw/data-raw-ecln-sas-R.R b/data-raw/data-raw-ecln-sas-R.R new file mode 100644 index 0000000000000000000000000000000000000000..d79714716ca5e5025b0f719146710716343f8e25 --- /dev/null +++ b/data-raw/data-raw-ecln-sas-R.R @@ -0,0 +1,279 @@ +## code to prepare `data-raw-ecln-sas.R` dataset goes here + +library(magrittr) +library(haven) +library(readxl) +library(lubridate) +library(conflicted) +# devtool::install_github("MaelTheuliere/COGiter") +library(COGiter) +library(purrr) +library(dplyr) +library(tidyr) +library(forcats) +library(lubridate) +library(stringr) +library(glue) +library(dtplyr) +options(scipen = 999) +conflict_prefer("filter", "dplyr") +conflict_prefer("lag", "dplyr") +conflict_prefer("union", "dplyr") +conflict_prefer("setdiff", "dplyr") +source("R/FormatDate.R") + +trimestre <- fs::dir_ls(path = "extdata", type = "directory") %>% + stringr::str_replace_all("extdata/","") %>% + max() +trimestre_date <- FormatDate(trimestre, Periodicite = "Trim", sep = "T") + +trimestre_min <- FormatCaractere(trimestre_date-years(5)-months(3)) +file_sas <- glue("extdata/{trimestre}/stat_info_data_regionaux.sas7bdat") +file_redressement <- glue("extdata/{trimestre}/{trimestre}rd1-commercialisation-lgts-neufs.xls") + +ECLN <- read_sas(file_sas) +# Rajout du taux de redressement sur les mises en vente et le stoc -------- +valeur_redressees <- excel_sheets(path = file_redressement)[4:length(excel_sheets(path = file_redressement))] %>% + map(~ read_excel( + path = file_redressement, sheet = .x, + range = "B10:Q10", + col_names = F + ) %>% + select(1:5, 12:14) %>% + setNames(nm = c( + "Annee", "Periode", "Mises en vente - Appartements", "c_nb_resa", "Encours - Appartements", + "Mises en vente - Maisons", "i_nb_resa", "Encours - Maisons" + )) %>% + mutate( + Periode = paste0(Annee, Periode), + REG = .x + ) %>% + select(REG, everything(), -Annee, -c_nb_resa, -i_nb_resa)) %>% + bind_rows() %>% + gather(Indicateur, Valeur, -REG, -Periode) + +# calcul des indicateurs sur la carte des communes contenue dans ecln +# passage des données au cog à jour + +indic_ecln <- ECLN %>% + select(DEPCOM = code_insee, Periode = trim_mev, id_type_lgt, mev_t) %>% + as_tibble() %>% + filter(Periode >= trimestre_min) %>% + group_by(id_type_lgt, DEPCOM, Periode) %>% + summarise(mev_t = sum(mev_t, na.rm = T)) %>% + ungroup() %>% + full_join(ECLN %>% + select(DEPCOM = code_insee, Periode = trimestre_enquete, everything()) %>% + filter(Periode >= trimestre_min) %>% + mutate( + nb_lgt_inv = nb_lgt_inv_t1 + nb_lgt_inv_t2 + nb_lgt_inv_t3 + nb_lgt_inv_t4 + nb_lgt_inv_t5 + nb_lgt_inv_t6, + nb_hors_resa_inv = nb_resa - nb_lgt_inv + ) %>% + group_by(id_type_lgt, DEPCOM, Periode) %>% + summarise( + nb_resa = sum(nb_resa, na.rm = T), + nb_resa_inv = sum(nb_lgt_inv, na.rm = T), + nb_hors_resa_inv = sum(nb_hors_resa_inv, na.rm = T), + stock_fin = sum(stock_fin, na.rm = T), + prix = sum(prix, na.rm = T), + surface = sum(surface, na.rm = T) + ) %>% + ungroup()) %>% + gather(Indicateur, Valeur, mev_t:surface) %>% + mutate( + Periode = factor(Periode), + id_type_lgt = factor(id_type_lgt), + DEPCOM = factor(DEPCOM), + id_type_lgt = fct_recode(id_type_lgt, Maisons = "1", Appartements = "2"), + Indicateur = fct_recode(factor(Indicateur), `Mises en vente` = "mev_t", Ventes = "nb_resa", `Ventes en investissement locatif` = "nb_resa_inv", `Ventes hors investissement locatif` = "nb_hors_resa_inv", Encours = "stock_fin", Prix = "prix", Surface = "surface"), + Indicateur = str_c(Indicateur, " - ", id_type_lgt) + ) %>% + select(-id_type_lgt) %>% + mutate(Valeur = ifelse(is.na(Valeur),0,Valeur)) %>% + passer_au_cog_a_jour(code_commune = DEPCOM, aggrege = T, garder = F) %>% + right_join(communes %>% select(DEPCOM)) %>% + complete(DEPCOM, Periode, Indicateur, + fill = list(Valeur = 0) + ) %>% + filter(!is.na(Indicateur), !is.na(Periode)) %>% + passer_au_cog_a_jour(code_commune = DEPCOM, aggrege = T, garder = T) %>% + select(REG, DEPCOM, Periode, Indicateur, Valeur) %>% + mutate_if(is.character, as.factor) + +# On ne garde que les régions métro +indic_ecln <- indic_ecln %>% + filter(!(REG %in% c("01", "02", "03", "04", "05", "06"))) + + +rm(ECLN) + +taux_redressement <- indic_ecln %>% + filter( + Indicateur %in% unique(valeur_redressees$Indicateur), + as.character(REG) %in% unique(valeur_redressees$REG), + Periode == max(as.character(Periode)) + ) %>% + select(REG, Periode, Indicateur, Valeur) %>% + group_by(REG, Periode, Indicateur) %>% + summarise_all(funs(sum)) %>% + ungroup() %>% + left_join(valeur_redressees, by = c("REG", "Periode", "Indicateur")) %>% + mutate(taux_redressement = ifelse(Valeur.x > 0, Valeur.y / Valeur.x, 1)) %>% + select(REG, Periode, Indicateur, taux_redressement) + +indic_ecln <- indic_ecln %>% + left_join(taux_redressement) %>% + mutate(Valeur = ifelse(Periode == max(Periode) & Indicateur %in% unique(valeur_redressees$Indicateur), + Valeur * taux_redressement, + Valeur + )) %>% + select(-taux_redressement, -REG) %>% + mutate_if(is.character, as.factor) + + +# Calcul sur total logements ---------------------------------------------- + + +indic_ecln <- bind_rows( + indic_ecln, + indic_ecln %>% + mutate(Indicateur = str_split_fixed(Indicateur, " - ", 2)[, 1] %>% str_c(" - Logements") %>% as.factor()) %>% + group_by_if(is.factor) %>% + summarise_all(funs(sum(., na.rm = T))) %>% + ungroup() +) %>% + mutate_if(is.character, as.factor) + +# Aggrégation de l'ensemble des calculs sur les zones ----------------------------------- +indic_ecln <- indic_ecln %>% + group_split(Periode) %>% + furrr::future_map_dfr(cogifier) + +# Rajout des zones abc +# update 2019 +# zonage_abc_r52<-zonage_abc_r52 %>% +# passer_au_cog_a_jour(aggrege = F,garder_info_supra = F) %>% +# distinct() %>% +# arrange(DEPCOM,zonage_abc) %>% +# group_by(DEPCOM) %>% +# slice(1) %>% +# ungroup() + + +indic_ecln_abc <- indic_ecln %>% + filter(TypeZone == "Communes", CodeZone %in% (liste_zone %>% + filter(str_detect(REG, "52"), TypeZone == "Communes") %>% + pull(CodeZone))) %>% + left_join(zonage_abc, by = c("CodeZone" = "DEPCOM")) %>% + select(zonage_abc, Periode, Indicateur, Valeur) %>% + rename(CodeZone = zonage_abc) %>% + mutate( + Zone = CodeZone, + TypeZone = "ABC" + ) %>% + group_by(TypeZone, Zone, CodeZone, Periode, Indicateur) %>% + summarise(Valeur = sum(Valeur)) %>% + ungroup() + +# indic_ecln_pinel <- indic_ecln %>% +# filter(TypeZone == "Communes", CodeZone %in% (liste_zone %>% +# filter(str_detect(REG, "52"), TypeZone == "Communes") %>% +# pull(CodeZone))) %>% +# left_join(zonage_pinel_r52, by = c("CodeZone" = "DEPCOM")) %>% +# select(zonage_pinel, Periode, Indicateur, Valeur) %>% +# rename(CodeZone = zonage_pinel) %>% +# mutate( +# Zone = CodeZone, +# TypeZone = "Pinel" +# ) %>% +# group_by(TypeZone, Zone, CodeZone, Periode, Indicateur) %>% +# summarise(Valeur = sum(Valeur)) %>% +# ungroup() + +# Aggrégation de l'ensemble des calculs sur les zones ----------------------------------- + + +indic_ecln <- bind_rows(indic_ecln, indic_ecln_abc)%>% + arrange(TypeZone, Zone, CodeZone, Indicateur, Periode) %>% + filter(TypeZone != "Communes") + +rm(list=setdiff(ls(),c("indic_ecln","FormatDate"))) + +# Utilisation du package dtplyr pour la performance + +indicateurs_non_sommables <- str_subset(levels(indic_ecln$Indicateur),"Encours") + +indic_ecln <- indic_ecln %>% + lazy_dt() %>% + group_by(TypeZone, Zone, CodeZone, Indicateur) %>% + mutate(Valeur_cumul = Valeur + lag(Valeur) + lag(Valeur, 2) + lag(Valeur, 3) + ) %>% + ungroup() %>% + mutate(Valeur_cumul=ifelse(Indicateur %in% indicateurs_non_sommables,Valeur,Valeur_cumul)) %>% + as_tibble() + + +# Calcul des valeurs trimestrielles et cumul annuel --------------------------- + + +indic_ecln_trim <- indic_ecln %>% + select(-Valeur_cumul) %>% + mutate(Indicateur = str_replace_all(Indicateur, " - ", "_")) %>% + spread(Indicateur, Valeur, fill = 0) %>% + mutate( + PrixM2_Maisons = Prix_Maisons / Surface_Maisons, + PrixM2_Appartements = Prix_Appartements / Surface_Appartements, + PrixM2_Logements = Prix_Logements / Surface_Logements, + PrixPar_Maisons = Prix_Maisons / Ventes_Maisons, + PrixPar_Appartements = Prix_Appartements / Ventes_Appartements, + PrixPar_Logements = Prix_Logements / Ventes_Logements + ) %>% + gather(Indicateur, Valeur, Encours_Appartements:PrixPar_Logements) %>% + mutate( + Indicateur = str_replace_all(Indicateur, "_", " - "), + Periode = FormatDate(Periode, Periodicite = "Trim", sep = "T"), + Source = "ECLN", + TypeIndicateur = "Trimestriel" + ) %>% + filter(Periode > "2010-01-01") + +indic_ecln_cumul <- indic_ecln %>% + select(-Valeur) %>% + mutate(Indicateur = str_replace_all(Indicateur, " - ", "_")) %>% + spread(Indicateur, Valeur_cumul, fill = 0) %>% + mutate( + PrixM2_Maisons = Prix_Maisons / Surface_Maisons, + PrixM2_Appartements = Prix_Appartements / Surface_Appartements, + PrixM2_Logements = Prix_Logements / Surface_Logements, + PrixPar_Maisons = Prix_Maisons / Ventes_Maisons, + PrixPar_Appartements = Prix_Appartements / Ventes_Appartements, + PrixPar_Logements = Prix_Logements / Ventes_Logements + ) %>% + gather(Indicateur, Valeur, Encours_Appartements:PrixPar_Logements) %>% + mutate( + Indicateur = str_replace_all(Indicateur, "_", " - "), + Periode = FormatDate(Periode, Periodicite = "Trim", sep = "T"), + Source = "ECLN", + TypeIndicateur = "Cumul annuel" + ) %>% + filter(Periode > "2011-01-01") + +# Aggrétation finale ----- + +TauxEvolution12Mois <- function(.data) { + .data %>% + arrange(Source, TypeZone, Zone, CodeZone, TypeIndicateur, Indicateur) %>% + select(Source, TypeZone, Zone, CodeZone, TypeIndicateur, Indicateur, Periode, Valeur) %>% + group_by(Source, TypeZone, Zone, CodeZone, TypeIndicateur, Indicateur) %>% + mutate(TauxEvolution12Mois = round(100 * Valeur / lag(Valeur, 4) - 100, 1)) %>% + ungroup() +} +indic_ecln_cumul <- TauxEvolution12Mois(indic_ecln_cumul) +indic_ecln_trim <- TauxEvolution12Mois(indic_ecln_trim) + +indic_ecln <- bind_rows(indic_ecln_cumul, indic_ecln_trim) %>% + mutate_if(is.character, as.factor) %>% + mutate(TypeZone = fct_relevel(TypeZone, "France", "Régions", "Départements", "Epci", "ABC")) + + +usethis::use_data(indic_ecln, overwrite = TRUE) diff --git a/devstuff.R b/devstuff.R new file mode 100644 index 0000000000000000000000000000000000000000..e6f9fc4e33dfdabae64789c37f44efd68019897e --- /dev/null +++ b/devstuff.R @@ -0,0 +1,25 @@ +usethis::create_package(".") +usethis::use_gpl3_license() +usethis::use_build_ignore("devstuff.R") +usethis::use_data_raw("data-raw-ecln-sas.R") +usethis::use_build_ignore("extdata/") +usethis::use_r("FormatDate.R") +usethis::use_package('dplyr') +usethis::use_package('lubridate') +usethis::use_package('stringr') +usethis::use_r("creer_graphique_evolution_annuelle") +usethis::use_r('data_prep') +usethis::use_r('globals') +usethis::use_r("graphique_series_temporelles") +usethis::use_r("graphique_evolution_trim") +usethis::use_r("label_rang") +usethis::use_pipe() +usethis::use_r("indic_ecln") +usethis::use_r("graphique_investissement_locatif.R") +devtools::check() +usethis::use_r("graphique_series_temporelles_prix") +usethis::use_r("tableau_synthese_annuelle") +usethis::use_package('kableExtra') +usethis::use_package('knitr') +usethis::use_package('tidyr') +usethis::use_r("tableau_synthese_trimestrielle") diff --git a/man/FormatCaractere.Rd b/man/FormatCaractere.Rd new file mode 100644 index 0000000000000000000000000000000000000000..70ec83216b5c96e2f017bc41dbfa936c3a73e3d8 --- /dev/null +++ b/man/FormatCaractere.Rd @@ -0,0 +1,20 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/FormatDate.R +\name{FormatCaractere} +\alias{FormatCaractere} +\title{conversion d'une variable date en nommage trimestriel} +\usage{ +FormatCaractere(Periode) +} +\arguments{ +\item{Periode}{date à convertire} +} +\value{ +une chaine de caractère +} +\description{ +conversion d'une variable date en nommage trimestriel +} +\examples{ +FormatCaractere("2010-10-01") +} diff --git a/man/FormatDate.Rd b/man/FormatDate.Rd new file mode 100644 index 0000000000000000000000000000000000000000..5b8a2aa1eff764a959d93c55643c38c2fb9162f7 --- /dev/null +++ b/man/FormatDate.Rd @@ -0,0 +1,24 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/FormatDate.R +\name{FormatDate} +\alias{FormatDate} +\title{Conversion d'une date au mois ou trimestre en format date au jour.} +\usage{ +FormatDate(Periode, Periodicite, sep = "-") +} +\arguments{ +\item{Periode}{caractère une date en format anneetrimestre ou anneemois} + +\item{Periodicite}{caractère Trim si la date est en trimestre, Mois pour une date au mois} + +\item{sep}{le séparateur entre l'année et le mois/trimestre} +} +\value{ +une date au format date +} +\description{ +Conversion d'une date au mois ou trimestre en format date au jour. +} +\examples{ +FormatDate("2010-10", Periodicite = "Mois") +} diff --git a/man/creer_graphique_evolution_annuelle.Rd b/man/creer_graphique_evolution_annuelle.Rd new file mode 100644 index 0000000000000000000000000000000000000000..2dc8809a34495e440862737da6f928a1f984c868 --- /dev/null +++ b/man/creer_graphique_evolution_annuelle.Rd @@ -0,0 +1,31 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/creer_graphique_evolution_annuelle.R +\name{creer_graphique_evolution_annuelle} +\alias{creer_graphique_evolution_annuelle} +\title{graphique barre sur un an} +\usage{ +creer_graphique_evolution_annuelle( + data = indic_ecln, + type_zone = c("Régions", "Départements"), + type_logement = "collectif", + titre = "", + bas_de_page = "" +) +} +\arguments{ +\item{data}{Le dataframe.} + +\item{type_zone}{Liste des types de zonage à intégrer dans la facette.} + +\item{type_logement}{Collectifs ou individuels.} + +\item{titre}{Le titre du graphique.} + +\item{bas_de_page}{Le bas de page du graphique.} +} +\value{ +Un graphique ggplot2. +} +\description{ +graphique barre sur un an +} diff --git a/man/data_prep.Rd b/man/data_prep.Rd new file mode 100644 index 0000000000000000000000000000000000000000..37a21ff8255583bb8e0b426e98e98396ab9202bd --- /dev/null +++ b/man/data_prep.Rd @@ -0,0 +1,23 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/data_prep.R +\name{data_prep} +\alias{data_prep} +\title{datapreparation des données} +\usage{ +data_prep(reg, abc = TRUE, zone_a_secretiser = "", marches_a_secretiser = "") +} +\arguments{ +\item{reg}{code region} + +\item{abc}{TRUE si on veut garder les zonages abc} + +\item{zone_a_secretiser}{listes des zonages à secretiser} + +\item{marches_a_secretiser}{liste des marchés à secretiser : individuel, collectif, tous} +} +\value{ +un dataframe filtré sur la région souhaitée +} +\description{ +datapreparation des données +} diff --git a/man/graphique_evolution_trim.Rd b/man/graphique_evolution_trim.Rd new file mode 100644 index 0000000000000000000000000000000000000000..59d1e135acf5d165bb62c32b97b344d46a226dc3 --- /dev/null +++ b/man/graphique_evolution_trim.Rd @@ -0,0 +1,28 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/graphique_evolution_trim.R +\name{graphique_evolution_trim} +\alias{graphique_evolution_trim} +\title{graphique sur un territoire sur un indicateur en moyenne annuelle et valeur trimestrielle} +\usage{ +graphique_evolution_trim( + data = indic_ecln, + indicateur = "Ventes - Logements", + zone = "Pays de la Loire", + titre = "Ventes de logements neufs en Pays de la Loire" +) +} +\arguments{ +\item{data}{Le dataframe avec les données ecln.} + +\item{indicateur}{L'indicateur à visualiser.} + +\item{zone}{Le territoire sur lequel visualiser l'indicateur.} + +\item{titre}{Le titre du graphique.} +} +\value{ +un ggplot2 +} +\description{ +graphique sur un territoire sur un indicateur en moyenne annuelle et valeur trimestrielle +} diff --git a/man/graphique_investissement_locatif.Rd b/man/graphique_investissement_locatif.Rd new file mode 100644 index 0000000000000000000000000000000000000000..6737a593d7ed9ec44ec58fe185cf42f83fe231e1 --- /dev/null +++ b/man/graphique_investissement_locatif.Rd @@ -0,0 +1,37 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/graphique_investissement_locatif.R +\name{graphique_investissement_locatif} +\alias{graphique_investissement_locatif} +\title{Graphique d'évolution de l'investissement locatif} +\usage{ +graphique_investissement_locatif( + data = indic_ecln, + type_logement = "Appartements", + type_zone = c("Régions", "Départements"), + type_indicateur = "Cumul annuel", + titre = "", + soustitre = "", + bas_de_page = "" +) +} +\arguments{ +\item{data}{le dataframe avec les données ecln} + +\item{type_logement}{Appartements ou Maisons} + +\item{type_zone}{liste des types de zonage à intégrer dans la facette} + +\item{type_indicateur}{cumul annuel ou valeur trimestrielle} + +\item{titre}{titre du graphique} + +\item{soustitre}{sous titre du graphique} + +\item{bas_de_page}{bas de page} +} +\value{ +Un graphique ggplot2. +} +\description{ +Graphique d'évolution de l'investissement locatif +} diff --git a/man/graphique_series_temporelles.Rd b/man/graphique_series_temporelles.Rd new file mode 100644 index 0000000000000000000000000000000000000000..a3c6b09ba65472db00a4ecf2a662b244a5fdc088 --- /dev/null +++ b/man/graphique_series_temporelles.Rd @@ -0,0 +1,37 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/graphique_series_temporelles.R +\name{graphique_series_temporelles} +\alias{graphique_series_temporelles} +\title{graphique en série temporelle à facette} +\usage{ +graphique_series_temporelles( + data = indic_ecln, + type_logement = "Appartements", + indicateurs = c("Encours", "Mises en vente", "Ventes"), + type_zone = c("Régions", "Départements"), + titre = "", + bas_de_page = "", + ncol_facet = 4 +) +} +\arguments{ +\item{data}{Le dataframe avec les données ecln.} + +\item{type_logement}{Appartements ou Maisons.} + +\item{indicateurs}{Un vecteur d'indicateur à visualiser dans le graphique.} + +\item{type_zone}{Liste des types de zonage à intégrer dans la facette.} + +\item{titre}{Le titre du graphique.} + +\item{bas_de_page}{Le bas de page du graphique.} + +\item{ncol_facet}{Le nombre de colonnes dans la facette.} +} +\value{ +Un graphique ggplot2. +} +\description{ +graphique en série temporelle à facette +} diff --git a/man/graphique_series_temporelles_prix.Rd b/man/graphique_series_temporelles_prix.Rd new file mode 100644 index 0000000000000000000000000000000000000000..745fe3209407127374eca6306510a439ae0ed43f --- /dev/null +++ b/man/graphique_series_temporelles_prix.Rd @@ -0,0 +1,34 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/graphique_series_temporelles_prix.R +\name{graphique_series_temporelles_prix} +\alias{graphique_series_temporelles_prix} +\title{graphique sur l'évolution du prix de vente des biens.} +\usage{ +graphique_series_temporelles_prix( + data = indic_ecln, + type_logement = "Appartements", + type_zone = c("Régions", "Départements"), + type_indicateur = "Cumul annuel", + titre = "", + bas_de_page = "" +) +} +\arguments{ +\item{data}{Le dataframe.} + +\item{type_logement}{Appartements ou Maisons.} + +\item{type_zone}{Liste des types de zonage à intégrer dans la facette.} + +\item{type_indicateur}{Cumul annuel ou valeur trimestrielle.} + +\item{titre}{Le titre du graphique.} + +\item{bas_de_page}{Le bas de page du graphique.} +} +\value{ +Un graphique ggplot2. +} +\description{ +graphique sur l'évolution du prix de vente des biens. +} diff --git a/man/indic_ecln.Rd b/man/indic_ecln.Rd new file mode 100644 index 0000000000000000000000000000000000000000..c0bf90f55e932ffcca73eb2cdbe710453b054a02 --- /dev/null +++ b/man/indic_ecln.Rd @@ -0,0 +1,30 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/indic_ecln.R +\docType{data} +\encoding{UTF-8} +\name{indic_ecln} +\alias{indic_ecln} +\title{Table contenant les différents indicateurs de la source ecln utiles pour la publication.} +\format{ +Table de 92664 lignes et 10 colonnes: +\describe{ +\item{TypeZone}{Type de territoire} +\item{CodeZone}{Code du territoire} +\item{Zone}{Libellé du territoire} +\item{TypeIndicateur}{valeur cumulée sur 12 mois ou trimestrielle} +\item{Indicateur}{Liste des indicateurs} +\item{Periode}{Trimestre d'observation} +\item{valeur}{Valeur de l'indicateur pour la modalité de variable} +\item{TauxEvolution12Mois}{Evolution de l'indicateur sur 12 mois glissant} +} +} +\source{ +\url{https://www.statistiques.developpement-durable.gouv.fr/enquete-sur-la-commercialisation-des-logements-neufs-ecln} +} +\usage{ +indic_ecln +} +\description{ +Table contenant les différents indicateurs de la source ecln utiles pour la publication. +} +\keyword{datasets} diff --git a/man/pipe.Rd b/man/pipe.Rd new file mode 100644 index 0000000000000000000000000000000000000000..0eec752616534f156cac398f07bef8cc3f527935 --- /dev/null +++ b/man/pipe.Rd @@ -0,0 +1,12 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/utils-pipe.R +\name{\%>\%} +\alias{\%>\%} +\title{Pipe operator} +\usage{ +lhs \%>\% rhs +} +\description{ +See \code{magrittr::\link[magrittr:pipe]{\%>\%}} for details. +} +\keyword{internal} diff --git a/man/tableau_synthese_annuel.Rd b/man/tableau_synthese_annuel.Rd new file mode 100644 index 0000000000000000000000000000000000000000..680cec671e3f6aa30362712b941fdb0f1eb75e64 --- /dev/null +++ b/man/tableau_synthese_annuel.Rd @@ -0,0 +1,25 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/tableau_synthese_annuelle.R +\name{tableau_synthese_annuel} +\alias{tableau_synthese_annuel} +\title{tableau de synthèse des données en cumul annuel} +\usage{ +tableau_synthese_annuel( + data = indic_ecln, + type_zone = c("France", "Régions", "Départements"), + type_logement = "collectif" +) +} +\arguments{ +\item{data}{Le dataframe.} + +\item{type_zone}{Liste des types de zonage à intégrer dans la facette.} + +\item{type_logement}{Collectifs ou individuels.} +} +\value{ +Un table kable +} +\description{ +tableau de synthèse des données en cumul annuel +} diff --git a/man/tableau_synthese_trimestrielle.Rd b/man/tableau_synthese_trimestrielle.Rd new file mode 100644 index 0000000000000000000000000000000000000000..99bc62e1ddc46ee1fd4242bbd35ef837ad135a79 --- /dev/null +++ b/man/tableau_synthese_trimestrielle.Rd @@ -0,0 +1,19 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/tableau_synthese_trimestrielle.R +\name{tableau_synthese_trimestrielle} +\alias{tableau_synthese_trimestrielle} +\title{Création du tableau de synthèse trimestrielle} +\usage{ +tableau_synthese_trimestrielle(data = indic_ecln, type_logement = "collectif") +} +\arguments{ +\item{data}{Le dataframe.} + +\item{type_logement}{Collectifs ou individuels.} +} +\value{ +un tableau kable +} +\description{ +Création du tableau de synthèse trimestrielle +} diff --git a/propre.ecln.Rproj b/propre.ecln.Rproj new file mode 100644 index 0000000000000000000000000000000000000000..69fafd4b6dddad27500cfc67efb9fb16e86a96bd --- /dev/null +++ b/propre.ecln.Rproj @@ -0,0 +1,22 @@ +Version: 1.0 + +RestoreWorkspace: No +SaveWorkspace: No +AlwaysSaveHistory: Default + +EnableCodeIndexing: Yes +UseSpacesForTab: Yes +NumSpacesForTab: 2 +Encoding: UTF-8 + +RnwWeave: Sweave +LaTeX: pdfLaTeX + +AutoAppendNewline: Yes +StripTrailingWhitespace: Yes +LineEndingConversion: Posix + +BuildType: Package +PackageUseDevtools: Yes +PackageInstallArgs: --no-multiarch --with-keep.source +PackageRoxygenize: rd,collate,namespace