diff --git a/02_activities/assignments/a2_survey_design_and_evaluation.md b/02_activities/assignments/a2_survey_design_and_evaluation.md deleted file mode 100644 index a955d827..00000000 --- a/02_activities/assignments/a2_survey_design_and_evaluation.md +++ /dev/null @@ -1,101 +0,0 @@ -# Assignment: Questionnaire Design and Sample Evaluation - -## Requirements - -The goal of this assignment is to practice developing and evaluating sampling materials. - -### Part A - Survey Design: - -Select one of the scenarios below and design a survey to meet the need(s) outlined in the prompt. - -1. In two to three sentences, describe the purpose of your survey -2. Describe your target population, sampling frame, sampling units, and overall sampling strategy. -3. Write a 5-10 question survey to address your chosen scenario below. - -##### Scenarios -1. You work in the Human Resources Department at a large tech company. Over the past few months, the company has been experiencing a high turnover rate across many of its departments, specifically within the entry- and lower-level positions. The company wishes to understand why this turnover is happening, and what changes need to occur to improve employee satisfaction. -2. You work for a Canadian national political party during a federal election. Throughout the campaign period, your party has seen relatively high approval ratings, but an opposing party is also polling favorably and may still have a chance to win the election. You are one month away from the election and you want to understand what voters want from your party and its leader in order to maintain your lead and eventually win the election. -3. You are a student researcher in the sociology department at the University of Toronto. You are working on a research project that concerns the relationship between music taste and age. This involves both comparisons between different people of different ages and comparisons of the same individual at different ages during their lifetime. You wish to understand to what extent age influences music taste, specifically as it relates to perceptions of popular music. Your results will be written into an academic paper that you hope to publish. - -### Part B - Survey Evaluation: - -For the **Canadian General Social Survey on Giving, Volunteering, and Participating, 2018 (cycle 33)**, conducted by Statistics Canada find any and all available documentation for the data gathered and identify and describe the survey features indicated below. - -1. Sample type -2. Sample size -3. Target population -4. Sampling frame -5. Survey mode(s) -6. Timeline -7. Response rate -8. Weights -9. Data processing -10. Cleaning, imputation, etc -11. Sources of error -12. Limitations, known biases, etc -13. Link to documentation and any additional sources used - - -# Your Changes - -## Part A - Survey Design: - -The number of your chosen topic: `#` - -Describe the purpose of your survey: -``` -write your answer here... -``` - -Describe your target population, sampling frame, sampling units, and observational units: -``` -write your answer here... -``` - -Your 5-10 question survey: -``` -1. write your question here... -2. write your question here... -3. write your question here... -4. write your question here... -5. write your question here... -6. write your question here... (optional) -7. write your question here... (optional) -8. write your question here... (optional) -9. write your question here... (optional) -10. write your question here... (optional) -``` - -## Part B - Survey Evaluation: - -Identify and describe survey features: - -``` -write your answer here -``` - -## Rubric - -- All required components are present and complete **Complete / Incomplete** -- Choice of sampling strategy for Part A is justified and related to survey purpose **Complete / Incomplete** -- Information for Part B is complete and correct **Complete / Incomplete** - -## Submission Information - -🚨 **Please review our [Assignment Submission Guide](https://github.com/UofT-DSI/onboarding/blob/main/onboarding_documents/submissions.md)** 🚨 for detailed instructions on how to format, branch, and submit your work. Following these guidelines is crucial for your submissions to be evaluated correctly. - -### Submission Parameters: -* Submission Due Date: `23:59 - 14 January 2026` -* The branch name for your repo should be: `assignment-2` -* What to submit for this assignment: - * This markdown file (a2_survey_design_and_evaluation.md) should be populated and should be the only change in your pull request. -* What the pull request link should look like for this assignment: `https://github.com//sampling/pull/` - * Open a private window in your browser. Copy and paste the link to your pull request into the address bar. Make sure you can see your pull request properly. This helps the technical facilitator and learning support staff review your submission easily. - -Checklist: -- [ ] Create a branch called `assignment-2`. -- [ ] Ensure that the repository is public. -- [ ] Review [the PR description guidelines](https://github.com/UofT-DSI/onboarding/blob/main/onboarding_documents/submissions.md#guidelines-for-pull-request-descriptions) and adhere to them. -- [ ] Verify that the link is accessible in a private browser window. - -If you encounter any difficulties or have questions, please don't hesitate to reach out to our team via the help channel in Slack. Our Technical Facilitators and Learning Support staff are here to help you navigate any challenges. diff --git a/02_activities/assignments/assignment-2.md b/02_activities/assignments/assignment-2.md new file mode 100644 index 00000000..2df30726 --- /dev/null +++ b/02_activities/assignments/assignment-2.md @@ -0,0 +1,196 @@ +# Assignment: Questionnaire Design and Sample Evaluation + +## Requirements + +The goal of this assignment is to practice developing and evaluating sampling materials. + +### Part A - Survey Design: + +Select one of the scenarios below and design a survey to meet the need(s) outlined in the prompt. + +1. In two to three sentences, describe the purpose of your survey +2. Describe your target population, sampling frame, sampling units, and overall sampling strategy. +3. Write a 5-10 question survey to address your chosen scenario below. + +##### Scenarios +1. You work in the Human Resources Department at a large tech company. Over the past few months, the company has been experiencing a high turnover rate across many of its departments, specifically within the entry- and lower-level positions. The company wishes to understand why this turnover is happening, and what changes need to occur to improve employee satisfaction. +2. You work for a Canadian national political party during a federal election. Throughout the campaign period, your party has seen relatively high approval ratings, but an opposing party is also polling favorably and may still have a chance to win the election. You are one month away from the election and you want to understand what voters want from your party and its leader in order to maintain your lead and eventually win the election. +3. You are a student researcher in the sociology department at the University of Toronto. You are working on a research project that concerns the relationship between music taste and age. This involves both comparisons between different people of different ages and comparisons of the same individual at different ages during their lifetime. You wish to understand to what extent age influences music taste, specifically as it relates to perceptions of popular music. Your results will be written into an academic paper that you hope to publish. + +### Part B - Survey Evaluation: + +For the **Canadian General Social Survey on Giving, Volunteering, and Participating, 2018 (cycle 33)**, conducted by Statistics Canada find any and all available documentation for the data gathered and identify and describe the survey features indicated below. + +1. Sample type +2. Sample size +3. Target population +4. Sampling frame +5. Survey mode(s) +6. Timeline +7. Response rate +8. Weights +9. Data processing +10. Cleaning, imputation, etc +11. Sources of error +12. Limitations, known biases, etc +13. Link to documentation and any additional sources used + + +# Your Changes + +## Part A - Survey Design: + +The number of your chosen topic: `3` + +Describe the purpose of your survey: +``` +write your answer here...The aim of this survey is to examine the relationship between age and music taste, with a specific focus on how individuals perceive popular music. The survey aims to explore differences in music preferences across age groups as well as changes in music taste within the same individuals over their lifespan. By collecting both current preferences and retrospective data collection which reflections on past music tastes, the study seeks to understand how aging influences tasete toward popular music genres, artists, etc. The findings will contribute to sociological research thesis project. + +Describe your target population, sampling frame, sampling units, and observational units: +``` +write your answer here... +```Target Population: +The target population consists of adults aged 18 years or older, including young adults, middle-aged adults, and older adults. The study aims to capture generational differences in music taste and perceptions of pop music. + +Sampling Frame: +The sampling frame can be included from students, staff, faculty, and alumni of the University of Toronto, as well as members of the general public reachable through online platforms (e.g., university mailing lists, social media, and online survey distribution). + +Sampling Units: +The primary sampling unit is the individual respondent. Each participant represents one unit of analysis. + +Sampling Strategy: +A non-probability convenience sampling strategy will be used, supplemented by quota sampling to ensure representation across different age groups for example: categorized age to these age ranges: 18-29, 30-44, 45-59 or 60+. + +Your 5-10 question survey: +``` +1. write your question here...How old are you? +A. 18-29 +B. 30-44 +C. 45-59 +D. 60 or older +2. write your question here...How would you describe your overall interest in music? +A. Very interested +B. Somewhat interested +C. Neutral +D. Not very interested +3. write your question here...Which music genres do you listen to most frequently? (Select all that apply) +A. Pop +B. Rock +C. Hip-hop/Rap +D. Jazz +E. Classical +F. Other: +4. write your question here...How often do you listen to currently pop music? +A. Very often +B. Sometimes +C. Rarely +D. Never +5. write your question here...Compared to when you were younger, how has your music taste changed? +A. Changed significantly +B. Changed somewhat +C. Stayed mostly the same +D. Not sure +6. write your question here... (optional) +7. write your question here... (optional) +8. write your question here... (optional) +9. write your question here... (optional) +10. write your question here... (optional) +``` + +## Part B - Survey Evaluation: + +Identify and describe survey features: + +``` +write your answer here +```1. Sample Type + +The 2018 General Social Survey on Giving, Volunteering and Participating (GSS-GVP) used a probability sample design. The 2018 GSS GVP collected data from persons aged 15 years and over living in private households in Canada, excluding residents of the Yukon, Northwest Territories and Nunavut and full time residents of institutions. The sampling frame integrates telephone numbers (landline and cellular) linked to addresses from the Address Register and other administrative sources. + +2. Sample Size + +It collected data from 16,149 respondents within the target population. + +3. Target Population + +The target population for the GSS-GVP includes persons aged 15 years and older living in private households in the ten Canadian provinces, excluding residents of Yukon, Northwest Territories, Nunavut, and full-time institutional residents. + +4. Sampling Frame + +The sampling frame for the 2018 GSS is built from Statistics Canada's integrated telephone frame, combining landline and cell phone numbers associated with residential addresses from the Address Register and various administrative sources. This frame aims to cover households across the provinces, including "cell-phone-only" households. + +5. Survey Mode(s) + +Data collection in 2018 included both computer-assisted interviewing and an internet questionnaire option. These mixed modes were introduced in recognition of changing technology use and respondent preferences. + +6. Timeline + +The documentation for the General Social Survey, Cycle 33 (2018) was released in January 2021. While specific fieldwork dates are not detailed in the public documentation, the survey refers to activities in the 12 months preceding collection and follows the usual multi-month administration period for GSS cycles. The Daily release in January 2021 confirms availability of the public use microdata file and tables at that time. + +7. Response Rate + It is a limitation that the numeric number wasn't reported. + + +8. Weights + +The public use microdata includes person-level weighting factors that adjust for unequal probabilities of selection and non-response so estimates better reflect the Canadian population aged 15 and over. Bootstrap weights are provided for variance estimation to support proper statistical inference. The weights are further adjusted so that key demographic distributions (e.g., age and sex by province) match known population totals. + +9. Data Processing + +Data integration and editing to prepare responses from different collection modes. + +Weighting adjustments to correct for unequal sample design, coverage issues, and non-response. + +Imputation for missing income or demographic values when possible (e.g., linking to administrative sources for income data, with imputation for missing cases). + +10. Cleaning, Imputation, etc. + +The survey documentation notes that missing information (fo example the income) was supplemented by linking to administrative tax data for respondents who consented, with imputation applied for cases without linked administrative data. Coverage and non-response adjustments combined with quality assurance checks help reduce potential bias. + +11. Sources of Error + +Sampling error: because only a sample of the population is surveyed, estimates will vary from one possible sample to another. + +Coverage error: households without telephones or those outside the sampling frame may be excluded. + +Non-response error: some selected respondents may not participate, potentially skewing estimates if non-respondents differ systematically from respondents. + +Measurement error: differences in how respondents interpret and answer questions across modes some answered with phone, or some in person or online. + +12. Limitations, Known Biases, etc. + + +Mode differences: The introduction of an internet option in 2018 may affect comparability with previous cycles. + +Non-response and coverage bias: non responder numbers didn't reported. + + +13. Documentation and Sources + +https://www23.statcan.gc.ca/imdb/p2SV.pl?Function=getSurvey&SDDS=4430 and https://www150.statcan.gc.ca/n1/en/catalogue/452500112021001 + +## Rubric + +- All required components are present and complete **Complete / Incomplete** +- Choice of sampling strategy for Part A is justified and related to survey purpose **Complete / Incomplete** +- Information for Part B is complete and correct **Complete / Incomplete** + +## Submission Information + +🚨 **Please review our [Assignment Submission Guide](https://github.com/UofT-DSI/onboarding/blob/main/onboarding_documents/submissions.md)** 🚨 for detailed instructions on how to format, branch, and submit your work. Following these guidelines is crucial for your submissions to be evaluated correctly. + +### Submission Parameters: +* Submission Due Date: `23:59 - 14 January 2026` +* The branch name for your repo should be: `assignment-2` +* What to submit for this assignment: + * This markdown file (a2_survey_design_and_evaluation.md) should be populated and should be the only change in your pull request. +* What the pull request link should look like for this assignment: `https://github.com//sampling/pull/` + * Open a private window in your browser. Copy and paste the link to your pull request into the address bar. Make sure you can see your pull request properly. This helps the technical facilitator and learning support staff review your submission easily. + +Checklist: +- [ ] Create a branch called `assignment-2`. +- [ ] Ensure that the repository is public. +- [ ] Review [the PR description guidelines](https://github.com/UofT-DSI/onboarding/blob/main/onboarding_documents/submissions.md#guidelines-for-pull-request-descriptions) and adhere to them. +- [ ] Verify that the link is accessible in a private browser window. + +If you encounter any difficulties or have questions, please don't hesitate to reach out to our team via the help channel in Slack. Our Technical Facilitators and Learning Support staff are here to help you navigate any challenges. diff --git a/02_activities/assignments/assignment_1 (1).ipynb b/02_activities/assignments/assignment_1 (1).ipynb new file mode 100644 index 00000000..3e2b3ac4 --- /dev/null +++ b/02_activities/assignments/assignment_1 (1).ipynb @@ -0,0 +1,176 @@ +{ + "nbformat": 4, + "nbformat_minor": 0, + "metadata": { + "colab": { + "provenance": [] + }, + "kernelspec": { + "name": "python3", + "display_name": "Python 3" + }, + "language_info": { + "name": "python" + } + }, + "cells": [ + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 469 + }, + "id": "XOe9KOlXbmT1", + "outputId": "902b42af-a146-495a-d1cb-85532cf8a750" + }, + "outputs": [ + { + "output_type": "display_data", + "data": { + "text/plain": [ + "
" + ], + "image/png": "iVBORw0KGgoAAAANSUhEUgAAA9wAAAJOCAYAAABFiQ/hAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAa9tJREFUeJzt3XdclfX///HnYW9QUcDErUjmRMuVE2eZqxyZilmZOVOz/FqpWWlqzhzlp8SmZZktRw6wMjNzpYm4MCxxoDkQQYHr94c3zs8jqIBcHsDH/XY7t7ze13pd13mf03lyLYthGIYAAAAAAEC+crB3AQAAAAAAFEUEbgAAAAAATEDgBgAAAADABARuAAAAAABMQOAGAAAAAMAEBG4AAAAAAExA4AYAAAAAwAQEbgAAAAAATEDgBgAAAADABARuAMgHH330kapVqyZnZ2f5+fnZuxzkkcVi0YQJE+xdBq4TERGh8uXL22Xd+dkn7Lkd2UlLS9OYMWMUHBwsBwcHde7c+Y6t+8iRI7JYLIqMjLxj6wQAeyBwA7ipyMhIWSwW/fHHH/Yu5batXLnSlDC1b98+RUREqFKlSlq0aJHee++9W86zc+dOPfHEEwoODparq6uKFy+u8PBwLV68WOnp6fleY6Zff/1VEyZM0NmzZ01bhyR9+umnmjVr1i2nmzBhgiwWyy1fzZs3N7Xeu0V0dLTNfnV2dlbFihXVt29fHT582N7lFVqZ4TG7V4MGDUxbb+b7+eWXX+Zp/g8++EDTpk3To48+qiVLluj555/P5wpz/l1wp3333Xdq1qyZSpUqJQ8PD1WsWFHdu3fX6tWr7V0agCLGyd4FAMCdsnLlSs2bNy/fQ3d0dLQyMjI0e/ZsVa5c+ZbT/+9//9Ozzz6rgIAA9enTR1WqVNGFCxe0fv16DRgwQAkJCfq///u/fK0x06+//qqJEycqIiLC1CPxn376qfbs2aMRI0bcdLquXbva7LOkpCQNGjRIXbp0UdeuXa3tAQEBZpVq49KlS3JyKvr/axw2bJjq16+vK1euaPv27Xrvvff0ww8/aPfu3SpdurS9y8ti0aJFysjIsHcZt9SrVy916NDBpq1kyZJ2qubWNmzYoHvuuUczZ840bR03+i4oV66cLl26JGdnZ9PWfSPTp0/XCy+8oGbNmmns2LHy8PDQwYMHtW7dOi1dulTt2rW74zUBKLqK/q8KADDZyZMnJSlHAfa3337Ts88+q4YNG2rlypXy9va2jhsxYoT++OMP7dmzx6xSC5yaNWuqZs2a1uHExEQNGjRINWvW1BNPPHHD+VJSUuTi4iIHh/w9UcvNzS1fl1dQPfjgg3r00UclSf3791fVqlU1bNgwLVmyRGPHjr2tZV+8eFGenp75UaaVPUJZXtStW/em/bagOXnypN0ugbFYLHb5vKWlpWnSpElq3bq1fvzxxyzjM7/P7yQzPjMACg5OKQeQaxEREfLy8lJ8fLwefvhheXl56Z577tG8efMkSbt371bLli3l6empcuXK6dNPP7WZP/M09Z9++kkDBw5UiRIl5OPjo759++q///6zmfabb77RQw89pNKlS8vV1VWVKlXSpEmTsj3tesuWLerQoYOKFSsmT09P1axZU7Nnz7bWnFnftad73sr8+fNVvXp1ubq6qnTp0ho8eLDN6djly5fX+PHjJV09knWr6z0nTpwoi8WiTz75xCZsZ6pXr54iIiKswxcvXtSoUaOsp56HhIRo+vTpMgzDZj6LxaIhQ4ZoxYoVuu++++Tq6qrq1avbnB45YcIEvfDCC5KkChUqWPfBkSNHJEmLFy9Wy5YtVapUKbm6uuree+/VggULst2OVatWqVmzZvL29paPj4/q169vfZ+bN2+uH374QX///bd1Hbdz3WrmabNLly7Vyy+/rHvuuUceHh46f/68zpw5o9GjR6tGjRry8vKSj4+P2rdvr127dmVZTkpKiiZMmKCqVavKzc1NQUFB6tq1qw4dOmSzH699/zJPeT948KD1rABfX1/1799fycnJNsu/dOmShg0bJn9/f3l7e+uRRx7Rv//+m+NrgE+ePKkBAwYoICBAbm5uqlWrlpYsWWIzTeapy9OnT9d7772nSpUqydXVVfXr19fWrVtzt2Ov0bJlS0lSXFyctW3VqlV68MEH5enpKW9vbz300EP666+/bObL/C44dOiQOnToIG9vb/Xu3VuSrGd91KhRQ25ubipZsqTatWuX5fKUjz/+WGFhYXJ3d1fx4sXVs2dPHT16NMt6MvvQlStXVLx4cfXv3z/Ldpw/f15ubm4aPXq0tS01NVXjx49X5cqV5erqquDgYI0ZM0apqak286ampur5559XyZIlre/fP//8k8s9mTuZfTs6Otqm/Xaub85Jn81cflRUlP766y/r5zSzjoyMDM2aNUvVq1eXm5ubAgICNHDgwCzfz1LevwtutI0bNmyw9js/Pz916tRJMTExud7GG0lMTNT58+fVuHHjbMeXKlXKZjgnn8vcvI936jNz4MABdevWTYGBgXJzc1OZMmXUs2dPnTt37qb7B0D+4wg3gDxJT09X+/bt1bRpU02dOlWffPKJhgwZIk9PT40bN069e/dW165dtXDhQvXt21cNGzZUhQoVbJYxZMgQ+fn5acKECYqNjdWCBQv0999/W3+8SFfDuZeXl0aOHCkvLy9t2LBBr776qs6fP69p06ZZl7V27Vo9/PDDCgoK0vDhwxUYGKiYmBh9//33Gj58uAYOHKhjx45p7dq1+uijj3K0jRMmTNDEiRMVHh6uQYMGWWvcunWrNm3aJGdnZ82aNUsffvihvv76ay1YsEBeXl42R2yvlZycrPXr16tp06YqW7bsLddvGIYeeeQRRUVFacCAAapdu7bWrFmjF154Qf/++2+W00B/+eUXLV++XM8995y8vb01Z84cdevWTfHx8SpRooS6du2q/fv367PPPtPMmTPl7+8v6f+f8rpgwQJVr15djzzyiJycnPTdd9/pueeeU0ZGhgYPHmxdT2RkpJ588klVr15dY8eOlZ+fn3bs2KHVq1fr8ccf17hx43Tu3Dn9888/1hq9vLxytM9vZtKkSXJxcdHo0aOVmpoqFxcX7d27VytWrNBjjz2mChUq6MSJE3r33XfVrFkz7d2713p6dHp6uh5++GGtX79ePXv21PDhw3XhwgWtXbtWe/bsUaVKlW667u7du6tChQqaPHmytm/frv/9738qVaqU3nrrLes0ERER+uKLL9SnTx81aNBAGzdu1EMPPZSjbbt06ZKaN2+ugwcPasiQIapQoYKWLVumiIgInT17VsOHD7eZ/tNPP9WFCxc0cOBAWSwWTZ06VV27dtXhw4fzdDQ4848OJUqUkHT1JoD9+vVT27Zt9dZbbyk5OVkLFixQkyZNtGPHDps/oKSlpalt27Zq0qSJpk+fLg8PD0nSgAEDFBkZqfbt2+upp55SWlqafv75Z/3222+qV6+eJOmNN97QK6+8ou7du+upp57SqVOnNHfuXDVt2lQ7duzI9uirs7OzunTpouXLl+vdd9+Vi4uLddyKFSuUmpqqnj17SroaYB555BH98ssveuaZZxQa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bpztH7munU7Kv++Ca79zr7dv3z75+/ub/uisevXqacmSJUpISLDWlJPPZX68j2Z8ZmrUqKEaNWro5Zdf1q+//qrGjRtr4cKFev3113NcF4DbxzXcAOzmvffe05UrV6zDCxYsUFpamtq3by/p/x+9uPZoxeXLlzV//nyb5dStW1cVKlTQrFmzsvzguXbezB9r10+TnfDwcLm4uGjOnDk2y3j//fd17ty5XN+9ONP48eNlGIb69OmjpKSkLOO3bdtmfeRMhw4dlJ6ernfeecdmmpkzZ8pisVj3U27caB9kt6/PnTunxYsX20zXpk0beXt7a/LkyUpJSbEZd/2+vhOPn3F0dMxyNGvZsmX6999/bdq6deumxMTELPtSyp+j1G3btpWkLH1z7ty5OZq/Q4cOOn78uM01yWlpaZo7d668vLxydbTtdrVt21Y+Pj568803bT6fmU6dOnXLZXTr1k2GYWjixIlZxmXu765du8rR0VETJ07M8h4YhqHTp0/fdB0ODg569NFH9d133+mjjz5SWlqazenk0tW7WP/7779atGhRlvkvXbqkixcvSpL1szRnzhybaWbNmnXzDb1N5cqVk6Ojo3766Seb9uv70Z3UvXt3paena9KkSVnGpaWlWb878vu7ICgoSLVr19aSJUtsvp/27NmjH3/80fqH2NuVnJyszZs3Zzsu874YmX90yennMj/ex/z8zJw/f15paWk242vUqCEHB4csj8MDYD6OcAOwm8uXL6tVq1bq3r27YmNjNX/+fDVp0kSPPPKIJKlRo0YqVqyY+vXrp2HDhsliseijjz7K8kPDwcFBCxYsUMeOHVW7dm31799fQUFB2rdvn/766y+tWbNGkhQWFibp6o2R2rZtK0dHR+vjg65XsmRJjR07VhMnTlS7du30yCOPWGusX7++nnjiiTxtc6NGjTRv3jw999xzqlatmvr06aMqVarowoULio6O1rfffms9+tCxY0e1aNFC48aN05EjR1SrVi39+OOP+uabbzRixIhbPsoqO5n7YNy4cerZs6ecnZ3VsWNHtWnTRi4uLurYsaMGDhyopKQkLVq0SKVKlbIe7ZGunn45c+ZMPfXUU6pfv74ef/xxFStWTLt27VJycrL1jwVhYWH6/PPPNXLkSNWvX19eXl7q2LFjnvbZzTz88MN67bXX1L9/fzVq1Ei7d+/WJ598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rVq1uq26YmJi1LhxY5u2xo0bKyYm5ob1e3p6ysfHx1r/oEGDtHTpUtWuXVtjxozRr7/+mqdawsLCstTWsGFDm2dAN27cWElJSfrnn3+yrc3R0VElSpRQjRo1rG0BAQGSdNP93bx5c+3fv18JCQmKjo5WkyZN5OjoqGbNmllPE4+OjlajRo3k6uqq3bt3Kz09XVWrVrV5fzZu3Gh9f2JiYvTAAw/YrKdhw4ZZtvFW02TnZv0pNjZWwcHBNn/QyDzzIVNERIR27typkJAQDRs2TD/++OMt1wkAAAAUNRzhLiKcnZ1thi0WizIyMm44fVJSkoKCgrJcEyzJeg32nbxx183qb9++vf7++2+tXLlSa9euVatWrTR48GBNnz49V+vw9PTMt9qubcsM7Dfb340bN5aLi4uioqIUFRWlZs2aSZLq16+vxMREHT58WNHR0Ro4cKCkq++Po6Ojtm3bJkdHR5tleXl55Wk7ciO3/el6devWVVxcnFatWqV169ape/fuCg8P15dffpnfpQIAAAAFFke471J169bV8ePH5eTkpMqVK9u8Mq+PrlmzptavX3/DZbi4uCg9Pf2m6wkNDdWmTZts2jZt2qR77703V/WWLFlS/fr108cff6xZs2bpvffey9X8N6pt8+bNNo/E2rRpk7y9vVWmTJnbXv613N3drTc927hxo5o3by7parBt0KCB3n//fR09etR6mn2dOnWUnp6ukydPZnl/Mo8sh4aGasuWLTbr+e2337Js462mya2QkBAdPXpUJ06csLZde618Jh8fH/Xo0UOLFi3S559/rq+++sp6XT4AAABwN+AI910qPDxcDRs2VOfOnTV16lRVrVpVx44ds94orV69eho/frxatWqlSpUqqWfPnkpLS9PKlSv14osvSrp6LfVPP/2knj17ytXVNdsbmb3wwgvq3r276tSpo/DwcH333Xdavny51q1bl+NaX331VYWFhal69epKTU3V999/r9DQ27+7+3PPPadZs2Zp6NChGjJkiGJjYzV+/HiNHDnSev12fmrRooVmzpwp6eofPDI1a9ZM06dPt95cTbp6PXbv3r3Vt29fvf3226pTp45OnTql9evXq2bNmnrooYc0bNgwNW7cWNOnT1enTp20Zs0am+u3JWn48OGKiIhQvXr11LhxY33yySf666+/VLFixTxvR+vWrVWpUiX1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+MGDBys1NVU//fSTdu/erbfeekteXl6SpLNnz6ply5aqU6eO/vjjD61evVonTpxQ9+7dJV099b5Xr1568sknre9P165dZRjGDbcbAIA8MQAAuIv169fP6NSpk2EYhpGRkWGsXbvWcHV1NUaPHm0dHxAQYKSmplrnee+994xixYoZSUlJ1rYffvjBcHBwMI4fP26dr3jx4sbFixet0yxYsMDw8vIy0tPTjaSkJMPZ2dn45JNPrOMvX75slC5d2pg6daphGIYRFRVlSDJWrFhhU/P48eONWrVqZdkWScbXX3+dqxrLlStnpKWlWad57LHHjB49etxwfzVq1Mh4+umnbdoee+wxo0OHDtbhTp06Gf369bvhMgzDMEqXLm2MGzfuptNca9myZUaJEiWswzVq1DAmTJiQ7bSTJk0y2rRpY9N29OhRQ5IRGxtrbNu2zZBkHDlyJMfrBwAgLzjCDQC4633//ffy8vKSm5ub2rdvrx49emjChAnW8TVq1LC5bjsmJka1atWSp6enta1x48bKyMhQbGysta1WrVry8PCwDjds2FBJSUk6evSoDh06pCtXrqhx48bW8c7Ozrr//vsVExNjU1+9evVyvU05rbF69epydHS0DgcFBenkyZM3Xe61NWcu9/qab+bkyZM6duyYWrVqdcNp1q1bp1atWumee+6Rt7e3+vTpo9OnTys5OVmSNGzYML3++utq3Lixxo8frz///NM6765duxQVFSUvLy/rq1q1apKuXl9eq1YttWrVSjVq1NBjjz2mRYsW6b///stx/QAA5BSBGwBw12vRooV27typAwcO6NKlS1qyZIlNUL323/Zg5vqdnZ1thi0WizIyMkxbn3T1lP2bOXLkiB5++GHVrFlTX331lbZt26Z58+ZJkvVU/6eeekqHDx9Wnz59tHv3btWrV09z586VJCUlJaljx47auXOnzevAgQNq2rSpHB0dtXbtWq1atUr33nuv5s6dq5CQEMXFxZm63QCAuw+BGwBw1/P09FTlypVVtmxZOTnd+gEeoaGh2rVrl81NtjZt2iQHBwfrTdWkq0daL126ZB3+7bff5OXlpeDgYOtNxzZt2mQdf+XKFW3dulX33nvvTdfv4uJy07uV56bG3AoNDbWpOXO5t6r5Wt7e3ipfvrzWr1+f7fht27YpIyNDb7/9tho0aKCqVavq2LFjWaYLDg7Ws88+q+XLl2vUqFFatGiRJKlu3br666+/VL58eVWuXNnmlfnHC4vFosaNG2vixInasWOHXFxc9PXXX+d4GwAAyAkCNwAAudS7d2+5ubmpX79+2rNnj6KiojR06FD16dNHAQEB1ukuX76sAQMGaO/evVq5cqXGjx+vIUOGyMHBQZ6enho0aJBeeOEFrV69Wnv37tXTTz+t5ORkDRgw4KbrL1++vOLi4rRz504lJiYqNTU1zzXm1gsvvKDIyEgtWLBABw4c0IwZM7R8+XKNHj06V8uZMGGC3n77bc2ZM0cHDhzQ9u3brUeoK1eurCtXrmju3Lk6fPiwPvroIy1cuNBm/hEjRmjNmjWKi4vT9u3bFRUVpdDQUElXb6h25swZ9erVS1u3btWhQ4e0Zs0a9e/fX+np6dqyZYvefPNN/fHHH4qPj9fy5ct16tQp6/wAAOQXAjcAALnk4eGhNWvW6MyZM6pfv74effRRtWrVSu+8847NdK1atVKVKlXUtGlT9ejRQ4888ojNteFTpkxRt27d1KdPH9WtW1cHDx7UmjVrVKxYsZuuv1u3bmrXrp1atGihkiVL6rPPPstzjbnVuXNnzZ49W9OnT1f16tX17rvvavHixWrevHmultOvXz/NmjVL8+fPV/Xq1fXwww/rwIEDkq5e+z5jxgy99dZbuu+++/TJJ59o8uTJNvOnp6dr8ODBCg0NVbt27VS1alXNnz9fklS6dGlt2rRJ6enpatOmjWrUqKERI0bIz89PDg4O8vHx0U8//aQOHTqoatWqevnll/X222+rffv2t7VvAAC4nsUweAYGAAD5LSIiQmfPnrV5LjYAALi7cIQbAAAAAAATELgBAAAAADABp5QDAAAAAGACjnADAAAAAGACAjcAAAAAACYgcAMAAAAAYAICNwAAAAAAJiBwAwAAAABgAgI3AAAAAAAmIHADAAAAAGACAjcAAAAAACYgcAMAAAAAYIL/B5Nhd6UzNY+SAAAAAElFTkSuQmCC\n" + }, + "metadata": {} + } + ], + "source": [ + "import numpy as np\n", + "np.random.seed(42)\n", + "# Import necessary libraries\n", + "import pandas as pd\n", + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "import seaborn as sns\n", + "\n", + "# Note: Suppressing FutureWarnings to maintain a clean output. This is specifically to ignore warnings about\n", + "# deprecated features in the libraries we're using (e.g., 'use_inf_as_na' option in Pandas, used by Seaborn),\n", + "# which we currently have no direct control over. This action is taken to ensure that our output remains\n", + "# focused on relevant information, acknowledging that we rely on external library updates to fully resolve\n", + "# these deprecations. Always consider reviewing and removing this suppression after significant library updates.\n", + "import warnings\n", + "warnings.simplefilter(action='ignore', category=FutureWarning)\n", + "\n", + "# Constants representing the parameters of the model\n", + "ATTACK_RATE = 0.10\n", + "TRACE_SUCCESS = 0.20\n", + "SECONDARY_TRACE_THRESHOLD = 2\n", + "\n", + "def simulate_event(m):\n", + " \"\"\"\n", + " Simulates the infection and tracing process for a series of events.\n", + "\n", + " This function creates a DataFrame representing individuals attending weddings and brunches,\n", + " infects a subset of them based on the ATTACK_RATE, performs primary and secondary contact tracing,\n", + " and calculates the proportions of infections and traced cases that are attributed to weddings.\n", + "\n", + " Parameters:\n", + " - m: Dummy parameter for iteration purposes.\n", + "\n", + " Returns:\n", + " - A tuple containing the proportion of infections and the proportion of traced cases\n", + " that are attributed to weddings.\n", + " \"\"\"\n", + " # Create DataFrame for people at events with initial infection and traced status\n", + " events = ['wedding'] * 200 + ['brunch'] * 800\n", + " ppl = pd.DataFrame({\n", + " 'event': events,\n", + " 'infected': False,\n", + " 'traced': np.nan # Initially setting traced status as NaN\n", + " })\n", + "\n", + " # Explicitly set 'traced' column to nullable boolean type\n", + " ppl['traced'] = ppl['traced'].astype(pd.BooleanDtype())\n", + "\n", + " # Infect a random subset of people\n", + " infected_indices = np.random.choice(ppl.index, size=int(len(ppl) * ATTACK_RATE), replace=False)\n", + " ppl.loc[infected_indices, 'infected'] = True\n", + "\n", + " # Primary contact tracing: randomly decide which infected people get traced\n", + " ppl.loc[ppl['infected'], 'traced'] = np.random.rand(sum(ppl['infected'])) < TRACE_SUCCESS\n", + "\n", + " # Secondary contact tracing based on event attendance\n", + " event_trace_counts = ppl[ppl['traced'] == True]['event'].value_counts()\n", + " events_traced = event_trace_counts[event_trace_counts >= SECONDARY_TRACE_THRESHOLD].index\n", + " ppl.loc[ppl['event'].isin(events_traced) & ppl['infected'], 'traced'] = True\n", + "\n", + " # Calculate proportions of infections and traces attributed to each event type\n", + " ppl['event_type'] = ppl['event'].str[0] # 'w' for wedding, 'b' for brunch\n", + " wedding_infections = sum(ppl['infected'] & (ppl['event_type'] == 'w'))\n", + " brunch_infections = sum(ppl['infected'] & (ppl['event_type'] == 'b'))\n", + " p_wedding_infections = wedding_infections / (wedding_infections + brunch_infections)\n", + "\n", + " wedding_traces = sum(ppl['infected'] & ppl['traced'] & (ppl['event_type'] == 'w'))\n", + " brunch_traces = sum(ppl['infected'] & ppl['traced'] & (ppl['event_type'] == 'b'))\n", + " p_wedding_traces = wedding_traces / (wedding_traces + brunch_traces)\n", + "\n", + " return p_wedding_infections, p_wedding_traces\n", + "\n", + "# Run the simulation 1000 times\n", + "results = [simulate_event(m) for m in range(100)]\n", + "props_df = pd.DataFrame(results, columns=[\"Infections\", \"Traces\"])\n", + "\n", + "# Plotting the results\n", + "plt.figure(figsize=(10, 6))\n", + "sns.histplot(props_df['Infections'], color=\"blue\", alpha=0.75, binwidth=0.05, kde=False, label='Infections from Weddings')\n", + "sns.histplot(props_df['Traces'], color=\"red\", alpha=0.75, binwidth=0.05, kde=False, label='Traced to Weddings')\n", + "plt.xlabel(\"Proportion of cases\")\n", + "plt.ylabel(\"Frequency\")\n", + "plt.title(\"Impact of Contact Tracing on Perceived Flu Infection Sources\")\n", + "plt.legend()\n", + "plt.tight_layout()\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "source": [ + "Question 1: Sampling Stages in the Model\n", + "\n", + "The simulation involves multiple stages of sampling, each of which contributes to variability and potential bias in the results.\n", + "\n", + "First, a random sample of individuals is selected to become infected. From a total population of 1,000 event attendees (200 wedding attendees and 800 brunch attendees), 10% are randomly chosen using np.random.choice() without replacement. This represents the infection process and assumes equal probability of infection across all individuals.\n", + "\n", + "Second, primary contact tracing is applied to infected individuals. For each infected person, tracing success is determined using a Bernoulli trial implemented through np.random.rand() with a success probability of 0.20. This stage samples from the infected population and introduces additional randomness.\n", + "\n", + "Third, secondary contact tracing is applied at the event level. If the number of successfully traced infected individuals at an event reaches or exceeds a predefined threshold, all infected individuals from that event are marked as traced. This step is conditional on earlier sampling and is non-random, leading to systematic overrepresentation of certain events.\n", + "\n", + "Together, these sampling stages demonstrate how non-random tracing mechanisms can bias observed outcomes, even when the initial infection process is random." + ], + "metadata": { + "id": "Ij9sfdKJe8Ij" + } + }, + { + "cell_type": "markdown", + "source": [ + "Question 2\n", + "\n", + "When the simulation is run with only 10 repetitions, the resulting distributions are highly variable and differ substantially between runs. The small number of simulations leads to unstable estimates and noisy histograms, making the results poorly reproducible.\n", + "\n", + "Increasing the number of repetitions to 100 reduces variability and produces smoother distributions; however, noticeable differences between runs remain. This demonstrates that while larger sample sizes improve stability, randomness still influences the results when no reproducibility controls are applied.\n", + "\n", + "With 1,000 repetitions, the distributions become more stable, but repeated executions of the script still produce slightly different outputs due to the use of random sampling without a fixed seed." + ], + "metadata": { + "id": "Ayqm_ss_g7zK" + } + }, + { + "cell_type": "markdown", + "source": [ + "Question 3\n", + "\n", + "To ensure reproducibility, a fixed random seed was set using np.random.seed(42) at the beginning of the script. This change ensures that the sequence of random numbers generated during the simulation remains identical across runs.\n", + "\n", + "By fixing the random seed, the same individuals are selected for infection, the same tracing outcomes occur, and the resulting histograms are identical every time the script is executed. This modification does not remove randomness from the model but ensures that the randomness is controlled and reproducible, which is essential for scientific transparency and verification." + ], + "metadata": { + "id": "uTwLBWM5g-z1" + } + } + ] +} \ No newline at end of file