From 470126da5c577b60bfc41525cfa486dc12c008d5 Mon Sep 17 00:00:00 2001 From: MACHIN Date: Tue, 15 Oct 2024 15:59:59 +0100 Subject: [PATCH 1/2] restructure of entire page, swapping embedded videos to links --- RAP/rap-statistics.qmd | 627 ++++++++++++++++++++----------------- images/self-assessment.png | Bin 0 -> 105792 bytes 2 files changed, 336 insertions(+), 291 deletions(-) create mode 100644 images/self-assessment.png diff --git a/RAP/rap-statistics.qmd b/RAP/rap-statistics.qmd index 965c1a93..5e192bf1 100644 --- a/RAP/rap-statistics.qmd +++ b/RAP/rap-statistics.qmd @@ -3,76 +3,84 @@ title: "RAP for Statistics" --- -```{r include=FALSE} -require(knitr) -``` -

Guidance for how to implement the principles of Reproducible Analytical Pipelines (RAP) into statistics production processes

--- -# What is RAP? +## What is RAP? ---- +RAP (Reproducible Analytical Pipelines) are a way to create well documented, reproducible, quality analysis using the best tools available to us as analysts. In 2022, the Analysis Function published their [RAP strategy](https://analysisfunction.civilservice.gov.uk/policy-store/reproducible-analytical-pipelines-strategy/), which outlines the expectation that RAP should be "the default approach to analysis in government". Each department is expected to publish a RAP implementation strategy to explain how they are going to support analysts to embed RAP into their day to day work. You can view the [RAP implementation plans for all departments, including DfE](https://analysisfunction.civilservice.gov.uk/support/reproducible-analytical-pipelines/departmental-rap-plans/) on the Analysis Function website. + +Cam ran an introduction to RAP session for DISD in December 2020. The slides can be found on [GitHub](https://github.com/cjrace/introduction-to-rap){target="_blank" rel="noopener noreferrer"}, or you can [watch the recording](https://educationgovuk.sharepoint.com/:v:/r/sites/lvewp00086/WorkplaceDocuments/Statistics%20Services%20Unit/Statistics%20Development%20Team/Stream%20Migrated%20Videos/Recordings/An%20introduction%20to%20RAP-20201217_024855-Meeting%20Recording.mp4?csf=1&web=1&e=Fz1gXt). + +[RAP](https://dataingovernment.blog.gov.uk/2017/03/27/reproducible-analytical-pipeline/){target="_blank" rel="noopener noreferrer"} means using automation to our advantage when analysing data, which can be as simple as writing code so that we can click a button to execute and do the job for us. Most analysts will be using elements of RAP in their work, such as quality assurance and version control, without even thinking about it! -RAP (Reproducible Analytical Pipelines) is doing well documented, reproducible, quality analysis using the best tools available to us as analysts. +Cross-government RAP champions have laid out a [minimum level of RAP](https://github.com/best-practice-and-impact/rap_mvp_maturity_guidance/blob/master/Reproducible-Analytical-Pipelines-MVP.md){target="_blank" rel="noopener noreferrer"} to aim for. In DfE we have adapted these to form our own RAP baseline standards, which are described in detail on this page. -Cam ran an introduction to RAP session for DISD in December 2020, the slides can be found on [GitHub](https://github.com/cjrace/introduction-to-rap){target="_blank" rel="noopener noreferrer"}, and the recording is embedded below: +::: callout-note +There is currently a clear expectation at DfE that any analyst working in statistics production should know RAP principles and be able to implement them using the recommended tools to meet at least the department’s definitions of “good” and “great” practice. +::: -
- -
+--- -[Reproducible Analytical Pipelines](https://dataingovernment.blog.gov.uk/2017/03/27/reproducible-analytical-pipeline/){target="_blank" rel="noopener noreferrer"}, or RAP for short. The full words still hide the true meaning behind buzzwords and jargon though. What it actually means is using automation to our advantage when analysing data, and this is as simple as writing code such as a SQL query that we can click a button to execute and do the job for us. +### Benefits of RAP -The cross-government group of RAP champions have laid out a [minimum level of RAP](https://github.com/best-practice-and-impact/rap_mvp_maturity_guidance/blob/master/Reproducible-Analytical-Pipelines-MVP.md){target="_blank" rel="noopener noreferrer"} to aim for (note that we have our own levels of practice below, which are building blocks to reach this end goal) +--- -We already have 'analytical pipelines' and have done for many years. The aim of RAP, is to automate the parts of these pipelines that can be automated, to increase efficiency and accuracy, while creating a clear audit trail to allow analyses to easily be re-run if needed. This will free us up to focus on the parts of our work where our human input can really add value. RAP is something we can use to reduce the burden on us by getting rid of some of the boring stuff, what's not to like! +According to the [Analysis Function](https://analysisfunction.civilservice.gov.uk/support/reproducible-analytical-pipelines/), using RAP should: -Cam and Sarah ran a session introducing how to get started with automated QA in relation to RAP, slides are available on [GitHub](https://sarahmwong.github.io/intro-to-automating-QA/#1){target="_blank" rel="noopener noreferrer"} and the recording of the session is below: +* improve the quality of the analysis +* increase trust in the analysis by producers, their managers and users +* create a more efficient process +* improve business continuity and knowledge management -
- -
+In DfE, we already have 'analytical pipelines' and have done for many years. The aim of RAP is to automate the parts of these pipelines that can be automated, to increase efficiency and accuracy, while creating a clear audit trail to allow analyses to easily be re-run if needed. This will free us up to focus on the parts of our work where our human input can really add value. RAP is something we can use to reduce the burden on us by getting rid of some of the boring stuff, what's not to like! RAP can also reduce risk through human error, since you will no longer have to copy and paste numbers between different documents or make substantial manual edits to code each time you need to re-run it. --- -## Our scope +### Our scope +--- -We want to focus on the parts of the production process that we have ownership and control over – so we are focussing on the process from data sources to publishable data files. This is the part of the process where RAP can currently add the most value - automating the production and quality assurance of our outputs currently takes up huge amount of analytical resource, which could be better spent providing insight and other value adding activity.  -`r knitr::include_graphics("../images/RAP-Scope-Arrow.png")` +We want to focus on the parts of the production process that we have ownership and control over – so for statistics production we are focussing on the process from data sources to publishable data files. This is the part of the process where RAP can currently add the most value - automating the production and quality assurance of our outputs currently takes up huge amount of analytical resource, which could be better spent providing insight and other value adding activity.  -In Official Statistics production we are using RAP as a framework for best practice when producing our published data files, as these are the foundations of our publications moving forward. Following this framework will help us to improve and standardise our current production processes and provide a clear 'pipeline' for analysts to follow. This will have the added benefit of setting a clear and defined world of tools and skills required, making learning and development that much clearer and easier. To get started with RAP, we first need to be able to understand what it actually means in practice, and be able to [assess our own work against the principles of RAP](#what-is-expected). +![](../images/RAP-Scope-Arrow.png) -Implementing RAP for us will involve combining the use of SQL, R, and clear, consistent version control to increase efficiency and accuracy in our work. For more information on what these tools are, why we are using them, and resources to help up-skill in those areas, see our [learning resources](../learning-development/learning-development.html) page. +In Official Statistics production we are using RAP as a framework for best practice when producing our published data files, as these are the foundations of our publications moving forward. Following this framework will help us to improve and standardise our current production processes and provide a clear 'pipeline' for analysts to follow. To get started with RAP, we first need to be able to understand what it actually means in practice, and be able to [assess our own work against the principles of RAP](#what-is-expected). From there, we can work out what training is needed, if any, and where additional support can help teams to meet the baseline. -The collection of, and routine checking of data as it is coming into the department is also an area that RAP can be applied to. We have kept this out of scope at the moment as the levels of control in this area vary wildly from team to team. If you would like advice and help to automate any particular processes, feel free to [contact us](mailto:statistics.development@education.gov.uk). +In other areas of analysis, we recommend that RAP principles are applied proportionately. Whilst you wouldn't create a full RAP process for an ad-hoc, you could still version control your code so that it could be reused if similar requests came in, and you should get your code peer reviewed by someone before sending out any results. ---- +Implementing RAP for us will involve combining the use of SQL, R, and clear, consistent version control to increase efficiency and accuracy in our work. For more information on what these tools are, why we are using them, and resources to help upskill in those areas, see our [learning resources](../learning-development/learning-development.html) page. -# Core principles +The collection of, and routine checking of data as it is coming into the department is also an area that RAP can be applied to. We have kept this out of scope at the moment as the levels of control in this area vary wildly from team to team. If you would like advice and help to automate any particular processes, feel free to [contact the Statistics Development Team](mailto:statistics.development@education.gov.uk). --- +## Core principles + +RAP has three core principles: -**Data sources for a publication are stored in the same database** _- [Preparing data](#preparing-data)_ +[Preparing data](#preparing-data): Data sources for a publication are stored in the same database -**Underlying data files are produced using code, with no manual steps** _- [Writing code](#writing-code)_ +[Writing code](#writing-code): Underlying data files are produced using code, with no manual steps -**Files and scripts should be appropriately version controlled** _- [Version control](#version-control)_ + +[Version control](#version-control): Files and scripts should be appropriately version controlled + +Within each of these principles are separate elements of RAP. Each of these is discussed in detail below so that you know what is expected of you as an analyst. --- -# RAP in practice +## RAP in practice ---- -The diagram below highlights what RAP means for us, and the varying levels in which it can be applied in all types of analysis. You can click on each of the hexagons in the diagram to learn more about each of the RAP principles and how to use them in practice. The expectation is that all publications will meet the department's baseline implementation of RAP in the self-assessment tool. It's worth acknowledging that some teams are already working around great and best practice levels, and that we appreciate every team's situation is unique, our guidance is designed to be applicable across all official statistics publications by DfE. +The diagram below highlights what RAP means for us, and the varying levels in which it can be applied in all types of analysis. You can click on each of the hexagons in the diagram to learn more about each of the RAP principles and how to use them in practice. + +The expectation is that all statistics publications will meet the department's baseline implementation of RAP, using the [self-assessment tool](https://rsconnect/rsc/publication-self-assessment/) to monitor their progress. It's worth acknowledging that some teams are already working around great and best practice levels, and that we appreciate every team's situation is unique, our guidance is designed to be applicable across all official statistics publications by DfE. Once teams achieve baseline status, their RAP process will be audited. @@ -87,15 +95,13 @@ The diagram below highlights what RAP means for us, and the varying levels in wh --- -# What is expected - ---- +## What is expected -
-It is expected that **all teams' processes meet all elements of good and great practice** as a baseline. +::: callout-warning +It is expected that all teams' processes meet all elements of good and great practice as a baseline. -Teams are expected to review their own processes using the [publication self-assessment tool](https://rsconnect/rsc/publication-self-assessment){target="_blank" rel="noopener noreferrer"} and use the guidance on this site to start making improvements towards meeting the four core principles if they aren't already. If you would like additional help to review your processes, please contact the [Statistics Development Team](mailto:statistics.development@education.gov.uk). -
+Teams are expected to review their own processes using the [publication self-assessment tool](https://rsconnect/rsc/publication-self-assessment){target="_blank" rel="noopener noreferrer"} and use the guidance on this site to start making improvements towards meeting the core principles if they aren't already. If you would like additional help to review your processes, please contact the [Statistics Development Team](mailto:statistics.development@education.gov.uk). +::: Teams will start from different places and implement changes at different rates, and in different ways. We do not expect that every team will follow the same path, or even end at the same point. Don't worry if this seems overwhelming at first, use the guidance here to identify areas for improvement and then tackle them with confidence. @@ -105,26 +111,16 @@ While working to reach our baseline expectation of good and great practice, you ## How to assess your publication +The checklist provided in the [publication self-assessment tool](https://rsconnect/rsc/publication-self-assessment){target="_blank" rel="noopener noreferrer"}, shown below, is designed to make reviewing our processes against our RAP levels easier, giving a straightforward list of questions to check your work against. This will flag potential areas of improvement, and you can then use the links on the right hand side to go to the specific section of this page to find more detail and guidance on how to develop your current processes in line with best practice. - -The checklist provided in the [publication self-assessment tool](https://rsconnect/rsc/publication-self-assessment){target="_blank" rel="noopener noreferrer"} is designed to make reviewing our processes against our RAP levels easier, giving a straightforward list of questions to check your work against. This will flag potential areas of improvement, and you can then use the links to go to the specific section with more detail and guidance on how to develop your current processes in line with best practice. +![](../images/self-assessment.png) Some teams will already be looking at best practice, while others will still have work to do to achieve the department's baseline of good and great practice. We know that all teams are starting this from different points, and are here to support all teams from their respective starting positions. --- -## Where we need to focus - - - -Most teams have already made progress with their production of tidy data files, and the release of the automated screener has now tied up that end point of the pipeline that we are all currently working towards. - -The key now is for us to build on the work so far and focus on how we improve the quality and efficiency of our production processes up to that point. To do this, we need to make a concerted effort to standardise how we store and access our data, before then automating what we can to reduce the burden of getting the numbers ready and see the benefits of RAP. The exact meaning of this will vary within teams. - ---- - -## How to get started +## How to get started with RAP Check your analysis against the Good, Great and Best practice standards under [RAP in practice](/RAP/rap-statistics.html#rap-in-practice). @@ -132,56 +128,60 @@ Measure your publication against the RAP levels using our [self assessment tool] Once you've assessed your publication, have a look through our guidance below to narrow down how you can get started with improving those parts of your process. -The Statistics Development Team invites teams to take part in our partnership programme to develop their skills and implement RAP principles to a relevant project. Visit our page on [getting started with the partnership programme](../learning-development/learning-development.html#Support_available) for more details. +The [Statistics Development Team](mailto:statistics.development@education.gov.uk) invites teams to take part in our partnership programme to develop their skills and implement RAP principles to a relevant project. Partnership programmes can offer additional resource and dedicated support to your team to implement specific RAP principles. Visit our page on [getting started with the partnership programme](../learning-development/learning-development.html#partnership-programmes) for more details. --- -# How does RAP fit into ADA/Databricks +## How does RAP fit into ADA / Databricks + +Teams can use data held on the Databricks platform to implement RAP principles like version control, automated QA and automated pipelines. If you have an existing pipeline, please see the [ADA guidance on statistics publications](../ADA/ada.html#what-ada-means-for-statistics-publications) to see how migrating to ADA and Databricks will affect your work. --- -See the [ADA guidance on statistics publications](../ADA/ada.html#what-ada-means-for-statistics-publications) to see how migrating to ADA and Databricks will affect your statistics publication pipelines. +## Preparing data ---- +Preparing data is our first core RAP principle, which contains the following elements: + +* [All source data stored in a database](#all-source-data-stored-in-a-database) +* [Files meet data standards](#files-meet-data-standards) +* [Sensible file and folder structure](#sensible-folder-and-file-structure) -# Preparing data +Your team should store the raw data you use to create underlying data in a Microsoft SQL Server database or in the Databricks platform. These are similar to a Sharepoint area or a shared folder, but offer dedicated data storage areas and allow multiple users to use the same file at once. This means that you can also run code against a single source of data, further reducing the risk of error. --- -The first place to start for your teams RAP is to store the raw data you use to create underlying data in a Microsoft SQL Server database. This is similar to a Sharepoint area or a shared folder, but it's a dedicated data storage area which allows multiple users to use the same file at once, and for you to run code against the data in one place. +### All source data stored in a database --- -## All source data stored in a database - -`r knitr::include_graphics("../images/good.svg")` +![](../images/good.svg) **What does this mean?** -When we refer to 'source data', we take this to mean the data you use at the start of the process to create the underlying data files. Any cleaning at the end of a collection will happen before this. +When we refer to 'source data', we take this to mean the data you use at the start of your process to create the underlying data files. Any cleaning at the end of a collection will happen before this. -In order for us to be able to have an end-to-end data pipeline where we can replicate our analysis across the department, we should store all of the raw data needed to create aggregate statistics in a managed Microsoft SQL Server. This includes any lookup tables and all administrative data from collections prior to any manual processing. This allows us to then match and join the data together in an end-to-end process using SQL queries. +In order for us to be able to have an end-to-end data pipeline where we can replicate our analysis across the department, we should store all of the raw data needed to create aggregate statistics in a managed Microsoft SQL Server or in the Databricks platform. This includes any lookup tables and all administrative data from collections prior to any manual processing. This allows us to then match and join the data together in an end-to-end process using SQL queries. -As far as meeting the requirement to have all source data in a database, databases other than SQL may be acceptable, though we can't support them in the same way. +As far as meeting the requirement to have all source data in a database, databases other than SQL or Databricks may be acceptable, though we can't support them in the same way. **Why do it?** The principle is that this source data will remain stable and is the point you can go back to and re-run the processes from if necessary. If for any reason the source data needs to change, your processes will be set up in a way that you can easily re-run them to get updated outputs based on the amended source data with minimal effort. -SQL is a fantastic language for large scale data joining and manipulation; it allows us to replicate end-to-end from raw data to final aggregate statistics output. Having all the data in one place and processing it in one place makes our lives easier, and also helps us when auditing our work and ensuring reproducibility of results. +SQL is a fantastic language for large scale data joining and manipulation; it allows us to replicate end-to-end from raw data to final aggregate statistics output. Having all the data in one place and processing it in one place makes our lives easier, and also helps us when auditing our work and ensuring reproducibility of results. You can run SQL queries against data in SQL Server or in Databricks, although SQL Server makes use of T-SQL and Databricks makes use of Spark SQL. **How to get started** - -For a collection of relevant resources to use when learning SQL, see our [learning resources](../learning-development/learning-development.html) page, and for guidance on best practice when writing SQL queries, see the [writing code](#writing-code) and [documentation](#documentation) sections on this page, as well as the guides immediately below on how to setup and use a SQL database. +For a collection of relevant resources to use when learning SQL, see our [learning resources](../learning-development/learning-development.html) page, and for guidance on best practice when writing SQL queries, see the [writing code](#writing-code) and [documentation](#documentation) sections on this page, as well as the guides immediately below on how to set up and use a SQL database. +For resources to help you learn about Databricks and how to migrate your data into the Unity Catalog, please see our [ADA and Databricks documentation](../ADA/ada.html). Legacy servers will be decommissioned in 2026, and all data will be migrated into the Databricks Unity Catalog instead. --- -### How to set up a SQL working area +#### How to set up a SQL working area --- @@ -189,11 +189,11 @@ There are a few different options, depending on where you want your new area to --- -### Moving data to different areas +#### Moving data to different areas --- -If your data is already in SQL, you can use this snippet of R code to move tables from one area (e.g. the iStore) to another (e.g. your team's modelling area) to ensure all data are stored in a database. +If your data is already in SQL Server, you can use this snippet of R code to move tables from one area (e.g. the iStore) to another (e.g. your team's modelling area) to ensure all data are stored in a database. ``` {r connection_example, eval=FALSE} library(odbc) @@ -227,18 +227,18 @@ dbWriteTable(con_target,"whatever_you_want_to_call_new_table", table_for_transfe --- -### Importing data to SQL Server +#### Importing data to SQL Server --- -There's lots of guidance online of how to import flat files from shared areas into Microsoft SQL server on the internet, including [this guide](https://docs.microsoft.com/en-us/sql/relational-databases/import-export/import-flat-file-wizard?view=sql-server-2017){target="_blank" rel="noopener noreferrer"}. +There's lots of guidance online of how to import flat files from shared areas into Microsoft SQL Server on the internet, including [this guide](https://docs.microsoft.com/en-us/sql/relational-databases/import-export/import-flat-file-wizard?view=sql-server-2017){target="_blank" rel="noopener noreferrer"}. Remember that it is important to import them with consistent, thought-through [naming conventions](#naming-conventions). You will thank yourself later. --- -### How to grant access to your area +#### How to grant access to your area --- @@ -246,22 +246,37 @@ Much like setting up a SQL area, there are different ways to do this depending o --- -## Standardised reference data +### Files meet data standards + +--- +![](../images/good.svg) + +#### Open Data Standards + +--- + +You can find information on our standards for Open Data, including how to assess your data against these standards, on our [Open Data standards page](/statistics-production/ud.html#how-to-check-against-these-standards). + +--- + +#### Standardised reference data + +--- There will of course be cases where some of the data you use is reference data not owned by the DfE, or is available online for you to download rather than in an internal server. There are ways of incorporating this into a reproducible analytical pipeline nicely, sometimes you can even use links/URLs in your code that will always pull the latest data such that you will never need to change the link to reflect updates to the data! --- -### Raw files on GitHub +#### Raw files on GitHub --- -If you want to use reference data from GitHub, you can use the URL to the *raw* file. A common example of when you might want to use this would be to use **geographic lookup tables** that contain names and codes of different geographic levels for EES files (which are available in our [data screener repository](https://github.com/dfe-analytical-services/dfe-published-data-qa){target="_blank" rel="noopener noreferrer"}). +If you want to use reference data from GitHub, you can use the URL to the raw file. A common example of when you might want to use this would be to use geographic lookup tables that contain names and codes of different geographic levels for EES files (which are available in our [data screener repository](https://github.com/dfe-analytical-services/dfe-published-data-qa){target="_blank" rel="noopener noreferrer"}). If you find the data you're interested in within a repository, rather than copying, cloning or downloading the data, you should click the 'raw' button (see the below screenshot). -`r knitr::include_graphics("../images/Github-raw-button.png")` +![](../images/Github-raw-button.png) This should take you to a new window which contains the raw data from the CSV file. Copy the URL from this page, as this is what we can use to pull the latest data into our code. @@ -271,22 +286,101 @@ You can now use this URL as you would use a file path in a `read.csv()` query. F devolved_area_lookup <- read.csv("https://raw.githubusercontent.com/dfe-analytical-services/dfe-published-data-qa/master/data/english_devolved_areas.csv") ``` -The above code snippet will load in the data as it would with any other CSV, however the benefit is if that data file is updated on GitHub, when you run the code it will always pull the latest version. This is especially useful for look up tables and reference data, and is best RAP practice as it removed the need for any manual steps (like downloading, copying & pasting or manually updating the data/code)! +The above code snippet will load in the data as it would with any other CSV, however the benefit is if that data file is updated on GitHub, when you run the code it will always pull the latest version. This is especially useful for lookup tables and reference data, and is best RAP practice as it removed the need for any manual steps (like downloading, copying & pasting or manually updating the data/code!) --- -# Writing code +### Sensible folder and file structure --- -The key thing to remember is that **we should be automating everything we can**, and the key to automation is writing code. Using code is as simple as telling your computer what to do. Code is just a list of instructions in a language that your computer can understand. +![](../images/good.svg) + +**What does this mean?** + +As a minimum you should have a folder that includes all of the final versions of documents produced and published, per release, within a folder for the wider publication. Ask yourself if it would be easy for someone who isn't in the team to find specific files, and if not, is there a better way that you could name and structure your folders to make them more intuitive to navigate? + + +**Why do it?** + +How you organize and name your files will have a big impact on your ability to find those files later and to understand what they contain. You should be consistent and descriptive in naming and organizing files so that it is obvious where to find specific data and what the files contain. + + +**How to get started** + +Some questions to help you consider whether your folder structure is sensible are: + +- Are all documentation, code and outputs for the publication saved in one folder area? +- Is simple version control clearly applied (e.g. having all final files in a folder named "final"? +- Are there sub-folders like 'code', 'documentation'', 'outputs' and 'final' to save the relevant working files in? +- Are you keeping a version log up to date with any changes made to files in this final folder? + +You could also consider using the [create_project() function](https://dfe-analytical-services.github.io/dfeR/reference/index.html#pre-populated-project) from the dfeR package to create a pre-populated folder structure for use with an R project --- -## Processing is done with code +#### Naming conventions + +--- + +Having a **clear** and **consistent** naming convention for your files is critical. Remember that file names should: + +**Be machine readable** -`r knitr::include_graphics("../images/good.svg")` +- Avoid spaces. +- Avoid special characters such as: ~ ! @ # $ % ^ & * ( ) ` ; < > ? , [ ] { } ‘ “. +- Be as short as practicable; overly long names do not work well with all types of software. + + +**Be human readable** + +- Be easy to understand the contents from the name. + + +**Play well with default ordering** + +- Often (though not always!) you should have numbers first, particularly if your file names include dates. +- Follow the [ISO 8601 date standard](https://www.iso.org/iso-8601-date-and-time-format.html) (YYYYMMDD) to ensure that all of your files stay in chronological order. +- Use leading zeros to left pad numbers and ensure files sort properly, e.g. using 01, 02, 03 to avoid 1, 10, 2, 3. + + +If in doubt, take a look at this [presentation](https://speakerdeck.com/jennybc/how-to-name-files){target="_blank" rel="noopener noreferrer"}, or this [naming convention guide by Stanford](https://library.stanford.edu/research/data-management-services/data-best-practices/best-practices-file-naming){target="_blank" rel="noopener noreferrer"}, for examples reinforcing the above. + +--- + + +## Writing code + +Writing code is our second core RAP principle, and is made up of the following elements: + +* [Processing is done with code](#processing-is-done-with-code) +* [Use appropriate tools](#use-appropriate-tools) +* [Whole publication production scripts](#whole-publication-production-scripts) +* [Dataset production scripts](#dataset-production-scripts) +* [Recyclable code for future use](#recyclable-code-for-future-use) +* [Clean final code](#clean-final-code) +* [Peer review of code within team](#peer-review-of-code-within-team) +* [Peer review of code from outside the team](#peer-review-of-code-from-outside-the-team) +* [Basic automated QA](#basic-automated-qa) +* [Publication specific automated QA](#publication-specific-automated-qa) +* [Automated summaries](#automated-summaries) +* [Publication specific automated summaries](#publication-specific-automated-summaries) + + + +::: callout-tip +The key thing to remember is that we should be automating everything we can, and the key to automation is writing code. Using code is as simple as telling your computer what to do. Code is just a list of instructions in a language that your computer can understand. We have links to many resources to help you learn to code on our [learning support page](/learning-development/learning-support.html). +::: + +--- + +### Processing is done with code + +--- + + +![](../images/good.svg) **What does this mean?** @@ -296,9 +390,9 @@ Even steps such as copy and pasting data, or pointing and clicking, are fraught **Why do it?** -Using code brings numerous benefits, computers are far quicker, more accurate, and far more reliable than humans in many of the tasks that we do. Writing out these instructions saves us significant amounts of time, particularly when it can be reused in future years, or even next week when one specific number in the source file suddenly changes, and also provides us with editable documentation for our production processes, saving the need for writing down information in extra documents. +Using code brings numerous benefits. Computers are far quicker, more accurate, and far more reliable than humans in many of the tasks that we do. Writing out these instructions saves us significant amounts of time, particularly when code can be reused in future years, or even next week when one specific number in the source file suddenly changes. Code scripts also provide us with editable documentation for our production processes, saving the need for writing down information in extra documents. -Reliability is a huge benefit of the automation that RAP brings - when one of the lines of data has to be amended a week before publication, it's a life saver to know that you can re-run your process in minutes, and reassuring to know that it will give you the result you want. You can run the same code 100 times, and be confident that it will follow the same steps in the same order every single time. +Reliability is a huge benefit of the automation that RAP brings - when your data has to be amended a week before publication, it's a life saver to know that you can re-run your process in minutes, and reassuring to know that it will give you the result you want. You can run the same code 100 times, and be confident that it will follow the same steps in the same order every single time. **How to get started** @@ -311,7 +405,7 @@ Ensure that any last-minute fixes to the process are written in the code and not --- -### Producing tidy underlying data in SQL +#### Producing tidy underlying data in SQL --- @@ -319,7 +413,7 @@ To get started, here is a [SQL query](https://github.com/TomFranklin/sql-applied --- -### Tidying and processing data in R +#### Tidying and processing data in R --- @@ -328,7 +422,15 @@ To get started, here is a [SQL query](https://github.com/TomFranklin/sql-applied Using the `%>%` pipe in R can be incredibly powerful, and make your code much easier to follow, as well as more efficient. If you aren't yet familiar with this, have a look at [this article](https://seananderson.ca/2014/09/13/dplyr-intro/){target="_blank" rel="noopener noreferrer"} that provides a useful beginners guide to piping and the kinds of functions you can use it for. The possibilities stretch about as far as your imagination, and if you have a function or task you want to do within a pipe, googling 'how do I do X in dplyr r' will usually start to point you in the right direction, alternatively you can [contact us](mailto:statistics.development@education.gov.uk), and we'll be happy to help you figure out how to do what you need. -A quick example of how powerful this is is below, where my_data is processed to create new columns, have column names renamed, have the column names tidied using the [janitor](https://garthtarr.github.io/meatR/janitor.html){target="_blank" rel="noopener noreferrer"} package, blank rows and columns removed, data filtered to only include specific geographic levels, and rows rearranged in order, all in a few lines of easy to follow code: +A quick example of how powerful this is is below. The pipe operator passes the outcome of each line of code onto the next, so you can complete multiple steps of data manipulation in one section of code instead of writing separate steps for each one. In this code, we: + +* start with my_data +* calculate a percentage column using mutate +* rename the percentage column we created to "newPercentageColumn", rename "number" to "numberColumn", and rename "population" to "totalPopulationColumn" +* use the `clean_names()` function from the [janitor](https://cran.r-project.org/web/packages/janitor/vignettes/janitor.html) package to ensure that columns have consistent naming standards +* use the `remove_empty()` function from the janitor package to remove any rows and columns that are composed entirely of NA values +* filter the dataframe to only include Regional geographic level data +* order the dataframe by time period and region name ```{r example, eval=FALSE, style="background-color: #f7fdfa"} @@ -351,11 +453,12 @@ For further resources on learning R so that you're able to apply it to your ever --- +### Use appropriate tools -## Appropriate tools +--- -`r knitr::include_graphics("../images/good.svg")` +![](../images/good.svg) **What does this mean?** @@ -382,86 +485,84 @@ By following [our guidance](#Version_controlled_final_code_scripts) in saving ve --- -## Using 'run' scripts - - -Utilising a single 'run' script to execute processes written in other scripts brings a number of benefits. It isn't just about removing the need to manually trigger different code scripts to get the outputs, but it means the entire process, from start to finish, is fully documented in one place. This has a huge number of benefits, particularly for enabling new team members to pick up existing work quickly, without wasting time struggling to understand what has been done in the past. +### Whole publication production scripts --- -### Connecting R to SQL +![](../images/best.svg) ---- +**What does this mean?** -In order to create a single script to run all processes from, it is likely that you will need to use R to run SQL queries. If you are unsure of how to do this, take a look the guide on the [dfeR connecting to SQL documentation](https://dfe-analytical-services.github.io/dfeR/articles/connecting_to_sql.html). +The ultimate aim is to utilise a single script to document and run off everything for a publication, the data files, any QA, any summary reports. This script should allow you to run individual outputs by themselves as well, so make sure that each data file can be run in isolation by running single lines of this script. +All quality assurance for a file is also included in the single script that can be used to create a file from source data (see the [dataset production scripts section](#dataset-production-scripts)) -If you prefer a video, Chris Mason-Thom did a coffee and coding session on this, which you can watch below: +**Why do it?** -
- -
+This carries all of the same benefits as having a single 'run' script for a file, but at a wider publication level, effectively documenting the entire publication process in one place. This makes it easier for new analysts to pick up the process, as well as making it quicker and easier to rerun as all reports relating to that file are immediately available if you ever make changes file. ---- +**How to get started** -### Dataset production scripts +The Education, Health and Care Plans production cycle is a good example of a single publication 'run' script. They have kept their actual data processing in SQL, but all the running and manipulation of the data happens in R. ---- +The cycle originally consisted of multiple SQL scripts, manual QA and generation of final files. -`r knitr::include_graphics("../images/great.svg")` +![](../images/Old process.jpg) -**What does this mean?** +The team now have their end-to-end process fully documented, which can be run off of one single R script. The 'run' script points at the SQL scripts to run them all in one go, and also creates a QA report and corresponding metadata files that pass the data screener. Each data file can still be run in isolation from this script. -Each dataset can be created by running a single script, which may 'source' multiple scripts within it. This **does not** mean that all of the code to create a file must be written in a single script, but instead that there is a single 'create file' or 'run' script that sources every step in the correct order such that every step from beginning to end will be executed if you run that single 'run' script. +![](../images/New process.jpg) -This 'run' script should take the source data right through to final output at the push of a button, including any manipulation, aggregation, suppression etc. +--- +#### Using 'run' scripts -**Why do it?** -Having a script that documents the whole process for this saves time when needing to rerun processes, and provides a clear documentation of how a file is produced. +Utilising a single 'run' script to execute processes written in other scripts brings a number of benefits. It isn't just about removing the need to manually trigger different code scripts to get the outputs, but it means the entire process, from start to finish, is fully documented in one place. This has a huge number of benefits, particularly for enabling new team members to pick up existing work quickly, without wasting time struggling to understand what has been done in the past. +--- -**How to get started** +#### Connecting R to SQL -Review your current process - how many file scripts does it take to get from source data to final output, why are they separated, and what order should they be run in? Do you still have manual steps that could introduce human error (for example, manually moving column orders around in excel)? +--- -You should automate any manual steps such as the example above. If it makes sense to, you could combine certain scripts to reduce the number. You can then write code in [R](../learning-development/r.html) to execute your scripts in order, so you are still only running one script to get the final output. +In order to create a single script to run all processes from, it is likely that you will need to use R to run SQL queries. If you are unsure of how to do this, take a look the guide on the [dfeR connecting to SQL documentation](https://dfe-analytical-services.github.io/dfeR/articles/connecting_to_sql.html). + +If you prefer a video, [Chris Mason-Thom did a coffee and coding session on this](https://web.microsoftstream.com/embed/video/c9b7fd97-c854-4a1a-9074-cd80d2ea285e). --- -### Whole publication production scripts +### Dataset production scripts --- -`r knitr::include_graphics("../images/best.svg")` +![](../images/great.svg) **What does this mean?** -The ultimate aim is to utilise a single script to document and run off everything for a publication, the data files, any QA, any summary reports. This script should allow you to run individual outputs by themselves as well, so make sure that each data file can be run in isolation by running single lines of this script. -All quality assurance for a file is also included in the single script that can be used to create a file from source data (see the [dataset production scripts section](#dataset-production-scripts)) +Each dataset can be created by running a single script, which may 'source' multiple scripts within it. This **does not** mean that all of the code to create a file must be written in a single script, but instead that there is a single 'create file' or 'run' script that sources every step in the correct order such that every step from beginning to end will be executed if you run that single 'run' script. -**Why do it?** +This 'run' script should take the source data right through to final output at the push of a button, including any manipulation, aggregation, suppression etc. -This carries all of the same benefits as having a single 'run' script for a file, but at a wider publication level, effectively documenting the entire publication process in one place. This makes it easier for new analysts to pick up the process, as well as making it quicker and easier to rerun as all reports relating to that file are immediately available if you ever make changes file. -**How to get started** +**Why do it?** -The Education, Health and Care Plans production cycle is a good example of a single publication 'run' script. They have kept their actual data processing in SQL, but all the running and manipulation of the data happens in R. +Having a script that documents the whole process for this saves time when needing to rerun processes, and provides a clear documentation of how a file is produced. -The cycle originally consisted of multiple SQL scripts, manual QA and generation of final files. -`r knitr::include_graphics("../images/Old process.jpg")` +**How to get started** -The team now have their end-to-end process fully documented, which can be run off of one single R script. The 'run' script points at the SQL scripts to run them all in one go, and also creates a QA report and corresponding metadata files that pass the data screener. Each data file can still be run in isolation from this script. +Review your current process - how many file scripts does it take to get from source data to final output, why are they separated, and what order should they be run in? Do you still have manual steps that could introduce human error (for example, manually moving column orders around in excel)? + +You should automate any manual steps such as the example above. If it makes sense to, you could combine certain scripts to reduce the number. You can then write code in [R](../learning-development/r.html) to execute your scripts in order, so you are still only running one script to get the final output. -`r knitr::include_graphics("../images/New process.jpg")` --- -## Recyclable code for future use +### Recyclable code for future use +--- -`r knitr::include_graphics("../images/great.svg")` +![](../images/great.svg) **What does this mean?** @@ -499,8 +600,9 @@ data_filtered_last_year <- data %>% --- -## Standards for coding +#### Standards for coding +--- Code can be written in many different ways, and in languages such as R, there are often many different functions and routes that you can take to get to the same end result. On top of that, there are even more possibilities for how you can format the code. This section will take you through some widely used standards for coding to help bring standardisation to this area and make it easier to both write and use our code. @@ -510,7 +612,7 @@ Code can be written in many different ways, and in languages such as R, there ar --- -`r knitr::include_graphics("../images/best.svg")` +![](../images/best.svg) **What does this mean?** @@ -528,17 +630,18 @@ Clean code is efficient, easy to write, easy to review, and easy to amend for fu **How to get started** -Watch the coffee and coding session introducing good code practice below: +Watch [this coffee and coding session](https://web.microsoftstream.com/embed/video/624e3442-aa66-44e7-bb4f-717a6508b056) introducing good code practice, which covers: -
- -
+* key principles of good code practice +* writing and refining code to make it easier to understand and modify +* a real-life example of code improvement from within DfE -Then you should also watch the follow up intermediate session: +Then you should also watch [the follow up intermediate session](https://web.microsoftstream.com/embed/video/92d4ba05-d304-4009-b543-e5f4563f1d30), which covers: -
- -
+* version control +* improving code structure with functions +* documentation and Markdown +* interactive notebooks Clean code should include comments. Comment why you've made decisions, don't comment what you are doing unless it is particularly complex as the code itself describes what you are doing. If in doubt, more comments are better than too few though. Ideally any specific comments or documentation should be alongside the code itself, rather than in separate documents. @@ -548,7 +651,7 @@ Clean code should include comments. Comment why you've made decisions, don't com --- -For best practice on writing SQL code, here is a particularly useful [word document](../resources/TSQL_Coding_Standards.docx){target="_blank" rel="noopener noreferrer"} produced by our [Data Hub](https://educationgovuk.sharepoint.com/sites/DataHubProgramme2/Shared%20Documents/Content%20Management/Data%20Hub%20one%20pager.pdf){target="_blank" rel="noopener noreferrer"}. This outlines a variety of best practices, ranging from naming conventions, to to formatting your SQL code so that it is easy to follow visually. +For best practice on writing T-SQL code used in SQL Server, here is a particularly useful [Word document](../resources/TSQL_Coding_Standards.docx){target="_blank" rel="noopener noreferrer"} produced by our [Data Hub](https://educationgovuk.sharepoint.com/sites/DataHubProgramme2/Shared%20Documents/Content%20Management/Data%20Hub%20one%20pager.pdf){target="_blank" rel="noopener noreferrer"}. This outlines a variety of best practices, ranging from naming conventions, to formatting your SQL code so that it is easy to follow visually. --- @@ -558,13 +661,15 @@ For best practice on writing SQL code, here is a particularly useful [word docum When using R, it is generally best practice to use [R projects](https://support.rstudio.com/hc/en-us/articles/200526207-Using-Projects){target="_blank" rel="noopener noreferrer"} as directories for your work. -The recommended standard for styling your code in R, is the [tidyverse styling](https://style.tidyverse.org/){target="_blank" rel="noopener noreferrer"}, which is fast becoming the global standard. What is even better is that you can automate this using the [styler](https://styler.r-lib.org/){target="_blank" rel="noopener noreferrer"} package, which will literally style your code for you at the click of a button, and is well worth a look. +The recommended standard for styling your code in R is the [tidyverse styling](https://style.tidyverse.org/){target="_blank" rel="noopener noreferrer"}, which is fast becoming the global standard. What is even better is that you can automate this using the [styler](https://styler.r-lib.org/){target="_blank" rel="noopener noreferrer"} package, which will literally style your code for you at the click of a button, and is well worth a look. -`r knitr::include_graphics("../images/styler.gif")` +![](../images/styler.gif) There is also plenty of guidance around the internet for [best practice](https://waterdata.usgs.gov/blog/intro-best-practices/){target="_blank" rel="noopener noreferrer"} when writing [efficient R code](https://waterdata.usgs.gov/blog/intro-best-practices/){target="_blank" rel="noopener noreferrer"}. +To help you standardise your code further, you can make use of the functions contained within our [dfeR package](https://dfe-analytical-services.github.io/dfeR/index.html). The package includes functions to standardise formatting and rounding, to pull the latest ONS geography lookups, and to create a pre-populated folder structure, amongst many other things. + --- #### HTML @@ -575,13 +680,44 @@ If you ever find yourself writing HTML, or creating it through RMarkdown, you ca --- -## Peer reviewing code +### Peer review of code within team + +--- + +![](../images/great.svg) +**What does this mean?** Peer review is an important element of quality assuring our work. We often do it without realising by bouncing ideas off of one another and by getting others to 'idiot check' our work. When writing code, ensuring that we get our work formally peer reviewed is particularly important for ensuring it's quality and value. The [Duck Book](https://best-practice-and-impact.github.io/qa-of-code-guidance/peer_review.html) and [Tidyteam](https://code-review.tidyverse.org/) contain detailed guidance on peer review, but we have summarised some of the information here for you as well. Prior to receiving code for peer review, the author should ensure that all code files are clean, commented appropriately and for larger projects should be held in a repo with an appropriate [README](#writing-a-readme-file) file. +You should check: + +- Is someone else in the team able to generate the same outputs? + +- Has someone else in the team reviewed the code and given feedback? + +- Have you taken on their feedback and improved the code? + + +**Why do it?** + +There are many benefits to this, for example: + +- Ensuring consistency across the team + +- Minimizing mistakes and their impact + +- Ensuring the requirements are met + +- Improving code performance + +- Sharing of techniques and knowledge + + +**How to get started** + When peer reviewing code you should consider the following questions - * Do you understand what the code does? If not, is there supporting documentation or code comments that allow you to understand it? @@ -615,46 +751,6 @@ If you're unfamiliar with giving feedback on someone's code then it can be daunt * Actions - ask the person receiving feedback to suggest actions that they could follow to avoid this issue in future * Review - if you have time, revisit the discussion to look for progress following on from the feedback ---- - -### Review of code within team - ---- - -`r knitr::include_graphics("../images/great.svg")` - -**What does this mean?** - -- Is someone else in the team able to generate the same outputs? - -- Has someone else in the team reviewed the code and given feedback? - -- Have you taken on their feedback and improved the code? - - -**Why do it?** - -There are many benefits to this, for example: - -- Ensuring consistency across the team - -- Minimizing mistakes and their impact - -- Ensuring the requirements are met - -- Improving code performance - -- Sharing of techniques and knowledge - - -**How to get started** - -If you can't answer yes, then: - -- Get a member of the team to run the code using only your documentation - -- Use their feedback to improve documentation/in-line comments in code - - Other tips for getting started with peer review can be found in the [Duck Book](https://best-practice-and-impact.github.io/qa-of-code-guidance/peer_review.html){target="_blank" rel="noopener noreferrer"} - The Duck Book also contains some helpful [code QA checklists](https://best-practice-and-impact.github.io/qa-of-code-guidance/checklists.html){target="_blank" rel="noopener noreferrer"} to help get you thinking about what to check @@ -691,11 +787,11 @@ Unit: microseconds --- -### Review of code from outside the team +### Peer review of code from outside the team --- -`r knitr::include_graphics("../images/best.svg")` +![](../images/best.svg) **What does this mean?** @@ -713,8 +809,13 @@ While peer reviewing code within the team is often practical, having external an --- -## Automated quality assurance (QA) +### Basic automated QA + +--- +![](../images/good.svg) + +**What does this mean?** Any data files that have been created will need to be quality assured. These checks should be automated where possible, so the computer is doing the hard work - saving us time, and to ensure their reliability. @@ -724,15 +825,7 @@ It is assumed that when using R, automated scripts will output .html reports tha For more information on general quality assurance best practice in DfE, see the [How to QA guide](https://dfe-analytical-services.github.io/how-to-qa/index.html). ---- - -### Basic automated QA - ---- - -`r knitr::include_graphics("../images/good.svg")` - -**What does this mean?** +Cam and Sarah ran a session introducing how to get started with automated QA in relation to RAP, slides are available on [GitHub](https://sarahmwong.github.io/intro-to-automating-QA/#1){target="_blank" rel="noopener noreferrer"} or you can [watch the recording of the session](https://web.microsoftstream.com/embed/video/57eab29d-afeb-4651-a9f5-687098b84d13). The list of basic automated QA checks, with code examples can be found below and in our [GitHub repository](https://github.com/dfe-analytical-services/automated-data-qa){target="_blank" rel="noopener noreferrer"}: @@ -766,7 +859,7 @@ Try using our [template code snippets](https://github.com/dfe-analytical-service --- -`r knitr::include_graphics("../images/great.svg")` +![](../images/great.svg) **What does this mean?** @@ -785,23 +878,18 @@ For those who are interested in starting writing their own QA scripts, it's wort The [janitor](https://garthtarr.github.io/meatR/janitor.html){target="_blank" rel="noopener noreferrer"} package in R also has some particularly useful functions, such as `clean_names()` to automatically clean up your variable names, `remove_empty()` to remove any completely empty rows and columns, and `get_dupes()` which retrieves any duplicate rows in your data - this last one is particularly powerful as you can feed it specific columns and see if there's any duplicate instances of values across those columns. ---- - -## Automating summary statistics - - -As a part of automating QA, we should also be looking to automate the production of summary statistics alongside the tidy underlying data files, this then provides us with instant insight into the stories underneath the numbers. - --- ### Automated summaries --- -`r knitr::include_graphics("../images/great.svg")` +![](../images/great.svg) **What does this mean?** +As a part of automating QA, we should also be looking to automate the production of summary statistics alongside the tidy underlying data files, this then provides us with instant insight into the stories underneath the numbers. + Summary outputs are automated and used to explore the stories of the data. The Statistics Development Team have developed [the QA app](https://rsconnect/rsc/dfe-published-data-qa/){target="_blank" rel="noopener noreferrer"} to include some of these automated summaries, including minimum, maximum and average summaries for each indicator. @@ -834,7 +922,7 @@ Consider: --- -`r knitr::include_graphics("../images/best.svg")` +![](../images/best.svg) **What does this mean?** @@ -857,78 +945,31 @@ Consider: --- -# Version control - ---- - -_When you assume you make an 'ass' out of 'u' and 'me'_. Everyone knows this saying, yet few of us heed its warning. - -The aim should be to leave your work in a state that others (including future you!), can pick it up and immediately find what they need, understanding the processes that have happened previously. Changes to files should be documented, and published versions should be clearly named and stored in their own folder. - -As we work with code to process our data more and more, we can begin to utilise version control software to make this process much easier, allowing simultaneous collaboration on files. - ---- - -## Sensible folder and file structure - - -`r knitr::include_graphics("../images/good.svg")` +## Version control -**What does this mean?** - -As a minimum you should have a folder that includes all of the final versions of documents produced and published, per release, within a folder for the wider publication. Ask yourself if it would be easy for someone who isn't in the team to find specific files, and if not, is there a better way that you could name and structure your folders to make them more intuitive to navigate? - - -**Why do it?** +Version control is our third core RAP principle, and is made up of the following elements: -How you organize and name your files will have a big impact on your ability to find those files later and to understand what they contain. You should be consistent and descriptive in naming and organizing files so that it is obvious where to find specific data and what the files contain. +* [Documentation](#documentation) +* [Version controlled final code scripts](#version-controlled-final-code-scripts) +* [Use open source repositories](#use-open-source-repositories) +* [Collaboratively develop code using Git](#collaboratively-develop-code-using-git) +Version control is just a way to track changes to files. Using proper version control can avoid lots of potential problems, including running old scripts by accident, losing files, or ending up with a folder full of documents with suffixes like "final_final_FINAL". It also makes it much easier for new people to pick up your processes. -**How to get started** - -Some questions to help you consider whether your folder structure is sensible are: +_When you assume you make an 'ass' out of 'u' and 'me'_. Everyone knows this saying, yet few of us heed its warning. -- Are all documentation, code and outputs for the publication saved in one folder area? -- Is simple version control clearly applied (e.g. having all final files in a folder named "final"? -- Are there sub-folders like 'code', 'documentation'', 'outputs' and 'final' to save the relevant working files in? -- Are you keeping a version log up to date with any changes made to files in this final folder? - ---- +The aim should be to leave your work in a state that others (including future you!), can pick it up and immediately find what they need, understanding the processes that have happened previously. Changes to files should be documented, and published versions should be clearly named and stored in their own folder. -### Naming conventions +As we work with code to process our data more and more, we can begin to utilise version control software to make this process much easier, allowing simultaneous collaboration on files. --- -Having a **clear** and **consistent** naming convention for your files is critical. Remember that file names should: - - -**Be machine readable** - -- Avoid spaces. -- Avoid special characters such as: ~ ! @ # $ % ^ & * ( ) ` ; < > ? , [ ] { } ‘ “. -- Be as short as practicable; overly long names do not work well with all types of software. - - -**Be human readable** - -- Be easy to understand the contents from the name. - - -**Play well with default ordering** - -- Often (though not always!) you should have numbers first, particularly if your file names include dates. -- Follow the ISO 8601 date standard (YYYYMMDD) to ensure that all of your files stay in chronological order. -- Use leading zeros to left pad numbers and ensure files sort properly, avoiding 1,10,2,3. - - -If in doubt, take a look at this [presentation](https://speakerdeck.com/jennybc/how-to-name-files){target="_blank" rel="noopener noreferrer"}, or this [naming convention guide by Stanford](https://library.stanford.edu/research/data-management-services/data-best-practices/best-practices-file-naming){target="_blank" rel="noopener noreferrer"}, for examples reinforcing the above. +### Documentation --- -## Documentation - -`r knitr::include_graphics("../images/good.svg")` +![](../images/good.svg) **What does this mean?** @@ -950,7 +991,7 @@ Take a look at the sections below for further guidance on improving your documen --- -### Commenting in code +#### Commenting in code --- @@ -994,7 +1035,7 @@ You might be thinking that it would be nice if there was software that could hel --- -### Writing a README file +#### Writing a README file --- @@ -1018,14 +1059,6 @@ As a starting point, you should aim to have as many of the following sections as The [Self-assessment tool](https://github.com/dfe-analytical-services/publication-self-assessment-copy){target="_blank" rel="noopener noreferrer"} and the [QA app](https://github.com/dfe-analytical-services/dfe-published-data-qa){target="_blank" rel="noopener noreferrer"} give two examples of readme files structured like this. ---- - -## Version control with git - - -If you do not already have git downloaded, you can [download the latest version from their website](https://git-scm.com/downloads). - -For now, take a look at at the [resources for learning git](../learning-development/git.html) in the learning resources section. --- @@ -1033,12 +1066,16 @@ For now, take a look at at the [resources for learning git](../learning-developm --- -`r knitr::include_graphics("../images/great.svg")` +![](../images/great.svg) **What does this mean?** This means having the final copies of code and documentation saved in a git-controlled Azure DevOps repo in the official-statistics-production area. Access to DevOps is restricted only to people in DfE with specific account permissions. This is different to GitHub, which makes code publicly available. +If you do not already have git downloaded, you can [download the latest version from their website](https://git-scm.com/downloads). + +For now, take a look at at the [resources for learning git](../learning-development/git.html) in the learning resources section. + **Why do it?** Having the final copy of the scripts version controlled gives assurance around how the data was created. It also allows teams to easily record any last minute changes to the code after the initial final version by using the version control to log this. @@ -1052,21 +1089,29 @@ We have a specific area set up for you to host your publication code in on the d To gain access to this area, please raise a request on service desk by navigating through the pages detailed in the animation below. -`r knitr::include_graphics("../images/servicedesk_request.gif")` +![](../images/servicedesk_request.gif) Once you have navigated to this page, fill out the form with the following details and send your request off. -`r knitr::include_graphics("../images/devops_request_details.PNG")` +![](../images/devops_request_details.PNG) Access is usually granted within a few working days. Alert the [Statistics Development Team](mailto:statistics.development@education.gov.uk) when this is confirmed, and we will set up your repository and give your team access. --- +#### renv + +--- + +We recommend the use of the [renv package](https://rstudio.github.io/renv/articles/renv.html) to help maintain consistent versions of packages within your work. You can learn more about how to use renv [on our R page](../learning-development/r.html#renv). + +--- + ### Use open source repositories --- -`r knitr::include_graphics("../images/best.svg")` +![](../images/best.svg) **What does this mean?** @@ -1095,7 +1140,7 @@ You should consider the following principles making an Official Statistics produ When naming your publication's repository you should use the publication name fully written out, in lower case, and with dashes for spaces – ‘graduate-labour-market-statistics’. -A single repository should be used for all releases of your publication, there's no need to have multiple as all the history is saved within previous commits. You can make use of [tagging releases in git](../learning-development/git.html#Tagging_release_versions) to help differentiate between each cycle. +A single repository should be used for all releases of your publication, there's no need to have multiple as all the history is saved within previous commits. You can make use of [tagging releases in Git](../learning-development/git.html#Tagging_release_versions) to help differentiate between each cycle. --- @@ -1108,22 +1153,22 @@ Here are some general best practice tips: - Using .gitignore to ignore files and folders to prevent committing anything sensitive - Never committing outputs unless they’ve been checked over, even aggregates. We suggest only outputting to an output folder which is in the .gitignore file, to ensure this doesn’t happen by mistake - Keeping datasets and secrets (e.g. API keys) outside the repository as much as possible, make use of secure variables -- Checking git histories: if someone is planning on open-sourcing code that has previously been in a private repository or only version-controlled locally, you want to be careful not to have anything sensitive in the commit history. You can do this by following the above rules. When in doubt, you can remove the git history and start the public repo without it +- Checking Git histories: if someone is planning on open-sourcing code that has previously been in a private repository or only version-controlled locally, you want to be careful not to have anything sensitive in the commit history. You can do this by following the above rules. When in doubt, you can remove the git history and start the public repo without it - You can [remove a file from the entire commit history](https://docs.github.com/en/github/authenticating-to-github/keeping-your-account-and-data-secure/removing-sensitive-data-from-a-repository) if you did commit anything sensitive, although you still need to follow the usual procedures if this was a data breach -You can find out more in the duck book's [guidance on using git](https://best-practice-and-impact.github.io/qa-of-code-guidance/version_control.html#avoid-commiting-sensitive-information-to-git-repositories). +You can find out more in the Duck Book's [guidance on using Git](https://best-practice-and-impact.github.io/qa-of-code-guidance/version_control.html#avoid-commiting-sensitive-information-to-git-repositories). --- -### Collaboratively develop code using git +### Collaboratively develop code using Git --- -`r knitr::include_graphics("../images/best.svg")` +![](../images/best.svg) **What does this mean?** -- Has code development taken place in git, collaboratively across the team? +- Has code development taken place in Git, collaboratively across the team? - Are you making use of pull requests for team members to review and comment on code updates? @@ -1132,7 +1177,7 @@ You can find out more in the duck book's [guidance on using git](https://best-pr **Why do it?** -Using git allows multiple people to simultaneously develop the same code using branches, all with a crystal clear audit trail showing what changes were made when using commits. It makes it easy for team members to review changes via pull requests. +Using Git allows multiple people to simultaneously develop the same code using branches, all with a crystal clear audit trail showing what changes were made when using commits. It makes it easy for team members to review changes via pull requests. **How to get started** @@ -1140,15 +1185,15 @@ To get started you should: --- -#### Get your code into a git controlled folder +#### Get your code into a Git controlled folder --- -Get code into a git controlled folder in whatever version it is currently in. Use the following steps to do so: +Get code into a Git controlled folder in whatever version it is currently in. Use the following steps to do so: 1. Open the folder where your project is saved, right click anywhere in that window, and click "Git Bash Here". -2. This will open a black box. Type in the following and hit enter +2. This will open a black box (the terminal). Type in the following and hit enter ``` {r git_init, eval=FALSE} git init @@ -1166,11 +1211,11 @@ git remote add origin YOUR_URL_HERE git push -f origin --all ``` -* You may be prompted for either your windows or git credentials at this stage. +* You may be prompted for either your Windows or Git credentials at this stage. - + If prompted for your **windows** credentials, enter the username and password combination you use to log into your DfE device. + + If prompted for your **Windows** credentials, enter the username and password combination you use to log into your DfE device. - + If prompted for your **git** credentials, visit your online repository, click on the blue "clone" box, and click "generate git credentials". This will generate a username and password for you to enter. + + If prompted for your **Git** credentials, visit your online repository, click on the blue "clone" box, and click "generate Git credentials". This will generate a username and password for you to enter. 4. Visit your repository online, and check that all the files have uploaded. Other members of your team will now be able to work from your code. @@ -1187,7 +1232,7 @@ git push -f origin --all To clone code, they will need to do the following: -1. Run through steps 1 - 2a of [getting a file into a git controlled folder](#get-your-code-into-a-git-controlled-folder) +1. Run through steps 1 - 2a of [getting a file into a Git controlled folder](#get-your-code-into-a-git-controlled-folder) 3. After running those lines, type in the following with your repository URL in the "YOUR_URL_HERE" space. This will clone the online repository to your local area. @@ -1195,8 +1240,8 @@ To clone code, they will need to do the following: git clone YOUR_URL_HERE ``` -- Make use of git and version control in your team projects regularly. Like learning anything new, putting it into practice regularly is the best way to become confident in using it. +- Make use of Git and version control in your team projects regularly. Like learning anything new, putting it into practice regularly is the best way to become confident in using it. -Please refer to the other links on the [Git learning resources](../learning-development/git.html#other-resources) page to learn more about how to use git in practice. +Please refer to the other links on the [Git learning resources](../learning-development/git.html#other-resources) page to learn more about how to use Git in practice. --- diff --git a/images/self-assessment.png b/images/self-assessment.png new file mode 100644 index 0000000000000000000000000000000000000000..116aaf32eed37815210b117ff69d4a053073e1f0 GIT binary patch literal 105792 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ΞReW)?!8Di&``Q$CGU^@@&M3gdu_Ovcvh8t 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 literal 0 HcmV?d00001 From 2c70227d163d7dd131c210ae52bd7130f47a810e Mon Sep 17 00:00:00 2001 From: MACHIN Date: Wed, 23 Oct 2024 13:08:43 +0100 Subject: [PATCH 2/2] addressing review comments --- RAP/rap-statistics.qmd | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/RAP/rap-statistics.qmd b/RAP/rap-statistics.qmd index 5e192bf1..10524631 100644 --- a/RAP/rap-statistics.qmd +++ b/RAP/rap-statistics.qmd @@ -51,7 +51,7 @@ In Official Statistics production we are using RAP as a framework for best pract In other areas of analysis, we recommend that RAP principles are applied proportionately. Whilst you wouldn't create a full RAP process for an ad-hoc, you could still version control your code so that it could be reused if similar requests came in, and you should get your code peer reviewed by someone before sending out any results. -Implementing RAP for us will involve combining the use of SQL, R, and clear, consistent version control to increase efficiency and accuracy in our work. For more information on what these tools are, why we are using them, and resources to help upskill in those areas, see our [learning resources](../learning-development/learning-development.html) page. +Implementing RAP for us will involve combining the use of SQL, R, and clear, consistent version control to increase efficiency and accuracy in our work. For more information on what these tools are, why we are using them, and resources to help upskill in those areas, see our [learning resources](../learning-development/learning-support.html) page. The collection of, and routine checking of data as it is coming into the department is also an area that RAP can be applied to. We have kept this out of scope at the moment as the levels of control in this area vary wildly from team to team. If you would like advice and help to automate any particular processes, feel free to [contact the Statistics Development Team](mailto:statistics.development@education.gov.uk). @@ -88,7 +88,7 @@ The expectation is that all statistics publications will meet the department's b hex-diagram -
+
@@ -128,7 +128,7 @@ Measure your publication against the RAP levels using our [self assessment tool] Once you've assessed your publication, have a look through our guidance below to narrow down how you can get started with improving those parts of your process. -The [Statistics Development Team](mailto:statistics.development@education.gov.uk) invites teams to take part in our partnership programme to develop their skills and implement RAP principles to a relevant project. Partnership programmes can offer additional resource and dedicated support to your team to implement specific RAP principles. Visit our page on [getting started with the partnership programme](../learning-development/learning-development.html#partnership-programmes) for more details. +The [Statistics Development Team](mailto:statistics.development@education.gov.uk) invites teams to take part in our partnership programme to develop their skills and implement RAP principles to a relevant project. Partnership programmes can offer additional resource and dedicated support to your team to implement specific RAP principles. Visit our page on [getting started with the partnership programme](../learning-development/learning-support.html#partnership-programmes) for more details. --- @@ -345,7 +345,7 @@ Having a **clear** and **consistent** naming convention for your files is critic - Use leading zeros to left pad numbers and ensure files sort properly, e.g. using 01, 02, 03 to avoid 1, 10, 2, 3. -If in doubt, take a look at this [presentation](https://speakerdeck.com/jennybc/how-to-name-files){target="_blank" rel="noopener noreferrer"}, or this [naming convention guide by Stanford](https://library.stanford.edu/research/data-management-services/data-best-practices/best-practices-file-naming){target="_blank" rel="noopener noreferrer"}, for examples reinforcing the above. +If in doubt, take a look at this [presentation](https://speakerdeck.com/jennybc/how-to-name-files){target="_blank" rel="noopener noreferrer"}, or this [naming convention guide by Stanford](https://drive.google.com/file/d/12A4qZNwmL4s2NH8Ex161jgiJ9HrA06ZZ/view?pli=1){target="_blank" rel="noopener noreferrer"}, for examples reinforcing the above. --- @@ -397,7 +397,7 @@ Reliability is a huge benefit of the automation that RAP brings - when your data **How to get started** -See our [learning resources](../learning-development/learning-development.html) for a wealth of resources on SQL and R to learn the skills required to translate your process into code. +See our [learning resources](../learning-development/learning-support.html) for a wealth of resources on SQL and R to learn the skills required to translate your process into code. There are also two sections below with examples of tidying data in SQL and R to get you started. @@ -462,9 +462,9 @@ For further resources on learning R so that you're able to apply it to your ever **What does this mean?** -Using the recommended tools on our [learning](../learning-development/learning-development.html) page ([SQL](../learning-development/sql.html), [R](../learning-development/r.html) and [Git](../learning-development/git.html)), or other suitable alternatives that allow you to meet the [core principles](#core-principles). Ideally any tools used would be open source, Python is a good example of a tool that would also be well suited, though is less widely used in DfE and has a steeper learning curve than R. +Using the recommended tools on our [learning](../learning-development/learning-support.html) page ([SQL](../learning-development/sql.html), [R](../learning-development/r.html) and [Git](../learning-development/git.html)), or other suitable alternatives that allow you to meet the [core principles](#core-principles). Ideally any tools used would be open source, Python is a good example of a tool that would also be well suited, though is less widely used in DfE and has a steeper learning curve than R. -Open-source refers to something people can modify and share because its design is publicly accessible. For more information, take a look at this [explanation of open-source](https://opensource.com/resources/what-open-source){target="_blank" rel="noopener noreferrer"}, as well as this guide to [working in an open-source way](https://opensource.com/open-source-way){target="_blank" rel="noopener noreferrer"}. In practical terms, this means moving away from the likes of SPSS, SASS and Excel VBA, and utilising the likes of R or Python, version controlled with git, and hosted in a publicly accessible repository. +Open-source refers to something people can modify and share because its design is publicly accessible. For more information, take a look at this [explanation of open-source](https://opensource.com/resources/what-open-source){target="_blank" rel="noopener noreferrer"}, as well as this guide to [working in an open-source way](https://opensource.com/open-source-way){target="_blank" rel="noopener noreferrer"}. In practical terms, this means moving away from the likes of SPSS, SAS and Excel VBA, and utilising the likes of R or Python, version controlled with git, and hosted in a publicly accessible repository. **Why do it?** @@ -479,9 +479,9 @@ There are many reasons why we have recommended the tools that we have, the recom **How to get started** -Go to our [learning](../learning-development/learning-development.html) page to read more about the recommended tools for the jobs we do, as well as looking at the resources available there for how to [build capability](../learning-development/learning-development.html#general_resources) in them. Always feel free to contact us if you have any specific questions or would like help in understanding how to use those tools in your work. +Go to our [learning](../learning-development/learning-development.html) page to read more about the recommended tools for the jobs we do, as well as looking at the resources available there for how to [build capability](../learning-development/learning-support.html#general_resources) in them. Always feel free to contact us if you have any specific questions or would like help in understanding how to use those tools in your work. -By following [our guidance](#Version_controlled_final_code_scripts) in saving versions of code in an Azure DevOps, we will then be able to mirror those repositories in a publicly available GitHub area. +By following [our guidance](#version-controlled-final-code-scripts) in saving versions of code in an Azure DevOps, we will then be able to mirror those repositories in a publicly available GitHub area. --- @@ -651,7 +651,7 @@ Clean code should include comments. Comment why you've made decisions, don't com --- -For best practice on writing T-SQL code used in SQL Server, here is a particularly useful [Word document](../resources/TSQL_Coding_Standards.docx){target="_blank" rel="noopener noreferrer"} produced by our [Data Hub](https://educationgovuk.sharepoint.com/sites/DataHubProgramme2/Shared%20Documents/Content%20Management/Data%20Hub%20one%20pager.pdf){target="_blank" rel="noopener noreferrer"}. This outlines a variety of best practices, ranging from naming conventions, to formatting your SQL code so that it is easy to follow visually. +For best practice on writing T-SQL code used in SQL Server, here is a particularly useful [Word document](../resources/TSQL_Coding_Standards.docx){target="_blank" rel="noopener noreferrer"} produced by our Data Hub. This outlines a variety of best practices, ranging from naming conventions, to formatting your SQL code so that it is easy to follow visually. --- @@ -873,7 +873,7 @@ Quality is one of the three pillars that our [code of practice](https://code.sta We expect that the basic level of automated QA will cover most needs that publication teams have. However, we also expect that each publication will have it's own quirks that require a more bespoke approach. An example of a publication with it's own bespoke QA checks will appear in this space shortly. For the time being, try to consider what things you'd usually check as flags that something hasn't gone right with your data. What are the unique aspects of your publication's data, and how can you automate checks against them to give you confidence in it's accuracy and reliability? -For those who are interested in starting writing their own QA scripts, it's worth looking at packages in R such as [testthat](https://testthat.r-lib.org/){target="_blank" rel="noopener noreferrer"}, including the [coffee and coding talk](https://educationgovuk.sharepoint.com/sites/sarpi/g/WorkplaceDocuments/Forms/AllItems.aspx?RootFolder=/sites/sarpi/g/WorkplaceDocuments/Inducation%20learning%20and%20career%20development/Coffee%20and%20Coding/190306_peter_autotesting&FolderCTID=0x012000C61C1076C17C5547A6D6D8C2A27B5D97&View=%7b2B35083D-7626-48E2-9615-451544742692%7d){target="_blank" rel="noopener noreferrer"} on it by Peter Curtis, as well as this [guide on testing](http://r-pkgs.had.co.nz/tests.html){target="_blank" rel="noopener noreferrer"} by Hadley Wickham. +For those who are interested in starting writing their own QA scripts, it's worth looking at packages in R such as [testthat](https://testthat.r-lib.org/){target="_blank" rel="noopener noreferrer"}, including the [coffee and coding resources](https://educationgovuk.sharepoint.com/:f:/r/sites/sarpi/g/WorkplaceDocuments/Induction%20learning%20and%20career%20development/Coffee%20and%20Coding/190306_peter_autotesting?csf=1&web=1&e=F945Xq){target="_blank" rel="noopener noreferrer"} on it by Peter Curtis, as well as this [guide on testing](http://r-pkgs.had.co.nz/tests.html){target="_blank" rel="noopener noreferrer"} by Hadley Wickham. The [janitor](https://garthtarr.github.io/meatR/janitor.html){target="_blank" rel="noopener noreferrer"} package in R also has some particularly useful functions, such as `clean_names()` to automatically clean up your variable names, `remove_empty()` to remove any completely empty rows and columns, and `get_dupes()` which retrieves any duplicate rows in your data - this last one is particularly powerful as you can feed it specific columns and see if there's any duplicate instances of values across those columns. @@ -1074,7 +1074,7 @@ This means having the final copies of code and documentation saved in a git-cont If you do not already have git downloaded, you can [download the latest version from their website](https://git-scm.com/downloads). -For now, take a look at at the [resources for learning git](../learning-development/git.html) in the learning resources section. +For now, take a look at the [resources for learning git](../learning-development/git.html) in the learning resources section. **Why do it?**