{ "cells": [ { "cell_type": "markdown", "id": "3c52f53b-759d-4d8d-a60b-bf09b1c9746c", "metadata": {}, "source": [ "# Election Insights: Uncovering Voter Trends \n", "\n", "### Description \n", "It's election season, and the Democratic National Committee (**DNC**) and the Republican National Committee (**RNC**) need your help analyzing voter demographics and donation data to inform campaign strategies.\n", "\n", "### Tasks\n", "- Merge the voter demographics and donation dataframes on the voter ID column and calculate the total donations received from each state.\n", "- Transform the 'donation_date' column to datetime format and extract the month and year of each donation. Then, create a new dataframe showing the total donations received each month, grouped by state.\n", "- Pivot the merged dataframe to show the average donation amount by age group and state." ] }, { "cell_type": "code", "execution_count": 1, "id": "331ac28e-7a8b-4564-b063-f5b2dba21198", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Python version 3.11.7 | packaged by Anaconda, Inc. | (main, Dec 15 2023, 18:05:47) [MSC v.1916 64 bit (AMD64)]\n", "Pandas version 2.2.1\n", "Numpy version 1.26.4\n" ] } ], "source": [ "# import libraries\n", "import pandas as pd\n", "import numpy as np\n", "import sys\n", "\n", "print('Python version ' + sys.version)\n", "print('Pandas version ' + pd.__version__)\n", "print('Numpy version ' + np.__version__)" ] }, { "cell_type": "markdown", "id": "f1467320-3943-43cd-8889-c08288643e9e", "metadata": {}, "source": [ "# The Data \n", "\n", "The dataset consists of two CSV files: \"voter_demographics\" and \"donations\", containing information on 100,000 voters (age, state, party affiliation) and 50,000 donations (date, amount) made by these voters, respectively. The data is synthetic, representing a fictional scenario, and is designed to mimic real-world voter demographics and donation patterns.\n", "\n", "### Columns:\n", "**Voter Demographics:** \n", "- **voter_id:** Unique identifier for each voter.\n", "- **state:** Two-letter abbreviation for the voter's state.\n", "- **age:** Voter's age.\n", "- **party_affiliation:** Voter's party affiliation.\n", "\n", "\n", "**Donations:** \n", "- **voter_id:** Unique identifier for each voter.\n", "- **donation_date:** Date of donation.\n", "- **donation_amount:** Amount donated." ] }, { "cell_type": "code", "execution_count": 2, "id": "413d6284-345a-4701-8aea-425581feb957", "metadata": {}, "outputs": [], "source": [ "# set the seed\n", "np.random.seed(0)\n", "\n", "# voter demographics data\n", "voter_demographics = pd.DataFrame({\n", " 'voter_id': range(100000),\n", " 'state': np.random.choice(['AL', 'AK', 'AZ', 'AR', 'CA', 'CO', 'CT', 'DE', 'FL', 'GA'], size=100000),\n", " 'age': np.random.randint(18, 80, size=100000),\n", " 'party_affiliation': np.random.choice(['Democrat', 'Republican', 'Independent'], size=100000)\n", "})\n", "\n", "# donation data\n", "donations = pd.DataFrame({\n", " 'voter_id': np.random.choice(range(100000), size=50000),\n", " 'donation_date': pd.date_range('2022-01-01', '2024-11-04', periods=50000),\n", " 'donation_amount': np.random.randint(10, 1000, size=50000)\n", "})\n", "\n", "# save dataframes to CSV files\n", "voter_demographics.to_csv('voter_demographics.csv', index=False)\n", "donations.to_csv('donations.csv', index=False)" ] }, { "cell_type": "markdown", "id": "40931e40-e82c-4d54-a54f-2699dcf32f85", "metadata": {}, "source": [ "We will begin by reading the CSV files into memory." ] }, { "cell_type": "code", "execution_count": 3, "id": "ae7414c8-ddb7-4b39-b380-aa821f95e40b", "metadata": {}, "outputs": [], "source": [ "# create dataframes\n", "voter_demographics_df = pd.read_csv('voter_demographics.csv')\n", "donations_df = pd.read_csv('donations.csv')" ] }, { "cell_type": "markdown", "id": "9c0fab2a-e7f7-4f1a-ae56-607ab138eedb", "metadata": {}, "source": [ "Let us take a look at the data types." ] }, { "cell_type": "code", "execution_count": 4, "id": "3725e105-df3c-4e44-8bad-d80eb5cd3a03", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "RangeIndex: 100000 entries, 0 to 99999\n", "Data columns (total 4 columns):\n", " # Column Non-Null Count Dtype \n", "--- ------ -------------- ----- \n", " 0 voter_id 100000 non-null int64 \n", " 1 state 100000 non-null object\n", " 2 age 100000 non-null int64 \n", " 3 party_affiliation 100000 non-null object\n", "dtypes: int64(2), object(2)\n", "memory usage: 3.1+ MB\n" ] } ], "source": [ "voter_demographics_df.info()" ] }, { "cell_type": "markdown", "id": "07776fc3-9964-409c-ae31-8ebf589e0487", "metadata": {}, "source": [ "Take note that the column named \"donation_date\" will need to be converted into a date object since it is currently being treated as a string. (see task #2)" ] }, { "cell_type": "code", "execution_count": 5, "id": "a913f88d-8b37-4552-847a-406eaa708324", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "RangeIndex: 50000 entries, 0 to 49999\n", "Data columns (total 3 columns):\n", " # Column Non-Null Count Dtype \n", "--- ------ -------------- ----- \n", " 0 voter_id 50000 non-null int64 \n", " 1 donation_date 50000 non-null object\n", " 2 donation_amount 50000 non-null int64 \n", "dtypes: int64(2), object(1)\n", "memory usage: 1.1+ MB\n" ] } ], "source": [ "donations_df.info()" ] }, { "cell_type": "markdown", "id": "b05c3c6c-98fe-44e7-8311-0bdda607626b", "metadata": {}, "source": [ "# Task #1 \n", "\n", "Merge the voter demographics and donation dataframes on the voter ID column and calculate the total donations received from each state.\n", "\n", "**Note:** By default, when using the `.merge` method, we are performing an inner join. This means we will not include any row where the \"voter_id\" column does not match between the two dataframes." ] }, { "cell_type": "code", "execution_count": 6, "id": "680b630a-9cd4-4867-862c-36a00a2eafa6", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
voter_idstateageparty_affiliationdonation_datedonation_amount
00CO64Independent2023-12-28 02:17:33.093061864317
12AR49Independent2022-01-18 04:33:03.495669913857
23AR47Democrat2022-04-25 06:51:57.806356128296
35GA64Independent2023-11-25 08:03:14.691893840100
46AR73Independent2022-06-10 13:57:48.525370508119
\n", "
" ], "text/plain": [ " voter_id state age party_affiliation donation_date \\\n", "0 0 CO 64 Independent 2023-12-28 02:17:33.093061864 \n", "1 2 AR 49 Independent 2022-01-18 04:33:03.495669913 \n", "2 3 AR 47 Democrat 2022-04-25 06:51:57.806356128 \n", "3 5 GA 64 Independent 2023-11-25 08:03:14.691893840 \n", "4 6 AR 73 Independent 2022-06-10 13:57:48.525370508 \n", "\n", " donation_amount \n", "0 317 \n", "1 857 \n", "2 296 \n", "3 100 \n", "4 119 " ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# merge the two dataframes\n", "df = voter_demographics_df.merge(donations_df, on='voter_id')\n", "df.head()" ] }, { "cell_type": "markdown", "id": "99316b70-4429-4521-a62a-b01d7afe97fe", "metadata": {}, "source": [ "We will make use of the `.groupby` method to calculate the total donations received from each state.\n", "\n", "Looking at the final results, we can see that California gave the most donations and Arizona gave the least." ] }, { "cell_type": "code", "execution_count": 7, "id": "2b647dcf-d2fa-4352-918f-ce76fec4dae7", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "state\n", "CA 2598324\n", "AK 2582826\n", "AR 2562748\n", "CT 2522359\n", "DE 2521311\n", "FL 2520236\n", "AL 2490510\n", "CO 2477765\n", "GA 2467164\n", "AZ 2464678\n", "Name: donation_amount, dtype: int64" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# create group object\n", "group = df.groupby('state')\n", "\n", "# total donations for the group\n", "group['donation_amount'].sum().sort_values(ascending=False)" ] }, { "cell_type": "markdown", "id": "ae0b205b-ffd8-44c1-8ee7-e0837ce695f8", "metadata": {}, "source": [ "# Task #2 \n", "\n", "Transform the 'donation_date' column to datetime format and extract the month and year of each donation. Then, create a new dataframe showing the total donations received each month, grouped by state." ] }, { "cell_type": "code", "execution_count": 8, "id": "4b0e2846-5e7f-45d4-a9ab-b4b184ecfa99", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "RangeIndex: 50000 entries, 0 to 49999\n", "Data columns (total 6 columns):\n", " # Column Non-Null Count Dtype \n", "--- ------ -------------- ----- \n", " 0 voter_id 50000 non-null int64 \n", " 1 state 50000 non-null object \n", " 2 age 50000 non-null int64 \n", " 3 party_affiliation 50000 non-null object \n", " 4 donation_date 50000 non-null datetime64[ns]\n", " 5 donation_amount 50000 non-null int64 \n", "dtypes: datetime64[ns](1), int64(3), object(2)\n", "memory usage: 2.3+ MB\n" ] } ], "source": [ "# convert to date object\n", "df['donation_date'] = pd.to_datetime(df['donation_date'])\n", "\n", "# check to make sure it worked\n", "df.info()" ] }, { "cell_type": "code", "execution_count": 9, "id": "fb68e0c6-b0fd-4bb8-b3af-35d113620818", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
statedonation_datedonation_amountdonation_monthdonation_year
0CO2023-12-28 02:17:33.093061864317122023
1AR2022-01-18 04:33:03.49566991385712022
2AR2022-04-25 06:51:57.80635612829642022
3GA2023-11-25 08:03:14.691893840100112023
4AR2022-06-10 13:57:48.52537050811962022
\n", "
" ], "text/plain": [ " state donation_date donation_amount donation_month \\\n", "0 CO 2023-12-28 02:17:33.093061864 317 12 \n", "1 AR 2022-01-18 04:33:03.495669913 857 1 \n", "2 AR 2022-04-25 06:51:57.806356128 296 4 \n", "3 GA 2023-11-25 08:03:14.691893840 100 11 \n", "4 AR 2022-06-10 13:57:48.525370508 119 6 \n", "\n", " donation_year \n", "0 2023 \n", "1 2022 \n", "2 2022 \n", "3 2023 \n", "4 2022 " ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# create a new dataframe\n", "df_new = df.loc[:,['state','donation_date','donation_amount']]\n", "\n", "# create new month and year columns\n", "df_new['donation_month'] = df_new['donation_date'].dt.month\n", "df_new['donation_year'] = df_new['donation_date'].dt.year\n", "\n", "df_new.head()" ] }, { "cell_type": "code", "execution_count": 10, "id": "c993c231-2c87-48d0-8070-dccdcbf27e79", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "donation_month state\n", "1 AK 227603\n", " AL 221196\n", " AR 246627\n", " AZ 214069\n", " CA 243227\n", " ... \n", "12 CO 138175\n", " CT 149352\n", " DE 144633\n", " FL 164114\n", " GA 171758\n", "Name: donation_amount, Length: 120, dtype: int64" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# create group object\n", "group = df_new.groupby(['donation_month','state'])\n", "\n", "# total donations received by group\n", "group['donation_amount'].sum()" ] }, { "cell_type": "markdown", "id": "e180edba-cb42-4fe6-b483-13f6b1a52e52", "metadata": {}, "source": [ "# Task #3 \n", "\n", "Pivot the merged dataframe to show the average donation amount by age group and state." ] }, { "cell_type": "code", "execution_count": 11, "id": "0840ad4c-160c-4139-b403-5b80ea272e6c", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "state age\n", "AK 18 568.564516\n", " 19 507.548780\n", " 20 479.083333\n", " 21 519.535714\n", " 22 491.085714\n", " ... \n", "GA 75 493.054795\n", " 76 511.250000\n", " 77 519.724638\n", " 78 505.541667\n", " 79 506.794118\n", "Name: donation_amount, Length: 620, dtype: float64" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# create group object\n", "group = df.groupby(['state','age'])\n", "\n", "# total donations received by group\n", "group['donation_amount'].mean()" ] }, { "cell_type": "markdown", "id": "968eb329-2747-408c-98ea-4ff50d5b4230", "metadata": {}, "source": [ "DNC and RNC listen up!\n", "\n", "Voters in the 45-54 age bracket give the highest donation amounts. Do you agree?" ] }, { "cell_type": "code", "execution_count": 12, "id": "31108970-36af-4a7d-9e72-b31b0eb0719a", "metadata": {}, "outputs": [ { "data": { "image/png": "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yOAwoBAREZHBYUAhIiIig8OAQkRERAaHAYWIiIgMDgMKERERGRwGFCIiIjI4SqkLaA4hBABArVZLXAkRERHdq4a/2w1/x+/EKANKaWkpAMDHx0fiSoiIiKipSktL4ejoeMdtZOJeYoyB0Wq1yM7Ohr29PWQyWau+tlqtho+PDzIyMuDg4NCqr20ITH3/ANPfR+6f8TP1feT+Gb+22kchBEpLS6FSqSCX33nKxCg7KHK5HN7e3m36Hg4ODib7Px5g+vsHmP4+cv+Mn6nvI/fP+LXFPt6tc9KAQ7JERERkcBhQiIiIyOAwoNzAysoK7733HqysrKQupU2Y+v4Bpr+P3D/jZ+r7yP0zfoawj0Y5JEtERESmjR0UIiIiMjgMKERERGRwGFCIiIjI4JhMQPntt98wbtw4qFQqyGQybN++vdHjZWVleOGFF+Dt7Q0bGxt0794dq1evvuNrpqenY+7cuQgICICNjQ0CAwPx3nvvobq6+pbbFxYWwtvbGzKZDNeuXWulPTMPS5YswX333Qd7e3u4u7vj0UcfRVJSUqNt5syZA5lM1ug2YMCAu772+PHj4evrC2tra3h5eWHWrFnIzs6+5bY8hs23evVq9OrVS79uwsCBA/G///1P/3hzj18DjUaDPn36QCaT4fTp07fchsevdS1ZsgQymQyLFi3S39fc4+jv73/T8958881bbsvj2LoWL1580/fe09NT/3hLfzbbiskElPLycvTu3RurVq265eMvv/wyfv31V3z33XdITEzEyy+/jIULF+LHH3+87WteuHABWq0WX331FRISErB06VJ8+eWX+Mtf/nLL7efOnYtevXq1yv6Ym0OHDmHBggU4fvw49uzZg9raWowePRrl5eWNthszZgxycnL0t19++eWurz1s2DB8//33SEpKwtatW3Hp0iVMnjz5ltvyGDaft7c3/vGPfyAmJgYxMTEYPnw4JkyYgISEBP02zTl+DV5//XWoVKo7bsPj13pOnjyJr7/++pbfz+Yex/fff7/R8955551bbsfj2PpCQkIafe/j4+MbPd7UYyqTyZCent6GFQMQJgiA2LZtW6P7QkJCxPvvv9/ovrCwMPHOO+806bU/+ugjERAQcNP9X3zxhRgyZIjYt2+fACCKi4ubWjZdJz8/XwAQhw4d0t83e/ZsMWHChBa/9o8//ihkMpmorq5udD+P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LcaNG4fTp083uiUnJ+OBBx5otTrt7OwafX38+HFMmzYNY8eOxc8//4y4uDi8/fbbjQZobWxs7vq6gwcPRl1dHb7//vtG9zd3v8aOHYvLly9j0aJFyM7OxogRI/Dqq682cW+J6E7YQSEycYWFhUhMTMRXX32FwYMHAwCOHDmif7xbt27YsGEDNBoNrKysAAAxMTGNXiMsLAxbt26Fv78/lMrm/do4fvz4TV8HBwfruye38vvvv8PPzw9vv/22/r7Lly832qZXr17Yt28fnnrqqdu+Tv/+/bFw4UI8+OCDUCgUeO211wDc235ZWlqirq7upvvd3NwwZ84czJkzB4MHD8Zrr72GTz755LY1EFHTsINCZOI6duwIFxcXfP3110hJScH+/fvxyiuv6B+fMWMGtFotnn32WSQmJmLXrl36P7QNnZUFCxagqKgI06dPx4kTJ5Camordu3fj6aefvuUf71vJyMjAK6+8gqSkJGzcuBErV67ESy+9dMfnBAUF4cqVK9i0aRMuXbqEFStWYNu2bY22ee+997Bx40a89957SExMRHx8PD766KObXmvgwIH43//+h/fff18/ZHsv++Xv74/o6Gikp6frT4/99a9/xY8//oiUlBQkJCTg559/Rvfu3e/p+0BE90jqIRgiant79uwR3bt3F1ZWVqJXr17i4MGDAoDYtm2bEEKI33//XfTq1UtYWlqKfv36iaioKAFAXLhwQf8aFy9eFI899phwcnISNjY2olu3bmLRokWNBl9vZ8iQIWL+/PniueeeEw4ODqJjx47izTffbPTchmHWG7322mvCxcVFdOjQQUydOlUsXbpUODo6Ntpm69atok+fPsLS0lK4urqKiRMn3vZ1Dx06JOzs7MTy5cvvab+SkpLEgAEDhI2NjQAg0tLSxN/+9jfRvXt3YWNjI5ydncWECRNEamrqXb8PRHTvZELccLKZiMzehg0b8NRTT6GkpOSeZjyIiFobZ1CICOvWrUPnzp3RqVMnnDlzBm+88QamTJnCcEJEkmFAISLk5ubir3/9K3Jzc+Hl5YXHH38cf//73+/puVeuXEGPHj1u+/j58+fh6+vbWqUSkZngKR4iapHa2lqkp6ff9vGWXPlDROaLAYWIiIgMDi8zJiIiIoPDgEJEREQGhwGFiIiIDA4DChERERkcBhQiIiIyOAwoREREZHAYUIiIiMjgMKAQERGRwfl/ztet8o7AVnsAAAAASUVORK5CYII=", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# create bins for the (18-24), (25-34), (35-44), (45-54) and (55+) categories\n", "bins = [18, 25, 34, 44, 55, float('inf')] \n", " \n", "# labels for the three categories\n", "labels = ['18-24', '25-34', '35-44', '45-54', '55+'] \n", " \n", "# bin it up!\n", "df['age_brackets'] = pd.cut(df['age'], bins=bins, labels=labels, include_lowest=True)\n", " \n", "# plot it!\n", "df.groupby('age_brackets', observed=True)['donation_amount'].median().plot();" ] }, { "cell_type": "markdown", "id": "6c2d927d-5689-49a7-ad9a-a4cf6afdec5b", "metadata": {}, "source": [ "# Summary \n", "\n", "This tutorial focused on analyzing voter demographics and donation data to assist in election strategies. Using Pandas, various tasks were performed to uncover trends in voter donations across different states, age groups, and time periods.\n", "\n", "### Key Takeaways:\n", "- Learned how to merge two DataFrames (voter demographics and donations) on a common column (voter_id).\n", "- Calculated total donations received by each state using the `.groupby()` and `.sum()` functions.\n", "- Transformed the donation_date column from string to datetime format.\n", "- Extracted month and year from the donation_date for further analysis.\n", "- Visualized the median donation amounts per age bracket, discovering that the 45-54 age group contributed the most." ] }, { "cell_type": "markdown", "id": "4175976f-1e6c-4c44-815b-194b3f1b3b90", "metadata": {}, "source": [ "

This tutorial was created by HEDARO

" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.11.7" } }, "nbformat": 4, "nbformat_minor": 5 }