{ "cells": [ { "cell_type": "markdown", "id": "e5a2a6bc", "metadata": {}, "source": [ "# Tutorial exercises I\n", "\n", "You should work through this is the tutorial. The idea is to bring together the skills you have learned (and highlight any gaps to discuss with your tutor)" ] }, { "cell_type": "markdown", "id": "75e93be0", "metadata": {}, "source": [ "## Car park exercise\n", "\n", "In this exercise, you will plan car parking at a ferry terminal and inside the ferry itself. \n", "\n", "You will be given data about the lengths of vehicles in a .csv file. By plotting the data and calculating descriptive statististics, you will produce a short report recommending the size and number of parking spots required." ] }, { "cell_type": "markdown", "id": "abc9bef7", "metadata": {}, "source": [ "
\n", " \n", "

The brief:

\n", "\n", "The SpeedyFerry Company are planning a new terminal. Vehicles will arrive at the terminal in advance of their sailing time and be parked in a car park to await boarding.\n", "\n", "SpeedyFerry would like to know how to mark out the car park. They want to fit as many parking spaces into their land as possible, whilst still making sure that the vehicles fit in the spaces\n", " \n", " \n", "Your task is to produce a report answering these questions, justifying you answer with plots and descriptive statistics based on the sample data provided by SpeedyFerry, introduced below\n", "
\n", "\n", "\"Picture" ] }, { "cell_type": "markdown", "id": "554bd33b", "metadata": {}, "source": [ "### Set up Python libraries\n", "\n", "As usual, run the code cell below to import the relevant Python libraries" ] }, { "cell_type": "code", "execution_count": 6, "id": "6e215164", "metadata": {}, "outputs": [], "source": [ "# Set-up Python libraries - you need to run this but you don't need to change it\n", "import numpy as np\n", "import matplotlib.pyplot as plt\n", "import scipy.stats as stats\n", "import pandas \n", "import seaborn as sns\n", "sns.set_theme()" ] }, { "cell_type": "markdown", "id": "7fe15a08", "metadata": {}, "source": [ "### Load and view the data\n", "\n", "To make our plan for car parking, we need some information about the vehicles to be accommodated.\n", "\n", "SpeedyFerry have provided a data file with a complete list of the vehicles parked at a vehicle-ferry terminal at 1pm on Sunday 24th April 2022, which they regard as a representative sample.\n", "\n", "Let's load the datafile \"data/vehicles.csv\" and have a look what information we have in the dataset" ] }, { "cell_type": "code", "execution_count": 11, "id": "71268ed1", "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", " \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", "
lengthheightwidthtype
03.91871.53201.8030car
14.64861.59361.6463car
23.57851.54471.7140car
33.55631.55491.7331car
44.03211.50691.7320car
...............
135915.50004.20652.5112truck
136014.49604.19652.5166truck
13619999.00004.19642.4757truck
136214.37004.20092.5047truck
136314.23504.20162.5212truck
\n", "

1364 rows × 4 columns

\n", "
" ], "text/plain": [ " length height width type\n", "0 3.9187 1.5320 1.8030 car\n", "1 4.6486 1.5936 1.6463 car\n", "2 3.5785 1.5447 1.7140 car\n", "3 3.5563 1.5549 1.7331 car\n", "4 4.0321 1.5069 1.7320 car\n", "... ... ... ... ...\n", "1359 15.5000 4.2065 2.5112 truck\n", "1360 14.4960 4.1965 2.5166 truck\n", "1361 9999.0000 4.1964 2.4757 truck\n", "1362 14.3700 4.2009 2.5047 truck\n", "1363 14.2350 4.2016 2.5212 truck\n", "\n", "[1364 rows x 4 columns]" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "vehicles = pandas.read_csv('https://raw.githubusercontent.com/jillxoreilly/StatsCourseBook/main/data/vehicles_2.csv')\n", "display(vehicles)" ] }, { "cell_type": "markdown", "id": "cb03e0d0", "metadata": {}, "source": [ "That was a long list of vehicles!\n", "\n", "* What information do we have about each vehicle?" ] }, { "cell_type": "markdown", "id": "96aa6d60", "metadata": {}, "source": [ "### Data cleaning\n", "\n", "Some implausible vehicle lengths are in the sample. They must be data entry errors.\n", "\n", "Find them and replace them with NaNs." ] }, { "cell_type": "code", "execution_count": 22, "id": "bb22298b", "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", " \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", "
lengthheightwidthtype
10229999.00002.90102.2571towing
13619999.00004.19642.4757truck
11219999.00003.88342.4869truck
10939999.00003.91732.5168truck
100894.72302.88832.2566towing
...............
63.21691.57081.7401car
4693.19571.53721.7438car
8113.16821.58881.7338car
5123.11971.49321.7817car
6533.11091.55121.7912car
\n", "

1364 rows × 4 columns

\n", "
" ], "text/plain": [ " length height width type\n", "1022 9999.0000 2.9010 2.2571 towing\n", "1361 9999.0000 4.1964 2.4757 truck\n", "1121 9999.0000 3.8834 2.4869 truck\n", "1093 9999.0000 3.9173 2.5168 truck\n", "1008 94.7230 2.8883 2.2566 towing\n", "... ... ... ... ...\n", "6 3.2169 1.5708 1.7401 car\n", "469 3.1957 1.5372 1.7438 car\n", "811 3.1682 1.5888 1.7338 car\n", "512 3.1197 1.4932 1.7817 car\n", "653 3.1109 1.5512 1.7912 car\n", "\n", "[1364 rows x 4 columns]" ] }, "execution_count": 22, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# your code here to find the long vehicles\n", "\n", "vehicles.sort_values(by='length', ascending=False)\n", "\n", "\n", "# replace the incorrect vehicle lengths with NaNs\n", "# vehicles.loc(.....)=np.nan" ] }, { "cell_type": "markdown", "id": "7bfb01b7", "metadata": {}, "source": [ "# Your report for SpeedyFerry" ] }, { "cell_type": "markdown", "id": "c597c8d9", "metadata": {}, "source": [ "
\n", " \n", "This is a stub for your report to SpeedyFerry. \n", "\n", "The text in each markdown cell is given to guide you. You will replace this with your own text.\n", "\n", "Similarly, you will edit the code in each code cell to produce the necessary plots and statistics.\n", "\n", "This stub is quite structured to guide you through the process. Later in the course, you will develop your reports with less structured guidance.\n", " \n", "
" ] }, { "cell_type": "code", "execution_count": null, "id": "9d717d77", "metadata": {}, "outputs": [], "source": [ "# load the data\n", "vehicles = ### your code here to load the csv file\n", "\n", "# replace bad values with NaNs\n" ] }, { "cell_type": "markdown", "id": "24dd61a6", "metadata": {}, "source": [ "## Description of vehicle types and sizes\n", "\n", "Based on the sample data recorded at 1pm on Sunday 24th April 2022, the vehicles to be accommodated fall into XXX categories:\n", "* cars\n", "* xxx\n", "* xxx\n", "\n", "The majority of vehicles are cars." ] }, { "cell_type": "code", "execution_count": 18, "id": "c5d6e063", "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", " \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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
lengthheightwidth
countmeanstdmin25%50%75%maxcountmean...75%maxcountmeanstdmin25%50%75%max
type
car981.04.2698011.6834563.11093.818104.12164.5202045.438981.01.580810...1.61191.8993981.01.7919250.0469211.62411.76021.790401.820901.9580
towing53.0198.7860941372.1017397.25618.132308.70129.234709999.00053.02.897838...2.90642.944553.02.2483260.0082222.22922.24422.247902.254002.2642
truck330.0104.695470949.14261011.148012.5772514.400515.083259999.000330.04.072725...4.20094.2137330.02.5013040.0158712.46292.48982.501452.511552.5467
\n", "

3 rows × 24 columns

\n", "
" ], "text/plain": [ " length \\\n", " count mean std min 25% 50% 75% \n", "type \n", "car 981.0 4.269801 1.683456 3.1109 3.81810 4.1216 4.52020 \n", "towing 53.0 198.786094 1372.101739 7.2561 8.13230 8.7012 9.23470 \n", "truck 330.0 104.695470 949.142610 11.1480 12.57725 14.4005 15.08325 \n", "\n", " height ... width \\\n", " max count mean ... 75% max count mean \n", "type ... \n", "car 45.438 981.0 1.580810 ... 1.6119 1.8993 981.0 1.791925 \n", "towing 9999.000 53.0 2.897838 ... 2.9064 2.9445 53.0 2.248326 \n", "truck 9999.000 330.0 4.072725 ... 4.2009 4.2137 330.0 2.501304 \n", "\n", " \n", " std min 25% 50% 75% max \n", "type \n", "car 0.046921 1.6241 1.7602 1.79040 1.82090 1.9580 \n", "towing 0.008222 2.2292 2.2442 2.24790 2.25400 2.2642 \n", "truck 0.015871 2.4629 2.4898 2.50145 2.51155 2.5467 \n", "\n", "[3 rows x 24 columns]" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# your code to count vehicles by type - \n", "# hint use groupby() and describe(), or use value_counts()\n", "vehicles.groupby(['type']).describe()" ] }, { "cell_type": "markdown", "id": "2eac220f", "metadata": {}, "source": [ "The length and width of vehicles differs substantially between classes" ] }, { "cell_type": "code", "execution_count": 55, "id": "e4064664", "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYcAAAEJCAYAAAB/pOvWAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/MnkTPAAAACXBIWXMAAAsTAAALEwEAmpwYAAA1yUlEQVR4nO3de1xUdf748dfcGFBQUYc0M+unlmalpFuSJdl+RQoQJSq11Ypvhq2XzVpKgXS1QjNak0x3a83WLluspZhrWKtlW2gWWxKuuVbiDeMiCA4yA8Oc3x98nYRBGC4zcwbfz8fDx4NzmXPe53je855z+3w0iqIoCCGEEOfRejsAIYQQ6iPFQQghhBMpDkIIIZxIcRBCCOFEioMQQggnUhyEEEI40btz4atWrWL79u1oNBri4+N58MEHWbhwIbm5uQQEBAAwZ84cxo8fz4EDB0hJSaGqqopRo0axZMkS9Hq3hieEEOIC3Pbtu3fvXvbs2cOWLVuw2WzceeedhIeHk5+fz5tvvklISEiD+ZOSknjmmWcYMWIEycnJZGZmMm3aNJfXV15ehd3e8JWNXr0COXXK3CHb09HUHBuoOz5XYtNqNQQHd/VQRL7B13KkKb4Ur9pjbSlH3FYcbrzxRjZs2IBer6eoqIi6ujr8/f0pLCwkOTmZoqIixo8fz5w5czh58iQWi4URI0YAEBcXR0ZGRquKg92uOB3458arlZpjA3XHp+bY1MoXc6QpvhSvL8XamFvvORgMBjIyMoiKiiIsLAybzcbo0aNJS0sjMzOTr7/+mo0bN1JcXIzJZHJ8zmQyUVRU5M7QhBBCNMPtF/XnzZvHzJkzmTVrFrt37+bll192TJs+fTqbN29m4MCBaDQax3hFURoMu6JXr8Amx5tMQW0L3APUHBuoOz41xyZEZ+C24vDjjz9SU1PD0KFDCQgIICIigm3bttGjRw8mTJgA1BcBvV5Pnz59KCkpcXy2tLTU6Z5ES06dMjudwplMQZSUnGn/xrhBa2NTFIXy8hJqaiyA+09VtVotdrvd7etpi19i0+Dn509wsMnpx4RWq7ngDwbROXk6R1pSXKyGHLpwjrTEbcXh+PHjZGRk8Le//Q2AHTt28Ktf/Yq0tDRGjx5Nly5dePfdd5k8eTL9+vXDaDSSm5vLyJEjycrKYuzYse4KzSeZzRVoNBouueQyNBr3P4Gs12ux2bx9YDftXGyKYuf06VLM5gqCgnp4OyzhZZ7OkZaoIYfakyNuKw7h4eHk5eUxadIkdDodERERzJkzh+DgYKZOnYrNZiMiIoLo6GgA0tPTSU1NxWw2M2zYMGbMmOGu0HxSdbWZnj0vUcVBrxYajZagoGDKyoqkOAjJkSa0J0c0naXJ7s5+Wennn49wySWXt/rUsK3U8KvnQs6PTVEUioqO0qfPgAbzyGUlZ76WI01pLl5P50hL1JJDbc0RecusA+n1DX+xdPSBoZaDXk1kn4jzyfHgrK37RM6/OoheryX/cBmf7Svks32F5B8ucyoWvmD+/NmcPn3a22EIH9K9exd69w5s9l/37l28HWaHuJjyQ84cOlBZpYXisrPeDqNdvvrqS2+HIHyMwaDlL5vymp3nocnXeyga97qY8kOKg3BIS1sCQGzsBOrq6vjss71otVosFgvx8TG88UYmM2fO4H/+ZwJfffUlZvMZpkz5DZMnxwPw+eef8de/rsNmq8Xf35/Zsx/l2ms7x5eCEK3Nj6qqM9x7r+/mh+9d9xBuk5y8GICsrO0MHnwVX36ZA8A//7mdkSN/RXBwMACVlRX85S8beOmlP7Nu3Z/48ccfOHbsKK+88jLp6atYv/5tkpJSSElJorq62mvbI0RHOj8/Bg1qOT/WrHnVp/NDzhxEk+666x62bNlMWNgtZGW9z+zZv3NMi4u7B41GQ0jIJdx0Uxh79+7BaDRy6lQpv/vdbx3zaTRajh8/xuDBV3ljE4Rwm7i4uzt9fkhxEE2KjLyDP/1pNf/+99dUV1czYsQNjmk6nc7xt92uoNNpsdvrGDnyRpYuXeaYVlT0M717mxCis4mIuINXXnm5U+eHXFZyE61Gg06nRa//5Z8v0Ol02Gw2/P0DiIi4g2XLljJpUlyDebKz/wHAzz//zFdf7WH06JsZOfJG9u7dw5EjBQDs3v05998/FavV6ulNEMJtfskPfxfy46RP54ecObhJ9yAjeT+e4lRF/TXFnt38ufbKnqp4KaY5t932a+bMeZjnnkvnzjsnsmXLJiIjoxvMc/JkIQkJv6Gmxsrvfvd7Lr/8CgCeeCKFxYuTURQFnU7Hc8/9kS5dOscjjELAL/mRlrai0+eHFAc3KvfBR1uXLEkDQKfT8Prr64mMjCIwsOFblNOmTWfIkGucPnv77f/D7bf/j0fiFMIbzuWHoii8+eZfm82Pxm9I+1p+SHEQTYqLi6FXr94sW/aCt0MRQnXuuSe20+eHFAfRpE2btjZ5CWzjxg+8EI0Q6vL3v29pcnxnyg/fuEsqhBDCo6Q4CCGEcCLFQQghhBMpDkIIIZxIcRBCCOFEnlbyUd17dMHPoGt5xlaqqa2j4rRvvZshRFMkR9pHioOP8jPoePX9fR2+3Jlxwzt8mUJ4g+RI+0hxEK2mKApr177EZ599il6vY+LEOAYPvopXXlmD1WrhzBkz8+bN59Zbb+PZZ/9ARUUFJ04c45FH5nHLLWO9Hb4QbqcoCqtXr+LTTz/x2RyR4iBa7ZNPdvDdd/vYsOEdbDYbv/3tQ3Tv3oMFC55iwIAryM39ilWr0rn11tsA6N69OytWrPRu0EJ40Cef7CAvz7dzRIqDaLVvv83l9tvH4+fnh5+fH6+//jZWq5WcnH/xySf/ZP/+7xp0YnLNNdd6MVohPO/bb3P59a99O0fc+rTSqlWruPPOO4mKimL9+vUA5OTkEBMTQ0REBCtX/lIpDxw4QFxcHBMmTCAlJQWbzebO0EQ76PV6NJpfhk+eLGT27JkcOLCfq68ewowZCSiK4phuNBq9EKVvmD59OlFRUcTGxhIbG8u+ffskRzqB+hz5JUl8MUfcVhz27t3Lnj172LJlC++99x5vvPEG33//PcnJyaxZs4Zt27aRn5/Prl27AEhKSmLRokVs374dRVHIzMx0V2iinYYPv4FPP92JzWbDYrEwf/4cfvrpR/73f2cxevQY/vWvXdjt6m6aXA0URaGgoICsrCzHv6uvvlpypBMYPvwGPvlkh0/niNsuK914441s2LABvV5PUVERdXV1VFZWMmDAAPr37w9ATEwM2dnZDBo0CIvFwogRIwCIi4sjIyODadOmuSs8n1dTW+eWpyZqautanCc8fBzff/8fEhLuw25XuPfeaRw/fpTp0+9Br9dzww2/wmKxqLp/XDX46aefAEhISOD06dPcc889XHXVVZIjHcTbOfLf/x7w6Rxx6z0Hg8FARkYGr732GpGRkRQXF2My/dItXkhICEVFRU7jTSYTRUVF7gzN53n7OevExNkkJs5uMG7u3Mccf//+9wsASEn5gyfD8imVlZWEhYXx1FNPUVtby4wZM3jooYfcliO9egU2Od5kCmrbBvwfRVHo2rXlyyLtXU9LyykubtjjYpXZQlWHrNGZKz07PvLIHB55ZE6DcfPn/97x94IFyQAsXry0Y4NrglarbfX+d/sN6Xnz5jFz5kxmzZpFQUFBg+twiqKg0Wiw2+1Njm8Ndx34rRHgb3AkidFPj9FY5xgO8DcQHNy1zbE1PvA9Qc1dm54fW1sOfDUIDQ0lNDTUMRwfH09GRgYjR450jOvIHDl1yozdrjQYZzIFUVJypo1bUK9370Cqqlru7rK964Hm47Xb7arqabFxZz/eZLfbnfabVqu54PcmuLE4/Pjjj9TU1DB06FACAgKIiIggOzu7QefbJSUlhISE0KdPH0pKShzjS0tLCQkJadX63HXgu0qv11JtqXUkibXGhtVqcwx3NeooL69yHCytjc3TB76aDuzGGsfWlgNfDb7++mtqa2sJCwsD6r/w+/Xr1yAXOjJHhGgNt/00PH78OKmpqdTU1FBTU8OOHTuYMmUKhw8f5siRI9TV1bF161bGjh1Lv379MBqN5ObmApCVlcXYsep4EUQIdzlz5gwrVqzAarViNpvZtGkTjz32mOSIUAW3nTmEh4eTl5fHpEmT0Ol0REREEBUVRc+ePZk7dy5Wq5Xw8HAiIyMBSE9PJzU1FbPZzLBhw5gxY4a7QhNCFcaNG8e+ffuYNGkSdrudadOmERoayvLlyyVHhNdplPMftvVharis9Nm+QorL6m8UX31FTyrOWPn5VP0tsZCeXRg7/NI2X1b6+ecj9OkzoOMDvwBfuqzU1L7xhctKnubOew5/2ZTX7DwPTb6e0lJzu9YDzcfr6RxpiZpyqC05ot47jkIIIbxGms/wUT17+KMzGDp8uXW1tZSdtjQ7j9ls5tln/8CyZeltXs8DD0zj9dffbvPnhWiJt3Nk2bIlPPvs821ej7dzRIqDj9IZDBz/cEOHL/eyO2YAzR/4Z85UcujQwXatRwqDcDdv58jBg9+3az3ezhEpDqLVXnzxeUpLS1i48PfccstY3nnnTTQaDVdfPZT585/gz39ezRVX/D8mT44nK+t9MjPf5q23NmKz2bjnnlgyM7O47bbRfP7516xb92dKS0s4duwoRUU/Ex0dy/33/y82m43nn08jL+9bTKYQNBoN99//v9xwwyhvb74QLeoMOSL3HESrPfpoEr17m3jooVls2PAaq1e/woYN7+LvH8D69a8SFnYLubl7Afj3v7+isrKSsrJT5OV9y7XXXo9e3/A3yQ8/HGLlypd55ZXXefPNv3LmzBk2b96IxVLN22+/R3LyYg4c+I83NlWINukMOSLFQbTZt9/mMmbMrXTv3gOAiRMnk5u7l9DQkfznP/upq6vjyJEj/PrXEXz77Tfs2fMFN998i9NybrhhFAaDgeDgnnTr1o2qKjNfffUl48ffgUajoU+fvowc+SsPb50Q7efLOSLFQbRZ48ciQaGurg6j0cigQVfx0UcfMmDAAEJDR/Ltt7ns3fslo0ePcVqOn5+f42+NRoOiKGi1OhRFHY8BCtFWvpwjUhxEq+l0Ourq6ggNHcnnn39GZWUFAFu2bCY0tP565803j+H11/9CaOhIx3wBAQH06NHDpXWMGnUj//znRyiKQmlpCd98k9vqtoSE8JbOkCNyQ1q0Ws+evbjkkj6sWpXO9OkPMmfOw9hsNq6+eihJSQsBCAu7hfT05YSGjqJbt2706BHc5OnyhcTGxvHDD4eYMeNeevXqTZ8+fVXZIYoQTenZsxd9+vh2jsgb0h3E029Iu/sZbm+/3ZmT8zmKojBmzK2YzWYefPA+1q3bQLdu3eUN6Ta62N6Q9uZ7DuD+N6Sby5HG2pIjcubgo+oPzpYPUF91xRVX8vTTi3j11bUAPPRQYpMHvRAXIjnSPlIchCpdemk/1q5d5+0whFAtd+eI3JAWQgjhRIqDEEIIJ1IchBBCOJHiIIQQwokUByGEEE7kaSUf1SM4AIO+4//7am02TpdXNztPR/TnADBnzsMkJDwsLa0Kt/B2jrS3Pwfwbo5IcfBRBr2e1798r8OX+8BNd7U4T0f05yCEu3k7R9rbn4O3SXEQrXZ+W/VHjhyme/ceGI1GIiLu4JtvcklJ+QPwy6+e0NCRrF37Ep999il6vY6JE+O4556pjuWVl5cxb94sHn74t9x6623e2SghOlBnyBG55yBa7Vxb9fPmPcbRo0dYtOhpXnxxzQXn/+STHXz33T42bHiHV175K9u2fcCpU6UAVFWZSUp6lISEh6UwiE6jM+SIW88cVq9ezYcffghAeHg4TzzxBAsXLiQ3N5eAgAAA5syZw/jx4zlw4AApKSlUVVUxatQolixZ4tThhVCf4OCe9O17abPzfPttLrffPh4/Pz/8/PwadH/4/PPL6NmzF+Hht7s7VCG8wldzxG1nDjk5OXz++eds2rSJzZs3s3//fj7++GPy8/N58803ycrKIisri/HjxwOQlJTEokWL2L59O4qikJmZ6a7QRAc6vxXIc+3Mn1NXZwNAr9dzfkvCJ08WUl1df0Pvvvtm0KNHDzZt2uiZgIXwMF/NEbcVB5PJxIIFC/Dz88NgMDBw4EAKCwspLCwkOTmZmJgYMjIysNvtnDhxAovFwogRIwCIi4sjOzvbXaGJdjrXVn1j3bv34MiRwyiKQmHhCX744QcAhg+/gU8/3YnNZsNisfD443MpKSkGYPDgq3n88QWsX/+qY5wQvq4z5IjbrtsMHjzY8XdBQQEffvghb731Fnv37mXx4sUEBQWRmJjIxo0bGTx4MCaTyTG/yWSiqKjIXaF1CrU2m0tPTbRluS05159DWtqSBuNHjbqRf/wji6lT72LAgAFcf/0IAMLDx/H99/8hIeE+7HaFu++eyuWX/9J8cP/+lxMXdzd//OOKdj8eK8Q53s6RPn18O0fc3p/DoUOHSExMZO7cuUyePLnBtI8//pjNmzeTkJDACy+8wNtv119nKygoYNasWT539vDRngJKK+qbCB7YrzsVZqtjuHd3fyJGX9HmZe/f/x8uvXRAyzNehAoLjzBs2DXeDkP1Lrb+HLzN232inE91/Tnk5uYyb948kpOTiYqK4uDBgxQUFDBhwgQAFEVBr9fTp08fSkpKHJ8rLS0lJCSkVetSQ2c/1ZZaqqqsAFhrbFitNsdwV6OO8vKqNnf2Y7fbPXqgqenAbqxxbHa73WlfSmc/QrSP2+45nDx5ktmzZ5Oenk5UVBRQXwzS0tKoqKigtraWd999l/Hjx9OvXz+MRiO5ubkAZGVlMXbsWHeFJoSqPPfccyxYsACof5AjJiaGiIgIVq5c6ZjnwIEDxMXFMWHCBFJSUrC5cGlDiPZwW3FYt24dVquV5cuXExsbS2xsLN988w0PP/wwU6dOJSoqiqFDhxIdHQ1Aeno6y5YtIzIykrNnzzJjxgx3hSaEauzevZtNmzYBYLFYSE5OZs2aNWzbto38/Hx27doFyNN8wvPcdlkpNTWV1NTUJqfdd999TuOGDBnCxo3yOGNzFEVBc/7zbgJf7gL99OnTrFy5klmzZvH999+Tl5fHgAED6N+/PwAxMTFkZ2czaNAgp6f5MjIymDZtmhejVyfJEWdtzRF5Q9pH6PV+VFVV+vSXYUdTFIWqqkr0ej9vh9ImixYtYv78+XTr1g2A4uLiBk/thYSEUFRU5DRenuZrmuSIs/bkiLyC7COCg02Ul5dgNp/2yPq0Wi12uzpvSJ8fm17vR3CwqYVPqM/f//53+vbtS1hYGO+//z5Qf2P9/F+9534FX2h8a13oBr3JFNTqZZ1PURS6djW2OF9719PScnr08OfYsWOUlBzvkPV0FgEB/gwadCUGg6FVn5Pi4CN0Oj29e/f12Po8+aRXa6k5Nldt27aNkpISYmNjqaio4OzZs5w4cQKdTueYp6SkhJCQkA55mg/c+yjruafymtMR/2ctxRsUZCKoY2pQu6npOD192gJYGozz6qOsQoimrV+/3vH3+++/z969e1myZAkREREcOXKEyy67jK1bt3LXXXc1eJpv5MiR8jSf8AgpDkKohNFoZPny5cydOxer1Up4eDiRkZFA/dN8qampmM1mhg0b5nNP89XZFXr3bv69k9paOxUVZz0UkWiJFAchvCwuLo64uDgAwsLC2LJli9M8vv40n06rcektaqEe8rSSEEIIJ1IchBBCOJHiIIQQwokUByGEEE6kOAghhHAixUEIIYQTKQ5CCCGcSHEQQgjhRIqDEEIIJ1IchBBCOJHiIIQQwokUByGEEE6kOAghhHAixUEIIYQTKQ5CCCGcSHEQQgjhxK3FYfXq1URFRREVFcWKFSsAyMnJISYmhoiICFauXOmY98CBA8TFxTFhwgRSUlKw2WzuDE0IIUQz3FYccnJy+Pzzz9m0aRObN29m//79bN26leTkZNasWcO2bdvIz89n165dACQlJbFo0SK2b9+OoihkZma6KzQhhBAtcFtxMJlMLFiwAD8/PwwGAwMHDqSgoIABAwbQv39/9Ho9MTExZGdnc+LECSwWCyNGjADqu03Mzs52V2hCCCFa4FIf0snJyaSlpTUYN2/ePDIyMi74mcGDBzv+Ligo4MMPP+Q3v/kNJpPJMT4kJISioiKKi4sbjDeZTBQVFbm8EQC9ejXdebnJFNSq5bRHgL+Brl2NABj99BiNdY7hAH8DwcFdvRZbW6g5PrXF1pYcEULNmi0OixcvpqioiNzcXMrKyhzjbTYbx44dc2kFhw4dIjExkSeeeAKdTkdBQYFjmqIoaDQa7HY7Go3GaXxrnDplxm5XGowzmYIoKTnTquW0lV6vpdpSS1WVFQBrjQ2r1eYY7mrUUV5ehc1m93hsbaHm+FyJTavVXPAHQ0fqiBwRQo2aLQ7x8fEcOnSIgwcPMmHCBMd4nU7nuATUnNzcXObNm0dycjJRUVHs3buXkpISx/SSkhJCQkLo06dPg/GlpaWEhIS0YXOE8Kz25ogQatVscbjuuuu47rrruPnmm+nTp0+rFnzy5Elmz57NypUrCQsLA2D48OEcPnyYI0eOcNlll7F161buuusu+vXrh9FoJDc3l5EjR5KVlcXYsWPbvlVCeEh7ckQINXPpnsPJkydJSkqioqICRfnl0s0HH3xwwc+sW7cOq9XK8uXLHeOmTJnC8uXLmTt3LlarlfDwcCIjIwFIT08nNTUVs9nMsGHDmDFjRlu3SQiPa0uOCKFmLhWHRYsWERcXxzXXXOPyvYDU1FRSU1ObnLZlyxancUOGDGHjxo0uLVsItWlLjgihZi4VB71ez4MPPujuWITwWZIjorNx6T2HwYMHc/DgQXfHIoTPkhwRnY1LZw7Hjh3jrrvu4tJLL8VoNDrGy/VUIepJjojOxqXiMH/+fHfHIYRPa2uOrFq1iu3bt6PRaIiPj+fBBx8kJyeHZcuWYbVaueOOOxzLPnDgACkpKVRVVTFq1CiWLFmCXu9SCgvRai4dWVdddZW74xDCp7UlR/bu3cuePXvYsmULNpuNO++8k7CwMJKTk3njjTfo27cviYmJ7Nq1i/DwcJKSknjmmWcYMWIEycnJZGZmMm3aNDdsjRAuFofRo0ej0WgavLlsMpn47LPP3BqcEL6iLTly4403smHDBvR6PUVFRdTV1VFZWelofwxwtD82aNAgp/bHMjIypDgIt3GpOHz//feOv2tqati6dSuHDx92W1CdkVajQaeT7jM6q7bmiMFgICMjg9dee43IyEindsZ8of0xRVEcbYg1x5V5XIlFbe1qNceXYm2s1Rcs/fz8iIuLIy4ujscff9wdMXVK3YOM5P14ilMV1fTs5s+tjRrhE51Ha3Nk3rx5zJw5k1mzZlFQUNBkO2Nqbn+sd+9ARxtizXFlnpZiUXObX42pPdaW2h9zqTicPn3a8beiKOTn51NZWdnu4C425ZUWisvOejsM4QZtyZEff/yRmpoahg4dSkBAABEREWRnZ6PT6RzzSPtjwltafc8BoFevXqSkpLg1MCF8SVty5Pjx42RkZPC3v/0NgB07djBlyhRWrFgh7Y8Jr2v1PQchhLO25Eh4eDh5eXlMmjQJnU5HREQEUVFR9OzZU9ofE17nUnGw2+2sW7eOzz77DJvNxpgxY5g1a5Y8Yy3E/2lrjsydO5e5c+c2GBcWFibtjwmvc+nxmRdeeIE9e/Zw//338+CDD/LNN9+wYsUKd8cmhM+QHBGdjUs//f/1r3/x3nvvYTAYALjtttuYOHEiycnJbg1OCF8hOSI6G5fOHBRFcRz0UP+o3vnDQlzsJEdEZ+NScRgyZAhpaWkcPXqUY8eOkZaWJk1qCHEeyRHR2bhUHBYvXkxlZSVTpkzh7rvvpry8nKeeesrdsQnhMyRHRGfTbHGoqanhySefZPfu3SxfvpycnByuv/56dDodgYEXfrNOiIuF5IjorJotDhkZGZjNZm644QbHuKeffprKykpeeukltwcnhNpJjojOqtni8Omnn/LCCy/Qq1cvx7hLLrmEFStW8M9//tPtwQmhdpIjorNqtjgYDAb8/f2dxgcGBuLn5+e2oITwFZIjorNqtjhotVrMZrPTeLPZjM1ma3HhZrOZ6Ohojh8/DsDChQuJiIggNjaW2NhYPv74Y6C+h6u4uDgmTJhASkqKS8sWQg3amyNCqFWzxSE6OprU1FTOnv2lJdGzZ8+SmppKREREswvet28fU6dOpaCgwDEuPz+fN998k6ysLLKyshg/fjwASUlJLFq0iO3bt6MoCpmZme3YJCE8pz05IoSaNVsc7r//foKCghgzZgz33HMP8fHxjBkzhm7dujF79uxmF5yZmcnixYsdzQpXV1dTWFhIcnIyMTExZGRkYLfbOXHihFMPV9nZ2R2zdUK4WXtyRAg1a7b5DK1Wy9NPP82sWbPYv38/Wq2W66+/3qV25J999tkGw6WlpYwePZrFixcTFBREYmIiGzduZPDgwe3u4UoIb2lPjgihZi61rdSvXz/69evXrhX179+fl19+2TE8ffp0Nm/ezMCBA9vdwxW4rwvE1gjwNzi6QjT66TEa65ocDvA3eDy2tlBzfGqLrSNyRAg18Vib2wcPHqSgoIAJEyYA9UVAr9d3WA9X7uoC0VV6vZZqS62jK0RrjQ2r1dbkcFdjfU9fau5CUM1dHLoSW0tdIAohmuexHu8VRSEtLY2Kigpqa2t59913GT9+fIMergDp4UoIIVTAY2cOQ4YM4eGHH2bq1KnYbDYiIiKIjo4GpIcrIYRQG7cXh507dzr+vu+++7jvvvuc5pEeroQQQl08dllJCCGE75DiIIQQwokUByGEEE6kOAghhHAixUEIIYQTKQ5CCCGcSHEQQgjhRIqDEEIIJ1IchBBCOJHiIISXrF69mqioKKKiolixYgUAOTk5xMTEEBERwcqVKx3zSm+JwtOkOAjhBTk5OXz++eds2rSJzZs3s3//frZu3UpycjJr1qxh27Zt5Ofns2vXLkB6SxSeJ8VBCC8wmUwsWLAAPz8/DAYDAwcOpKCggAEDBtC/f3/0ej0xMTFkZ2dLb4nCK6Q4COEFgwcPdnzZFxQU8OGHH6LRaBr0ihgSEkJRURHFxcXSW6LwOI812S2EcHbo0CESExN54okn0Ol0FBQUOKad6xXRbrerurdERVEcPR42x5V5XIlFbb0ANseXYm1MioMQXpKbm8u8efNITk4mKiqKvXv3NugVsaSkhJCQENX3lti7d6Cjx8PmuDJPS7GouYfCxtQea0u9JcplJSG84OTJk8yePZv09HSioqIAGD58OIcPH+bIkSPU1dWxdetWxo4dK70lCq+QMwchvGDdunVYrVaWL1/uGDdlyhSWL1/O3LlzsVqthIeHExkZCUhvicLzpDgI4QWpqamkpqY2OW3Lli1O46S3ROFpcllJCCGEEykOQgghnEhxEEII4USKgxBCCCduLQ5ms5no6GiOHz8OSKNiQoiLR529jt69A5v9172Hv7fDvCC3Pa20b98+UlNTHW98WiwWkpOTeeONN+jbty+JiYns2rWL8PBwkpKSeOaZZxgxYgTJyclkZmYybdo0d4UmhBBup9Vo+eve95ud5/4b4zwUTeu57cwhMzOTxYsXO97kzMvLk0bFhBDCR7jtzOHZZ59tMNy48bCOblTMXe3GtEaAv8HRfozRT4/RWNfkcIC/weOxtYWa41NzbEJ0Bh57Ce5CjYd1VKNi7mo3xlV6vZZqS62j/RhrjQ2r1dbkcFejDmi5HRlvUnO7MK7E1lK7MUKI5nnsaaXGjYd1dKNiQgghOo7HioM0KiaEEL7DY5eVjEajNComhBA+wu3FYefOnY6/w8LCpFExIYTP697DH4O+c7db2rm3Tggh3MCg1/v0OwyukOYzhBBCOJHiIIQQwokUByGEEE6kOAghhHAixUEIIYQTKQ5CCCGcSHEQQgjhRIqDEEIIJ1IchBBCOJHiIIQQwokUByGEEE6kOAghhHAixUEIIYQTKQ5CCCGcSHEQwovMZjPR0dEcP34cgJycHGJiYoiIiGDlypWO+Q4cOEBcXBwTJkwgJSUFm83mrZDFRUKKg1A9vV7b4F9nsW/fPqZOnUpBQQEAFouF5ORk1qxZw7Zt28jPz2fXrl0AJCUlsWjRIrZv346iKGRmZnoxcnEx6DyZJjolvV7LgfKD5BTuJadwL9+X/9cx3teLRWZmJosXLyYkJASAvLw8BgwYQP/+/dHr9cTExJCdnc2JEyewWCyMGDECgLi4OLKzs70YubgYSE9wXqDVaAAafLHZbHZvhaN65dUVlJjLAOgR0I2vT+RRdPoUAMEB3RkafLVP7r9nn322wXBxcTEmk8kxHBISQlFRkdN4k8lEUVGRx+IUFycpDu1w/pe7Tuf6L9juQUa+3H+Sn0vMAPTs5s+1V/b0yS84b6iwVDqKBQDB3oulI9ntdjT/98MBQFEUNBrNBce3Vq9egU2ON5mCWh/seRRFoWtXY4vzuTKPK7G0N96OoCgKXVzYHlfmUcP2NEWKQxvp9VryD5dRVmkBYEDfbo4zAldUnLFSXHbWXeEJH9SnTx9KSkocwyUlJYSEhDiNLy0tdVyKao1Tp8zY7UqDcSZTECUlZ9oeNNC7dyBVVdYW53NlnpZi6Yh4O0Lv3oGcdWF7XJnHW9uj1Wou+IMBvFQcpk+fTllZGXp9/eqXLl1KVVUVy5Ytw2q1cscddzB//nxvhNYqZZUWxxd8cDd/L0ejHo3vA8gZkWuGDx/O4cOHOXLkCJdddhlbt27lrrvuol+/fhiNRnJzcxk5ciRZWVmMHTvW2+GKTs7jxUFRFAoKCvjkk08cxcFisRAZGckbb7xB3759SUxMZNeuXYSHh3s6PNFO524gl1dXAL59T8DTjEYjy5cvZ+7cuVitVsLDw4mMjAQgPT2d1NRUzGYzw4YNY8aMGV6OVnR2Hi8OP/30EwAJCQmcPn2ae+65h6uuusrxlAbgeEpDioNvOv8GMtBp7gm4y86dOx1/h4WFsWXLFqd5hgwZwsaNGz0ZlrjIefw5wMrKSsLCwnj55Zd5/fXXeeeddygsLGzyKQ0hhBDe4fEzh9DQUEJDQx3D8fHxZGRkMHLkSMe4tjyN4a4nMZoT4G9wPIFh9NNjNNa5NGz002Op+WVagL+B4OCubouzrdq67/zLDHRR6rfNvwO27fzl+fnpsVh/eQqkI5YvhHDm8eLw9ddfU1tbS1hYGFBfCPr169fkUxqt4a4nMS5Er9dSbal1PIFhrbFhtdpcGrbW1Dd9cG5aV6OO8vIqVV2Xb+u+0+u1WCy1jqc0grQ2Kiurqav7Zdtas52Nl1fTpX7fnRvuqqltct+19CSGEKJ5Hr+sdObMGVasWIHVasVsNrNp0yYee+wxx1MadXV1bN26VZ7G6CS6+Qexv+yA4w3nA+UHffqtZiEuFh4/cxg3bhz79u1j0qRJ2O12pk2bRmho6AWf0hC+r/xs53xpTYjOzCvvOTz66KM8+uijDcZd6CkNIYQQnifn90IIIZxIcRBCCOFEioMQQggnUhyEEEI4keIghBDCiRQHIYQQTqQ/ByHERSW4hz86ffNffXU2G+WnLR6KSJ2kOAghLio6vZ4T2W80O0+/yOkeika9pDgI1Wlr96tCiI4jxUGoSuPOgvr3uLRN/SULIdpHioNQnfM7C+oR0M3L0QhxcZLiINpNLgMJ0flIcRDtIpeBhOicpDiIdpPLQEJ0PnINQAghhBM5cxAepdVonO5LqKl7VCFEPSkOKuCOL8zGXXE2Xl5L093lXLehZVX19yiCA7ozNPhqKRBCqIwUBxXoHmQk78dTnKqoBqBnN3+uvbJnm78w9XotnMij9kw5AIagYPT9rncsr6Xp7ibdhgqhflIcVKK80kJx2dkOW17tmXJqTpc6hg2tnC6EuLhJcegkGr9rUHv+RI22wWUrp+le1PiSmrwnIYQ6SHHoBBpfJtKF9G/wroG+azfsx/ZRW1nW5PTGxcOTGt+DkPckLl51doXevQObncdWJ/emPEWKQydx/mUifWCPVk1vXDwMQcEQHObWeM93/j0IeU9Cfbp374LB4P4fDzqthr9symt2nocmX+/2OEQ9VRWHDz74gLVr12Kz2bj//vu57777vB3SRaPxPQihTt7IEYNB2+yXtnxhd06qKQ5FRUWsXLmS999/Hz8/P6ZMmcJNN93EoEGDvB2aKjV7j0F0SpIjwpNUUxxycnIYPXo0PXr0AGDChAlkZ2czZ84clz6v1TZ9nbprV7+OCtFpff1CAgnsUr98U3AAXf0NdAkwtDhsCg7AUmtH938xN563e6AfAQEG7HblgutWKoux19T3VKXv0g3tZQMx9uwDgKF7L+w9euEXfEmbhnUBXQHX9p1Wq2FYn8FU11oB6BEQRE1dDVf27O+24TrquLRrXwACDEa0Wo3T//+Fjgdf5q4ccWVfBXZp/nm2lqZ35Dwd8X977hhvz3oC/bq0uAxX5vHWsdrSelVTHIqLizGZTI7hkJAQ8vKav/54vuDgpv+zu3Qxtju2Cxl1TV+3LbtF/pc1GDT2DOnwVbi6765oFItHdPf8Kr3NXTnSq1fzN4EBpkZe067pHTmPK/G2pO9td7V7PfGhd7S4DFfm6YjtcQfVPDdot9sbPKWiKIo8tSLEeSRHhCeppjj06dOHkpISx3BJSQkhIR3/a1gIXyU5IjxJNcXh5ptvZvfu3ZSVlVFdXc1HH33E2LFjvR2WEKohOSI8STX3HC655BLmz5/PjBkzqK2tJT4+nuuvl0fkhDhHckR4kkZRlKYfiRFCCHHRUs1lJSGEEOohxUEIIYQTKQ5CCCGcSHEQQgjhpNMWhw8++IA777yTiIgI3nrrLW+H08D06dOJiooiNjaW2NhY9u3b5+2QMJvNREdHc/z4caC+qYaYmBgiIiJYuXKlqmJbuHAhERERjv338ccfezU+X9F4P55v9erVjBs3zrFPvZkzq1evJioqiqioKFasWOE0/cCBA8TFxTFhwgRSUlKw2WxeiPIXLcWrpn3bKkon9PPPPyvjxo1TysvLlaqqKiUmJkY5dOiQt8NSFEVR7Ha7cssttyi1tbXeDsXh22+/VaKjo5Vhw4Ypx44dU6qrq5Xw8HDl6NGjSm1trZKQkKB8+umnqohNURQlOjpaKSoq8ko8vqqp/Xi+xMRE5d///rcXImvoiy++UO69917FarUqNTU1yowZM5SPPvqowTxRUVHKN998oyiKoixcuFB56623vBBpPVfiVcu+ba1OeeZwfgNlXbp0cTRQpgY//fQTAAkJCUycOJE333zTyxFBZmYmixcvdrxtm5eXx4ABA+jfvz96vZ6YmBiv7b/GsVVXV1NYWEhycjIxMTFkZGRgt0sHMC1pvB8by8/P589//jMxMTEsXboUq9Xq4QjrmUwmFixYgJ+fHwaDgYEDB1JYWOiYfuLECSwWCyNGjAAgLi7Oq7ndUrygnn3bWp2yODTVQFlRUZEXI/pFZWUlYWFhvPzyy7z++uu88847fPHFF16N6dlnn2XUqFGOYTXtv8axlZaWMnr0aNLS0sjMzOTrr79m48aNXonNlzTej+erqqpi6NChJCUlsWnTJiorK1mzZo2HI6w3ePBgxxd/QUEBH374IeHh4Y7pjY9Nk8nk1dxuKV417dvW6pTFQc0NlIWGhrJixQqCgoLo2bMn8fHx7Nq1y9thNaDm/de/f39efvllQkJCCAgIYPr06arbf76ma9euvPrqqwwcOBC9Xk9CQoLX9+mhQ4dISEjgiSee4IorrnCMV+uxeaF41bhvXdUpi4OaGyj7+uuv2b17t2NYURT0etW0YgKoe/8dPHiQ7du3O4bVuP98TWFhYYOzL2/v09zcXB544AEef/xxJk+e3GBa42OztLTU68dmc/Gqbd+2RqcsDmpuoOzMmTOsWLECq9WK2Wxm06ZNjB8/3tthNTB8+HAOHz7MkSNHqKurY+vWrarZf4qikJaWRkVFBbW1tbz77ruq23++xt/fn+eff55jx46hKApvvfWW1/bpyZMnmT17Nunp6URFRTlN79evH0ajkdzcXACysrK8emy2FK+a9m1r+UYJayU1N1A2btw49u3bx6RJk7Db7UybNo3Q0FBvh9WA0Whk+fLlzJ07F6vVSnh4OJGRkd4OC4AhQ4bw8MMPM3XqVGw2GxEREURHR3s7LJ80c+ZM5s2bx3XXXcfSpUt55JFHqK2t5YYbbuDBBx/0Skzr1q3DarWyfPlyx7gpU6awc+dOR6zp6emkpqZiNpsZNmwYM2bM8Eqsrsarln3bWtLwnhBCCCed8rKSEEKI9pHiIIQQwokUByGEEE6kOAghhHAixUEIIYQTKQ4d5KWXXmLp0qVNTps5cyY//PDDBT/75ZdftvpxzObW115///vfHS1HtmY9dXV1JCYmUlpa6vK68vPzeeqpp9oUp/AtkiO+lSNSHDzg1VdfZdCgQd4Ow2W5ublYLJZWf+61117jxhtvpHfv3i5/5tprr8Vms/HJJ5+0en2i85AcuTBv5UinfAmuvR5//HGGDRtGQkICAG+//TZ79+7lxRdfZOfOnaxdu5ba2lr8/f158sknHS+x/fTTT0yfPp2SkhJ69+7NH//4R0JCQrj99ttZtWoV1113HRs3bmT9+vVotVqCg4N57rnnGqy7pqaG9PR0vvrqK+rq6rjmmmtITU0lMDDwgvEWFRWxdOlSTp48SW1tLVFRUcyaNYvjx4/zwAMPEB4ezr59+6isrCQpKYnx48dTXV3N4sWL2bdvH0FBQY7E/PWvf83OnTv54osv8Pf3b3a7zlddXc1f//pXPvjgA6D+19TRo0cpKiqipKSEYcOGcdNNN7F582aOHz9OUlKS45fgvffeyx/+8AfGjRvXAf97whMkRy6CHPFOS+Hqtnv3biU6OtoxHB8fr3zxxRfK4cOHlejoaKWsrExRFEX573//q4wZM0apqqpSMjIylNtvv105deqUoiiK8sgjjyirV69WFEVRxo0bp+Tl5SkHDhxQbrrpJqWwsFBRFEVZv3698tRTTyl79uxRoqKiFEVRlJdeeklZvny5YrfbFUVRlBdeeEFZvHixU4wZGRnKkiVLFEVRlOnTpys7duxQFEVRLBaLMn36dOUf//iHcuzYMeWqq65Sdu7cqSiKomRnZyu33XaboiiKkp6erjz22GNKXV2dcubMGSUmJkZ58sknFUVRlCeffFL5y1/+4ljPhbbrfDt37lR+85vfNIhv3LhxSmVlpVJdXa386le/UpYtW6YoiqJ8/PHHSkRERIPPh4aGKkePHm3pv0aohORI588ROXNowk033YTVauW7774jICCAsrIywsLCePvttykuLuaBBx5wzKvRaDh69CgAY8aMoWfPnkB9Mw9lZWUNlrt7925uueUW+vbtC+BYzpdffumY59NPP+XMmTPk5OQAUFtbS69evS4Y69mzZ/nqq6+oqKhg1apVjnHff/89119/PQaDwdGE8DXXXMPp06cB2LVrFwsXLkSr1RIYGMjkyZM5ePBgk+toabug/pfT5Zdf3mDczTffTFBQEFDf7Pett94KwOWXX+6I45zLLruMw4cP079//wtuq1APyZGGOmOOSHFogkajIT4+nqysLAwGA/Hx8Wg0Gux2O2FhYbz44ouOeU+ePElISAgff/xxg9YWNRoNSqOWSXQ6XYPmhS0WCydOnGgwj91uJzk52XGwVlVVNds5iN1uR1EU3nnnHQICAgAoKyvDaDRSXl6OwWBAq9U6YjpHr9c3iO/cPE1pabvOjW/c6Y6fn98Fl9PUOnQ63QWnC3WRHGmoM+aI3JC+gMmTJ7Nz5062b99OXFwcAGFhYXzxxRf8+OOPQP0vi4kTJ7p8Y+qmm25i9+7dFBcXA/DOO+/w/PPPN5jnlltu4a233qKmpga73c5TTz3FH//4xwsuMzAwkBEjRrB+/XqgvjOhqVOnsmPHjmZjCQ8P57333sNut1NdXc3WrVsdiaHT6VrdL++VV17JsWPHWvWZcxRFobCwkCuvvLJNnxfeITnSuXNEzhwuwGQycc0112Cz2bjkkksAGDRoEEuXLuWxxx5ztMu+du1aunbt6tIyr776apKSknjooYcc60hLS6OgoMAxz29/+1uee+45Jk+eTF1dHUOHDmXBggXNLjc9PZ2nn36amJgYampqiI6OZuLEiU12JH9OYmIiS5cuJSYmhqCgIHr16uW4uTZ27NgGrUy64uabbyYlJYXKykq6devWqs9+9913XH755Vx66aWt+pzwLsmRzp0j0irrReof//gHgYGBhIeHY7fbmTt3LmPGjGHatGltXuaf/vQndDodM2fObNXnFixYQGRkJLfddlub1y1ER7vYc0QuK12kBg8ezNq1a4mNjSU6OpqQkBDuvvvudi0zISGBPXv2NOipqyX5+floNBopDEJ1LvYckTMHIYQQTuTMQQghhBMpDkIIIZxIcRBCCOFEioMQQggnUhyEEEI4keIghBDCyf8Hsq/hn1ZIqcIAAAAASUVORK5CYII=\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# produce a plot to illustrate the distribution of lengths and widths for each class\n", "plt.subplot(1,2,1)\n", "sns.histplot(data=vehicles, x=\"length\", bins = np.arange(0,16,0.5), hue=\"type\")\n", "plt.xlabel('vehicle length (m)')\n", "\n", "plt.subplot(1,2,2)\n", "sns.histplot(data=vehicles, x=\"width\", bins = np.arange(1.5,3,0.1), hue=\"type\")\n", "plt.xlabel('vehicle width (m)')\n", "\n", "plt.subplots_adjust(wspace = 0.5) # shift the plots sideways so they don't overlap" ] }, { "cell_type": "markdown", "id": "ccb2ab2e", "metadata": {}, "source": [ "The mean length of cars is 4.20m (sd 0.51), the mean length of trucks \\< your text here \\> and tows \\< your text here \\>. " ] }, { "cell_type": "code", "execution_count": null, "id": "c2ee07ed", "metadata": {}, "outputs": [], "source": [ "# Your code here to output the mean and s.d. of length for each class" ] }, { "cell_type": "markdown", "id": "cf3ddfab", "metadata": {}, "source": [ "The mean width of cars is \\< your text here giving descriptives for width of each class \\> " ] }, { "cell_type": "code", "execution_count": null, "id": "2335f3bc", "metadata": {}, "outputs": [], "source": [ "# Your code here to output the mean and s.d. of width for each class" ] }, { "cell_type": "markdown", "id": "24f7f12b", "metadata": {}, "source": [ "therefore we would recommend .....[your comment on how to segregate the parking areas for vehicle classes]......:" ] }, { "cell_type": "markdown", "id": "18d2d9b2", "metadata": {}, "source": [ "## Size and number of parking spaces in each zone\n", "\n", "We recommend that the parking spaces in each zone should be sized to fit the 95th centile in length and width of each vehicle class. \n", "The exact lengths are: /" ] }, { "cell_type": "code", "execution_count": 78, "id": "5a966d6a", "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", "
lengthheightwidth
type
car4.611301.624801.83000
towing9.279822.911962.25472
truck15.212604.202122.51552
\n", "
" ], "text/plain": [ " length height width\n", "type \n", "car 4.61130 1.62480 1.83000\n", "towing 9.27982 2.91196 2.25472\n", "truck 15.21260 4.20212 2.51552" ] }, "execution_count": 78, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# edit this code to give the 95th percentile (0.95 quantile) of measurements for each vehicle type\n", "#\n", "\n", "vehicles.groupby(['type']).q# complete the line!......\n" ] }, { "cell_type": "markdown", "id": "eb5b0f5e", "metadata": {}, "source": [ "Given the observed frequencies in each vehicle class, we recommend the following minimum number of spaces in each zone, which is our observed vehicle counts +10% /< your text here - />" ] }, { "cell_type": "code", "execution_count": 79, "id": "597f0ac2", "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", "
lengthheightwidth
type
car981981981
towing535353
truck330330330
\n", "
" ], "text/plain": [ " length height width\n", "type \n", "car 981 981 981\n", "towing 53 53 53\n", "truck 330 330 330" ] }, "execution_count": 79, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# your code to give the number of vehicles in each class - \n", "# hint - similar to the code above but use .count() instead of .quantile()" ] }, { "cell_type": "markdown", "id": "4e7d3fef", "metadata": {}, "source": [ "### The end!" ] } ], "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.9.13" } }, "nbformat": 4, "nbformat_minor": 5 }