Lesson 1: Data Cleaning and Manipulation with dplyr
Introduction
Welcome to the first lesson of our course, “Learn R by working on practical, real-world projects.” In this lesson, we will focus on data cleaning and manipulation using the dplyr
package in R. Data cleaning is a crucial step in any data analysis project, and it often takes up a significant portion of the time spent in data projects. dplyr
provides a powerful toolkit to streamline this process.
Why Data Cleaning and Manipulation are Important
Data is rarely perfect when you first obtain it. It may contain missing values, inconsistencies, or errors that can significantly impact the results of your analysis. Effective data cleaning ensures that your data is accurate, consistent, and suitable for analysis. Manipulation, on the other hand, allows arranging, filtering, and transforming your data to gain insights and solve real-world problems.
Overview of dplyr
dplyr
is part of the ‘tidyverse’—a collection of R packages designed for data science. It provides a consistent set of functions that help you in:
Setup Instructions
Before we start, ensure that you have R and RStudio installed on your machine. Then, install the dplyr
package by running the following command in your R console:
install.packages("dplyr")
Load the dplyr
package into your R session with:
library(dplyr)
Essential Functions in dplyr
Let’s explore some of the most commonly used functions in dplyr
.
1. Select
The select()
function allows you to choose specific columns from a dataset.
select(data_frame, column1, column2, ...)
Example:
select(mtcars, mpg, cyl, wt)
2. Filter
The filter()
function helps filter rows based on specified conditions.
filter(data_frame, condition)
Example:
filter(mtcars, mpg > 20)
3. Arrange
The arrange()
function is used to sort rows in ascending or descending order.
arrange(data_frame, column)
Example:
arrange(mtcars, desc(mpg))
4. Mutate
The mutate()
function creates new columns or modifies existing ones.
mutate(data_frame, new_column = some_function(existing_column))
Example:
mutate(mtcars, weight_kg = wt * 0.453592)
5. Summarize and Group By
The summarize()
function, often used alongside group_by()
, provides a way to calculate summary statistics.
summarize(data_frame, summary_function(column))
Example:
mtcars %>%
group_by(cyl) %>%
summarize(mean_mpg = mean(mpg))
6. Joins
dplyr
provides several functions (left_join()
, right_join()
, inner_join()
, full_join()
) to combine multiple datasets.
Example of left_join
:
left_join(data_frame1, data_frame2, by = "common_column")
Real-life Example
Let’s imagine you are an analyst at a company that sells fitness equipment online, and you have a dataset containing customer orders (orders
) and product details (products
). You need to:
orders
dataset.Here’s how you would do this with dplyr
.
# Load necessary libraries
library(dplyr)
# Select relevant columns
orders_selected <- select(orders, order_id, product_id, total_cost, date)
# Filter rows
orders_filtered 100)
# Arrange rows
orders_sorted <- arrange(orders_filtered, date)
# Mutate to create a new column
orders_with_profit <- mutate(orders_sorted, profit = total_cost - cost)
# Summarize to get average profit by product category
average_profit %
group_by(product_category) %>%
summarize(avg_profit = mean(profit))
# Join with product details
detailed_orders <- left_join(orders_with_profit, products, by = "product_id")
Conclusion
Congratulations! You now have a comprehensive understanding of how to clean and manipulate data using dplyr
in R. Mastering these techniques will prepare you for handling real-world data and making insightful decisions. In future lessons, we’ll build upon these foundations to tackle more complex data analysis challenges.
Proceed to the next lesson where we’ll dive into data visualization techniques using ggplot2
. Happy coding!
Lesson 2: Exploratory Data Analysis with ggplot2
Welcome to the second lesson of the “Learn R by working on practical, real-world projects” course. In this lesson, we will focus on learning how to perform Exploratory Data Analysis (EDA) using the powerful ggplot2
package in R.
Introduction to ggplot2
ggplot2
is an R package for creating elegant and informative data visualizations. Developed by Hadley Wickham, ggplot2
implements the grammar of graphics, a theory of data visualization that describes the components that make up a plot. With ggplot2
, we can build plots layer by layer by adding different components to create complex visualizations.
Key Concepts of ggplot2
1. The Grammar of Graphics
The grammar of graphics provides a structured, systematic approach to creating visualizations. The major components include:
2. Basic Structure of ggplot2 Code
The general structure for creating plots in ggplot2
involves initializing a ggplot
object with data and aesthetics, then adding geometries and other components.
library(ggplot2)
ggplot(data = , aes(x = , y = )) +
geom_() +
facet_() +
theme_()
Creating Visualizations with ggplot2
Let’s walk through some common types of plots you can create with ggplot2
.
3. Scatter Plot
A scatter plot visualizes the relationship between two continuous variables.
ggplot(data = mpg, aes(x = displ, y = hwy)) +
geom_point() +
labs(title = "Engine Displacement vs Highway Miles per Gallon")
4. Line Plot
A line plot displays trends over time or ordered categories.
ggplot(economics, aes(x = date, y = unemploy)) +
geom_line() +
labs(title = "US Unemployment over Time")
5. Bar Plot
A bar plot is used to display the distribution of a categorical variable.
ggplot(data = diamonds, aes(x = cut)) +
geom_bar() +
labs(title = "Distribution of Diamond Cut Quality")
6. Histogram
A histogram shows the distribution of a continuous variable.
ggplot(data = diamonds, aes(x = carat)) +
geom_histogram(binwidth = 0.1) +
labs(title = "Distribution of Diamond Carat Sizes")
7. Box Plot
A box plot visualizes the distribution of a continuous variable and is useful for identifying outliers.
ggplot(data = mpg, aes(x = manufacturer, y = hwy)) +
geom_boxplot() +
coord_flip() +
labs(title = "Highway Miles per Gallon by Manufacturer")
Customizing your Plots
ggplot2
allows extensive customization to make your plots more informative and visually appealing.
Changing Axis Labels and Titles
ggplot(data = mpg, aes(x = displ, y = hwy)) +
geom_point() +
labs(title = "Engine Displacement vs Highway Miles per Gallon",
x = "Engine Displacement (L)",
y = "Highway Miles per Gallon")
Adding Colors and Themes
ggplot(data = mpg, aes(x = displ, y = hwy, color = class)) +
geom_point() +
scale_color_manual(values = c("red", "blue", "green", "orange", "purple", "brown", "pink")) +
theme_minimal() +
labs(title = "Engine Displacement vs Highway Miles per Gallon",
x = "Engine Displacement (L)",
y = "Highway Miles per Gallon")
Faceting
Faceting splits your data into multiple plots based on a categorical variable.
ggplot(data = mpg, aes(x = displ, y = hwy)) +
geom_point() +
facet_wrap(~ class) +
labs(title = "Engine Displacement vs Highway Miles per Gallon")
Conclusion
In this lesson, you learned how to use the ggplot2
package in R for Exploratory Data Analysis. We covered the grammar of graphics, the structure of ggplot2
code, creating different types of plots, and customizing your visualizations. With these tools, you can start to explore and understand your data more effectively.
Next, we’ll explore more advanced visualization techniques and combine them with data manipulation skills to create comprehensive data analysis workflows.
Lesson 3: Building Interactive Web Apps with Shiny
In this lesson, we will cover the fundamentals of building interactive web applications using Shiny, an R package that makes it easy to build interactive and user-friendly web apps. By the end of this lesson, you will understand how to create dynamic web applications, add interactivity to your visualizations, and deploy your Shiny apps.
Introduction to Shiny
Shiny is an R package that enables you to build interactive web applications directly from R. It provides a powerful framework for building web applications that allows users to input data, interact with plots and tables, and receive instant feedback.
Key Components of a Shiny App
A Shiny app typically consists of the following components:
Building Your First Shiny App
Let’s walk through creating a simple Shiny app step by step.
UI Layout
The UI defines the structure and layout of the web app. It is defined using fluidPage()
, sidebarLayout()
, sidebarPanel()
, and mainPanel()
functions to layout the different sections of your app.
Example UI:
library(shiny)
ui <- fluidPage(
titlePanel("My First Shiny App"),
sidebarLayout(
sidebarPanel(
sliderInput("bins", "Number of bins:", min = 1, max = 50, value = 30)
),
mainPanel(
plotOutput("distPlot")
)
)
)
Server Logic
The server function defines how the app responds to user inputs. This is where the core logic of the app is implemented.
Example Server:
server <- function(input, output) {
output$distPlot <- renderPlot({
x <- faithful$waiting
bins <- seq(min(x), max(x), length.out = input$bins + 1)
hist(x, breaks = bins, col = 'darkgray', border = 'white')
})
}
Running the App
To run the app, you use the shinyApp()
function, passing it the UI and server components.
shinyApp(ui = ui, server = server)
When you run this code, it will launch a web browser displaying your Shiny app with an interactive histogram.
Adding Interactivity
The real power of Shiny comes from its reactivity system. Reactivity allows your app to dynamically update elements without needing a page reload. Let’s look at some ways to add interactivity:
Reactive Inputs
Inputs like selectInput()
, sliderInput()
, and textInput()
allow users to interact with the app by providing their own data.
Reactive Outputs
Outputs are updated automatically in response to changes in inputs. Examples include plotOutput()
, tableOutput()
, and textOutput()
.
Reactive Expressions
Reactive expressions let you define a piece of code that should re-run whenever the inputs it depends on change.
Example:
reactiveHist <- reactive({
x <- faithful$waiting
bins <- seq(min(x), max(x), length.out = input$bins + 1)
hist(x, breaks = bins, col = 'darkgray', border = 'white')
})
output$distPlot <- renderPlot({
reactiveHist()
})
Real-Life Examples
To build more complex and useful Shiny apps, you can integrate various data sources, perform real-time analysis, and create interactive dashboards.
Example: Interactive Data Explorer
An interactive data explorer allows users to upload their own datasets, filter and manipulate the data, and visualize the results dynamically.
Example: Financial Dashboard
A financial dashboard could display stock prices and indicators, update automatically based on user-selected stock symbols, and provide real-time analytics.
Deploying Shiny Apps
Once you have built your app, you’ll want to deploy it so others can access it. You can deploy Shiny apps to:
Conclusion
Shiny enables R users to build sophisticated and interactive web applications with ease. You have learned the basics of creating a Shiny app, integrating reactive expressions, and deploying your app. With these skills, you can create interactive visualizations and tools that allow users to explore data dynamically.
Next Steps
Practice building your own Shiny apps with different datasets and visualizations. Explore advanced features like custom HTML/CSS for more polished layouts and integrating Shiny with databases for more complex applications.
Lesson 4: Time Series Analysis and Forecasting in R
Introduction
Time series analysis is a statistical method used to analyze time-ordered data points. It is widely used across various fields like finance, economics, environmental studies, and more. In this lesson, we’ll explore the fundamental concepts of time series analysis and forecasting, helping you to apply these techniques in R on real-world projects.
Key Concepts
Time Series Data
Time series data is a sequence of data points recorded over time at regular intervals. It is often represented in a dataframe with date/time stamps.
Components of Time Series
Time Series Decomposition
Time series decomposition involves splitting data into trend, seasonality, and noise. This helps in understanding underlying patterns and in making accurate forecasts.
Example: Using the decompose()
function in R.
ts_data <- ts(your_data, frequency = 12)
decomposed <- decompose(ts_data)
plot(decomposed)
Stationarity
A stationary time series has statistical properties like mean and variance that do not change over time.
Testing for Stationarity
The Augmented Dickey-Fuller (ADF) test is commonly used.
adf_test <- ur.df(ts_data, type = "none", selectlags = "AIC")
summary(adf_test)
Differencing
To transform a non-stationary series into a stationary one, differencing is used.
diff_data <- diff(ts_data)
Time Series Modeling
Autoregressive Integrated Moving Average (ARIMA)
ARIMA models are used to predict future points in a time series by a combination of autoregressive (AR) and moving average (MA) components.
Steps:
auto.arima()
function.
library(forecast)
fit <- auto.arima(ts_data)
fit <- Arima(ts_data, order=c(p,d,q))
forecast <- forecast(fit, h=12) # Forecasting the next 12 periods
plot(forecast)
Seasonal Decomposition of Time Series by Loess (STL)
STL decomposition is effective for handling complex series with multiple seasonal patterns.
stl_decomposed <- stl(ts_data, s.window="periodic")
plot(stl_decomposed)
Exponential Smoothing State Space Model (ETS)
The ETS model captures trend and seasonality patterns using exponential smoothing methods.
ets_model <- ets(ts_data)
forecast_ets <- forecast(ets_model, h=12)
plot(forecast_ets)
Model Evaluation
Accuracy Metrics
Example:
accuracy(forecast, test_data)
Real-world Applications
Time series analysis and forecasting are applied across different domains:
Conclusion
This lesson has covered the essentials of time series analysis and forecasting in R. Understanding these concepts and methods will empower you to analyze time-dependent data and make accurate predictions, enhancing your analytical skills in real-world projects.
Continue practicing with different datasets to strengthen your proficiency in time series analysis. In the next lesson, we’ll explore more advanced topics and applications, building on the knowledge you’ve gained so far. Happy coding!
Lesson 5: Web Scraping with rvest
Welcome to the fifth lesson of your course, “Learn R by working on practical, real-world projects.” In this lesson, we will be exploring web scraping with the rvest
package in R. This will allow us to extract data from web pages for analysis and integration with other data sources.
Introduction to Web Scraping
Web scraping is the process of automatically extracting data from websites. It is useful for collecting large volumes of data that are publicly available on the web but not provided in a convenient format (such as an API or downloadable file).
Why Use rvest?
The rvest
package simplifies the web scraping process with functions designed to:
Key Concepts
HTML Structure
Websites are structured using HTML (HyperText Markup Language). Understanding the basic components of HTML can help you navigate web pages:
CSS Selectors
CSS selectors are patterns used to select elements on a webpage. They are crucial in web scraping for pinpointing the exact data you need.
#id
.class
tagname
tag1 tag2
[attribute=value]
Using rvest
Let’s go through the process of web scraping using the rvest
package.
Loading rvest
library(rvest)
Basic Workflow
Read the HTML content of a webpage:
url <- "http://example.com"
webpage <- read_html(url)
Inspect and identify the elements to scrape:
Use developer tools in your web browser (right-click > Inspect) to understand the structure of the page and identify the selectors of your target elements.
Extract data using CSS selectors:
# For example, extracting all links
links % html_nodes("a") %>% html_attr("href")
# Extracting text from a specific class
text % html_nodes(".class_name") %>% html_text()
Detailed Example: Scraping Movie Data
Suppose we want to scrape movie titles and ratings from a movie review site. Here is a step-by-step approach:
Read the HTML:
url <- "http://example.com/movies"
webpage <- read_html(url)
Inspect the elements:
Let’s say movie titles are in
and ratings are in .
Extract titles and ratings:
titles % html_nodes(".title") %>% html_text()
ratings % html_nodes(".rating") %>% html_text()
Combine and clean data:
movie_data <- data.frame(Title = titles, Rating = ratings, stringsAsFactors = FALSE)
# Convert ratings to numeric
movie_data$Rating <- as.numeric(movie_data$Rating)
Handling Dynamic Content
Sometimes, content on a webpage is dynamically loaded using JavaScript, which can complicate scraping. There are a few approaches to handle this:
RSelenium
or chromote
.Ethical Considerations
When scraping websites, always:
robots.txt
file, which specifies allowed and disallowed paths.Summary
In this lesson, we learned about web scraping using the rvest
package in R:
By mastering these skills, you can unlock a wealth of data available on the web and integrate it into your R projects for richer analysis and insights.
Lesson 6: Machine Learning with caret
Introduction
Machine Learning has become a crucial component in modern data analysis. In this lesson, we will delve into using the caret
package in R for building, tuning, and validating machine learning models. The caret
package (short for “Classification and Regression Training”) provides a consistent interface across various machine learning algorithms and is designed to streamline the process of model training.
The primary objectives of this lesson:
caret
package.caret
.1. Overview of the caret Package
The caret
package integrates a wide range of machine learning algorithms into a uniform framework. This uniformity ensures that users can quickly switch between different models and assess their performance without changing much of their code. The caret
package offers functions to streamline data pre-processing, model training, and evaluation.
Key Features of caret:
Reference Functions in caret:
train()
: for model training.trainControl()
: for setting up cross-validation and other control parameters.preProcess()
: for data preprocessing steps such as normalization and imputation.2. Data Preparation
Preparing data is a critical step before diving into machine learning. Proper data preprocessing ensures that models are trained effectively.
Common Data Preprocessing Steps:
- Handling Missing Values: Imputing missing data using different strategies.
- Scaling and Normalization: Standardizing data to ensure that features have comparable scales.
- Encoding Categorical Variables: Converting categorical data into a numerical format that can be used by machine learning algorithms.
3. Model Training and Validation
Step-by-Step Guide to Training a Model with caret:
Splitting the Data:
Use thecreateDataPartition
function to split your data into training and testing sets.Setting Up Control Parameters:
Use thetrainControl
function to define the training method, such as cross-validation.Training and Tuning the Model:
Use thetrain
function to train the model and, if necessary, tune hyperparameters.
Example: Training a Logistic Regression Model
# Step 1: Load required packages
library(caret)
# Step 2: Split the data
data(iris)
set.seed(123)
trainIndex <- createDataPartition(iris$Species, p = .8, list = FALSE, times = 1)
trainData <- iris[trainIndex, ]
testData <- iris[-trainIndex, ]
# Step 3: Define training control
train_control <- trainControl(method="cv", number=10)
# Step 4: Train the model
model <- train(Species ~ ., data=trainData, method="glm", trControl=train_control)
# Step 5: Make predictions
predictions <- predict(model, newdata=testData)
# Step 6: Evaluate the model
conf_matrix <- confusionMatrix(predictions, testData$Species)
print(conf_matrix)
Important Concepts:
Cross-Validation: A method used to validate the performance of a model by partitioning the data into subsets, training the model on some subsets, and validating it on others.
Hyperparameter Tuning: Searching for the best parameters for a model which often involves using methods like grid search or random search.
4. Evaluating and Comparing Models
Evaluating the performance of machine learning models is a critical step. Common evaluation metrics include accuracy, precision, recall, F1 score, and AUC-ROC.
Example: Evaluating Models
After training and making predictions as shown above, you can calculate metrics using functions like confusionMatrix
.
Model Comparison
It’s often beneficial to compare models to identify which one performs the best. The resamples
function in caret
can be used to achieve this.
models <- list(
logistic = train(Species ~ ., data = trainData, method = "glm", trControl = train_control),
rf = train(Species ~ ., data = trainData, method = "rf", trControl = train_control)
)
results <- resamples(models)
summary(results)
Conclusion
The caret
package in R is a powerful tool for machine learning, providing a consistent interface across various models along with functionalities for data preprocessing, model training, and evaluation. By mastering caret
, you can efficiently build and assess machine learning models, making it an invaluable skill in your data science toolkit. Practice with real datasets to get comfortable with these concepts and explore the vast array of algorithms supported by caret
.
With these foundational skills, you can venture deeper into more advanced machine learning techniques.