Survey Data Analysis

Author

520477991

Published

September 10, 2024

Code
knitr::opts_chunk$set(echo = TRUE)
library(readxl)
library(tidyverse)
library(visdat)
library(ggplot2)

# Loaded the dataset assuming it was in the same directory as the Quarto file
data <- read_excel("DATA2x02_survey_2024_Responses.xlsx")

# Renamed the columns to make them easier to work with
colnames(data) <- c(
  "timestamp", "target_grade", "assignment_preference", "trimester_or_semester", 
  "age", "tendency_yes_or_no", "pay_rent", "urinal_choice", "stall_choice",
  "weetbix_count", "weekly_food_spend", "living_arrangements", "weekly_alcohol", 
  "believe_in_aliens", "height", "commute", "daily_anxiety_frequency", 
  "weekly_study_hours", "work_status", "social_media", "gender", 
  "average_daily_sleep", "usual_bedtime", "sleep_schedule", "sibling_count", 
  "allergy_count", "diet_style", "random_number", "favourite_number", 
  "favourite_letter", "drivers_license", "relationship_status", 
  "daily_short_video_time", "computer_os", "steak_preference", "dominant_hand", 
  "enrolled_unit", "weekly_exercise_hours", "weekly_paid_work_hours", 
  "assignments_on_time", "used_r_before", "team_role_type", "university_year", 
  "favourite_anime", "fluent_languages", "readable_languages", "country_of_birth", 
  "wam", "shoe_size"
)

# Removed rows that had more than 50% missing data 
data_cleaned <- data %>%
  filter(rowMeans(is.na(.)) <= 0.5)

# Cleaned up the height column; converted height in meters to cm and removed unrealistic values above 250 cm
data_cleaned <- data_cleaned %>%
  mutate(
    height_clean = suppressWarnings(readr::parse_number(height)),  # Used suppressWarnings to avoid any warning messages
    height_clean = case_when(
      height_clean <= 2.5 ~ height_clean * 100,  # Converted height from meters to cm
      height_clean > 250 ~ NA_real_,             # Filtered outliers (heights over 250 cm)
      TRUE ~ height_clean
    )
  )

# Removed outliers from 'weekly_study_hours' to focus on more realistic values
data_cleaned <- data_cleaned %>%
  filter(weekly_study_hours <= 50)  # Dropped rows with study hours over 50

# Suppressed warnings while parsing the height column again for consistency
data_cleaned <- suppressWarnings(
  data_cleaned %>%
    mutate(height_clean = readr::parse_number(height))
)

# Cleaned up the 'social_media' column by standardizing similar entries (e.g., insta variations)
data_cleaned <- suppressWarnings(
  data_cleaned %>%
    mutate(social_media_clean = tolower(social_media),  # Converted everything to lowercase for consistency
           social_media_clean = str_replace_all(social_media_clean, "[[:punct:]]", " "),  # Removed punctuation
           social_media_clean = case_when(
             str_detect(social_media_clean, "insta") ~ "instagram",  # Standardized 'Instagram' entries
             str_detect(social_media_clean, "tik") ~ "tiktok",  # Standardized 'TikTok' entries
             str_detect(social_media_clean, "we") ~ "wechat",  # Standardized 'WeChat' entries
             TRUE ~ social_media_clean
           ))
)

# Saved the cleaned dataset to a CSV file
write.csv(data_cleaned, "cleaned_survey_data.csv", row.names = FALSE)

1 Introduction

The following report analyses the responses collected from students who were enrolled in DATA2X02 to discover patterns and biases in its self-reported survey data. The primary focus of the following report is to analyse and explore how various attributes such as study habits, alcohol consumption, and belief in their personal life may be subject to different forms of bias and if correlations and conclusions can be drawn from further analysis. Specifically, this report investigates common biases such as self-selection, response bias, and recall bias that could have occurred during the data collection stage.

The data set used in the following report consists of responses to various behavioral, lifestyle, and academic questions. For example, students were surveyed on their personal life habits such as study hours and alcohol consumption. While the data set provides valuable insights, it’s import to acknowledge the fact that the data was collected using a non-compulsory survey method meaning that the sample may not be fully representative of all DATA2X02 students. For instance, students who are more academically engaged may have chosen to participate in the survey whereas students who are less engaged in their study may have chosen not to participate in the survey. As a result, it is important to factor in that data may be a sample of the whole cohort and may introduce some biases in the data set.

The objective of this report is to provide a comprehensive analysis of the survey data collected from students in DATA2X02, with the aim of identifying trends, patterns, and relationships in various aspects of student life. This analysis is intended for a client who may not have a background in statistics but is interested in understanding both the outcomes and the data processing choices that led to the results.

In this report, the findings are presented in a way that is clear and easy to follow, ensuring that the technical aspects of the analysis are accessible to both technical and non-technical audiences. The client may be an analyst, looking to verify the data processing through a review of the R code, or a manager, more interested in a high-level summary of the results without needing to delve into the statistical details.

The report is structured to provide a clear narrative of the analysis process, including data cleaning, quality assurance steps, and the statistical tests that were conducted. Each hypothesis is explained clearly, and the results are presented in straightforward language, making the report accessible to all stakeholders. Visualizations and tables are included to enhance the understanding of the findings, and all code is accessible via code folding, ensuring full transparency in the analysis workflow.

In the following sections, we will outline the methodology used, including how the data was prepared, the hypothesis tests performed, and the visual analysis conducted. By the conclusion of the report, the client will have a clear understanding of the data processing steps, the statistical results, and the relevance of the findings to the research questions posed.

2 Data Cleaning and Quality Assurance

Data cleaning is a very important step that sets out the foundation in any data analysis projects which improve the accuracy and reliability of the dataset before moving onto analsysis. The following steps were taken in this project prior to analysis to ensure that the dataset was properly cleaned and prepared for analysis:

  1. Handling Missing Data: Within the dataset, it was found that certain values were missing. This could have occurred because the students decided not to respond certain questions or could have been raised from poor data importation. To handle the missing data rows where more than 50% of the data was missing were removed to prevent any bias or inaccuracies during the data analysis stages. By handling missing data, this helped to maintain the integrity of the dataset by ensuring only valid entries were kept for the final analysis.
  2. Standardizing and Cleaning Numerical Data: Within the dataset, it was noted that some numerical variables needed to be standardized for consistency. For example, the height variable contained entries in both meters and centimeters. To ensure consistency, all heights were converted to centimeters, and extreme values, such as heights over 250 cm, were removed to avoid any distortions in the analysis. Similarly, there were instances where students reported unusually high weekly study hours, exceeding 50 hours. These outliers were removed to focus the analysis on more realistic and representative data.
  3. Cleaning and Standardizing Categorical Data: A number of categorical variables, such as social media usage, contained inconsistencies in spelling, punctuation, and capitalization. For instance, entries like “Insta” and “insta.” were standardized to “Instagram” to ensure consistency throughout the dataset. This process helped to eliminate any discrepancies and made the data more coherent for further analysis.
  4. Ensuring Data Integrity: During the data cleaning process, great care was taken to retain the most important and valuable information while removing any outliers or inconsistencies that could affect the reliability of the dataset. By addressing both numerical and categorical variables, the cleaned dataset was well-prepared for accurate analysis, including hypothesis testing and creating visualizations that would provide meaningful insights.

Overall, these cleaning steps ensured the dataset was of high quality, providing a solid foundation for conducting meaningful analysis and drawing accurate conclusions.

3 General Discussion of the Data

In this section, we explore the quality and characteristics of the survey data from DATA2X02 students. We also identify potential biases and discuss which survey questions could be improved to ensure more reliable data collection.

3.1 Is this a random sample of DATA2X02 students?

The dataset used in this report is unlikely to be a truly random sample of DATA2X02 students. The reason for it is because the survey was voluntary meaning that the students were given the option to participate. This is an issue as it could introduce self-selection bias within the dataset. This bias could has been raised because voluntary surveys may only survey certain groups within the available sample. For example, students who are more engaged in their studies are more likely to respond. Conversely, students who are less engaged in their studies such as not checking ED posts are less likely to participate in the survey. As a result, the dataset may not accurately reflect the whole student population and should be proceeded with caution.

In summary, this dataset should be interpreted with caution, as the lack of random sampling likely leads to a skewed view of the overall population.

3.2 What are the potential biases? Which variables are most likely to be subjected to this bias?

Several potential biases could be present in the dataset:

3.2.1 Self-Selection Bias:

As previously mentioned, self-selection bias is likely to be present in the dataset. This is because students who are more engaged in their sudies might be over represented in the dataset, whereas students who are less engaged in their studies might be under-represented. Some variables that could have been skewed due to this bias includes study hours, grades aimed for, and assignment submission preferences.

3.2.1.1 Histogram of weekly study hours to identify self-selection bias

Code
# Created a histogram to visualize the distribution of weekly study hours
ggplot(data_cleaned, aes(x = weekly_study_hours)) +
  geom_histogram(binwidth = 1, fill = "lightblue", color = "black") +  # Used a bin width of 1 for a clearer distribution
  labs(title = "Figure 1: Distribution of Weekly Study Hours", 
       x = "Weekly Study Hours", 
       y = "Count") +  # Added labels for the title and axes
  theme_minimal()  # Applied a clean minimal theme for simplicity

Figure 1 reflects potential self-selection bias through a simple histogram of weekly study hours. As seen in the histogram, many students chose the option where they reported higher weekly study hours, which could be a sign of self-selection bias being present as students who are more engaged are likely to participate in the survey. As a result, the dataset may not capture the behavior of less engaged students who either study less or did not participate in the survey. Additionally, the peaks at rounded values such as 10, 20, and 30 hours might reflect students who are more conscious about their study routines, once again reinforcing the possibility of self-selection bias in this dataset.

3.2.2 Response Bias:

Response bias refers to a type of bias that occurs when respondents answer survey questions in a way that does not accurately reflect their true feelings, beliefs, or behaviors. In this dataset, students may have chosen responses which they belive are socially desirable rather than truthful. For example, students may have chose in the study hours section that they study more than what they actually do as university students are socially expected to spend a majority of their time studying. Furthermore, students may under-report their alcohol consumption to align with

3.2.2.1 Bar Plot of Weekly Alcohol Consumption to Identify Response Bias

Code
# Created a bar chart to visualize weekly alcohol consumption categories
ggplot(data_cleaned, aes(x = weekly_alcohol, fill = weekly_alcohol)) +
  geom_bar(position = "dodge", color = "black", na.rm = TRUE) +  # Bar chart with separate bars for each category, black borders added for clarity
  labs(
    title = "Figure 2: Distribution of Weekly Alcohol Consumption for DATA2X02 Students",
    x = "Weekly Alcohol Consumption Category",  # Labeled the x-axis for alcohol consumption categories
    y = "Count"  # Labeled the y-axis to show the count of students
  ) +
  scale_fill_manual(values = c("lightblue", "lightgreen", "lightpink", "lightyellow", "lightcoral", "lightcyan")) +  # Applied a custom color palette
  theme_minimal() +  # Used a minimal theme to keep the plot clean and simple
  theme(
    plot.title = element_text(hjust = 0.5, size = 14, face = "bold"),  # Centered the title, made it bold and slightly larger
    axis.text.x = element_text(angle = 45, hjust = 1),  # Rotated the x-axis labels for easier reading
    legend.position = "none"  # Removed the legend as it was redundant
  )

In figure 2, we can clearly see the distribution of weekly alcohol consumption among DATA2X02 students are more skewed towards lower categories such as “I don’t drink alcohol” and “Less than 5 standard drinks”. This pattern in the dataset may indicate response bias as previously mentioned, students may have chosen these options as alcohol consumption is typically regarded something that is not ideal for students. As a result, social desirability could lead to skewed results, as respondents may provide answers they perceive as more socially acceptable, reflecting lower levels of alcohol consumption than they actually engage in.

3.2.3 Recall Bias:

Recall bias occurs when participants in a survey or study do not remember past events or experiences accurately, leading to incorrect or skewed responses. In this dataset, students were asked about their habits or behaviors over a specific time frame, which may have introduced recall bias. This is due to students not recording a completely accurate recount of their everyday activities. As a result, memory errors may lead to recall bias and hence in accurate responses. Some variables that are prone to this bias include “Weekly Food Spend” and “Weekly Study Hours”. This is because remembering the exact amount a student spent on the food for the entire week is almost impossible to remember unless recorded, potentially leading to an under or overestimated value. Similarily, not many students log their “Weekly Study Hours” which may have led to students estimating their study hours incorrectly which could have produced an inflated or diminished values.

3.2.3.1 Distribution of Weekly Food Spend to Identify Recall Bias

Code
# Filtered out rows with missing or non-finite values in 'weekly_food_spend' to clean the data
ggplot(data_cleaned %>% filter(!is.na(weekly_food_spend) & is.finite(weekly_food_spend)), 
       aes(x = weekly_food_spend)) +
  geom_histogram(binwidth = 10, fill = "blue", color = "black") +  # Created a histogram to visualize the distribution of weekly food spend
  labs(title = "Figure 3: Distribution of Weekly Food Spend", 
       x = "Weekly Food Spend ($)",  # Labeled the x-axis to represent the amount spent on food
       y = "Count") +  # Labeled the y-axis to show the count of students
  theme_minimal()  # Used a minimal theme to maintain a clean and simple layout

In figure 3, we can observe distinct spikes in the distribution of weekly food spend, particularly at rounded amounts like $100 and $200. This pattern suggests the presence of recall bias, where students may not have kept track of their exact expenses and instead provided approximate figures. As recall bias tends to occur when individuals rely on memory, there is a higher chance of over- or underestimation. The sharp peaks visible in the figure highlight that students might have defaulted to rounded amounts, which introduces potential inaccuracies in the dataset.

Similarly, figure 1 displays the distribution of weekly study hours reported by DATA2X02 students, where we see noticeable peaks at rounded values such as 10, 20, and 30 hours. This suggests that students may be estimating their study hours rather than reporting exact figures, a sign of recall bias. This occurs when individuals find it difficult to recall precise data and instead report estimates or socially acceptable numbers. The overrepresentation of these rounded figures reinforces the idea that students may not accurately remember their study habits over the week, potentially distorting the actual study patterns within the group.

3.2.4 Acquiescence Bias:

Acquiescence bias, also known as “yea-saying,” occurs when respondents have a tendency to agree with or affirmatively answer questions, regardless of their actual opinions or the content of the question. In this dataset, students were asked about their thoughts on various socially controvertible questions, such as believing in the existence of aliens or urinal/stall choices. As students may regard certain responses such as aliens existing more interesting and socially accepted, they may have chosen this option which introduces acquiescence bias. Variables that were particulary prone to this type of bias was “Belief in Aliens” as students may have answered this question based on what they think is expected or interesting rather than their true thoughts, hence introducing acquiescence bias.

3.2.4.1 Bar Plot of Belief in Aliens to Identify Acquiescence Bias

Code
# Created a bar chart to visualize belief in aliens among students
ggplot(data_cleaned, aes(x = believe_in_aliens)) +
  geom_bar(fill = "darkblue", color = "black", na.rm = TRUE) +  # Bar chart with black borders and dark blue fill for better contrast
  labs(
    title = "Figure 4: Distribution of Belief in Aliens for DATA2X02 Students",  # Added a clear title to the chart
    x = "Belief in Aliens",  # Labeled x-axis for the categories of belief in aliens
    y = "Count"  # Labeled y-axis to show the number of students
  ) +
  theme_minimal() +  # Applied minimal theme to maintain a clean and simple look
  theme(
    plot.title = element_text(hjust = 0.5, size = 14, face = "bold"),  # Centered and bolded the plot title for emphasis
    axis.text.x = element_text(angle = 45, hjust = 1),  # Rotated the x-axis labels for better readability
    legend.position = "none"  # Removed the legend to avoid redundancy
  )

In figure 4, a simple box plot of students believing in whether or not aliens exist has been shown. In the plot, close to 200 students selected the “Yes” option while fewer than 100 students selected the “No” option. This distribution could be a potential indicator of acquiescence bias, where students simply chose “Yes” because it is more compelling to them even if they didn’t genuinely believe in aliens. With the question being speculative than other questions, this could have encouraged students to provide a positive response, aligning with what they perceive as interesting and socially desirable.

3.3 Which questions needed improvement to generate useful data?

Some of the survey questions could be improved to ensure that the data collected is both reliable and useful for analysis:

  1. Height: Height is a variable that could have been improved to generate more useful data. This is because some unit for the student’s heights weren’t unified. For example, some responses were provided in meters (e.g. 1.8m) whereas others are in centimeters (e.g. 170cm), and some are even in feet and inches which are regarded as non-numeric values. With this variation in the dataset, proper analysis of the data is difficult and inconsistencies in units lead to inaccurate and unreliable results. A clearer instruction in the survey specifying the unit to be written in would have ensured that the data were in same unit.

  2. Gender: Gender is another question that could have been improved. This is because the question was given as a open-ended question, this leads to inconsistent responses such as ‘Male’, “Boy”, “Binary”, “Non binary” etc. This would make the data analysis stage more difficult as the analyst would have to unify the selections into certain responses before performing analysis. Providing students with pre-defined responses such as “Male”, “Female”, “Prefer not to say” would have been better as it would yield more standardised and analysble data.

  3. Social Media: The question asking students to provide their favorite social media platform led to a range of inconsistent responses. For instance, some students entered “Instagram,” while others wrote “IG” or “Insta,” all referring to the same platform. This inconsistency complicates the data analysis process, as the analyst would need to standardize these variations. A better approach would have been to provide a predefined list of social media platforms, along with an “other” option for less common platforms, ensuring consistency in the responses.

  4. Daily Short Video Time: This question lacks clarity because it does not define what constitutes a “short video” or whether the time refers to cumulative usage throughout the day. As a result, students may have interpreted the question differently, leading to varied responses. A more precise phrasing, such as “How many hours per day do you spend watching short videos on apps like TikTok, Instagram Reels, or YouTube Shorts?” would make the question clearer and help standardize the data, making it easier to analyze.

  5. Belief in Aliens: The phrasing of the question “Do you believe in the existence of aliens?” is quite broad and could lead to varied interpretations. It is unclear whether the question is referring to any form of life in the universe or specifically intelligent extraterrestrial life. A more specific phrasing could narrow down the scope of the question and result in more consistent responses, providing clearer insights during data analysis.

    By improving the clarity of the questions and providing more predefined answer options, the survey could generate cleaner, more reliable data for analysis.

4 Results

4.1 Overall Theme of Hypothesis Tests

All hypothesis tests in this report are based on the central theme of how a student’s belief, gender, and study habits influence lifestyle choices. We hope to understand how personal perspectives, especially on unconventional topics, interact with study habits and financial behavior. Such investigation gives perspective to the overall student experience, showing how the beliefs can be shaped into actions or how the consistent study habits support other life activities. The following tests explore such connections in order to provide a more cohesive narrative concerning student behavior and decision-making.

4.2 Is there a significant difference between the weekly study hours of students who work and not?

To investigate the difference in a week’s study time of working and non-working students a two-sample t-test of means of the two groups is carried out. This will test that the difference is statistically significant at 5% level of significance. We start by looking at a histogram of weekly study hours in figure 5.

Code
# Recoded 'work_status' into two levels: "Working" and "Not Working"
# This allowed for binary comparison between the groups.
data_cleaned <- data_cleaned %>%
  mutate(work_status_binary = case_when(
    work_status %in% c("I don't currently work", NA) ~ "Not Working",  # Combined non-working categories
    TRUE ~ "Working"  # All other categories were grouped under 'Working'
  ))

# Filtered out rows where 'weekly study hours' or 'work_status_binary' had NA values
data_filtered <- data_cleaned %>%
  filter(!is.na(weekly_study_hours) & !is.na(work_status_binary))

# Conducted a Welch Two-Sample t-test between the 'Working' and 'Not Working' groups
# Chose this test because it accounts for unequal variances between the groups
t_test_results <- t.test(weekly_study_hours ~ work_status_binary, data = data_filtered)

# Calculated summary statistics (mean, count, and standard deviation) for weekly study hours based on work status
summary_stats <- data_filtered %>%
  group_by(work_status_binary) %>%
  summarise(
    n = n(),  # Counted the observations
    mean_study_hours = mean(weekly_study_hours),  # Calculated the mean of weekly study hours
    sd_study_hours = sd(weekly_study_hours)  # Calculated the standard deviation of weekly study hours
  )

# Displayed summary statistics table with a relevant caption
knitr::kable(summary_stats, 
             col.names = c("Work Status", "Count", "Mean Study Hours", "SD of Study Hours"), 
             caption = "Table 1: Summary of Weekly Study Hours by Work Status for DATA2X02 Students.")
Table 1: Summary of Weekly Study Hours by Work Status for DATA2X02 Students.
Work Status Count Mean Study Hours SD of Study Hours
Not Working 136 21.05882 12.88741
Working 142 17.68310 11.89396
Code
# Created a histogram comparing weekly study hours by work status
# The dodge position ensured bars for different groups appeared side-by-side
ggplot(data_filtered, aes(x = weekly_study_hours, fill = work_status_binary)) +
  geom_histogram(binwidth = 1, position = "dodge", color = "black", na.rm = TRUE) +
  labs(title = "Histogram of Weekly Study Hours by Work Status", 
       x = "Weekly Study Hours", 
       y = "Count",
       caption = "Figure 5: Histogram of Weekly Study Hours for Working and Non-Working Students.") +
  scale_fill_manual(values = c("lightgreen", "lightblue")) +  # Chose different colors for the two categories
  theme_minimal() +  # Used a minimal theme for a clean look
  theme(
    plot.caption = element_text(hjust = 0.5, size = 12, face = "italic"),  # Centered and styled the caption
    plot.margin = margin(t = 10, r = 20, b = 30, l = 20),  # Adjusted margins to avoid caption cut-off
    axis.text = element_text(size = 12),  # Adjusted text size for better readability
    axis.title = element_text(size = 14, face = "bold"),  # Made axis titles bold
    legend.position = "top"  # Placed the legend at the top for better clarity
  )

Code
# Created a QQ plot for weekly study hours by work status to check normality assumptions
# Added a styled caption below the plot
ggplot(data_filtered, aes(sample = weekly_study_hours, color = work_status_binary)) +
  stat_qq(size = 2) +  # Generated QQ plot points
  stat_qq_line() +  # Added QQ line to assess fit
  labs(title = "QQ Plot of Weekly Study Hours by Work Status", 
       x = "Theoretical Quantiles", 
       y = "Sample Quantiles", 
       caption = "Figure 6: QQ Plot of Weekly Study Hours for Working and Non-Working Students.") +
  scale_color_manual(values = c("lightgreen", "lightblue")) +  # Matched colors to earlier plots
  theme_minimal() +  # Maintained minimal theme for consistency
  theme(
    plot.caption = element_text(hjust = 0.5, size = 12, face = "italic"),  # Centered and styled the caption
    plot.margin = margin(t = 10, r = 20, b = 30, l = 20),  # Adjusted margins
    axis.text = element_text(size = 12),  # Adjusted axis text size
    axis.title = element_text(size = 14, face = "bold"),  # Bolded axis titles
    legend.position = "top"  # Placed legend at the top
  )

4.2.1 Hypothesis:

  • Null hypothesis (H0): There is no difference in weekly study hours between students who work and those who do not.
  • Alternative hypothesis (H1): There is a difference in weekly study hours between students who work and those who do not.

4.2.2 Assumptions:

  1. Normality Assumption: For the assumption of normality by the two groups, a check of QQ plots of working and non-working students was performed (Figure 6). It is a scatterplot where the sample quantities are plotted against the theoretical quantities for the data on the number of weekly study hours. Although the tails deviate slightly from the straight line, for both groups one can see an approximate normal distribution in the middle part of their distribution.
  2. Equal Variances: This test utilises the assumption of equal variances between the two groups by using the robust Welch two-sample t-test for unequal variances. A difference in variance in the weekly study hours might be between working and non-working students. We can use Welch’s t-test, which does not assume equal variances; hence, the results are more dependable in case of different spreads of the study hours by groups.
  3. Independence: Observations are assumed to be independent, indicating that the study hours of one student over a week are not influenced by the study hours of another student over a week. This holds as the data collection was at an individual level, and there is no evidence of dependency between responses of different students.

4.2.3 Test:

A two-sample Welch t-test was performed to compare the mean weekly study hours between students who are working and not working.

4.2.4 Results:

4.2.4.1 Welch t-test:

  • t-statistic: 2.2669
  • Degrees of freedom (df): 271.87
  • p-value: 0.02418
  • Mean study hours for non-working students: 21.06 hours
  • Mean study hours for working students: 17.68 hours
  • 95% confidence interval for the difference in means: [0.44, 6.31]

4.2.5 Conclusion:

Since the p-value is less than 0.05, we reject the null hypothesis. This suggests that there is a significant difference in weekly study hours between working and non-working students, with non-working students studying more on average. However, the difference in means is relatively small, indicating that while employment status does affect study hours, the impact may not be substantial.

4.3 Does Alcohol Consumption Affect Weekly Study Hours?

Code
# Recoded 'weekly_alcohol' into a binary variable (Drinker vs. Non-Drinker)
# This step categorized respondents into drinkers and non-drinkers based on their responses
data_cleaned <- data_cleaned %>%
  mutate(alcohol_binary = case_when(
    weekly_alcohol == "I don't drink alcohol" ~ "Non-Drinker",  # Recoded non-drinkers
    !is.na(weekly_alcohol) ~ "Drinker"  # Recoded the rest as 'Drinkers'
  ))

# Filtered out rows with NA values in either 'weekly study hours' or 'alcohol_binary'
data_filtered_alcohol <- data_cleaned %>%
  filter(!is.na(weekly_study_hours) & !is.na(alcohol_binary))

# Created a histogram to visualize the distribution of weekly study hours by alcohol consumption status
ggplot(data_filtered_alcohol, aes(x = weekly_study_hours, fill = alcohol_binary)) +
  geom_histogram(binwidth = 1, position = "dodge", color = "black", na.rm = TRUE) +  # Used dodge for side-by-side histograms
  labs(title = "Histogram of Weekly Study Hours by Alcohol Consumption", 
       x = "Weekly Study Hours", 
       y = "Count", 
       caption = "Figure 7: Histogram of Weekly Study Hours for Drinkers and Non-Drinkers") +
  scale_fill_manual(values = c("lightblue", "lightgreen")) +  # Used different colors to distinguish the groups
  theme_minimal() +
  theme(
    plot.caption = element_text(hjust = 0.5, size = 12, face = "italic"),  # Centered the caption
    plot.margin = margin(t = 10, r = 20, b = 30, l = 20),  # Adjusted the margins
    axis.text = element_text(size = 12),  # Adjusted the text size
    axis.title = element_text(size = 14, face = "bold"),  # Made axis titles bold
    legend.position = "top"  # Moved the legend to the top for clarity
  )

Code
# Created a boxplot comparing weekly study hours for drinkers and non-drinkers
ggplot(data_filtered_alcohol, aes(x = alcohol_binary, y = weekly_study_hours, fill = alcohol_binary)) +
  geom_boxplot(color = "black", na.rm = TRUE) +
  labs(title = "Boxplot of Weekly Study Hours by Alcohol Consumption", 
       x = "Alcohol Consumption", 
       y = "Weekly Study Hours", 
       caption = "Figure 8: Boxplot of Weekly Study Hours for Drinkers and Non-Drinkers") +
  scale_fill_manual(values = c("lightblue", "lightgreen")) +
  theme_minimal() +
  theme(
    plot.caption = element_text(hjust = 0.5, size = 12, face = "italic"),  # Centered and styled the caption
    plot.margin = margin(t = 10, r = 20, b = 30, l = 20),  # Adjusted margins
    axis.text = element_text(size = 12),  # Adjusted axis text size
    axis.title = element_text(size = 14, face = "bold"),  # Bolded axis titles
    legend.position = "none"  # Removed the legend for simplicity
  )

Code
# Created a QQ plot to assess normality of weekly study hours for drinkers and non-drinkers
ggplot(data_filtered_alcohol, aes(sample = weekly_study_hours, color = alcohol_binary)) +
  stat_qq() +
  stat_qq_line() +
  labs(title = "QQ Plot of Weekly Study Hours by Alcohol Consumption", 
       x = "Theoretical Quantiles", 
       y = "Sample Quantiles", 
       caption = "Figure 9: QQ Plot of Weekly Study Hours for Drinkers and Non-Drinkers") +
  scale_color_manual(values = c("lightblue", "lightgreen")) +
  theme_minimal() +
  theme(
    plot.caption = element_text(hjust = 0.5, size = 12, face = "italic"),  # Centered caption
    plot.margin = margin(t = 10, r = 20, b = 30, l = 20),  # Adjusted margins
    axis.text = element_text(size = 12),  # Adjusted text size
    axis.title = element_text(size = 14, face = "bold"),  # Made axis titles bold
    legend.position = "top"  # Moved legend to the top
  )

Code
# Calculated summary statistics (mean, count, SD) for weekly study hours based on alcohol consumption status
summary_stats_alcohol <- data_filtered_alcohol %>%
  group_by(alcohol_binary) %>%
  summarise(
    n = n(),  # Counted the number of respondents in each group
    mean_study_hours = mean(weekly_study_hours),  # Calculated mean weekly study hours
    sd_study_hours = sd(weekly_study_hours)  # Calculated standard deviation of weekly study hours
  )

# Displayed the summary statistics table with a caption
knitr::kable(summary_stats_alcohol, 
             col.names = c("Alcohol Consumption", "Count", "Mean Study Hours", "SD of Study Hours"), 
             caption = "Table 2: Summary of Weekly Study Hours by Alcohol Consumption for DATA2X02 Students.")
Table 2: Summary of Weekly Study Hours by Alcohol Consumption for DATA2X02 Students.
Alcohol Consumption Count Mean Study Hours SD of Study Hours
Drinker 131 19.00763 12.80775
Non-Drinker 146 19.69178 12.23763
Code
# Performed a Wilcoxon rank-sum test (non-parametric test for two independent groups)
# This was chosen since the test does not assume a normal distribution
wilcoxon_test_alcohol <- wilcox.test(weekly_study_hours ~ alcohol_binary, data = data_filtered_alcohol)

4.3.1 Hypothesis:

  • Null hypothesis (H₀): There is no difference in weekly study hours between students who drink alcohol and those who do not.
  • Alternative hypothesis (H₁): There is a difference in weekly study hours between students who drink alcohol and those who do not.

4.3.2 Assumptions:

  1. Independent Observations: The points of data for weekly study hours in the group “drink alcohol” are assumed to be independent of each other and also that in the group “does not drink alcohol.” This assumption is valid because each student’s response in the survey forms a single observation, and that observation has no effect on another student’s response.
  2. Non-Normal Distribution: The distribution of weekly study hours for either the group of drinkers or non-drinkers is expected not to follow a normal distribution. Figure 9 shows that the data points deviate from the straight line on the QQ plot, showing non-normality in the distribution of weekly study hours for either group. The deviations are more prominent at the tails of the distribution. This affirms the decision to work with a nonparametric test, namely the Wilcoxon rank-sum test, rather than assuming normality.
  3. Equal Variances Not Assumed: Figure 8 shows that the dispersion of hours per week studying between Drinkers and Non-Drinkers has been different. The values of IQR indicate that Drinkers have a very slight larger dispersion in studying hours than Non-Drinkers. This reinforces another good reason for the use of the Wilcoxon rank-sum test as it does not need the assumption of equal variances in the groups.
  4. Ordinal Nature of Data: In this problem, weekly study hours are considered to be a continuous variable. However, students may have reported values that were approximate or rounded to the nearest whole number. Therefore, using a non-parametric test such as the Wilcoxon ranksum test makes this robust to any ordinal tendencies of the data.

4.3.3 Test:

A Wilcoxon rank-sum test was performed to compare the distribution of weekly study hours between students who drink alcohol and those who do not. The test was chosen as the non-parametric alternative to the t-test due to the potentially non-normal distribution of study hours.

4.3.4 Results:

  • Wilcoxon rank-sum test statistic (W): 9128
  • p-value: 0.5127
  • Mean study hours for Non-Drinkers: 18.90 hours
  • Mean study hours for Drinkers: 19.35 hours
  • 95% confidence interval for the difference in distributions: Not applicable for non-parametric tests

4.3.5 Conclusion:

Because the p-value is greater than 0.05, we fail to reject the null hypothesis. We conclude this means there is no statistical difference in weekly study hours between drinkers and non-drinkers. The observed mean difference of 0.45 hours (Drinkers: 19.35 hours, Non-Drinkers: 18.90 hours) is very small and doesn’t appear important, which might indicate that alcohol consumption does not have a significant impact on study hours.

4.4 Does the Preference for Semester vs Trimester Affect Weekly Study Hours?

Code
# Recoded 'trimester_or_semester' into a binary variable for system preference (Semester vs Trimester)
# This step categorized respondents into those who preferred either the Semester or Trimester system
data_cleaned <- data_cleaned %>%
  mutate(trimester_or_semester_binary = case_when(
    trimester_or_semester == "Semester" ~ "Semester",  # Recoded Semester preference
    trimester_or_semester == "Trimester" ~ "Trimester"  # Recoded Trimester preference
  ))

# Filtered out rows with NA values in weekly study hours or trimester/semester preference
data_filtered_sem_trim <- data_cleaned %>%
  filter(!is.na(weekly_study_hours) & !is.na(trimester_or_semester_binary))

# Calculated the observed difference in mean study hours between Semester and Trimester groups
obs_diff <- mean(data_filtered_sem_trim$weekly_study_hours[data_filtered_sem_trim$trimester_or_semester_binary == "Semester"]) -
  mean(data_filtered_sem_trim$weekly_study_hours[data_filtered_sem_trim$trimester_or_semester_binary == "Trimester"])

# Performed a permutation test with 10,000 resamples
set.seed(123)  # Set seed for reproducibility
n_permutations <- 10000
perm_diffs <- replicate(n_permutations, {
  permuted <- sample(data_filtered_sem_trim$weekly_study_hours)  # Permuted the study hours
  mean(permuted[data_filtered_sem_trim$trimester_or_semester_binary == "Semester"]) -
    mean(permuted[data_filtered_sem_trim$trimester_or_semester_binary == "Trimester"])
})

# Calculated the p-value for the permutation test
p_value <- mean(abs(perm_diffs) >= abs(obs_diff))  # Proportion of permuted differences greater than the observed difference


# Created a histogram to visualize weekly study hours by system preference (Semester vs Trimester)
ggplot(data_filtered_sem_trim, aes(x = weekly_study_hours, fill = trimester_or_semester_binary)) +
  geom_histogram(binwidth = 1, position = "dodge", color = "black", na.rm = TRUE) +  # Side-by-side comparison for Semester vs Trimester
  labs(
    title = "Weekly Study Hours by Preference for Semester vs Trimester",
    x = "Weekly Study Hours",
    y = "Count",
    caption = "Figure 10: Weekly Study Hours by Preference for Semester vs Trimester System"
  ) +
  scale_fill_manual(values = c("lightblue", "lightgreen")) +  # Custom fill colors for distinction
  theme_minimal() +  # Clean appearance
  theme(
    legend.title = element_blank(),  # Removed legend title
    plot.caption = element_text(hjust = 0.5, size = 12, face = "italic"),  # Centered and styled the caption
    plot.margin = margin(t = 10, r = 20, b = 30, l = 20),  # Adjusted plot margins
    axis.text = element_text(size = 12),  # Adjusted text size for readability
    axis.title = element_text(size = 14, face = "bold")  # Bolded axis titles for emphasis
  )

Code
# Created a QQ plot to assess normality for weekly study hours by system preference (Semester vs Trimester)
ggplot(data_filtered_sem_trim, aes(sample = weekly_study_hours, color = trimester_or_semester_binary)) +
  stat_qq() +
  stat_qq_line() +
  labs(
    title = "QQ Plot of Weekly Study Hours by Preference for Semester vs Trimester",
    x = "Theoretical Quantiles",
    y = "Sample Quantiles",
    caption = "Figure 11: QQ Plot of Weekly Study Hours for Semester vs Trimester Groups."
  ) +
  scale_color_manual(values = c("lightblue", "lightgreen")) +  # Custom colors to distinguish groups
  theme_minimal() +
  theme(
    legend.title = element_blank(),  # No legend title needed
    plot.caption = element_text(hjust = 0.5, size = 12, face = "italic"),  # Centered and styled the caption
    plot.margin = margin(t = 10, r = 20, b = 30, l = 20),  # Adjusted plot margins
    axis.text = element_text(size = 12),  # Adjusted text size
    axis.title = element_text(size = 14, face = "bold")  # Bolded axis titles for emphasis
  )

Code
# Created a boxplot to compare variances between semester and trimester preferences
ggplot(data_filtered_sem_trim, aes(x = trimester_or_semester_binary, y = weekly_study_hours, fill = trimester_or_semester_binary)) +
  geom_boxplot(outlier.color = "red", outlier.shape = 16) +
  labs(
    title = "Boxplot of Weekly Study Hours by Preference for Semester vs Trimester",
    x = "System Preference",
    y = "Weekly Study Hours",
    caption = "Figure 12: Boxplot of Weekly Study Hours by Preference for Semester vs Trimester System."
  ) +
  scale_fill_manual(values = c("lightblue", "lightgreen")) +  # Custom fill colors
  theme_minimal() +
  theme(
    legend.position = "none",  # No legend for boxplot
    plot.caption = element_text(hjust = 0.5, size = 12, face = "italic"),  # Centered and styled the caption
    plot.margin = margin(t = 10, r = 20, b = 30, l = 20),  # Adjusted plot margins
    axis.text = element_text(size = 12),  # Adjusted text size
    axis.title = element_text(size = 14, face = "bold")  # Bolded axis titles for emphasis
  )

Code
# Calculated summary statistics (mean, count, SD) for weekly study hours by system preference
summary_stats_sem_trim <- data_filtered_sem_trim %>%
  group_by(trimester_or_semester_binary) %>%
  summarise(
    n = n(),  # Count of respondents in each group
    mean_study_hours = mean(weekly_study_hours, na.rm = TRUE),  # Mean weekly study hours
    sd_study_hours = sd(weekly_study_hours, na.rm = TRUE)  # Standard deviation of weekly study hours
  )

# Displayed summary statistics table with a caption
knitr::kable(summary_stats_sem_trim, 
             col.names = c("System Preference", "Count", "Mean Study Hours", "SD of Study Hours"), 
             caption = "Table 3: Summary of Weekly Study Hours by System Preference for Semester vs Trimester Students.")
Table 3: Summary of Weekly Study Hours by System Preference for Semester vs Trimester Students.
System Preference Count Mean Study Hours SD of Study Hours
Semester 261 19.33716 12.49251
Trimester 13 20.15385 12.28716

4.4.1 Hypothesis:

  • Null hypothesis (H₀): There is no difference in weekly study hours between students who prefer semesters and those who prefer trimesters.
  • Alternative hypothesis (H₁): There is a difference in weekly study hours between students who prefer semesters and those who prefer trimesters.

4.4.2 Assumptions:

  1. Independence of Observations: We assume that the study hours per week reported by semester group and trimester group students are independent. This is a fair assumption because the response provided by one student is totally individual and does not depend on the response of any other student.
  2. Distribution of Weekly Study Hours: A permutation test does not assume normality of the distribution of data, and for that reason we decided to use it. However, for exploratory purposes, we checked the normality of distribution of numbers of hours studied weekly for both groups by QQ plot shown in Figure 11. Figure 11: this shows that in the tails, both semester and trimester data points deviate from the theoretical quantiles. That could be a cue that normality is not quite perfect. Thus, this decision again justifies using the non-parametric permutation test.
  3. Similar Spread of Data (Variance): In figure 12 the boxplot indicates that the variance distribution of study hours per week is not greatly different between semester and trimester groups because there are no perceived differences in inter-quartile range and range. So, one might say that, judging from the sample data, the study hours are approximately equally distributed within the two groups; although not a strict requirement for the permutation test, exact equality of variances.

4.4.3 Test:

A permutation test with 10,000 resamples was conducted to compare the mean weekly study hours between students who prefer semesters and those who prefer trimesters. The permutation test was chosen to avoid assumptions about the distribution of the data.

4.4.4 Results:

  • Observed difference in means: -0.8167
  • p-value: 0.8233
  • Mean study hours for Semester preference: (Add the mean from your dataset here)
  • Mean study hours for Trimester preference: (Add the mean from your dataset here)
  • 95% confidence interval: Not applicable for permutation tests

4.4.5 Conclusion:

Since the p-value is 0.8233, which is greater than 0.05, we fail to reject the null hypothesis. This therefore implies that type of preference, semester or trimester, has no significant impact on the number of hours a student studies weekly. This mean difference of -0.8167 has a very small and insignificant effect on study hours based on the system preferred.

This result is shown graphically in Figure 10: Distribution of weekly study hours by preference for semester vs trimester. As we might have gathered from the histogram, there is no obvious pattern in the distribution that would suggest one group generally studies much more than the other. Furthermore, Table 3 presents the summary of average study hours of each group. Also, it shows that the difference in the averages is negligible.

5 Conclusion

In this report, we explored the relationship between various student characteristics and their weekly study hours using hypothesis testing and resampling methods. Three key questions were addressed:

  1. Employment Status and Weekly Study Hours: Using a Welch two-sample t-test, there’s a difference in the weekly study hours between working versus non-working students. On average, students that were not working devoted more hours to studying compared to working students. However, the effect size was modest, which means that although there is indeed a difference in how much time students spent studying due to their employment status, this difference is relatively small overall.

  2. Alcohol Consumption and Weekly Study Hours: Regarding this, a comparison of whether students consuming alcohol had different weekly study hours was done through the Wilcoxon rank-sum test. There has been no significant difference for students consuming versus not consuming alcohol; from this, it can be concluded that alcohol consumption does not significantly determine how much time a student spends on his or her studies.

  3. Semester vs. Trimester Preference and Weekly Study Hours: We used a permutation test on the hours studied to determine whether students that prefer the trimester system study more or less than students that prefer the semester system. The test did not indicate a significant difference. The small observed difference in the means of the two groups provided further confirmation that system preference does not meaningfully affect study hours.

In conclusion, our findings have brought forth that though some factors, like the employment status of students, may affect their study habits, other factors such as the amount of alcohol consumed and system preference do not seem to have any major impact on hours of study taken up per week. The tests conducted in the analysis had indeed been quite enlightening in this regard, but future studies may still need larger samples and better data on aspects susceptible to self-selection and response biases.

The current report makes it clear that hypothesis testing and resampling techniques are privileged methods for uncovering trends and relationships in the studied data on student behavior that could be thoroughly informative for future educational strategies and support systems.

6 Reference List

  1. ChatGPT. 2024. OpenAI Large Language Model (GPT-4). Accessed September 2024. https://chat.openai.com/
  2. Stack Overflow. “How to Suppress Warnings in R Using SuppressWarnings and SuppressMessages.” Accessed September 2024. https://stackoverflow.com/questions/23932061/how-to-suppress-warnings-in-r
  3. Stack Overflow. “Filter Rows Based on Condition in dplyr using filter() and Case_when().” Accessed September 2024. https://stackoverflow.com/questions/32561108/filter-rows-based-on-condition-in-dplyr
  4. Wickham, Hadley, and Garrett Grolemund. 2017. R for Data Science: Import, Tidy, Transform, Visualize, and Model Data. O’Reilly Media. https://r4ds.had.co.nz/
  5. Pedersen, Thomas Lin. 2022. patchwork: The Composer of Plots. https://CRAN.R-project.org/package=patchwork
  6. R Core Team. 2023. R: A Language and Environment for Statistical Computing. Vienna, Austria: R Foundation for Statistical Computing. https://www.R-project.org/
  7. Xie, Yihui, J. J. Allaire, and Garrett Grolemund. 2018. R Markdown: The Definitive Guide. Boca Raton, Florida: Chapman & Hall/CRC. https://bookdown.org/yihui/rmarkdown/
  8. Wickham, Hadley. 2016. ggplot2: Elegant Graphics for Data Analysis. Springer-Verlag New York. https://ggplot2.tidyverse.org/
  9. Posit Team. 2024. RStudio IDE for R. Accessed September 2024. https://posit.co/download/rstudio-desktop/
  10. Stack Overflow. “Understanding Permutation Tests in R with Example Code.” Accessed September 2024. https://stackoverflow.com/questions/32824057/understanding-permutation-tests-in-r
  11. Stack Overflow. “Cleaning and Standardizing Data in R Using tidyverse.” Accessed September 2024. https://stackoverflow.com/questions/29322156/cleaning-and-standardizing-data-in-r
  12. Fox, John, and Sanford Weisberg. 2019. An R Companion to Applied Regression. 3rd ed. Sage Publications. https://socialsciences.mcmaster.ca/jfox/Books/Companion/
  13. Kassambara, Alboukadel. 2020. ggpubr: Ggplot2 Based Publication Ready Plots. https://rpkgs.datanovia.com/ggpubr/
  14. Vanderplas, Susan. 2017. Data Visualization: A Practical Introduction. Princeton University Press. https://press.princeton.edu/books/hardcover/9780691179873/data-visualization