From d8a9e6435fb14ee67336f5d597c0472d5bbf3b16 Mon Sep 17 00:00:00 2001 From: clydeochieng <107258512+clydeochieng@users.noreply.github.com> Date: Sat, 27 Apr 2024 18:46:36 +0300 Subject: [PATCH 01/42] Update student.ipynb --- student.ipynb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/student.ipynb b/student.ipynb index d3bb34af..d4ba3217 100644 --- a/student.ipynb +++ b/student.ipynb @@ -7,7 +7,7 @@ "## Final Project Submission\n", "\n", "Please fill out:\n", - "* Student name: \n", + "* Student name: Solphine Joseph\n", "* Student pace: self paced / part time / full time\n", "* Scheduled project review date/time: \n", "* Instructor name: \n", From edf85ba829ba11bb5049eb9a34db1a33f06081cf Mon Sep 17 00:00:00 2001 From: clydeochieng <107258512+clydeochieng@users.noreply.github.com> Date: Sat, 27 Apr 2024 19:08:04 +0300 Subject: [PATCH 02/42] Update student.ipynb --- student.ipynb | 41 ++++++++++++++++++++++++++++++++++------- 1 file changed, 34 insertions(+), 7 deletions(-) diff --git a/student.ipynb b/student.ipynb index d4ba3217..a39a5a52 100644 --- a/student.ipynb +++ b/student.ipynb @@ -7,20 +7,47 @@ "## Final Project Submission\n", "\n", "Please fill out:\n", - "* Student name: Solphine Joseph\n", - "* Student pace: self paced / part time / full time\n", + "* Student name: Solphine Joseph, Grace Rotich, Mather Rotich, Hilary Simiyu, Clyde Ochieng.\n", + "* Student pace: full time\n", "* Scheduled project review date/time: \n", - "* Instructor name: \n", + "* Instructor name: Nikita \n", "* Blog post URL:\n" ] }, { - "cell_type": "code", - "execution_count": null, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Kings County Housing Analysis with Multiple Linear Regression" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Overview\n", + "\n", + "\n", + "A real estate agency in Kingsway seeks to determine what are the contributing factors that affect the price of houses to make improvements where necessary. They want to employ an analytical approach rather than sentimental before arriving at a decision. Multilinear regression has been used for this project to understand how various features affect their pricing to better their services." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Business Problem\n", + "\n", + "In the face of market fluctuations and heightened competition within the real estate sector, our agency is grappling with pricing volatility, which poses significant challenges for our agents in devising effective business strategies. We seek strategic guidance to optimize our purchasing and selling endeavors, prioritizing informed decision-making to identify key areas of focus that promise maximum returns on investment." + ] + }, + { + "cell_type": "markdown", "metadata": {}, - "outputs": [], "source": [ - "# Your code here - remember to use markdown cells for comments as well!" + "### Objectives\n", + "* To determine the key factors influencing house prices.\n", + "* To develop multilinear regression models to predict house prices based on relevant features.\n", + "* To use insights from the regression analysis to optimize pricing strategies for both purchasing and selling properties.\n" ] } ], From 9a914828148112c36789f9fdad61f7b00a90897b Mon Sep 17 00:00:00 2001 From: clydeochieng <107258512+clydeochieng@users.noreply.github.com> Date: Sat, 27 Apr 2024 19:08:08 +0300 Subject: [PATCH 03/42] Update README.md --- README.md | 288 ++---------------------------------------------------- 1 file changed, 8 insertions(+), 280 deletions(-) diff --git a/README.md b/README.md index 5dd0f84d..39359350 100644 --- a/README.md +++ b/README.md @@ -1,285 +1,13 @@ # Phase 2 Project Description +## Overview -Another module down - you're almost half way there! -![awesome](https://raw.githubusercontent.com/learn-co-curriculum/dsc-phase-2-project-v2-3/main/halfway-there.gif) +A real estate agency in Kingsway seeks to determine what are the contributing factors that affect the price of houses to make improvements where necessary. They want to employ an analytical approach rather than sentimental before arriving at a decision. Multilinear regression has been used for this project to understand how various features affect their pricing to better their services. +## Business Problem -All that remains in Phase 2 is to put your newfound data science skills to use with a large project! +In the face of market fluctuations and heightened competition within the real estate sector, our agency is grappling with pricing volatility, which poses significant challenges for our agents in devising effective business strategies. We seek strategic guidance to optimize our purchasing and selling endeavors, prioritizing informed decision-making to identify key areas of focus that promise maximum returns on investment. +### Objectives -In this project description, we will cover: - -* Project Overview: the project goal, audience, and dataset -* Deliverables: the specific items you are required to produce for this project -* Grading: how your project will be scored -* Getting Started: guidance for how to begin working - -## Project Overview - -For this project, you will use multiple linear regression modeling to analyze house sales in a northwestern county. - -### Business Problem - -It is up to you to define a stakeholder and business problem appropriate to this dataset. - -If you are struggling to define a stakeholder, we recommend you complete a project for a real estate agency that helps homeowners buy and/or sell homes. A business problem you could focus on for this stakeholder is the need to provide advice to homeowners about how home renovations might increase the estimated value of their homes, and by what amount. - -### The Data - -This project uses the King County House Sales dataset, which can be found in `kc_house_data.csv` in the data folder in this assignment's GitHub repository. The description of the column names can be found in `column_names.md` in the same folder. As with most real world data sets, the column names are not perfectly described, so you'll have to do some research or use your best judgment if you have questions about what the data means. - -It is up to you to decide what data from this dataset to use and how to use it. If you are feeling overwhelmed or behind, we recommend you **ignore** some or all of the following features: - -* `date` -* `view` -* `sqft_above` -* `sqft_basement` -* `yr_renovated` -* `zipcode` -* `lat` -* `long` -* `sqft_living15` -* `sqft_lot15` - -### Key Points - -* **Your goal in regression modeling is to yield findings to support relevant recommendations. Those findings should include a metric describing overall model performance as well as at least two regression model coefficients.** As you explore the data and refine your stakeholder and business problem definitions, make sure you are also thinking about how a linear regression model adds value to your analysis. "The assignment was to use linear regression" is not an acceptable answer! You can also use additional statistical techniques other than linear regression, so long as you clearly explain why you are using each technique. - -* **You should demonstrate an iterative approach to modeling.** This means that you must build multiple models. Begin with a basic model, evaluate it, and then provide justification for and proceed to a new model. After you finish refining your models, you should provide 1-3 paragraphs in the notebook discussing your final model. - -* **Data visualization and analysis are no longer explicit project requirements, but they are still very important.** In Phase 1, your project stopped earlier in the CRISP-DM process. Now you are going a step further, to modeling. Data visualization and analysis will help you build better models and tell a better story to your stakeholders. - -## Deliverables - -There are three deliverables for this project: - -* A **non-technical presentation** -* A **Jupyter Notebook** -* A **GitHub repository** - -The deliverables requirements are almost the same as in the Phase 1 Project, and you can review those extended descriptions [here](https://github.com/learn-co-curriculum/dsc-phase-1-project-v2-3#deliverables). In general, everything is the same except the "Data Visualization" and "Data Analysis" requirements have been replaced by "Modeling" and "Regression Results" requirements. - -### Non-Technical Presentation - -Recall that the non-technical presentation is a slide deck presenting your analysis to ***business stakeholders***, and should be presented live as well as submitted in PDF form on Canvas. - -We recommend that you follow this structure, although the slide titles should be specific to your project: - -1. Beginning - - Overview - - Business and Data Understanding -2. Middle - - **Modeling** - - **Regression Results** -3. End - - Recommendations - - Next Steps - - Thank you - -Make sure that your discussion of modeling and regression results is geared towards a non-technical audience! Assume that their prior knowledge of regression modeling is minimal. You don't need to explain how linear regression works, but you should explain why linear regression is useful for the problem context. Make sure you translate any metrics or coefficients into their plain language implications. - -The graded elements for the non-technical presentation are the same as in [Phase 1](https://github.com/learn-co-curriculum/dsc-phase-1-project-v2-3#deliverables). - -### Jupyter Notebook - -Recall that the Jupyter Notebook is a notebook that uses Python and Markdown to present your analysis to a ***data science audience***. You will submit the notebook in PDF format on Canvas as well as in `.ipynb` format in your GitHub repository. - -The graded elements for the Jupyter Notebook are: - -* Business Understanding -* Data Understanding -* Data Preparation -* **Modeling** -* **Regression Results** -* Code Quality - -### GitHub Repository - -Recall that the GitHub repository is the cloud-hosted directory containing all of your project files as well as their version history. - -The requirements are the same as in [Phase 1](https://github.com/learn-co-curriculum/dsc-phase-1-project-v2-3#github-repository), except for the required sections in the `README.md`. - -For this project, the `README.md` file should contain: - -* Overview -* Business and Data Understanding - * Explain your stakeholder audience here -* **Modeling** -* **Regression Results** -* Conclusion - -Just like in Phase 1, the `README.md` file should be the bridge between your non technical presentation and the Jupyter Notebook. It should not contain the code used to develop your analysis, but should provide a more in-depth explanation of your methodology and analysis than what is described in your presentation slides. - -## Grading - -***To pass this project, you must pass each project rubric objective.*** The project rubric objectives for Phase 2 are: - -1. Attention to Detail -2. Statistical Communication -3. Data Preparation Fundamentals -4. Linear Modeling - -### Attention to Detail - -Just like in Phase 1, this rubric objective is based on your completion of checklist items. ***In Phase 2, you need to complete 70% (7 out of 10) or more of the checklist elements in order to pass the Attention to Detail objective.*** - -**NOTE THAT THE PASSING BAR IS HIGHER IN PHASE 2 THAN IT WAS IN PHASE 1!** - -The standard will increase with each Phase, until you will be required to complete all elements to pass Phase 5 (Capstone). - -#### Exceeds Objective - -80% or more of the project checklist items are complete - -#### Meets Objective (Passing Bar) - -70% of the project checklist items are complete - -#### Approaching Objective - -60% of the project checklist items are complete - -#### Does Not Meet Objective - -50% or fewer of the project checklist items are complete - -### Statistical Communication - -Recall that communication is one of the key data science "soft skills". In Phase 2, we are specifically focused on Statistical Communication. We define Statistical Communication as: - -> Communicating **results of statistical analyses** to diverse audiences via writing and live presentation - -Note that this is the same as in Phase 1, except we are replacing "basic data analysis" with "statistical analyses". - -High-quality Statistical Communication includes rationale, results, limitations, and recommendations: - -* **Rationale:** Explaining why you are using statistical analyses rather than basic data analysis - * For example, why are you using regression coefficients rather than just a graph? - * What about the problem or data is suitable for this form of analysis? - * For a data science audience, this includes your reasoning for the changes you applied while iterating between models. -* **Results:** Describing the overall model metrics and feature coefficients - * You need at least one overall model metric (e.g. r-squared or RMSE) and at least two feature coefficients. - * For a business audience, make sure you connect any metrics to real-world implications. You do not need to get into the details of how linear regression works. - * For a data science audience, you don't need to explain what a metric is, but make sure you explain why you chose that particular one. -* **Limitations:** Identifying the limitations and/or uncertainty present in your analysis - * This could include p-values/alpha values, confidence intervals, assumptions of linear regression, missing data, etc. - * In general, this should be more in-depth for a data science audience and more surface-level for a business audience. -* **Recommendations:** Interpreting the model results and limitations in the context of the business problem - * What should stakeholders _do_ with this information? - -#### Exceeds Objective - -Communicates the rationale, results, limitations, and specific recommendations of statistical analyses - -> See above for extended explanations of these terms. - -#### Meets Objective (Passing Bar) - -Successfully communicates the results of statistical analyses without any major errors - -> The minimum requirement is to communicate the _results_, meaning at least one overall model metric (e.g. r-squared or RMSE) as well as at least two feature coefficients. See the Approaching Objective section for an explanation of what a "major error" means. - -#### Approaching Objective - -Communicates the results of statistical analyses with at least one major error - -> A major error means that some aspect of your explanation is fundamentally incorrect. For example, if a feature coefficient is negative and you say that an increase in that feature results in an increase of the target, that would be a major error. Another example would be if you say that the feature with the highest coefficient is the "most statistically significant" while ignoring the p-value. One more example would be reporting a coefficient that is not statistically significant, rather than saying "no statistically significant linear relationship was found" - -> "**If a coefficient's t-statistic is not significant, don't interpret it at all.** You can't be sure that the value of the corresponding parameter in the underlying regression model isn't really zero." _DeVeaux, Velleman, and Bock (2012), Stats: Data and Models, 3rd edition, pg. 801_. Check out [this website](https://web.ma.utexas.edu/users/mks/statmistakes/TOC.html) for extensive additional examples of mistakes using statistics. - -> The easiest way to avoid making a major error is to have someone double-check your work. Reach out to peers on Slack and ask them to confirm whether your interpretation makes sense! - -#### Does Not Meet Objective - -Does not communicate the results of statistical analyses - -> It is not sufficient to just display the entire results summary. You need to pull out at least one overall model metric (e.g. r-squared, RMSE) and at least two feature coefficients, and explain what those numbers mean. - -### Data Preparation Fundamentals - -We define this objective as: - -> Applying appropriate **preprocessing** and feature engineering steps to tabular data in preparation for statistical modeling - -The two most important components of preprocessing for the Phase 2 project are: - -* **Handling Missing Values:** Missing values may be present in the features you want to use, either encoded as `NaN` or as some other value such as `"?"`. Before you can build a linear regression model, make sure you identify and address any missing values using techniques such as dropping or replacing data. -* **Handling Non-Numeric Data:** A linear regression model needs all of the features to be numeric, not categorical. For this project, ***be sure to pick at least one non-numeric feature and try including it in a model.*** You can identify that a feature is currently non-numeric if the type is `object` when you run `.info()` on your dataframe. Once you have identified the non-numeric features, address them using techniques such as ordinal or one-hot (dummy) encoding. - -There is no single correct way to handle either of these situations! Use your best judgement to decide what to do, and be sure to explain your rationale in the Markdown of your notebook. - -Feature engineering is encouraged but not required for this project. - -#### Exceeds Objective - -Goes above and beyond with data preparation, such as feature engineering or merging in outside datasets - -> One example of feature engineering could be using the `date` feature to create a new feature called `season`, which represents whether the home was sold in Spring, Summer, Fall, or Winter. - -> One example of merging in outside datasets could be finding data based on ZIP Code, such as household income or walkability, and joining that data with the provided CSV. - -#### Meets Objective (Passing Bar) - -Successfully prepares data for modeling, including converting at least one non-numeric feature into ordinal or binary data and handling missing data as needed - -> As a reminder, you can identify the non-numeric features by calling `.info()` on the dataframe and looking for type `object`. - -> Your final model does not necessarily need to include any features that were originally non-numeric, but you need to demonstrate your ability to handle this type of data. - -#### Approaching Objective - -Prepares some data successfully, but is unable to utilize non-numeric data - -> If you simply subset the dataframe to only columns with type `int64` or `float64`, your model will run, but you will not pass this objective. - -#### Does Not Meet Objective - -Does not prepare data for modeling - -### Linear Modeling - -According to [Kaggle's 2020 State of Data Science and Machine Learning Survey](https://www.kaggle.com/kaggle-survey-2020), linear and logistic regression are the most popular machine learning algorithms, used by 83.7% of data scientists. They are small, fast models compared to some of the models you will learn later, but have limitations in the kinds of relationships they are able to learn. - -In this project you are required to use linear regression as the primary statistical analysis, although you are free to use additional statistical techniques as appropriate. - -#### Exceeds Objective - -Goes above and beyond in the modeling process, such as recursive feature selection - -#### Meets Objective (Passing Bar) - -Successfully builds a baseline model as well as at least one iterated model, and correctly extracts insights from a final model without any major errors - -> We are looking for you to (1) create a baseline model, (2) iterate on that model, making adjustments that are supported by regression theory or by descriptive analysis of the data, and (3) select a final model and report on its metrics and coefficients - -> Ideally you would include written justifications for each model iteration, but at minimum the iterations must be _justifiable_ - -> For an explanation of "major errors", see the description below - -#### Approaching Objective - -Builds multiple models with at least one major error - -> The number one major error to avoid is including the target as one of your features. For example, if the target is `price` you should NOT make a "price per square foot" feature, because that feature would not be available if you didn't already know the price. - -> Other examples of major errors include: using a target other than `price`, attempting only simple linear regression (not multiple linear regression), dropping multiple one-hot encoded columns without explaining the resulting baseline, or using a unique identifier (`id` in this dataset) as a feature. - -#### Does Not Meet Objective - -Does not build multiple linear regression models - -## Getting Started - -Please start by reviewing the contents of this project description. If you have any questions, please ask your instructor ASAP. - -Next, you will need to complete the [***Project Proposal***](#project_proposal) which must be reviewed by your instructor before you can continue with the project. - -Here are some suggestions for creating your GitHub repository: - -1. Fork the [Phase 2 Project Repository](https://github.com/learn-co-curriculum/dsc-phase-2-project-v2-3), clone it locally, and work in the `student.ipynb` file. Make sure to also add and commit a PDF of your presentation to your repository with a file name of `presentation.pdf`. -2. Or, create a new repository from scratch by going to [github.com/new](https://github.com/new) and copying the data files from the Phase 2 Project Repository into your new repository. - - Recall that you can refer to the [Phase 1 Project Template](https://github.com/learn-co-curriculum/dsc-project-template) as an example structure - - This option will result in the most professional-looking portfolio repository, but can be more complicated to use. So if you are getting stuck with this option, try forking the project repository instead - -## Summary - -This is your first modeling project! Take what you have learned in Phase 2 to create a project with a more sophisticated analysis than you completed in Phase 1. You will build on these skills as we move into the predictive machine learning mindset in Phase 3. You've got this! +* To determine the key factors influencing house prices. +* To develop multilinear regression models to predict house prices based on relevant features. +* To use insights from the regression analysis to optimize pricing strategies for both purchasing and selling properties. From 44945a8b49c270aaa7febb792115f4b93f5d9c61 Mon Sep 17 00:00:00 2001 From: clydeochieng <107258512+clydeochieng@users.noreply.github.com> Date: Sat, 27 Apr 2024 23:50:20 +0300 Subject: [PATCH 04/42] Update student.ipynb --- student.ipynb | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/student.ipynb b/student.ipynb index a39a5a52..1b57076a 100644 --- a/student.ipynb +++ b/student.ipynb @@ -49,6 +49,44 @@ "* To develop multilinear regression models to predict house prices based on relevant features.\n", "* To use insights from the regression analysis to optimize pricing strategies for both purchasing and selling properties.\n" ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Data Understanding:\n", + "\n", + "The real estate agency in Kingsway is analyzing a dataset to determine the factors affecting house prices. The dataset likely includes features such as property size, location, age, and market trends. Key steps include assessing data quality, exploring relationships between features and prices, and preprocessing data for multilinear regression analysis. Multilinear regression will be used to model how these features collectively influence house prices, with evaluation metrics used to assess predictive accuracy." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "##### King County Housing Data Columns \n", + "\n", + "* `id` - Unique identifier for a house\n", + "* `date` - Date house was sold\n", + "* `price` - Sale price (prediction target)\n", + "* `bedrooms` - Number of bedrooms\n", + "* `bathrooms` - Number of bathrooms\n", + "* `sqft_living` - Square footage of living space in the home\n", + "* `sqft_lot` - Square footage of the lot\n", + "* `floors` - Number of floors (levels) in house\n", + "* `waterfront` - Whether the house is on a waterfront\n", + "* `view` - Quality of view from house\n", + "* `condition` - How good the overall condition of the house is. \n", + "* `grade` - Overall grade of the house. \n", + "* `sqft_above` - Square footage of house apart from basement \n", + "* `sqft_basement` - Square footage of the basement – (Ignored)\n", + "* `yr_built` - Year when house was built\n", + "* `yr_renovated` - Year when house was renovated – (Ignored)\n", + "* `zipcode` - ZIP Code used by the United States Postal Service \n", + "* `lat` - Latitude coordinate\n", + "* `long` - Longitude coordinate\n", + "* `sqft_living15` - The square footage of interior housing living space for the nearest 15 neighbors\n", + "* `sqft_lot15` - The square footage of the land lots of the nearest 15 neighbors" + ] } ], "metadata": { From cc69bf6eaebae6771f6177b5754a3335140cdc07 Mon Sep 17 00:00:00 2001 From: clydeochieng <107258512+clydeochieng@users.noreply.github.com> Date: Sat, 27 Apr 2024 23:50:27 +0300 Subject: [PATCH 05/42] Update README.md --- README.md | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index 39359350..7f581e17 100644 --- a/README.md +++ b/README.md @@ -2,12 +2,6 @@ ## Overview -A real estate agency in Kingsway seeks to determine what are the contributing factors that affect the price of houses to make improvements where necessary. They want to employ an analytical approach rather than sentimental before arriving at a decision. Multilinear regression has been used for this project to understand how various features affect their pricing to better their services. -## Business Problem +Data Understanding: -In the face of market fluctuations and heightened competition within the real estate sector, our agency is grappling with pricing volatility, which poses significant challenges for our agents in devising effective business strategies. We seek strategic guidance to optimize our purchasing and selling endeavors, prioritizing informed decision-making to identify key areas of focus that promise maximum returns on investment. -### Objectives - -* To determine the key factors influencing house prices. -* To develop multilinear regression models to predict house prices based on relevant features. -* To use insights from the regression analysis to optimize pricing strategies for both purchasing and selling properties. +The real estate agency in Kingsway is analyzing a dataset to determine the factors affecting house prices. The dataset likely includes features such as property size, location, age, and market trends. Key steps include assessing data quality, exploring relationships between features and prices, and preprocessing data for multilinear regression analysis. Multilinear regression will be used to model how these features collectively influence house prices, with evaluation metrics used to assess predictive accuracy. \ No newline at end of file From 69d9b53e29fe61e9d1838e8fbe203b883e713f09 Mon Sep 17 00:00:00 2001 From: clydeochieng <107258512+clydeochieng@users.noreply.github.com> Date: Sat, 27 Apr 2024 23:54:15 +0300 Subject: [PATCH 06/42] Update student.ipynb --- student.ipynb | 28 +++++++++++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/student.ipynb b/student.ipynb index 1b57076a..567e978d 100644 --- a/student.ipynb +++ b/student.ipynb @@ -87,6 +87,32 @@ "* `sqft_living15` - The square footage of interior housing living space for the nearest 15 neighbors\n", "* `sqft_lot15` - The square footage of the land lots of the nearest 15 neighbors" ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Explotory Data Analyis\n", + "\n", + "Importing data." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "#load necessary modules \n", + "import numpy as np\n", + "import pandas as pd\n", + "import matplotlib.pyplot as plt\n", + "%matplotlib inline\n", + "import scipy.stats as stats\n", + "import statsmodels.formula.api as smf\n", + "import statsmodels.stats.api as sms\n", + "import statsmodels.api as sm" + ] } ], "metadata": { @@ -105,7 +131,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.6.4" + "version": "3.10.13" } }, "nbformat": 4, From 47f9a238257ff095bf0edf0818244fa726a9fbe4 Mon Sep 17 00:00:00 2001 From: clydeochieng <107258512+clydeochieng@users.noreply.github.com> Date: Sun, 28 Apr 2024 18:27:02 +0300 Subject: [PATCH 07/42] Update student.ipynb --- student.ipynb | 394 +++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 386 insertions(+), 8 deletions(-) diff --git a/student.ipynb b/student.ipynb index 567e978d..013a05d1 100644 --- a/student.ipynb +++ b/student.ipynb @@ -99,19 +99,397 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": 13, "metadata": {}, "outputs": [], "source": [ - "#load necessary modules \n", - "import numpy as np\n", + "#import libraries\n", "import pandas as pd\n", - "import matplotlib.pyplot as plt\n", - "%matplotlib inline\n", + "import numpy as np\n", "import scipy.stats as stats\n", - "import statsmodels.formula.api as smf\n", - "import statsmodels.stats.api as sms\n", - "import statsmodels.api as sm" + "import math\n", + "import matplotlib.pyplot as plt\n", + "from sklearn.impute import MissingIndicator\n", + "from sklearn.impute import SimpleImputer\n", + "from sklearn.linear_model import LinearRegression\n", + "from sklearn.model_selection import train_test_split\n", + "from sklearn import preprocessing" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "##### Removing irrelvant columns" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
iddatepricebedroomsbathroomssqft_livingsqft_lotfloorswaterfrontview...gradesqft_abovesqft_basementyr_builtyr_renovatedzipcodelatlongsqft_living15sqft_lot15
0712930052010/13/2014221900.031.00118056501.0NaNNONE...7 Average11800.019550.09817847.5112-122.25713405650
1641410019212/9/2014538000.032.25257072422.0NONONE...7 Average2170400.019511991.09812547.7210-122.31916907639
256315004002/25/2015180000.021.00770100001.0NONONE...6 Low Average7700.01933NaN9802847.7379-122.23327208062
3248720087512/9/2014604000.043.00196050001.0NONONE...7 Average1050910.019650.09813647.5208-122.39313605000
419544005102/18/2015510000.032.00168080801.0NONONE...8 Good16800.019870.09807447.6168-122.04518007503
\n", + "

5 rows × 21 columns

\n", + "
" + ], + "text/plain": [ + " id date price bedrooms bathrooms sqft_living \\\n", + "0 7129300520 10/13/2014 221900.0 3 1.00 1180 \n", + "1 6414100192 12/9/2014 538000.0 3 2.25 2570 \n", + "2 5631500400 2/25/2015 180000.0 2 1.00 770 \n", + "3 2487200875 12/9/2014 604000.0 4 3.00 1960 \n", + "4 1954400510 2/18/2015 510000.0 3 2.00 1680 \n", + "\n", + " sqft_lot floors waterfront view ... grade sqft_above \\\n", + "0 5650 1.0 NaN NONE ... 7 Average 1180 \n", + "1 7242 2.0 NO NONE ... 7 Average 2170 \n", + "2 10000 1.0 NO NONE ... 6 Low Average 770 \n", + "3 5000 1.0 NO NONE ... 7 Average 1050 \n", + "4 8080 1.0 NO NONE ... 8 Good 1680 \n", + "\n", + " sqft_basement yr_built yr_renovated zipcode lat long \\\n", + "0 0.0 1955 0.0 98178 47.5112 -122.257 \n", + "1 400.0 1951 1991.0 98125 47.7210 -122.319 \n", + "2 0.0 1933 NaN 98028 47.7379 -122.233 \n", + "3 910.0 1965 0.0 98136 47.5208 -122.393 \n", + "4 0.0 1987 0.0 98074 47.6168 -122.045 \n", + "\n", + " sqft_living15 sqft_lot15 \n", + "0 1340 5650 \n", + "1 1690 7639 \n", + "2 2720 8062 \n", + "3 1360 5000 \n", + "4 1800 7503 \n", + "\n", + "[5 rows x 21 columns]" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "#load and preiview data\n", + "df = pd.read_csv('data/kc_house_data.csv')\n", + "df.head(5)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "RangeIndex: 21597 entries, 0 to 21596\n", + "Data columns (total 21 columns):\n", + " # Column Non-Null Count Dtype \n", + "--- ------ -------------- ----- \n", + " 0 id 21597 non-null int64 \n", + " 1 date 21597 non-null object \n", + " 2 price 21597 non-null float64\n", + " 3 bedrooms 21597 non-null int64 \n", + " 4 bathrooms 21597 non-null float64\n", + " 5 sqft_living 21597 non-null int64 \n", + " 6 sqft_lot 21597 non-null int64 \n", + " 7 floors 21597 non-null float64\n", + " 8 waterfront 19221 non-null object \n", + " 9 view 21534 non-null object \n", + " 10 condition 21597 non-null object \n", + " 11 grade 21597 non-null object \n", + " 12 sqft_above 21597 non-null int64 \n", + " 13 sqft_basement 21597 non-null object \n", + " 14 yr_built 21597 non-null int64 \n", + " 15 yr_renovated 17755 non-null float64\n", + " 16 zipcode 21597 non-null int64 \n", + " 17 lat 21597 non-null float64\n", + " 18 long 21597 non-null float64\n", + " 19 sqft_living15 21597 non-null int64 \n", + " 20 sqft_lot15 21597 non-null int64 \n", + "dtypes: float64(6), int64(9), object(6)\n", + "memory usage: 3.5+ MB\n" + ] + } + ], + "source": [ + "df.info()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Before conducting regression analysis, six non-numeric columns in the data—\"date\", \"waterfront\", \"view\", \"condition\", \"grade\", and \"sqft_basement\"—will require manipulation or removal." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Data Preparation" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Data Cleaning\n", + "Drop irrelevant columns, address missing values and manipulate data into desired forms" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [], + "source": [ + "#drop irrelevant columns\n", + "df.drop(['id', 'date', 'zipcode', 'lat', 'long', 'yr_renovated', 'view'],\n", + " axis=1, inplace=True)" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [], + "source": [ + "#fill in missing sqft_basement values\n", + "df.loc[df.sqft_basement == '?', 'sqft_basement'] = (\n", + " df[df.sqft_basement == '?'].sqft_living - \n", + " df[df.sqft_basement == '?'].sqft_above\n", + ")\n", + "\n", + "#convert into numeric\n", + "df['sqft_basement'] = df.sqft_basement.astype('float64')\n", + "\n", + "#sqft_basement is a zero inflated variable, so I convert it into \n", + "#a categorical variable\n", + "df['is_basement'] = df.sqft_basement.map(lambda x: 0 if x == 0 else 1)\n", + "df.drop('sqft_basement', axis=1, inplace=True)" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [], + "source": [ + "#convert condition and grade into numeric values\n", + "df['condition'] = df.condition.map(lambda x: 0 if x=='Poor' \n", + " else (1 if x=='Fair'\n", + " else (2 if x=='Average'\n", + " else (3 if x=='Good' else 4))))\n", + "\n", + "df['grade'] = df.grade.map(lambda x: int(x[0:2]) - 3)" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [], + "source": [ + "#convert waterfront strings to 0 and 1\n", + "df['waterfront'] = df.waterfront.map(lambda x: 0 if x==\"NO\" \n", + " else (1 if x==\"YES\" else None))\n", + "\n", + "#create new column indicating if waterfront value is missing\n", + "waterfront = df[[\"waterfront\"]]\n", + "missing_indicator = MissingIndicator()\n", + "missing_indicator.fit(waterfront)\n", + "waterfront_missing = missing_indicator.transform(waterfront)\n", + "\n", + "#add waterfront missing to dataframe and convert to binary\n", + "df['waterfront_missing'] = waterfront_missing\n", + "\n", + "df['waterfront_missing'] = df.waterfront_missing.map(lambda x: 0 if x==False\n", + " else 1)" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": {}, + "outputs": [], + "source": [ + "#fill in missing waterfront values with median\n", + "imputer = SimpleImputer(strategy=\"median\")\n", + "\n", + "imputer.fit(waterfront)\n", + "waterfront_imputed = imputer.transform(waterfront)\n", + "\n", + "df['waterfront'] = waterfront_imputed" ] } ], From f7904674776620894a789f559ddd99ba88078fdf Mon Sep 17 00:00:00 2001 From: clydeochieng <107258512+clydeochieng@users.noreply.github.com> Date: Sun, 28 Apr 2024 18:27:52 +0300 Subject: [PATCH 08/42] Update student.ipynb --- student.ipynb | 159 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 159 insertions(+) diff --git a/student.ipynb b/student.ipynb index 013a05d1..11c2db8d 100644 --- a/student.ipynb +++ b/student.ipynb @@ -491,6 +491,165 @@ "\n", "df['waterfront'] = waterfront_imputed" ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "##### Removing irrelvant columns" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "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", + "
idpricebedroomsbathroomssqft_livingsqft_lotfloorswaterfrontconditiongradeyr_built
07129300520221900.031.00118056501.0NaNAverage7 Average1955
16414100192538000.032.25257072422.0NOAverage7 Average1951
25631500400180000.021.00770100001.0NOAverage6 Low Average1933
32487200875604000.043.00196050001.0NOVery Good7 Average1965
41954400510510000.032.00168080801.0NOAverage8 Good1987
\n", + "
" + ], + "text/plain": [ + " id price bedrooms bathrooms sqft_living sqft_lot floors \\\n", + "0 7129300520 221900.0 3 1.00 1180 5650 1.0 \n", + "1 6414100192 538000.0 3 2.25 2570 7242 2.0 \n", + "2 5631500400 180000.0 2 1.00 770 10000 1.0 \n", + "3 2487200875 604000.0 4 3.00 1960 5000 1.0 \n", + "4 1954400510 510000.0 3 2.00 1680 8080 1.0 \n", + "\n", + " waterfront condition grade yr_built \n", + "0 NaN Average 7 Average 1955 \n", + "1 NO Average 7 Average 1951 \n", + "2 NO Average 6 Low Average 1933 \n", + "3 NO Very Good 7 Average 1965 \n", + "4 NO Average 8 Good 1987 " + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# reading the csv file\n", + "# drop irrelevant columns\n", + "df = pd.read_csv('data/kc_house_data.csv').drop(['date',\n", + " 'view', \n", + " 'sqft_above', \n", + " 'sqft_basement', \n", + " 'yr_renovated',\n", + " 'zipcode', \n", + " 'lat', \n", + " 'long', \n", + " 'sqft_living15',\n", + " 'sqft_lot15'], axis = 1)\n", + "# previewing the DataFrame\n", + "df.head()" + ] } ], "metadata": { From d0245ea30107cb1beee26f9fa15cc74814b104f5 Mon Sep 17 00:00:00 2001 From: clydeochieng <107258512+clydeochieng@users.noreply.github.com> Date: Sun, 28 Apr 2024 19:54:11 +0300 Subject: [PATCH 09/42] Update student.ipynb --- student.ipynb | 341 ++++++++++++++++++++------------------------------ 1 file changed, 134 insertions(+), 207 deletions(-) diff --git a/student.ipynb b/student.ipynb index 11c2db8d..52ce98fd 100644 --- a/student.ipynb +++ b/student.ipynb @@ -54,7 +54,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Data Understanding:\n", + "### Data Understanding:\n", "\n", "The real estate agency in Kingsway is analyzing a dataset to determine the factors affecting house prices. The dataset likely includes features such as property size, location, age, and market trends. Key steps include assessing data quality, exploring relationships between features and prices, and preprocessing data for multilinear regression analysis. Multilinear regression will be used to model how these features collectively influence house prices, with evaluation metrics used to assess predictive accuracy." ] @@ -99,21 +99,26 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 50, "metadata": {}, "outputs": [], "source": [ - "#import libraries\n", + "#importing libraries \n", "import pandas as pd\n", "import numpy as np\n", - "import scipy.stats as stats\n", - "import math\n", - "import matplotlib.pyplot as plt\n", - "from sklearn.impute import MissingIndicator\n", - "from sklearn.impute import SimpleImputer\n", + "from matplotlib import pyplot as plt\n", + "import seaborn as sns\n", + "from sklearn import metrics\n", + "from sklearn.preprocessing import OneHotEncoder, StandardScaler\n", "from sklearn.linear_model import LinearRegression\n", + "import statsmodels.api as sm\n", + "from statsmodels.formula.api import ols\n", + "from scipy import stats\n", + "from sklearn.linear_model import LinearRegression\n", + "from sklearn import tree\n", "from sklearn.model_selection import train_test_split\n", - "from sklearn import preprocessing" + "from sklearn.tree import DecisionTreeRegressor\n", + "from sklearn.dummy import DummyRegressor" ] }, { @@ -125,7 +130,7 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 51, "metadata": {}, "outputs": [ { @@ -177,12 +182,12 @@ " 0\n", " 7129300520\n", " 10/13/2014\n", - " 221900.0\n", + " 221900.00000\n", " 3\n", - " 1.00\n", + " 1.00000\n", " 1180\n", " 5650\n", - " 1.0\n", + " 1.00000\n", " NaN\n", " NONE\n", " ...\n", @@ -190,10 +195,10 @@ " 1180\n", " 0.0\n", " 1955\n", - " 0.0\n", + " 0.00000\n", " 98178\n", - " 47.5112\n", - " -122.257\n", + " 47.51120\n", + " -122.25700\n", " 1340\n", " 5650\n", " \n", @@ -201,12 +206,12 @@ " 1\n", " 6414100192\n", " 12/9/2014\n", - " 538000.0\n", + " 538000.00000\n", " 3\n", - " 2.25\n", + " 2.25000\n", " 2570\n", " 7242\n", - " 2.0\n", + " 2.00000\n", " NO\n", " NONE\n", " ...\n", @@ -214,10 +219,10 @@ " 2170\n", " 400.0\n", " 1951\n", - " 1991.0\n", + " 1991.00000\n", " 98125\n", - " 47.7210\n", - " -122.319\n", + " 47.72100\n", + " -122.31900\n", " 1690\n", " 7639\n", " \n", @@ -225,12 +230,12 @@ " 2\n", " 5631500400\n", " 2/25/2015\n", - " 180000.0\n", + " 180000.00000\n", " 2\n", - " 1.00\n", + " 1.00000\n", " 770\n", " 10000\n", - " 1.0\n", + " 1.00000\n", " NO\n", " NONE\n", " ...\n", @@ -240,8 +245,8 @@ " 1933\n", " NaN\n", " 98028\n", - " 47.7379\n", - " -122.233\n", + " 47.73790\n", + " -122.23300\n", " 2720\n", " 8062\n", " \n", @@ -249,12 +254,12 @@ " 3\n", " 2487200875\n", " 12/9/2014\n", - " 604000.0\n", + " 604000.00000\n", " 4\n", - " 3.00\n", + " 3.00000\n", " 1960\n", " 5000\n", - " 1.0\n", + " 1.00000\n", " NO\n", " NONE\n", " ...\n", @@ -262,10 +267,10 @@ " 1050\n", " 910.0\n", " 1965\n", - " 0.0\n", + " 0.00000\n", " 98136\n", - " 47.5208\n", - " -122.393\n", + " 47.52080\n", + " -122.39300\n", " 1360\n", " 5000\n", " \n", @@ -273,12 +278,12 @@ " 4\n", " 1954400510\n", " 2/18/2015\n", - " 510000.0\n", + " 510000.00000\n", " 3\n", - " 2.00\n", + " 2.00000\n", " 1680\n", " 8080\n", - " 1.0\n", + " 1.00000\n", " NO\n", " NONE\n", " ...\n", @@ -286,10 +291,10 @@ " 1680\n", " 0.0\n", " 1987\n", - " 0.0\n", + " 0.00000\n", " 98074\n", - " 47.6168\n", - " -122.045\n", + " 47.61680\n", + " -122.04500\n", " 1800\n", " 7503\n", " \n", @@ -299,26 +304,26 @@ "" ], "text/plain": [ - " id date price bedrooms bathrooms sqft_living \\\n", - "0 7129300520 10/13/2014 221900.0 3 1.00 1180 \n", - "1 6414100192 12/9/2014 538000.0 3 2.25 2570 \n", - "2 5631500400 2/25/2015 180000.0 2 1.00 770 \n", - "3 2487200875 12/9/2014 604000.0 4 3.00 1960 \n", - "4 1954400510 2/18/2015 510000.0 3 2.00 1680 \n", + " id date price bedrooms bathrooms sqft_living \\\n", + "0 7129300520 10/13/2014 221900.00000 3 1.00000 1180 \n", + "1 6414100192 12/9/2014 538000.00000 3 2.25000 2570 \n", + "2 5631500400 2/25/2015 180000.00000 2 1.00000 770 \n", + "3 2487200875 12/9/2014 604000.00000 4 3.00000 1960 \n", + "4 1954400510 2/18/2015 510000.00000 3 2.00000 1680 \n", "\n", " sqft_lot floors waterfront view ... grade sqft_above \\\n", - "0 5650 1.0 NaN NONE ... 7 Average 1180 \n", - "1 7242 2.0 NO NONE ... 7 Average 2170 \n", - "2 10000 1.0 NO NONE ... 6 Low Average 770 \n", - "3 5000 1.0 NO NONE ... 7 Average 1050 \n", - "4 8080 1.0 NO NONE ... 8 Good 1680 \n", + "0 5650 1.00000 NaN NONE ... 7 Average 1180 \n", + "1 7242 2.00000 NO NONE ... 7 Average 2170 \n", + "2 10000 1.00000 NO NONE ... 6 Low Average 770 \n", + "3 5000 1.00000 NO NONE ... 7 Average 1050 \n", + "4 8080 1.00000 NO NONE ... 8 Good 1680 \n", "\n", - " sqft_basement yr_built yr_renovated zipcode lat long \\\n", - "0 0.0 1955 0.0 98178 47.5112 -122.257 \n", - "1 400.0 1951 1991.0 98125 47.7210 -122.319 \n", - "2 0.0 1933 NaN 98028 47.7379 -122.233 \n", - "3 910.0 1965 0.0 98136 47.5208 -122.393 \n", - "4 0.0 1987 0.0 98074 47.6168 -122.045 \n", + " sqft_basement yr_built yr_renovated zipcode lat long \\\n", + "0 0.0 1955 0.00000 98178 47.51120 -122.25700 \n", + "1 400.0 1951 1991.00000 98125 47.72100 -122.31900 \n", + "2 0.0 1933 NaN 98028 47.73790 -122.23300 \n", + "3 910.0 1965 0.00000 98136 47.52080 -122.39300 \n", + "4 0.0 1987 0.00000 98074 47.61680 -122.04500 \n", "\n", " sqft_living15 sqft_lot15 \n", "0 1340 5650 \n", @@ -330,7 +335,7 @@ "[5 rows x 21 columns]" ] }, - "execution_count": 14, + "execution_count": 51, "metadata": {}, "output_type": "execute_result" } @@ -338,12 +343,12 @@ "source": [ "#load and preiview data\n", "df = pd.read_csv('data/kc_house_data.csv')\n", - "df.head(5)\n" + "df.head()\n" ] }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 52, "metadata": {}, "outputs": [ { @@ -389,7 +394,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Before conducting regression analysis, six non-numeric columns in the data—\"date\", \"waterfront\", \"view\", \"condition\", \"grade\", and \"sqft_basement\"—will require manipulation or removal." + "We see that waterfrront is missing about 11% of its values, year renovated is missing about 17% of its values and view is missing a few values as well. " ] }, { @@ -403,13 +408,12 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "### Data Cleaning\n", - "Drop irrelevant columns, address missing values and manipulate data into desired forms" + "### Data Cleaning\n" ] }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 53, "metadata": {}, "outputs": [], "source": [ @@ -420,7 +424,7 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 54, "metadata": {}, "outputs": [], "source": [ @@ -441,7 +445,7 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": 55, "metadata": {}, "outputs": [], "source": [ @@ -456,7 +460,7 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": 56, "metadata": {}, "outputs": [], "source": [ @@ -474,12 +478,12 @@ "df['waterfront_missing'] = waterfront_missing\n", "\n", "df['waterfront_missing'] = df.waterfront_missing.map(lambda x: 0 if x==False\n", - " else 1)" + " else 1)\n" ] }, { "cell_type": "code", - "execution_count": 20, + "execution_count": 57, "metadata": {}, "outputs": [], "source": [ @@ -493,162 +497,85 @@ ] }, { - "cell_type": "markdown", + "cell_type": "code", + "execution_count": 58, "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "Index: 19479 entries, 0 to 21596\n", + "Data columns (total 12 columns):\n", + " # Column Non-Null Count Dtype \n", + "--- ------ -------------- ----- \n", + " 0 price 19479 non-null float64\n", + " 1 bedrooms 19479 non-null float64\n", + " 2 bathrooms 19479 non-null float64\n", + " 3 sqft_living 19479 non-null float64\n", + " 4 sqft_lot 19479 non-null float64\n", + " 5 floors 19479 non-null float64\n", + " 6 sqft_above 19479 non-null float64\n", + " 7 sqft_living15 19479 non-null float64\n", + " 8 sqft_lot15 19479 non-null float64\n", + " 9 grade_num 19479 non-null float64\n", + " 10 bed_bath_ratio 19479 non-null float64\n", + " 11 mean_price 19479 non-null float64\n", + "dtypes: float64(12)\n", + "memory usage: 1.9 MB\n" + ] + } + ], "source": [ - "##### Removing irrelvant columns" + "#removing outliers \n", + "\n", + "#make a copy of the clean dataframe \n", + "no_out = main_df.copy()\n", + "\n", + "#drop columns that we cannot use \n", + "no_out = no_out.drop(columns= ['id', 'zip_city', 'Waterfront'], axis=1)\n", + "\n", + "#change data type so that we can math \n", + "no_out = no_out.astype('float')\n", + "\n", + "#pull out the columns \n", + "columns = no_out.columns\n", + "\n", + "#for each column in the dataframe, get the mean and standard deviation \n", + "#then get the z-score for within 3 standard devaitions\n", + "for col in columns:\n", + " \n", + " mean = no_out[col].mean()\n", + " sd = no_out[col].std()\n", + " \n", + " no_out = no_out[(no_out[col] <= mean+(3*sd))]\n", + " \n", + "pd.set_option('display.float_format', lambda x: '%.5f' % x)\n", + "no_out.info()" ] }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 59, "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", - "
idpricebedroomsbathroomssqft_livingsqft_lotfloorswaterfrontconditiongradeyr_built
07129300520221900.031.00118056501.0NaNAverage7 Average1955
16414100192538000.032.25257072422.0NOAverage7 Average1951
25631500400180000.021.00770100001.0NOAverage6 Low Average1933
32487200875604000.043.00196050001.0NOVery Good7 Average1965
41954400510510000.032.00168080801.0NOAverage8 Good1987
\n", - "
" - ], + "image/png": "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11xzTcrLyzNixIhccMEFOffcc3PllVcmSfbcc8/84x//yI033ph///vfGTBgQH70ox/l1VdfTZKMGDEie+21Vw488MCMHj06G2+8cU4//fQ5nuO1117LzTffnNtuuy2jR49Okmy//faZPHlyHnnkkdx///0ZO3Zsdt5555p1br/99hx22GE54ogj8vzzz2f//ffPnnvumYcffrjWtk877bQMHDgwo0ePzrLLLptdd901+++/f4YMGVJTVhx88ME143fbbbcsuuiiGTlyZEaNGpVjjz02FRUVdXpMAQAAAABgfpSXOkDR9OzZM+eee27KysqyzDLL5Lnnnsu5556bTTbZJH/+85/zzjvvpEePHkmSI488Mvfee2+uvvrq/Pa3v83555+fLbfcMscee2ySpE+fPnniiSdy77331nqOGTNm5Nprr03nzp2TJPfff3/+/e9/54033kjPnj2TJNdee22WX375jBw5MmussUbOPvvsDBo0KAceeGCSZPDgwXnqqady9tlnZ+ONN67Z9p577pmddtopSXLMMcdknXXWyQknnJAtt9wySXLYYYdlzz33rBk/bty4HHXUUVl22WWTJEsvvfQ3Hp/p06dn+vTptZbNqq5MeVnjBTjKAAAAAAAwJzM1FtDaa6+dsrKymvvrrLNOXn311Tz99NOprq5Onz590qpVq5rbI488UnM6pzFjxmSdddaptb2v30+SXr161RQa/12vZ8+eNYVGkvTt2zft2rXLmDFjasb079+/1nb69+9f8/h/rbjiijX/7tq1a5KkX79+tZZ98cUXmTZtWpLZ5cg+++yTzTbbLL/73e9qnZpqbs4444y0bdu21u3JqS9+4zoAAAAAADA/lBp1qHHjxhk1alRGjx5dcxszZkzOP//8JKm59sa3admyZa371dXVtYqUeS3/+pi5rffVU0f997G5Lauqmn0OtZNPPjkvvPBCtt566zz00EPp27dvbr/99nlmHzJkSKZOnVrrtk7bvt+4vwAAAAAAMD+UGgvoqaeemuP+0ksvnVVWWSWVlZWZMGFCllpqqVq3bt26JZk9u2Ju63+bvn37Zty4cXn77bdrlr344ouZOnVqlltuuSTJcsstl8cff7zWek888UTN4/+LPn365Fe/+lXuu+++7Ljjjrn66qvnObZp06Zp06ZNrZtTTwEAAAAAUBdcU2MBvf32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J2fllVfOVVddlcUWWyytWrXKAQcckMrKyvz+979Pt27d0qVLl/zmN7+ptd2TTz45iy22WJo2bZoePXrk0EMPrZPjCwAAAABQL6qq3Bb0VhBKjW9wzTXXpLy8PCNGjMgFF1yQc889N1deeWWSZMaMGTnttNPyr3/9K3fccUfeeOONmuKiZ8+eue2225IkL7/8csaPH5/zzz+/1nZbtmyZESNG5Pe//31OPfXU3H///bWe+6STTsp2222X5557LnvttVduv/32HHbYYTniiCPy/PPPZ//998+ee+6Zhx9+OElSXV2d7bffPpMnT84jjzyS+++/P2PHjs3OO+9ca7tjx47N3/72t9x7773585//nKuuuipbb7113nnnnTzyyCM588wzc/zxx+epp55Kktx6660599xzc/nll+fVV1/NHXfckX79+tXL8QYAAAAAgG9SXuoA32c9e/bMueeem7KysiyzzDJ57rnncu6552bffffNXnvtVTNuiSWWyAUXXJA111wzn3zySVq1apUOHTokSbp06ZJ27drV2u6KK66Yk046KUmy9NJL56KLLsqDDz6YzTffvGbMrrvuWus5dt111wwaNCgHHnhgkmTw4MF56qmncvbZZ2fjjTfOAw88kH//+99544030rNnzyTJtddem+WXXz4jR47MGmuskWT2LJGrrroqrVu3Tt++fbPxxhvn5Zdfzj333JNGjRplmWWWyZlnnpnhw4dn7bXXzrhx49KtW7dsttlmqaioyGKLLZY111yz7g82AAAAAAB8CzM1vsHaa6+dsrKymvvrrLNOXn311VRWVubZZ5/Ndtttl169eqV169bZaKONksw+BdS3WXHFFWvd7969e82pq/5r9dVXr3V/zJgx6d+/f61l/fv3z5gxY2oe79mzZ02hkSR9+/ZNu3btasYkSe/evdO6deua+127dk3fvn3TqFGjWsv+m2fAgAH5/PPPs8QSS2TffffN7bffnlmzZs1z36ZPn55p06bVus2orvzG4wEAAAAAAPNDqfEdfPHFF9liiy3SqlWrXHfddRk5cmRuv/32JLNPS/VtKioqat0vKytL1dfOWdayZcs51vtqwZLMPuXUf5d99d/zGjOv5/6mPD179szLL7+ciy++OM2bN8+BBx6YDTbYYJ4XLz/jjDPStm3bWrcrPxo717EAAAAAALAglBrf4L/Xlfjq/aWXXjovvfRSJk6cmN/97ndZf/31s+yyy84x06JJkyZJksrKupmlsNxyy+Xxxx+vteyJJ57Icsstl2T2rIxx48bl7bffrnn8xRdfzNSpU2vGfFfNmzfPtttumwsuuCDDhw/Pk08+meeee26uY4cMGZKpU6fWuu3Tbsn/6fkBAAAAACBxTY1v9Pbbb2fw4MHZf//988wzz+TCCy/M0KFDs9hii6VJkya58MIL88tf/jLPP/98TjvttFrr9urVK2VlZbn77rvz4x//OM2bN0+rVq2+c5ajjjoqO+20U1ZdddVsuummueuuu/KXv/wlDzzwQJJks802y4orrpjddtst5513XmbNmpUDDzwwG2644RynsloQw4YNS2VlZdZaa620aNEi1157bZo3b55evXrNdXzTpk3TtGnTWsualDX+zs8PAAAAALDAvnZmHBoOMzW+wcCBA/P5559nzTXXzEEHHZRDDjkk++23Xzp37pxhw4bllltuSd++ffO73/0uZ599dq11F1lkkZxyyik59thj07Vr1xx88MH/U5btt98+559/fs4666wsv/zyufzyy3P11VfXXMujrKwsd9xxR9q3b58NNtggm222WZZYYoncdNNN/9PztmvXLldccUX69++fFVdcMQ8++GDuuuuudOzY8X/aLgAAAAAALKiy6urq6lKHoGF7fomflDpCgzGrUg9ZF5YfdV6pIzQYM68+vdQRGowVzny21BEahJubzX0mIQtum09eKXWEBqNbs/aljtAgDN+qeakjNBiNmld8+yDmy6t3NSl1hAahY+dPSx2hwdh43KRSR2gwFm3aodQRGoQnP3yp1BEajJkz3i11hML5/OZTSx2hcJrvdGKpI8wXfyEFAAAAAAAKQakBAAAAAAAUglIDAAAAAAAohPJSBwAAAAAAgDrlUtINlpkaAAAAAABAISg1AAAAAACAQlBqAAAAAAAAhaDUAAAAAAAACkGpAQAAAAAAFEJ5qQMAAAAAAECdqqoqdQLqiZkaAAAAAABAISg1AAAAAACAQlBqAAAAAAAAhaDUAAAAAAAACkGpAQAAAAAAFEJ5qQMAAAAAAECdqqoqdQLqiZkaAAAAAABAISg1AAAAAACAQlBqAAAAAAAAhaDUAAAAAAAACkGpAQAAAAAAFEJ5qQMAAAAAAECdqq4qdQLqiZkaAAAAAABAISg1AAAAAACAQlBqAAAAAAAAhaDUAAAAAAAACkGpAQAAAAAAFEJ5qQMAAAAAAECdqqoqdQLqiZkaAAAAAABAISg1AAAAAACAQlBqAAAAAAAAhaDUAAAAAAAACkGpAQAAAAAAFEJ5qQMAAAAAAECdqq4udQLqiZkaAAAAAABAISg1AAAAAACAQlBqAAAAAAAAhaDUAAAAAAAACkGpAQAAAAAAFEJ5qQMAAAAAAECdqqoqdQLqiZkaAAAAAABAISg1AAAAAACAQlBqAAAAAAAAC+ySSy7J4osvnmbNmmW11VbLY4899o3jr7/++qy00kpp0aJFunfvnj333DOTJk1aoOdUagAAAAAAAAvkpptuyuGHH57jjjsuzz77bNZff/1stdVWGTdu3FzHP/744xk4cGD23nvvvPDCC7nlllsycuTI7LPPPgv0vEoNAAAAAABggZxzzjnZe++9s88++2S55ZbLeeedl549e+bSSy+d6/innnoqvXv3zqGHHprFF1886623Xvbff/88/fTTC/S8Sg0AAAAAABqWqiq3BbxNnz4906ZNq3WbPn36XA/vjBkzMmrUqGyxxRa1lm+xxRZ54okn5rrOuuuum3feeSf33HNPqqur88EHH+TWW2/N1ltvvUD/teULNBq+g97b687qypTHPi11hAZh5tWnlzpCg1Gx5/GljtBgLH7+L0sdoUF4pFGrUkdoMNo2aVnqCA3G+C8mlzpCg1DRb71SR2gwylZao9QRGow77nmk1BEahGN/3rHUERqMpS+oKHWEBqNZWeNSRwBY6M4444yccsoptZaddNJJOfnkk+cYO3HixFRWVqZr1661lnft2jXvv//+XLe/7rrr5vrrr8/OO++cL774IrNmzcq2226bCy+8cIFy+mszAAAAAAD8wA0ZMiRTp06tdRsyZMg3rlNWVlbrfnV19RzL/uvFF1/MoYcemhNPPDGjRo3KvffemzfeeCO//OWCfdDTTA0AAAAAAPiBa9q0aZo2bTpfYzt16pTGjRvPMStjwoQJc8ze+K8zzjgj/fv3z1FHHZUkWXHFFdOyZcusv/76Of3009O9e/f5em4zNQAAAAAAgPnWpEmTrLbaarn//vtrLb///vuz7rrrznWdzz77LI0a1a4kGjeefbq/6urq+X5upQYAAAAAALBABg8enCuvvDJXXXVVxowZk1/96lcZN25czemkhgwZkoEDB9aM32abbfKXv/wll156aV5//fX84x//yKGHHpo111wzPXr0mO/ndfopAAAAAAAaluqqUido8HbeeedMmjQpp556asaPH58VVlgh99xzT3r16pUkGT9+fMaNG1czftCgQfn4449z0UUX5Ygjjki7du2yySab5Mwzz1yg51VqAAAAAAAAC+zAAw/MgQceONfHhg0bNseyQw45JIcccsj/9JxOPwUAAAAAABSCUgMAAAAAACgEpQYAAAAAAFAISg0AAAAAAKAQXCgcAAAAAIAGpbqqutQRqCdmagAAAAAAAIWg1AAAAAAAAApBqQEAAAAAABSCUgMAAAAAACgEpQYAAAAAAFAI5aUOAAAAAAAAdaqqqtQJqCdmagAAAAAAAIWg1AAAAAAAAApBqQEAAAAAABSCUgMAAAAAACgEpQYAAAAAAFAI5aUOAAAAAAAAdaq6qtQJqCdmagAAAAAAAIWg1AAAAAAAAApBqQEAAAAAABSCUgMAAAAAACgEpQYAAAAAAFAI5aUOAAAAAAAAdaqqutQJqCdmagAAAAAAAIWg1AAAAAAAAApBqQEAAAAAABSCUgMAAAAAACgEpQYAAAAAAFAI5aUOAAAAAAAAdaqqqtQJqCdmagAAAAAAAIWg1AAAAAAAAApBqQEAAAAAABSCUgMAAAAAACgEpQYAAAAAAFAI5aUOAAAAAAAAdaqqqtQJqCdmagAAAAAAAIWg1AAAAAAAAApBqQEAAAAAABSCUmMhqK6uzn777ZcOHTqkrKwso0ePXuBtnHzyyVl55ZVr7g8aNCjbb7/9d14fAAAAAACKRqmxENx7770ZNmxY7r777owfPz4rrLBCysrKcscdd3znbZ5//vkZNmzYfI8/8sgj8+CDD37n5wMAAAAAgFIrL3WAH4KxY8eme/fuWXfddetsm23btl2g8a1atUqrVq3q7PkBAAAAAL63qqtLnYB6YqbGfLr11lvTr1+/NG/ePB07dsxmm22WTz/9NJWVlRk8eHDatWuXjh075uijj84ee+xRc2qoQYMG5ZBDDsm4ceNSVlaW3r17p3fv3kmSHXbYoWbZgvrq6acuv/zyLLLIIqmqqqo1Ztttt80ee+yRZN6nrzr77LPTvXv3dOzYMQcddFBmzpxZM2b8+PHZeuut07x58yy++OK54YYb0rt375x33nkLnBcAAAAAAP5XSo35MH78+Pz85z/PXnvtlTFjxmT48OHZcccdU11dnaFDh+aqq67KH//4xzz++OOZPHlybr/99pp1zz///Jx66qlZdNFFM378+IwcOTIjR45Mklx99dU1y/4XAwYMyMSJE/Pwww/XLJsyZUr+/ve/Z7fddpvneg8//HDGjh2bhx9+ONdcc02GDRtW65RWAwcOzHvvvZfhw4fntttuyx/+8IdMmDDhf8oKAAAAAADfldNPzYfx48dn1qxZ2XHHHdOrV68kSb9+/ZIk5513XoYMGZKf/vSnSZLLLrssf//732vWbdu2bVq3bp3GjRunW7dutbbbrl27OZZ9Fx06dMiPfvSj3HDDDdl0002TJLfccks6dOhQc39u2rdvn4suuiiNGzfOsssum6233joPPvhg9t1337z00kt54IEHMnLkyKy++upJkiuvvDJLL730N2aZPn16pk+fXmvZzFmVaVre+H/cSwAAAAAAfujM1JgPK620UjbddNP069cvAwYMyBVXXJEpU6Zk6tSpGT9+fNZZZ52aseXl5TUlwMK022675bbbbqspFK6//vrssssuadx43mXC8ssvX+vx7t2718zEePnll1NeXp5VV1215vGllloq7du3/8YcZ5xxRtq2bVvrNnTka//LrgEAAAAAQBKlxnxp3Lhx7r///vztb39L3759c+GFF2aZZZbJm2++WepoNbbZZptUVVXlr3/9a95+++089thj2X333b9xnYqKilr3y8rKaq7LUT2PC+nMa/l/DRkyJFOnTq11O2KNpRZgTwAAAAAAYO6cfmo+lZWVpX///unfv39OPPHE9OrVKw8++GC6d++ep556KhtssEGSZNasWRk1alStGQ5zU1FRkcrKyjrL17x58+y44465/vrr89prr6VPnz5ZbbXVvvP2ll122cyaNSvPPvtszXZee+21fPTRR9+4XtOmTdO0adNayz5x6ikAAAAAYGH6z4e3aXiUGvNhxIgRefDBB7PFFlukS5cuGTFiRD788MMst9xyOeyww/K73/0uSy+9dJZbbrmcc8453/qH/yTp3bt3HnzwwfTv3z9Nmzb91tM6zY/ddtst22yzTV544YVvnaXxbZZddtlsttlm2W+//XLppZemoqIiRxxxRJo3b56ysrL/OSsAAAAAACwop5+aD23atMmjjz6aH//4x+nTp0+OP/74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q/LHP/4xjz/+eCZPnpzbb7+9Zt3zzz+/pnwYP358Ro4cmZEjRyZJrr766pplC+r888/P0KFDc/bZZ+ff//53ttxyy2y77bZ59dVXkyT//Oc/kyQPPPBAxo8fn7/85S91cCQAAAAAAGD+Of1UCYwfPz6zZs3KjjvumF69eiVJ+vXrlyQ577zzMmTIkPz0pz9Nklx22WX5+9//XrNu27Zt07p16zRu3DjdunWrtd127drNsWx+nX322TnmmGOyyy67JEnOPPPMPPzwwznvvPNy8cUXp3PnzkmSjh07fuNzTJ8+PdOnT6+1rLq6KmVl+jMAAAAAAP43/tJcAiuttFI23XTT9OvXLwMGDMgVV1yRKVOmZOrUqRk/fnzWWWedmrHl5eVZffXV6zXPtGnT8t5776V///61lvfv3z9jxoxZoG2dccYZadu2ba3bR59/UJdxAQAAAAD4gVJqlEDjxo1z//33529/+1v69u2bCy+8MMsss0zefPPNkuYqKyurdb+6unqOZd9myJAhmTp1aq1bu+Zd6zImAAAAAMA3qq6qdlvAW1EoNUqkrKws/fv3zymnnJJnn302TZo0yYMPPpju3bvnqaeeqhk3a9asjBo16lu3V1FRkcrKyu+UpU2bNunRo0cef/zxWsufeOKJLLfcckmSJk2aJMm3PkfTpk3Tpk2bWjenngIAAAAAoC64pkYJjBgxIg8++GC22GKLdOnSJSNGjMiHH36Y5ZZbLocddlh+97vfZemll85yyy2Xc845Jx999NG3brN379558MEH079//zRt2jTt27dfoExHHXVUTjrppCy55JJZeeWVc/XVV2f06NG5/vrrkyRdunRJ8+bNc++992bRRRdNs2bN0rZt2++y+wAAAAAA8J0oNUqgTZs2efTRR3Peeedl2rRp6dWrV4YOHZqtttoqm2++ecaPH59BgwalUaNG2WuvvbLDDjtk6tSp37jNoUOHZvDgwbniiiuyyCKLLPCprA499NBMmzYtRxxxRCZMmJC+ffvmzjvvzNJLL51k9rU9Lrjggpx66qk58cQTs/7662f48OHf8QgAAAAAAMCCK6uuri7OybJ+oAYNGpSPPvood9xxR6mjfCdLdFql1BEajImff3O5xfzp1Nwso7qyeLPOpY7QYNw7+rJSR2gQWvRYv9QRGozyxj77Ulcqq77bKUKprU+7RUsdocFYpMmCzepm3p6Z9nqpIzQIi7fsVuoIDcZDe3QqdYQGo8cFz5Y6QoPw2czppY7QYMya8W6pIxTOx4dvU+oIhdP6vLtKHWG+uNgBAAAAAABQCD6C10Atv/zyeeutt+b62OWXX57ddtttIScCAAAAAFhIqpygqKFSahTAsGHDFnide+65JzNnzpzrY127dv0fEwEAAAAAwMKn1GigevXqVeoIAAAAAABQp1xTAwAAAAAAKASlBgAAAAAAUAhKDQAAAAAAoBBcUwMAAAAAgIalqqrUCagnZmoAAAAAAACFoNQAAAAAAAAKQakBAAAAAAAUglIDAAAAAAAoBKUGAAAAAABQCOWlDgAAAAAAAHWqqrrUCagnZmoAAAAAAACFoNQAAAAAAAAKQakBAAAAAAAUglIDAAAAAAAoBKUGAAAAAABQCOWlDgAAAAAAAHWqqrrUCagnZmoAAAAAAACFoNQAAAAAAAAKQakBAAAAAAAUglIDAAAAAAAoBKUGAAAAAABQCOWlDgAAAAAAAHWpurq61BGoJ2ZqAAAAAAAAhaDUAAAAAAAACkGpAQAAAAAAFIJSAwAAAAAAKASlBgAAAAAAUAjlpQ4AAAAAAAB1qqq61AmoJ2ZqAAAAAAAAhaDUAAAAAAAACkGpAQAAAAAAFIJSAwAAAAAAKASlBgAAAAAAUAjlpQ4AAAAAAAB1qqq61AmoJ2ZqAAAAAAAAhaDUAAAAAAAACkGpAQAAAAAAFIJSAwAAAAAAKASlBgAAAAAAUAjlpQ4AAAAAAAB1qbqqutQRqCdmagAAAAAAAIVgpgb1bpNWS5Y6QoPxZvOPSx2hQfhddfNSR2gwHmnUqtQRGowWPdYvdYQG4bP3Hit1hAajTc+NSx2hwdiz+zqljtAg/Oxzn8eqK90rPi11hAbjk5bLlzpCg3BDk4pSR2gwOpzzj1JHaDAGdl+71BEahGvee7LUEYAGyG8GAAAAAABAISg1AAAAAACAQlBqAAAAAAAAheCaGgAAAAAANCxV1aVOQD0xUwMAAAAAACgEpQYAAAAAAFAISg0AAAAAAKAQlBoAAAAAAEAhKDUAAAAAAIBCUGoAAAAAAACFUF7qAAAAAAAAUKeqSh2A+mKmBgAAAAAAUAhKDQAAAAAAoBCUGgAAAAAAQCEoNQAAAAAAgEJQagAAAAAAAIVQXuoAAAAAAABQl6qrqksdgXpipgYAAAAAAFAISg0AAAAAAKAQlBoAAAAAAEAhKDUAAAAAAIBCUGoAAAAAAACFUF7qAAAAAAAAUKeqqkudgHpipgYAAAAAAFAISg0AAAAAAKAQlBoAAAAAAEAhKDUAAAAAAIBCUGoAAAAAAACFUF7qAAAAAAAAUKeqSh2A+mKmBgAAAAAAUAhKDQAAAAAAoBCUGgAAAAAAQCEoNQAAAAAAgEJQagAAAAAAAIVQXuoAAAAAAABQl6qrqksdgXpipgYAAAAAAFAISg0AAAAAAKAQlBoAAAAAAEAhKDUAAAAAAIBCUGoAAAAAAACFUF7qAAAAAAAAUKeqSh2A+mKmBgAAAAAAUAhKDQAAAAAAoBCUGgAAAAAAQCEoNQqiuro6++23Xzp06JCysrK0a9cuhx9+eKljAQAAAADAQqPUKIh77703w4YNy913353x48dnhRVWKHUkAAAAAABYqMpLHYD5M3bs2HTv3j3rrrtukqS8vP7/62bMmJEmTZrU+/MAAAAAANSl6qrqUkegnpipUQCDBg3KIYccknHjxqWsrCy9e/eeY8yUKVMycODAtG/fPi1atMhWW22VV199tdaY2267Lcsvv3yaNm2a3r17Z+jQobUe7927d04//fQMGjQobdu2zb777psZM2bk4IMPTvfu3dOsWbP07t07Z5xxRn3uLgAAAAAAzJVSowDOP//8nHrqqVl00UUzfvz4jBw5co4xgwYNytNPP50777wzTz75ZKqrq/PjH/84M2fOTJKMGjUqO+20U3bZZZc899xzOfnkk3PCCSdk2LBhtbZz1llnZYUVVsioUaNywgkn5IILLsidd96Zm2++OS+//HKuu+66uZYqAAAAAABQ35x+qgDatm2b1q1bp3HjxunWrdscj7/66qu58847849//KPm9FTXX399evbsmTvuuCMDBgzIOeeck0033TQnnHBCkqRPnz558cUXc9ZZZ2XQoEE129pkk01y5JFH1twfN25cll566ay33nopKytLr1696ndnAQAAAABgHszUaADGjBmT8vLyrLXWWjXLOnbsmGWWWSZjxoypGdO/f/9a6/Xv3z+vvvpqKisra5atvvrqtcYMGjQoo0ePzjLLLJNDDz0099133zdmmT59eqZNm1brVlld+Y3rAAAAAADA/FBqNADV1XO/6E11dXXKysrm+Pc3rdeyZcta91ddddW88cYbOe200/L5559np512ys9+9rN5ZjnjjDPStm3bWrd/TX15QXcJAAAAAADmoNRoAPr27ZtZs2ZlxIgRNcsmTZqUV155Jcstt1zNmMcff7zWek888UT69OmTxo0bf+P227Rpk5133jlXXHFFbrrpptx2222ZPHnyXMcOGTIkU6dOrXVbqe0y/+MeAgAAAAAsgCq3Bb4VhGtqNABLL710tttuu+y77765/PLL07p16xx77LFZZJFFst122yVJjjjiiKyxxho57bTTsvPOO+fJJ5/MRRddlEsuueQbt33uueeme/fuWXnlldOoUaPccsst6datW9q1azfX8U2bNk3Tpk1rLWtc9s2lCQAAAAAAzA8zNRqIq6++Oquttlp+8pOfZJ111kl1dXXuueeeVFRUJJl9Gqmbb745N954Y1ZYYYWceOKJOfXUU2tdJHxuWrVqlTPPPDOrr7561lhjjbz55pu555570qiRLx0AAAAAABausup5XZAB6sg+ved9DQ4WzJuVH5c6QoPwu+rmpY7QYDzSqFWpIzQYx77/cKkjNAifvfdYqSM0GG16blzqCA3GwK5rljpCg/Czz32opq50b/lpqSM0GJ980aTUERqEG5pUlDpCg3HZ+H+UOkKDMbD72qWO0CBc896TpY7QYMyc8W6pIxTO5O02LHWEwunwf4+UOsJ88ZsBAAAAAABQCEoNAAAAAACgEFwoHAAAAACABqW6qtQJqC9magAAAAAAAIWg1AAAAAAAAApBqQEAAAAAABSCUgMAAAAAACgEpQYAAAAAAFAI5aUOAAAAAAAAdaqq1AGoL2ZqAAAAAAAAhaDUAAAAAAAACkGpAQAAAAAAFIJSAwAAAAAAKASlBgAAAAAAUAjlpQ4AAAAAAAB1qbqq1AmoL2ZqAAAAAAAAhaDUAAAAAAAACkGpAQAAAAAAFIJSAwAAAAAAKASlBgAAAAAAUAjlpQ4AAAAAAAB1qqrUAagvZmoAAAAAAACFoNQAAAAA/p+9O4/zqq73B/76ysCALMOiAioymqioKAotSCnmXtfrVq6phGnmkopLcstC08gSxeVq5Ybe1Ostl+s1U5HE9bohlDdJDUPKxi13Tbb5/v7w4fyaAGV0xuP5+nz6OI8Hc76fc86LoR7RvHx/DgBAKSg1AAAAAACAUlBqAAAAAAAApaDUAAAAAAAASqGu6AAAAAAAANCeqs1FJ6CjmNQAAAAAAABKQakBAAAAAACUglIDAAAAAAAoBaUGAAAAAABQCkoNAAAAAACgFOqKDgAAAAAAAO2p2lx0AjqKSQ0AAAAAAKAUlBoAAAAAAEApKDUAAAAAAIBSUGoAAAAAAACloNQAAAAAAABKoa7oAAAAAAAA0J6qzUUnoKOY1AAAAAAAAEpBqQEAAAAAAJSCUgMAAAAAACgFpQYAAAAAANBm559/ftZee+107do1I0aMyF133fWu6xcsWJBvf/vbGTx4cOrr6/OJT3wil1xySZue6UXhAAAAAABAm1x99dU5+uijc/7552f06NH56U9/mp122imPPvpo1lprrWVes+eee+bZZ5/NxRdfnHXXXTfPPfdcFi9e3KbnKjUAAAAAAKgt1UrRCWremWeemYMOOihf+9rXkiRTpkzJLbfckgsuuCCTJk1aav3NN9+cO+64I08++WT69u2bJGlsbGzzc20/BQAAAAAArLCFCxdm5syZ2X777Vud33777XPvvfcu85obbrghI0eOzI9+9KOsscYaWW+99XLcccfl73//e5uebVKDDtcpWtH2MuPZ/ys6Qk3YeeWGoiPUjIYu3YuOUDPqOvmf5PbQa9DWRUeoGa/++faiI9SMnmuOKTpCTbi1e5+iI9SMRS8vKTpCzXjprdeLjlATVuvm7+ftpUunzkVHqBnXvDC76Ag1ob6uS9ERgDZYsGBBFixY0OpcfX196uvrl1r7wgsvZMmSJenfv3+r8/37988zzzyzzPs/+eSTufvuu9O1a9dcd911eeGFF3LYYYflxRdfbNN7NUxqAAAAAADAx9ykSZPS0NDQ6ljWNlL/qFJp/S+0V6vVpc69o7m5OZVKJVdccUU+9alP5Qtf+ELOPPPMTJ06tU3TGv61UAAAAAAA+JibMGFCxo8f3+rcsqY0kmSVVVZJp06dlprKeO6555aa3njHwIEDs8Yaa6Sh4f9PaQ4dOjTVajV/+ctfMmTIkBXKaVIDAAAAAAA+5urr69OrV69Wx/JKjS5dumTEiBGZNm1aq/PTpk3LFltsscxrRo8enb/+9a95/fX/v4Xn448/npVWWilrrrnmCudUagAAAAAAUFOqzY62Hm01fvz4XHTRRbnkkksyZ86cHHPMMZk/f34OPfTQJG9PfhxwwAEt6/fdd9/069cvX/3qV/Poo4/mzjvvzPHHH59x48alW7duK/xc208BAAAAAABtstdee+Vvf/tbTjnllDQ1NWXjjTfOTTfdlMGDBydJmpqaMn/+/Jb1PXr0yLRp03LkkUdm5MiR6devX/bcc8+ceuqpbXquUgMAAAAAAGizww47LIcddtgyP5s6depS5zbYYIOltqxqK9tPAQAAAAAApaDUAAAAAAAASkGpAQAAAAAAlIJ3agAAAAAAUFOqzZWiI9BBTGoAAAAAAACloNQAAAAAAABKQakBAAAAAACUglIDAAAAAAAoBaUGAAAAAABQCnVFBwAAAAAAgPZUbS46AR3FpAYAAAAAAFAKSg0AAAAAAKAUlBoAAAAAAEApKDUAAAAAAIBSUGoAAAAAAAClUFd0AAAAAAAAaE/VaqXoCHQQkxoAAAAAAEApKDUAAAAAAIBSUGoAAAAAAACloNQAAAAAAABKQakBAAAAAACUQl3RAQAAAAAAoD1Vm4tOQEcxqQEAAAAAAJSCUgMAAAAAACgFpQYAAAAAAFAKSg0AAAAAAKAUlBoAAAAAAEAp1BUdAAAAAAAA2lO1uVJ0BDqISQ0AAAAAAKAUlBoAAAAAAEApKDUAAAAAAIBSUGoAAAAAAACloNQAAAAAAABKoa7oAAAAAAAA0J6q1aIT0FFMagAAAAAAAKWg1AAAAAAAAEpBqQEAAAAAAJSCUgMAAAAAACgFpUaJPfPMM9luu+3SvXv39O7du+g4AAAAAADQoZQaH6IxY8bk6KOPbrf7nXXWWWlqasrs2bPz+OOPt9t9l2XGjBmpVCp5+eWXO/Q5AAAAAAAfVLW54mjjURZ1RQeg7RYuXJguXbpk7ty5GTFiRIYMGbLctYsWLUrnzp0/xHQAAAAAANAxTGq8i//5n/9J796909zcnCSZPXt2KpVKjj/++JY1X//617PPPvvkb3/7W/bZZ5+sueaaWXnllTNs2LBcddVVLevGjh2bO+64I2effXYqlUoqlUrmzZuXJHn00UfzhS98IT169Ej//v2z//7754UXXmi5dsyYMTniiCMyfvz4rLLKKtluu+3S2NiYa665JpdffnkqlUrGjh2bJKlUKvnJT36SXXbZJd27d8+pp56aJLngggvyiU98Il26dMn666+f//iP/2j1e61UKrnooouy2267ZeWVV86QIUNyww03JEnmzZuXrbfeOknSp0+fVs8DAAAAAIAPi1LjXWy55ZZ57bXXMmvWrCTJHXfckVVWWSV33HFHy5oZM2Zkq622yltvvZURI0bkxhtvzP/93//lkEMOyf7775/7778/SXL22Wdn1KhROfjgg9PU1JSmpqYMGjQoTU1N2WqrrTJ8+PA89NBDufnmm/Pss89mzz33bJXlsssuS11dXe6555789Kc/zYMPPpgdd9wxe+65Z5qamnL22We3rP3e976XXXbZJY888kjGjRuX6667LkcddVSOPfbY/N///V++/vWv56tf/Wpuv/32Vs84+eSTs+eee+Z3v/tdvvCFL2S//fbLiy++mEGDBuWaa65Jkjz22GNLPQ8AAAAAAD4Mtp96Fw0NDRk+fHhmzJiRESNGZMaMGTnmmGNy8skn57XXXssbb7yRxx9/PGPGjMkaa6yR4447ruXaI488MjfffHN+8Ytf5NOf/nQaGhrSpUuXrLzyyhkwYEDLugsuuCCbb755fvCDH7Scu+SSSzJo0KA8/vjjWW+99ZIk6667bn70ox+1yldfX59u3bq1ul+S7Lvvvhk3blyrr8eOHZvDDjssSTJ+/Pjcd999OeOMM1omMJK3p0n22WefJMkPfvCDnHvuuXnggQey4447pm/fvkmS1VZb7V1fSr5gwYIsWLCg1bkl1SXpVOm0/G80AAAAAACsAJMa72HMmDGZMWNGqtVq7rrrruyyyy7ZeOONc/fdd+f2229P//79s8EGG2TJkiU57bTTsskmm6Rfv37p0aNHbr311syfP/9d7z9z5szcfvvt6dGjR8uxwQYbJEnmzp3bsm7kyJErnPmf186ZMyejR49udW706NGZM2dOq3ObbLJJy6+7d++enj175rnnnlvh5ybJpEmT0tDQ0OqY9cof2nQPAAAAAABYFpMa72HMmDG5+OKL89vf/jYrrbRSNtxww2y11Va544478tJLL2WrrbZKkkyePDlnnXVWpkyZkmHDhqV79+45+uijs3Dhwne9f3Nzc3beeeecfvrpS302cODAll937959hTMva22l0vrt9dVqdalz//xC8Uql0vI+kRU1YcKEjB8/vtW58cPGtukeAAAAAAAfRLW58t6LKCWlxnt4570aU6ZMyVZbbZVKpZKtttoqkyZNyksvvZSjjjoqSVqmOL7yla8kebuseOKJJzJ06NCWe3Xp0iVLlixpdf/NN98811xz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kmy22WapVCoZM2ZMq2e9Y8GCBfnmN7+Z1VZbLV27ds1nP/vZPPjggy2fz5gxI5VKJdOnT8/IkSOz8sorZ4sttshjjz3WXt86AAAAAABYYUqNdjBhwoScfvrpOemkk/Loo4/myiuvTP/+/fPmm29mxx13TJ8+ffLggw/mF7/4RW677bYcccQRra6//fbbM3fu3Nx+++257LLLMnXq1EydOrXl87Fjx2bevHn5zW9+k1/+8pc5//zz89xzzy03zwMPPJAkue2229LU1JRrr712metOOOGEXHPNNbnsssvy8MMPZ911180OO+yQF198sdW6b3/725k8eXIeeuih1NXVZdy4ce/zOwUAAAAAAO+f7ac+oNdeey1nn312zjvvvBx44IFJkk984hP57Gc/mwsvvDB///vfc/nll6d79+5JkvPOOy8777xzTj/99PTv3z9J0qdPn5x33nnp1KlTNthgg3zxi1/M9OnTc/DBB+fxxx/Pr3/969x333359Kc/nSS5+OKLM3To0OVmWnXVVZMk/fr1W+62VG+88UYuuOCCTJ06NTvttFOS5MILL8y0adNy8cUX5/jjj29Ze9ppp2WrrbZKkpx44on54he/mLfeeitdu3Zd6r4LFizIggULWp2rVqupVMrzohkAAAAAAD6aTGp8QHPmzMmCBQuyzTbbLPOzTTfdtKXQSJLRo0enubm51RZOG220UTp16tTy9cCBA1smMebMmZO6urqMHDmy5fMNNtggvXv3/kC5586dm0WLFmX06NEt5zp37pxPfepTmTNnTqu1m2yySatsSZY7KTJp0qQ0NDS0OhYseukDZQUAAAAAaItqteJo41EWSo0PqFu3bsv97N0mFP7xfOfOnZf6rLm5ueUe/7y+PSzvvsvK/I/53vnsnXz/bMKECXnllVdaHfWd+7RndAAAAAAAPqaUGh/QkCFD0q1bt0yfPn2pzzbccMPMnj07b7zxRsu5e+65JyuttFLWW2+9Fbr/0KFDs3jx4jz00EMt5x577LG8/PLLy72mS5cuSZIlS5Ysd826666bLl265O677245t2jRojz00EPvurXVe6mvr0+vXr1aHbaeAgAAAACgPXinxgfUtWvXfOtb38oJJ5yQLl26ZPTo0Xn++efz+9//Pvvtt1++973v5cADD8zEiRPz/PPP58gjj8z+++/f8j6N97L++utnxx13zMEHH5yf/exnqaury9FHH/2uEyKrrbZaunXrlptvvjlrrrlmunbtmoaGhlZrunfvnm984xs5/vjj07dv36y11lr50Y9+lDfffDMHHXTQB/qeAAAAAABARzCp0Q5OOumkHHvssfnud7+boUOHZq+99spzzz2XlVdeObfccktefPHFfPKTn8yXvvSlbLPNNjnvvPPadP9LL700gwYNylZbbZXdd989hxxySFZbbbXlrq+rq8s555yTn/70p1l99dWzyy67LHPdD3/4w+yxxx7Zf//9s/nmm+ePf/xjbrnllvTpY7soAAAAAAA+eirVd16uAB2koccnio5QMxY3L39LMVbcer3WKDpCzWh668WiI9SMF//+WtERasJXB44qOkLNuOyZ+4uOUDNe+8uMoiPUhM9tMq7oCDWjc6VT0RFqxpc6DSw6Qk04581Hi45QM5569dmiI9SM4f3WKTpCTZj9tyeLjlAzFi98uugIpfPgGrsVHaF0Pvn0dUVHWCG2nwIAAAAAoKY0V73nt1bZfgoAAAAAACgFpQYAAAAAAFAKSg0AAAAAAKAUlBoAAAAAAEApKDUAAAAAAIBSqCs6AAAAAAAAtKdq0QHoMCY1AAAAAACAUlBqAAAAAAAApaDUAAAAAAAASkGpAQAAAAAAlIJSAwAAAAAAKIW6ogMAAAAAAEB7aq5Wio5ABzGpAQAAAAAAlIJSAwAAAAAAKAWlBgAAAAAAUApKDQAAAAAAoBSUGgAAAAAAQCnUFR0AAAAAAADaU7VaKToCHcSkBgAAAAAAUApKDQAAAAAAoBSUGgAAAAAAQCkoNQAAAAAAgFJQagAAAAAAAKVQV3QAAAAAAABoT81FB6DDmNQAAAAAAABKQakBAAAAAACUglIDAAAAAAAoBaUGAAAAAABQCkoNAAAAAACgFOqKDgAAAAAAAO2pmkrREeggJjUAAAAAAIBSUGoAAAAAAACloNQAAAAAAABKQakBAAAAAACUglIDAAAAAAAohbqiAwAAAAAAQHtqrhadgI5iUgMAAAAAACgFpQYAAAAAAFAKSg0AAAAAAKAUlBoAAAAAAEApKDUAAAAAAIBSqCs6AAAAAAAAtKfmVIqOQAcxqQEAAAAAAJSCUgMAAAAAACgF20/R4eZ/ee2iI9SMS6YPKDpCTRi3zTNFR6gZnYd9tugINeNTpz9SdISa8KW/+/c12sut3fsUHaFmfG6TcUVHqAl3/e6SoiPUjEWXnlp0hJox44w3i45QE357UGPREWrGFpfVFx2hZsx749miI9QEm/8AHcH/8wcAAAAAAEpBqQEAAAAAAJSC7acAAAAAAKgpVRug1SyTGgAAAAAAQCkoNQAAAAAAgFJQagAAAAAAAKWg1AAAAAAAAEpBqQEAAAAAAJRCXdEBAAAAAACgPTUXHYAOY1IDAAAAAAAoBaUGAAAAAABQCkoNAAAAAACgFJQaAAAAAABAKSg1AAAAAACAUqgrOgAAAAAAALSnaipFR6CDmNQAAAAAAABKQakBAAAAAACUglIDAAAAAAAoBaUGAAAAAABQCkoNAAAAAACgFOqKDgAAAAAAAO2puegAdBiTGgAAAAAAQCkoNQAAAAAAgFJQagAAAAAAAKWg1AAAAAAAAEpBqQEAAAAAAJRCXdEBAAAAAACgPTUXHYAOY1IDAAAAAAAoBaUGAAAAAABQCkoNAAAAAACgFJQaAAAAAABAKSg1AAAAAACAUqgrOgAAAAAAALSnaipFR6CDmNQAAAAAAABKQakBAAAAAACUglIDAAAAAAAoBaUGAAAAAABQCkoNAAAAAACgFOqKDgAAAAAAAO2puVJ0AjqKSQ0AAAAAAKAUlBoAAAAAAEApKDUAAAAAAIBSUGoAAAAAAACloNQAAAAAAABKQalBi4kTJ2b48OFFxwAAAAAA+ECaU3G08SgLpQYAAAAAAFAKSo0as3DhwqIjAAAAAABAh1BqfMS99tpr2W+//dK9e/cMHDgwZ511VsaMGZOjjz46SdLY2JhTTz01Y8eOTUNDQw4++OAkybe+9a2st956WXnllbPOOuvkpJNOyqJFi1rd+4c//GH69++fnj175qCDDspbb7211PMvvfTSDB06NF27ds0GG2yQ888/v8N/zwAAAAAAsCxKjY+48ePH55577skNN9yQadOm5a677srDDz/cas2Pf/zjbLzxxpk5c2ZOOumkJEnPnj0zderUPProozn77LNz4YUX5qyzzmq55r/+67/yve99L6eddloeeuihDBw4cKnC4sILL8y3v/3tnHbaaZkzZ05+8IMf5KSTTspll13W8b9xAAAAAAD4J3VFB2D5XnvttVx22WW58sors8022yR5e3Ji9dVXb7Xu85//fI477rhW577zne+0/LqxsTHHHnts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7JL+/funR48e+eQnP5nbbrttqXWvvfZa9t133/To0SOrr756zj333Fafz58/P7vsskt69OiRXr16Zc8998yzzz6bJHnsscdSqVTyhz/8odU1Z555ZhobG1OtVpMkjz76aL7whS+kR48e6d+/f/bff/+88MILbfyOAgAAAADAB6fU+CdNTU3ZZ599Mm7cuMyZMyczZszI7rvvnmq1msmTJ+eSSy7JxRdfnLvvvjsvvvhirrvuupZrzz777JxyyilZc80109TUlAcffDAPPvhgkuTSSy9tOfdeXn/99XzhC1/IbbfdllmzZmWHHXbIzjvvnPnz57da9+Mf/zibbLJJHn744UyYMCHHHHNMpk2bluTtd3vsuuuuefHFF3PHHXdk2rRpmTt3bvbaa68kyfrrr58RI0bkiiuuaHXPK6+8Mvvuu28qlUqampqy1VZbZfjw4XnooYdy880359lnn82ee+75gb7HAAAAAADwfth+6p80NTVl8eLF2X333TN48OAkybBhw5IkU6ZMyYQJE7LHHnskSX7yk5/klltuabm2oaEhPXv2TKdOnTJgwIBW9+3du/dS55Zn0003zaabbtry9amnnprrrrsuN9xwQ4444oiW86NHj86JJ56YJFlvvfVyzz335Kyzzsp2222X2267Lb/73e/ypz/9KYMGDUqS/Md//Ec22mijPPjgg/nkJz+Z/fbbL+edd16+//3vJ0kef/zxzJw5M5dffnmS5IILLsjmm2+eH/zgBy3PvOSSSzJo0KA8/vjjWW+99ZbKvmDBgixYsKD1uebm1K+kPwMAAAAA4IPxk+Z/summm2abbbbJsGHD8uUvfzkXXnhhXnrppbzyyitpamrKqFGjWtbW1dVl5MiR7Z7hjTfeyAknnJANN9wwvXv3To8ePfKHP/xhqUmNf8zyztdz5sxJksyZMyeDBg1qKTSStNzvnTV77713nnrqqdx3331JkiuuuCLDhw/PhhtumCSZOXNmbr/99vTo0aPl2GCDDZK8vUXWskyaNCkNDQ2tjnOemr/MtQAAAAAAHaHqaPNRFkqNf9KpU6dMmzYtv/71r7Phhhvm3HPPzfrrr5958+Z9aBmOP/74XHPNNTnttNNy1113Zfbs2Rk2bFgWLlz4ntdWKpUkb28/9c6v/9E/nh84cGC23nrrXHnllUmSq666Kl/5ylda1jY3N2fnnXfO7NmzWx1PPPFEttxyy2U+f8KECXnllVdaHd8cvFabvwcAAAAAAPDPlBrLUKlUMnr06Jx88smZNWtWunTpkunTp2fgwIEtUw1Jsnjx4sycOfM979e5c+csWbJkhZ9/1113ZezYsdltt90ybNiwDBgwYJmlyj9meefrdyYpNtxww8yfPz9//vOfWz5/9NFH88orr2To0KEt5/bbb79cffXV+d///d/MnTs3e++9d8tnm2++eX7/+9+nsbEx6667bquje/fuy8xeX1+fXr16tTpsPQUAAAAAQHvw0+Z/cv/99+cHP/hBHnroocyfPz/XXnttnn/++QwdOjRHHXVUfvjDH+a6667LH/7whxx22GF5+eWX3/OejY2NmT59ep555pm89NJL77l+3XXXzbXXXpvZs2fnt7/9bfbdd980Nzcvte6ee+7Jj370ozz++OP593//9/ziF7/IUUcdlSTZdttts8kmm2S//fbLww8/nAceeCAHHHBAttpqq1ZbZu2+++559dVX841vfCNbb7111lhjjZbPDj/88Lz44ovZZ5998sADD+TJJ5/MrbfemnHjxrWppAEAAAAAgPag1PgnvXr1yp133pkvfOELWW+99fKd73wnkydPzk477ZRjjz02BxxwQMaOHZtRo0alZ8+e2W233d7znpMnT860adMyaNCgbLbZZu+5/qyzzkqfPn2yxRZbZOedd84OO+yQzTfffKl1xx57bGbOnJnNNtss3//+9zN58uTssMMOSd6eNrn++uvTp0+fbLnlltl2222zzjrr5Oqrr17q97vzzjvnt7/9bfbbb79Wn62++uq55557smTJkuywww7ZeOONc9RRR6WhoSErmb4AAAAAAOBDVqlWq2V6B8hHztixY/Pyyy/n+uuvLzrKR9azW29VdISa8ficVYuOUBOG7/5G0RFqRt0e713ssmJ2HXtd0RFqwuTOnYqOUDN2fHle0RFqxtrd+hcdoSbccvTgoiPUjM5f/U7REWrGfw87qegINWGnry+9MwHvz5cveaXoCDWjPv5e2R5+9eysoiPUjIUL/lJ0hNI5d9BX3nsRrRz5558XHWGF1BUdAAAAAAAA2lNzpegEdBR7CBVgo402So8ePZZ5XHHFFUXHAwAAAACAjySTGh/Q1KlT23zNTTfdlEWLFi3zs/79bU8AAAAAAADLotQowODB9gMGAAAAAIC2sv0UAAAAAABQCkoNAAAAAACgFGw/BQAAAABATWkuOgAdxqQGAAAAAABQCkoNAAAAAACgFJQaAAAAAABAKSg1AAAAAACAUlBqAAAAAAAApVBXdAAAAAAAAGhPzUUHoMOY1AAAAAAAAEpBqQEAAAAAAJSCUgMAAAAAACgFpQYAAAAAAFAKSg0AAAAAAKAU6ooOAAAAAAAA7aladAA6jEkNAAAAAACgFJQaAAAAAABAKSg1AAAAAACAUlBqAAAAAAAApaDUAAAAAAAASqGu6AAAAAAAANCemitFJ6CjmNQAAAAAAABKQakBAAAAAACUglIDAAAAAAAoBaUGAAAAAABQCkoNAAAAAACgFOqKDgAAAAAAAO2puegAdBiTGgAAAAAAQCkoNQAAAAAAgFJQagAAAAAAAKWg1AAAAAAAAEpBqQEAAAAAAJRCXdEBAAAAAACgPVWLDkCHMakBAAAAAACUglIDAAAAAAAoBaUGAAAAAABQCkoNAAAAAACgFJQaAAAAAABAKdQVHQAAAAAAANpTc6pFR6CDmNQAAAAAAABKQakBAAAAAACUglIDAAAAAAAoBe/UoMNt/PAzRUeoGev16FR0hJpw7v/0LDpCzbj+pjuKjlAzHn71yaIj1ITXu29UdISa8dJbrxcdoWYc32N40RFqwowz3iw6Qs1488yTio5QM3Z55PtFR6gJk0b4z2R7+e1rTxUdoWYM6T6w6Ag1obnqnQZA+zOpAQAAAAAAlIJJDQAAAAAAakpz0QHoMCY1AAAAAACAUlBqAAAAAAAApaDUAAAAAAAASkGpAQAAAAAAlIJSAwAAAAAAKIW6ogMAAAAAAEB7qhYdgA5jUgMAAAAAACgFpQYAAAAAAFAKSg0AAAAAAKAUlBoAAAAAAEApKDUAAAAAAIBSqCs6AAAAAAAAtKfmogPQYUxqAAAAAAAApaDUAAAAAAAASkGpAQAAAAAAlIJSAwAAAAAAKAWlBgAAAAAAUAp1RQcAAAAAAID21FwpOgEdxaQGAAAAAABQCkoNAAAAAACgFJQaAAAAAABAKSg1AAAAAACAUlBqAAAAAAAApVBXdAAAAAAAAGhPzakWHYEOYlIDAAAAAAAoBaUGAAAAAABQCkoNAAAAAACgFJQaAAAAAABAKSg1AAAAAACAUqgrOgAAAAAAALSnatEB6DAmNQAAAAAAgFJQagAAAAAAAKWg1AAAAAAAAEpBqQEAAAAAAJSCUgMAAAAAACiFuqIDAAAAAABAe2ouOgAdxqQGAAAAAABQCkoNAAAAAACgFJQaAAAAAABAKSg1AAAAAACAUlBqAAAAAAAApVBXdAAAAAAAAGhPzakWHYEOYlKjBowZMyZHH330B7rHvHnzUqlUMnv27CTJjBkzUqlU8vLLL3/gfAAAAAAA0B6UGiRJBg0alKampmy88cbL/Hzq1Knp3bv3hxsKAAAAAAD+gVLjI27RokUfynM6deqUAQMGpK7OjmQAAAAAAHw0KTU+ZJdffnn69euXBQsWtDq/xx575IADDsjEiRMzfPjwXHLJJVlnnXVSX1+favW9939bvHhxjjjiiPTu3Tv9+vXLd77znVbXVSqVXH/99a2u6d27d6ZOnZpk6e2n/tGMGTPy1a9+Na+88koqlUoqlUomTpzY1t86AAAAAAB8IEqND9mXv/zlLFmyJDfccEPLuRdeeCE33nhjvvrVryZJ/vjHP+a//uu/cs011yyzZFiWyy67LHV1dbn//vtzzjnn5KyzzspFF13ULpm32GKLTJkyJb169UpTU1Oamppy3HHHtcu9AQAAAABgRdlr6EPWrVu37Lvvvrn00kvz5S9/OUlyxRVXZM0118yYMWNyxx13ZOHChfmP//iPrLrqqit830GDBuWss85KpVLJ+uuvn0ceeSRnnXVWDj744A+cuUuXLmloaEilUsmAAQPede2CBQuWmkKpVptTqejPAAAAAIAPx3vvfUNZ+UlzAQ4++ODceuutefrpp5Mkl156acaOHZtKpZIkGTx4cJsKjST5zGc+03J9kowaNSpPPPFElixZ0n7BV8CkSZPS0NDQ6nhzwYsfagYAAAAAAGqTUqMAm222WTbddNNcfvnlefjhh/PII49k7NixLZ9379693Z9ZqVSWejdHR7yEfMKECXnllVdaHSvX92335wAAAAAA8PFj+6mCfO1rX8tZZ52Vp59+Ottuu20GDRr0ge533333LfX1kCFD0qlTpyTJqquumqamppbPn3jiibz55psrfP8uXbqs0NRHfX196uvrW52z9RQAAAAAAO3BT5sLst9+++Xpp5/OhRdemHHjxn3g+/35z3/O+PHj89hjj+Wqq67Kueeem6OOOqrl889//vM577zz8vDDD+ehhx7KoYcems6dO6/w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++68+OKLue6661quPfvss3PKKadkzTXXTFNTUx588ME8+OCDSZJLL7205dwH8eUvfzkvvPBCbr/99pZzL730Um655Zbst99+y73u9ttvz9y5c3P77bfnsssuy9SpU1ttaXXAAQfkr3/9a2bMmJFrrrkmP/vZz/Lcc8+9r4ynn356+vXrl+HDh+e0007LwoUL39d9AAAAAADgg6rp7aeampqyePHi7L777hk8eHCSZNiwYUmSKVOmZMKECdljjz2SJD/5yU9yyy23tFzb0NCQnj17plOnThkwYECr+/bu3Xupc+9H3759s+OOO+bKK6/MNttskyT5xS9+kb59+7Z8vSx9+vTJeeedl06dOmWDDTbIF7/4xUyfPj0HH3xw/vCHP+S2227Lgw8+mJEjRyZJLrroogwZMqTN+Y466qhsvvnm6dOnTx544IFMmDAhf/rTn3LRRRe9v98wAAAAAMCHoDnVoiPQQWq61Nh0002zzTbbZNiwYdlhhx2y/fbb50tf+lJWWmmlNDU1ZdSoUS1r6+rqMnLkyFSrH+5/2Pfbb78ccsghOf/881NfX58rrrgie++9dzp16rTcazbaaKNWnw8cODCPPPJIkuSxxx5LXV1dNt9885bP11133fTp06fN2Y455piWX2+yySbp06dPvvSlL7VMbyzLggULsmDBgtbnmptTv1JNDwUBAAAAAPAhqOmfNHfq1CnTpk3Lr3/962y44YY599xzs/7662fevHlFR2ux8847p7m5Ob/61a/y5z//OXfddVe+8pWvvOs1nTt3bvV1pVJpeS/H8kqZ9ihr3nn/xh//+Mflrpk0aVIaGhpaHec9/dQHfjYAAAAAANR0qZG8/QP/0aNH5+STT86sWbPSpUuXTJ8+PQMHDsx9993Xsm7x4sWZOXPme96vc+fOWbJkSbvl69atW3bfffdcccUVueqqq7LeeutlxIgR7/t+G2ywQRYvXpxZs2a1nPvjH/+Yl19++QNnfeeeAwcOXO6aCRMm5JVXXml1HLHG4A/8bAAAAAAAqOntp+6///5Mnz4922+/fVZbbbXcf//9ef755zN06NAcddRR+eEPf5ghQ4Zk6NChOfPMM1foB/+NjY2ZPn16Ro8enfr6+ve1rdM/22+//bLzzjvn97///XtOabyXDTbYINtuu20OOeSQXHDBBencuXOOPfbYdOvWLZVK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nb333jtPPvlkmzMCAAAAAHyYqv5p8z9lYfupNmhqasrixYuz++67Z/DgwUmSYcOGJUmmTJmSCRMmZI899kiS/OQnP8ktt9zScm1DQ0N69uyZTp06LfVeit69e7/vd1WcccYZ+da3vpW99947SXL66afn9ttvz5QpU/Lv//7vLZMV/fr1a/MzPv3pT+fyyy/Peuutl2effTannnpqtthii/z+979Pv379lnnNggULsmDBglbnqtXmVCr6MwAAAAAAPhg/aW6DTTfdNNtss02GDRuWL3/5y7nwwgvz0ksv5ZVXXklTU1NGjRrVsrauri4jR47s0Dyvvvpq/vrXv2b06NGtzo8ePTpz5sz5wPffaaedsscee2TYsGHZdttt86tf/SpJctllly33mkmTJqWhoaHV8fLfn/vAWQAAAAAAQKnRBp06dcq0adPy61//OhtuuGHOPffcrL/++pk3b16huSqVSquvq9XqUufaQ/fu3TNs2LCWra2WZcKECXnllVdaHb27rdbuWQAAAAAA+PhRarRRpVLJ6NGjc/LJJ2fWrFnp0qVLpk+fnoEDB+a+++5rWbd48eLMnDnzPe/XuXPnLFmy5H1l6dWrV1ZfffXcfffdrc7fe++9GTp0aJKkS5cuSfK+n/GPFixYkDlz5mTgwIHLXVNfX59evXq1Omw9BQAAAABAe/BOjTa4//77M3369Gy//fZZbbXVcv/99+f555/P0KFDc9RRR+WHP/xhhgwZkqFDh+bMM8/Myy+//J73bGxszPTp0zN69OjU19enT58+bcp0/PHH53vf+14+8YlPZPjw4bn00ksze/bsXHHFFUmS1VZbLd26dcvNN9+cNddcM127dk1DQ0MWLlyYRx99NEmycOHCPP3005k9e3Z69OiRddddN0ly3HHHZeedd85aa62V5557LqeeempeffXVHHjggW37xgEAAAAAQDtQarRBr169cuedd2bKlCl59dVXM3jw4EyePDk77bRTtttuuzQ1NWXs2LFZaaWVMm7cuOy222555ZVX3vWekydPzvjx43PhhRdmjTXWaPNWVt/85jfz6quv5thjj81zzz2XDTfcMDfccEOGDBmS5O13e5xzzjk55ZRT8t3vfjef+9znMmPGjPz1r3/NZptt1nKfM844I2eccUa22mqrzJgxI0nyl7/8Jfvss09eeOGFrLrqqvnMZz6T++67r+Ul6QAAAAAAH0XN1WrREegglWrVn25HGTt2bF5++eVcf/31RUcp1Nr9Ni06Qs14/u+vFh2hJqy2cu+iI9SMId0GFB2hZlzzlZWLjlAT+p55f9ERakaXTp2LjlAz3lq8sOgINWHDvmsVHaFmrNmlbdPhLN9vX3uq6Ag1YaMeg4qOUDN+Nev8oiPUjNUaty86Qk14feHfi45QMxYtfLroCKWz5RrbFB2hdO58enrREVaIlx0AAAAAAACloNT4iNloo43So0ePZR7vvCcDAAAAAAA+jrxTowNNnTq1zdfcdNNNWbRo0TI/69+//wdMBAAAAAAA5aXU+IjxEm4AAAAAAFg2208BAAAAAAClYFIDAAAAAICaUi06AB3GpAYAAAAAAFAKSg0AAAAAAKAUlBoAAAAAAEApKDUAAAAAAIBSUGoAAAAAAAClUFd0AAAAAAAAaE/NqRYdgQ5iUgMAAAAAACgFpQYAAAAAAFAKSg0AAAAAAKAUlBoAAAAAAEApKDUAAAAAAIBSqCs6AAAAAAAAtKfmVIuOQAcxqQEAAAAAAJSCUgMAAAAAACgFpQYAAAAAAFAKSg0AAAAAAKAUlBoAAAAAAEAp1BUdAAAAAAAA2lO1Wi06Ah3EpAYAAAAAAFAKSg0AAAAAAKAUlBoAAAAAAEApKDUAAAAAAIBSUGoAAAAAAAClUFd0AAAAAAAAaE/NqRYdgQ5iUgMAAAAAACgFpQYAAAAAAFAKSg0AAAAAAKAUlBoAAAAAAEApKDUAAAAAAIBSqCs6AAAAAAAAtKdqqkVHoIOY1AAAAAAAAEpBqQEAAAAAAJSCUgMAAAAAACgFpQYAAAAAAFAKSg0AAAAAAKAU6ooOAAAAAAAA7alarRYdgQ5iUgMAAAAAACgFpQYAAAAAAFAKSg0AAAAAAKAUlBoAAAAAAEApeFE4He4TKw8oOkLNGNR1laIjQCtdK52KjlAzVj9nVtERasIBAz9TdISacc0Ls4uOUDM26LdO0RFqwrw3ni06Qs34RBd/p2wvQ7oPLDpCTXjo5blFR6gZqzVuX3SEmvHcvFuLjlATuq3+uaIjADVIqQEAAAAAQE1pTrXoCHQQ208BAAAAAACloNQAAAAAAABKQakBAAAAAACUglIDAAAAAAAoBaUGAAAAAABQCnVFBwAAAAAAgPZUrVaLjkAHMakBAAAAAACUglIDAAAAAAAoBaUGAAAAAABQCkoNAAAAAACgFJQaAAAAAABAKdQVHQAAAAAAANpTc6pFR6CDmNQAAAAAAABKQakBAAAAAACUglIDAAAAAAAoBaUGAAAAAABQCkoNAAAAAACgFOqKDgAAAAAAAO2pmmrREeggJjUAAAAAAIBSUGoAAAAAAACloNQAAAAAAABKQakBAAAAAACUglIDAAAAAAAohbqiAwAAAAAAQHtqrlaLjkAHMakBAAAAAACUglIDAAAAAAAoBaUGAAAAAABQCkoNAAAAAACgFJQaAAAAAABAKdQVHQAAAAAAANpTNdWiI9BBTGoAAAAAAACloNQAAAAAAABKQakBAAAAAACUglIDAAAAAAAoBaUGAAAAAABQCnVFBwAAAAAAgPbUXK0WHYEOYlIDAAAAAAAoBaUGAAAAAABQCkoNAAAAAACgFJQaAAAAAABAKSg1AAAAAACAUqgrOgAAAAAAALSnaqpFR6CDmNQAAAAAAABK4WNRaowZMyZHH3104fcAAAAAAADev4/F9lPXXnttOnfuXHSMUmtsbMzRRx+t2AEAAAAAoDAfi1Kjb9++RUcAAAAAAAA+oI/d9lPnn39+hgwZkq5du6Z///750pe+tML3Wbx4cY444oj07t07/fr1y3e+851Uq///hTM///nPM3LkyPTs2TMDBgzIvvvum+eee67l85deein77bdfVl111XTr1i1DhgzJpZde2vL5008/nb322it9+vRJv379sssuu2TevHktn48dOza77rprfvCDH6R///7p3bt3Tj755CxevDjHH398+vbtmzXXXDOXXHJJq9wret8zzjgjAwcOTL9+/XL44Ydn0aJFLd+/p556Ksccc0wqlUoqlcoKf88AAAAAAKC9fCxKjXc89NBD+eY3v5lTTjkljz32WG6++eZsueWWK3z9ZZddlrq6utx///0555xzctZZZ+Wiiy5q+XzhwoX5/ve/n9/+9re5/vrr86c//Sljx45t+fykk07Ko48+ml//+teZM2dOLrjggqyyyipJkjfffDNbb711evTokTvvvDN33313evTokR133DELFy5sucdvfvOb/PWvf82dd96ZM888MxMnTsy//Mu/pE+fPrn//vtz6KGH5tBDD82f//znNt339ttvz9y5c3P77bfnsssuy9SpUzN16tQkb2/fteaaa+aUU05JU1NTmpqa3s+3HwAAAADgQ9FcrTraeJTFx2L7qXfMnz8/3bt3z7/8y7+kZ8+eGTx4cDbbbLMVvn7QoEE566yzUqlUsv766+eRRx7JWWedlYMPPjhJMm7cuJa166yzTs4555x86lOfyuuvv54ePXpk/vz52WyzzTJy5Mgkb7+n4h3/+Z//mZVWWikXXXRRyyTEpZdemt69e2fGjBnZfvvtk7y9ldY555yTlVZaKeuvv35+9KMf5c0338y//du/JUkmTJiQH/7wh7nnnnuy9957r/B9+/Tpk/POOy+dOnXKBhtskC9+8YuZPn16Dj744PTt2zedOnVqmUB5NwsWLMiCBQtanWuuNmelyseqPwMAAAAAoAN8rH7SvN1222Xw4MFZZ511sv/+++eKK67Im2++ucLXf+Yzn2m19dKoUaPyxBNPZMmSJUmSWbNmZZdddsngwYPTs2fPjBkzJsnbZUqSfOMb38h//ud/Zvjw4TnhhBNy7733ttxr5syZ+eMf/5iePXumR48e6dGjR/r27Zu33norc+fObVm30UYbZaWV/v8fW//+/TNs2LCWrzt16pR+/fq1bHvVlvt26tSp5euBAwe22jprRU2aNCkNDQ2tjnmvPtnm+wAAAAAAwD/7WE1q9OzZMw8//HBmzJiRW2+9Nd/97nczceLEPPjgg+ndu/cHuvcbb7yR7bffPttvv31+/vOfZ9VVV838+fOzww47tGzztNNOO+Wpp57Kr371q9x2223ZZpttcvjhh+eMM85Ic3NzRowYkSuuuGKpe6+66qotv+7cuXOrzyqVyjLPNTc3J8kHuu8792iLCRMmZPz48a3O7brhHm2+DwAAAAAA/LOPVamRJHV1ddl2222z7bbb5nvf+1569+6d3/zmN9l9993f89r77rtvqa+HDBmSTp065Q9/+ENeeOGF/PCHP8ygQYOSvP0Oj3+26qqrZuzYsRk7dmw+97nP5fjjj88ZZ5yRzTffPFdffXVWW2219OrVq31+s0m73bdLly4tEynvpr6+PvX19a3O2XoKAAAAAID28LH6afONN96Yc845J7Nnz85TTz2Vyy+/PM3NzVl//fVX6Po///nPGT9+fB577LFcddVVOffcc3PUUUclSdZaa6106dIl5557bp588snccMMN+f73v9/q+u9+97v57//+7/zxj3/M73//+9x4440Z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6pNPPtG2bdu0aNEivfPOO9qzZ4/ZEVHI7N69WyEhIWrcuLFWrlyp0NBQ7dq1S6dOndL69eu5MM2DDh06aNWqVSpdurRq166drci7ePFik5IBt+bu7q7t27ezUuMWTp48qXnz5ikmJkY7d+7U448/rsjISLVv354JHXm0atUqffnll1q0aJEyMjIUFham8PBwtWzZUk5OTmbHy/e+/fZbSddW98+ZM0elSpWyH8vIyFBsbKxWrFihvXv3mhXRki5evKgFCxZoy5YtyszMVKNGjRQeHq5ixYqZHc0yLly4oOeff14+Pj6qW7dutt+N/fr1MykZgNyiqAEgz7y8vHI9q/PUqVP3OE3BMWrUKL333nsKDg5WhQoVsp3jJUuWmJTMWpycnJSamqqyZctmGf/zzz9VqVIlXb582aRk1lO8eHH99ttvqlSpkjp27KjatWtr5MiROnLkiGrWrKkLFy6YHRGFUGpqqqZOnZrlQv71119XhQoVzI5mKREREbc8/vnnn9+nJEDeUNTIm23btmn27NmaOXOmSpYsqc6dO+u1115T9erVzY6W7z3wwAM6efKkWrdurfDwcD377LMqWrSo2bEs5VaFH1dXV1WuXFnjx4/XM888cx9TAdLMmTPVq1cvFStWTGXKlMly7W2z2ZgIB1gA7acA5NnEiRPtH588eVKjR49W69at9eijj0qSfv75Zy1btkwjRowwKaE1TZs2TTExMXr55ZfNjmJJ12eCSdKyZctynAnGho55ExAQoG+++UYdOnTQsmXLFBUVJelaD1oPDw+T06EwSk5Olp+fn0aNGpXjsUqVKpmQypooWgAFX0pKipYvX67ly5fL2dlZbdq00a5duxQUFKR//etf9r/ryNk777yj559/Xl5eXmZHsaSEhARdvXpVzs7OqlKlijZt2iRvb2+zY1nenDlz5O3trbZt20qS3njjDU2fPl1BQUGaP3++/P39TU5oDW+//bbee+89DRs2jFVXgEWxUgPAXXnuuefUokUL9enTJ8v4lClT9NNPP+mbb74xJ5gFlSlTRhs3bqR9yh1iJpjjLVy4UJ06dVJGRoZatWql5cuXS5LGjh2rNWvW6McffzQ5IQobZ2dnpaSkZFuJdfLkSZUtWzbHft24tePHj2vv3r2y2WyqUaOGfHx8zI4E3BIrNW7t6tWr+vbbb/X5559r+fLlqlevnrp166bw8HC5u7tLkhYsWKDevXvrr7/+MjktCjJnZ2elpqbKx8fnpu1hkXc1a9bU1KlT1bJlS/38889q1aqVJk6cqO+//14uLi60j8yl0qVLa9OmTVx7AxZGUQPAXSlZsqTi4+MVEBCQZTwxMVENGzbUuXPnTEpmPUOHDlXJkiVZ4XIHEhISVLt2bWaC3QOpqalKSUlR/fr17YWjjRs3ysPDQ7Vq1TI5HQobJycn/fnnn9luvB8+fFhBQUE6f/68Scms5/z58+rbt6/mzp1r38PJ2dlZXbp00SeffKLixYubnBDIWZ06dfTjjz/Kz8/P7Cj5kre3tzIzM/XSSy+pe/fuatCgQbbn/PXXX2rUqJEOHjx4/wPmc2FhYYqJiZGHh4fCwsJu+VxuHt9amTJl9MMPP+jhhx/OUuDA3bmxPezQoUOVkpKiuXPnateuXQoJCdHx48fNjmgJUVFR8vHx0Ztvvml2FAB3iPZTAO5KmTJltGTJEg0ZMiTL+DfffMNMnFwYOHCg/ePMzExNnz5dP/30k+rVq5dts7IJEybc73iW0bBhQ/uFks1my/WeL7i98uXLq3z58lnGHnroIZPSoLC6/rvSZrNpxIgRWW64Z2Rk6Ndff83xxh1ubuDAgVq9erW+++47NW3aVJK0bt069evXT4MGDdLUqVNNTojC5mYzuU+fPq1GjRrZ+5vv3LnTjHiWER0dreeff/6Wez94eXlR0LiJUqVK2d9H3tjKFHn33HPPqXnz5vY9r4KDg+Xs7Jzjc9m/IPdKliypkydPqlKlSlq+fLm9jVzRokV18eJFk9NZR0ZGhv71r39p2bJlXHsDFkVRA8BdGTVqlF599VXFxcXZ99T45ZdftHTpUs2cOdPkdPnftm3bsnx+/aYcF+x54+npqaSkJPn4+Ojw4cP2WccACobrvysNw9COHTvk5uZmP+bm5qb69etr8ODBZsWzpEWLFmnhwoUKCQmxj7Vp00bFihVTx44dKWrgvjt06FCOLeQuX76so0ePmpDImtib7e7cuN8Qew/dnenTpyssLEz79+9Xv3791L17d3sLNNy5J554Qt26dVPDhg21b98++94au3btYv/APNixY4caNmwoKfu1NxPkAGugqAHgrnTt2lWBgYGaPHmyFi9eLMMwFBQUpPXr1+vhhx82O16+t2rVKrMjFAjMBAMKtuu/KyMiIjRp0iQ2qneACxcuqFy5ctnGy5YtqwsXLpiQCIXVt99+a/942bJlWWbHZ2RkKDY2lht1gEU99dRTkqQtW7aof//+FDUc4NNPP9Xbb7+tI0eOaNGiRfbVbVu2bNFLL71kcjrryO11+O+//y5fX182EwfyIfbUAIB8IjIyUpMmTcr2Zv963/PZs2eblMwali5dap8J9t577930oql///73ORkA5D+tWrVSmTJlNHfuXHubmosXL+qVV17RqVOn9NNPP5mcEIXFrW4Uubq6qnLlyho/fryeeeaZ+5gKhVXDhg1zPUt769at9zgNALN5eHgoPj5eVatWNTsKgL+hqAHgrh04cECff/65kpKSNHHiRJUtW1ZLly6Vn5+fateubXY8y3B2dlZKSorKli2bZfzEiRMqX7680tPTTUpmLREREZo8eTIzwYACatOmTfr666+VnJysK1euZDnGpq25t2PHDj399NO6dOmS6tevL5vNpvj4eBUpUkTLly/n7zfui4SEBNWuXVvOzs6qUqWKNm3aJG9vb7NjoRAbNWpUrp87cuTIe5ikYLndpus34m957ly4cCHH90L16tUzKVHB5O7uru3bt1PUAPIh2k8BuCurV6/W008/raZNm2rNmjUaPXq0ypYtq4SEBM2cOVMLFy40O2K+l5aWJsMwZBiGzp49m2Vjx4yMDP3www/ZCh24OfofAwXXggUL1KVLFz355JNasWKFnnzySSUmJio1NVUdOnQwO56l1K1bV4mJiZo3b55+++03GYahF198UeHh4SpWrJjZ8VBINGzYUKmpqfLx8ZHNZqOPOUx3J4WK+fPnKzQ0VCVKlLgHiQoGDw8PLVmyRKVKlVJwcLCka+2Szpw5o/bt2/Paz4Pjx4+ra9euWrp0aY7Hc9qbCAAKIooaAO7KsGHDNHr0aA0cODDLzPgWLVpo0qRJJiazDk9PT/uFfI0aNbIdt9lseZo1VtgxEwwouD744ANFR0fr9ddfl7u7uyZNmqQqVaqoZ8+e9j11kDtjx45VuXLl1L179yzjs2fP1vHjxzV06FCTkqEw8fT0VFJSknx8fHT48GFlZmaaHQnIs549e+rhhx9mJvctlCtXTh07dtS0adPs+95lZGTotddek4eHhz7++GOTE1rHgAEDdPr0af3yyy9q0aKFlixZoj///FOjR4/W+PHjzY4HAPcNRQ0A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", "text/plain": [ - " id price bedrooms bathrooms sqft_living sqft_lot floors \\\n", - "0 7129300520 221900.0 3 1.00 1180 5650 1.0 \n", - "1 6414100192 538000.0 3 2.25 2570 7242 2.0 \n", - "2 5631500400 180000.0 2 1.00 770 10000 1.0 \n", - "3 2487200875 604000.0 4 3.00 1960 5000 1.0 \n", - "4 1954400510 510000.0 3 2.00 1680 8080 1.0 \n", - "\n", - " waterfront condition grade yr_built \n", - "0 NaN Average 7 Average 1955 \n", - "1 NO Average 7 Average 1951 \n", - "2 NO Average 6 Low Average 1933 \n", - "3 NO Very Good 7 Average 1965 \n", - "4 NO Average 8 Good 1987 " + "
" ] }, - "execution_count": 2, "metadata": {}, - "output_type": "execute_result" + "output_type": "display_data" } ], "source": [ - "# reading the csv file\n", - "# drop irrelevant columns\n", - "df = pd.read_csv('data/kc_house_data.csv').drop(['date',\n", - " 'view', \n", - " 'sqft_above', \n", - " 'sqft_basement', \n", - " 'yr_renovated',\n", - " 'zipcode', \n", - " 'lat', \n", - " 'long', \n", - " 'sqft_living15',\n", - " 'sqft_lot15'], axis = 1)\n", - "# previewing the DataFrame\n", - "df.head()" + "#visual of the clean_df in a heatmap to look at correlations\n", + "plt.figure(figsize=(20,20))\n", + "sns.heatmap(df.corr().abs(), annot=True)\n", + "plt.show()" ] } ], From a6a8120921d49b77194c6a5cf9ec8939d4bff3e7 Mon Sep 17 00:00:00 2001 From: clydeochieng <107258512+clydeochieng@users.noreply.github.com> Date: Sun, 28 Apr 2024 22:20:02 +0300 Subject: [PATCH 10/42] Update student.ipynb --- student.ipynb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/student.ipynb b/student.ipynb index 1b57076a..b3e32a00 100644 --- a/student.ipynb +++ b/student.ipynb @@ -7,7 +7,7 @@ "## Final Project Submission\n", "\n", "Please fill out:\n", - "* Student name: Solphine Joseph, Grace Rotich, Mather Rotich, Hilary Simiyu, Clyde Ochieng.\n", + "* Student name: Solphine Joseph, Grace Rotich, Mathew Kiprotich, Hilary Simiyu, Clyde Ochieng.\n", "* Student pace: full time\n", "* Scheduled project review date/time: \n", "* Instructor name: Nikita \n", From 5d27220b4b36466d5c1fd2aab29b08806fda503b Mon Sep 17 00:00:00 2001 From: clydeochieng <107258512+clydeochieng@users.noreply.github.com> Date: Mon, 29 Apr 2024 16:47:13 +0300 Subject: [PATCH 11/42] Update student.ipynb --- student.ipynb | 1655 +++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 1395 insertions(+), 260 deletions(-) diff --git a/student.ipynb b/student.ipynb index 52ce98fd..1beeaa73 100644 --- a/student.ipynb +++ b/student.ipynb @@ -7,7 +7,7 @@ "## Final Project Submission\n", "\n", "Please fill out:\n", - "* Student name: Solphine Joseph, Grace Rotich, Mather Rotich, Hilary Simiyu, Clyde Ochieng.\n", + "* Student name: Solphine Joseph, Grace Rotich, Mathew Kiprotich, Hilary Simiyu, Clyde Ochieng.\n", "* Student pace: full time\n", "* Scheduled project review date/time: \n", "* Instructor name: Nikita \n", @@ -59,6 +59,15 @@ "The real estate agency in Kingsway is analyzing a dataset to determine the factors affecting house prices. The dataset likely includes features such as property size, location, age, and market trends. Key steps include assessing data quality, exploring relationships between features and prices, and preprocessing data for multilinear regression analysis. Multilinear regression will be used to model how these features collectively influence house prices, with evaluation metrics used to assess predictive accuracy." ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The dataset utilized in this analysis is the King County Housing dataset, encompassing details on over 21,000 homes within King County. Each entry in the dataset includes information on various features such as bedroom/bathroom/floor counts, living space and lot square footage, zip code, building grade, condition, and more.\n", + "\n", + "The King County Housing Dataset comprises multiple features contributing to the final sale price of homes in King County. Descriptions of these features are provided below." + ] + }, { "cell_type": "markdown", "metadata": {}, @@ -92,45 +101,1110 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "### Explotory Data Analyis\n", + "### Data Preparation\n", + "\n", + "Importing data." + ] + }, + { + "cell_type": "code", + "execution_count": 98, + "metadata": {}, + "outputs": [], + "source": [ + "#importing libraries \n", + "import pandas as pd\n", + "import numpy as np\n", + "from matplotlib import pyplot as plt\n", + "import seaborn as sns\n", + "from sklearn.preprocessing import OneHotEncoder, StandardScaler\n", + "from sklearn.linear_model import LinearRegression\n", + "import statsmodels.api as sm\n", + "from statsmodels.formula.api import ols\n", + "from scipy import stats\n", + "import warnings\n", + "warnings.filterwarnings('ignore')" + ] + }, + { + "cell_type": "code", + "execution_count": 99, + "metadata": {}, + "outputs": [], + "source": [ + "df = pd.read_csv('data/kc_house_data.csv')" + ] + }, + { + "cell_type": "code", + "execution_count": 100, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(21597, 21)" + ] + }, + "execution_count": 100, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df.shape" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The dataset contains 21,597 houses with 21 features." + ] + }, + { + "cell_type": "code", + "execution_count": 101, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "RangeIndex: 21597 entries, 0 to 21596\n", + "Data columns (total 21 columns):\n", + " # Column Non-Null Count Dtype \n", + "--- ------ -------------- ----- \n", + " 0 id 21597 non-null int64 \n", + " 1 date 21597 non-null object \n", + " 2 price 21597 non-null float64\n", + " 3 bedrooms 21597 non-null int64 \n", + " 4 bathrooms 21597 non-null float64\n", + " 5 sqft_living 21597 non-null int64 \n", + " 6 sqft_lot 21597 non-null int64 \n", + " 7 floors 21597 non-null float64\n", + " 8 waterfront 19221 non-null object \n", + " 9 view 21534 non-null object \n", + " 10 condition 21597 non-null object \n", + " 11 grade 21597 non-null object \n", + " 12 sqft_above 21597 non-null int64 \n", + " 13 sqft_basement 21597 non-null object \n", + " 14 yr_built 21597 non-null int64 \n", + " 15 yr_renovated 17755 non-null float64\n", + " 16 zipcode 21597 non-null int64 \n", + " 17 lat 21597 non-null float64\n", + " 18 long 21597 non-null float64\n", + " 19 sqft_living15 21597 non-null int64 \n", + " 20 sqft_lot15 21597 non-null int64 \n", + "dtypes: float64(6), int64(9), object(6)\n", + "memory usage: 3.5+ MB\n" + ] + } + ], + "source": [ + "df.info()" + ] + }, + { + "cell_type": "code", + "execution_count": 102, + "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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
idpricebedroomsbathroomssqft_livingsqft_lotfloorssqft_aboveyr_builtyr_renovatedzipcodelatlongsqft_living15sqft_lot15
count21597.0000021597.0000021597.0000021597.0000021597.0000021597.0000021597.0000021597.0000021597.0000017755.0000021597.0000021597.0000021597.0000021597.0000021597.00000
mean4580474287.77099540296.573513.373202.115832080.3218515099.408761.494101788.596841970.9996883.6367898077.9518547.56009-122.213981986.6203212758.28351
std2876735715.74778367368.140100.926300.76898918.1061341412.636880.53968827.7597629.37523399.9464153.513070.138550.14072685.2304727274.44195
min1000102.0000078000.000001.000000.50000370.00000520.000001.00000370.000001900.000000.0000098001.0000047.15590-122.51900399.00000651.00000
25%2123049175.00000322000.000003.000001.750001430.000005040.000001.000001190.000001951.000000.0000098033.0000047.47110-122.328001490.000005100.00000
50%3904930410.00000450000.000003.000002.250001910.000007618.000001.500001560.000001975.000000.0000098065.0000047.57180-122.231001840.000007620.00000
75%7308900490.00000645000.000004.000002.500002550.0000010685.000002.000002210.000001997.000000.0000098118.0000047.67800-122.125002360.0000010083.00000
max9900000190.000007700000.0000033.000008.0000013540.000001651359.000003.500009410.000002015.000002015.0000098199.0000047.77760-121.315006210.00000871200.00000
\n", + "
" + ], + "text/plain": [ + " id price bedrooms bathrooms sqft_living \\\n", + "count 21597.00000 21597.00000 21597.00000 21597.00000 21597.00000 \n", + "mean 4580474287.77099 540296.57351 3.37320 2.11583 2080.32185 \n", + "std 2876735715.74778 367368.14010 0.92630 0.76898 918.10613 \n", + "min 1000102.00000 78000.00000 1.00000 0.50000 370.00000 \n", + "25% 2123049175.00000 322000.00000 3.00000 1.75000 1430.00000 \n", + "50% 3904930410.00000 450000.00000 3.00000 2.25000 1910.00000 \n", + "75% 7308900490.00000 645000.00000 4.00000 2.50000 2550.00000 \n", + "max 9900000190.00000 7700000.00000 33.00000 8.00000 13540.00000 \n", + "\n", + " sqft_lot floors sqft_above yr_built yr_renovated \\\n", + "count 21597.00000 21597.00000 21597.00000 21597.00000 17755.00000 \n", + "mean 15099.40876 1.49410 1788.59684 1970.99968 83.63678 \n", + "std 41412.63688 0.53968 827.75976 29.37523 399.94641 \n", + "min 520.00000 1.00000 370.00000 1900.00000 0.00000 \n", + "25% 5040.00000 1.00000 1190.00000 1951.00000 0.00000 \n", + "50% 7618.00000 1.50000 1560.00000 1975.00000 0.00000 \n", + "75% 10685.00000 2.00000 2210.00000 1997.00000 0.00000 \n", + "max 1651359.00000 3.50000 9410.00000 2015.00000 2015.00000 \n", + "\n", + " zipcode lat long sqft_living15 sqft_lot15 \n", + "count 21597.00000 21597.00000 21597.00000 21597.00000 21597.00000 \n", + "mean 98077.95185 47.56009 -122.21398 1986.62032 12758.28351 \n", + "std 53.51307 0.13855 0.14072 685.23047 27274.44195 \n", + "min 98001.00000 47.15590 -122.51900 399.00000 651.00000 \n", + "25% 98033.00000 47.47110 -122.32800 1490.00000 5100.00000 \n", + "50% 98065.00000 47.57180 -122.23100 1840.00000 7620.00000 \n", + "75% 98118.00000 47.67800 -122.12500 2360.00000 10083.00000 \n", + "max 98199.00000 47.77760 -121.31500 6210.00000 871200.00000 " + ] + }, + "execution_count": 102, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df.describe()" + ] + }, + { + "cell_type": "code", + "execution_count": 103, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "count 21597.00000\n", + "mean 540296.57351\n", + "std 367368.14010\n", + "min 78000.00000\n", + "25% 322000.00000\n", + "50% 450000.00000\n", + "75% 645000.00000\n", + "max 7700000.00000\n", + "Name: price, dtype: float64" + ] + }, + "execution_count": 103, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# descriptive statistics for our target price.\n", + "df['price'].describe()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The average price of homes in the data set is 540,297 dollars. \n", + "The prices ranges from 78,000 to 8,000,000 dollars and\n", + "the median house price is 450,000 dollars" + ] + }, + { + "cell_type": "code", + "execution_count": 104, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "count 21597.00000\n", + "mean 2080.32185\n", + "std 918.10613\n", + "min 370.00000\n", + "25% 1430.00000\n", + "50% 1910.00000\n", + "75% 2550.00000\n", + "max 13540.00000\n", + "Name: sqft_living, dtype: float64" + ] + }, + "execution_count": 104, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# descriptive statistics for square footage\n", + "df['sqft_living'].describe()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The mean square-feet of living space is 2,080 sq-ft and the range of living space ranges from 370 sq-ft to 13,540 sq-ft. The median sq footage is 1,910." + ] + }, + { + "cell_type": "code", + "execution_count": 105, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "bedrooms\n", + "3 9824\n", + "4 6882\n", + "2 2760\n", + "5 1601\n", + "6 272\n", + "1 196\n", + "7 38\n", + "8 13\n", + "9 6\n", + "10 3\n", + "11 1\n", + "33 1\n", + "Name: count, dtype: int64" + ] + }, + "execution_count": 105, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df['bedrooms'].value_counts()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The bedroom counts range from 1 bedroom to 33" + ] + }, + { + "cell_type": "code", + "execution_count": 106, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "bathrooms\n", + "2.50000 5377\n", + "1.00000 3851\n", + "1.75000 3048\n", + "2.25000 2047\n", + "2.00000 1930\n", + "1.50000 1445\n", + "2.75000 1185\n", + "3.00000 753\n", + "3.50000 731\n", + "3.25000 589\n", + "3.75000 155\n", + "4.00000 136\n", + "4.50000 100\n", + "4.25000 79\n", + "0.75000 71\n", + "4.75000 23\n", + "5.00000 21\n", + "5.25000 13\n", + "5.50000 10\n", + "1.25000 9\n", + "6.00000 6\n", + "0.50000 4\n", + "5.75000 4\n", + "6.75000 2\n", + "8.00000 2\n", + "6.25000 2\n", + "6.50000 2\n", + "7.50000 1\n", + "7.75000 1\n", + "Name: count, dtype: int64" + ] + }, + "execution_count": 106, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df['bathrooms'].value_counts()" + ] + }, + { + "cell_type": "code", + "execution_count": 107, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "floors\n", + "1.00000 10673\n", + "2.00000 8235\n", + "1.50000 1910\n", + "3.00000 611\n", + "2.50000 161\n", + "3.50000 7\n", + "Name: count, dtype: int64" + ] + }, + "execution_count": 107, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df['floors'].value_counts()" + ] + }, + { + "cell_type": "code", + "execution_count": 108, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "sqft_lot\n", + "5000 358\n", + "6000 290\n", + "4000 251\n", + "7200 220\n", + "4800 119\n", + " ... \n", + "22605 1\n", + "25248 1\n", + "9934 1\n", + "9142 1\n", + "1076 1\n", + "Name: count, Length: 9776, dtype: int64" + ] + }, + "execution_count": 108, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df['sqft_lot'].value_counts()" + ] + }, + { + "cell_type": "code", + "execution_count": 109, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "count 21597.00000\n", + "mean 15099.40876\n", + "std 41412.63688\n", + "min 520.00000\n", + "25% 5040.00000\n", + "50% 7618.00000\n", + "75% 10685.00000\n", + "max 1651359.00000\n", + "Name: sqft_lot, dtype: float64" + ] + }, + "execution_count": 109, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df['sqft_lot'].describe()" + ] + }, + { + "cell_type": "code", + "execution_count": 110, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "yr_built\n", + "2014 559\n", + "2006 453\n", + "2005 450\n", + "2004 433\n", + "2003 420\n", + " ... \n", + "1933 30\n", + "1901 29\n", + "1902 27\n", + "1935 24\n", + "1934 21\n", + "Name: count, Length: 116, dtype: int64" + ] + }, + "execution_count": 110, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df['yr_built'].value_counts()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The year built ranges from 1934 to 2014." + ] + }, + { + "cell_type": "code", + "execution_count": 111, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "condition\n", + "Average 14020\n", + "Good 5677\n", + "Very Good 1701\n", + "Fair 170\n", + "Poor 29\n", + "Name: count, dtype: int64" + ] + }, + "execution_count": 111, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df['condition'].value_counts()" + ] + }, + { + "cell_type": "code", + "execution_count": 112, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "waterfront\n", + "NO 19075\n", + "YES 146\n", + "Name: count, dtype: int64" + ] + }, + "execution_count": 112, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df['waterfront'].value_counts()" + ] + }, + { + "cell_type": "code", + "execution_count": 113, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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+hRnnnkmtm3zyCOPcOedd5JIJPj85z/PPffcw5o1a6Z1fUIIIabOXL3uSIBSRv/6r//Kt7/9bSzLmrbvuXPnTn7wgx8AsHTpUu644w6WL19e/PoFF1zAqaeeyle+8hUymQzf+c53uPXWW6dtfUIIIabOXL7uSA5KGbS0tHDzzTfzjW98A8uy0HV92r73rbfeim3bKKX4p3/6p0FPkoIPf/jDnHzyyQA88cQTZDKZaVufEEKI8psP1x3ZQZmk//iP/yg+QQDWrl3LJz/5SW655ZYp/949PT08/fTTAGzZsoUNGzaMeNubbrqJl156ibq6OlKpFKFQaMrXJ4QQovzmy3VHApRJev3117Esi0AgwB/8wR/w2c9+lh07dozrMXK5HHfddRePPfYY77zzDvF4nKqqKk466SSuuOIKrr/++mH/Yrdt21Z8gl5zzTWjfo9rr72Wa6+9dlzrEkIIUXnmy3VHApRJCgaDXH/99fzRH/0RS5cuHff93377bT772c9y+PDhQZ/v7u7mueee47nnnuP222/n1ltv5fTTTy+5b8HAKNZ1XTo6OkgmkyxatIhoNDrudQkhhKhM8+W6IwHKJH31q19F0yaWyrNv3z4++tGPkkgkME2T6667jksvvZT6+nq6u7t54oknuOeeezhy5Ag33ngjd95556BM6N27dwNgmiYLFy6ks7OT7373uzz88MP09fUBoOs655xzDp/73Oc4++yzJ/8DCyGEmFHz5bojAcokTfRJAvDFL36RRCJBVVUVP/7xj0vO8i699FKuvfZabrzxRhKJBLfccgs//elPi1/v7e0FIBaLsWPHDm6++ebi5wocx2H79u0899xzfOlLX+JTn/rUhNcrhBBi5s2X645U8cyQZ599ljfeeAOAP/7jPx4x0eiss87ixhtvBODll1/mtddeK34tmUwCkM1mufnmm+nr6+PjH/84Dz74IK+//jpbt27ly1/+MpFIBM/z+Lu/+zseeuihKf7JhBBCVKLZdt2RAGWG/OY3vyl+fOGFF45624Fd+LZv3178OJ1OA5BKpejt7eXrX/86t9xyC2vXriUQCNDU1MQf/MEfcPvtt2OaJgDf/OY3yWaz5fxRhBBCzAKz7bojRzwz5K233ip+/IEPfGDM9zt48GDx44EZ1hdccAHXX3/9sPfZtGkT1113HT/96U9pb29n27ZtvOc9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xwsvvDCpNbS3t/O3f/u3gH+0I8MHhZg8acAmROXw5lmrtrIc8RTyTU455ZRx33f9+vX86le/mvRRzC233EI8HmflypX86Z/+6aQeaywMozS203Vt0J9i/porz4X9R+O0d6eIhU00rbQBWyxs0N6d4khnklWLpQHbUHPleSAqg65rw1575qqyBCi6rmPbNpY1/iZMtm37CzEmvpS77rqLp556qni0EwqFJvxYY6Fpirq66Ihfr64OT+n3F7PHbH8u7G9P4noQChglAQr4xznprAOaPuq/iflutj8PRGWoqgrNq39nZQlQli1bxt69e3n++efHfd8dO3YATLhxW2trK9/85jcBuPHGGznrrLMm9Djj4boe8Xiq5PO6rlFdHSYeT+M4MhhsPpszzwXXQVOQydnDNmDLWf7XcR16ekoHaM53c+Z5MA9VYiAQj6fp6Zm+buzlMtHfZVkClPPOO489e/awY8cOtm7dyiWXXDKm+7388sts27YNpRTnnnvuuL+v53n81V/9FYlEgpUrV/KFL3xh3I8xUaNNJnUcVyaXCqA8zwXX82asKmbpgiiL6iMc7khSq2slk8oTaZtljVGWLojKc34U8pogysFxvHn1PCpLgHLdddfxH//xH4DfD+Xv/u7veO973zvqfZ599ln+23/7b3ieh6ZpXH/99eP+vj//+c/Ztm0bAJ/4xCfYv39/yW0GDgqMx+Ps3LkTgAULFtDY2Dju7ynEdBpree9UKTRgu+PRXfQmckRDBoahYdsuyYwtDdiEmEbzLRddeWWaPvQ//sf/4J577im+wzr55JO59NJLOemkk6iu9pPn+vv72bdvH08//TSvv/46nuehlOL6668vNlcbjy9/+cvce++9E1rvn/zJn/C5z31uQvd1HJfu7tLtbMPQqKuL0tOTnFdRrig13ufCcLskuw70cMeju8jkbKIhsyQwmM7mZ2/t7+Lup/bR0ZcB18M0NRY3RKctUJqt5DVh+vmXIDXpwXqNjZU1lqGtK8mBw72sXjL7ktEn+rss27DAr371q7S1tRV3NN555x3eeeedEW9fePJccsklfOUrXynXMoSYdUbaJUmmrWJ5byHwD5g6pqHRm8jx4PYDrGuum/Ldi50t3Tz03EH6Ern8jqeirirIlRKciAqilH9dSWUcdF0jMAerXeZbmXHZdlAAXNfl9ttv58c//jFd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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# examining the relationship between sqft_living and price\n", + "sns.jointplot(x='sqft_living', y='price', data=df, kind='reg')\n", + "\n", + "plt.tight_layout()" + ] + }, + { + "cell_type": "code", + "execution_count": 114, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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EEIIIaTiUIBCCCGEkIpDAQohhBBCKg4FKIQQQgipOBSgEEIIIaTiUIBCCCGEkIpDAQohhBBCKg4FKIQQQgipOBSgEEIIIaTiUIBCCCGEkIpDAQohhBBCKg4FKIQQQgipOBSgEEIIIaTiUIBSJp///Oexbds2/Pu///uKfc4jR47gy1/+Mt72trfhnHPOwdlnn42rr74aX/nKVzA8PLxi8yCEELLyau2+I5VojiTL448/jnvuuWdFP+f3v/99fO9734OmaTn/fuzYMRw7dgz//d//jW9961u45JJLVnRehBBCyq8W7zsUoJTY008/jb//+79f0c95xx134Lvf/S4AoKGhAR/4wAdwzjnnQNM0PPLII7jnnnsQi8Xw8Y9/HPfddx+2bNmyovMjhBBSPrV636EApYT+8z//E9/4xjegquqKfc6enh784Ac/AACsX78ed911FzZs2OC8/6KLLsKOHTvwhS98AalUCt/5zndw++23r9j8CCGElE8t33coB6UEent7ccstt+ArX/kKVFWFKIor9rlvv/12aJoGxhi+/e1v5/yQ2N797nfj1FNPBQA8+eSTSKVSKzY/QgghpbcW7ju0grJMP/vZz5wfEADYunUr3v/+9+O2224r++eemprCM888AwC46qqrcNZZZy049uabb8bzzz+PhoYGJBIJeDyess+PEEJI6a2V+w4FKMv08ssvQ1VVuFwu/PVf/zU+8pGP4ODBg0VdQ1EU3HvvvXj88cfx2muvIRKJIBgM4pRTTsGVV16J66+/Pu8Du2fPHucH9Nprr130c1x33XW47rrripoXIYSQyrNW7jsUoCyT2+3G9ddfjw996ENYv3590R//6quv4iMf+QgGBwdz/j0cDmP//v3Yv38/fvKTn+D222/HGWecMe9jbdlRrGEYGB8fRzweR2trK/x+f9HzIoQQUpnWyn2HApRl+uIXvwhBWFoqz/Hjx3HjjTciFotBlmW8613vwqWXXorGxkaEw2E8+eSTuO+++3Dy5EncdNNNuOeee3IyoY8cOQIAkGUZLS0tmJiYwHe/+108/PDDmJmZAQCIoojzzz8fH/vYx3Deeect/wsmhBCyqtbKfYcClGVa6g8JAHz6059GLBZDMBjEj3/843l7eZdeeimuu+463HTTTYjFYrjttttw9913O++fnp4GAAQCARw8eBC33HKL8282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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "sns.jointplot(x='bathrooms', y='price', data=df, kind='reg')\n", + "plt.tight_layout()\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Data Preperation\n", + "\n", + "Data Preparation Fundamentals - Applying appropriate preprocessing and feature engineering steps to tabular data in preparation for statistical modeling\n", + "\n", + "Data Cleaning Steps\n", + "Handling Missing Values: Identify and address and missing values using techniques such as dropping or replacing data.\n", + "\n", + "Handling Non-Numeric Data: A Linear regression model needs all of the features to be numeric, not categorical. Identify the data type 'object' and address them using techniques such as ordinal or one-hot encoding.\n", + "\n", + "This notebook contains a breakdown of the step-by-step processes that we used to compile, scrub, and transform our data. It includes variations of narrowing our scope and explorations into the impacts that our different transformations have on the data." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Preprocessing with Scikit-learn\n", + "Let explore and clean our data set to prep for our Linear Regression Model.\n", + "Preprocessing Steps.\n", + "\n", + "1. Handle Missing Values\n", + "2. Convert Categorical Features into Numbers\n", + "3. Find and Remove Outliers" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "##### Handling Missing Values\n", + "Below, let's check to see if there are any NaNs in our data" + ] + }, + { + "cell_type": "code", + "execution_count": 115, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "id 0\n", + "date 0\n", + "price 0\n", + "bedrooms 0\n", + "bathrooms 0\n", + "sqft_living 0\n", + "sqft_lot 0\n", + "floors 0\n", + "waterfront 2376\n", + "view 63\n", + "condition 0\n", + "grade 0\n", + "sqft_above 0\n", + "sqft_basement 0\n", + "yr_built 0\n", + "yr_renovated 3842\n", + "zipcode 0\n", + "lat 0\n", + "long 0\n", + "sqft_living15 0\n", + "sqft_lot15 0\n", + "dtype: int64" + ] + }, + "execution_count": 115, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "#locate missing values\n", + "df.isna().sum()" + ] + }, + { + "cell_type": "code", + "execution_count": 116, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "id 0.0\n", + "date 0.0\n", + "price 0.0\n", + "bedrooms 0.0\n", + "bathrooms 0.0\n", + "sqft_living 0.0\n", + "sqft_lot 0.0\n", + "floors 0.0\n", + "waterfront 11.00152798999861\n", + "view 0.29170718155299347\n", + "condition 0.0\n", + "grade 0.0\n", + "sqft_above 0.0\n", + "sqft_basement 0.0\n", + "yr_built 0.0\n", + "yr_renovated 17.78950780200954\n", + "zipcode 0.0\n", + "lat 0.0\n", + "long 0.0\n", + "sqft_living15 0.0\n", + "sqft_lot15 0.0\n" + ] + } + ], + "source": [ + "#dealing with missing values\n", + "for column in df.columns:\n", + " percentage_of_nan = (sum(df[column].isnull())/len(df[column])) * 100 \n", + " print(column, percentage_of_nan)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The feature 'waterfront' is the only feature with missing values and about 11% of the values have NaNs. Lets investigate this feature to handle it's missing values" + ] + }, + { + "cell_type": "code", + "execution_count": 117, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "waterfront\n", + "NO 19075\n", + "YES 146\n", + "Name: count, dtype: int64" + ] + }, + "execution_count": 117, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df['waterfront'].value_counts()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We can see that the 'waterfront' feature only has two values, yes or no.\n", + "Thus NaN values can be considered no because they do not exist in their homes." + ] + }, + { + "cell_type": "code", + "execution_count": 118, + "metadata": {}, + "outputs": [], + "source": [ + "df['waterfront'].fillna('NO', inplace=True)" + ] + }, + { + "cell_type": "code", + "execution_count": 119, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "waterfront\n", + "NO 21451\n", + "YES 146\n", + "Name: count, dtype: int64" + ] + }, + "execution_count": 119, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df['waterfront'].value_counts()" + ] + }, + { + "cell_type": "code", + "execution_count": 120, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "id 0\n", + "date 0\n", + "price 0\n", + "bedrooms 0\n", + "bathrooms 0\n", + "sqft_living 0\n", + "sqft_lot 0\n", + "floors 0\n", + "waterfront 0\n", + "view 63\n", + "condition 0\n", + "grade 0\n", + "sqft_above 0\n", + "sqft_basement 0\n", + "yr_built 0\n", + "yr_renovated 3842\n", + "zipcode 0\n", + "lat 0\n", + "long 0\n", + "sqft_living15 0\n", + "sqft_lot15 0\n", + "dtype: int64" + ] + }, + "execution_count": 120, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "#recheck for missing values\n", + "df.isna().sum()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "##### Convert Categorical Features into Numbers" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Our model would crash because some of the columns are non-numeric. Features with a numeric data type will work with our model, but these features need to be converted:\n", + "* waterfront (object)\n", + "* condition (object)\n", + "* grade (object)\n", + "\n", + "Let's inspect the value counts of the specified features:" + ] + }, + { + "cell_type": "code", + "execution_count": 121, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "waterfront\n", + "NO 21451\n", + "YES 146\n", + "Name: count, dtype: int64\n", + "\n", + "condition\n", + "Average 14020\n", + "Good 5677\n", + "Very Good 1701\n", + "Fair 170\n", + "Poor 29\n", + "Name: count, dtype: int64\n", + "\n", + "grade\n", + "7 Average 8974\n", + "8 Good 6065\n", + "9 Better 2615\n", + "6 Low Average 2038\n", + "10 Very Good 1134\n", + "11 Excellent 399\n", + "5 Fair 242\n", + "12 Luxury 89\n", + "4 Low 27\n", + "13 Mansion 13\n", + "3 Poor 1\n", + "Name: count, dtype: int64\n" + ] + } + ], + "source": [ + "print(df['waterfront'].value_counts())\n", + "print()\n", + "print(df['condition'].value_counts())\n", + "print()\n", + "print(df['grade'].value_counts())" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "##### Split function to seperate the numeric value of 'grade'" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The Grade feature is an object data type however the numeric grade is listed in the front. We will use a simple string split function to isolate the numeric part of the feature.\n", "\n", - "Importing data." + "Waterfront has only 2 categories and can be converted into binary in place, whereas Condition has more than 2 categories and will need to be expanded into multiple columns." ] }, { "cell_type": "code", - "execution_count": 50, + "execution_count": 122, "metadata": {}, "outputs": [], "source": [ - "#importing libraries \n", - "import pandas as pd\n", - "import numpy as np\n", - "from matplotlib import pyplot as plt\n", - "import seaborn as sns\n", - "from sklearn import metrics\n", - "from sklearn.preprocessing import OneHotEncoder, StandardScaler\n", - "from sklearn.linear_model import LinearRegression\n", - "import statsmodels.api as sm\n", - "from statsmodels.formula.api import ols\n", - "from scipy import stats\n", - "from sklearn.linear_model import LinearRegression\n", - "from sklearn import tree\n", - "from sklearn.model_selection import train_test_split\n", - "from sklearn.tree import DecisionTreeRegressor\n", - "from sklearn.dummy import DummyRegressor" + "df = df.assign(grade=df.grade.str.split(' ')).explode('grade')" ] }, { - "cell_type": "markdown", + "cell_type": "code", + "execution_count": 123, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "False 46366\n", + "Name: count, dtype: int64" + ] + }, + "execution_count": 123, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df.duplicated().value_counts()" + ] + }, + { + "cell_type": "code", + "execution_count": 124, + "metadata": {}, + "outputs": [], + "source": [ + "df = df.drop_duplicates()" + ] + }, + { + "cell_type": "code", + "execution_count": 125, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(46366, 21)" + ] + }, + "execution_count": 125, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df.shape" + ] + }, + { + "cell_type": "code", + "execution_count": 126, "metadata": {}, + "outputs": [], "source": [ - "##### Removing irrelvant columns" + "df = df.drop_duplicates(subset='id')" ] }, { "cell_type": "code", - "execution_count": 51, + "execution_count": 127, "metadata": {}, "outputs": [ { @@ -188,10 +1262,10 @@ " 1180\n", " 5650\n", " 1.00000\n", - " NaN\n", + " NO\n", " NONE\n", " ...\n", - " 7 Average\n", + " 7\n", " 1180\n", " 0.0\n", " 1955\n", @@ -215,7 +1289,7 @@ " NO\n", " NONE\n", " ...\n", - " 7 Average\n", + " 7\n", " 2170\n", " 400.0\n", " 1951\n", @@ -227,30 +1301,6 @@ " 7639\n", " \n", " \n", - " 2\n", - " 5631500400\n", - " 2/25/2015\n", - " 180000.00000\n", - " 2\n", - " 1.00000\n", - " 770\n", - " 10000\n", - " 1.00000\n", - " NO\n", - " NONE\n", - " ...\n", - " 6 Low Average\n", - " 770\n", - " 0.0\n", - " 1933\n", - " NaN\n", - " 98028\n", - " 47.73790\n", - " -122.23300\n", - " 2720\n", - " 8062\n", - " \n", - " \n", " 3\n", " 2487200875\n", " 12/9/2014\n", @@ -263,7 +1313,7 @@ " NO\n", " NONE\n", " ...\n", - " 7 Average\n", + " 7\n", " 1050\n", " 910.0\n", " 1965\n", @@ -287,7 +1337,7 @@ " NO\n", " NONE\n", " ...\n", - " 8 Good\n", + " 8\n", " 1680\n", " 0.0\n", " 1987\n", @@ -298,57 +1348,247 @@ " 1800\n", " 7503\n", " \n", + " \n", + " 5\n", + " 7237550310\n", + " 5/12/2014\n", + " 1230000.00000\n", + " 4\n", + " 4.50000\n", + " 5420\n", + " 101930\n", + " 1.00000\n", + " NO\n", + " NONE\n", + " ...\n", + " 11\n", + " 3890\n", + " 1530.0\n", + " 2001\n", + " 0.00000\n", + " 98053\n", + " 47.65610\n", + " -122.00500\n", + " 4760\n", + " 101930\n", + " \n", + " \n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " \n", + " \n", + " 21592\n", + " 263000018\n", + " 5/21/2014\n", + " 360000.00000\n", + " 3\n", + " 2.50000\n", + " 1530\n", + " 1131\n", + " 3.00000\n", + " NO\n", + " NONE\n", + " ...\n", + " 8\n", + " 1530\n", + " 0.0\n", + " 2009\n", + " 0.00000\n", + " 98103\n", + " 47.69930\n", + " -122.34600\n", + " 1530\n", + " 1509\n", + " \n", + " \n", + " 21593\n", + " 6600060120\n", + " 2/23/2015\n", + " 400000.00000\n", + " 4\n", + " 2.50000\n", + " 2310\n", + " 5813\n", + " 2.00000\n", + " NO\n", + " NONE\n", + " ...\n", + " 8\n", + " 2310\n", + " 0.0\n", + " 2014\n", + " 0.00000\n", + " 98146\n", + " 47.51070\n", + " -122.36200\n", + " 1830\n", + " 7200\n", + " \n", + " \n", + " 21594\n", + " 1523300141\n", + " 6/23/2014\n", + " 402101.00000\n", + " 2\n", + " 0.75000\n", + " 1020\n", + " 1350\n", + " 2.00000\n", + " NO\n", + " NONE\n", + " ...\n", + " 7\n", + " 1020\n", + " 0.0\n", + " 2009\n", + " 0.00000\n", + " 98144\n", + " 47.59440\n", + " -122.29900\n", + " 1020\n", + " 2007\n", + " \n", + " \n", + " 21595\n", + " 291310100\n", + " 1/16/2015\n", + " 400000.00000\n", + " 3\n", + " 2.50000\n", + " 1600\n", + " 2388\n", + " 2.00000\n", + " NO\n", + " NONE\n", + " ...\n", + " 8\n", + " 1600\n", + " 0.0\n", + " 2004\n", + " 0.00000\n", + " 98027\n", + " 47.53450\n", + " -122.06900\n", + " 1410\n", + " 1287\n", + " \n", + " \n", + " 21596\n", + " 1523300157\n", + " 10/15/2014\n", + " 325000.00000\n", + " 2\n", + " 0.75000\n", + " 1020\n", + " 1076\n", + " 2.00000\n", + " NO\n", + " NONE\n", + " ...\n", + " 7\n", + " 1020\n", + " 0.0\n", + " 2008\n", + " 0.00000\n", + " 98144\n", + " 47.59410\n", + " -122.29900\n", + " 1020\n", + " 1357\n", + " \n", " \n", "\n", - "

5 rows × 21 columns

\n", + "

17565 rows × 21 columns

\n", "" ], "text/plain": [ - " id date price bedrooms bathrooms sqft_living \\\n", - "0 7129300520 10/13/2014 221900.00000 3 1.00000 1180 \n", - "1 6414100192 12/9/2014 538000.00000 3 2.25000 2570 \n", - "2 5631500400 2/25/2015 180000.00000 2 1.00000 770 \n", - "3 2487200875 12/9/2014 604000.00000 4 3.00000 1960 \n", - "4 1954400510 2/18/2015 510000.00000 3 2.00000 1680 \n", + " id date price bedrooms bathrooms sqft_living \\\n", + "0 7129300520 10/13/2014 221900.00000 3 1.00000 1180 \n", + "1 6414100192 12/9/2014 538000.00000 3 2.25000 2570 \n", + "3 2487200875 12/9/2014 604000.00000 4 3.00000 1960 \n", + "4 1954400510 2/18/2015 510000.00000 3 2.00000 1680 \n", + "5 7237550310 5/12/2014 1230000.00000 4 4.50000 5420 \n", + "... ... ... ... ... ... ... \n", + "21592 263000018 5/21/2014 360000.00000 3 2.50000 1530 \n", + "21593 6600060120 2/23/2015 400000.00000 4 2.50000 2310 \n", + "21594 1523300141 6/23/2014 402101.00000 2 0.75000 1020 \n", + "21595 291310100 1/16/2015 400000.00000 3 2.50000 1600 \n", + "21596 1523300157 10/15/2014 325000.00000 2 0.75000 1020 \n", "\n", - " sqft_lot floors waterfront view ... grade sqft_above \\\n", - "0 5650 1.00000 NaN NONE ... 7 Average 1180 \n", - "1 7242 2.00000 NO NONE ... 7 Average 2170 \n", - "2 10000 1.00000 NO NONE ... 6 Low Average 770 \n", - "3 5000 1.00000 NO NONE ... 7 Average 1050 \n", - "4 8080 1.00000 NO NONE ... 8 Good 1680 \n", + " sqft_lot floors waterfront view ... grade sqft_above sqft_basement \\\n", + "0 5650 1.00000 NO NONE ... 7 1180 0.0 \n", + "1 7242 2.00000 NO NONE ... 7 2170 400.0 \n", + "3 5000 1.00000 NO NONE ... 7 1050 910.0 \n", + "4 8080 1.00000 NO NONE ... 8 1680 0.0 \n", + "5 101930 1.00000 NO NONE ... 11 3890 1530.0 \n", + "... ... ... ... ... ... ... ... ... \n", + "21592 1131 3.00000 NO NONE ... 8 1530 0.0 \n", + "21593 5813 2.00000 NO NONE ... 8 2310 0.0 \n", + "21594 1350 2.00000 NO NONE ... 7 1020 0.0 \n", + "21595 2388 2.00000 NO NONE ... 8 1600 0.0 \n", + "21596 1076 2.00000 NO NONE ... 7 1020 0.0 \n", "\n", - " sqft_basement yr_built yr_renovated zipcode lat long \\\n", - "0 0.0 1955 0.00000 98178 47.51120 -122.25700 \n", - "1 400.0 1951 1991.00000 98125 47.72100 -122.31900 \n", - "2 0.0 1933 NaN 98028 47.73790 -122.23300 \n", - "3 910.0 1965 0.00000 98136 47.52080 -122.39300 \n", - "4 0.0 1987 0.00000 98074 47.61680 -122.04500 \n", + " yr_built yr_renovated zipcode lat long sqft_living15 \\\n", + "0 1955 0.00000 98178 47.51120 -122.25700 1340 \n", + "1 1951 1991.00000 98125 47.72100 -122.31900 1690 \n", + "3 1965 0.00000 98136 47.52080 -122.39300 1360 \n", + "4 1987 0.00000 98074 47.61680 -122.04500 1800 \n", + "5 2001 0.00000 98053 47.65610 -122.00500 4760 \n", + "... ... ... ... ... ... ... \n", + "21592 2009 0.00000 98103 47.69930 -122.34600 1530 \n", + "21593 2014 0.00000 98146 47.51070 -122.36200 1830 \n", + "21594 2009 0.00000 98144 47.59440 -122.29900 1020 \n", + "21595 2004 0.00000 98027 47.53450 -122.06900 1410 \n", + "21596 2008 0.00000 98144 47.59410 -122.29900 1020 \n", "\n", - " sqft_living15 sqft_lot15 \n", - "0 1340 5650 \n", - "1 1690 7639 \n", - "2 2720 8062 \n", - "3 1360 5000 \n", - "4 1800 7503 \n", + " sqft_lot15 \n", + "0 5650 \n", + "1 7639 \n", + "3 5000 \n", + "4 7503 \n", + "5 101930 \n", + "... ... \n", + "21592 1509 \n", + "21593 7200 \n", + "21594 2007 \n", + "21595 1287 \n", + "21596 1357 \n", "\n", - "[5 rows x 21 columns]" + "[17565 rows x 21 columns]" ] }, - "execution_count": 51, + "execution_count": 127, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "#load and preiview data\n", - "df = pd.read_csv('data/kc_house_data.csv')\n", - "df.head()\n" + "df.dropna()" ] }, { "cell_type": "code", - "execution_count": 52, + "execution_count": 128, "metadata": {}, "outputs": [ { @@ -356,33 +1596,33 @@ "output_type": "stream", "text": [ "\n", - "RangeIndex: 21597 entries, 0 to 21596\n", + "Index: 21420 entries, 0 to 21596\n", "Data columns (total 21 columns):\n", " # Column Non-Null Count Dtype \n", "--- ------ -------------- ----- \n", - " 0 id 21597 non-null int64 \n", - " 1 date 21597 non-null object \n", - " 2 price 21597 non-null float64\n", - " 3 bedrooms 21597 non-null int64 \n", - " 4 bathrooms 21597 non-null float64\n", - " 5 sqft_living 21597 non-null int64 \n", - " 6 sqft_lot 21597 non-null int64 \n", - " 7 floors 21597 non-null float64\n", - " 8 waterfront 19221 non-null object \n", - " 9 view 21534 non-null object \n", - " 10 condition 21597 non-null object \n", - " 11 grade 21597 non-null object \n", - " 12 sqft_above 21597 non-null int64 \n", - " 13 sqft_basement 21597 non-null object \n", - " 14 yr_built 21597 non-null int64 \n", - " 15 yr_renovated 17755 non-null float64\n", - " 16 zipcode 21597 non-null int64 \n", - " 17 lat 21597 non-null float64\n", - " 18 long 21597 non-null float64\n", - " 19 sqft_living15 21597 non-null int64 \n", - " 20 sqft_lot15 21597 non-null int64 \n", + " 0 id 21420 non-null int64 \n", + " 1 date 21420 non-null object \n", + " 2 price 21420 non-null float64\n", + " 3 bedrooms 21420 non-null int64 \n", + " 4 bathrooms 21420 non-null float64\n", + " 5 sqft_living 21420 non-null int64 \n", + " 6 sqft_lot 21420 non-null int64 \n", + " 7 floors 21420 non-null float64\n", + " 8 waterfront 21420 non-null object \n", + " 9 view 21357 non-null object \n", + " 10 condition 21420 non-null object \n", + " 11 grade 21420 non-null object \n", + " 12 sqft_above 21420 non-null int64 \n", + " 13 sqft_basement 21420 non-null object \n", + " 14 yr_built 21420 non-null int64 \n", + " 15 yr_renovated 17616 non-null float64\n", + " 16 zipcode 21420 non-null int64 \n", + " 17 lat 21420 non-null float64\n", + " 18 long 21420 non-null float64\n", + " 19 sqft_living15 21420 non-null int64 \n", + " 20 sqft_lot15 21420 non-null int64 \n", "dtypes: float64(6), int64(9), object(6)\n", - "memory usage: 3.5+ MB\n" + "memory usage: 3.6+ MB\n" ] } ], @@ -390,181 +1630,65 @@ "df.info()" ] }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We see that waterfrront is missing about 11% of its values, year renovated is missing about 17% of its values and view is missing a few values as well. " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Data Preparation" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Data Cleaning\n" - ] - }, - { - "cell_type": "code", - "execution_count": 53, - "metadata": {}, - "outputs": [], - "source": [ - "#drop irrelevant columns\n", - "df.drop(['id', 'date', 'zipcode', 'lat', 'long', 'yr_renovated', 'view'],\n", - " axis=1, inplace=True)" - ] - }, - { - "cell_type": "code", - "execution_count": 54, - "metadata": {}, - "outputs": [], - "source": [ - "#fill in missing sqft_basement values\n", - "df.loc[df.sqft_basement == '?', 'sqft_basement'] = (\n", - " df[df.sqft_basement == '?'].sqft_living - \n", - " df[df.sqft_basement == '?'].sqft_above\n", - ")\n", - "\n", - "#convert into numeric\n", - "df['sqft_basement'] = df.sqft_basement.astype('float64')\n", - "\n", - "#sqft_basement is a zero inflated variable, so I convert it into \n", - "#a categorical variable\n", - "df['is_basement'] = df.sqft_basement.map(lambda x: 0 if x == 0 else 1)\n", - "df.drop('sqft_basement', axis=1, inplace=True)" - ] - }, { "cell_type": "code", - "execution_count": 55, + "execution_count": 129, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "grade\n", + "7 8889\n", + "8 6041\n", + "9 2606\n", + "6 1995\n", + "10 1130\n", + "11 396\n", + "5 234\n", + "12 88\n", + "4 27\n", + "13 13\n", + "3 1\n", + "Name: count, dtype: int64" + ] + }, + "execution_count": 129, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ - "#convert condition and grade into numeric values\n", - "df['condition'] = df.condition.map(lambda x: 0 if x=='Poor' \n", - " else (1 if x=='Fair'\n", - " else (2 if x=='Average'\n", - " else (3 if x=='Good' else 4))))\n", - "\n", - "df['grade'] = df.grade.map(lambda x: int(x[0:2]) - 3)" + "df['grade'].value_counts()" ] }, { - "cell_type": "code", - "execution_count": 56, + "cell_type": "markdown", "metadata": {}, - "outputs": [], "source": [ - "#convert waterfront strings to 0 and 1\n", - "df['waterfront'] = df.waterfront.map(lambda x: 0 if x==\"NO\" \n", - " else (1 if x==\"YES\" else None))\n", - "\n", - "#create new column indicating if waterfront value is missing\n", - "waterfront = df[[\"waterfront\"]]\n", - "missing_indicator = MissingIndicator()\n", - "missing_indicator.fit(waterfront)\n", - "waterfront_missing = missing_indicator.transform(waterfront)\n", - "\n", - "#add waterfront missing to dataframe and convert to binary\n", - "df['waterfront_missing'] = waterfront_missing\n", - "\n", - "df['waterfront_missing'] = df.waterfront_missing.map(lambda x: 0 if x==False\n", - " else 1)\n" + "The most common buiding grade is a 7" ] }, { "cell_type": "code", - "execution_count": 57, + "execution_count": 130, "metadata": {}, "outputs": [], "source": [ - "#fill in missing waterfront values with median\n", - "imputer = SimpleImputer(strategy=\"median\")\n", - "\n", - "imputer.fit(waterfront)\n", - "waterfront_imputed = imputer.transform(waterfront)\n", - "\n", - "df['waterfront'] = waterfront_imputed" - ] - }, - { - "cell_type": "code", - "execution_count": 58, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n", - "Index: 19479 entries, 0 to 21596\n", - "Data columns (total 12 columns):\n", - " # Column Non-Null Count Dtype \n", - "--- ------ -------------- ----- \n", - " 0 price 19479 non-null float64\n", - " 1 bedrooms 19479 non-null float64\n", - " 2 bathrooms 19479 non-null float64\n", - " 3 sqft_living 19479 non-null float64\n", - " 4 sqft_lot 19479 non-null float64\n", - " 5 floors 19479 non-null float64\n", - " 6 sqft_above 19479 non-null float64\n", - " 7 sqft_living15 19479 non-null float64\n", - " 8 sqft_lot15 19479 non-null float64\n", - " 9 grade_num 19479 non-null float64\n", - " 10 bed_bath_ratio 19479 non-null float64\n", - " 11 mean_price 19479 non-null float64\n", - "dtypes: float64(12)\n", - "memory usage: 1.9 MB\n" - ] - } - ], - "source": [ - "#removing outliers \n", - "\n", - "#make a copy of the clean dataframe \n", - "no_out = main_df.copy()\n", - "\n", - "#drop columns that we cannot use \n", - "no_out = no_out.drop(columns= ['id', 'zip_city', 'Waterfront'], axis=1)\n", - "\n", - "#change data type so that we can math \n", - "no_out = no_out.astype('float')\n", - "\n", - "#pull out the columns \n", - "columns = no_out.columns\n", - "\n", - "#for each column in the dataframe, get the mean and standard deviation \n", - "#then get the z-score for within 3 standard devaitions\n", - "for col in columns:\n", - " \n", - " mean = no_out[col].mean()\n", - " sd = no_out[col].std()\n", - " \n", - " no_out = no_out[(no_out[col] <= mean+(3*sd))]\n", - " \n", - "pd.set_option('display.float_format', lambda x: '%.5f' % x)\n", - "no_out.info()" + "# Change the data type from object to int.\n", + "df['grade'] = df['grade'].astype(int)" ] }, { "cell_type": "code", - "execution_count": 59, + "execution_count": 131, "metadata": {}, "outputs": [ { "data": { - "image/png": "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11xzTcrLyzNixIhccMEFOffcc3PllVcmSfbcc8/84x//yI033ph///vfGTBgQH70ox/l1VdfTZKMGDEie+21Vw488MCMHj06G2+8cU4//fQ5nuO1117LzTffnNtuuy2jR49Okmy//faZPHlyHnnkkdx///0ZO3Zsdt5555p1br/99hx22GE54ogj8vzzz2f//ffPnnvumYcffrjWtk877bQMHDgwo0ePzrLLLptdd901+++/f4YMGVJTVhx88ME143fbbbcsuuiiGTlyZEaNGpVjjz02FRUVdXpMAQAAAABgfpSXOkDR9OzZM+eee27KysqyzDLL5Lnnnsu5556bTTbZJH/+85/zzjvvpEePHkmSI488Mvfee2+uvvrq/Pa3v83555+fLbfcMscee2ySpE+fPnniiSdy77331nqOGTNm5Nprr03nzp2TJPfff3/+/e9/54033kjPnj2TJNdee22WX375jBw5MmussUbOPvvsDBo0KAceeGCSZPDgwXnqqady9tlnZ+ONN67Z9p577pmddtopSXLMMcdknXXWyQknnJAtt9wySXLYYYdlzz33rBk/bty4HHXUUVl22WWTJEsvvfQ3Hp/p06dn+vTptZbNqq5MeVnjBTjKAAAAAAAwJzM1FtDaa6+dsrKymvvrrLNOXn311Tz99NOprq5Onz590qpVq5rbI488UnM6pzFjxmSdddaptb2v30+SXr161RQa/12vZ8+eNYVGkvTt2zft2rXLmDFjasb079+/1nb69+9f8/h/rbjiijX/7tq1a5KkX79+tZZ98cUXmTZtWpLZ5cg+++yTzTbbLL/73e9qnZpqbs4444y0bdu21u3JqS9+4zoAAAAAADA/lBp1qHHjxhk1alRGjx5dcxszZkzOP//8JKm59sa3admyZa371dXVtYqUeS3/+pi5rffVU0f997G5Lauqmn0OtZNPPjkvvPBCtt566zz00EPp27dvbr/99nlmHzJkSKZOnVrrtk7bvt+4vwAAAAAAMD+UGgvoqaeemuP+0ksvnVVWWSWVlZWZMGFCllpqqVq3bt26JZk9u2Ju63+bvn37Zty4cXn77bdrlr344ouZOnVqlltuuSTJcsstl8cff7zWek888UTN4/+LPn365Fe/+lXuu+++7Ljjjrn66qvnObZp06Zp06ZNrZtTTwEAAAAAUBdcU2MBvf32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J2fllVfOVVddlcUWWyytWrXKAQcckMrKyvz+979Pt27d0qVLl/zmN7+ptd2TTz45iy22WJo2bZoePXrk0EMPrZPjCwAAAABQL6qq3Bb0VhBKjW9wzTXXpLy8PCNGjMgFF1yQc889N1deeWWSZMaMGTnttNPyr3/9K3fccUfeeOONmuKiZ8+eue2225IkL7/8csaPH5/zzz+/1nZbtmyZESNG5Pe//31OPfXU3H///bWe+6STTsp2222X5557LnvttVduv/32HHbYYTniiCPy/PPPZ//998+ee+6Zhx9+OElSXV2d7bffPpMnT84jjzyS+++/P2PHjs3OO+9ca7tjx47N3/72t9x7773585//nKuuuipbb7113nnnnTzyyCM588wzc/zxx+epp55Kktx6660599xzc/nll+fVV1/NHXfckX79+tXL8QYAAAAAgG9SXuoA32c9e/bMueeem7KysiyzzDJ57rnncu6552bffffNXnvtVTNuiSWWyAUXXJA111wzn3zySVq1apUOHTokSbp06ZJ27drV2u6KK66Yk046KUmy9NJL56KLLsqDDz6YzTffvGbMrrvuWus5dt111wwaNCgHHnhgkmTw4MF56qmncvbZZ2fjjTfOAw88kH//+99544030rNnzyTJtddem+WXXz4jR47MGmuskWT2LJGrrroqrVu3Tt++fbPxxhvn5Zdfzj333JNGjRplmWWWyZlnnpnhw4dn7bXXzrhx49KtW7dsttlmqaioyGKLLZY111yz7g82AAAAAAB8CzM1vsHaa6+dsrKymvvrrLNOXn311VRWVubZZ5/Ndtttl169eqV169bZaKONksw+BdS3WXHFFWvd7969e82pq/5r9dVXr3V/zJgx6d+/f61l/fv3z5gxY2oe79mzZ02hkSR9+/ZNu3btasYkSe/evdO6deua+127dk3fvn3TqFGjWsv+m2fAgAH5/PPPs8QSS2TffffN7bffnlmzZs1z36ZPn55p06bVus2orvzG4wEAAAAAAPNDqfEdfPHFF9liiy3SqlWrXHfddRk5cmRuv/32JLNPS/VtKioqat0vKytL1dfOWdayZcs51vtqwZLMPuXUf5d99d/zGjOv5/6mPD179szLL7+ciy++OM2bN8+BBx6YDTbYYJ4XLz/jjDPStm3bWrcrPxo717EAAAAAALAglBrf4L/Xlfjq/aWXXjovvfRSJk6cmN/97ndZf/31s+yyy84x06JJkyZJksrKupmlsNxyy+Xxxx+vteyJJ57Icsstl2T2rIxx48bl7bffrnn8xRdfzNSpU2vGfFfNmzfPtttumwsuuCDDhw/Pk08+meeee26uY4cMGZKpU6fWuu3Tbsn/6fkBAAAAACBxTY1v9Pbbb2fw4MHZf//988wzz+TCCy/M0KFDs9hii6VJkya58MIL88tf/jLPP/98TjvttFrr9urVK2VlZbn77rvz4x//OM2bN0+rVq2+c5ajjjoqO+20U1ZdddVsuummueuuu/KXv/wlDzzwQJJks802y4orrpjddtst5513XmbNmpUDDzwwG2644RynsloQw4YNS2VlZdZaa620aNEi1157bZo3b55evXrNdXzTpk3TtGnTWsualDX+zs8PAAAAALDAvnZmHBoOMzW+wcCBA/P5559nzTXXzEEHHZRDDjkk++23Xzp37pxhw4bllltuSd++ffO73/0uZ599dq11F1lkkZxyyik59thj07Vr1xx88MH/U5btt98+559/fs4666wsv/zyufzyy3P11VfXXMujrKwsd9xxR9q3b58NNtggm222WZZYYoncdNNN/9PztmvXLldccUX69++fFVdcMQ8++GDuuuuudOzY8X/aLgAAAAAALKiy6urq6lKHoGF7fomflDpCgzGrUg9ZF5YfdV6pIzQYM68+vdQRGowVzny21BEahJubzX0mIQtum09eKXWEBqNbs/aljtAgDN+qeakjNBiNmld8+yDmy6t3NSl1hAahY+dPSx2hwdh43KRSR2gwFm3aodQRGoQnP3yp1BEajJkz3i11hML5/OZTSx2hcJrvdGKpI8wXfyEFAAAAAAAKQakBAAAAAAAUglIDAAAAAAAohPJSBwAAAAAAgDrlUtINlpkaAAAAAABAISg1AAAAAACAQlBqAAAAAAAAhaDUAAAAAAAACkGpAQAAAAAAFEJ5qQMAAAAAAECdqqoqdQLqiZkaAAAAAABAISg1AAAAAACAQlBqAAAAAAAAhaDUAAAAAAAACkGpAQAAAAAAFEJ5qQMAAAAAAECdqqoqdQLqiZkaAAAAAABAISg1AAAAAACAQlBqAAAAAAAAhaDUAAAAAAAACkGpAQAAAAAAFEJ5qQMAAAAAAECdqq4qdQLqiZkaAAAAAABAISg1AAAAAACAQlBqAAAAAAAAhaDUAAAAAAAACkGpAQAAAAAAFEJ5qQMAAAAAAECdqqoqdQLqiZkaAAAAAABAISg1AAAAAACAQlBqAAAAAAAAhaDUAAAAAAAACkGpAQAAAAAAFEJ5qQMAAAAAAECdqq4udQLqiZkaAAAAAABAISg1AAAAAACAQlBqAAAAAAAAhaDUAAAAAAAACkGpAQAAAAAAFEJ5qQMAAAAAAECdqqoqdQLqiZkaAAAAAABAISg1AAAAAACAQlBqAAAAAAAAC+ySSy7J4osvnmbNmmW11VbLY4899o3jr7/++qy00kpp0aJFunfvnj333DOTJk1aoOdUagAAAAAAAAvkpptuyuGHH57jjjsuzz77bNZff/1stdVWGTdu3FzHP/744xk4cGD23nvvvPDCC7nlllsycuTI7LPPPgv0vEoNAAAAAABggZxzzjnZe++9s88++2S55ZbLeeedl549e+bSSy+d6/innnoqvXv3zqGHHprFF1886623Xvbff/88/fTTC/S8Sg0AAAAAABqWqiq3BbxNnz4906ZNq3WbPn36XA/vjBkzMmrUqGyxxRa1lm+xxRZ54okn5rrOuuuum3feeSf33HNPqqur88EHH+TWW2/N1ltvvUD/teULNBq+g97b687qypTHPi11hAZh5tWnlzpCg1Gx5/GljtBgLH7+L0sdoUF4pFGrUkdoMNo2aVnqCA3G+C8mlzpCg1DRb71SR2gwylZao9QRGow77nmk1BEahGN/3rHUERqMpS+oKHWEBqNZWeNSRwBY6M4444yccsoptZaddNJJOfnkk+cYO3HixFRWVqZr1661lnft2jXvv//+XLe/7rrr5vrrr8/OO++cL774IrNmzcq2226bCy+8cIFy+mszAAAAAAD8wA0ZMiRTp06tdRsyZMg3rlNWVlbrfnV19RzL/uvFF1/MoYcemhNPPDGjRo3KvffemzfeeCO//OWCfdDTTA0AAAAAAPiBa9q0aZo2bTpfYzt16pTGjRvPMStjwoQJc8ze+K8zzjgj/fv3z1FHHZUkWXHFFdOyZcusv/76Of3009O9e/f5em4zNQAAAAAAgPnWpEmTrLbaarn//vtrLb///vuz7rrrznWdzz77LI0a1a4kGjeefbq/6urq+X5upQYAAAAAALBABg8enCuvvDJXXXVVxowZk1/96lcZN25czemkhgwZkoEDB9aM32abbfKXv/wll156aV5//fX84x//yKGHHpo111wzPXr0mO/ndfopAAAAAAAaluqqUido8HbeeedMmjQpp556asaPH58VVlgh99xzT3r16pUkGT9+fMaNG1czftCgQfn4449z0UUX5Ygjjki7du2yySab5Mwzz1yg51VqAAAAAAAAC+zAAw/MgQceONfHhg0bNseyQw45JIcccsj/9JxOPwUAAAAAABSCUgMAAAAAACgEpQYAAAAAAFAISg0AAAAAAKAQXCgcAAAAAIAGpbqqutQRqCdmagAAAAAAAIWg1AAAAAAAAApBqQEAAAAAABSCUgMAAAAAACgEpQYAAAAAAFAI5aUOAAAAAAAAdaqqqtQJqCdmagAAAAAAAIWg1AAAAAAAAApBqQEAAAAAABSCUgMAAAAAACgEpQYAAAAAAFAI5aUOAAAAAAAAdaq6qtQJqCdmagAAAAAAAIWg1AAAAAAAAApBqQEAAAAAABSCUgMAAAAAACgEpQYAAAAAAFAI5aUOAAAAAAAAdaqqutQJqCdmagAAAAAAAIWg1AAAAAAAAApBqQEAAAAAABSCUgMAAAAAACgEpQYAAAAAAFAI5aUOAAAAAAAAdaqqqtQJqCdmagAAAAAAAIWg1AAAAAAAAApBqQEAAAAAABSCUgMAAAAAACgEpQYAAAAAAFAI5aUOAAAAAAAAdaqqqtQJqCdmagAAAAAAAIWg1AAAAAAAAApBqQEAAAAAABSCUmMhqK6uzn777ZcOHTqkrKwso0ePXuBtnHzyyVl55ZVr7g8aNCjbb7/9d14fAAAAAACKRqmxENx7770ZNmxY7r777owfPz4rrLBCysrKcscdd3znbZ5//vkZNmzYfI8/8sgj8+CDD37n5wMAAAAAgFIrL3WAH4KxY8eme/fuWXfddetsm23btl2g8a1atUqrVq3q7PkBAAAAAL63qqtLnYB6YqbGfLr11lvTr1+/NG/ePB07dsxmm22WTz/9NJWVlRk8eHDatWuXjh075uijj84ee+xRc2qoQYMG5ZBDDsm4ceNSVlaW3r17p3fv3kmSHXbYoWbZgvrq6acuv/zyLLLIIqmqqqo1Ztttt80ee+yRZN6nrzr77LPTvXv3dOzYMQcddFBmzpxZM2b8+PHZeuut07x58yy++OK54YYb0rt375x33nkLnBcAAAAAAP5XSo35MH78+Pz85z/PXnvtlTFjxmT48OHZcccdU11dnaFDh+aqq67KH//4xzz++OOZPHlybr/99pp1zz///Jx66qlZdNFFM378+IwcOTIjR45Mklx99dU1y/4XAwYMyMSJE/Pwww/XLJsyZUr+/ve/Z7fddpvneg8//HDGjh2bhx9+ONdcc02GDRtW65RWAwcOzHvvvZfhw4fntttuyx/+8IdMmDDhf8oKAAAAAADfldNPzYfx48dn1qxZ2XHHHdOrV68kSb9+/ZIk5513XoYMGZKf/vSnSZLLLrssf//732vWbdu2bVq3bp3GjRunW7dutbbbrl27OZZ9Fx06dMiPfvSj3HDDDdl0002TJLfccks6dOhQc39u2rdvn4suuiiNGzfOsssum6233joPPvhg9t1337z00kt54IEHMnLkyKy++upJkiuvvDJLL730N2aZPn16pk+fXmvZzFmVaVre+H/cSwAAAAAAfujM1JgPK620UjbddNP069cvAwYMyBVXXJEpU6Zk6tSpGT9+fNZZZ52aseXl5TUlwMK022675bbbbqspFK6//vrssssuadx43mXC8ssvX+vx7t2718zEePnll1NeXp5VV1215vGllloq7du3/8YcZ5xxRtq2bVvrNnTka//LrgEAAAAAQBKlxnxp3Lhx7r///vztb39L3759c+GFF2aZZZbJm2++WepoNbbZZptUVVXlr3/9a95+++089thj2X333b9xnYqKilr3y8rKaq7LUT2PC+nMa/l/DRkyJFOnTq11O2KNpRZgTwAAAAAAYO6cfmo+lZWVpX///unfv39OPPHE9OrVKw8++GC6d++ep556KhtssEGSZNasWRk1alStGQ5zU1FRkcrKyjrL17x58+y44465/vrr89prr6VPnz5ZbbXVvvP2ll122cyaNSvPPvtszXZee+21fPTRR9+4XtOmTdO0adNayz5x6ikAAAAAYGH6z4e3aXiUGvNhxIgRefDBB7PFFlukS5cuGTFiRD788MMst9xyOeyww/K73/0uSy+9dJZbbrmcc8453/qH/yTp3bt3HnzwwfTv3z9Nmzb91tM6zY/ddtst22yzTV544YVvnaXxbZZddtlsttlm2W+//XLppZemoqIiRxxxRJo3b56ysrL/OSsAAAAAACwop5+aD23atMmjjz6aH//4x+nTp0+OP/74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q/LHP/4xjz/+eCZPnpzbb7+9Zt3zzz+/pnwYP358Ro4cmZEjRyZJrr766pplC+r888/P0KFDc/bZZ+ff//53ttxyy2y77bZ59dVXkyT//Oc/kyQPPPBAxo8fn7/85S91cCQAAAAAAGD+Of1UCYwfPz6zZs3KjjvumF69eiVJ+vXrlyQ577zzMmTIkPz0pz9Nklx22WX5+9//XrNu27Zt07p16zRu3DjdunWrtd127drNsWx+nX322TnmmGOyyy67JEnOPPPMPPzwwznvvPNy8cUXp3PnzkmSjh07fuNzTJ8+PdOnT6+1rLq6KmVl+jMAAAAAAP43/tJcAiuttFI23XTT9OvXLwMGDMgVV1yRKVOmZOrUqRk/fnzWWWedmrHl5eVZffXV6zXPtGnT8t5776V///61lvfv3z9jxoxZoG2dccYZadu2ba3bR59/UJdxAQAAAAD4gVJqlEDjxo1z//33529/+1v69u2bCy+8MMsss0zefPPNkuYqKyurdb+6unqOZd9myJAhmTp1aq1bu+Zd6zImAAAAAMA3qq6qdlvAW1EoNUqkrKws/fv3zymnnJJnn302TZo0yYMPPpju3bvnqaeeqhk3a9asjBo16lu3V1FRkcrKyu+UpU2bNunRo0cef/zxWsufeOKJLLfcckmSJk2aJMm3PkfTpk3Tpk2bWjenngIAAAAAoC64pkYJjBgxIg8++GC22GKLdOnSJSNGjMiHH36Y5ZZbLocddlh+97vfZemll85yyy2Xc845Jx999NG3brN379558MEH079//zRt2jTt27dfoExHHXVUTjrppCy55JJZeeWVc/XVV2f06NG5/vrrkyRdunRJ8+bNc++992bRRRdNs2bN0rZt2++y+wAAAAAA8J0oNUqgTZs2efTRR3Peeedl2rRp6dWrV4YOHZqtttoqm2++ecaPH59BgwalUaNG2WuvvbLDDjtk6tSp37jNoUOHZvDgwbniiiuyyCKLLPCprA499NBMmzYtRxxxRCZMmJC+ffvmzjvvzNJLL51k9rU9Lrjggpx66qk58cQTs/7662f48OHf8QgAAAAAAMCCK6uuri7OybJ+oAYNGpSPPvood9xxR6mjfCdLdFql1BEajImff3O5xfzp1Nwso7qyeLPOpY7QYNw7+rJSR2gQWvRYv9QRGozyxj77Ulcqq77bKUKprU+7RUsdocFYpMmCzepm3p6Z9nqpIzQIi7fsVuoIDcZDe3QqdYQGo8cFz5Y6QoPw2czppY7QYMya8W6pIxTOx4dvU+oIhdP6vLtKHWG+uNgBAAAAAABQCD6C10Atv/zyeeutt+b62OWXX57ddtttIScCAAAAAFhIqpygqKFSahTAsGHDFnide+65JzNnzpzrY127dv0fEwEAAAAAwMKn1GigevXqVeoIAAAAAABQp1xTAwAAAAAAKASlBgAAAAAAUAhKDQAAAAAAoBBcUwMAAAAAgIalqqrUCagnZmoAAAAAAACFoNQAAAAAAAAKQakBAAAAAAAUglIDAAAAAAAoBKUGAAAAAABQCOWlDgAAAAAAAHWqqrrUCagnZmoAAAAAAACFoNQAAAAAAAAKQakBAAAAAAAUglIDAAAAAAAoBKUGAAAAAABQCOWlDgAAAAAAAHWqqrrUCagnZmoAAAAAAACFoNQAAAAAAAAKQakBAAAAAAAUglIDAAAAAAAoBKUGAAAAAABQCOWlDgAAAAAAAHWpurq61BGoJ2ZqAAAAAAAAhaDUAAAAAAAACkGpAQAAAAAAFIJSAwAAAAAAKASlBgAAAAAAUAjlpQ4AAAAAAAB1qqq61AmoJ2ZqAAAAAAAAhaDUAAAAAAAACkGpAQAAAAAAFIJSAwAAAAAAKASlBgAAAAAAUAjlpQ4AAAAAAAB1qqq61AmoJ2ZqAAAAAAAAhaDUAAAAAAAACkGpAQAAAAAAFIJSAwAAAAAAKASlBgAAAAAAUAjlpQ4AAAAAAAB1qbqqutQRqCdmagAAAAAAAIVgpgb1bpNWS5Y6QoPxZvOPSx2hQfhddfNSR2gwHmnUqtQRGowWPdYvdYQG4bP3Hit1hAajTc+NSx2hwdiz+zqljtAg/Oxzn8eqK90rPi11hAbjk5bLlzpCg3BDk4pSR2gwOpzzj1JHaDAGdl+71BEahGvee7LUEYAGyG8GAAAAAABAISg1AAAAAACAQlBqAAAAAAAAheCaGgAAAAAANCxV1aVOQD0xUwMAAAAAACgEpQYAAAAAAFAISg0AAAAAAKAQlBoAAAAAAEAhKDUAAAAAAIBCUGoAAAAAAACFUF7qAAAAAAAAUKeqSh2A+mKmBgAAAAAAUAhKDQAAAAAAoBCUGgAAAAAAQCEoNQAAAAAAgEJQagAAAAAAAIVQXuoAAAAAAABQl6qrqksdgXpipgYAAAAAAFAISg0AAAAAAKAQlBoAAAAAAEAhKDUAAAAAAIBCUGoAAAAAAACFUF7qAAAAAAAAUKeqqkudgHpipgYAAAAAAFAISg0AAAAAAKAQlBoAAAAAAEAhKDUAAAAAAIBCUGoAAAAAAACFUF7qAAAAAAAAUKeqSh2A+mKmBgAAAAAAUAhKDQAAAAAAoBCUGgAAAAAAQCEoNQAAAAAAgEJQagAAAAAAAIVQXuoAAAAAAABQl6qrqksdgXpipgYAAAAAAFAISg0AAAAAAKAQlBoAAAAAAEAhKDUAAAAAAIBCUGoAAAAAAACFUF7qAAAAAAAAUKeqSh2A+mKmBgAAAAAAUAhKDQAAAAAAoBCUGgAAAAAAQCEoNQqiuro6++23Xzp06JCysrK0a9cuhx9+eKljAQAAAADAQqPUKIh77703w4YNy913353x48dnhRVWKHUkAAAAAABYqMpLHYD5M3bs2HTv3j3rrrtukqS8vP7/62bMmJEmTZrU+/MAAAAAANSl6qrqUkegnpipUQCDBg3KIYccknHjxqWsrCy9e/eeY8yUKVMycODAtG/fPi1atMhWW22VV199tdaY2267Lcsvv3yaNm2a3r17Z+jQobUe7927d04//fQMGjQobdu2zb777psZM2bk4IMPTvfu3dOsWbP07t07Z5xxRn3uLgAAAAAAzJVSowDOP//8nHrqqVl00UUzfvz4jBw5co4xgwYNytNPP50777wzTz75ZKqrq/PjH/84M2fOTJKMGjUqO+20U3bZZZc899xzOfnkk3PCCSdk2LBhtbZz1llnZYUVVsioUaNywgkn5IILLsidd96Zm2++OS+//HKuu+66uZYqAAAAAABQ35x+qgDatm2b1q1bp3HjxunWrdscj7/66qu58847849//KPm9FTXX399evbsmTvuuCMDBgzIOeeck0033TQnnHBCkqRPnz558cUXc9ZZZ2XQoEE129pkk01y5JFH1twfN25cll566ay33nopKytLr1696ndnAQAAAABgHszUaADGjBmT8vLyrLXWWjXLOnbsmGWWWSZjxoypGdO/f/9a6/Xv3z+vvvpqKisra5atvvrqtcYMGjQoo0ePzjLLLJNDDz0099133zdmmT59eqZNm1brVlld+Y3rAAAAAADA/FBqNADV1XO/6E11dXXKysrm+Pc3rdeyZcta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AAAAAIAPi1LjXWy55ZZ57bXXMmvWrCTJHXfckVVWWSV33HFHy5oZM2Zkq622yltvvZURI0bkxhtvzP/93//lkEMOyf7775/7778/SXL22Wdn1KhROfjgg9PU1JSmpqYMGjQoTU1N2WqrrTJ8+PA89NBDufnmm/Pss89mzz33bJXlsssuS11dXe6555789Kc/zYMPPpgdd9wxe+65Z5qamnL22We3rP3e976XXXbZJY888kjGjRuX6667LkcddVSOPfbY/N///V++/vWv56tf/Wpuv/32Vs84+eSTs+eee+Z3v/tdvvCFL2S//fbLiy++mEGDBuWaa65Jkjz22GNLPQ8AAAAAAD4Mtp96Fw0NDRk+fHhmzJiRESNGZMaMGTnmmGNy8skn57XXXssbb7yRxx9/PGPGjMkaa6yR4447ruXaI488MjfffHN+8Ytf5NOf/nQaGhrSpUuXrLzyyhkwYEDLugsuuCCbb755fvCDH7Scu+SSSzJo0KA8/vjjWW+99ZIk6667bn70ox+1yldfX59u3bq1ul+S7Lvvvhk3blyrr8eOHZvDDjssSTJ+/Pjcd999OeOMM1omMJK3p0n22WefJMkPfvCDnHvuuXnggQey4447pm/fvkmS1VZb7V1fSr5gwYIsWLCg1bkl1SXpVOm0/G80AAAAAACsAJMa72HMmDGZMWNGqtVq7rrrruyyyy7ZeOONc/fdd+f2229P//79s8EGG2TJkiU57bTTsskmm6Rfv37p0aNHbr311syfP/9d7z9z5szcfvvt6dGjR8uxwQYbJEnmzp3bsm7kyJErnPmf186ZMyejR49udW706NGZM2dOq3ObbLJJy6+7d++enj175rnnnlvh5ybJpEmT0tDQ0OqY9cof2nQPAAAAAABYFpMa72HMmDG5+OKL89vf/jYrrbRSNtxww2y11Va544478tJLL2WrrbZKkkyePDlnnXVWpkyZkmHDhqV79+45+uijs3Dhwne9f3Nzc3beeeecfvrpS302cODAll937959hTMva22l0vrt9dVqdalz//xC8Uql0vI+kRU1YcKEjB8/vtW58cPGtukeAAAAAAAfRLW58t6LKCWlxnt4570aU6ZMyVZbbZVKpZKtttoqkyZNyksvvZSjjjoqSVqmOL7yla8kebuseOKJJzJ06NCWe3Xp0iVLlixpdf/NN98811xz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kmy22WapVCoZM2ZMq2e9Y8GCBfnmN7+Z1VZbLV27ds1nP/vZPPjggy2fz5gxI5VKJdOnT8/IkSOz8sorZ4sttshjjz3WXt86AAAAAABYYUqNdjBhwoScfvrpOemkk/Loo4/myiuvTP/+/fPmm29mxx13TJ8+ffLggw/mF7/4RW677bYcccQRra6//fbbM3fu3Nx+++257LLLMnXq1EydOrXl87Fjx2bevHn5zW9+k1/+8pc5//zz89xzzy03zwMPPJAkue2229LU1JRrr712metOOOGEXHPNNbnsssvy8MMPZ911180OO+yQF198sdW6b3/725k8eXIeeuih1NXVZdy4ce/zOwUAAAAAAO+f7ac+oNdeey1nn312zjvvvBx44IFJkk984hP57Gc/mwsvvDB///vfc/nll6d79+5JkvPOOy8777xzTj/99PTv3z9J0qdPn5x33nnp1KlTNthgg3zxi1/M9OnTc/DBB+fxxx/Pr3/969x333359Kc/nSS5+OKLM3To0OVmWnXVVZMk/fr1W+62VG+88UYuuOCCTJ06NTvttFOS5MILL8y0adNy8cUX5/jjj29Ze9ppp2WrrbZKkpx44on54he/mLfeeitdu3Zd6r4LFizIggULWp2rVqupVMrzohkAAAAAAD6aTGp8QHPmzMmCBQuyzTbbLPOzTTfdtKXQSJLRo0enubm51RZOG220UTp16tTy9cCBA1smMebMmZO6urqMHDmy5fMNNtggvXv3/kC5586dm0WLFmX06NEt5zp37pxPfepTmTNnTqu1m2yySatsSZY7KTJp0qQ0NDS0OhYseukDZQUAAAAAaItqteJo41EWSo0PqFu3bsv97N0mFP7xfOfOnZf6rLm5ueUe/7y+PSzvvsvK/I/53vnsnXz/bMKECXnllVdaHfWd+7RndAAAAAAAPqaUGh/QkCFD0q1bt0yfPn2pzzbccMPMnj07b7zxRsu5e+65JyuttFLWW2+9Fbr/0KFDs3jx4jz00EMt5x577LG8/PLLy72mS5cuSZIlS5Ysd826666bLl265O677245t2jRojz00EPvurXVe6mvr0+vXr1aHbaeAgAAAACgPXinxgfUtWvXfOtb38oJJ5yQLl26ZPTo0Xn++efz+9//Pvvtt1++973v5cADD8zEiRPz/PPP58gjj8z+++/f8j6N97L++utnxx13zMEHH5yf/exnqaury9FHH/2uEyKrrbZaunXrlptvvjlrrrlmunbtmoaGhlZrunfvnm984xs5/vjj07dv36y11lr50Y9+lDfffDMHHXTQB/qeAAAAAABARzCp0Q5OOumkHHvssfnud7+boUOHZq+99spzzz2XlVdeObfccktefPHFfPKTn8yXvvSlbLPNNjnvvPPadP9LL700gwYNylZbbZXdd989hxxySFZbbbXlrq+rq8s555yTn/70p1l99dWzyy67LHPdD3/4w+yxxx7Zf//9s/nmm+ePf/xjbrnllvTpY7soAAAAAAA+eirVd16uAB2koccnio5QMxY3L39LMVbcer3WKDpCzWh668WiI9SMF//+WtERasJXB44qOkLNuOyZ+4uOUDNe+8uMoiPUhM9tMq7oCDWjc6VT0RFqxpc6DSw6Qk04581Hi45QM5569dmiI9SM4f3WKTpCTZj9tyeLjlAzFi98uugIpfPgGrsVHaF0Pvn0dUVHWCG2nwIAAAAAoKY0V73nt1bZfgoAAAAAACgFpQYAAAAAAFAKSg0AAAAAAKAUlBoAAAAAAEApKDUAAAAAAIBSqCs6AAAAAAAAtKdq0QHoMCY1AAAAAACAUlBqAAAAAAAApaDUAAAAAAAASkGpAQAAAAAAlIJSAwAAAAAAKIW6ogMAAAAAAEB7aq5Wio5ABzGpAQAAAAAAlIJSAwAAAAAAKAWlBgAAAAAAUApKDQAAAAAAoBSUGgAAAAAAQCnUFR0AAAAAAADaU7VaKToCHcSkBgAAAAAAUApKDQAAAAAAoBSUGgAAAAAAQCkoNQAAAAAAgFJQagAAAAAAAKVQV3QAAAAAAABoT81FB6DDmNQAAAAAAABKQakBAAAAAACUglIDAAAAAAAoBaUGAAAAAABQCkoNAAAAAACgFOqKDgAAAAAAAO2pmkrREeggJjUAAAAAAIBSUGoAAAAAAACloNQAAAAAAABKQakBAAAAAACUglIDAAAAAAAohbqiAwAAAAAAQHtqrhadgI5iUgMAAAAAACgFpQYAAAAAAFAKSg0AAAAAAKAUlBoAAAAAAEApKDUAAAAAAIBSqCs6AAAAAAAAtKfmVIqOQAcxqQEAAAAAAJSCUgMAAAAAACgF20/R4eZ/ee2iI9SMS6YPKDpCTRi3zTNFR6gZnYd9tugINeNTpz9SdISa8KW/+/c12sut3fsUHaFmfG6TcUVHqAl3/e6SoiPUjEWXnlp0hJox44w3i45QE357UGPREWrGFpfVFx2hZsx749miI9QEm/8AHcH/8wcAAAAAAEpBqQEAAAAAAJSC7acAAAAAAKgpVRug1SyTGgAAAAAAQCkoNQAAAAAAgFJQagAAAAAAAKWg1AAAAAAAAEpBqQEAAAAAAJRCXdEBAAAAAACgPTUXHYAOY1IDAAAAAAAoBaUGAAAAAABQCkoNAAAAAACgFJQaAAAAAABAKSg1AAAAAACAUqgrOgAAAAAAALSnaipFR6CDmNQAAAAAAABKQakBAAAAAACUglIDAAAAAAAoBaUGAAAAAABQCkoNAAAAAACgFOqKDgAAAAAAAO2puegAdBiTGgAAAAAAQCkoNQAAAAAAgFJQagAAAAAAAKWg1AAAAAAAAEpBqQEAAAAAAJRCXdEBAAAAAACgPTUXHYAOY1IDAAAAAAAoBaUGAAAAAABQCkoNAAAAAACgFJQaAAAAAABAKSg1AAAAAACAUqgrOgAAAAAAALSnaipFR6CDmNQAAAAAAABKQakBAAAAAACUglIDAAAAAAAoBaUGAAAAAABQCkoNAAAAAACgFOqKDgAAAAAAAO2puVJ0AjqKSQ0AAAAAAKAUlBoAAAAAAEApKDUAAAAAAIBSUGoAAAAAAACloNQAAAAAAABKQalBi4kTJ2b48OFFxwAAAAAA+ECaU3G08SgLpQYAAAAAAFAKSo0as3DhwqIjAAAAAABAh1BqfMS99tpr2W+//dK9e/cMHDgwZ511VsaMGZOjjz46SdLY2JhTTz01Y8eOTUNDQw4++OAkybe+9a2st956WXnllbPOOuvkpJNOyqJFi1rd+4c//GH69++fnj175qCDDspbb7211PMvvfTSDB06NF27ds0GG2yQ888/v8N/zwAAAAAAsCxKjY+48ePH55577skNN9yQadOm5a677srDDz/cas2Pf/zjbLzxxpk5c2ZOOumkJEnPnj0zderUPProozn77LNz4YUX5qyzzmq55r/+67/yve99L6eddloeeuihDBw4cKnC4sILL8y3v/3tnHbaaZkzZ05+8IMf5KSTTspll13W8b9xAAAAAAD4J3VFB2D5XnvttVx22WW58sors8022yR5e3Ji9dVXb7Xu85//fI477rhW577zne+0/LqxsTHHHntsrr766pxwwglJkilTpmTcuHH52te+liQ59dRTc9ttt7Wa1vj+97+fyZMnZ/fdd0+SrL322nn00Ufz05/+NAceeGD7/4YBAAAAAOBdKDU+wp588sksWrQon/rUp1rONTQ0ZP3112+1buTIkUtd+8tf/jJTpkzJH//4x7z++utZvHhxevXq1fL5nDlzcuihh7a6ZtSoUbn99tuTJM8//3z+/Oc/56CDDmrZ0ipJFi9enIaGhuVmXrBgQRYsWND63JLm1HcyFAQAAAAAfDiqRQegw/hJ80dYtfr2f/Uqlcoyz7+je/furb6+7777svfee2ennXbKjTfemFmzZuXb3/52m14i3tzcnOTtLahmz57dcvzf//1f7rvvvuVeN2nSpDQ0NLQ6zvzdvBV+LgAAAAAALI9S4yPsE5/4RDp37pwHHnig5dyrr76aJ5544l2vu+eeezJ48OB8+9vfzsiRIzNkyJA89dRTrdYMHTp0qXLiH7/u379/1lhjjTz55JNZd911Wx1rr732cp89YcKEvPLKK62O8Zs0tuF3DQAAAAAAy2b7qY+wnj175sADD8zxxx+fvn37ZrXVVsv3vve9rLTSSktNb/yjddddN/Pnz89//ud/5pOf/GR+9atf5brrrmu15qijjsqBBx6YkSNH5rOf/WyuuOKK/P73v88666zTsmbixIn55je/mV69emWnnXbKggUL8tBDD+Wll17K+PHjl/ns+vr61NfXtzpXtfUUAAAAAADtwE+bP+LOPPPMjBo1Kv/yL/+SbbfdNqNHj87QoUPTtWvX5V6zyy675JhjjskRRxyR4cOH5957781JJ53Uas1ee+2V7373u/nWt76VESNG5Kmnnso3vvGNVmu+9rWv5aKLLsrUqVMzbNiwbLXVVpk6deq7TmoAAAAAAEBHqVT/+QUNfKS98cYbWWONNTJ58uQcdNBBRcdZIa98dduiI9SMS6YPKDpCTRi3zTNFR6gZnYcpOdvLp05/pOgINeGsDC46Qs04ZPEfio5QM/rX9yk6Qk2463eXFB2hZiy69NSiI9SMGWe8WXSEmrDl2BV//yPvbovLmoqOUDP++ubfio5QE155642iI9SMRQufLjpC6Vw/YN+iI5TOrs9cWXSEFWL7qY+4WbNm5Q9/+EM+9alP5ZVXXskpp5yS5O1pDAAAAAAAltZcdAA6jFKjBM4444w89thj6dKlS0aMGJG77rorq6yyStGxAAAAAADgQ6XU+IjbbLPNMnPmzKJjAAAAAABA4bwoHAAAAAAAKAWlBgAAAAAAUApKDQAAAAAAoBS8UwMAAAAAgJrSXKkUHYEOYlIDAAAAAAAoBaUGAAAAAABQCkoNAAAAAACgFJQaAAAAAABAKSg1AAAAAACAUqgrOgAAAAAAALSnatEB6DAmNQAAAAAAgFJQagAAAAAAAKWg1AAAAAAAAEpBqQEAAAAAAJSCUgMAAAAAACiFuqIDAAAAAABAe2ouOgAdxqQGAAAAAABQCkoNAAAAAACgFJQaAAAAAABAKSg1AAAAAACAUlBqAAAAAAAApVBXdAAAAAAAAGhPzZWiE9BRTGoAAAAAAACloNQAAAAAAABKQakBAAAAAACUglIDAAAAAAAoBaUGAAAAAABQCkoNAAAAAACgFOqKDgAAAAAAAO2pOZWiI9BBTGoAAAAAAACloNQAAAAAAABKQakBAAAAAACUglIDAAAAAAAoBaUGAAAAAABQCnVFBwAAAAAAgPZULToAHcakBgAAAAAAUApKDQAAAAAAoBSUGgAAAAAAQCkoNQAAAAAAgFJQagAAAAAAAKWg1AAAAAAAoKY0VxxtPd6P888/P2uvvXa6du2aESNG5K677lqh6+65557U1dVl+PDhbX6mUgMAAAAAAGiTq6++OkcffXS+/e1vZ9asWfnc5z6XnXbaKfPnz3/X61555ZUccMAB2Wabbd7Xc5UaAAAAAABAm5x55pk56KCD8rWvfS1Dhw7NlClTMmjQoFxwwQXvet3Xv/717Lvvvhk1atT7em7d+7oK2uCteYuKjlAzRi58q+gINWGlbp2LjlAzKpt+sugINWONLn8pOkJNGNj5jaIj1IxFLy8pOkLN6FzpVHSEmrDo0lOLjlAzOn/1O0VHqBlvnnlS0RFqQqVbfdERasaaXfoUHaFmfKLLKkVHqAm/enZW0RGANliwYEEWLFjQ6lx9fX3q65f+3+qFCxdm5syZOfHEE1ud33777XPvvfcu9xmXXnpp5s6dm5///Oc59dT393d8kxoAAAAAAPAxN2nSpDQ0NLQ6Jk2atMy1L7zwQpYsWZL+/fu3Ot+/f/8888wzy7zmiSeeyIknnpgrrrgidXXvf97CpAYAAAAAAHzMTZgwIePHj291bllTGv+oUmn9hvFqtbrUuSRZsmRJ9t1335x88slZb731PlBOpQYAAAAAADWluegAJbS8raaWZZVVVkmnTp2Wmsp47rnnlpreSJLXXnstDz30UGbNmpUjjjgiSdLc3JxqtZq6urrceuut+fznP79Cz7b9FAAAAAAAsMK6dOmSESNGZNq0aa3OT5s2LVtsscVS63v16pVHHnkks2fPbjkOPfTQrL/++pk9e3Y+/elPr/CzTWoAAAAAAABtMn78+Oy///4ZOXJkRo0alZ/97GeZP39+Dj300CRvb2f19NNP5/LLL89KK62UjTfeuNX1q622Wrp27brU+fei1AAAAAAAANpkr732yt/+9reccsopaWpqysYbb5ybbropgwcPTpI0NTVl/vz57f5cpQYAAAAAANBmhx12WA477LBlfjZ16tR3vXbixImZOHFim5/pnRoAAAAAAEApmNQAAAAAAKCmVIsOQIcxqQEAAAAAAJSCUgMAAAAAACgFpQYAAAAAAFAKSg0AAAAAAKAUlBoAAAAAAEAp1BUdAAAAAAAA2lNzpegEdBSTGgAAAAAAQCkoNQAAAAAAgFJQagAAAAAAAKWg1AAAAAAAAEpBqQEAAAAAAJRCXdEBAAAAAACgPTUXHYAOY1IDAAAAAAAoBaUGAAAAAABQCkoNAAAAAACgFJQaAAAAAABAKSg1AAAAAACAUqgrOgAAAAAAALSn5qID0GFMagAAAAAAAKWg1AAAAAAAAEpBqQEAAAAAAJSCUgMAAAAAACgFpQYAAAAAAFAKdUUHAAAAAACA9lStFJ2AjmJSAwAAAAAAKAWlBgAAAAAAUApKDQAAAAAAoBSUGgAAAAAAQCkoNQAAAAAAgFKoKzoAAAAAAAC0p+aiA9BhTGoAAAAAAACloNQAAAAAAABKQakBAAAAAACUglIDAAAAAAAoBaUGAAAAAABQCkqNdlatVnPIIYekb9++qVQqmT17doc8p7GxMVOmTOmQewMAAAAAlFmzo81HWSg12tnNN9+cqVOn5sYbb0xTU1M23njjVCqVXH/99UVHAwAAAACAUqsrOkCtmTt3bgYOHJgtttii6CgAAAAAAFBTTGoswy9/+csMGzYs3bp1S79+/bLtttvmjTfeyJIlSzJ+/Pj07t07/fr1ywknnJADDzwwu+66a5Jk7NixOfLIIzN//vxUKpU0NjamsbExSbLbbru1nHsvc+fOzS677JL+/funR48e+eQnP5nbbrttqXWvvfZa9t133/To0SOrr756zj333Fafz58/P7vsskt69OiRXr16Zc8998yzzz6bJHnsscdSqVTyhz/8odU1Z555ZhobG1OtVpMkjz76aL7whS+kR48e6d+/f/bff/+88MILbfyOAgAAAADAB6fU+CdNTU3ZZ599Mm7cuMyZMyczZszI7rvvnmq1msmTJ+eSSy7JxRdfnLvvvjsvvvhirrvuupZrzz777JxyyilZc80109TUlAcffDAPPvhgkuTSSy9tOfdeXn/99XzhC1/IbbfdllmzZmWHHXbIzjvvnPnz57da9+Mf/zibbLJJHn744UyYMCHHHHNMpk2bluTtd3vsuuuuefHFF3PHHXdk2rRpmTt3bvbaa68kyfrrr58RI0bkiiuuaHXPK6+8Mvvuu28qlUqampqy1VZbZfjw4XnooYdy880359lnn82ee+75gb7HAAAAAADwfth+6p80NTVl8eLF2X333TN48OAkybBhw5IkU6ZMyYQJE7LHHnskSX7yk5/klltuabm2oaEhPXv2TKdOnTJgwIBW9+3du/dS55Zn0003zaabbtry9amnnprrrrsuN9xwQ4444oiW86NHj86JJ56YJFlvvfVyzz335Kyzzsp2222X2267Lb/73e/ypz/9KYMGDUqS/Md//Ec22mijPPjgg/nkJz+Z/fbbL+edd16+//3vJ0kef/zxzJw5M5dffnmS5IILLsjmm2+eH/zgBy3PvOSSSzJo0KA8/vjjWW+99ZbKvmDBgixYsKD1uebm1K+kPwMAAAAA4IPxk+Z/summm2abbbbJsGHD8uUvfzkXXnhhXnrppbzyyitpamrKqFGjWtbW1dVl5MiR7Z7hjTfeyAknnJANN9wwvXv3To8ePfKHP/xhqUmNf8zyztdz5sxJksyZMyeDBg1qKTSStNzvnTV77713nnrqqdx3331JkiuuuCLDhw/PhhtumCSZOXNmbr/99vTo0aPl2GCDDZK8vUXWskyaNCkNDQ2tjnOemr/MtQAAAAAAHaHqaPNRFkqNf9KpU6dMmzYtv/71r7Phhhvm3HPPzfrrr5958+Z9aBmOP/74XHPNNTnttNNy1113Zfbs2Rk2bFgWLlz4ntdWKpUkb28/9c6v/9E/nh84cGC23nrrXHnllUmSq666Kl/5ylda1jY3N2fnnXfO7NmzWx1PPPFEttxyy2U+f8KECXnllVdaHd8cvFabvwcAAAAAAPDPlBrLUKlUMnr06Jx88smZNWtWunTpkunTp2fgwIEtUw1Jsnjx4sycOfM979e5c+csWbJkhZ9/1113ZezYsdltt90ybNiwDBgwYJmlyj9meefrdyYpNtxww8yfPz9//vOfWz5/9NFH88orr2To0KEt5/bbb79cffXV+d///d/MnTs3e++9d8tnm2++eX7/+9+nsbEx6667bquje/fuy8xeX1+fXr16tTpsPQUAAAAAQHvw0+Z/cv/99+cHP/hBHnroocyfPz/XXnttnn/++QwdOjRHHXVUfvjDH+a6667LH/7whxx22GF5+eWX3/OejY2NmT59ep555pm89NJL77l+3XXXzbXXXpvZs2fnt7/9bfbdd980Nzcvte6ee+7Jj370ozz++OP593//9/ziF7/IUUcdlSTZdttts8kmm2S//fbLww8/nAceeCAHHHBAttpqq1ZbZu2+++559dVX841vfCNbb7111lhjjZbPDj/88Lz44ovZZ5998sADD+TJJ5/MrbfemnHjxrWppAEAAAAAgPag1PgnvXr1yp133pkvfOELWW+99fKd73wnkydPzk477ZRjjz02BxxwQMaOHZtRo0alZ8+e2W233d7znpMnT860adMyaNCgbLbZZu+5/qyzzkqfPn2yxRZbZOedd84OO+yQzTfffKl1xx57bGbOnJnNNtss3//+9zN58uTssMMOSd6eNrn++uvTp0+fbLnlltl2222zzjrr5Oqrr17q97vzzjvnt7/9bfbbb79Wn62++uq55557smTJkuywww7ZeOONc9RRR6WhoSErmb4AAAAAAOBDVqlWq2V6B8hHztixY/Pyyy/n+uuvLzrKR9azW29VdISa8ficVYuOUBOG7/5G0RFqRt0e713ssmJ2HXtd0RFqwuTOnYqOUDN2fHle0RFqxtrd+hcdoSbccvTgoiPUjM5f/U7REWrGfw87qegINWGnry+9MwHvz5cveaXoCDWjPv5e2R5+9eysoiPUjIUL/lJ0hNI5d9BX3nsRrRz5558XHWGF1BUdAAAAAAAA2lNzpegEdBR7CBVgo402So8ePZZ5XHHFFUXHAwAAAACAjySTGh/Q1KlT23zNTTfdlEWLFi3zs/79bU8AAAAAAADLotQowODB9gMGAAAAAIC2sv0UAAAAAABQCkoNAAAAAACgFGw/BQAAAABATWkuOgAdxqQGAAAAAABQCkoNAAAAAACgFJQaAAAAAABAKSg1AAAAAACAUlBqAAAAAAAApVBXdAAAAAAAAGhPzUUHoMOY1AAAAAAAAEpBqQEAAAAAAJSCUgMAAAAAACgFpQYAAAAAAFAKSg0AAAAAAKAU6ooOAAAAAAAA7aladAA6jEkNAAAAAACgFJQaAAAAAABAKSg1AAAAAACAUlBqAAAAAAAApaDUAAAAAAAASqGu6AAAAAAAANCemitFJ6CjmNQAAAAAAABKQakBAAAAAACUglIDAAAAAAAoBaUGAAAAAABQCkoNAAAAAACgFOqKDgAAAAAAAO2puegAdBiTGgAAAAAAQCkoNQAAAAAAgFJQagAAAAAAAKWg1AAAAAAAAEpBqQEAAAAAAJRCXdEBAAAAAACgPVWLDkCHMakBAAAAAACUglIDAAAAAAAoBaUGAAAAAABQCkoNAAAAAACgFJQaAAAAAABAKdQVHQAAAAAAANpTc6pFR6CDmNQAAAAAAABKQakBAAAAAACUglIDAAAAAAAoBe/UoMNt/PAzRUeoGev16FR0hJpw7v/0LDpCzbj+pjuKjlAzHn71yaIj1ITXu29UdISa8dJbrxcdoWYc32N40RFqwowz3iw6Qs1488yTio5QM3Z55PtFR6gJk0b4z2R7+e1rTxUdoWYM6T6w6Ag1obnqnQZA+zOpAQAAAAAAlIJJDQAAAAAAakpz0QHoMCY1AAAAAACAUlBqAAAAAAAApaDUAAAAAAAASkGpAQAAAAAAlIJSAwAAAAAAKIW6ogMAAAAAAEB7qhYdgA5jUgMAAAAAACgFpQYAAAAAAFAKSg0AAAAAAKAUlBoAAAAAAEApKDUAAAAAAIBSqCs6AAAAAAAAtKfmogPQYUxqAAAAAAAApaDUAAAAAAAASkGpAQAAAAAAlIJSAwAAAAAAKAWlBgAAAAAAUAp1RQcAAAAAAID21FwpOgEdxaQGAAAAAABQCkoNAAAAAACgFJQaAAAAAABAKSg1AAAAAACAUlBqAAAAAAAApVBXdAAAAAAAAGhPzakWHYEOYlIDAAAAAAAoBaUGAAAAAABQCkoNAAAAAACgFJQaAAAAAABAKSg1AAAAAACAUqgrOgAAAAAAALSnatEB6DAmNQAAAAAAgFJQagAAAAAAAKWg1AAAAAAAAEpBqQEAAAAAAJSCUgMAAAAAACiFuqIDAAAAAABAe2ouOgAdxqQGAAAAAABQCkoNAAAAAACgFJQaAAAAAABAKSg1AAAAAACAUlBqAAAAAAAApVBXdAAAAAAAAGhPzakWHYEOYlKjBowZMyZHH330B7rHvHnzUqlUMnv27CTJjBkzUqlU8vLLL3/gfAAAAAAA0B6UGiRJBg0alKampmy88cbL/Hzq1Knp3bv3hxsKAAAAAAD+gVLjI27RokUfynM6deqUAQMGpK7OjmQAAAAAAHw0KTU+ZJdffnn69euXBQsWtDq/xx575IADDsjEiRMzfPjwXHLJJVlnnXVSX1+favW9939bvHhxjjjiiPTu3Tv9+vXLd77znVbXVSqVXH/99a2u6d27d6ZOnZpk6e2n/tGMGTPy1a9+Na+88koqlUoqlUomTpzY1t86AAAAAAB8IEqND9mXv/zlLFmyJDfccEPLuRdeeCE33nhjvvrVryZJ/vjHP+a//uu/cs011yyzZFiWyy67LHV1dbn//vtzzjnn5KyzzspFF13ULpm32GKLTJkyJb169UpTU1Oamppy3HHHtcu9AQAAAABgRdlr6EPWrVu37Lvvvrn00kvz5S9/OUlyxRVXZM0118yYMWNyxx13ZOHChfmP//iPrLrqqit830GDBuWss85KpVLJ+uuvn0ceeSRnnXVWDj744A+cuUuXLmloaEilUsmAAQPede2CBQuWmkKpVptTqejPAAAAAIAPx3vvfUNZ+UlzAQ4++ODceuutefrpp5Mkl156acaOHZtKpZIkGTx4cJsKjST5zGc+03J9kowaNSpPPPFElixZ0n7BV8CkSZPS0NDQ6nhzwYsfagYAAAAAAGqTUqMAm222WTbddNNcfvnlefjhh/PII49k7NixLZ9379693Z9ZqVSWejdHR7yEfMKECXnllVdaHSvX92335wAAAAAA8PFj+6mCfO1rX8tZZ52Vp59+Ottuu20GDRr0ge533333LfX1kCFD0qlTpyTJqquumqamppbPn3jiibz55psrfP8uXbqs0NRHfX196uvrW52z9RQAAAAAAO3BT5sLst9+++Xpp5/OhRdemHHjxn3g+/35z3/O+PHj89hjj+Wqq67Kueeem6OOOqrl889//vM577zz8vDDD+ehhx7KoYcems6dO6/w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++68+OKLue6661quPfvss3PKKadkzTXXTFNTUx588ME8+OCDSZJLL7205dwH8eUvfzkvvPBCbr/99pZzL730Um655Zbst99+y73u9ttvz9y5c3P77bfnsssuy9SpU1ttaXXAAQfkr3/9a2bMmJFrrrkmP/vZz/Lcc8+9r4ynn356+vXrl+HDh+e0007LwoUL39d9AAAAAADgg6rp7aeampqyePHi7L777hk8eHCSZNiwYUmSKVOmZMKECdljjz2SJD/5yU9yyy23tFzb0NCQnj17plOnThkwYECr+/bu3Xupc+9H3759s+OOO+bKK6/MNttskyT5xS9+kb59+7Z8vSx9+vTJeeedl06dOmWDDTbIF7/4xUyfPj0HH3xw/vCHP+S2227Lgw8+mJEjRyZJLrroogwZMqTN+Y466qhsvvnm6dOnTx544IFMmDAhf/rTn3LRRRe9v98wAAAAAMCHoDnVoiPQQWq61Nh0002zzTbbZNiwYdlhhx2y/fbb50tf+lJWWmmlNDU1ZdSoUS1r6+rqMnLkyFSrH+5/2Pfbb78ccsghOf/881NfX58rrrgie++9dzp16rTcazbaaKNWnw8cODCPPPJIkuSxxx5LXV1dNt9885bP11133fTp06fN2Y455piWX2+yySbp06dPvvSlL7VMbyzLggULsmDBgtbnmptTv1JNDwUBAAAAAPAhqOmfNHfq1CnTpk3Lr3/962y44YY599xzs/7662fevHlFR2ux8847p7m5Ob/61a/y5z//OXfddVe+8pWvvOs1nTt3bvV1pVJpeS/H8kqZ9ihr3nn/xh//+Mflrpk0aVIaGhpaHec9/dQHfjYAAAAAANR0qZG8/QP/0aNH5+STT86sWbPSpUuXTJ8+PQMHDsx9993Xsm7x4sWZOXPme96vc+fOWbJkSbvl69atW3bfffdcccUVueqqq7LeeutlxIgR7/t+G2ywQRYvXpxZs2a1nPvjH/+Yl19++QNnfeeeAwcOXO6aCRMm5JVXXml1HLHG4A/8bAAAAAAAqOntp+6///5Mnz4922+/fVZbbbXcf//9ef755zN06NAcddRR+eEPf5ghQ4Zk6NChOfPMM1foB/+NjY2ZPn16Ro8enfr6+ve1rdM/22+//bLzzjvn97///XtOabyXDTbYINtuu20OOeSQXHDBBencuXOOPfbYdOvWLZVK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nb333jtPPvlkmzMCAAAAAHyYqv5p8z9lYfupNmhqasrixYuz++67Z/DgwUmSYcOGJUmmTJmSCRMmZI899kiS/OQnP8ktt9zScm1DQ0N69uyZTp06LfVeit69e7/vd1WcccYZ+da3vpW99947SXL66afn9ttvz5QpU/Lv//7vLZMV/fr1a/MzPv3pT+fyyy/Peuutl2effTannnpqtthii/z+979Pv379lnnNggULsmDBglbnqtXmVCr6MwAAAAAAPhg/aW6DTTfdNNtss02GDRuWL3/5y7nwwgvz0ksv5ZVXXklTU1NGjRrVsrauri4jR47s0Dyvvvpq/vrXv2b06NGtzo8ePTpz5sz5wPffaaedsscee2TYsGHZdttt86tf/SpJctllly33mkmTJqWhoaHV8fLfn/vAWQAAAAAAQKnRBp06dcq0adPy61//OhtuuGHOPffcrL/++pk3b16huSqVSquvq9XqUufaQ/fu3TNs2LCWra2WZcKECXnllVdaHb27rdbuWQAAAAAA+PhRarRRpVLJ6NGjc/LJJ2fWrFnp0qVLpk+fnoEDB+a+++5rWbd48eLMnDnzPe/XuXPnLFmy5H1l6dWrV1ZfffXcfffdrc7fe++9GTp0aJKkS5cuSfK+n/GPFixYkDlz5mTgwIHLXVNfX59evXq1Omw9BQAAAABAe/BOjTa4//77M3369Gy//fZZbbXVcv/99+f555/P0KFDc9RRR+WHP/xhhgwZkqFDh+bMM8/Myy+//J73bGxszPTp0zN69OjU19enT58+bcp0/PHH53vf+14+8YlPZPjw4bn00ksze/bsXHHFFUmS1VZbLd26dcvNN9+cNddcM127dk1DQ0MWLlyYRx99NEmycOHCPP3005k9e3Z69OiRddddN0ly3HHHZeedd85aa62V5557LqeeempeffXVHHjggW37xgEAAAAAQDtQarRBr169cuedd2bKlCl59dVXM3jw4EyePDk77bRTtttuuzQ1NWXs2LFZaaWVMm7cuOy222555ZVX3vWekydPzvjx43PhhRdmjTXWaPNWVt/85jfz6quv5thjj81zzz2XDTfcMDfccEOGDBmS5O13e5xzzjk55ZRT8t3vfjef+9znMmPGjPz1r3/NZptt1nKfM844I2eccUa22mqrzJgxI0nyl7/8Jfvss09eeOGFrLrqqvnMZz6T++67r+Ul6QAAAAAAH0XN1WrREegglWrVn25HGTt2bF5++eVcf/31RUcp1Nr9Ni06Qs14/u+vFh2hJqy2cu+iI9SMId0GFB2hZlzzlZWLjlAT+p55f9ERakaXTp2LjlAz3lq8sOgINWHDvmsVHaFmrNmlbdPhLN9vX3uq6Ag1YaMeg4qOUDN+Nev8oiPUjNUaty86Qk14feHfi45QMxYtfLroCKWz5RrbFB2hdO58enrREVaIlx0AAAAAAACloNT4iNloo43So0ePZR7vvCcDAAAAAAA+jrxTowNNnTq1zdfcdNNNWbRo0TI/69+//wdMBAAAAAAA5aXU+IjxEm4AAAAAAFg2208BAAAAAAClYFIDAAAAAICaUi06AB3GpAYAAAAAAFAKSg0AAAAAAKAUlBoAAAAAAEApKDUAAAAAAIBSUGoAAAAAAAClUFd0AAAAAAAAaE/NqRYdgQ5iUgMAAAAAACgFpQYAAAAAAFAKSg0AAAAAAKAUlBoAAAAAAEApKDUAAAAAAIBSqCs6AAAAAAAAtKfmVIuOQAcxqQEAAAAAAJSCUgMAAAAAACgFpQYAAAAAAFAKSg0AAAAAAKAUlBoAAAAAAEAp1BUdAAAAAAAA2lO1Wi06Ah3EpAYAAAAAAFAKSg0AAAAAAKAUlBoAAAAAAEApKDUAAAAAAIBSUGoAAAAAAAClUFd0AAAAAAAAaE/NqRYdgQ5iUgMAAAAAACgFpQYAAAAAAFAKSg0AAAAAAKAUlBoAAAAAAEApKDUAAAAAAIBSqCs6AAAAAAAAtKdqqkVHoIOY1AAAAAAAAEpBqQEAAAAAAJSCUgMAAAAAACgFpQYAAAAAAFAKSg0AAAAAAKAU6ooOAAAAAAAA7alarRYdgQ5iUgMAAAAAACgFpQYAAAAAAFAKSg0AAAAAAKAUlBoAAAAAAEApeFE4He4TKw8oOkLNGNR1laIjQCtdK52KjlAzVj9nVtERasIBAz9TdISacc0Ls4uOUDM26LdO0RFqwrw3ni06Qs34RBd/p2wvQ7oPLDpCTXjo5blFR6gZqzVuX3SEmvHcvFuLjlATuq3+uaIjADVIqQEAAAAAQE1pTrXoCHQQ208BAAAAAACloNQAAAAAAABKQakBAAAAAACUglIDAAAAAAAoBaUGAAAAAABQCnVFBwAAAAAAgPZUrVaLjkAHMakBAAAAAACUglIDAAAAAAAoBaUGAAAAAABQCkoNAAAAAACgFJQaAAAAAABAKdQVHQAAAAAAANpTc6pFR6CDmNQAAAAAAABKQakBAAAAAACUglIDAAAAAAAoBaUGAAAAAABQCkoNAAAAAACgFOqKDgAAAAAAAO2pmmrREeggJjUAAAAAAIBSUGoAAAAAAACloNQAAAAAAABKQakBAAAAAACUglIDAAAAAAAohbqiAwAAAAAAQHtqrlaLjkAHMakBAAAAAACUglIDAAAAAAAoBaUGAAAAAABQCkoNAAAAAACgFJQaAAAAAABAKdQVHQAAAAAAANpTNdWiI9BBTGoAAAAAAACloNQAAAAAAABKQakBAAAAAACUglIDAAAAAAAoBaUGAAAAAABQCnVFBwAAAAAAgPbUXK0WHYEOYlIDAAAAAAAoBaUGAAAAAABQCkoNAAAAAACgFJQaAAAAAABAKSg1AAAAAACAUqgrOgAAAAAAALSnaqpFR6CDmNQAAAAAAABK4WNRaowZMyZHH3104fcAAAAAAADev4/F9lPXXnttOnfuXHSMUmtsbMzRRx+t2AEAAAAAoDAfi1Kjb9++RUcAAAAAAAA+oI/d9lPnn39+hgwZkq5du6Z///750pe+tML3Wbx4cY444oj07t07/fr1y3e+851Uq///hTM///nPM3LkyPTs2TMDBgzIvvvum+eee67l85deein77bdfVl111XTr1i1DhgzJpZde2vL5008/nb322it9+vRJv379sssuu2TevHktn48dOza77rprfvCDH6R///7p3bt3Tj755CxevDjHH398+vbtmzXXXDOXXHJJq9wret8zzjgjAwcOTL9+/XL44Ydn0aJFLd+/p556Ksccc0wqlUoqlcoKf88AAAAAAKC9fCxKjXc89NBD+eY3v5lTTjkljz32WG6++eZsueWWK3z9ZZddlrq6utx///0555xzctZZZ+Wiiy5q+XzhwoX5/ve/n9/+9re5/vrr86c//Sljx45t+fykk07Ko48+ml//+teZM2dOLrjggqyyyipJkjfffDNbb711evTokTvvvDN33313evTokR133DELFy5sucdvfvOb/PWvf82dd96ZM888MxMnTsy//Mu/pE+fPrn//vtz6KGH5tBDD82f//znNt339ttvz9y5c3P77bfnsssuy9SpUzN16tQkb2/fteaaa+aUU05JU1NTmpqa3s+3HwAAAADgQ9FcrTraeJTFx2L7qXfMnz8/3bt3z7/8y7+kZ8+eGTx4cDbbbLMVvn7QoEE566yzUqlUsv766+eRRx7JWWedlYMPPjhJMm7cuJa166yzTs4555x86lOfyuuvv54ePXpk/vz52WyzzTJy5Mgkb7+n4h3/+Z//mZVWWikXXXRRyyTEpZdemt69e2fGjBnZfvvtk7y9ldY555yTlVZaKeuvv35+9KMf5c0338y//du/JUkmTJiQH/7wh7nnnnuy9957r/B9+/Tpk/POOy+dOnXKBhtskC9+8YuZPn16Dj744PTt2zedOnVqmUB5NwsWLMiCBQtanWuuNmelyseqPwMAAAAAoAN8rH7SvN1222Xw4MFZZ511sv/+++eKK67Im2++ucLXf+Yzn2m19dKoUaPyxBNPZMmSJUmSWbNmZZdddsngwYPTs2fPjBkzJsnbZUqSfOMb38h//ud/Zvjw4TnhhBNy7733ttxr5syZ+eMf/5iePXumR48e6dGjR/r27Zu33norc+fObVm30UYbZaWV/v8fW//+/TNs2LCWrzt16pR+/fq1bHvVlvt26tSp5euBAwe22jprRU2aNCkNDQ2tjnmvPtnm+wAAAAAAwD/7WE1q9OzZMw8//HBmzJiRW2+9Nd/97nczceLEPPjgg+ndu/cHuvcbb7yR7bffPttvv31+/vOfZ9VVV838+fOzww47tGzztNNOO+Wpp57Kr371q9x2223ZZpttcvjhh+eMM85Ic3NzRowYkSuuuGKpe6+66qotv+7cuXOrzyqVyjLPNTc3J8kHuu8792iLCRMmZPz48a3O7brhHm2+DwAAAAAA/LOPVamRJHV1ddl2222z7bbb5nvf+1569+6d3/zmN9l9993f89r77rtvqa+HDBmSTp065Q9/+ENeeOGF/PCHP8ygQYOSvP0Oj3+26qqrZuzYsRk7dmw+97nP5fjjj88ZZ5yRzTffPFdffXVWW2219OrVq31+s0m73bdLly4tEynvpr6+PvX19a3O2XoKAAAAAID28LH6afONN96Yc845J7Nnz85TTz2Vyy+/PM3NzVl//fVX6Po///nPGT9+fB577LFcddVVOffcc3PUUUclSdZaa6106dIl5557bp588snccMMN+f73v9/q+u9+97v57//+7/zxj3/M73//+9x4440Z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6pNPPtG2bdu0aNEivfPOO9qzZ4/ZEVHI7N69WyEhIWrcuLFWrlyp0NBQ7dq1S6dOndL69eu5MM2DDh06aNWqVSpdurRq166drci7ePFik5IBt+bu7q7t27ezUuMWTp48qXnz5ikmJkY7d+7U448/rsjISLVv354JHXm0atUqffnll1q0aJEyMjIUFham8PBwtWzZUk5OTmbHy/e+/fZbSddW98+ZM0elSpWyH8vIyFBsbKxWrFihvXv3mhXRki5evKgFCxZoy5YtyszMVKNGjRQeHq5ixYqZHc0yLly4oOeff14+Pj6qW7dutt+N/fr1MykZgNyiqAEgz7y8vHI9q/PUqVP3OE3BMWrUKL333nsKDg5WhQoVsp3jJUuWmJTMWpycnJSamqqyZctmGf/zzz9VqVIlXb582aRk1lO8eHH99ttvqlSpkjp27KjatWtr5MiROnLkiGrWrKkLFy6YHRGFUGpqqqZOnZrlQv71119XhQoVzI5mKREREbc8/vnnn9+nJEDeUNTIm23btmn27NmaOXOmSpYsqc6dO+u1115T9erVzY6W7z3wwAM6efKkWrdurfDwcD377LMqWrSo2bEs5VaFH1dXV1WuXFnjx4/XM888cx9TAdLMmTPVq1cvFStWTGXKlMly7W2z2ZgIB1gA7acA5NnEiRPtH588eVKjR49W69at9eijj0qSfv75Zy1btkwjRowwKaE1TZs2TTExMXr55ZfNjmJJ12eCSdKyZctynAnGho55ExAQoG+++UYdOnTQsmXLFBUVJelaD1oPDw+T06EwSk5Olp+fn0aNGpXjsUqVKpmQypooWgAFX0pKipYvX67ly5fL2dlZbdq00a5duxQUFKR//etf9r/ryNk777yj559/Xl5eXmZHsaSEhARdvXpVzs7OqlKlijZt2iRvb2+zY1nenDlz5O3trbZt20qS3njjDU2fPl1BQUGaP3++/P39TU5oDW+//bbee+89DRs2jFVXgEWxUgPAXXnuuefUokUL9enTJ8v4lClT9NNPP+mbb74xJ5gFlSlTRhs3bqR9yh1iJpjjLVy4UJ06dVJGRoZatWql5cuXS5LGjh2rNWvW6McffzQ5IQobZ2dnpaSkZFuJdfLkSZUtWzbHft24tePHj2vv3r2y2WyqUaOGfHx8zI4E3BIrNW7t6tWr+vbbb/X5559r+fLlqlevnrp166bw8HC5u7tLkhYsWKDevXvrr7/+MjktCjJnZ2elpqbKx8fnpu1hkXc1a9bU1KlT1bJlS/38889q1aqVJk6cqO+//14uLi60j8yl0qVLa9OmTVx7AxZGUQPAXSlZsqTi4+MVEBCQZTwxMVENGzbUuXPnTEpmPUOHDlXJkiVZ4XIHEhISVLt2bWaC3QOpqalKSUlR/fr17YWjjRs3ysPDQ7Vq1TI5HQobJycn/fnnn9luvB8+fFhBQUE6f/68Scms5/z58+rbt6/mzp1r38PJ2dlZXbp00SeffKLixYubnBDIWZ06dfTjjz/Kz8/P7Cj5kre3tzIzM/XSSy+pe/fuatCgQbbn/PXXX2rUqJEOHjx4/wPmc2FhYYqJiZGHh4fCwsJu+VxuHt9amTJl9MMPP+jhhx/OUuDA3bmxPezQoUOVkpKiuXPnateuXQoJCdHx48fNjmgJUVFR8vHx0Ztvvml2FAB3iPZTAO5KmTJltGTJEg0ZMiTL+DfffMNMnFwYOHCg/ePMzExNnz5dP/30k+rVq5dts7IJEybc73iW0bBhQ/uFks1my/WeL7i98uXLq3z58lnGHnroIZPSoLC6/rvSZrNpxIgRWW64Z2Rk6Ndff83xxh1ubuDAgVq9erW+++47NW3aVJK0bt069evXT4MGDdLUqVNNTojC5mYzuU+fPq1GjRrZ+5vv3LnTjHiWER0dreeff/6Wez94eXlR0LiJUqVK2d9H3tjKFHn33HPPqXnz5vY9r4KDg+Xs7Jzjc9m/IPdKliypkydPqlKlSlq+fLm9jVzRokV18eJFk9NZR0ZGhv71r39p2bJlXHsDFkVRA8BdGTVqlF599VXFxcXZ99T45ZdftHTpUs2cOdPkdPnftm3bsnx+/aYcF+x54+npqaSkJPn4+Ojw4cP2WccACobrvysNw9COHTvk5uZmP+bm5qb69etr8ODBZsWzpEWLFmnhwoUKCQmxj7Vp00bFihVTx44dKWrgvjt06FCOLeQuX76so0ePmpDImtib7e7cuN8Qew/dnenTpyssLEz79+9Xv3791L17d3sLNNy5J554Qt26dVPDhg21b98++94au3btYv/APNixY4caNmwoKfu1NxPkAGugqAHgrnTt2lWBgYGaPHmyFi9eLMMwFBQUpPXr1+vhhx82O16+t2rVKrMjFAjMBAMKtuu/KyMiIjRp0iQ2qneACxcuqFy5ctnGy5YtqwsXLpiQCIXVt99+a/942bJlWWbHZ2RkKDY2lht1gEU99dRTkqQtW7aof//+FDUc4NNPP9Xbb7+tI0eOaNGiRfbVbVu2bNFLL71kcjrryO11+O+//y5fX182EwfyIfbUAIB8IjIyUpMmTcr2Zv963/PZs2eblMwali5dap8J9t577930oql///73ORkA5D+tWrVSmTJlNHfuXHubmosXL+qVV17RqVOn9NNPP5mcEIXFrW4Uubq6qnLlyho/fryeeeaZ+5gKhVXDhg1zPUt769at9zgNALN5eHgoPj5eVatWNTsKgL+hqAHgrh04cECff/65kpKSNHHiRJUtW1ZLly6Vn5+fateubXY8y3B2dlZKSorKli2bZfzEiRMqX7680tPTTUpmLREREZo8eTIzwYACatOmTfr666+VnJysK1euZDnGpq25t2PHDj399NO6dOmS6tevL5vNpvj4eBUpUkTLly/n7zfui4SEBNWuXVvOzs6qUqWKNm3aJG9vb7NjoRAbNWpUrp87cuTIe5ikYLndpus34m957ly4cCHH90L16tUzKVHB5O7uru3bt1PUAPIh2k8BuCurV6/W008/raZNm2rNmjUaPXq0ypYtq4SEBM2cOVMLFy40O2K+l5aWJsMwZBiGzp49m2Vjx4yMDP3www/ZCh24OfofAwXXggUL1KVLFz355JNasWKFnnzySSUmJio1NVUdOnQwO56l1K1bV4mJiZo3b55+++03GYahF198UeHh4SpWrJjZ8VBINGzYUKmpqfLx8ZHNZqOPOUx3J4WK+fPnKzQ0VCVKlLgHiQoGDw8PLVmyRKVKlVJwcLCka+2Szpw5o/bt2/Paz4Pjx4+ra9euWrp0aY7Hc9qbCAAKIooaAO7KsGHDNHr0aA0cODDLzPgWLVpo0qRJJiazDk9PT/uFfI0aNbIdt9lseZo1VtgxEwwouD744ANFR0fr9ddfl7u7uyZNmqQqVaqoZ8+e9j11kDtjx45VuXLl1L179yzjs2fP1vHjxzV06FCTkqEw8fT0VFJSknx8fHT48GFlZmaaHQnIs549e+rhhx9mJvctlCtXTh07dtS0adPs+95lZGTotddek4eHhz7++GOTE1rHgAEDdPr0af3yyy9q0aKFlixZoj///FOjR4/W+PHjzY4HAPcNRQ0A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", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAB+8AAAUmCAYAAABXlPbhAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy81sbWrAAAACXBIWXMAAA9hAAAPYQGoP6dpAAEAAElEQVR4nOzdd5hV1fk/7GeGjoBUkY4lYkOKoKKo2Bsqiho72BskGHu+lkQ0okk0KkYUC9g7CNg1dkGxoCgqxUKVIr0PzHn/8IWfyjnDzJmyGbjv6/LKZK29136mnH2G+ey1Vk4qlUoFAAAAAAAAAJCY3KQLAAAAAAAAAIBNnfAeAAAAAAAAABImvAcAAAAAAACAhAnvAQAAAAAAACBhwnsAAAAAAAAASJjwHgAAAAAAAAASJrwHAAAAAAAAgIQJ7wEAAAAAAAAgYcJ7AAAAyr2VK1fGqlWrki4DAAAAIGsVky4AAACSdOedd0b//v3T9r3xxhvRtGnTUr3+1KlT44ADDkjb16tXr+jdu3epXh/Ki1QqFV999VWMHTs2Jk6cGBMmTIhp06bF4sWLY8mSJZGXlxcREZUqVYqaNWtGo0aNomnTptGqVato3759tGnTJqpXr57wZ0FhZLovH3PMMdGvX78EKoLiK+j9PhsVKlSI3NzcqFKlSlSvXj0233zzqFevXjRr1iz+8Ic/RNu2bWPnnXeOChUqlNg1S5rXOgAArEt4DwAAwAYplUrFu+++G6+++mq89dZbMXv27PWek5eXF3Pnzo25c+fGV199Fa+88kpERFSpUiX22WefOPzww+Pggw+OihX9cxgov1avXh2rV6+OvLy8WLx4ccyaNSsmTJgQo0aNWntMnTp14pBDDonTTz89ttlmmwSrBQAACstfKwAAANigrFixIoYOHRqDBg2K7777rsTGfO211+K1116LRo0aRc+ePeOUU06JSpUqlcj4ABuaefPmxRNPPBFPPvlkdO/ePS677LKoXbt20mUBAAAFsOc9AAAAG4x33nknDjvssLj22mtLLLj/vRkzZsRNN90URx11VHz00Uelcg2ADUUqlYpnnnkmunfvHuPHj0+6HAAAoADCewAAABK3aNGiuPTSS+Occ86JadOmlck1v/vuu+jZs2c8+OCDZXI9gCRNnTo1evToEZMmTUq6FAAAIAPL5gMAAJComTNnxtlnn12oGaEtW7aM3XffPdq1axctWrSIJk2axGabbRbVqlWLvLy8WLJkSUydOjUmTZoUo0ePjnfeeSfmzJmTcbzVq1dHv379Yv78+XHxxReX5KcFsMGZO3duXHTRRTFkyJCoVq1a0uUAAAC/I7wHAAAgMd9//32cddZZBc62r1SpUnTr1i1OPPHE2HnnnTMeV6FChahatWrUq1cv2rRpE8cee2ysXr063nnnnbjnnnvis88+y3jugAEDYosttohTTjmlWJ8PQFH16tUrevfuXaRzUqlU5OXlxapVq2Lp0qXx888/x7Rp0+KTTz6JYcOGxaxZszKe+/3338cdd9wRV1xxRXFLBwAASpjwHgAAgEQsWLAgzj333AKD+4MPPjj++te/RqNGjbK6RoUKFWK//faL/fbbL1566aXo27dv/Pzzz2mP7devX3To0CFatWqV1bUAykpOTk5Urlw5KleuHNWrV4/69etHq1atYv/9948//elPcffdd8eAAQMilUqlPf/hhx+OU045JZo2bVrGlf8/vXv3LvJDCwAAsLGz5z0AAABlLj8/P/7yl7/E5MmT0/ZXq1YtbrnllrjzzjuzDu5/77DDDotnn302tttuu7T9K1eujGuvvbZErgWQlCpVqkSfPn2iX79+GY/Jy8uLRx99tAyrAgAACkN4DwAAQJkbMGBAvPfee2n7Nttss7j//vvj6KOPLvHrNmrUKB544IFo0qRJ2v4xY8bEyy+/XOLXBShr3bp1i549e2bsHzJkSKxevbrsCgIAANZLeA8AAECZmjFjRtx7771p+3JycuLWW2+NXXfdtdSu36BBg7jlllsiJycnbf/AgQNL7doAZal3795Rt27dtH3z5s2LL774oowrAgAACiK8BwAAoEz985//jGXLlqXtO+ecc6JLly6lXkOHDh3iqKOOStv35ZdfxtixY0u9BoDSVqNGjejWrVvG/jFjxpRZLQAAwPoJ7wEAACgzX3/9dbzwwgtp+3baaafo06dPmdXSq1evyM1N/8/iYcOGlVkdAKWpc+fOGfu+++67MqwEAABYn4pJFwAAAJS+2bNnx4cffhgffvhhjB8/PubOnRvz5s2LZcuWRdWqVaNOnTrRvHnz2GmnnWK33XaLPfbYIypVqpR02WUulUrFF198ER9//HF8/vnnMXHixFi4cGEsWLAgUqlUVK1aNerVqxeNGzeOVq1aRdu2baNz585Ro0aNUq1rxYoV8e6778bo0aPj66+/jilTpsT8+fNjxYoVUaVKlahVq1Y0b948dtxxx9hjjz1ir732isqVK5dqTdl65JFHMvZdfPHFUaFChTKrpXnz5rHXXnvFu+++u07fG2+8Ef/3f/9XYteaM2dOPPLII/Hmm2/Gjz/+GKlUKurXrx9t2rSJ/fbbLw455JCsvmfjx4+Pjz/+OL788suYPHlyzJgxIxYsWBDLly+P/Pz8qFy5clSvXj222GKLaNy4cey4447RoUOH6NChQ1SsWHp/Epg5c2a88sorMWbMmBg3blzMmzcvFi9eHJUrV44tttgiWrVqFXvvvXccfPDBsfnmm5daHZl89dVX8f7778fnn38eP/74Y8ycOXPtahCbbbZZNGnSJLbeeuvo2LFjdOnSJRo2bFjmNZZ3K1asiFGjRsWYMWPiiy++iKlTp8aCBQti0aJFUaFChahWrVpsscUW0aRJk9h5552jffv20bFjx03yvae0bbfddhn7fv755xK5xptvvhnPPPNMfP755zF//vyoUaNGtGzZMnbfffc4+uijY+utty6R6xTF6tWr46OPPoqRI0fGuHHj4vvvv4+FCxfG0qVLY7PNNotatWpFgwYNok2bNtG2bdvYZ599onr16qVSy+LFi+Ptt9+Ojz/+OL799tuYOnVqLFq0aO37eJ06daJFixbRunXr6NSpU+y2225l+n4IAMCGIyeVSqWSLgIAAJJy5513Rv/+/dP2vfHGG9G0adNSvf7UqVPjgAMOSNvXq1ev6N27d7HGHz16dNx7773xzjvvFOm82rVrR/fu3aNnz56xxRZbZH390047LT766KN12m+66aY49thjsx43IuLKK6+MIUOGrNOezddtyZIl8eijj8bjjz8e06dPL9K5lSpVii5dukTPnj2jQ4cORTp3faZPnx733XdfPP/887F48eJCn7fm+3f22Wdn3Os4CQsWLIh999037ZL5HTp0iEcffbTMa3rxxRfj4osvXvv/K1asGG3atInOnTvH2Wefvd5A/cMPP4zTTz99nfYHH3ww9txzz4iIeOWVV+Kqq66KJUuWZBynbt26ceGFF8ZJJ5203lB91qxZ8eSTT8bQoUNj6tSpBR6bSZ06deK4446Lnj17Rv369bMaI51vvvkm/vOf/8Q777wTq1evXu/x1atXjx49esSFF1649mud6b58zDHHRL9+/bKubeXKlfHcc8/F4MGDizTbODc3Nzp37hwXXHBBtG/fPuvrF9egQYPipptuWqe9WrVq8f7778dmm21WItdZsGBB7LXXXpGXl7dO31NPPRVt2rQp8Pxp06bFfffdF8OGDSvSfSsiYvPNN48jjzwyevToEc2bNy/SuRu60n6/L8jKlSujdevWafv23HPPePDBBzOem+59vH379vH4449HRMTChQvjkksuWe/vGV26dInLL788ttlmm7VtpfVa//nnn2PQoEHxzDPPxNy5cwt9Xs2aNaNbt25x5plnRuPGjbO+/q9NnDgx7rnnnnjllVdixYoVhT6vQYMGceqpp8app55a6g8IAgCwYbFsPgAAbIQmT54cp5xySpx66qlFDu4jIubPnx/3339/HHLIITFw4MBChXDl1ciRI+PQQw+Nf//730UO7iMi8vLy4rXXXotTTjklLrzwwpg5c2axa8rLy4v+/fvHIYccEo8++miRA7A137+DDz44nnzyyWLXU1KGDx+eca/70047rYyr+cW+++4b22yzTfzxj3+M/v37x4cffhiPPfbYb8Lk4nj55ZejT58+BQb3ERFz586NG264IX788ceMxyxbtixuvfXWOOCAA6J///5ZB/cREfPmzYuBAwfGwQcfHI899ljW46yxcuXKuP766+OYY46JN998s9D3jKVLl8bdd98d3bt3j6+//rrYdWQycuTI6Nq1a1x33XVFXiY8Pz8/3nnnnTjppJPi0ksvjXnz5pVSlQU76qij0s5KX7ZsWbz22msldp0XX3wxbXC/zTbbrDe4Hzx4cBx22GHx2GOPFfm+FfHLgwOPPPJIHH744fHPf/4zVq5cWeQxWFdBX8eaNWtmPe6yZcvinHPOKdTvGW+99VbGhyVLyqpVq+K///1v7L///nHvvfcWKbiPiFi0aFE8/PDD0bVr13jssceiOPOdlixZEjfccEMceeSRMWzYsCIF9xG/rJh02223xaGHHhqvv/561nUAAFD+CO8BAGAj8/zzz0e3bt3i448/LvZYS5cujX/9619x5plnFvmP4OXBCy+8EOecc07MmjWrRMZ744034rjjjotvvvkm6zFmzZoVp512Wtx5553FDq4WLVoU1157bVxyySWxfPnyYo1VEv73v/+lba9Ro0bst99+ZVzNLzbbbLN48cUX4/rrr4+DDjqoRGc4Tpw4Ma644orIz88v1PG77rrrb2al/trkyZPjhBNOiHvuuadEA80lS5bE3//+97jxxhuzHmPWrFlx8sknx6OPPlroz/X3xo8fHyeffHKMGTMm6zrSSaVS0b9//zjjjDMKfDCisIYPHx7du3cv1ms8W3Xr1s34Ohk+fHiJXef5559P217QaimpVCpuvPHG+Mc//lHkkDKdvLy8uO++++L000/P6iEAfqug9+86depkPe7f/va3Ir1mTzjhhKyvtT4//fRTnHDCCXH77bcX+/1uzX3xqquuyuqe9t1338Vxxx0XDz/8cNb3xDVmz54dF110UfTr12+jfpASAID/R3gPAAAbkdtuuy0uv/zy9c7yLapRo0bFySefHD/99FOJjpukkSNHxiWXXJJ2hmlxzJo1K84999ys9hGeNm1anHzyyfHZZ5+VaE0jRoyI8847L9EAf9myZTF69Oi0fV26dIkqVaqUcUWla9WqVXHppZcW6WueKdiaNm1anHbaaTF+/PiSKm8dDz30UFazt+fPnx9nnnlmjB07ttg1LF26NM4777yYOHFisceK+CVQvvbaa+POO+8s1gza35s2bVqceuqp8cUXX5TYmIXVvXv3tO0jR46M2bNnF3v8yZMnp73/VKhQIY4++uiM591xxx3x0EMPFfv6v/fZZ5/Fn/70pxL9/m2Kvvzyy4x99erVy2rMV155JYYOHVro45s3bx577LFHVtdanylTpsTJJ58cX331VYmOO2TIkLj88suLdM7XX38dJ598cpFX+FifBx98sEgPgwEAUH4VvJEeAABQbtxzzz0xYMCAAo9p27ZtHHzwwdG+ffto0KBBVK9ePebMmROTJ0+ON954I15//fVYuHBh2nO///77OPPMM+OJJ56IWrVqlcanUGYWLVoUV111VcZAaMcdd4xDDz00dtppp2jevHlsttlmUalSpVi0aFFMnTo1xowZE0OHDs34x/mZM2fGLbfcEjfffHOha1qwYEGceeaZMWXKlIzHNGjQIA455JDYZ599omnTplGvXr1YuHBhzJw5M0aNGhUjRoyIH374Ie25o0aNir/85S9x1113RU5OTqHrKikffvhhxhnjHTt2LONqSt/DDz9cpGXgN9988zjssMPWaV+9enX06dOnwAdn2rVrFwceeGBsv/326/y8zp07N77++usYPXr0evdcvvHGG2PvvfeOqlWrFqrmVCoVvXv3jgkTJmQ8pkmTJnHUUUfF3nvvHVtuuWVUrVo1fvrppxg3blwMGzYsRo8e/ZvX4fz58+Pll18u1PXX5+abb46nnnoqY3+FChViv/32iy5dusTOO++8NsScOXNmjB8/Pl588cUYNWpUrFq1ap1zFy1aFGeffXY888wzZbo3+9577x0NGjRYJ6hfvXp1vPDCC9GzZ89ijZ9p1v0+++wTDRo0SNv3xRdfxD333JO2Lzc3Nzp37hz7779//OEPf4jGjRtHtWrVIuKXr+HEiRPjww8/jOeffz7jdgTvv/9+PPfccxkfXGD9ClrWfn1bIaSzZMmSIq/Wcfzxx5fKe8/ixYvj7LPPjmnTpmU8pm7dunHQQQdFly5domnTplG/fv3Iy8uLKVOmxMiRI+PJJ5/M+PDL8OHDo127dnHKKaest5YpU6bEGWecUeDWGk2bNo1DDz00OnfuHI0aNYratWvHvHnz4qeffop33nknXnrppZgxY0bGWmrXrh1XX331emsBAKD8Et4DAMBG4IMPPoj//Oc/Gfu33nrruPbaa6NTp07r9NWtWze22267OPDAA+Oqq66K2267LZ544om0s7smTZoUl19++XofEtjQ3XfffWn/OF6tWrW44YYbomvXrmnPq1WrVjRp0iR23333OPfcc+PRRx+Nfv36pZ29P3z48OjVq1c0a9asUDVdcsklGYP3SpUqxQUXXBBnnnnm2uBrjdq1a0fz5s2jY8eO0bt373j66afj5ptvjkWLFq0zzhtvvBEDBw6Mc889t1A1laSCZn526NChDCspG78Py2rXrh1nnnlmHHTQQdG0adNYuXJljB8/Pt5666145pln4vDDD0+7+sDjjz+ecYZ38+bN46abbsr49Vvz89q6des44YQT4v/+7//i1ltvjSeffDLt8TNmzIh33303DjrooEJ9joMHD46PPvoobV+lSpXivPPOi/PPP3+dfdrr1asXO+20Uxx//PExcuTIuOaaawp8aCUbL7zwQjz44IMZ+zt37hx//etf025TsMUWW0Tr1q2je/fuMWHChPjrX/+a9nuwYMGCuOiii+LZZ5+NypUrl2j9mVSoUCG6desWAwcOXKdv2LBhxQ7vhw0blra9oCXzb7rpprTLeTdr1ixuv/322GmnndKeV6dOnWjevHnsv//+0bt37+jXr188/fTTaY8dMGBAHHPMMZGbawHJopo2bVqMGDEibV+lSpWyenjq22+/Xadt7733jtNOOy3atm0b1apVi9mzZ8cnn3wSzz//fHz44YcF/gwVx3XXXVfge2fPnj3jggsuiM0222yd/oYNG0aHDh3i3HPPjX//+98xePDgtOP885//jH322afA9/OVK1fGRRddlDG4r1mzZvTp0ydOPPHEqFjxt3+OrV27dmy11VbRqVOnuOSSS+L++++P/v37p33g7eGHH462bdtm/D0FAIDyz796AACgnFuxYkVcffXVGZdS3WeffWLIkCFpg/vfq1WrVlx33XXRv3//jGHUm2++Gc8991yxak5SKpXKWP9tt91W6D+I5+TkxKmnnhr/+te/0vavXr260EsKP/PMM/Huu++m7atdu3YMGjQoLrroonWC+3SOP/74GDJkSDRu3Dht/5133lniy/kWRqal0CtWrBgtW7Ys22LK2DbbbBPDhw+P8847L7beeuuoXLly1KhRI9q3bx9/+ctf4rXXXovzzz9/nfNWrlyZcUZz48aN49FHHy3Sgw+1a9eO66+/vsBZm6+++mqhxpo3b17cfvvtafsqVaoUd955Z/Tu3Xud4P73OnXqFM8991zGgDcbc+fOjeuvvz5j/9lnnx333Xdf2uD+9/7whz/EE088kTF4HD9+fNx7771Z15qNTLV89dVXMWnSpKzH/eSTT2Ly5MnrtNepUye6dOmS9pzvvvsuPv3003XaN99883j44YcL/X2tUaNG3HDDDXHqqaem7Z88eXLGbTfIbPXq1fH3v/894/Ywu+66a1SvXr3Y17nqqqvivvvui3333Tc233zzqFy58tpVN+6///546aWXon79+sW+zu+NHj0644MJ1atXj3vvvTcuvfTStMH9r1WpUiX++te/xhVXXJG2f9myZXHfffcVOMbdd9+d9qGGiF9WIHn88cfj1FNPXSe4/72KFSvGeeedF48//njGVY5uuOGGmDt3boHjAABQfgnvAQAggwMOOCBatWpVqv8dcMABxa5z8ODBGZeL3WeffeK///1voZfB/vXnfvfdd0eFChXS9t96662xbNmyIte6IZg0aVLMmjVrnfbddtst9ttvvyKPd+ihh2bcC/rNN99c7/nLly+P2267LW1f5cqVY+DAgUWemd6sWbMYNGhQ2rBk5cqVBa7SUFoyhfdNmjRZb5hRnm2xxRbx4IMPxhZbbJHxmM022yzt9+qtt95K+7MaEfGPf/yjwDELctppp2X8mfrkk08KNcbgwYNj6dKlGWsrymupVq1a8eCDD8bWW29d6HMK8t///jfmz5+ftq9nz55x2WWXFWn57goVKsSNN96YdluDiF9W8vj555+zKTUrW2+9dbRr1y5tX6aZ84WRacn8I488MuPDXCNHjkzbfvrpp0ejRo2KXMMVV1wRLVq0SNtXmPsp/8/KlSvj2muvjbfffjvjMWeeeWaxr9OrV6/1rvhQ2BVoiurf//532vbc3NwYMGBA7LnnnkUa78wzz8z4Oh86dGjGwHzmzJlx//33p+2rXbt2PPTQQ/GHP/yhSLXsvPPOcd9996V9uGLevHlpV98AAGDjILwHAIByLC8vLx566KG0fXXq1Il+/fqtd+ZrJp07d46zzjorbd/s2bPjmWeeyWrcpGVaXneXXXbJeswzzjgjbfs333yz3occnnrqqZgzZ07avquuuirrulq0aBF///vf0/a9+uqrxZqhm41MD5hkE/CVJ+eff340bNgwq3NfeumltO277bZboVbSKMhxxx2Xtn3mzJm/2YM+nby8vHj88cfT9u27775x1FFHFbmezTffPPr27VvsPbF//vnnjNsCtG/fPi677LKsxs3NzY0bbrghttxyy3X6li1bFoMGDcpq3Gxl2v99+PDh6/3+pbNy5cp4+eWX0/YVtNx5pvtp69ati1xDxC8PLJ188slp+8aMGZPVmJuaVCoVI0eOjO7duxf4Pr3TTjvFvvvuW6xrNWzYMM4777xijZGtr776Kj777LO0fT169Ijdd989q3H/7//+L+3DKsuXL4///e9/ac954IEHYsWKFWn7brnllmjatGlWtbRp0yb+/Oc/p+17/PHHY8GCBVmNCwDAhk14DwAA5dibb74Zs2fPTtt35ZVXRr169Yo1fu/evTPOgnziiSeKNXZSlixZkra9ODNnd9hhh2jcuHFss802sd9++0WPHj3immuuiQEDBmRcvWCNTHs8b7vttnHiiSdmXVNExIEHHhjt27dfpz2VSsWzzz5brLGLIj8/P+Ms7fUtZ1ye1a5dO2NIvj6pVCpGjRqVtu+kk04qTlkR8UsolM6qVasyvkbWeP/99zPObL/qqquyrqlDhw7F3sd56NChafeJjvhlVndxVnmoUaNG9OrVK23fkCFD0u77XloOO+ywtNtoTJs2rdCrJ/zaW2+9lTYI3GGHHWKHHXbIeF6m13Vx7qedO3eOmjVrxk477RSHHnponHfeeXHDDTfE5ZdfnvWYG6P8/PxYvHhxzJw5M7766qsYMmRI3HjjjXHAAQdEz549Y/z48RnPrVChQlx55ZXFruH000/PuCpDacu0LU3t2rWjT58+WY/boEGDjPehDz74YJ22lStXZqylc+fOxX5A4rTTTku7Dc6yZcsybhkAAED5tvGuTQgAAJuA1157LW17nTp14vDDDy/2+JUrV46TTjop+vXrt07fxIkTY9KkSYXaN3pDkiksfvXVV+Oyyy7L+oGHbJZ0Hj9+fMaA5dxzz43c3OI/b33iiSem3ZP6pZdeKrMwbPHixRn70gWQG4u99torqlSpkvX5DzzwQEyePDkmT54cU6ZMicmTJ8eMGTNin332KXZtDRo0yNi3fPnyqFGjRsb+V155JW17u3btYquttipWXSeccEIMHz486/NfeOGFtO2dOnWKtm3bZj3uGkcccUT069dvnZ/p2bNnx+jRo2OPPfYo9jUKo0aNGnHIIYekDQ2HDRtW5K02MoWPBc26j8h8P33yySfjmGOOyWolhW233TY+/vjjIp9XnvXv3z/69+9fZte76KKLYrfddiv2OPvvv38JVJOd119/PW17165di7xV0O8deuih8dxzz0XEL6tuNG7cOLbeeuu0S98X9DDTBRdcUKw6In550OL444+P22+/fZ2+l156KU455ZRiXwMAgA2L8B4AAMqxdLPAIiKOPvroEpsNd8wxx8Stt96adjbru+++W+7C+0z7ai9ZsiTOPvvsuOeee7LeS7yo3n333bTtlSpVKrFQZJ999omcnJx1ltKePn16fPfddyW2z3hBMs3OLUkff/xxiYcYTZo0ybhMcmEUNUD9tZycnPXOei6OgsL5VatWFXju6NGj07YfccQRxaopIqJjx47RqFGjmDFjRpHPnTt3bowbNy5t30EHHVTc0iIionr16tGxY8e0D+u8//77ZRbeR/wSrKcL3V955ZW4+uqrC/0eMG/evHjnnXfWaa9UqVIceeSRBZ6b6f4xZsyYuOqqq+L6669PbGY26e23334lEirXq1evTN4/0pk6dWpMnz49bd/RRx9d7PH32GOPuO2222LrrbeOrbbaqsCHsDK9j9evXz923XXXYtcS8ct2JOnC+zFjxsSSJUs26hVsAAA2RZbNBwCAcmr69OkZ90rfa6+9Suw6tWvXjp133jlt39ixY0vsOmVlq622SrsEbUTEuHHj4pBDDonbbrstvvvuu1KvJd2M+IiItm3bRs2aNUvkGnXq1Ek7WzAiMu4XXNIKCu+WLVtWJjUkoVWrVkmXkFFBM6ILWv599uzZMWXKlLR97dq1K5G69txzz6zO/fTTTzPu914SqxWskWnGclm9nn5dR7NmzdZpnz9/ftowPpMXX3wx8vLy1mnff//9o06dOgWeW9D3asiQIXHooYfGY489Vqxl9Ck5Rx55ZNxxxx0lsqpLkve3TO+dVatWjZ122qnY41epUiUOP/zw2H777de7ekqmWjp37pzVyhPp7LDDDml/J8jLyyuXv4cBAFAwM+8BACCDN954I5o2bVqq15g6dWoccMABWZ377bffZuzLFLZnq3Xr1mn/QF1QDRuqnJycOO644+KOO+5I27906dIYMGBADBgwIFq0aBH77LNP7LPPPrHbbrsVeyne3/v666/Ttpf0bMatt9467fL8ZfX9K2hW4MYc3hd3CfmSNn/+/Pj8889j1KhRBa4okCkAj4iYMGFC2vbc3NzYdttti11jRMR2222X1XnffPNN2vYqVaqU6L0802ojBe0xXhpycnLimGOOSXsvGzZsWBx44IGFGuf5559P276+JfMjIpo3bx577LFHjBo1Km3/tGnT4u9//3v07ds3dt5559h3331j7733jtatW5dIgEzhNGnSJC655JISWR1jjZYtW5bYWEU1adKktO3bbbddVKhQoczqyMvLi4kTJ6btK8lViXJzc6Nly5Zpg/pvv/22TFf8AACg9AnvAQCgnMq0ZOyWW24ZdevWLdFr7bjjjmnbp02bVqLXKSs9evSIp556Kn766acCj/vxxx/j4YcfjocffjgqV64cHTt2jL322is6d+5c7FmHeXl5Gb+HDRs2jCVLlhRr/F/bcsst07ZPnjy5xK5RkCpVqkSlSpXSzu6dN29emdRQ1ipVqrTeWculZeHChTFlypT48ccfY9KkSTFhwoT49ttv48cffywwmC+MTLPumzVrVmIPt2T72vrhhx/Stjdq1KhEt26oX79+2vYFCxbEvHnzyvT7fuyxx0b//v0jPz//N+1vvvlmLFq0aL0rePzwww/x+eefr9PeoEGD2HvvvQtVwyWXXBInnXRSgdst5OfnxxdffBFffPFF3HnnnVG7du3o1KlTdO7cOTp37pzxHkX2KlasGLvttlscffTRccQRR0SlSpVKdPyy2l4mnUz3oWwf/MnW9OnT076vRfzyGirJ9/HGjRunDe/L6n0cAICyI7wHAIByaubMmWnbMwVLxVGvXr207UuXLi2X+63WqFEjbr311jjzzDNj+fLlhTpn5cqV8f7778f7778ft9xySzRq1Cj23Xff2H///WPPPfcscjAya9asjEHqHXfckXFlgJI0a9asUr/GGnXr1k37M/vjjz+WWQ1lqUaNGiW2ZHImU6ZMiS+//DImTJgQ33//fUyePDmmTp0a8+fPL7VrZtqLviQD60zbWqxPpnviDz/8EO3bty9OSYU2a9asMg3vGzVqFJ06dYr333//N+0rV66Ml19+OY4//vgCz8806/7oo48u9AzmXXbZJS677LK46aabCld0/LIKxEsvvRQvvfRSRERsv/320aVLlzjggANil112KfQ4m7KcnJyoXLlyVKlSJTbffPOoX79+NGnSJLbZZpvYaaedYtddd40aNWqU2vVr1apVamOvT6YH72rXrl2mdWS650REXHnllXHllVeWeg1l+T4OAEDZEN4DAEA5lWkmaWn8sb6g2ZvLly8vd+F9RMSuu+4aAwcOjD59+mS1H/OMGTPiiSeeiCeeeCI233zzOOigg6J79+6FDgkXLFhQ5GuWtNIMeX9v2223TRt0LF26NGbOnBkNGzYss1rKQklvsbDGpEmTYtiwYTF8+PBEVr7INJO0evXqJXaNbO8nm9prao3u3buvE95H/LJ0fkHhfSqVimHDhqXtK8yS+b/Ws2fPyM3NjVtuuSXjTOSCfPPNN/HNN9/EgAEDomnTptG1a9c47rjjolmzZkUeqzzq1atX9O7dO+kyimR9e8GXprL8/acgm+o9BwCA0iW8BwCAcirTjPH1LZOcjYLGXLlyZYlfr6zstttuMWzYsLjtttti6NChBS77XJAFCxbEM888E88880y0bds2Lr/88th1110LPKewM/5L04oVK8rsWn/4wx/SBowREePGjSt2eN+hQ4f49ttvszr3yiuvjCFDhhTr+r9X0vt5//TTT3HrrbfGsGHDir30fcQvIdfixYuLfF6mn9uSfIAn27HK8ud5Q6rhwAMPjFq1asXChQt/0z569OiYMWNGNGrUKO15n3zySUydOnWd9rZt22a1X/fpp58eHTp0iH79+sWHH35Y5PPXmDp1agwYMCDuvffeOOyww+Kyyy7L+DmQnJK+xxXFsmXL0raX9YOEm9r7OAAAZSO537Q3Yddcc020atUqbrvttjK75oQJE6Jv375x2GGHRbt27aJNmzZx+OGHx0033ZRx2UMAADZsmQK8kgj2fq+gmZRJzr4rCfXr148bb7wxXn/99ejdu3e0bNmyWOONGTMmTj311BgwYECBx/1+j+oklOWDFwXtY/7BBx+UWR3l0dtvvx2HHXZYPP/888V6fTdu3DiOPfbYuPPOO2PkyJFZjVEa95ffq1atWlZbDqxevboUqimaJB5mqlKlShxxxBHrtKdSqRg+fHjG8zItmX/MMcdkXcuOO+4YDz30UDzzzDNx4oknFmsZ8/z8/HjhhRfiyCOPjHfeeSfrcdj4bAiv9YgNo47y/AAlAADpmXlfxl577bV46qmnyvSa//3vf+Ouu+5aZxbRpEmTYtKkSfHMM8/ErbfeGvvuu2+Z1gUAQPFkCs0XLVpU4tcqaIZuaS0PXtYaNWoUvXr1il69esU333wTr7/+erz99tvx5ZdfFjloz8/Pj9tuuy1SqVRccMEFaY+pXLlySZRdLGURxK6x1157ZezLNCOfX5Y+v+qqq4q0KkRubm40btw4ttlmm2jVqlXstNNO0bp162jSpEmx66lWrVra9mxm8WeybNmyrH42N4TXVFK6d+8ejz/++Drtw4cPj3PPPXed9pUrV8bLL7+8TnvVqlXTPghQVK1bt47WrVvHNddcE6NHj4433ngj3nnnnfjxxx+LPNaiRYviwgsvjPvvvz923333YtdG+ZfptZ5pW4+yrqMsleX7OAAAZUN4X4befvvtuPjii8v0mv37948777wzIiLq1KkTZ555ZrRr1y5WrVoVL7/8cjz11FOxePHi+NOf/hTPPfdcVkvjAQCQjEx7u5ZkiLZGpgcCcnJyMoZ5pa00Z5ttv/32sf3220evXr1i3rx5MXLkyBg1alSMGjWqSOHTHXfcEXvssUe0a9dunb6Cvm7/+9//SiRo3ZA0bNgwtt9++/jmm2/W6Zs0aVJ88cUXscsuuyRQ2YZr0qRJcc011xQY3FeqVCl22WWXaNOmTey4446x7bbbxlZbbbXeh2qy3SIi07LUJXnfyXasTK+p3r17R69evYpT0gavdevWsd1228X48eN/0z5+/Pj45ptvYvvtt/9N+xtvvLHOMvsRvyzBX5Jbr1SsWDE6deoUnTp1ioiIKVOmxAcffLD2njpv3rxCjZOXlxd/+ctf4pVXXinzfc3Z8FSvXj1te1mH95nqqFixYnzxxRdRoUKFMq0HAICNg/C+jAwaNCj+9a9/FbjcaEn7+uuv4+67746IiCZNmsTgwYOjWbNma/s7deoUO+64Y1x77bWxfPnyuP322+OOO+4os/oAACieBg0apG2fPXt2iV/rp59+Sttev379xJa3Lqt9XuvUqROHH354HH744RHxS/j03nvvxf/+978YNWpUgQ8R5Ofnx6233hoPP/zwOn2Zvn8REdOmTdvowvuIiP322y9teB8R8eijjwrvfyWVSsXll1+ecU/lmjVrRq9eveLYY4+NWrVqFXn8bF8/jRs3Ttv+888/ZzVeOtmuHpLpNTVt2rTilFNudO/ePW666aZ12ocNG7ZOeJ9pyfzu3buXSm1rNGvWLP74xz/GH//4x0ilUvHVV1/Fe++9F2+88UaMHTu2wFnEc+bMiUGDBm30D2KwfvXr10/bPn/+/DKtI9M9Z9WqVfHTTz9tlO/jAACUPnvel7Iffvghzj///LjpppsiLy+vTJ+6veOOO2LVqlWRk5MT//nPf34T3K/xxz/+MbbbbruI+GV2T6Y/DAEAsOHJ9EfhWbNmlWiQFhExbty4tO1NmzbNaryS2O+9sDM2S1qzZs3ipJNOioEDB8b7778f1157bcZAMyJi9OjRMX369HXaa9eunXHW3tSpU0us3g1J9+7dIzc3/T9DX3jhhayW1N5YvfHGG/Hll1+m7WvatGm88MIL0bNnz6yC+4jsXz8tWrRI2z59+vRYsGBBVmP+3nfffZfVeZnuiRvr6+n3jjrqqKhUqdI67b9fHn/evHnx3nvvrXNc48aNY4899ii1+n4vJycndt555zj//PPj6aefjtdeey3OPffcjPfFiMwPHbBpyfSeO2HChBK7xpIlS9b7oGFB7/2byn0HAICSJ7wvRY8++mh07do13nzzzYiI2HbbbePvf/97mVx73rx58e6770ZExCGHHFLgDJazzjorTjjhhDjzzDNj6dKlZVIfAADF16pVq4x9mUK/bH311Vdp25s3b17geZmC2mXLlhW7plmzZhV7jOKqVatWnHLKKfH8889HmzZt0h6TSqVizJgxafsyfQ9Hjx5dUiVuUJo1axb7779/2r68vLy4/vrry7iiDdewYcPStufm5sbdd98dDRs2LNb4M2bMyNhX0OznP/zhDxlX28j0kE9Rff3111mdt+bB9N/74osvymyljiTVrVs3unTpsk77tGnTfnMPevHFF9OuCtitW7eM9+yy0KxZs7jkkkviySefjNq1a6c9ZvLkyTFnzpyyLYwNzh/+8Ie07ePHjy+xPeCvu+66aNOmTRx00EFxxhlnxLXXXhv33ntvTJw4ce0xderUyTj7fmN9HwcAoPQJ70vR2LFjIy8vLypXrhznnXdePPfcc+v94+bvrVy5Mh599NHo2bNn7LnnnrHzzjtHp06d4vTTT4+HH34440z5Dz74YO0/xrt27VrgNbp16xZ9+/aNv/zlL1G3bt0i1QcAQHKaNGkS9erVS9uXblZltmbNmhXffvtt2r62bdsWeG66WaARxd+XdunSpcVaCjs/Pz+mTJkSb7/9djz44IPx5JNPFqueWrVqxT//+c+MoWamGXg777xz2vaS/P5F/LJ3+sSJE0vkoYni6tmzZ8a+9957L5566qmyK2YDlin46dKlS8aQuigKesCnoJUx6tatmzE4GzVqVLHrioiMD7usT+vWrdO2L1++vESDtAULFsQXX3wRc+fOLbExS8qxxx6btv2ll15a+/ELL7ywTn9OTk4cc8wxWV1z5cqVMWHChHjllVfiv//9b4wcOTKrcdbYbrvt4rLLLsvYb0YzO+20U9r2pUuXxvjx40vkGl9++WXk5eXF5MmT44MPPognn3wy/v3vf6/zu0em+05Jv49//fXX8cMPPxS4VQ8AABsHe96XoipVqsTxxx8fF1xwQVb7XH3zzTdx0UUXrfMP07lz58aHH34YH374YTz44INxxx13rPNHv1/vI/nrWff5+fkxe/bsWLJkSTRs2DA222yzItcFAMCGY88994zhw4ev0z5s2LC47LLLonLlysW+xtChQ2PVqlVp+3bfffcCz820/HFxl7z//PPPs1p6/5NPPonrr78+fvjhh988CLtmH+biaNGiRWy77bZpl+3NtMJV586d4+GHH16nfdasWTFy5Mjo1KlTsWqKiFi9enWcc845awOHevXqRZMmTaJp06axzz77ZB3YZatjx46x//77x//+97+0/ddff300a9asRD738mrhwoUZg+H1PTBTWG+99VbGvkyv9zX23HPPtAHZ0KFD489//nOxZm/Pnj0764cAdthhh6hXr17abUOef/756Ny5c9Z1/doDDzwQAwYMiIhf7nGNGzeOpk2bRtOmTeOKK64okftutvbZZ59o0KBBzJ49+zftr732Wlx11VXx008/xaeffrrOeR07dizyZINHH300HnrooZgyZcpvlhfv3r17sV+/mVboiCiZlVso33beeefYfPPN027VMWLEiAJXJiqM6dOnxw8//LBOe05Ozjr34M6dO6d9P/v888/j+++/j6222qpYtURELFq0KE4++eRYunRp5OTkRIMGDda+jx9++OEFvl4AACh/zLwvRdddd13ccMMNWQX33333XZxyyikxderUqFSpUpx00klxzz33xNNPPx333HNP/PGPf4xKlSrFtGnTokePHjFp0qTfnL/mD4aVKlWKLbbYIubMmRPXXXdd7LHHHrHPPvvEYYcdFh07dowePXrExx9/XCKfLwAAZe/ggw9O2z5//vy0oX5RrVy5MuNM6KZNm8Y222xT4PmZlj5O90fxonjllVeyOq9Ro0bxzTffrLOC1ZQpU7LeZ/vXqlatmra9Zs2aadv32GOPjH3//e9/i11PxC9fq1/PFPz555/jiy++iBdffDGxbbOuueaajA925OXlxUUXXRRvv/12mdTy4osvxquvvlom1yqsgsLJzTffvNjjjxs3Lj788MOM/emWVP+1I488Mm37Tz/9tHbbuGwNGTJkvQ8PZJKTkxMHHnhg2r4XXnghfvzxx+KUFhG/rBry63vi0qVLY+LEifHWW2/F559/nmhwHxFRsWLFOOqoo9ZpnzZtWowfPz5effXVtMuKZ5qxX5DNNtssfvjhh3X2BX///ffXu1f4+lSrVi1jX40aNYo1NuVfbm5u7Lvvvmn7RowYkfU9ZI0XXngh7etku+22W+cefMABB6R9YCk/Pz/uueeeYtWxxhNPPLH2/TqVSsWsWbPis88+i+HDh0eFChVK5BoAAGw4hPelqDizDS677LJYvHhx1KxZMx577LH429/+Fl26dIlddtklunTpEtdff3089NBDUbly5Vi8eHFcffXVvzl//vz5EfHLP2rHjBkTRxxxRDzxxBO/eSp59erVMWrUqDj11FPjgQceyLpWAACSs99++2Xc+uiWW24p9t7At99+e0yZMiVtX2Fmqjdu3Dht+yeffJJxC6j1mT17dgwdOjSrcxs3bpzx4drHH388qzHXWLlyZcaHElq0aJG2vWrVqhmD0I8++ijt8tZFsWLFivj3v/+dtq9ixYpx2GGHFWv8bDVu3Dj+/Oc/Z+xfsmRJXHDBBfHAAw9ktcJCYUydOjV69eoVF198cbG3cShptWrVytiX6fVYWHl5efH3v/+9wH2h17cs88477xw77rhj2r4bb7wx64dCZs2aFQMHDszq3DWOO+64tO2rV6+OG264odj7YQ8YMCDjqgjr27KurHTv3j1t+1tvvRWvvfbaOu3Vq1ePQw45pMjX2W233dK2l8RDHJmWPs/Jycl4P2XTkumBk+nTp8egQYOyHnfp0qXx0EMPpe1Lt1LNlltuGXvvvXfa44cNG1bsCTM///xzxocAateuHXvttVexxgcAYMMjvN8AjRw5cu3+gxdeeOFvlr3/tfbt20ePHj0iIuLTTz+NL774Ym3fmj8+rVixIs4///xYsGBBnHbaafHCCy/E2LFj4+23344rr7wyqlevHqlUKm6++eZ48cUXS/kzAwCgpFWqVCnOOOOMtH3z58+PK664Iuv9Ud9///148MEH0/ZVr149Y0j2a5n2gl26dGk8/fTTRa4pPz8//vrXvxZr2eRDDz00bfvjjz+edsn7who2bFgsWrRonfaKFStG+/btM5535plnRqVKldL2XX311cXav/fGG2/MuD/0EUcckfHBj7LQs2fPOProozP2r169Om6++ebo3r17fPLJJyV23e+//z6uvfbaOPTQQ9MGmRuCatWqZVyR4dVXX816VmkqlYq//e1v691TfsWKFesd69xzz03bPm3atLjhhhuKXFt+fn5ce+21sXDhwiKf+2u77LJL7LHHHmn73nnnnbjzzjuzHvvjjz/OeE+sWbNmdOvWLeuxS9I222yTdnuF4cOHp10y/9BDD824EkZBGjdunPEef/PNN2f9gFbEL0vyp7P99tsX+HALm4499tgjtt9++7R9/fv3X2eFysK68847Y9asWeu0V6lSJeM2M5nuh6tXr44+ffrEzJkzs6olPz8/rrzyyrS/W0REnHzyyVGxoh1RAQA2NsL7DdCvn1Bf3xO0v14m7Nf7Aq75Y+bSpUtj/vz50bdv37j66qtj2223jcqVK8eWW24ZZ5xxRjz44INr/1DYr1+/Qv2RBgCADcupp54ajRo1Stv33nvvxYUXXljkEOXNN9+M888/P+PSx3/6058KFfx27NgxNttss7R9//nPf4q0VP3KlSvjiiuuiHfeeafQ56Rz8sknp11mNi8vLy644IKs/sg+YcKEuOWWW9L27bPPPgV+rZo1axYnnnhi2r6lS5fGaaedltXMvbvuuiuefPLJtH2VKlWKP/3pT0Ues6TdcMMN0bFjxwKPGTduXJx88slx4oknxogRI7J6cGPJkiUxfPjwOOuss+Kwww6LJ598cr1Lw+fm5sYJJ5xQ5GuVlA4dOqRtnzx58tr91oti0aJF0adPn3jmmWfWe2xhViI47LDDMj5o/uyzzxYpwF+9enVcfvnlxZ6tvcall16acSnpu+66K/71r38VeQb+l19+Gb179874c3POOedk3CYkCelmJY8fPz7tgx+ZZuoXxqmnnpq2ffLkydGnT5/1vs7SGT58eDz//PNp+wr7gMRpp50WrVq1SvtfQVtGUH7k5OTExRdfnLZv2bJl0aNHj5g4cWKRxnz66aczrkx5wgknZHyNd+jQIeO+87Nnz46TTz65yA8Hrl69Oq677rqMv/PUqVMnzjrrrCKNCQBA+SC83wCNGzdu7cdHHXVUxn9wtmrV6jf/UJ48efLaj3+912anTp3i+OOPT3uttm3brp0xNXPmzPjggw9K+tMBAKCUVa9ePfr27Rs5OTlp+999993o1q1boX7XW7RoUfTt2zcuuuiijDP2d9lllzjttNMKVVvlypWjS5cuafsWL14cp59+eqGC6U8++SSOP/74GDZsWKGuW5CmTZvG4YcfnrZvypQp0b1793jjjTcKPd7rr78ep5122m+2qFojJycnLrjggvWOcfHFF0ezZs3S9s2fPz969uwZt912W8bZd782a9as+POf/xx33HFHxmPOOeecaNq06XrHKm2VK1eOu+++u1DL/n722WdxySWXxO677x5nn3123HvvvfHWW2/F5MmTY968eZGXlxcrV66MefPmxYQJE+L111+P/v37R8+ePWPPPfeMSy+9NN57771ChbYNGjSIBx98MM4///yS+DSzkmnv9ohfZob279+/UPuK5+XlxXPPPRdHHHFEvPzyy4W69ppt2Nanb9++Gfd4f/jhh+Oss86K6dOnFzjGDz/8ED179ozhw4cX6pqF0bp164wrkkREDBw4MHr27Blff/31esdavXp1PPLII3HaaadlXC5/q622itNPPz3rekvDEUccUeC+8Wu0aNEi44MihXH44YdnvJe8+eabcfLJJxd69ZBVq1bF3XffHVdccUXa/gYNGmT82wabpi5dumRcTWf27Nlx0kknxWOPPbbe7VcWL14cN9544zpbUq6x5ZZbRp8+fQoc429/+1tsvvnmafumTp0aJ554Ytx///2FmjTz/fffx5lnnhlPPfVUxmMuvfTSqFGjxnrHAgCg/LG20gZo3rx5WZ336z8W/voX+IMPPrjA8/bff/+1+3uOGTMm9ttvv6yuDwBAcvbee+/405/+FLfffnva/u+//z7OOOOMaNu2bRxyyCHRvn372GKLLaJatWoxZ86cmDx5crzxxhvx+uuvpw2h19hyyy3jrrvuKtIyrRdeeGG8/PLLaYPG2bNnx6mnnhpdunSJrl27xk477RR169aNvLy8+Omnn2LMmDHx4osvpl02/YADDoi33nqrUAHm7/31r3+N999/P20YN3v27Ljwwgtj2223jSOOOCLatGkTzZs3X/s79uLFi2Pq1KkxduzYePHFFwsMAE844YSMs5N/bbPNNou77rorTjrppLSznvPy8mLAgAHxxBNPxAEHHBD77rtvbLXVVlGvXr3IycmJefPmxbhx49buaV1QOLDnnntG796911tTWalZs2bce++9cf3112dcKeDXVqxYEe+++268++67pVLP0UcfHVdddVXUqVOnVMYvrKOOOioGDBiQcY/7O++8M55//vk49thjY9ddd41mzZpFjRo1YsWKFWsfYPjoo4/i9ddfj9mzZ6cdo3bt2mmD+p9++qlQNW6//fZx5ZVXxvXXX5+2/7333ovDDz88Dj744DjssMOiZcuWUadOnfj555/ju+++i5deeilee+21dR4UqlGjRixevLhQNWRy8cUXx1dffRUjR45M2z9q1Kg45phjYs8994wuXbpE27Zto379+lGjRo1YtGhR/PDDDzF69Oh4/vnnC3wAoXr16tG/f/9CBeVlqUaNGnHQQQet94GnTMuAF1blypXjH//4R/To0SPtgzFffPFFHHXUUdGpU6fYf//9o3Xr1rHFFltEjRo1Ii8vLxYtWhQTJ06MTz/9NEaMGFHgyidXXXVVxpVc2HTdcMMN8e2338b333+/Tt/ChQvj73//ewwePDgOO+yw2GuvvWLLLbeMWrVqxcKFC+PHH3+M999/P5577rmMDy1VqFAh+vbtu96gvGHDhnHbbbfFueeem3aFi8WLF8ctt9wSgwYNioMPPjj23nvvaNasWdStWzfy8/Njzpw58eWXX8brr78e77zzToHboxx77LGF2roIAIDySXi/AVrzC3rlypULfMr29379D4kGDRqs/XjLLbcs8LzGjRuv/TjbBwcAAEjehRdeGAsXLsy4J3PELw9rrm+/60yaNGkSAwcOjC222KJI52277bbxxz/+MR577LG0/alUKt58880iLZm9/fbbxy233BK77bZbkWpZo27dutGvX7+46KKLMi7rPHHixIwPQxRG27ZtM87iS6dVq1YxYMCAOO+882Lp0qVpj5k/f348++yz8eyzz2ZV04477hi33npr5OZuWIuwVaxYMa6//vpo37593HzzzRlnOJemrbfeOq655prYc889y/za6VSuXDmuvvrqOP/88zOuFjB58uT4z3/+U+Sxc3Nzo0+fPtG4ceO49NJL1+kvyj3ilFNOiVmzZmVcyn/ZsmXx/PPPZ1wG/fdycnLimmuuyTj7urAqVqwY/fv3j3POOSftPu8Rv9x73n///Xj//fezukbVqlXjtttui2233bY4pZaa7t27Fxje5+bmFnoZ+oLsvvvucd5552X8GUilUvHBBx8Ua6W/Hj16xBFHHJH1+Wy8atasGQMHDowePXrEtGnT0h7zww8/xN133x133313kcbOycmJG2+8MfbZZ59CHb/XXnvFP//5z7jssssyhu+zZs2KRx55JB555JEi1bJG586d429/+1tW5wIAUD5sWH+xKWUTJkyIvn37xmGHHRbt2rWLNm3axOGHHx433XRTzJgxI+ny1lqzh9bKlSujYcOGscMOOxTqv18vs9mqVau1Hxc0c2rNddaoVatWyX4yAACUqSuvvDKuuOKKIs2ML4x27drFE088Edtss03WdWUbtP/ejjvuGA8++GCxl4vdd9994z//+U9UqlSpROr6tT322CPuv//+jEuKZ7LbbrvFww8/HE2aNCnxmvbaa694+OGHE59RXpBu3brFSy+9FCeccEKZPWDQqFGjuOGGG2LEiBEbTHC/RpcuXeLKK68s0TGbNGkSDz30UJx33nmx/fbbpz3mo48+KnDW5+9dfPHF8ec//7lEvmdXX311obZRKIwaNWrEAw88UCqhb+3atWPQoEEZtwXZEOy+++4Fbo+x5557RqNGjUrkWhdffHGp7b991llnxV//+tdSGZuNQ7NmzeLRRx+NnXbaqcTGrFy5cvTt27fIq1Mcfvjhcc8996z9215J6tatWwwYMCCqVKlS4mMDALDh2GTC+//+97/RrVu3eOSRR+K7776LpUuXxvLly2PSpEkxaNCg6Nq1a7z99ttJlxkREdttt93aj0eNGlXgsZMmTYq77747hg0bFj/88MPa9rZt2679ON0So782YcKEtR9vCPteAgBQPGeeeWY89thjscMOOxR7rBo1asRVV10Vjz32WJFn3P9alSpV4v77749TTjklcnJysh7nmGOOicceeyzq1q2b9Ri/duCBB8Zjjz2WMcQsqmrVqsUll1xSrIcLdt555xgyZEiJBdg1atSIv/71rzFw4MBysT9u7dq1o2/fvvHKK6/EaaedFtWrVy+V67Rp0yb+9a9/xWuvvRbHH398VKhQoVSuU1w9e/aMf/zjH8X+OlSuXDnOPvvsGD58eHTs2DEiIrbZZpto2LDhOscuWbIk/ve//xVp/AsvvDDuvffe9a78lkmlSpXiH//4R5x66qlZnZ9JtWrV4tZbb41+/fpFvXr1SmTMQw89NIYNGxbt2rUrkfFKS05OToHB47HHHlui17v88svjn//8Z4ndn7fccssYMGBAXH755SUyHhu3Ro0axeOPPx5nnnlmsR9g3GabbeLpp5+O448/PqvzO3fuHMOGDVvvNpaFVb9+/bjlllvi5ptvLpUHDgEA2LBsEuF9//794/bbb49Vq1ZFnTp14pJLLolHHnkkBg0aFCeeeGLk5ubG4sWL409/+lNMmjQp6XJj7733XvvxQw89lHGJxIhfPrf//Oc/cdlll/1macNOnTqtXTr/pZdeijlz5mQcY8iQIRHxyz5e+++/fzGrBwBgQ9CmTZt49tln49///ne0bt26yOdvueWW8ec//zneeuut6NmzZ4mEyJUrV45rr702nnrqqdh3332LFOK3a9cuBg8eHP369SvxvaV32WWXePbZZ6Nv377Rpk2brMaoV69enHXWWfH666/HueeeW+yv1+abbx59+/Zdu6d5Np9zgwYN4txzz42XXnopevToscGG05k0b948rr766nj77bfjhhtuiP3337/YAfZ2220XvXr1ihEjRsRTTz0VRx55ZLkIQrp37x5DhgyJo446qsj11q5dO84444x49dVX47LLLvvNnuEFLZv+wAMPFLnOvffeO15++eXo3bt3kYLyzp07x/PPPx/du3cv8jUL65hjjln7NcjmofVKlSrFIYccEg899FDcfvvtaR962BAdc8wxae9HtWrVigMPPLDEr3fUUUfFSy+9FL169cp6csC2224bV199dbz22mux3377lXCFbMyqVKkSV1xxRQwfPjyOPfbYqFq1apHOb9myZfTt2zeGDh1a7If6GjZsGHfeeWc8/vjjcfDBB2f1XtO8efPo06dPvPzyy3H00UcXqx4AAMqPnFRByfBG4Ouvv47jjjsuVq1aFU2aNInBgwf/Znn5iIgnn3wyrr322oiIOOSQQ+KOO+4otXo+/PDDOP300yMi4vzzz4+LL754nWNWr14dhx9++NqZ9GeffXZcdtll6xw3bNiwuPzyyyOVSsUWW2wRr7/++m+WznrwwQejX79+EfFLmH/XXXf95g81ERGDBw+Of/zjHxHxy+yB4uzpCQDAhuuHH36Id999Nz777LP4/vvvY8aMGbFkyZLIz8+PGjVqxOabbx7bbLNN7LjjjrH33ntHmzZtijVDvjCmTZsWr732WowePTomTpwYs2bNiuXLl0fVqlWjTp06sdVWW0X79u3jgAMOKLGZ8YXx/fffx0cffRTjxo2Lb7/9NubMmROLFy+OxYsXR8QvM3nr1q0bLVu2jB133DF222236NixY4lvVfBry5Yti/fffz8++eST+Prrr2Pq1Kkxd+7cWLFiRVSoUCFq1aoVtWrVihYtWkTr1q2jXbt2sdtuu5W7wH59Vq5cGZ9++ml8++23MWHChJg4cWLMmzdv7fcnLy8vqlatGtWrV4/69etH8+bNo2XLltG6devYddddS2xGcJJmz54db731Vnz22Wcxbty4mDt3bixatChWrFgRVatWjXr16kXz5s1j5513jt122y123333An82ly5dGrNnz16nPScnJ5o1a5b1fSAvLy/efvvtGDlyZHz++ecxY8aMWLBgQeTk5MTmm28eW2+9dXTo0CEOOeSQ32z7VlbGjh0bI0eOjC+//DJ++OGHmDlzZixZsiRSqVTUqFEjatasGVtssUXstNNO0bp16+jcufNG8fNTllKpVHz22Wfx+eefx7hx42LixImxYMGCWLRoUSxZsiQqVKgQ1atXjy233DJatmwZbdq0iT333LNM7/dlaeHChTF48OC0fWteq5SsxYsXxzvvvBOjR4+Ob775JqZOnRoLFy6MvLy8qFmzZtSuXTuaNGkSHTp0iN133z3atWtXalu2LFy4MN5999349NNPY/z48TFt2rSYN29erFixIipXrhw1a9Zce2/cZZddon379tGuXbtS/10MAIANz0Yf3l9wwQXxv//9L3JycuKpp56KXXbZJe1xRx55ZIwfPz4qVaoUH3/8cZGfzi2swoT3ERFffPFFnHLKKWv3o+/YsWOccMIJ0aJFi5gzZ068/vrr8fzzz8fq1asjJycnBgwYsM5ee/n5+XHGGWesXXq/RYsW0aNHj9hhhx1i0aJFMWzYsBgxYkRERNStWzdGjBhRYssIAgAAAAAAAFB4pTc1ZAMwb968ePfddyPilxn1mYL7iIizzjorPvnkk6hTp04sXbq01ML7wtpll13iwQcfjD59+sTs2bNj9OjRMXr06HWOq169elx//fXrBPcRvyyBeM8998QVV1wRL7/8cvz4449x/fXXr3Ncy5Yt46677hLcAwAAAAAAACRkow7vP/jgg8jLy4uIiK5duxZ4bLdu3TLu9ZeUDh06xKuvvhpPP/10/O9//1u7xFzlypWjRYsW0blz5zj55JOjUaNGGceoWrVq3H777fHBBx/Es88+G59++mnMmTMnatasGS1atIiuXbtGt27d1llOHwAAAAAAAICys1Evm//vf/877r333oiIeOedd6Jhw4YR8cty8rNnz44lS5ZEw4YNBdcAAAAAAAAAJGqjnnk/YcKEiIioVKlSbLHFFjFnzpy4884746WXXooFCxZERESFChWiY8eO0bt37+jQoUOS5QIAAAAAAACwicpNuoDSNH/+/IiIqFGjRowZMyaOOOKIeOKJJ9YG9xERq1evjlGjRsWpp54aDzzwQEKVAgAAAAAAALAp26jD+yVLlkRExIoVK+L888+PBQsWxGmnnRYvvPBCjB07Nt5+++248soro3r16pFKpeLmm2+OF198MeGqAQAAAAAAANjUbNR73h944IExZcqUtf//hhtuiOOPP36d48aMGROnnnpq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K4qKiiotgBYVtY2+ffdKIBXUjvFLY/eLX/wqLr30gmrbAYAN7rnr4qQjAAB5ptktmz9mzJi4+OKLo7S0NOkoAADUg4KCghgypPILNYcMuTwKCprdR2AakYKCgjjjjMqXFT/jjEHGL3nv6aefqFM7AAAANGfNZub93LlzY8SIETF16tSIiGjRokWsX78+4VQAANSHPfboE716fTlmzZqRO7brrl+OPfbonWAqqFk2m42XXnqx0raXXnohvva1QywhSl479tjj45FHHqq2HQCas3Q6HaNGjU86Rl7KZNbEkCGDIyJi5MhRkU4XJpwo/6TT6aQjAFDPmkXx/u67744bbrghN9v+S1/6UpxzzjkxdOjQhJMBAFBfzjvvwrjqqsty++eee2FyYaCWFi4sjunT36y0bfr0N2PhwuLo3n3HBk4FtfenP/2uxvYhQ65ooDQAkH9SqVQUFipK1ySdLvR7AqBZahZrLk6fPj1KS0ujdevW8b3vfS8efvjh2HnnnZOOBQBAPRo9unwBqaaCEuSDrl27RVFRUaVtRUVto2vXbg2cCDbPoEGD69QOAAAAzVmzmHmfTqfjlFNOiYsuuii6d++edBwAAOrZ22+/VW7J/IiImTNnxNtvvxV77NEnoVRQs0WLFkZJSUmlbSUlq2LRooVm3lOlbDYbmUwm0Qy3335zje2XXfajhgnzGel02m0nAAAAyGvNong/bNiwKChoFosMAAA0e2VlZTFy5E2Vto0ceVPcfvtonw3JW926dY/evftWunR+7979ols3FyNTuWw2G8OHXxOzZ89MOkq13n77rRg8+KxEXrtXr11j6NDhCvgAAADkrWZx1tLJWQCA5uPNN1+vZuZySbz55usNnAhqL5VKxc47f77Stp13/ryiI9UyPAAAAKBxaxYz7xtay5YuFgAASMpXvvKVKCpqGyUlqyq0tW3bNr7yla+4uJO8tW7dunj00UmVtj366CNx2mnfiZYtfY2jcj//+f8kvmz+Rt/97hkVjt15590JJPkvy+ZTW5ue12nZssB5njzkz4S68Pc6f3n/pTEzfoGtxVmfraygIBXt27dJOgYAQLP205/+JH784x9Xcvynsf32bRNIBLUzduzYatv/8peJMWjQoAZKQ+NUlHSAiIi47rrr4mc/+1luf8SIEdG16/YJJoLaW7OmRW67ffs2UVhYmGAaKrPp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IpNZU+l20tLpdKRSqaRjAAAAADRJivcAAGxVip9VU/jMb9lsNoYPvyZmz56ZdJRyhgwZnHSEnF69do2hQ4cbxwAAAAD1QPEeaLIUj6qmeJT/jN+qGb/5TfGzegqf+c8fDQAAAABJUbwHmiTFo+opHuU347d6xm/+80dDY5VKpWLo0OF5cfHUBtn//D9//lK5gAoAAACg/ijeA02W88o0ZsYvjZXiZ/UUPvNfKpWKwsLCpGMAAAAA0AylstlstuZu1Nb69WXx8cefJB0DiPxZdnwDxSM2j/FbNeMXAAAAAIDGokOHNtGiRUGt+pp5DzRZZs7RmBm/AAAAAADQvNSuxA8AAAAAAAAA1JtmM/O+rKwsJkyYEBMnToyZM2fG6tWro1OnTrH33nvHaaedFvvuu2/SEQEAAAAAAABopprFPe9XrVoV3//+92PatGmVtqdSqTjnnHPi6quvrvNruec9AAAAAAAAABHueV9ONpuNyy67LFe4P+igg+L000+Pjh07xrvvvhujRo2K4uLiuPPOO6NDhw5xwQUXJJwYAAAAAAAAgOamyc+8nzRpUvzoRz+KiIiTTjopbrjhhnLty5cvjzPOOCPee++9SKfT8de//jV22GGHLX49M+8BAAAAAAAAiNi8mfe169WI3XnnnRERUVRUFFdddVWF9u222y6uvfbaiIjIZDIxbty4Bs0HAAAAAAAAAE26eD9//vx45513IiLi8MMPj+22267Sfvvss0984QtfiIiIxx9/vKHiAQAAAAAAAEBENPHi/auvvprbPuCAA6rtu99++0VERHFxccybN69ecwEAAAAAAADAppp08f69997Lbffo0aPavjvttFNue/bs2fUVCQAAAAAAAAAqaNLF+w8++CC33a1bt2r7du3atdLHAQAAAAAAAEB9a9LF+xUrVuS227RpU23fbbbZJre9atWqessEAAAAAAAAAJ/VMukA9Wnt2rW57cLCwmr7btq+6eM2V0FBKjp0qP5CAQAAAAAAAACavoKCVK37NunifYsWLXLbqVT1v5RsNpvbLijY8gUJUqlUtGhR+z8AAAAAAAAAAGjSy+ZvuhT+mjVrqu2byWRy261bt663TAAAAAAAAADwWU26eL/pfe4//fTTavuuXr06t73tttvWWyYAAAAAAAAA+KwmXbzv3r17bnvRokXV9t20vUuXLvWWCQAAAAAAAAA+q0kX73v27JnbnjdvXrV958+fn9v+0pe+VG+ZAAAAAAAAAOCzmnTxvl+/fpFKpSIi4pVXXqm277Rp0yIiomvXrrHjjjvWezYAAAAAAAAA2KhJF++7du0a/fr1i4iIJ554IkpKSirt98orr8ScOXMiIuLoo49uqHgAAAAAAAAAEBFNvHgfEXHWWWdFRMTy5ctj2LBhUVZWVq59xYoVMWzYsIiIaNWqVZx55pkNnhEAAAAAAACA5i2VzWazSYeob+edd168+OKLERGxzz77xNlnnx1dunSJmTNnxu9///soLi6OiIgrrrgivve97yUZFQAAAAAAAIBmqFkU70tKSuLCCy+Mf/7zn1X2Oeecc+Lqq6+OVCrVgMkAAAAAAAAAoJkU7yMiysrKYuLEiTFp0qSYMWNGrFq1Ktq3bx977bVXnHHGGXHAAQckHREAAAAAAACAZqrZFO8BAAAAAAAAIF8VJB0AAAAAAAAAAJo7xXsAAAAAAAAASFjLpANAdRYvXhzjx4+P5557LhYsWBAREV26dImDDjooTjnllNh1110TTgibZ+XKlXHcccfFhx9+GAMGDIhf/epXSUeCCp577rm44IILatX3oIMOitGjR9dzIth8s2fPjnvvvTdeeuml+OCDD6KsrCy6d+8eBx98cJxzzjnRtWvXpCNCzm233RYjR47c7MedeOKJMWLEiHpIBFvm008/jfvuuy+efPLJmD17dqxevTratWsXu+++e5xwwglx7LHHRosWLZKOCZVatmxZjB8/PqZOnRrz5s2LtWvXRrdu3eKrX/1qnHnmmfHFL34x6YhQzjXXXBP3339/XHjhhXH55ZdX27esrCwmTJgQEydOjJkzZ8bq1aujU6dOsffee8dpp50W++67bwOlhv/anDG80dq1a+Pkk0+OWbNmxZ133hlf/epX6zklVLQ5Y3fp0qVxzz33xIsvvhhz5syJ1atXR1FRUfTs2TOOPPLIOPXUU2ObbbZpoOSwweaMYTW6ZCjek7eeeuqpuOqqq6KkpKTc8Tlz5sScOXPinnvuiQsvvDAuueSShBLC5hs+fHh8+OGHSceAas2YMSPpCFAnv/3tb+P222+PdevWlTv+/vvvx/vvvx8PPvhg/OY3v4lDDz00oYSwdbRq1SrpCJAzd+7cuPDCC2POnDnljn/00UfxwgsvxAsvvBD3339/jBw5MrbddtuEUkLlXnzxxbjiiitixYoV5Y7PnTs35s6dG/fff39ceeWVMWjQoIQSQnlPPvlk3H///bXqu2rVqvj+978f06ZNK3d84cKFsXDhwnj00UfjnHPOiauvvro+okKlNmcMb+rGG2+MWbNm1UMiqJ3NGbtPPfVUXH311bFq1apyx5ctWxbTpk2LadOmxbhx4+L222+P3XbbrT7iQgWbO4bV6JKheE9eev311+Oyyy6L0tLSaNGiRZx66qlxyCGHRFFRUbzzzjsxatSoWLp0aYwcOTLatGkT5557btKRoUZPPfVUTJo0KekYUKN33nknIiI6duwYf/zjH6vtW1RU1BCRoNZGjhwZt912W0REtG/fPs4999zYa6+9Yt26dfH444/H/fffHyUlJXHppZfGww8/bBYdeeG0006Lr3/96zX2W7BgQVx++eVRWloanTp1iosvvrgB0kHNVq9eHeeff37Mnz8/IiL23XffOO2006Jr164xd+7c+NOf/hTvvfdeTJs2LYYMGRLjxo2LVCqVcGrY4NVXX40LL7wwSktLIyJys4i6du0a8+bNi3HjxsVbb70V119/faxcudLJSRL33HPP1XqWcjabjcsuuyxXuD/ooIPi9NNPj44dO8a7774bo0aNiuLi4rjzzjujQ4cOtV6BDepic8bwpm655ZYYN25cPSSC2tmcsTtt2rRcfaNVq1Zx6qmnxmGHHRbbbbddLFq0KCZMmBBTp06N4uLiOPfcc+Phhx+2QiD1bnPGsBpdshTvyUvXXXdd7ovzrbfeWu5k5n777RcDBgyIE044IZYsWRK33XZbnHzyyWZvkNc+/vjjGDZsWNIxoFbefffdiIjYfffdXflLo/Luu+/GHXfcERER3bt3j7Fjx8ZOO+2Uaz/wwANj9913j5/97GexZs2auOWWW+LWW29NKi7kdOrUKTp16lRtn7Vr18ZPfvKTKC0tjYKCgvj1r38dO+ywQwMlhOrddddducL98ccfH//7v/+bK85/5StfiQEDBsT3vve9eOmll2LatGnxxBNPxDe/+c0kI0NERKxbty6uvvrq3PmHiy++OC699NJce9++feOYY46JH/zgB/H444/HHXfcEUceeWTsvvvuSUWmmRszZkz86le/yo3ZmkyePDlexdk+ywAAJZtJREFUfPHFiIg46aST4oYbbsi19evXL4455pg444wz4r333ouRI0fG8ccf7/MF9Wpzx3DEhtvyDBs2LB555JF6TAbV25yxm81m49prr80V7kePHh37779/rr1Pnz5x9NFHx+233x633nprfPzxx/GrX/0qfv3rX9fnj0Azt7nvv2p0ySpIOgB81r/+9a/crM+jjz660llI22+/fZx33nkRsWGWx7PPPtuQEWGzXXvttbF06dLo0KFD0lGgWiUlJTFv3ryICCclaXRuvfXWWLduXaRSqbj55pvLFe43+va3vx29evWKiIhnnnkm1qxZ09AxYYuMHDky9xn53HPPLXfyB5L23HPP5bavvvrqCrPqW7duHVdeeWVu/+mnn26wbFCdZ599NvfZ96tf/Wq5wv1GLVu2jOuvvz622267WL9+fdx4440NHRNytya54YYbcjPgauPOO++MiA0rpl111VUV2rfbbru49tprIyIik8mY1Uy92dIx/Pe//z2+9a1v5Qr3tX0cbC1bMnbfeOONeO+99yJiwyprVX13+/73v587P/HXv/41Vq9evfWCw39syRhWo0ue4j15Z+3atfH1r389dt555/jGN75RZb9ddtklt71o0aKGiAZb5C9/+Us8/vjjUVBQEEOHDk06DlRrxowZkc1mIyLMuqdRWbZsWbzwwgsRseGLRZ8+farse95558Wpp54a5557ri/HNAozZsyI0aNHR0TEzjvvbMlm8s7SpUsjIqJdu3ax/fbbV9rnC1/4Qm57yZIlDZILavL3v/89t3322WdX2a9Nmza51SJefvnl+Oijj+o9G2x09913R//+/WPq1KkREfGlL30pV3Cvzvz583Mn3g8//PDYbrvtKu23zz775N6jH3/88a0TGjaxpWP4Bz/4QZxzzjm5IuhRRx0VgwYNqtessKktHbv//Oc/c9tHHnlklf1SqVR87Wtfi4gNNZF///vfdUwM5W3pGFajS55l88k7e++9d+y999419isuLs5td+7cuT4jwRZbunRpXHfddRERcc4550Tfvn0TTgTV23hyJyJijz32SDAJbJ6XXnopt5xX//79q+07cODAGDhwYAOkgq1j+PDhsW7duoiIGDp0aBQWFiacCMrr3LlzzJ07N1auXBlLliyp9DYQm56MtCQz+WLT8wo1fVfr2bNnRESUlZXFG2+8Ue3JeNiapk+fHqWlpdG6dev47ne/GxdffHG88cYbNT7u1VdfzW0fcMAB1fbdb7/9Ys6cOVFcXBzz5s2LnXfeua6xIWdLx/Drr78eERtmd1555ZUxcODAuO222+o5LfzXlo7dPn36xIUXXhiLFy8udwFrZTZOoInYsAIKbE1bOobV6JKneE+j9PHHH8ef/vSniIjYZptt4vDDD084EVRu2LBhsWzZsvjCF74Ql112mVlG5L2N97tv27ZtrF+/Pm644YZ48cUXY/78+dGyZcv4/Oc/H0ceeWScffbZ0a5du4TTwn/NmDEjt73prPuysrJYsmRJfPLJJ9GlS5do06ZNEvFgiz311FPxyiuvRETE1772tTj00EMTTgQVHXnkkTFt2rSIiPj1r38dI0aMKNe+fv36+NWvfpXbP/bYYxs0H1Rl03t+brPNNtX2bdnyv6fQ5s6dW1+RoIJ0Oh2nnHJKXHTRRdG9e/daP27jbOWIiB49elTbd9PbTc2ePVvxnq1qS8dwx44d4+STT45zzjnH9zgSsaVj94ADDqjxoqmN/vGPf+S2N+c1oDa2dAzXhhpd/VK8p9HIZDKxYMGCePrpp2PcuHGxZMmSSKVScc0110T79u2TjgcVTJw4MZ566qkoKCiIG264IdLpdNKRoEYbZ96XlpZG//79y53QzGQy8c4778Q777wTd911V9x2222x7777JhUVypk9e3ZERLRq1So6d+4cS5cujdtuuy0ee+yxWLFiRURsuD/ivvvuG5dccknss88+ScaFWtt0dlFl92KGfHD66afH008/HdOmTYsJEybEokWL4tRTT42uXbvG/PnzY+zYsfH2229HxIb7fh5yyCEJJ4YNNj2X8MEHH1Rb4Nx0KVAXZdOQhg0bFgUFm3/n0w8++CC33a1bt2r7du3atdLHwdawpWP43nvv3aLHwdaypWO3tp577rncJJpevXpZnYqtbmuPYTW6hqN4T6Mwffr0+Na3vlXu2A477BA///nPXdFDXlq8eHH8z//8T0RsWC5/r732SjgR1Gzt2rXx/vvvR0TEmjVrom3btnHOOefE/vvvH+3atYs5c+bEQw89FNOmTYtly5bFeeedF3/+859jzz33TDg5RCxfvjwiIoqKiuKNN96ICy+8MHdso/Xr18fLL78c//jHP+LKK6+Mc889t+GDwmZ46aWXcqtK7LffftGvX79kA0EV0ul0jBo1KkaPHh133nlnvPzyy/Hyyy+X69OpU6e48sor4/jjj08oJVTUr1+/mDx5ckRE/PWvf40LLrigyr7PPPNMbnv16tX1ng022tKT7hsvYI2IGmctb7ryxKpVq7bo9aAqWzqGFe5JWn2OwY8//jiGDRuW2z/vvPPq7bVovrbmGFaja1j+BaRRWLhwYYVjS5Ysifvuuy/+9a9/JZAIqjd06NBYuXJl9OjRI/7f//t/SceBWpk9e3Zupn2PHj1i4sSJ8cMf/jAOPvjg6Nu3bwwcODDGjx+fO6mZyWTiyiuvjLKysiRjQ0REfPLJJxGxYVxeeOGFsWLFijjrrLPi0UcfjenTp8dzzz0XV199dWyzzTaRzWbjl7/8ZfzlL39JODVU784778xtn3/++QkmgZq999578e6771ZZ1Fy6dGk89thjuQsFIR9885vfjMLCwoiI+P3vf19umfFNjRs3LmbNmpXbX7duXYPkg7pYu3ZtbnvjOK/Kpu2bPg6Are+TTz6Jiy66KLeqz3777ecCV/KeGl3DUrynUejRo0f8/ve/jwceeCBuv/32OPbYY2P9+vUxderUOPPMM+OFF15IOiLkPPDAA/H888/nlsuv6Usy5Isvf/nL8eSTT8add94Zo0ePjh133LHSfldccUVuNYn3338/nn322QZMCZX79NNPI2LDTLjly5fH8OHDY+jQofGlL30pWrduHTvssEN897vfjTvvvDNatWoVEREjRoyITCaTZGyo0vvvv5/7jLvrrru61z157dlnn40zzjgjnnzyydh2223j5z//ebzwwgsxffr0eOKJJ+Liiy+OVq1axTPPPBPf+c53nNwhb3Ts2DG+//3vR0RESUlJfOc734nx48fHhx9+GKWlpfHvf/87fvGLX8T1118fXbp0yT1u42cJyGctWrTIbadSqWr7ZrPZ3LbZzgD1Z9WqVXH++efHG2+8EREbZi7/5je/8d5L3lOja1jeEWgUdt111zjssMOiT58+8fWvfz1uuummuP766yNiw8n6H/7wh1FSUpJwSthwBdqIESMiImLQoEGx9957J5wIaq9Fixax8847x1e/+tUqC/cRG078fPvb387tv/TSSw0RD6q16YVSBx54YJxyyimV9uvXr19uma/Fixcbv+StKVOm5E6kn3TSSQmngap9+OGHcfnll8eaNWuiffv2cd9998Xpp58enTt3jtatW0ePHj3i0ksvjT/+8Y/RqlWrWL58eVxyySUuniJvXHDBBfGd73wnIjYsM/6LX/wiDj744Nhzzz3jmGOOifHjx0f37t3j17/+de4xmy4xDvlq03G6Zs2aavtu+p7cunXressE0Jx9+OGHcdZZZ8Vrr70WERsuIvzTn/4UnTp1SjgZ1EyNrmEp3tNonXzyyXH00UdHxIb73D7xxBMJJ6K5y2az8dOf/jRKSkqiR48ecdlllyUdCerNbrvtltsuLi5OMAlsUFRUlNs+6qijqu17xBFH5LY3Xu0O+ebJJ5+MiA0XTB1zzDEJp4GqTZw4MbdU/qWXXho777xzpf3233//OOOMMyJiwwWvTz/9dINlhOqkUqkYNmxYjBw5Mnr37l1uhnKnTp1i8ODB8cgjj0S7du1yxzt27JhEVNgsm97nfuMqVVXZ9JYn2267bb1lAmiuZsyYEaecckq8++67EbFhxv24cePii1/8YsLJYMup0dWflkkHgLo46qijcm8IG//hg6Tcd999uRmcZ599dsyZM6dCnw8//DC3vXLlyty47dixo6ssaVTcE5F8s+l76A477FBt327duuW2ly1bVm+ZYEvNnTs3Zs+eHRER++yzT7mlmiHfvPXWW7ntI488stq+3/jGN2LMmDERseHiqWOPPbY+o8Fm+cY3vhHf+MY3YuXKlbFkyZJo27ZtdOrUKVfMf//993N9q1ulCvJF9+7dc9uLFi2q9vPExvsuR4TPHQBb2XPPPReXXXZZ7kKpXXbZJf74xz+We5+GxkqNrn4o3pN3Vq1aFfPmzYsFCxbEUUcdVe19ubbbbrvcdmlpaQOkg6ptOnvzuuuuq7H/c889F88991xERAwZMiQuueSS+ooGtfLOO+/EggUL4qOPPoqBAwfG5z73uSr7fvTRR7ltM4/IB7vuumv89a9/jYgNS95WZ9MLTjadRQf5YtMZyWbdk+82na3Ztm3bavtuv/32ue1Vq1bVWyaoi3bt2lX6+eD111/Pbe++++4NGQm2SM+ePXPb8+bNi379+lXZd/78+bntL33pS/UZC6BZmTBhQgwdOjTWrVsXERF777133HHHHeXqGpBv1OiSp3hP3rnuuuti0qRJEbFhCcZNl2b+rHnz5uW2a5plB0D1Ro0aFX/5y18iIqJHjx5x4IEHVtn31VdfzW336dOn3rNBTTY9Gfnqq6/GiSeeWGXfjTOaI8ycIz/985//zG3vv//+CSaBmrVv3z63PW/evPjyl79cZd/Fixfntjct5ENS5s+fHw899FB89NFHcfLJJ1dZ3Mxms7kLq3beeefYaaedGjAlbJl+/fpFKpWKbDYbr7zyShx//PFV9p02bVpERHTt2tXnY4Ct5OGHH46f/OQnkc1mI2LDhdn/+7//G61bt044GVRPjS557nlP3tl3331z2w8++GCV/crKysq1H3TQQfWaC2oyYsSImDlzZrX/bTqTbsCAAbnjZt2TDw444IDc9sSJE6vs9+mnn8a9994bERGtWrWq8f7i0BAOPPDA3NL5jz32WCxdurTKvhMmTIiIiBYtWsQRRxzRIPlgc2xczadt27bugUje22+//XLbjzzySLV9J0+enNve9HsfJKW0tDTuuOOOuP/++6v9/PuXv/wliouLIyJi4MCBDRMO6qhr1665C1KeeOKJKCkpqbTfK6+8krvt38b71gJQN//85z9j6NChucL9mWeeGTfddJPCPY2CGl3yFO/JO8cee2xu9sZ9990Xf//73yv0yWazcf3118fbb78dERFf+9rXonfv3g2aE6CpOfbYY3NLHU2aNCmeeuqpCn1KS0vjqquuyp28/M53vlPuXuOQlBYtWsR5550XERElJSXxwx/+MD755JMK/caOHZv7bPGNb3wjOnfu3KA5oSaLFy+OZcuWRURE7969q12eDvLBcccdFx06dIiIDe+xU6dOrbTf5MmT46GHHoqIDff5/NrXvtZgGaEqu+yyS/Tq1SsiNsyO23R1no1mzpwZ1157bURsWDHizDPPbNCMUBdnnXVWREQsX748hg0bFmVlZeXaV6xYEcOGDYuIDRdmG98AdVdSUhI/+tGPYv369RERcfLJJ8c111zjux2Nhhpd8iybT94pKiqKa6+9Ni677LIoLS2Nc889N0455ZQ49NBDo2PHjjFnzpy49957c/eb22GHHeL6669PODVA49e2bdsYNmxYXHHFFVFWVhaXXnppnHLKKXHUUUdFUVFRzJo1K8aNGxezZs2KiA3L5V9++eUJp4b/GjRoUDz77LPx8ssvx9///vc48cQTY9CgQbHbbrvFqlWrYtKkSTFlypSIiOjQoUP87Gc/SzgxVDR37tzc9s4775xcEKiloqKi+J//+Z+4+OKLY/369XHRRRfFcccdF8ccc0x07tw5Pvzww3jsscfi0UcfjWw2G4WFhTFixIho2dLpCPLDD37wg/je974XmUwmzjzzzBg8eHD07ds31q1bFy+++GLcfffd8emnn0aLFi3ihhtuiG233TbpyFBrxx13XDz88MPx4osvxpQpU+KDDz6Is88+O7p06RIzZ86M3//+97kLsy+55BK3hADYCu66665YtGhRRER06tQpTj311Hj33XdrfFzXrl3L3T8ckqJGlzzflslLRx99dNx4441xzTXXxOrVq+O+++6L++67r0K/PffcM2655Rb30gDYSo499thYu3Zt/PznP88tj79xifxNHXTQQXHTTTfF5z73uQRSQuUKCgri97//fVx11VXx+OOPx//93//FddddV6Ffjx494vbbb3e/ZfLSxpM8ERtO3kBjcMQRR8Stt94aV199dZSUlMSUKVNyF0ttqlOnTnHTTTdF3759E0gJlTvssMPiJz/5Sfzyl7+M5cuXx4033lihT9u2bWPEiBFx6KGHJpAQ6uaWW26JCy+8MP75z3/GK6+8Eq+88kqFPuecc05ccMEFCaQDaHo2PY+2ZMmS+Pa3v12rx91www1x0kkn1Vcs2CxqdMlSvCdv9e/fP/bdd9+4++674/nnn4958+bF2rVro3379tGnT5847rjj4pvf/GYUFLj7A8DWNHDgwNh///3j7rvvjhdffDH3/tuxY8fo06dPnHDCCXHkkUcmHRMqVVhYGLfccku89NJL8dBDD8Vrr70WS5cujbZt28bnP//56N+/fwwcODDatGmTdFSo1Ka3e/Dll8bkG9/4RnzlK1+Je+65J55//vmYM2dOfPLJJ9G2bdvo2bNnHHHEEXHqqad6/yUvDRo0KPbZZ58YN25cTJs2LZYsWRKtWrWKHj16xGGHHRZnnnmmi/5otIqKimLcuHExceLEmDRpUsyYMSNWrVoV7du3j7322ivOOOOMOOCAA5KOCdAkfPzxx+UuyIbGTI0uOalsNptNOgQAAAAAAAAANGcuhwAAAAAAAACAhCneAwAAAAAAAEDCFO8BAAAAAAAAIGGK9wAAAAAAAACQMMV7AAAAAAAAAEiY4j0AAAAAAAAAJEzxHgAAAAAAAAASpngPAAAAAAAAAAlTvAcAAAAAAACAhLVMOgAAAABQs+Li4njvvfdi4cKFUVJSEqWlpbHNNttE586dY5dddolevXpFQYFr9AEAAKCxUrwHAACAPPXOO+/EAw88EFOnTo1FixZV27dt27Zx+OGHx6mnnhr77rtvAyXMH0cccUQUFxdHRMR+++0X48ePTzgRAAAAbB7FewAAAMgz77//fvziF7+Il156qdaPWbVqVUyaNCkmTZoU+++/f/z85z+PXXbZpR5TAgAAAFuT4j0AAADkkbvuuit++ctfxtq1a8sdT6VSseeee8bOO+8cHTp0iM997nOxdOnS+L//+7944403Yv369bm+//jHP+Jb3/pW3HLLLXHwwQc39I8AAAAAbAHFewAAAMgTN998c9xxxx3ljnXq1Ckuuuii+OY3vxnbb799pY/7+OOPY8KECXHHHXfEqlWrIiLik08+iSFDhsRdd90VvXv3rvfsAAAAQN0UJB0AAAAAiFzxfVMnnXRSPPHEE3HGGWdUWbiPiOjQoUOcd9558cQTT0Tfvn1zx9esWRM/+tGPorS0tN5yAwAAAFuH4j0AAAAkbP78+TFs2LByx7773e/GDTfcEG3atKn182y//fbxxz/+sdy97ufMmRMPPvjgVssKAAAA1A/FewAAAEjYjTfeGJlMJre///77x5VXXrlFz9WuXbv4+c9/Xu7YXXfdVZd4AAAAQANQvAcAAIAEvf/++/HEE0/k9lu2bBm/+MUvoqBgy7+y77///tGvX7/c/nvvvRezZs2qS0wAAACgnrVMOgAAAAA0Z/fee2+5/eOPPz523nnnOj/vCSecEG+88UZ07949Dj300Ein0xX6nHXWWTFt2rSIiLjwwgvj8ssvj+XLl8fIkSPjr3/9a6xcuTK6dOkSffr0ieOOOy4OO+ywCs+RzWbjb3/7W7z88svx6quvxuLFi2PFihXx6aefRjqdjo4dO0bPnj3ja1/7WpxwwglRVFS0WT/HK6+8Eo888ki8+uqrsWjRoshms9GlS5fYZ5994pRTTil3kcLmWr9+fTz99NPx7LPPxhtvvBEfffRRfPLJJ9GhQ4fo3r17HHTQQdG/f//4/Oc/v8WvAQAAALWVymaz2aRDAAAAQHN18MEHx4cffpjbHz9+fOy33351ft4VK1bE4sWLo1evXlX2+Wzx/vzzz4/TTjst3nvvvQp9DzjggBg7dmy5Y08++WTcdNNN8f7779cq07bbbhtXXHFFnHbaaTX2Xbx4cQwdOjSef/75avudeuqp8dOf/jSOPfbYKC4ujoiI/fbbL8aPH1/t41544YW44YYbaszesmXLOPXUU+NHP/pRbLPNNjXmBgAAgC1l5j0AAAAkZMaMGeUK9+3atYt99tlnqzz3tttuG9tuu+1mPeYXv/hFpYX7iIijjjqq3P4dd9wRN99882Y9/4oVK2LYsGFRWloaZ511VpX95syZE2eddVYsWbKkxue8//77Y8mSJbFu3bpa57jzzjvjf//3f6OsrKzGvuvWrYs///nP8eabb8bvfve76Ny5c61fBwAAADaH4j0AAAAk5K233iq3369fvzrd674u3njjjXj55ZcrbUulUvH1r389t//888+XK9y3bt06vvOd78Q3v/nN2GWXXaKoqCjWrFkT8+fPj7/97W8xZsyYchcp/OY3v4kTTjgh2rVrV+G1Pv3007jwwgvLFe47d+4cF110URx++OGx/fbbx9KlS+O5556LO+64IxYvXhxTp06t9c/54IMPxogRI8odO/LII+Pb3/529O7dO4qKimLp0qXxt7/9Lf74xz/G3LlzIyLi7bffjosuuijuueeeaN26da1fDwAAAGpL8R4AAAAS8tkl23fZZZeEkkSucL/99tvHD3/4wzjssMMilUrF9OnTY9q0adGlS5dc3+uvvz633aJFi/jDH/4QBx54YLnna9OmTXz5y1+OL3/5y3HyySfHaaedFnPmzImIiNWrV8czzzwTAwcOrJDjd7/7Xa5gHhHRu3fvGD16dLlVBLp16xann3569O/fPwYPHhyvv/56rX7GuXPnxvDhw3P7LVu2jF/+8pfRv3//cv26desWp5xySpxwwglx9dVXx6OPPhoREf/617/i5ptvjiuvvLJWrwcAAACbI5nL+QEAAID44IMPyu137do1oSQbFBYWxtixY+Okk06KDh06RPv27eOQQw6JH/7wh7k+77zzTq4IHxHxrW99q0Lh/rO22267+N73vlfu2MyZMyv0+/TTT+Ouu+7K7bdr1y5uv/32Kpf/b9u2bfzud7+Ljh071urnGzVqVKxZsya3/5Of/KRC4X5TrVu3jhtvvDH22muv3LE///nPsXz58lq9HgAAAGwOxXsAAABIyCeffFJuv02bNgkl2eCkk06Knj17VtuntLQ0Tj311DjwwANjp512ilNPPbVWz7377ruX21+5cmWFPlOnTo2SkpLc/hlnnFFuxn9ltttuu7joootqfP2VK1fGpEmTcvtf/OIX4/TTT6/xcS1atIghQ4bk9j/99NOYMGFCjY8DAACAzWXZfAAAAEjI+vXry+1ns9laP/ass86KadOm1bp/9+7d45lnnqm2zyGHHFLj8/Tt2zf69u1b69fd6LMXJqxbt65Cn5deeqnc/jHHHFOr5x4wYEBcf/31FX6fm3r11Vdj7dq1uf1jjz02CgpqN6fhgAMOiG222SZWr14dERH/+Mc/4rvf/W6tHgsAAAC1pXgPAAAACflsQXtjcTgp/fr126rPt2TJkpg5c2a8+eab8fzzz5drKysrq9D/nXfeyW0XFhbGl770pVq9zrbbbhuf//zn49///neVfV577bVy+7vttlutnjsiomXLlvHFL34xpk+fHhERb7zxRq0fCwAAALWleA8AAAAJ6dChQ7n9pUuXJpRkw/3d27dvv9mPy2az8e6778bbb78dc+fOjfnz58eCBQtiwYIFsWLFimof91nFxcW57a5du0aLFi1qnWOXXXaptnj/wQcflNv//ve/X+vn/qxly5bFunXromVLp1UAAADYenzLBAAAgITssssu5fbnzZtX68eOHz++xj677rprrZ9v2223rXXfiA2rBIwZMybuv//+WLRoUY39W7ZsWelS+Zv65JNPcttFRUWbladt27bVtq9cuXKznq8mK1asiO23336rPicAAADNm+I9AAAAJGSPPfYot5/kcuytW7eudd/3338/vve978X8+fOr7FNYWBg9e/aMPn36xH777Rdf+MIX4vjjj98aUStVU/6aLhzYXGvWrNmqzwcAAACK9wAAAJCQfv36RVFRUZSUlERExOLFi2P27NnRs2fPhJNVbfny5XHuueeWW4Z+m222iYMPPjj69esXPXv2jC984QvRrVu3KCgoyPWpzaoCbdq0ieXLl0dExKpVqzYr16az9ivTrl27cvt/+9vfomPHjpv1GgAAAFCfCmruAgAAANSHVq1axZFHHlnu2EMPPZRQmtq54447yhXu99tvv3jyySfj1ltvjXPPPTcOPvjg2HHHHcsV7iMid4FCdXbaaafcdnFxcaxdu7bWuT57T/vP+uwS95tziwIAAABoCIr3AAAAkKAzzzyz3P59990XH374YUJpajZp0qTcdmFhYdxyyy21msE+d+7ccvvZbLZCnz333DO3XVpaGu+8806tMq1bt67Gvr179y63//e//71Wz73Rv//97/j444836zEAAACwORTvAQAAIEF9+vSJQw89NLe/evXquO666xJMVLXly5eXK2D37NkzOnToUKvH/vWvfy23X1ZWVqHPIYccUm7/4YcfrtVzT506NVavXl1tn/322y9SqVRuf8KECbFu3bpaPf/ixYvj+OOPjwMPPDD69u1b4YILAAAA2BoU7wEAACBh11xzTRQWFub2n3zyyfjVr361xc+XzWbjD3/4w9aIVuF5N7Vs2bJaPe7pp5+Oxx57rNyx0tLSCv0OOeSQ6NKlS27/4YcfjhkzZlT73GvXro1bb721xgxdu3Ytd5HE/PnzY/To0TU+LiLixhtvzOVds2ZN7L777rV6HAAAAGwOxXsAAABI2E477RQ33HBDuZnho0aNih/84AexfPnyzXquWbNmxaBBg+LXv/71Vk4Zsd1225VbIn/BggUxefLkah/zyCOPxA9/+MMKx9esWVPhWMuWLeOSSy7J7ZeWlsZFF11UYcn9TduvvPLKmDVrVq3yX3jhhVFQ8N9TITfffHP8+c9/rvYxf/jDH8r9jIWFhXHeeefV6vUAAABgcyjeAwAAQB449thj45prrilXXJ4yZUocffTRcdttt0VxcXGVj12/fn387W9/i0suuSSOP/74+Mc//lGuvaCgIAYMGFDnjKlUqsLz/PjHP44bb7wxZsyYEZlMJlavXh3//ve/Y8KECXHmmWfGlVdeWemS9iUlJZW+xre+9a1yy+cvXLgwTjzxxBg5cmTMmTMn1q5dGx999FE8+uijceKJJ+Zm9Lds2bLG/HvttVdcfPHFuf2ysrK49tprY9CgQfHEE0/E0qVLY+3atbFgwYJ48skn4/TTT69wEcSVV15ZbnUAAAAA2FpS2c+ueQcAAAAk5plnnomf/OQnlS5J/8UvfjF222236Ny5c6TT6SgpKYm5c+fGm2++GStXrqz0+fbcc8+45pprol+/fhXazjrrrJg2bVpERHTv3j2eeeaZGvOtWLEivvWtb8W8efM26+faZZddIpvNxpw5cyIiomPHjvG3v/2t0r4lJSVx/vnnx+uvv16r595rr72ie/fuMWXKlIjYcH/78ePHV9o3m83GiBEjYsyYMZuVPyLiggsuiB/84Aeb/TgAAACoDTPvAQAAII8cccQR8dhjj8W3v/3taN26dbm2999/P6ZMmRJ/+tOf4o477ojx48fHCy+8UGnhfo899oibb745HnzwwUoL91tq2223jTFjxkSfPn1q1b9Vq1YxaNCgeOihh+KrX/1q7vjSpUvjvffeq/QxRUVFMW7cuBg0aFCNM+oPOeSQ+O1vfxutWrWqVZ5UKhU//vGP4ze/+U107969Vo/p1KlT/OY3v1G4BwAAoF6ZeQ8AAAB5aunSpfHggw/G008/HdOnT4+avsL36NEjDj300Ojfv3+tiutbMvN+o/Xr18fTTz8djz32WEyfPj0++uijWLt2bbRp0yY6dOgQPXv2jH79+sVxxx0XO+ywQ0REvPzyyzFo0KByrz906NBqX+f//u//4oEHHoiXXnop5s6dG2vXro3OnTvH7rvvHgMHDowjjzwyUqlUXH311TFhwoSIqH7m/aZKS0vjySefjBdffDHefPPNWLp0aZSUlERhYWF07Ngx9txzzzj00EPjqKOOisLCwlr/bgAAAGBLKN4DAABAI7By5cqYNWtWzJ07N1atWhWrV6+OVq1aRfv27WPHHXeMXXfdNTp06JB0TAAAAGALKd4DAAAAAAAAQMLc8x4AAAAAAAAAEqZ4DwAAAAAAAAAJU7wHAAAAAAAAgIQp3gMAAAAAAABAwhTvAQAAAAAAACBhivcAAAAAAAAAkDDFewAAAAAAAABImOI9AAAAAAAAACRM8R4AAAAAAAAAEqZ4DwAAAAAAAAAJU7wHAAAAAAAAgIQp3gMAAAAAAABAwhTvAQAAAAAAACBhivcAAAAAAAAAkDDFewAAAAAAAABImOI9AAAAAAAAACTs/wMxt5C+XsAjYwAAAABJRU5ErkJggg==", "text/plain": [ - "
" + "
" ] }, "metadata": {}, @@ -572,10 +1696,21 @@ } ], "source": [ - "#visual of the clean_df in a heatmap to look at correlations\n", - "plt.figure(figsize=(20,20))\n", - "sns.heatmap(df.corr().abs(), annot=True)\n", - "plt.show()" + "#grade\n", + "plt.figure(figsize=(25,15))\n", + "sns.set(font_scale=2)\n", + "ax = sns.boxplot(x=\"grade\", y=\"price\", data=df)\n", + "ax.set_title('House Grade vs. Price', fontsize=50)\n", + "ax.set_ylabel('Price', fontsize=30)\n", + "ax.set_xlabel('Grade', fontsize=30)\n", + "ax.set_ylim(bottom=0, top=6000000);" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "When we look at grade, we can see that as the categorical building grade designation improves, the house price does indeed rise as well. " ] } ], From 56175458cde6fe9fd8e82672efce97783115b1fa Mon Sep 17 00:00:00 2001 From: clydeochieng <107258512+clydeochieng@users.noreply.github.com> Date: Tue, 30 Apr 2024 18:53:40 +0300 Subject: [PATCH 12/42] Update student.ipynb --- student.ipynb | 1925 ++++++++++++++++--------------------------------- 1 file changed, 622 insertions(+), 1303 deletions(-) diff --git a/student.ipynb b/student.ipynb index 1beeaa73..03ba5c12 100644 --- a/student.ipynb +++ b/student.ipynb @@ -7,7 +7,7 @@ "## Final Project Submission\n", "\n", "Please fill out:\n", - "* Student name: Solphine Joseph, Grace Rotich, Mathew Kiprotich, Hilary Simiyu, Clyde Ochieng.\n", + "* Student name: Solphine Joseph, Grace Rotich, Mathew Kiprotich, Hilary Simiyu, Derrick Kiprotich, Clyde Ochieng. \n", "* Student pace: full time\n", "* Scheduled project review date/time: \n", "* Instructor name: Nikita \n", @@ -54,18 +54,19 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "### Data Understanding:\n", + "### Hypothesis\n", + "* Null Hypothesis - There is no relationship between our independent variables and our dependent variable \n", "\n", - "The real estate agency in Kingsway is analyzing a dataset to determine the factors affecting house prices. The dataset likely includes features such as property size, location, age, and market trends. Key steps include assessing data quality, exploring relationships between features and prices, and preprocessing data for multilinear regression analysis. Multilinear regression will be used to model how these features collectively influence house prices, with evaluation metrics used to assess predictive accuracy." + "* Alternative Hypothesis - There is a relationship between our independent variables and our dependent variable" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "The dataset utilized in this analysis is the King County Housing dataset, encompassing details on over 21,000 homes within King County. Each entry in the dataset includes information on various features such as bedroom/bathroom/floor counts, living space and lot square footage, zip code, building grade, condition, and more.\n", + "### Data Understanding:\n", "\n", - "The King County Housing Dataset comprises multiple features contributing to the final sale price of homes in King County. Descriptions of these features are provided below." + "In this project, we utilized the King County House Sales dataset, which serves as the foundational dataset for our analysis. It was sourced Kaggle.The dataset encompasses comprehensive information regarding house sales within King County, Washington, USA. It comprises a diverse array of features, including the number of bedrooms, bathrooms, square footage, as well as geographical and pricing details of the properties sold. This dataset is frequently employed in data science and machine learning endeavors, particularly for predictive modeling tasks such as regression analysis aimed at forecasting house prices based on the provided features." ] }, { @@ -74,1139 +75,110 @@ "source": [ "##### King County Housing Data Columns \n", "\n", - "* `id` - Unique identifier for a house\n", - "* `date` - Date house was sold\n", - "* `price` - Sale price (prediction target)\n", - "* `bedrooms` - Number of bedrooms\n", - "* `bathrooms` - Number of bathrooms\n", - "* `sqft_living` - Square footage of living space in the home\n", - "* `sqft_lot` - Square footage of the lot\n", - "* `floors` - Number of floors (levels) in house\n", - "* `waterfront` - Whether the house is on a waterfront\n", - "* `view` - Quality of view from house\n", - "* `condition` - How good the overall condition of the house is. \n", - "* `grade` - Overall grade of the house. \n", - "* `sqft_above` - Square footage of house apart from basement \n", - "* `sqft_basement` - Square footage of the basement – (Ignored)\n", - "* `yr_built` - Year when house was built\n", - "* `yr_renovated` - Year when house was renovated – (Ignored)\n", - "* `zipcode` - ZIP Code used by the United States Postal Service \n", - "* `lat` - Latitude coordinate\n", - "* `long` - Longitude coordinate\n", - "* `sqft_living15` - The square footage of interior housing living space for the nearest 15 neighbors\n", - "* `sqft_lot15` - The square footage of the land lots of the nearest 15 neighbors" + "The column names contained in column_names.md are:\n", + "* `id`: A unique identifier for each house sale.\n", + "* `date`: The date when the house was sold.\n", + "* `price`: The sale price of the house, serving as the target variable for predictive modeling.\n", + "* `bedrooms`, `bathrooms`, `sqft_living`, `sqft_lot`: Numerical features representing the number of bedrooms and bathrooms, as well as the living area and lot area of the house, respectively.\n", + "* `floors`: The number of floors in the house.\n", + "* `waterfront`, `view`, `condition`, `grade`: Categorical features describing aspects such as waterfront availability, property view, condition, and overall grade assigned to the housing unit.\n", + "* `yr_built`, `yr_renovated`: Year of construction and renovation of the house.\n", + "* `zipcode`, `lat`, `long`: Geographical features including ZIP code, latitude, and longitude coordinates.\n", + "* `sqft_above`, `sqft_basement`, `sqft_living15`, `sqft_lot15`: Additional numerical features providing details about the house's above-ground and basement square footage, as well as living area and lot area of the nearest 15 neighboring houses." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "### Data Preparation\n", + "## Data Loading\n", "\n", - "Importing data." + "#### Import Necessary Libraries" ] }, { "cell_type": "code", - "execution_count": 98, + "execution_count": 15, "metadata": {}, "outputs": [], "source": [ - "#importing libraries \n", - "import pandas as pd\n", + "import matplotlib.pyplot as plt\n", + "%matplotlib inline\n", "import numpy as np\n", - "from matplotlib import pyplot as plt\n", + "import pandas as pd\n", + "import scipy.stats as stats\n", "import seaborn as sns\n", - "from sklearn.preprocessing import OneHotEncoder, StandardScaler\n", - "from sklearn.linear_model import LinearRegression\n", - "import statsmodels.api as sm\n", - "from statsmodels.formula.api import ols\n", - "from scipy import stats\n", - "import warnings\n", - "warnings.filterwarnings('ignore')" - ] - }, - { - "cell_type": "code", - "execution_count": 99, - "metadata": {}, - "outputs": [], - "source": [ - "df = pd.read_csv('data/kc_house_data.csv')" - ] - }, - { - "cell_type": "code", - "execution_count": 100, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "(21597, 21)" - ] - }, - "execution_count": 100, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "df.shape" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The dataset contains 21,597 houses with 21 features." - ] - }, - { - "cell_type": "code", - "execution_count": 101, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n", - "RangeIndex: 21597 entries, 0 to 21596\n", - "Data columns (total 21 columns):\n", - " # Column Non-Null Count Dtype \n", - "--- ------ -------------- ----- \n", - " 0 id 21597 non-null int64 \n", - " 1 date 21597 non-null object \n", - " 2 price 21597 non-null float64\n", - " 3 bedrooms 21597 non-null int64 \n", - " 4 bathrooms 21597 non-null float64\n", - " 5 sqft_living 21597 non-null int64 \n", - " 6 sqft_lot 21597 non-null int64 \n", - " 7 floors 21597 non-null float64\n", - " 8 waterfront 19221 non-null object \n", - " 9 view 21534 non-null object \n", - " 10 condition 21597 non-null object \n", - " 11 grade 21597 non-null object \n", - " 12 sqft_above 21597 non-null int64 \n", - " 13 sqft_basement 21597 non-null object \n", - " 14 yr_built 21597 non-null int64 \n", - " 15 yr_renovated 17755 non-null float64\n", - " 16 zipcode 21597 non-null int64 \n", - " 17 lat 21597 non-null float64\n", - " 18 long 21597 non-null float64\n", - " 19 sqft_living15 21597 non-null int64 \n", - " 20 sqft_lot15 21597 non-null int64 \n", - "dtypes: float64(6), int64(9), object(6)\n", - "memory usage: 3.5+ MB\n" - ] - } - ], - "source": [ - "df.info()" - ] - }, - { - "cell_type": "code", - "execution_count": 102, - "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", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
idpricebedroomsbathroomssqft_livingsqft_lotfloorssqft_aboveyr_builtyr_renovatedzipcodelatlongsqft_living15sqft_lot15
count21597.0000021597.0000021597.0000021597.0000021597.0000021597.0000021597.0000021597.0000021597.0000017755.0000021597.0000021597.0000021597.0000021597.0000021597.00000
mean4580474287.77099540296.573513.373202.115832080.3218515099.408761.494101788.596841970.9996883.6367898077.9518547.56009-122.213981986.6203212758.28351
std2876735715.74778367368.140100.926300.76898918.1061341412.636880.53968827.7597629.37523399.9464153.513070.138550.14072685.2304727274.44195
min1000102.0000078000.000001.000000.50000370.00000520.000001.00000370.000001900.000000.0000098001.0000047.15590-122.51900399.00000651.00000
25%2123049175.00000322000.000003.000001.750001430.000005040.000001.000001190.000001951.000000.0000098033.0000047.47110-122.328001490.000005100.00000
50%3904930410.00000450000.000003.000002.250001910.000007618.000001.500001560.000001975.000000.0000098065.0000047.57180-122.231001840.000007620.00000
75%7308900490.00000645000.000004.000002.500002550.0000010685.000002.000002210.000001997.000000.0000098118.0000047.67800-122.125002360.0000010083.00000
max9900000190.000007700000.0000033.000008.0000013540.000001651359.000003.500009410.000002015.000002015.0000098199.0000047.77760-121.315006210.00000871200.00000
\n", - "
" - ], - "text/plain": [ - " id price bedrooms bathrooms sqft_living \\\n", - "count 21597.00000 21597.00000 21597.00000 21597.00000 21597.00000 \n", - "mean 4580474287.77099 540296.57351 3.37320 2.11583 2080.32185 \n", - "std 2876735715.74778 367368.14010 0.92630 0.76898 918.10613 \n", - "min 1000102.00000 78000.00000 1.00000 0.50000 370.00000 \n", - "25% 2123049175.00000 322000.00000 3.00000 1.75000 1430.00000 \n", - "50% 3904930410.00000 450000.00000 3.00000 2.25000 1910.00000 \n", - "75% 7308900490.00000 645000.00000 4.00000 2.50000 2550.00000 \n", - "max 9900000190.00000 7700000.00000 33.00000 8.00000 13540.00000 \n", - "\n", - " sqft_lot floors sqft_above yr_built yr_renovated \\\n", - "count 21597.00000 21597.00000 21597.00000 21597.00000 17755.00000 \n", - "mean 15099.40876 1.49410 1788.59684 1970.99968 83.63678 \n", - "std 41412.63688 0.53968 827.75976 29.37523 399.94641 \n", - "min 520.00000 1.00000 370.00000 1900.00000 0.00000 \n", - "25% 5040.00000 1.00000 1190.00000 1951.00000 0.00000 \n", - "50% 7618.00000 1.50000 1560.00000 1975.00000 0.00000 \n", - "75% 10685.00000 2.00000 2210.00000 1997.00000 0.00000 \n", - "max 1651359.00000 3.50000 9410.00000 2015.00000 2015.00000 \n", - "\n", - " zipcode lat long sqft_living15 sqft_lot15 \n", - "count 21597.00000 21597.00000 21597.00000 21597.00000 21597.00000 \n", - "mean 98077.95185 47.56009 -122.21398 1986.62032 12758.28351 \n", - "std 53.51307 0.13855 0.14072 685.23047 27274.44195 \n", - "min 98001.00000 47.15590 -122.51900 399.00000 651.00000 \n", - "25% 98033.00000 47.47110 -122.32800 1490.00000 5100.00000 \n", - "50% 98065.00000 47.57180 -122.23100 1840.00000 7620.00000 \n", - "75% 98118.00000 47.67800 -122.12500 2360.00000 10083.00000 \n", - "max 98199.00000 47.77760 -121.31500 6210.00000 871200.00000 " - ] - }, - "execution_count": 102, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "df.describe()" - ] - }, - { - "cell_type": "code", - "execution_count": 103, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "count 21597.00000\n", - "mean 540296.57351\n", - "std 367368.14010\n", - "min 78000.00000\n", - "25% 322000.00000\n", - "50% 450000.00000\n", - "75% 645000.00000\n", - "max 7700000.00000\n", - "Name: price, dtype: float64" - ] - }, - "execution_count": 103, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# descriptive statistics for our target price.\n", - "df['price'].describe()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The average price of homes in the data set is 540,297 dollars. \n", - "The prices ranges from 78,000 to 8,000,000 dollars and\n", - "the median house price is 450,000 dollars" - ] - }, - { - "cell_type": "code", - "execution_count": 104, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "count 21597.00000\n", - "mean 2080.32185\n", - "std 918.10613\n", - "min 370.00000\n", - "25% 1430.00000\n", - "50% 1910.00000\n", - "75% 2550.00000\n", - "max 13540.00000\n", - "Name: sqft_living, dtype: float64" - ] - }, - "execution_count": 104, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# descriptive statistics for square footage\n", - "df['sqft_living'].describe()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The mean square-feet of living space is 2,080 sq-ft and the range of living space ranges from 370 sq-ft to 13,540 sq-ft. The median sq footage is 1,910." - ] - }, - { - "cell_type": "code", - "execution_count": 105, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "bedrooms\n", - "3 9824\n", - "4 6882\n", - "2 2760\n", - "5 1601\n", - "6 272\n", - "1 196\n", - "7 38\n", - "8 13\n", - "9 6\n", - "10 3\n", - "11 1\n", - "33 1\n", - "Name: count, dtype: int64" - ] - }, - "execution_count": 105, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "df['bedrooms'].value_counts()" + "import statsmodels.api as sm\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "The bedroom counts range from 1 bedroom to 33" - ] - }, - { - "cell_type": "code", - "execution_count": 106, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "bathrooms\n", - "2.50000 5377\n", - "1.00000 3851\n", - "1.75000 3048\n", - "2.25000 2047\n", - "2.00000 1930\n", - "1.50000 1445\n", - "2.75000 1185\n", - "3.00000 753\n", - "3.50000 731\n", - "3.25000 589\n", - "3.75000 155\n", - "4.00000 136\n", - "4.50000 100\n", - "4.25000 79\n", - "0.75000 71\n", - "4.75000 23\n", - "5.00000 21\n", - "5.25000 13\n", - "5.50000 10\n", - "1.25000 9\n", - "6.00000 6\n", - "0.50000 4\n", - "5.75000 4\n", - "6.75000 2\n", - "8.00000 2\n", - "6.25000 2\n", - "6.50000 2\n", - "7.50000 1\n", - "7.75000 1\n", - "Name: count, dtype: int64" - ] - }, - "execution_count": 106, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "df['bathrooms'].value_counts()" - ] - }, - { - "cell_type": "code", - "execution_count": 107, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "floors\n", - "1.00000 10673\n", - "2.00000 8235\n", - "1.50000 1910\n", - "3.00000 611\n", - "2.50000 161\n", - "3.50000 7\n", - "Name: count, dtype: int64" - ] - }, - "execution_count": 107, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "df['floors'].value_counts()" - ] - }, - { - "cell_type": "code", - "execution_count": 108, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "sqft_lot\n", - "5000 358\n", - "6000 290\n", - "4000 251\n", - "7200 220\n", - "4800 119\n", - " ... \n", - "22605 1\n", - "25248 1\n", - "9934 1\n", - "9142 1\n", - "1076 1\n", - "Name: count, Length: 9776, dtype: int64" - ] - }, - "execution_count": 108, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "df['sqft_lot'].value_counts()" - ] - }, - { - "cell_type": "code", - "execution_count": 109, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "count 21597.00000\n", - "mean 15099.40876\n", - "std 41412.63688\n", - "min 520.00000\n", - "25% 5040.00000\n", - "50% 7618.00000\n", - "75% 10685.00000\n", - "max 1651359.00000\n", - "Name: sqft_lot, dtype: float64" - ] - }, - "execution_count": 109, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "df['sqft_lot'].describe()" - ] - }, - { - "cell_type": "code", - "execution_count": 110, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "yr_built\n", - "2014 559\n", - "2006 453\n", - "2005 450\n", - "2004 433\n", - "2003 420\n", - " ... \n", - "1933 30\n", - "1901 29\n", - "1902 27\n", - "1935 24\n", - "1934 21\n", - "Name: count, Length: 116, dtype: int64" - ] - }, - "execution_count": 110, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "df['yr_built'].value_counts()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The year built ranges from 1934 to 2014." - ] - }, - { - "cell_type": "code", - "execution_count": 111, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "condition\n", - "Average 14020\n", - "Good 5677\n", - "Very Good 1701\n", - "Fair 170\n", - "Poor 29\n", - "Name: count, dtype: int64" - ] - }, - "execution_count": 111, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "df['condition'].value_counts()" - ] - }, - { - "cell_type": "code", - "execution_count": 112, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "waterfront\n", - "NO 19075\n", - "YES 146\n", - "Name: count, dtype: int64" - ] - }, - "execution_count": 112, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "df['waterfront'].value_counts()" - ] - }, - { - "cell_type": "code", - "execution_count": 113, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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+hRnnnkmtm3zyCOPcOedd5JIJPj85z/PPffcw5o1a6Z1fUIIIabOXL3uSIBSRv/6r//Kt7/9bSzLmrbvuXPnTn7wgx8AsHTpUu644w6WL19e/PoFF1zAqaeeyle+8hUymQzf+c53uPXWW6dtfUIIIabOXL7uSA5KGbS0tHDzzTfzjW98A8uy0HV92r73rbfeim3bKKX4p3/6p0FPkoIPf/jDnHzyyQA88cQTZDKZaVufEEKI8psP1x3ZQZmk//iP/yg+QQDWrl3LJz/5SW655ZYp/949PT08/fTTAGzZsoUNGzaMeNubbrqJl156ibq6OlKpFKFQaMrXJ4QQovzmy3VHApRJev3117Esi0AgwB/8wR/w2c9+lh07dozrMXK5HHfddRePPfYY77zzDvF4nKqqKk466SSuuOIKrr/++mH/Yrdt21Z8gl5zzTWjfo9rr72Wa6+9dlzrEkIIUXnmy3VHApRJCgaDXH/99fzRH/0RS5cuHff93377bT772c9y+PDhQZ/v7u7mueee47nnnuP222/n1ltv5fTTTy+5b8HAKNZ1XTo6OkgmkyxatIhoNDrudQkhhKhM8+W6IwHKJH31q19F0yaWyrNv3z4++tGPkkgkME2T6667jksvvZT6+nq6u7t54oknuOeeezhy5Ag33ngjd95556BM6N27dwNgmiYLFy6ks7OT7373uzz88MP09fUBoOs655xzDp/73Oc4++yzJ/8DCyGEmFHz5bojAcokTfRJAvDFL36RRCJBVVUVP/7xj0vO8i699FKuvfZabrzxRhKJBLfccgs//elPi1/v7e0FIBaLsWPHDm6++ebi5wocx2H79u0899xzfOlLX+JTn/rUhNcrhBBi5s2X645U8cyQZ599ljfeeAOAP/7jPx4x0eiss87ixhtvBODll1/mtddeK34tmUwCkM1mufnmm+nr6+PjH/84Dz74IK+//jpbt27ly1/+MpFIBM/z+Lu/+zseeuihKf7JhBBCVKLZdt2RAGWG/OY3vyl+fOGFF45624Fd+LZv3178OJ1OA5BKpejt7eXrX/86t9xyC2vXriUQCNDU1MQf/MEfcPvtt2OaJgDf/OY3yWaz5fxRhBBCzAKz7bojRzwz5K233ip+/IEPfGDM9zt48GDx44EZ1hdccAHXX3/9sPfZtGkT1113HT/96U9pb29n27ZtvOc9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xwsvvDCpNbS3t/O3f/u3gH+0I8MHhZg8acAmROXw5lmrtrIc8RTyTU455ZRx33f9+vX86le/mvRRzC233EI8HmflypX86Z/+6aQeaywMozS203Vt0J9i/porz4X9R+O0d6eIhU00rbQBWyxs0N6d4khnklWLpQHbUHPleSAqg65rw1575qqyBCi6rmPbNpY1/iZMtm37CzEmvpS77rqLp556qni0EwqFJvxYY6Fpirq66Ihfr64OT+n3F7PHbH8u7G9P4noQChglAQr4xznprAOaPuq/iflutj8PRGWoqgrNq39nZQlQli1bxt69e3n++efHfd8dO3YATLhxW2trK9/85jcBuPHGGznrrLMm9Djj4boe8Xiq5PO6rlFdHSYeT+M4MhhsPpszzwXXQVOQydnDNmDLWf7XcR16ekoHaM53c+Z5MA9VYiAQj6fp6Zm+buzlMtHfZVkClPPOO489e/awY8cOtm7dyiWXXDKm+7388sts27YNpRTnnnvuuL+v53n81V/9FYlEgpUrV/KFL3xh3I8xUaNNJnUcVyaXCqA8zwXX82asKmbpgiiL6iMc7khSq2slk8oTaZtljVGWLojKc34U8pogysFxvHn1PCpLgHLdddfxH//xH4DfD+Xv/u7veO973zvqfZ599ln+23/7b3ieh6ZpXH/99eP+vj//+c/Ztm0bAJ/4xCfYv39/yW0GDgqMx+Ps3LkTgAULFtDY2Dju7ynEdBpree9UKTRgu+PRXfQmckRDBoahYdsuyYwtDdiEmEbzLRddeWWaPvQ//sf/4J577im+wzr55JO59NJLOemkk6iu9pPn+vv72bdvH08//TSvv/46nuehlOL6668vNlcbjy9/+cvce++9E1rvn/zJn/C5z31uQvd1HJfu7tLtbMPQqKuL0tOTnFdRrig13ufCcLskuw70cMeju8jkbKIhsyQwmM7mZ2/t7+Lup/bR0ZcB18M0NRY3RKctUJqt5DVh+vmXIDXpwXqNjZU1lqGtK8mBw72sXjL7ktEn+rss27DAr371q7S1tRV3NN555x3eeeedEW9fePJccsklfOUrXynXMoSYdUbaJUmmrWJ5byHwD5g6pqHRm8jx4PYDrGuum/Ldi50t3Tz03EH6Ern8jqeirirIlRKciAqilH9dSWUcdF0jMAerXeZbmXHZdlAAXNfl9ttv58c//jFd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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "# examining the relationship between sqft_living and price\n", - "sns.jointplot(x='sqft_living', y='price', data=df, kind='reg')\n", - "\n", - "plt.tight_layout()" - ] - }, - { - "cell_type": "code", - "execution_count": 114, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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EEIIIaTiUIBCCCGEkIpDAQohhBBCKg4FKIQQQgipOBSgEEIIIaTiUIBCCCGEkIpDAQohhBBCKg4FKIQQQgipOBSgEEIIIaTiUIBCCCGEkIpDAQohhBBCKg4FKIQQQgipOBSgEEIIIaTiUIBSJp///Oexbds2/Pu///uKfc4jR47gy1/+Mt72trfhnHPOwdlnn42rr74aX/nKVzA8PLxi8yCEELLyau2+I5VojiTL448/jnvuuWdFP+f3v/99fO9734OmaTn/fuzYMRw7dgz//d//jW9961u45JJLVnRehBBCyq8W7zsUoJTY008/jb//+79f0c95xx134Lvf/S4AoKGhAR/4wAdwzjnnQNM0PPLII7jnnnsQi8Xw8Y9/HPfddx+2bNmyovMjhBBSPrV636EApYT+8z//E9/4xjegquqKfc6enh784Ac/AACsX78ed911FzZs2OC8/6KLLsKOHTvwhS98AalUCt/5zndw++23r9j8CCGElE8t33coB6UEent7ccstt+ArX/kKVFWFKIor9rlvv/12aJoGxhi+/e1v5/yQ2N797nfj1FNPBQA8+eSTSKVSKzY/QgghpbcW7ju0grJMP/vZz5wfEADYunUr3v/+9+O2224r++eemprCM888AwC46qqrcNZZZy049uabb8bzzz+PhoYGJBIJeDyess+PEEJI6a2V+w4FKMv08ssvQ1VVuFwu/PVf/zU+8pGP4ODBg0VdQ1EU3HvvvXj88cfx2muvIRKJIBgM4pRTTsGVV16J66+/Pu8Du2fPHucH9Nprr130c1x33XW47rrripoXIYSQyrNW7jsUoCyT2+3G9ddfjw996ENYv3590R//6quv4iMf+QgGBwdz/j0cDmP//v3Yv38/fvKTn+D222/HGWecMe9jbdlRrGEYGB8fRzweR2trK/x+f9HzIoQQUpnWyn2HApRl+uIXvwhBWFoqz/Hjx3HjjTciFotBlmW8613vwqWXXorGxkaEw2E8+eSTuO+++3Dy5EncdNNNuOeee3IyoY8cOQIAkGUZLS0tmJiYwHe/+108/PDDmJmZAQCIoojzzz8fH/vYx3Deeect/wsmhBCyqtbKfYcClGVa6g8JAHz6059GLBZDMBjEj3/843l7eZdeeimuu+463HTTTYjFYrjttttw9913O++fnp4GAAQCARw8eBC33HKL8282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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "sns.jointplot(x='bathrooms', y='price', data=df, kind='reg')\n", - "plt.tight_layout()\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Data Preperation\n", - "\n", - "Data Preparation Fundamentals - Applying appropriate preprocessing and feature engineering steps to tabular data in preparation for statistical modeling\n", - "\n", - "Data Cleaning Steps\n", - "Handling Missing Values: Identify and address and missing values using techniques such as dropping or replacing data.\n", - "\n", - "Handling Non-Numeric Data: A Linear regression model needs all of the features to be numeric, not categorical. Identify the data type 'object' and address them using techniques such as ordinal or one-hot encoding.\n", - "\n", - "This notebook contains a breakdown of the step-by-step processes that we used to compile, scrub, and transform our data. It includes variations of narrowing our scope and explorations into the impacts that our different transformations have on the data." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Preprocessing with Scikit-learn\n", - "Let explore and clean our data set to prep for our Linear Regression Model.\n", - "Preprocessing Steps.\n", - "\n", - "1. Handle Missing Values\n", - "2. Convert Categorical Features into Numbers\n", - "3. Find and Remove Outliers" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "##### Handling Missing Values\n", - "Below, let's check to see if there are any NaNs in our data" - ] - }, - { - "cell_type": "code", - "execution_count": 115, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "id 0\n", - "date 0\n", - "price 0\n", - "bedrooms 0\n", - "bathrooms 0\n", - "sqft_living 0\n", - "sqft_lot 0\n", - "floors 0\n", - "waterfront 2376\n", - "view 63\n", - "condition 0\n", - "grade 0\n", - "sqft_above 0\n", - "sqft_basement 0\n", - "yr_built 0\n", - "yr_renovated 3842\n", - "zipcode 0\n", - "lat 0\n", - "long 0\n", - "sqft_living15 0\n", - "sqft_lot15 0\n", - "dtype: int64" - ] - }, - "execution_count": 115, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "#locate missing values\n", - "df.isna().sum()" - ] - }, - { - "cell_type": "code", - "execution_count": 116, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "id 0.0\n", - "date 0.0\n", - "price 0.0\n", - "bedrooms 0.0\n", - "bathrooms 0.0\n", - "sqft_living 0.0\n", - "sqft_lot 0.0\n", - "floors 0.0\n", - "waterfront 11.00152798999861\n", - "view 0.29170718155299347\n", - "condition 0.0\n", - "grade 0.0\n", - "sqft_above 0.0\n", - "sqft_basement 0.0\n", - "yr_built 0.0\n", - "yr_renovated 17.78950780200954\n", - "zipcode 0.0\n", - "lat 0.0\n", - "long 0.0\n", - "sqft_living15 0.0\n", - "sqft_lot15 0.0\n" - ] - } - ], - "source": [ - "#dealing with missing values\n", - "for column in df.columns:\n", - " percentage_of_nan = (sum(df[column].isnull())/len(df[column])) * 100 \n", - " print(column, percentage_of_nan)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The feature 'waterfront' is the only feature with missing values and about 11% of the values have NaNs. Lets investigate this feature to handle it's missing values" - ] - }, - { - "cell_type": "code", - "execution_count": 117, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "waterfront\n", - "NO 19075\n", - "YES 146\n", - "Name: count, dtype: int64" - ] - }, - "execution_count": 117, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "df['waterfront'].value_counts()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can see that the 'waterfront' feature only has two values, yes or no.\n", - "Thus NaN values can be considered no because they do not exist in their homes." - ] - }, - { - "cell_type": "code", - "execution_count": 118, - "metadata": {}, - "outputs": [], - "source": [ - "df['waterfront'].fillna('NO', inplace=True)" - ] - }, - { - "cell_type": "code", - "execution_count": 119, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "waterfront\n", - "NO 21451\n", - "YES 146\n", - "Name: count, dtype: int64" - ] - }, - "execution_count": 119, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "df['waterfront'].value_counts()" - ] - }, - { - "cell_type": "code", - "execution_count": 120, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "id 0\n", - "date 0\n", - "price 0\n", - "bedrooms 0\n", - "bathrooms 0\n", - "sqft_living 0\n", - "sqft_lot 0\n", - "floors 0\n", - "waterfront 0\n", - "view 63\n", - "condition 0\n", - "grade 0\n", - "sqft_above 0\n", - "sqft_basement 0\n", - "yr_built 0\n", - "yr_renovated 3842\n", - "zipcode 0\n", - "lat 0\n", - "long 0\n", - "sqft_living15 0\n", - "sqft_lot15 0\n", - "dtype: int64" - ] - }, - "execution_count": 120, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "#recheck for missing values\n", - "df.isna().sum()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "##### Convert Categorical Features into Numbers" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Our model would crash because some of the columns are non-numeric. Features with a numeric data type will work with our model, but these features need to be converted:\n", - "* waterfront (object)\n", - "* condition (object)\n", - "* grade (object)\n", - "\n", - "Let's inspect the value counts of the specified features:" - ] - }, - { - "cell_type": "code", - "execution_count": 121, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "waterfront\n", - "NO 21451\n", - "YES 146\n", - "Name: count, dtype: int64\n", - "\n", - "condition\n", - "Average 14020\n", - "Good 5677\n", - "Very Good 1701\n", - "Fair 170\n", - "Poor 29\n", - "Name: count, dtype: int64\n", - "\n", - "grade\n", - "7 Average 8974\n", - "8 Good 6065\n", - "9 Better 2615\n", - "6 Low Average 2038\n", - "10 Very Good 1134\n", - "11 Excellent 399\n", - "5 Fair 242\n", - "12 Luxury 89\n", - "4 Low 27\n", - "13 Mansion 13\n", - "3 Poor 1\n", - "Name: count, dtype: int64\n" - ] - } - ], - "source": [ - "print(df['waterfront'].value_counts())\n", - "print()\n", - "print(df['condition'].value_counts())\n", - "print()\n", - "print(df['grade'].value_counts())" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "##### Split function to seperate the numeric value of 'grade'" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The Grade feature is an object data type however the numeric grade is listed in the front. We will use a simple string split function to isolate the numeric part of the feature.\n", - "\n", - "Waterfront has only 2 categories and can be converted into binary in place, whereas Condition has more than 2 categories and will need to be expanded into multiple columns." - ] - }, - { - "cell_type": "code", - "execution_count": 122, - "metadata": {}, - "outputs": [], - "source": [ - "df = df.assign(grade=df.grade.str.split(' ')).explode('grade')" - ] - }, - { - "cell_type": "code", - "execution_count": 123, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "False 46366\n", - "Name: count, dtype: int64" - ] - }, - "execution_count": 123, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "df.duplicated().value_counts()" - ] - }, - { - "cell_type": "code", - "execution_count": 124, - "metadata": {}, - "outputs": [], - "source": [ - "df = df.drop_duplicates()" - ] - }, - { - "cell_type": "code", - "execution_count": 125, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "(46366, 21)" - ] - }, - "execution_count": 125, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "df.shape" + "### Loading Data" ] }, { "cell_type": "code", - "execution_count": 126, + "execution_count": 16, "metadata": {}, "outputs": [], "source": [ - "df = df.drop_duplicates(subset='id')" + "# Creating a function that loads data and return it in a dataframe\n", + "def load_data(file_path):\n", + " house_data = pd.read_csv(file_path)\n", + "\n", + " #shape\n", + " shape = house_data.shape\n", + " print(f\"The dataset contains {shape[0]} houses with {shape[1]} features\")\n", + " print()\n", + " \n", + " #Data Types\n", + " data_types = house_data.dtypes\n", + " print(\"Columns and their data types:\")\n", + " for column, dtype in data_types.items():\n", + " print(f\"{column}: {dtype}\")\n", + " print()\n", + "\n", + " return house_data\n" ] }, { "cell_type": "code", - "execution_count": 127, + "execution_count": 17, "metadata": {}, "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The dataset contains 21597 houses with 21 features\n", + "\n", + "Columns and their data types:\n", + "id: int64\n", + "date: object\n", + "price: float64\n", + "bedrooms: int64\n", + "bathrooms: float64\n", + "sqft_living: int64\n", + "sqft_lot: int64\n", + "floors: float64\n", + "waterfront: object\n", + "view: object\n", + "condition: object\n", + "grade: object\n", + "sqft_above: int64\n", + "sqft_basement: object\n", + "yr_built: int64\n", + "yr_renovated: float64\n", + "zipcode: int64\n", + "lat: float64\n", + "long: float64\n", + "sqft_living15: int64\n", + "sqft_lot15: int64\n", + "\n" + ] + }, { "data": { "text/html": [ @@ -1256,23 +228,23 @@ " 0\n", " 7129300520\n", " 10/13/2014\n", - " 221900.00000\n", + " 221900.0\n", " 3\n", - " 1.00000\n", + " 1.00\n", " 1180\n", " 5650\n", - " 1.00000\n", - " NO\n", + " 1.0\n", + " NaN\n", " NONE\n", " ...\n", - " 7\n", + " 7 Average\n", " 1180\n", " 0.0\n", " 1955\n", - " 0.00000\n", + " 0.0\n", " 98178\n", - " 47.51120\n", - " -122.25700\n", + " 47.5112\n", + " -122.257\n", " 1340\n", " 5650\n", " \n", @@ -1280,47 +252,71 @@ " 1\n", " 6414100192\n", " 12/9/2014\n", - " 538000.00000\n", + " 538000.0\n", " 3\n", - " 2.25000\n", + " 2.25\n", " 2570\n", " 7242\n", - " 2.00000\n", + " 2.0\n", " NO\n", " NONE\n", " ...\n", - " 7\n", + " 7 Average\n", " 2170\n", " 400.0\n", " 1951\n", - " 1991.00000\n", + " 1991.0\n", " 98125\n", - " 47.72100\n", - " -122.31900\n", + " 47.7210\n", + " -122.319\n", " 1690\n", " 7639\n", " \n", " \n", + " 2\n", + " 5631500400\n", + " 2/25/2015\n", + " 180000.0\n", + " 2\n", + " 1.00\n", + " 770\n", + " 10000\n", + " 1.0\n", + " NO\n", + " NONE\n", + " ...\n", + " 6 Low Average\n", + " 770\n", + " 0.0\n", + " 1933\n", + " NaN\n", + " 98028\n", + " 47.7379\n", + " -122.233\n", + " 2720\n", + " 8062\n", + " \n", + " \n", " 3\n", " 2487200875\n", " 12/9/2014\n", - " 604000.00000\n", + " 604000.0\n", " 4\n", - " 3.00000\n", + " 3.00\n", " 1960\n", " 5000\n", - " 1.00000\n", + " 1.0\n", " NO\n", " NONE\n", " ...\n", - " 7\n", + " 7 Average\n", " 1050\n", " 910.0\n", " 1965\n", - " 0.00000\n", + " 0.0\n", " 98136\n", - " 47.52080\n", - " -122.39300\n", + " 47.5208\n", + " -122.393\n", " 1360\n", " 5000\n", " \n", @@ -1328,51 +324,27 @@ " 4\n", " 1954400510\n", " 2/18/2015\n", - " 510000.00000\n", + " 510000.0\n", " 3\n", - " 2.00000\n", + " 2.00\n", " 1680\n", " 8080\n", - " 1.00000\n", + " 1.0\n", " NO\n", " NONE\n", " ...\n", - " 8\n", + " 8 Good\n", " 1680\n", " 0.0\n", " 1987\n", - " 0.00000\n", + " 0.0\n", " 98074\n", - " 47.61680\n", - " -122.04500\n", + " 47.6168\n", + " -122.045\n", " 1800\n", " 7503\n", " \n", " \n", - " 5\n", - " 7237550310\n", - " 5/12/2014\n", - " 1230000.00000\n", - " 4\n", - " 4.50000\n", - " 5420\n", - " 101930\n", - " 1.00000\n", - " NO\n", - " NONE\n", - " ...\n", - " 11\n", - " 3890\n", - " 1530.0\n", - " 2001\n", - " 0.00000\n", - " 98053\n", - " 47.65610\n", - " -122.00500\n", - " 4760\n", - " 101930\n", - " \n", - " \n", " ...\n", " ...\n", " ...\n", @@ -1400,23 +372,23 @@ " 21592\n", " 263000018\n", " 5/21/2014\n", - " 360000.00000\n", + " 360000.0\n", " 3\n", - " 2.50000\n", + " 2.50\n", " 1530\n", " 1131\n", - " 3.00000\n", + " 3.0\n", " NO\n", " NONE\n", " ...\n", - " 8\n", + " 8 Good\n", " 1530\n", " 0.0\n", " 2009\n", - " 0.00000\n", + " 0.0\n", " 98103\n", - " 47.69930\n", - " -122.34600\n", + " 47.6993\n", + " -122.346\n", " 1530\n", " 1509\n", " \n", @@ -1424,23 +396,23 @@ " 21593\n", " 6600060120\n", " 2/23/2015\n", - " 400000.00000\n", + " 400000.0\n", " 4\n", - " 2.50000\n", + " 2.50\n", " 2310\n", " 5813\n", - " 2.00000\n", + " 2.0\n", " NO\n", " NONE\n", " ...\n", - " 8\n", + " 8 Good\n", " 2310\n", " 0.0\n", " 2014\n", - " 0.00000\n", + " 0.0\n", " 98146\n", - " 47.51070\n", - " -122.36200\n", + " 47.5107\n", + " -122.362\n", " 1830\n", " 7200\n", " \n", @@ -1448,23 +420,23 @@ " 21594\n", " 1523300141\n", " 6/23/2014\n", - " 402101.00000\n", + " 402101.0\n", " 2\n", - " 0.75000\n", + " 0.75\n", " 1020\n", " 1350\n", - " 2.00000\n", + " 2.0\n", " NO\n", " NONE\n", " ...\n", - " 7\n", + " 7 Average\n", " 1020\n", " 0.0\n", " 2009\n", - " 0.00000\n", + " 0.0\n", " 98144\n", - " 47.59440\n", - " -122.29900\n", + " 47.5944\n", + " -122.299\n", " 1020\n", " 2007\n", " \n", @@ -1472,23 +444,23 @@ " 21595\n", " 291310100\n", " 1/16/2015\n", - " 400000.00000\n", + " 400000.0\n", " 3\n", - " 2.50000\n", + " 2.50\n", " 1600\n", " 2388\n", - " 2.00000\n", - " NO\n", + " 2.0\n", + " NaN\n", " NONE\n", " ...\n", - " 8\n", + " 8 Good\n", " 1600\n", " 0.0\n", " 2004\n", - " 0.00000\n", + " 0.0\n", " 98027\n", - " 47.53450\n", - " -122.06900\n", + " 47.5345\n", + " -122.069\n", " 1410\n", " 1287\n", " \n", @@ -1496,99 +468,216 @@ " 21596\n", " 1523300157\n", " 10/15/2014\n", - " 325000.00000\n", + " 325000.0\n", " 2\n", - " 0.75000\n", + " 0.75\n", " 1020\n", " 1076\n", - " 2.00000\n", + " 2.0\n", " NO\n", " NONE\n", " ...\n", - " 7\n", + " 7 Average\n", " 1020\n", " 0.0\n", " 2008\n", - " 0.00000\n", + " 0.0\n", " 98144\n", - " 47.59410\n", - " -122.29900\n", + " 47.5941\n", + " -122.299\n", " 1020\n", " 1357\n", " \n", " \n", "\n", - "

17565 rows × 21 columns

\n", + "

21597 rows × 21 columns

\n", "" ], "text/plain": [ - " id date price bedrooms bathrooms sqft_living \\\n", - "0 7129300520 10/13/2014 221900.00000 3 1.00000 1180 \n", - "1 6414100192 12/9/2014 538000.00000 3 2.25000 2570 \n", - "3 2487200875 12/9/2014 604000.00000 4 3.00000 1960 \n", - "4 1954400510 2/18/2015 510000.00000 3 2.00000 1680 \n", - "5 7237550310 5/12/2014 1230000.00000 4 4.50000 5420 \n", - "... ... ... ... ... ... ... \n", - "21592 263000018 5/21/2014 360000.00000 3 2.50000 1530 \n", - "21593 6600060120 2/23/2015 400000.00000 4 2.50000 2310 \n", - "21594 1523300141 6/23/2014 402101.00000 2 0.75000 1020 \n", - "21595 291310100 1/16/2015 400000.00000 3 2.50000 1600 \n", - "21596 1523300157 10/15/2014 325000.00000 2 0.75000 1020 \n", + " id date price bedrooms bathrooms sqft_living \\\n", + "0 7129300520 10/13/2014 221900.0 3 1.00 1180 \n", + "1 6414100192 12/9/2014 538000.0 3 2.25 2570 \n", + "2 5631500400 2/25/2015 180000.0 2 1.00 770 \n", + "3 2487200875 12/9/2014 604000.0 4 3.00 1960 \n", + "4 1954400510 2/18/2015 510000.0 3 2.00 1680 \n", + "... ... ... ... ... ... ... \n", + "21592 263000018 5/21/2014 360000.0 3 2.50 1530 \n", + "21593 6600060120 2/23/2015 400000.0 4 2.50 2310 \n", + "21594 1523300141 6/23/2014 402101.0 2 0.75 1020 \n", + "21595 291310100 1/16/2015 400000.0 3 2.50 1600 \n", + "21596 1523300157 10/15/2014 325000.0 2 0.75 1020 \n", "\n", - " sqft_lot floors waterfront view ... grade sqft_above sqft_basement \\\n", - "0 5650 1.00000 NO NONE ... 7 1180 0.0 \n", - "1 7242 2.00000 NO NONE ... 7 2170 400.0 \n", - "3 5000 1.00000 NO NONE ... 7 1050 910.0 \n", - "4 8080 1.00000 NO NONE ... 8 1680 0.0 \n", - "5 101930 1.00000 NO NONE ... 11 3890 1530.0 \n", - "... ... ... ... ... ... ... ... ... \n", - "21592 1131 3.00000 NO NONE ... 8 1530 0.0 \n", - "21593 5813 2.00000 NO NONE ... 8 2310 0.0 \n", - "21594 1350 2.00000 NO NONE ... 7 1020 0.0 \n", - "21595 2388 2.00000 NO NONE ... 8 1600 0.0 \n", - "21596 1076 2.00000 NO NONE ... 7 1020 0.0 \n", + " sqft_lot floors waterfront view ... grade sqft_above \\\n", + "0 5650 1.0 NaN NONE ... 7 Average 1180 \n", + "1 7242 2.0 NO NONE ... 7 Average 2170 \n", + "2 10000 1.0 NO NONE ... 6 Low Average 770 \n", + "3 5000 1.0 NO NONE ... 7 Average 1050 \n", + "4 8080 1.0 NO NONE ... 8 Good 1680 \n", + "... ... ... ... ... ... ... ... \n", + "21592 1131 3.0 NO NONE ... 8 Good 1530 \n", + "21593 5813 2.0 NO NONE ... 8 Good 2310 \n", + "21594 1350 2.0 NO NONE ... 7 Average 1020 \n", + "21595 2388 2.0 NaN NONE ... 8 Good 1600 \n", + "21596 1076 2.0 NO NONE ... 7 Average 1020 \n", "\n", - " yr_built yr_renovated zipcode lat long sqft_living15 \\\n", - "0 1955 0.00000 98178 47.51120 -122.25700 1340 \n", - "1 1951 1991.00000 98125 47.72100 -122.31900 1690 \n", - "3 1965 0.00000 98136 47.52080 -122.39300 1360 \n", - "4 1987 0.00000 98074 47.61680 -122.04500 1800 \n", - "5 2001 0.00000 98053 47.65610 -122.00500 4760 \n", - "... ... ... ... ... ... ... \n", - "21592 2009 0.00000 98103 47.69930 -122.34600 1530 \n", - "21593 2014 0.00000 98146 47.51070 -122.36200 1830 \n", - "21594 2009 0.00000 98144 47.59440 -122.29900 1020 \n", - "21595 2004 0.00000 98027 47.53450 -122.06900 1410 \n", - "21596 2008 0.00000 98144 47.59410 -122.29900 1020 \n", + " sqft_basement yr_built yr_renovated zipcode lat long \\\n", + "0 0.0 1955 0.0 98178 47.5112 -122.257 \n", + "1 400.0 1951 1991.0 98125 47.7210 -122.319 \n", + "2 0.0 1933 NaN 98028 47.7379 -122.233 \n", + "3 910.0 1965 0.0 98136 47.5208 -122.393 \n", + "4 0.0 1987 0.0 98074 47.6168 -122.045 \n", + "... ... ... ... ... ... ... \n", + "21592 0.0 2009 0.0 98103 47.6993 -122.346 \n", + "21593 0.0 2014 0.0 98146 47.5107 -122.362 \n", + "21594 0.0 2009 0.0 98144 47.5944 -122.299 \n", + "21595 0.0 2004 0.0 98027 47.5345 -122.069 \n", + "21596 0.0 2008 0.0 98144 47.5941 -122.299 \n", "\n", - " sqft_lot15 \n", - "0 5650 \n", - "1 7639 \n", - "3 5000 \n", - "4 7503 \n", - "5 101930 \n", - "... ... \n", - "21592 1509 \n", - "21593 7200 \n", - "21594 2007 \n", - "21595 1287 \n", - "21596 1357 \n", + " sqft_living15 sqft_lot15 \n", + "0 1340 5650 \n", + "1 1690 7639 \n", + "2 2720 8062 \n", + "3 1360 5000 \n", + "4 1800 7503 \n", + "... ... ... \n", + "21592 1530 1509 \n", + "21593 1830 7200 \n", + "21594 1020 2007 \n", + "21595 1410 1287 \n", + "21596 1020 1357 \n", "\n", - "[17565 rows x 21 columns]" + "[21597 rows x 21 columns]" ] }, - "execution_count": 127, + "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "df.dropna()" + "load_data('data/kc_house_data.csv') # Assuming 'data' folder is in the same directory\n", + "\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The dataset contains 21 columns, each representing a distinct feature, and 21,597 rows, with each row corresponding to a specific house sale entry.\n", + "\n", + "The dataset contains a mix of data types, including integers (int64), floating-point numbers (float64), and objects (strings). For instance, numerical features such as bedrooms, bathrooms, and sqft_living are represented as integers or floating-point numbers to facilitate mathematical computations, while categorical features like waterfront and view are stored as objects to accommodate text-based categories." + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The dataset contains 21597 houses with 21 features\n", + "\n", + "Columns and their data types:\n", + "id: int64\n", + "date: object\n", + "price: float64\n", + "bedrooms: int64\n", + "bathrooms: float64\n", + "sqft_living: int64\n", + "sqft_lot: int64\n", + "floors: float64\n", + "waterfront: object\n", + "view: object\n", + "condition: object\n", + "grade: object\n", + "sqft_above: int64\n", + "sqft_basement: object\n", + "yr_built: int64\n", + "yr_renovated: float64\n", + "zipcode: int64\n", + "lat: float64\n", + "long: float64\n", + "sqft_living15: int64\n", + "sqft_lot15: int64\n", + "\n" + ] + } + ], + "source": [ + "kings_data = load_data('data/kc_house_data.csv')" ] }, { "cell_type": "code", - "execution_count": 128, + "execution_count": 19, + "metadata": {}, + "outputs": [], + "source": [ + "#create a function that takes in a column and returns the column statistics as a dictionary\n", + "def descriptive_analytics(column):\n", + " stats_dict = column.describe().to_dict()\n", + " \n", + " print(\"Descriptive Statistics for Column '{}':\".format(column.name))\n", + " print(\"The count of the column is:\", stats_dict['count'])\n", + " print(\"The mean of the column is:\", stats_dict['mean'])\n", + " print(\"The standard deviation of the column is:\", stats_dict['std'])\n", + " print(\"The minimum value of the column is:\", stats_dict['min'])\n", + " print(\"The 25th percentile of the column is:\", stats_dict['25%'])\n", + " print(\"The median of the column is:\", stats_dict['50%'])\n", + " print(\"The 75th percentile of the column is:\", stats_dict['75%'])\n", + " print(\"The maximum value of the column is:\", stats_dict['max'])" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Descriptive Statistics for Column 'price':\n", + "The count of the column is: 21597.0\n", + "The mean of the column is: 540296.5735055795\n", + "The standard deviation of the column is: 367368.1401013936\n", + "The minimum value of the column is: 78000.0\n", + "The 25th percentile of the column is: 322000.0\n", + "The median of the column is: 450000.0\n", + "The 75th percentile of the column is: 645000.0\n", + "The maximum value of the column is: 7700000.0\n" + ] + } + ], + "source": [ + "descriptive_analytics(kings_data['price'])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We can see that the maximum price of a house is 7700000 dollars and the minimum price is 78000 dollars\n", + "\n", + "There are 21597 prices regarding to the houses in the dataset\n", + "\n", + "Average price of a house is 540296.57 dollars" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Data Preperation\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 21, "metadata": {}, "outputs": [ { @@ -1596,121 +685,351 @@ "output_type": "stream", "text": [ "\n", - "Index: 21420 entries, 0 to 21596\n", + "RangeIndex: 21597 entries, 0 to 21596\n", "Data columns (total 21 columns):\n", " # Column Non-Null Count Dtype \n", "--- ------ -------------- ----- \n", - " 0 id 21420 non-null int64 \n", - " 1 date 21420 non-null object \n", - " 2 price 21420 non-null float64\n", - " 3 bedrooms 21420 non-null int64 \n", - " 4 bathrooms 21420 non-null float64\n", - " 5 sqft_living 21420 non-null int64 \n", - " 6 sqft_lot 21420 non-null int64 \n", - " 7 floors 21420 non-null float64\n", - " 8 waterfront 21420 non-null object \n", - " 9 view 21357 non-null object \n", - " 10 condition 21420 non-null object \n", - " 11 grade 21420 non-null object \n", - " 12 sqft_above 21420 non-null int64 \n", - " 13 sqft_basement 21420 non-null object \n", - " 14 yr_built 21420 non-null int64 \n", - " 15 yr_renovated 17616 non-null float64\n", - " 16 zipcode 21420 non-null int64 \n", - " 17 lat 21420 non-null float64\n", - " 18 long 21420 non-null float64\n", - " 19 sqft_living15 21420 non-null int64 \n", - " 20 sqft_lot15 21420 non-null int64 \n", + " 0 id 21597 non-null int64 \n", + " 1 date 21597 non-null object \n", + " 2 price 21597 non-null float64\n", + " 3 bedrooms 21597 non-null int64 \n", + " 4 bathrooms 21597 non-null float64\n", + " 5 sqft_living 21597 non-null int64 \n", + " 6 sqft_lot 21597 non-null int64 \n", + " 7 floors 21597 non-null float64\n", + " 8 waterfront 19221 non-null object \n", + " 9 view 21534 non-null object \n", + " 10 condition 21597 non-null object \n", + " 11 grade 21597 non-null object \n", + " 12 sqft_above 21597 non-null int64 \n", + " 13 sqft_basement 21597 non-null object \n", + " 14 yr_built 21597 non-null int64 \n", + " 15 yr_renovated 17755 non-null float64\n", + " 16 zipcode 21597 non-null int64 \n", + " 17 lat 21597 non-null float64\n", + " 18 long 21597 non-null float64\n", + " 19 sqft_living15 21597 non-null int64 \n", + " 20 sqft_lot15 21597 non-null int64 \n", "dtypes: float64(6), int64(9), object(6)\n", - "memory usage: 3.6+ MB\n" + "memory usage: 3.5+ MB\n" ] } ], "source": [ - "df.info()" + "kings_data.info()" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": {}, + "outputs": [], + "source": [ + "def identify_issues(dataset):\n", + " # Identify missing values as a percentage of the whole dataset\n", + " missing_values = (dataset.isnull().sum())/len(dataset) * 100\n", + "\n", + " # Identify duplicates\n", + " duplicates = dataset.duplicated().sum()\n", + " \n", + " #return a dictionary \n", + " return {'duplicates': duplicates,\n", + " 'missing values': missing_values.round(2)} \n" ] }, { "cell_type": "code", - "execution_count": 129, + "execution_count": 23, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "grade\n", - "7 8889\n", - "8 6041\n", - "9 2606\n", - "6 1995\n", - "10 1130\n", - "11 396\n", - "5 234\n", - "12 88\n", - "4 27\n", - "13 13\n", - "3 1\n", - "Name: count, dtype: int64" + "{'duplicates': 0,\n", + " 'missing values': id 0.00\n", + " date 0.00\n", + " price 0.00\n", + " bedrooms 0.00\n", + " bathrooms 0.00\n", + " sqft_living 0.00\n", + " sqft_lot 0.00\n", + " floors 0.00\n", + " waterfront 11.00\n", + " view 0.29\n", + " condition 0.00\n", + " grade 0.00\n", + " sqft_above 0.00\n", + " sqft_basement 0.00\n", + " yr_built 0.00\n", + " yr_renovated 17.79\n", + " zipcode 0.00\n", + " lat 0.00\n", + " long 0.00\n", + " sqft_living15 0.00\n", + " sqft_lot15 0.00\n", + " dtype: float64}" ] }, - "execution_count": 129, + "execution_count": 23, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "df['grade'].value_counts()" + "identify_issues(kings_data)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The examination indicates that there are no duplicate entries within the dataset, ensuring the integrity of the records. However, attention is warranted to address missing values present in certain columns. Specifically, the 'waterfront' feature exhibits 11% of null values, representing a negligible portion of the dataset. Similarly, the 'yr_renovated' feature shows a relatively higher percentage of missing values, accounting for approximately 17.79% of the dataset" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "##### Before making changes make a copy instead of overwriting data" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": {}, + "outputs": [], + "source": [ + "house_data_clean = kings_data.copy()" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": {}, + "outputs": [], + "source": [ + "# Changing the date to date time\n", + "house_data_clean['date'] = pd.to_datetime(house_data_clean['date'])\n", + "\n", + "# Extracting only the year from the column Date\n", + "house_data_clean.date = house_data_clean['date'].dt.year\n", + "\n", + "# Changing the dates for the year built \n", + "house_data_clean['yr_built'] = pd.to_datetime(house_data_clean['yr_built'],format='%Y').dt.year\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The above code converts the 'date' column data to only contain the year the house was sold, for the purpose of analysis we will use only the year since the changes month by month will be minor." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "The most common buiding grade is a 7" + "#### Dealing with the missing values" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": {}, + "outputs": [], + "source": [ + "def missing_values(dataset):\n", + " # drop the rows from views\n", + " dataset.dropna(subset=['view'],inplace=True)\n", + "\n", + " # Filling the NaN values for waterfront with NO\n", + " dataset.waterfront.fillna('NO',inplace=True)\n", + " \n", + " # Dropping the yr_renovated column \n", + " dataset.drop('yr_renovated',axis=1,inplace=True)" ] }, { "cell_type": "code", - "execution_count": 130, + "execution_count": 27, "metadata": {}, "outputs": [], "source": [ - "# Change the data type from object to int.\n", - "df['grade'] = df['grade'].astype(int)" + "missing_values(house_data_clean)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "'yr_renovated' has the highest percentage of NaN values 17%. This will be dropped since it will not be used within our model inline with the business problem.\n", + "\n", + "'Waterfront' feature has 11% null values, this was filled with NO on the assumption that these cells were not filled since they lacked waterfronts\n", + "\n", + "For the 'View' column, the null values were dropped by row since the overall percentage impact would be minute" ] }, { "cell_type": "code", - "execution_count": 131, + "execution_count": 28, "metadata": {}, "outputs": [ { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAB+8AAAUmCAYAAABXlPbhAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy81sbWrAAAACXBIWXMAAA9hAAAPYQGoP6dpAAEAAElEQVR4nOzdd5hV1fk/7GeGjoBUkY4lYkOKoKKo2Bsqiho72BskGHu+lkQ0okk0KkYUC9g7CNg1dkGxoCgqxUKVIr0PzHn/8IWfyjnDzJmyGbjv6/LKZK29136mnH2G+ey1Vk4qlUoFAAAAAAAAAJCY3KQLAAAAAAAAAIBNnfAeAAAAAAAAABImvAcAAAAAAACAhAnvAQAAAAAAACBhwnsAAAAAAAAASJjwHgAAAAAAAAASJrwHAAAAAAAAgIQJ7wEAAAAAAAAgYcJ7AAAAyr2VK1fGqlWrki4DAAAAIGsVky4AAACSdOedd0b//v3T9r3xxhvRtGnTUr3+1KlT44ADDkjb16tXr+jdu3epXh/Ki1QqFV999VWMHTs2Jk6cGBMmTIhp06bF4sWLY8mSJZGXlxcREZUqVYqaNWtGo0aNomnTptGqVato3759tGnTJqpXr57wZ0FhZLovH3PMMdGvX78EKoLiK+j9PhsVKlSI3NzcqFKlSlSvXj0233zzqFevXjRr1iz+8Ic/RNu2bWPnnXeOChUqlNg1S5rXOgAArEt4DwAAwAYplUrFu+++G6+++mq89dZbMXv27PWek5eXF3Pnzo25c+fGV199Fa+88kpERFSpUiX22WefOPzww+Pggw+OihX9cxgov1avXh2rV6+OvLy8WLx4ccyaNSsmTJgQo0aNWntMnTp14pBDDonTTz89ttlmmwSrBQAACstfKwAAANigrFixIoYOHRqDBg2K7777rsTGfO211+K1116LRo0aRc+ePeOUU06JSpUqlcj4ABuaefPmxRNPPBFPPvlkdO/ePS677LKoXbt20mUBAAAFsOc9AAAAG4x33nknDjvssLj22mtLLLj/vRkzZsRNN90URx11VHz00Uelcg2ADUUqlYpnnnkmunfvHuPHj0+6HAAAoADCewAAABK3aNGiuPTSS+Occ86JadOmlck1v/vuu+jZs2c8+OCDZXI9gCRNnTo1evToEZMmTUq6FAAAIAPL5gMAAJComTNnxtlnn12oGaEtW7aM3XffPdq1axctWrSIJk2axGabbRbVqlWLvLy8WLJkSUydOjUmTZoUo0ePjnfeeSfmzJmTcbzVq1dHv379Yv78+XHxxReX5KcFsMGZO3duXHTRRTFkyJCoVq1a0uUAAAC/I7wHAAAgMd9//32cddZZBc62r1SpUnTr1i1OPPHE2HnnnTMeV6FChahatWrUq1cv2rRpE8cee2ysXr063nnnnbjnnnvis88+y3jugAEDYosttohTTjmlWJ8PQFH16tUrevfuXaRzUqlU5OXlxapVq2Lp0qXx888/x7Rp0+KTTz6JYcOGxaxZszKe+/3338cdd9wRV1xxRXFLBwAASpjwHgAAgEQsWLAgzj333AKD+4MPPjj++te/RqNGjbK6RoUKFWK//faL/fbbL1566aXo27dv/Pzzz2mP7devX3To0CFatWqV1bUAykpOTk5Urlw5KleuHNWrV4/69etHq1atYv/9948//elPcffdd8eAAQMilUqlPf/hhx+OU045JZo2bVrGlf8/vXv3LvJDCwAAsLGz5z0AAABlLj8/P/7yl7/E5MmT0/ZXq1YtbrnllrjzzjuzDu5/77DDDotnn302tttuu7T9K1eujGuvvbZErgWQlCpVqkSfPn2iX79+GY/Jy8uLRx99tAyrAgAACkN4DwAAQJkbMGBAvPfee2n7Nttss7j//vvj6KOPLvHrNmrUKB544IFo0qRJ2v4xY8bEyy+/XOLXBShr3bp1i549e2bsHzJkSKxevbrsCgIAANZLeA8AAECZmjFjRtx7771p+3JycuLWW2+NXXfdtdSu36BBg7jlllsiJycnbf/AgQNL7doAZal3795Rt27dtH3z5s2LL774oowrAgAACiK8BwAAoEz985//jGXLlqXtO+ecc6JLly6lXkOHDh3iqKOOStv35ZdfxtixY0u9BoDSVqNGjejWrVvG/jFjxpRZLQAAwPoJ7wEAACgzX3/9dbzwwgtp+3baaafo06dPmdXSq1evyM1N/8/iYcOGlVkdAKWpc+fOGfu+++67MqwEAABYn4pJFwAAAJS+2bNnx4cffhgffvhhjB8/PubOnRvz5s2LZcuWRdWqVaNOnTrRvHnz2GmnnWK33XaLPfbYIypVqpR02WUulUrFF198ER9//HF8/vnnMXHixFi4cGEsWLAgUqlUVK1aNerVqxeNGzeOVq1aRdu2baNz585Ro0aNUq1rxYoV8e6778bo0aPj66+/jilTpsT8+fNjxYoVUaVKlahVq1Y0b948dtxxx9hjjz1ir732isqVK5dqTdl65JFHMvZdfPHFUaFChTKrpXnz5rHXXnvFu+++u07fG2+8Ef/3f/9XYteaM2dOPPLII/Hmm2/Gjz/+GKlUKurXrx9t2rSJ/fbbLw455JCsvmfjx4+Pjz/+OL788suYPHlyzJgxIxYsWBDLly+P/Pz8qFy5clSvXj222GKLaNy4cey4447RoUOH6NChQ1SsWHp/Epg5c2a88sorMWbMmBg3blzMmzcvFi9eHJUrV44tttgiWrVqFXvvvXccfPDBsfnmm5daHZl89dVX8f7778fnn38eP/74Y8ycOXPtahCbbbZZNGnSJLbeeuvo2LFjdOnSJRo2bFjmNZZ3K1asiFGjRsWYMWPiiy++iKlTp8aCBQti0aJFUaFChahWrVpsscUW0aRJk9h5552jffv20bFjx03yvae0bbfddhn7fv755xK5xptvvhnPPPNMfP755zF//vyoUaNGtGzZMnbfffc4+uijY+utty6R6xTF6tWr46OPPoqRI0fGuHHj4vvvv4+FCxfG0qVLY7PNNotatWpFgwYNok2bNtG2bdvYZ599onr16qVSy+LFi+Ptt9+Ojz/+OL799tuYOnVqLFq0aO37eJ06daJFixbRunXr6NSpU+y2225l+n4IAMCGIyeVSqWSLgIAAJJy5513Rv/+/dP2vfHGG9G0adNSvf7UqVPjgAMOSNvXq1ev6N27d7HGHz16dNx7773xzjvvFOm82rVrR/fu3aNnz56xxRZbZH390047LT766KN12m+66aY49thjsx43IuLKK6+MIUOGrNOezddtyZIl8eijj8bjjz8e06dPL9K5lSpVii5dukTPnj2jQ4cORTp3faZPnx733XdfPP/887F48eJCn7fm+3f22Wdn3Os4CQsWLIh999037ZL5HTp0iEcffbTMa3rxxRfj4osvXvv/K1asGG3atInOnTvH2Wefvd5A/cMPP4zTTz99nfYHH3ww9txzz4iIeOWVV+Kqq66KJUuWZBynbt26ceGFF8ZJJ5203lB91qxZ8eSTT8bQoUNj6tSpBR6bSZ06deK4446Lnj17Rv369bMaI51vvvkm/vOf/8Q777wTq1evXu/x1atXjx49esSFF1649mud6b58zDHHRL9+/bKubeXKlfHcc8/F4MGDizTbODc3Nzp37hwXXHBBtG/fPuvrF9egQYPipptuWqe9WrVq8f7778dmm21WItdZsGBB7LXXXpGXl7dO31NPPRVt2rQp8Pxp06bFfffdF8OGDSvSfSsiYvPNN48jjzwyevToEc2bNy/SuRu60n6/L8jKlSujdevWafv23HPPePDBBzOem+59vH379vH4449HRMTChQvjkksuWe/vGV26dInLL788ttlmm7VtpfVa//nnn2PQoEHxzDPPxNy5cwt9Xs2aNaNbt25x5plnRuPGjbO+/q9NnDgx7rnnnnjllVdixYoVhT6vQYMGceqpp8app55a6g8IAgCwYbFsPgAAbIQmT54cp5xySpx66qlFDu4jIubPnx/3339/HHLIITFw4MBChXDl1ciRI+PQQw+Nf//730UO7iMi8vLy4rXXXotTTjklLrzwwpg5c2axa8rLy4v+/fvHIYccEo8++miRA7A137+DDz44nnzyyWLXU1KGDx+eca/70047rYyr+cW+++4b22yzTfzxj3+M/v37x4cffhiPPfbYb8Lk4nj55ZejT58+BQb3ERFz586NG264IX788ceMxyxbtixuvfXWOOCAA6J///5ZB/cREfPmzYuBAwfGwQcfHI899ljW46yxcuXKuP766+OYY46JN998s9D3jKVLl8bdd98d3bt3j6+//rrYdWQycuTI6Nq1a1x33XVFXiY8Pz8/3nnnnTjppJPi0ksvjXnz5pVSlQU76qij0s5KX7ZsWbz22msldp0XX3wxbXC/zTbbrDe4Hzx4cBx22GHx2GOPFfm+FfHLgwOPPPJIHH744fHPf/4zVq5cWeQxWFdBX8eaNWtmPe6yZcvinHPOKdTvGW+99VbGhyVLyqpVq+K///1v7L///nHvvfcWKbiPiFi0aFE8/PDD0bVr13jssceiOPOdlixZEjfccEMceeSRMWzYsCIF9xG/rJh02223xaGHHhqvv/561nUAAFD+CO8BAGAj8/zzz0e3bt3i448/LvZYS5cujX/9619x5plnFvmP4OXBCy+8EOecc07MmjWrRMZ744034rjjjotvvvkm6zFmzZoVp512Wtx5553FDq4WLVoU1157bVxyySWxfPnyYo1VEv73v/+lba9Ro0bst99+ZVzNLzbbbLN48cUX4/rrr4+DDjqoRGc4Tpw4Ma644orIz88v1PG77rrrb2al/trkyZPjhBNOiHvuuadEA80lS5bE3//+97jxxhuzHmPWrFlx8sknx6OPPlroz/X3xo8fHyeffHKMGTMm6zrSSaVS0b9//zjjjDMKfDCisIYPHx7du3cv1ms8W3Xr1s34Ohk+fHiJXef5559P217QaimpVCpuvPHG+Mc//lHkkDKdvLy8uO++++L000/P6iEAfqug9+86depkPe7f/va3Ir1mTzjhhKyvtT4//fRTnHDCCXH77bcX+/1uzX3xqquuyuqe9t1338Vxxx0XDz/8cNb3xDVmz54dF110UfTr12+jfpASAID/R3gPAAAbkdtuuy0uv/zy9c7yLapRo0bFySefHD/99FOJjpukkSNHxiWXXJJ2hmlxzJo1K84999ys9hGeNm1anHzyyfHZZ5+VaE0jRoyI8847L9EAf9myZTF69Oi0fV26dIkqVaqUcUWla9WqVXHppZcW6WueKdiaNm1anHbaaTF+/PiSKm8dDz30UFazt+fPnx9nnnlmjB07ttg1LF26NM4777yYOHFisceK+CVQvvbaa+POO+8s1gza35s2bVqceuqp8cUXX5TYmIXVvXv3tO0jR46M2bNnF3v8yZMnp73/VKhQIY4++uiM591xxx3x0EMPFfv6v/fZZ5/Fn/70pxL9/m2Kvvzyy4x99erVy2rMV155JYYOHVro45s3bx577LFHVtdanylTpsTJJ58cX331VYmOO2TIkLj88suLdM7XX38dJ598cpFX+FifBx98sEgPgwEAUH4VvJEeAABQbtxzzz0xYMCAAo9p27ZtHHzwwdG+ffto0KBBVK9ePebMmROTJ0+ON954I15//fVYuHBh2nO///77OPPMM+OJJ56IWrVqlcanUGYWLVoUV111VcZAaMcdd4xDDz00dtppp2jevHlsttlmUalSpVi0aFFMnTo1xowZE0OHDs34x/mZM2fGLbfcEjfffHOha1qwYEGceeaZMWXKlIzHNGjQIA455JDYZ599omnTplGvXr1YuHBhzJw5M0aNGhUjRoyIH374Ie25o0aNir/85S9x1113RU5OTqHrKikffvhhxhnjHTt2LONqSt/DDz9cpGXgN9988zjssMPWaV+9enX06dOnwAdn2rVrFwceeGBsv/326/y8zp07N77++usYPXr0evdcvvHGG2PvvfeOqlWrFqrmVCoVvXv3jgkTJmQ8pkmTJnHUUUfF3nvvHVtuuWVUrVo1fvrppxg3blwMGzYsRo8e/ZvX4fz58+Pll18u1PXX5+abb46nnnoqY3+FChViv/32iy5dusTOO++8NsScOXNmjB8/Pl588cUYNWpUrFq1ap1zFy1aFGeffXY888wzZbo3+9577x0NGjRYJ6hfvXp1vPDCC9GzZ89ijZ9p1v0+++wTDRo0SNv3xRdfxD333JO2Lzc3Nzp37hz7779//OEPf4jGjRtHtWrVIuKXr+HEiRPjww8/jOeffz7jdgTvv/9+PPfccxkfXGD9ClrWfn1bIaSzZMmSIq/Wcfzxx5fKe8/ixYvj7LPPjmnTpmU8pm7dunHQQQdFly5domnTplG/fv3Iy8uLKVOmxMiRI+PJJ5/M+PDL8OHDo127dnHKKaest5YpU6bEGWecUeDWGk2bNo1DDz00OnfuHI0aNYratWvHvHnz4qeffop33nknXnrppZgxY0bGWmrXrh1XX331emsBAKD8Et4DAMBG4IMPPoj//Oc/Gfu33nrruPbaa6NTp07r9NWtWze22267OPDAA+Oqq66K2267LZ544om0s7smTZoUl19++XofEtjQ3XfffWn/OF6tWrW44YYbomvXrmnPq1WrVjRp0iR23333OPfcc+PRRx+Nfv36pZ29P3z48OjVq1c0a9asUDVdcsklGYP3SpUqxQUXXBBnnnnm2uBrjdq1a0fz5s2jY8eO0bt373j66afj5ptvjkWLFq0zzhtvvBEDBw6Mc889t1A1laSCZn526NChDCspG78Py2rXrh1nnnlmHHTQQdG0adNYuXJljB8/Pt5666145pln4vDDD0+7+sDjjz+ecYZ38+bN46abbsr49Vvz89q6des44YQT4v/+7//i1ltvjSeffDLt8TNmzIh33303DjrooEJ9joMHD46PPvoobV+lSpXivPPOi/PPP3+dfdrr1asXO+20Uxx//PExcuTIuOaaawp8aCUbL7zwQjz44IMZ+zt37hx//etf025TsMUWW0Tr1q2je/fuMWHChPjrX/+a9nuwYMGCuOiii+LZZ5+NypUrl2j9mVSoUCG6desWAwcOXKdv2LBhxQ7vhw0blra9oCXzb7rpprTLeTdr1ixuv/322GmnndKeV6dOnWjevHnsv//+0bt37+jXr188/fTTaY8dMGBAHHPMMZGbawHJopo2bVqMGDEibV+lSpWyenjq22+/Xadt7733jtNOOy3atm0b1apVi9mzZ8cnn3wSzz//fHz44YcF/gwVx3XXXVfge2fPnj3jggsuiM0222yd/oYNG0aHDh3i3HPPjX//+98xePDgtOP885//jH322afA9/OVK1fGRRddlDG4r1mzZvTp0ydOPPHEqFjxt3+OrV27dmy11VbRqVOnuOSSS+L++++P/v37p33g7eGHH462bdtm/D0FAIDyz796AACgnFuxYkVcffXVGZdS3WeffWLIkCFpg/vfq1WrVlx33XXRv3//jGHUm2++Gc8991yxak5SKpXKWP9tt91W6D+I5+TkxKmnnhr/+te/0vavXr260EsKP/PMM/Huu++m7atdu3YMGjQoLrroonWC+3SOP/74GDJkSDRu3Dht/5133lniy/kWRqal0CtWrBgtW7Ys22LK2DbbbBPDhw+P8847L7beeuuoXLly1KhRI9q3bx9/+ctf4rXXXovzzz9/nfNWrlyZcUZz48aN49FHHy3Sgw+1a9eO66+/vsBZm6+++mqhxpo3b17cfvvtafsqVaoUd955Z/Tu3Xud4P73OnXqFM8991zGgDcbc+fOjeuvvz5j/9lnnx333Xdf2uD+9/7whz/EE088kTF4HD9+fNx7771Z15qNTLV89dVXMWnSpKzH/eSTT2Ly5MnrtNepUye6dOmS9pzvvvsuPv3003XaN99883j44YcL/X2tUaNG3HDDDXHqqaem7Z88eXLGbTfIbPXq1fH3v/894/Ywu+66a1SvXr3Y17nqqqvivvvui3333Tc233zzqFy58tpVN+6///546aWXon79+sW+zu+NHj0644MJ1atXj3vvvTcuvfTStMH9r1WpUiX++te/xhVXXJG2f9myZXHfffcVOMbdd9+d9qGGiF9WIHn88cfj1FNPXSe4/72KFSvGeeedF48//njGVY5uuOGGmDt3boHjAABQfgnvAQAggwMOOCBatWpVqv8dcMABxa5z8ODBGZeL3WeffeK///1voZfB/vXnfvfdd0eFChXS9t96662xbNmyIte6IZg0aVLMmjVrnfbddtst9ttvvyKPd+ihh2bcC/rNN99c7/nLly+P2267LW1f5cqVY+DAgUWemd6sWbMYNGhQ2rBk5cqVBa7SUFoyhfdNmjRZb5hRnm2xxRbx4IMPxhZbbJHxmM022yzt9+qtt95K+7MaEfGPf/yjwDELctppp2X8mfrkk08KNcbgwYNj6dKlGWsrymupVq1a8eCDD8bWW29d6HMK8t///jfmz5+ftq9nz55x2WWXFWn57goVKsSNN96YdluDiF9W8vj555+zKTUrW2+9dbRr1y5tX6aZ84WRacn8I488MuPDXCNHjkzbfvrpp0ejRo2KXMMVV1wRLVq0SNtXmPsp/8/KlSvj2muvjbfffjvjMWeeeWaxr9OrV6/1rvhQ2BVoiurf//532vbc3NwYMGBA7LnnnkUa78wzz8z4Oh86dGjGwHzmzJlx//33p+2rXbt2PPTQQ/GHP/yhSLXsvPPOcd9996V9uGLevHlpV98AAGDjILwHAIByLC8vLx566KG0fXXq1Il+/fqtd+ZrJp07d46zzjorbd/s2bPjmWeeyWrcpGVaXneXXXbJeswzzjgjbfs333yz3occnnrqqZgzZ07avquuuirrulq0aBF///vf0/a9+uqrxZqhm41MD5hkE/CVJ+eff340bNgwq3NfeumltO277bZboVbSKMhxxx2Xtn3mzJm/2YM+nby8vHj88cfT9u27775x1FFHFbmezTffPPr27VvsPbF//vnnjNsCtG/fPi677LKsxs3NzY0bbrghttxyy3X6li1bFoMGDcpq3Gxl2v99+PDh6/3+pbNy5cp4+eWX0/YVtNx5pvtp69ati1xDxC8PLJ188slp+8aMGZPVmJuaVCoVI0eOjO7duxf4Pr3TTjvFvvvuW6xrNWzYMM4777xijZGtr776Kj777LO0fT169Ijdd989q3H/7//+L+3DKsuXL4///e9/ac954IEHYsWKFWn7brnllmjatGlWtbRp0yb+/Oc/p+17/PHHY8GCBVmNCwDAhk14DwAA5dibb74Zs2fPTtt35ZVXRr169Yo1fu/evTPOgnziiSeKNXZSlixZkra9ODNnd9hhh2jcuHFss802sd9++0WPHj3immuuiQEDBmRcvWCNTHs8b7vttnHiiSdmXVNExIEHHhjt27dfpz2VSsWzzz5brLGLIj8/P+Ms7fUtZ1ye1a5dO2NIvj6pVCpGjRqVtu+kk04qTlkR8UsolM6qVasyvkbWeP/99zPObL/qqquyrqlDhw7F3sd56NChafeJjvhlVndxVnmoUaNG9OrVK23fkCFD0u77XloOO+ywtNtoTJs2rdCrJ/zaW2+9lTYI3GGHHWKHHXbIeF6m13Vx7qedO3eOmjVrxk477RSHHnponHfeeXHDDTfE5ZdfnvWYG6P8/PxYvHhxzJw5M7766qsYMmRI3HjjjXHAAQdEz549Y/z48RnPrVChQlx55ZXFruH000/PuCpDacu0LU3t2rWjT58+WY/boEGDjPehDz74YJ22lStXZqylc+fOxX5A4rTTTku7Dc6yZcsybhkAAED5tvGuTQgAAJuA1157LW17nTp14vDDDy/2+JUrV46TTjop+vXrt07fxIkTY9KkSYXaN3pDkiksfvXVV+Oyyy7L+oGHbJZ0Hj9+fMaA5dxzz43c3OI/b33iiSem3ZP6pZdeKrMwbPHixRn70gWQG4u99torqlSpkvX5DzzwQEyePDkmT54cU6ZMicmTJ8eMGTNin332KXZtDRo0yNi3fPnyqFGjRsb+V155JW17u3btYquttipWXSeccEIMHz486/NfeOGFtO2dOnWKtm3bZj3uGkcccUT069dvnZ/p2bNnx+jRo2OPPfYo9jUKo0aNGnHIIYekDQ2HDRtW5K02MoWPBc26j8h8P33yySfjmGOOyWolhW233TY+/vjjIp9XnvXv3z/69+9fZte76KKLYrfddiv2OPvvv38JVJOd119/PW17165di7xV0O8deuih8dxzz0XEL6tuNG7cOLbeeuu0S98X9DDTBRdcUKw6In550OL444+P22+/fZ2+l156KU455ZRiXwMAgA2L8B4AAMqxdLPAIiKOPvroEpsNd8wxx8Stt96adjbru+++W+7C+0z7ai9ZsiTOPvvsuOeee7LeS7yo3n333bTtlSpVKrFQZJ999omcnJx1ltKePn16fPfddyW2z3hBMs3OLUkff/xxiYcYTZo0ybhMcmEUNUD9tZycnPXOei6OgsL5VatWFXju6NGj07YfccQRxaopIqJjx47RqFGjmDFjRpHPnTt3bowbNy5t30EHHVTc0iIionr16tGxY8e0D+u8//77ZRbeR/wSrKcL3V955ZW4+uqrC/0eMG/evHjnnXfWaa9UqVIceeSRBZ6b6f4xZsyYuOqqq+L6669PbGY26e23334lEirXq1evTN4/0pk6dWpMnz49bd/RRx9d7PH32GOPuO2222LrrbeOrbbaqsCHsDK9j9evXz923XXXYtcS8ct2JOnC+zFjxsSSJUs26hVsAAA2RZbNBwCAcmr69OkZ90rfa6+9Suw6tWvXjp133jlt39ixY0vsOmVlq622SrsEbUTEuHHj4pBDDonbbrstvvvuu1KvJd2M+IiItm3bRs2aNUvkGnXq1Ek7WzAiMu4XXNIKCu+WLVtWJjUkoVWrVkmXkFFBM6ILWv599uzZMWXKlLR97dq1K5G69txzz6zO/fTTTzPu914SqxWskWnGclm9nn5dR7NmzdZpnz9/ftowPpMXX3wx8vLy1mnff//9o06dOgWeW9D3asiQIXHooYfGY489Vqxl9Ck5Rx55ZNxxxx0lsqpLkve3TO+dVatWjZ122qnY41epUiUOP/zw2H777de7ekqmWjp37pzVyhPp7LDDDml/J8jLyyuXv4cBAFAwM+8BACCDN954I5o2bVqq15g6dWoccMABWZ377bffZuzLFLZnq3Xr1mn/QF1QDRuqnJycOO644+KOO+5I27906dIYMGBADBgwIFq0aBH77LNP7LPPPrHbbrsVeyne3/v666/Ttpf0bMatt9467fL8ZfX9K2hW4MYc3hd3CfmSNn/+/Pj8889j1KhRBa4okCkAj4iYMGFC2vbc3NzYdttti11jRMR2222X1XnffPNN2vYqVaqU6L0802ojBe0xXhpycnLimGOOSXsvGzZsWBx44IGFGuf5559P276+JfMjIpo3bx577LFHjBo1Km3/tGnT4u9//3v07ds3dt5559h3331j7733jtatW5dIgEzhNGnSJC655JISWR1jjZYtW5bYWEU1adKktO3bbbddVKhQoczqyMvLi4kTJ6btK8lViXJzc6Nly5Zpg/pvv/22TFf8AACg9AnvAQCgnMq0ZOyWW24ZdevWLdFr7bjjjmnbp02bVqLXKSs9evSIp556Kn766acCj/vxxx/j4YcfjocffjgqV64cHTt2jL322is6d+5c7FmHeXl5Gb+HDRs2jCVLlhRr/F/bcsst07ZPnjy5xK5RkCpVqkSlSpXSzu6dN29emdRQ1ipVqrTeWculZeHChTFlypT48ccfY9KkSTFhwoT49ttv48cffywwmC+MTLPumzVrVmIPt2T72vrhhx/Stjdq1KhEt26oX79+2vYFCxbEvHnzyvT7fuyxx0b//v0jPz//N+1vvvlmLFq0aL0rePzwww/x+eefr9PeoEGD2HvvvQtVwyWXXBInnXRSgdst5OfnxxdffBFffPFF3HnnnVG7du3o1KlTdO7cOTp37pzxHkX2KlasGLvttlscffTRccQRR0SlSpVKdPyy2l4mnUz3oWwf/MnW9OnT076vRfzyGirJ9/HGjRunDe/L6n0cAICyI7wHAIByaubMmWnbMwVLxVGvXr207UuXLi2X+63WqFEjbr311jjzzDNj+fLlhTpn5cqV8f7778f7778ft9xySzRq1Cj23Xff2H///WPPPfcscjAya9asjEHqHXfckXFlgJI0a9asUr/GGnXr1k37M/vjjz+WWQ1lqUaNGiW2ZHImU6ZMiS+//DImTJgQ33//fUyePDmmTp0a8+fPL7VrZtqLviQD60zbWqxPpnviDz/8EO3bty9OSYU2a9asMg3vGzVqFJ06dYr333//N+0rV66Ml19+OY4//vgCz8806/7oo48u9AzmXXbZJS677LK46aabCld0/LIKxEsvvRQvvfRSRERsv/320aVLlzjggANil112KfQ4m7KcnJyoXLlyVKlSJTbffPOoX79+NGnSJLbZZpvYaaedYtddd40aNWqU2vVr1apVamOvT6YH72rXrl2mdWS650REXHnllXHllVeWeg1l+T4OAEDZEN4DAEA5lWkmaWn8sb6g2ZvLly8vd+F9RMSuu+4aAwcOjD59+mS1H/OMGTPiiSeeiCeeeCI233zzOOigg6J79+6FDgkXLFhQ5GuWtNIMeX9v2223TRt0LF26NGbOnBkNGzYss1rKQklvsbDGpEmTYtiwYTF8+PBEVr7INJO0evXqJXaNbO8nm9prao3u3buvE95H/LJ0fkHhfSqVimHDhqXtK8yS+b/Ws2fPyM3NjVtuuSXjTOSCfPPNN/HNN9/EgAEDomnTptG1a9c47rjjolmzZkUeqzzq1atX9O7dO+kyimR9e8GXprL8/acgm+o9BwCA0iW8BwCAcirTjPH1LZOcjYLGXLlyZYlfr6zstttuMWzYsLjtttti6NChBS77XJAFCxbEM888E88880y0bds2Lr/88th1110LPKewM/5L04oVK8rsWn/4wx/SBowREePGjSt2eN+hQ4f49ttvszr3yiuvjCFDhhTr+r9X0vt5//TTT3HrrbfGsGHDir30fcQv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ZVIfAADF16pVq4x9mUK/bH311Vdp25s3b17geZmC2mXLlhW7plmzZhV7jOKqVatWnHLKKfH8889HmzZt0h6TSqVizJgxafsyfQ9Hjx5dUiVuUJo1axb7779/2r68vLy4/vrry7iiDdewYcPStufm5sbdd98dDRs2LNb4M2bMyNhX0OznP/zhDxlX28j0kE9Rff3111mdt+bB9N/74osvymyljiTVrVs3unTpsk77tGnTfnMPevHFF9OuCtitW7eM9+yy0KxZs7jkkkviySefjNq1a6c9ZvLkyTFnzpyyLYwNzh/+8Ie07ePHjy+xPeCvu+66aNOmTRx00EFxxhlnxLXXXhv33ntvTJw4ce0xderUyTj7fmN9HwcAoPQJ70vR2LFjIy8vLypXrhznnXdePPfcc+v94+bvrVy5Mh599NHo2bNn7LnnnrHzzjtHp06d4vTTT4+HH34440z5Dz74YO0/xrt27VrgNbp16xZ9+/aNv/zlL1G3bt0i1QcAQHKaNGkS9erVS9uXblZltmbNmhXffvtt2r62bdsWeG66WaARxd+XdunSpcVaCjs/Pz+mTJkSb7/9djz44IPx5JNPFqueWrVqxT//+c+MoWamGXg777xz2vaS/P5F/LJ3+sSJE0vkoYni6tmzZ8a+9957L5566qmyK2YDlin46dKlS8aQuigKesCnoJUx6tatmzE4GzVqVLHrioiMD7usT+vWrdO2L1++vESDtAULFsQXX3wRc+fOLbExS8qxxx6btv2ll15a+/ELL7ywTn9OTk4cc8wxWV1z5cqVMWHChHjllVfiv//9b4wcOTKrcdbYbrvt4rLLLsvYb0YzO+20U9r2pUuXxvjx40vkGl9++WXk5eXF5MmT44MPPognn3wy/v3vf6/zu0em+05Jv49//fXX8cMPPxS4VQ8AABsHe96XoipVqsTxxx8fF1xwQVb7XH3zzTdx0UUXrfMP07lz58aHH34YH374YTz44INxxx13rPNHv1/vI/nrWff5+fkxe/bsWLJkSTRs2DA222yzItcFAMCGY88994zhw4ev0z5s2LC47LLLonLlysW+xtChQ2PVqlVp+3bfffcCz820/HFxl7z//PPPs1p6/5NPPonrr78+fvjhh988CLtmH+biaNGiRWy77bZpl+3NtMJV586d4+GHH16nfdasWTFy5Mjo1KlTsWqKiFi9enWcc845awOHevXqRZMmTaJp06axzz77ZB3YZatjx46x//77x//+97+0/ddff300a9asRD738mrhwoUZg+H1PTBTWG+99VbGvkyv9zX23HPPtAHZ0KFD489//nOxZm/Pnj0764cAdthhh6hXr17abUOef/756Ny5c9Z1/doDDzwQAwYMiIhf7nGNGzeOpk2bRtOmTeOKK64okftutvbZZ59o0KBBzJ49+zftr732Wlx11VXx008/xaeffrrOeR07dizyZINHH300HnrooZgyZcpvlhfv3r17sV+/mVboiCiZlVso33beeefYfPPN027VMWLEiAJXJiqM6dOnxw8//LBOe05Ozjr34M6dO6d9P/v888/j+++/j6222qpYtURELFq0KE4++eRYunRp5OTkRIMGDda+jx9++OEFvl4AACh/zLwvRdddd13ccMMNWQX33333XZxyyikxderUqFSpUpx00klxzz33xNNPPx333HNP/PGPf4xKlSrFtGnTokePHjFp0qTfnL/mD4aVKlWKLbbYIubMmRPXXXdd7LHHHrHPPvvEYYcdFh07dowePXrExx9/XCKfLwAAZe/ggw9O2z5//vy0oX5RrVy5MuNM6KZNm8Y222xT4PmZlj5O90fxonjllVeyOq9Ro0bxzTffrLOC1ZQpU7LeZ/vXqlatmra9Zs2aadv32GOPjH3//e9/i11PxC9fq1/PFPz555/jiy++iBdffDGxbbOuueaajA925OXlxUUXXRRvv/12mdTy4osvxquvvlom1yqsgsLJzTffvNjjjxs3Lj788MOM/emWVP+1I488Mm37Tz/9tHbbuGwNGTJkvQ8PZJKTkxMHHnhg2r4XXnghfvzxx+KUFhG/rBry63vi0qVLY+LEifHWW2/F559/nmhwHxFRsWLFOOqoo9ZpnzZtWowfPz5effXVtMuKZ5qxX5DNNtssfvjhh3X2BX///ffXu1f4+lSrVi1jX40aNYo1NuVfbm5u7Lvvvmn7RowYkfU9ZI0XXngh7etku+22W+cefMABB6R9YCk/Pz/uueeeYtWxxhNPPLH2/TqVSsWsWbPis88+i+HDh0eFChVK5BoAAGw4hPelqDizDS677LJYvHhx1KxZMx577LH429/+Fl26dIlddtklunTpEtdff3089NBDUbly5Vi8eHFcffXVvzl//vz5EfHLP2rHjBkTRxxxRDzxxBO/eSp59erVMWrUqDj11FPjgQceyLpWAACSs99++2Xc+uiWW24p9t7At99+e0yZMiVtX2Fmqjdu3Dht+yeffJJxC6j1mT17dgwdOjSrcxs3bpzx4drHH388qzHXWLlyZcaHElq0aJG2vWrVqhmD0I8++ijt8tZFsWLFivj3v/+dtq9ixYpx2GGHFWv8bDVu3Dj+/Oc/Z+xfsmRJXHDBBfHAAw9ktcJCYUydOjV69eoVF198cbG3cShptWrVytiX6fVYWHl5efH3v/+9wH2h17cs88477xw77rhj2r4bb7wx64dCZs2aFQMHDszq3DWOO+64tO2rV6+OG264odj7YQ8YMCDjqgjr27KurHTv3j1t+1tvvRWvvfbaOu3Vq1ePQw45pMjX2W233dK2l8RDHJmWPs/Jycl4P2XTkumBk+nTp8egQYOyHnfp0qXx0EMPpe1Lt1LNlltuGXvvvXfa44cNG1bsCTM///xzxocAateuHXvttVexxgcAYMMjvN8AjRw5cu3+gxdeeOFvlr3/tfbt20ePHj0iIuLTTz+NL774Ym3fmj8+rVixIs4///xYsGBBnHbaafHCCy/E2LFj4+23344rr7wyqlevHqlUKm6++eZ48cUXS/kzAwCgpFWqVCnOOOOMtH3z58+PK664Iuv9Ud9///148MEH0/ZVr149Y0j2a5n2gl26dGk8/fTTRa4pPz8//vrXvxZr2eRDDz00bfvjjz+edsn7who2bFgsWrRonfaKFStG+/btM5535plnRqVKldL2XX311cXav/fGG2/MuD/0EUcckfHBj7LQs2fPOProozP2r169Om6++ebo3r17fPLJJyV23e+//z6uvfbaOPTQQ9MGmRuCatWqZVyR4dVXX816VmkqlYq//e1v691TfsWKFesd69xzz03bPm3atLjhhhuKXFt+fn5ce+21sXDhwiKf+2u77LJL7LHHHmn73nnnnbjzzjuzHvvjjz/OeE+sWbNmdOvWLeuxS9I222yTdnuF4cOHp10y/9BDD824EkZBGjdunPEef/PNN2f9gFbEL0vyp7P99tsX+HALm4499tgjtt9++7R9/fv3X2eFysK68847Y9asWeu0V6lSJeM2M5nuh6tXr44+ffrEzJkzs6olPz8/rrzyyrS/W0REnHzyyVGxoh1RAQA2NsL7DdCvn1Bf3xO0v14m7Nf7Aq75Y+bSpUtj/vz50bdv37j66qtj2223jcqVK8eWW24ZZ5xxRjz44INr/1DYr1+/Qv2RBgCADcupp54ajRo1Stv33nvvxYUXXljkEOXNN9+M888/P+PSx3/6058KFfx27NgxNttss7R9//nPf4q0VP3KlSvjiiuuiHfeeafQ56Rz8sknp11mNi8vLy644IKs/sg+YcKEuOWWW9L27bPPPgV+rZo1axYnnnhi2r6lS5fGaaedltXMvbvuuiuefPLJtH2VKlWKP/3pT0Ues6TdcMMN0bFjxwKPGTduXJx88slx4oknxogRI7J6cGPJkiUxfPjwOOuss+Kwww6LJ598cr1Lw+fm5sYJJ5xQ5GuVlA4dOqRtnzx58tr91oti0aJF0adPn3jmmWfWe2xhViI47LDDMj5o/uyzzxYpwF+9enVcfvnlxZ6tvcall16acSnpu+66K/71r38VeQb+l19+Gb179874c3POOedk3CYkCelmJY8fPz7tgx+ZZuoXxqmnnpq2ffLkydGnT5/1vs7SGT58eDz//PNp+wr7gMRpp50WrVq1SvtfQVtGUH7k5OTExRdfnLZv2bJl0aNHj5g4cWKRxnz66aczrkx5wgknZHyNd+jQIeO+87Nnz46TTz65yA8Hrl69Oq677rqMv/PUqVMnzjrrrCKNCQBA+SC83wCNGzdu7cdHHXVUxn9wtmrV6jf/UJ48efLaj3+912anTp3i+OOPT3uttm3brp0xNXPmzPjggw9K+tMBAKCUVa9ePfr27Rs5OTlp+999993o1q1boX7XW7RoUfTt2zcuuuiijDP2d9lllzjttNMKVVvlypWjS5cuafsWL14cp59+eqGC6U8++SSOP/74GDZsWKGuW5CmTZvG4YcfnrZvypQp0b1793jjjTcKPd7rr78ep5122m+2qFojJycnLrjggvWOcfHFF0ezZs3S9s2fPz969uwZt912W8bZd782a9as+POf/xx33HFHxmPOOeecaNq06XrHKm2VK1eOu+++u1DL/n722WdxySWXxO677x5nn3123HvvvfHWW2/F5MmTY968eZGXlxcrV66MefPmxYQJE+L111+P/v37R8+ePWPPPfeMSy+9NN57771ChbYNGjSIBx98MM4///yS+DSzkmnv9ohfZob279+/UPuK5+XlxXPPPRdHHHFEvPzyy4W69ppt2Nanb9++Gfd4f/jhh+Oss86K6dOnFzjGDz/8ED179ozhw4cX6pqF0bp164wrkkREDBw4MHr27Blff/31esdavXp1PPLII3HaaadlXC5/q622itNPPz3rekvDEUccUeC+8Wu0aNEi44MihXH44YdnvJe8+eabcfLJJxd69ZBVq1bF3XffHVdccUXa/gYNGmT82wabpi5dumRcTWf27Nlx0kknxWOPPbbe7VcWL14cN9544zpbUq6x5ZZbRp8+fQoc429/+1tsvvnmafumTp0aJ554Ytx///2FmjTz/fffx5lnnhlPPfVUxmMuvfTSqFGjxnrHAgCg/LG20gZo3rx5WZ336z8W/voX+IMPPrjA8/bff/+1+3uOGTMm9ttvv6yuDwBAcvbee+/405/+FLfffnva/u+//z7OOOOMaNu2bRxyyCHRvn372GKLLaJatWoxZ86cmDx5crzxxhvx+uuvpw2h19hyyy3jrrvuKtIyrRdeeGG8/PLLaYPG2bNnx6mnnhpdunSJrl27xk477RR169aNvLy8+Omnn2LMmDHx4osvpl02/YADDoi33nqrUAHm7/31r3+N999/P20YN3v27Ljwwgtj2223jSOOOCLatGkTzZs3X/s79uLFi2Pq1KkxduzYePHFFwsMAE844YSMs5N/bbPNNou77rorTjrppLSznvPy8mLAgAHxxBNPxAEHHBD77rtvbLXVVlGvXr3IycmJefPmxbhx49buaV1QOLDnnntG796911tTWalZs2bce++9cf3112dcKeDXVqxYEe+++268++67pVLP0UcfHVdddVXUqVOnVMYvrKOOOioGDBiQcY/7O++8M55//vk49thjY9ddd41mzZpFjRo1YsWKFWsfYPjoo4/i9ddfj9mzZ6cdo3bt2mmD+p9++qlQNW6//fZx5ZVXxvXXX5+2/7333ovDDz88Dj744DjssMOiZcuWUadOnfj555/ju+++i5deeilee+21dR4UqlGjRixevLhQNWRy8cUXx1dffRUjR45M2z9q1Kg45phjYs8994wuXbpE27Zto379+lGjRo1YtGhR/PDDDzF69Oh4/vnnC3wAoXr16tG/f/9CBeVlqUaNGnHQQQet94GnTMuAF1blypXjH//4R/To0SPtgzFffPFFHHXUUdGpU6fYf//9o3Xr1rHFFltEjRo1Ii8vLxYtWhQTJ06MTz/9NEaMGFHgyidXXXVVxpVc2HTdcMMN8e2338b333+/Tt/ChQvj73//ewwePDgOO+yw2GuvvWLLLbeMWrVqxcKFC+PHH3+M999/P5577rmMDy1VqFAh+vbtu96gvGHDhnHbbbfFueeem3aFi8WLF8ctt9wSgwYNioMPPjj23nvvaNasWdStWzfy8/Njzpw58eWXX8brr78e77zzToHboxx77LGF2roIAIDySXi/AVrzC3rlypULfMr29379D4kGDRqs/XjLLbcs8LzGjRuv/TjbBwcAAEjehRdeGAsXLsy4J3PELw9rrm+/60yaNGkSAwcOjC222KJI52277bbxxz/+MR577LG0/alUKt58880iLZm9/fbbxy233BK77bZbkWpZo27dutGvX7+46KKLMi7rPHHixIwPQxRG27ZtM87iS6dVq1YxYMCAOO+882Lp0qVpj5k/f348++yz8eyzz2ZV04477hi33npr5OZuWIuwVaxYMa6//vpo37593HzzzRlnOJemrbfeOq655prYc889y/za6VSuXDmuvvrqOP/88zOuFjB58uT4z3/+U+Sxc3Nzo0+fPtG4ceO49NJL1+kvyj3ilFNOiVmzZmVcyn/ZsmXx/PPPZ1wG/fdycnLimmuuyTj7urAqVqwY/fv3j3POOSftPu8Rv9x73n///Xj//fezukbVqlXjtttui2233bY4pZaa7t27Fxje5+bmFnoZ+oLsvvvucd5552X8GUilUvHBBx8Ua6W/Hj16xBFHHJH1+Wy8atasGQMHDowePXrEtGnT0h7zww8/xN133x133313kcbOycmJG2+8MfbZZ59CHb/XXnvFP//5z7jssssyhu+zZs2KRx55JB555JEi1bJG586d429/+1tW5wIAUD5sWH+xKWUTJkyIvn37xmGHHRbt2rWLNm3axOGHHx433XRTzJgxI+ny1lqzh9bKlSujYcOGscMOOxTqv18vs9mqVau1Hxc0c2rNddaoVatWyX4yAACUqSuvvDKuuOKKIs2ML4x27drFE088Edtss03WdWUbtP/ejjvuGA8++GCxl4vdd9994z//+U9UqlSpROr6tT322CPuv//+jEuKZ7LbbrvFww8/HE2aNCnxmvbaa694+OGHE59RXpBu3brFSy+9FCeccEKZPWDQqFGjuOGGG2LEiBEbTHC/RpcuXeLKK68s0TGbNGkSDz30UJx33nmx/fbbpz3mo48+KnDW5+9dfPHF8ec//7lEvmdXX311obZRKIwaNWrEAw88UCqhb+3atWPQoEEZtwXZEOy+++4Fbo+x5557RqNGjUrkWhdffHGp7b991llnxV//+tdSGZuNQ7NmzeLRRx+NnXbaqcTGrFy5cvTt27fIq1Mcfvjhcc8996z9215J6tatWwwYMCCqVKlS4mMDALDh2GTC+//+97/RrVu3eOSRR+K7776LpUuXxvLly2PSpEkxaNCg6Nq1a7z99ttJlxkREdttt93aj0eNGlXgsZMmTYq77747hg0bFj/88MPa9rZt2679ON0So782YcKEtR9vCPteAgBQPGeeeWY89thjscMOOxR7rBo1asRVV10Vjz32WJFn3P9alSpV4v77749TTjklcnJysh7nmGOOicceeyzq1q2b9Ri/duCBB8Zjjz2WMcQsqmrVqsUll1xSrIcLdt555xgyZEiJBdg1atSIv/71rzFw4MBysT9u7dq1o2/fvvHKK6/EaaedFtWrVy+V67Rp0yb+9a9/xWuvvRbHH398VKhQoVSuU1w9e/aMf/zjH8X+OlSuXDnOPvvsGD58eHTs2DEiIrbZZpto2LDhOscuWbIk/ve//xVp/AsvvDDuvffe9a78lkmlSpXiH//4R5x66qlZnZ9JtWrV4tZbb41+/fpFvXr1SmTMQw89NIYNGxbt2rUrkfFKS05OToHB47HHHlui17v88svjn//8Z4ndn7fccssYMGBAXH755SUyHhu3Ro0axeOPPx5nnnlmsR9g3GabbeLpp5+O448/PqvzO3fuHMOGDVvvNpaFVb9+/bjlllvi5ptvLpUHDgEA2LBsEuF9//794/bbb49Vq1ZFnTp14pJLLolHHnkkBg0aFCeeeGLk5ubG4sWL409/+lNMmjQp6XJj7733XvvxQw89lHGJxIhfPrf//Oc/cdlll/1macNOnTqtXTr/pZdeijlz5mQcY8iQIRHxyz5e+++/fzGrBwBgQ9CmTZt49tln49///ne0bt26yOdvueWW8ec//zneeuut6NmzZ4mEyJUrV45rr702nnrqqdh3332LFOK3a9cuBg8eHP369SvxvaV32WWXePbZZ6Nv377Rpk2brMaoV69enHXWWfH666/HueeeW+yv1+abbx59+/Zdu6d5Np9zgwYN4txzz42XXnopevToscGG05k0b948rr766nj77bfjhhtuiP3337/YAfZ2220XvXr1ihEjRsRTTz0VRx55ZLkIQrp37x5DhgyJo446qsj11q5dO84444x49dVX47LLLvvNnuEFLZv+wAMPFLnOvffeO15++eXo3bt3kYLyzp07x/PPPx/du3cv8jUL65hjjln7NcjmofVKlSrFIYccEg899FDcfvvtaR962BAdc8wxae9HtWrVigMPPLDEr3fUUUfFSy+9FL169cp6csC2224bV199dbz22mux3377lXCFbMyqVKkSV1xxRQwfPjyOPfbYqFq1apHOb9myZfTt2zeGDh1a7If6GjZsGHfeeWc8/vjjcfDBB2f1XtO8efPo06dPvPzyy3H00UcXqx4AAMqPnFRByfBG4Ouvv47jjjsuVq1aFU2aNInBgwf/Znn5iIgnn3wyrr322oiIOOSQQ+KOO+4otXo+/PDDOP300yMi4vzzz4+LL754nWNWr14dhx9++NqZ9GeffXZcdtll6xw3bNiwuPzyyyOVSsUWW2wRr7/++m+WznrwwQejX79+EfFLmH/XXXf95g81ERGDBw+Of/zjHxHxy+yB4uzpCQDAhuuHH36Id999Nz777LP4/vvvY8aMGbFkyZLIz8+PGjVqxOabbx7bbLNN7LjjjrH33ntHmzZtijVDvjCmTZsWr732WowePTomTpwYs2bNiuXLl0fVqlWjTp06sdVWW0X79u3jgAMOKLGZ8YXx/fffx0cffRTjxo2Lb7/9NubMmROLFy+OxYsXR8QvM3nr1q0bLVu2jB133DF222236NixY4lvVfBry5Yti/fffz8++eST+Prrr2Pq1Kkxd+7cWLFiRVSoUCFq1aoVtWrVihYtWkTr1q2jXbt2sdtuu5W7wH59Vq5cGZ9++ml8++23MWHChJg4cWLMmzdv7fcnLy8vqlatGtWrV4/69etH8+bNo2XLltG6devYddddS2xGcJJmz54db731Vnz22Wcxbty4mDt3bixatChWrFgRVatWjXr16kXz5s1j5513jt122y123333An82ly5dGrNnz16nPScnJ5o1a5b1fSAvLy/efvvtGDlyZHz++ecxY8aMWLBgQeTk5MTmm28eW2+9dXTo0CEOOeSQ32z7VlbGjh0bI0eOjC+//DJ++OGHmDlzZixZsiRSqVTUqFEjatasGVtssUXstNNO0bp16+jcufNG8fNTllKpVHz22Wfx+eefx7hx42LixImxYMGCWLRoUSxZsiQqVKgQ1atXjy233DJatmwZbdq0iT333LNM7/dlaeHChTF48OC0fWteq5SsxYsXxzvvvBOjR4+Ob775JqZOnRoLFy6MvLy8qFmzZtSuXTuaNGkSHTp0iN133z3atWtXalu2LFy4MN5999349NNPY/z48TFt2rSYN29erFixIipXrhw1a9Zce2/cZZddon379tGuXbtS/10MAIANz0Yf3l9wwQXxv//9L3JycuKpp56KXXbZJe1xRx55ZIwfPz4qVaoUH3/8cZGfzi2swoT3ERFffPFFnHLKKWv3o+/YsWOccMIJ0aJFi5gzZ068/vrr8fzzz8fq1asjJycnBgwYsM5ee/n5+XHGGWesXXq/RYsW0aNHj9hhhx1i0aJFMWzYsBgxYkRERNStWzdGjBhRYssIAgAAAAAAAFB4pTc1ZAMwb968ePfddyPilxn1mYL7iIizzjorPvnkk6hTp04sXbq01ML7wtpll13iwQcfjD59+sTs2bNj9OjRMXr06HWOq169elx//fXrBPcRvyyBeM8998QVV1wRL7/8cvz4449x/fXXr3Ncy5Yt46677hLcAwAAAAAAACRkow7vP/jgg8jLy4uIiK5duxZ4bLdu3TLu9ZeUDh06xKuvvhpPP/10/O9//1u7xFzlypWjRYsW0blz5zj55JOjUaNGGceoWrVq3H777fHBBx/Es88+G59++mnMmTMnatasGS1atIiuXbtGt27d1llOHwAAAAAAAICys1Evm//vf/877r333oiIeOedd6Jhw4YR8cty8rNnz44lS5ZEw4YNBdcAAAAAAAAAJGqjnnk/YcKEiIioVKlSbLHFFjFnzpy4884746WXXooFCxZERESFChWiY8eO0bt37+jQoUOS5QIAAAAAAACwicpNuoDSNH/+/IiIqFGjRowZMyaOOOKIeOKJJ9YG9xERq1evjlGjRsWpp54aDzzwQEKVAgAAAAAAALAp26jD+yVLlkRExIoVK+L888+PBQsWxGmnnRYvvPBCjB07Nt5+++248soro3r16pFKpeLmm2+OF198MeGqAQAAAAAAANjUbNR73h944IExZcqUtf//hhtuiOOPP36d48aMGROnnnpq5OXlRcOGDeO1116LKlWqZHXNVCoVOTk5WdcMAAAAAAAAwKZno97zvmrVqms/7tSpU9rgPiKibdu2cdxxx8Xjjz8eM2fOjA8++CD222+/rK6Zn5+KhQuXZnUuAAAAAAAAABuPWrWqRYUKhVsQf6MO72vUqLH244MPPrjAY/fff/94/PHHI+KXmfjZhvcREatW5Wd9LgAAAAAAAACbno16z/sGDRqs/XjLLbcs8NjGjRuv/XjevHmlVhMAAAAAAAAA/N5GHd63atVq7ccLFiwo8NiVK1eu/bhWrVqlVhMAAAAAAAAA/N5GHd63bdt27ceffPJJgcdOmDBh7cdNmzYtrZIAAAAAAAAAYB0bdXjfqVOntUvnv/TSSzFnzpyMxw4ZMiQiIipUqBD7779/mdQHAAAAAAAAABEbeXhfoUKFOOussyIiYvHixXHppZfGkiVL1jlu8ODBMXLkyIiIOOigg2KLLbYo0zoBAAAAAAAA2LTlpFKpVNJFlKb8/Pw444wzYtSoURER0aJFi+jRo0fssMMOsWjRohg2bFiMGDEiIiLq1q0bI0aMiHr16mV9vdWr82Pu3HUfEAAAAAAAAABg01K37mZRoULh5tRv9OF9RMTy5cvjiiuuiJdffjnjMS1btoy77rortt1222JdS3gPAAAAAAAAQITwPqMPPvggnn322fj0009jzpw5UbNmzWjRokV07do1unXrFptttlmxryG8BwAAAAAAACBCeJ8o4T0AAAAAAAAAEUUL7wt3FAAAAAAAAABQaoT3AAAAAAAAAJAw4T0AAAAAAAAAJEx4DwAAAAAAAAAJE94DAAAAAAAAQMKE9wAAAAAAAACQMOE9AAAAAAAAACRMeA8AAAAAAAAACRPeAwAAAAAAAEDChPcAAAAAAAAAkDDhPQAAAAAAAAAkTHgPAAAAAAAAAAkT3gMAAAAAAABAwoT3AAAAAAAAAJAw4T0AAAAAAAAAJEx4DwAAAAAAAAAJE94DAAAAAAAAQMKE9wAAAAAAAACQMOE9AAAAAAAAACRMeA8AAAAAAAAACRPeAwAAAAAAAEDChPcAAAAAAAAAkDDhPQAAAAAAAAAkTHgPAAAAAAAAAAkT3gMAAAAAAABAwoT3AAAAAAAAAJAw4T0AAAAAAAAAJEx4DwAAAAAAAAAJE94DAAAAAAAAQMKE9wAAAAAAAACQMOE9AAAAAAAAACRMeA8AAAAAAAAACRPeAwAAAAAAAEDChPcAAAAAAAAAkDDhPQAAAAAAAAAkTHgPAAAAAAAAAAkT3gMAAAAAAABAwoT3AAAAAAAAAJAw4T0AAAAAAAAAJEx4DwAAAAAAAAAJE94DAAAAAAAAQMKE9wAAAAAAAACQMOE9AAAAAAAAACRMeA8AAAAAAAAACRPeAwAAAAAAAEDChPcAAAAAAAAAkDDhPQAAAAAAAAAkTHgPAAAAAAAAAAkT3gMAAAAAAABAwoT3AAAAAAAAAJAw4T0AAAAAAAAAJEx4DwAAAAAAAAAJE94DAAAAAAAAQMKE9wAAAAAAAACQMOE9AAAAAAAAACRMeA8AAAAAAAAACRPeAwAAAAAAAEDChPcAAAAAAAAAkDDhPQAAAAAAAAAkTHgPAAAAAAAAAAkT3gMAAAAAAABAwoT3AAAAAAAAAJAw4T0AAAAAAAAAJEx4DwAAAAAAAAAJE94DAAAAAAAAQMKE9wAAAAAAAACQMOE9AAAAAAAAACRMeA8AAAAAAAAACRPeAwAAAAAAAEDCKiZdAAAAAAAAAMCmJJVKxYoVK5Iu4/+X+v//NyfRKtaoUqVK5ORsGLWUNeE9AAAAAAAAQBlJpVLRt+81MWHCt0mXskHabrtWcfXVfTfJAN+y+QAAAAAAAABlaBPMpSmEnFQqlVr/YRTW6tX5MXfukqTLAAAAAAAAADZQG8qy+StWLI9evc6JiIj+/QdGlSpVE65o41s2v27dzaJChcLNqbdsPgAAAAAAAEAZysnJiapVkw/Kf61KlaobXE2bGsvmAwAAAAAAAEDChPcAAAAAAAAAkDDhPQAAAAAAAAAkTHgPAAAAAAAAAAkT3gMAAAAAAABAwoT3AAAAAAAAAJAw4T0AAAAAAAAAJEx4DwAAAAAAAAAJE94DAAAAAAAAQMKE9wAAAAAAAACQMOE9AAAAAAAAACRMeA8AAAAAAAAACRPeAwAAAAAAAEDChPcAAAAAAAAAkDDhPQAAAAAAAAAkTHgPAAAAAAAAAAkT3gMAAAAAAABAwoT3AAAAAAAAAJAw4T0AAAAAAAAAJEx4DwAAAAAAAAAJE94DAAAAAAAAQMKE9wAAAAAAAACQMOE9AAAAAAAAACRMeA8AAAAAAAAACRPeAwAAAAAAAEDChPcAAAAAAAAAkDDhPQAAAAAAAAAkTHgPAAAAAAAAAAkT3gMAAAAAAABAwoT3AAAAAAAAAJAw4T0AAAAAAAAAJEx4DwAAAAAAAAAJE94DAAAAAAAAQMKE9wAAAAAAAACQMOE9AAAAAAAAFMOnn34cffpcEJ9++nHSpQDlmPAeAAAAAAAAsrRixYoYNGhg/PzznBg0aGCsWLEi6ZKAckp4DwAAAAAAAFkaPnxIzJ8/LyIi5s+fFyNGDEm4IqC8Et4DAAAAAABAFmbOnBEjRgyNVCoVERGpVCqGDx8aM2fOSLgyoDwS3gMAAAAAAEARpVKpGDz4/rXB/fraAdZHeA8AAAAAAABFNH36tBg79vPIz8//TXt+fn6MHft5TJ8+LaHKgPJKeA8AAAAAAABF1Lhxk2jduk3k5v42bsvNzY3WrdtG48ZNEqoMKK+E9wAAAAAAAFBEOTk50aPHWZGTk1OodoD1Ed4DAAAAAABAFho2bBRdu3ZbG9Tn5OTEkUd2i4YNt0y4MqA8Et4DAAAAAABAlo488pioXbtORETUqVM3unY9JuGKgPJKeA8AAAAAAABZqlKlSuy9936Rm5sbnTt3iSpVqiRdElBOCe8BAAAAAAAgSytWrIh3330z8vPz491334wVK1YkXRJQTgnvAQAAAAAAIEvDhw+J+fPnRUTE/PnzYsSIIQlXBJRXwnsAAAAAAADIwsyZM2LEiKGRSqUiIiKVSsXw4UNj5swZCVcGlEfCewAAAAAAACiiVCoVgwffvza4X187wPoI7wEAAAAAAKCIpk+fFmPHfh75+fm/ac/Pz4+xYz+P6dOnJVQZUF4J7wEAAAAAAKCIGjduEq1bt4nc3N/Gbbm5udG6ddto3LhJQpUB5ZXwHgAAAAAAAIooJycnevQ4K3JycgrVDrA+wnsAAAAAAADIQsOGjaJr125rg/qcnJw48shu0bDhlglXBpRHwnsAAAAAAADI0pFHHhO1a9eJiIg6depG167HJFwRUF4J7wEAAAAAACBLVapUiZ49z4l69epHjx5nR5UqVZIuCSinKiZdAAAAAAAAAJRn7dt3iPbtOyRdBlDOmXkPAAAAAAAAAAkT3gMAAAAAAABAwoT3AAAAAAAAAJAw4T0AAAAAAAAAJEx4DwAAAAAAAAAJE94DAAAAAAAAQMKE9wAAAAAAAACQMOE9AAAAAAAAACRMeA8AAAAAAAAACRPeAwAAAAAAAEDChPcAAAAAAAAAkDDhPQAAAAAAAAAkTHgPAAAAAAAAAAkT3gMAAAAAAABAwoT3AAAAAAAAAJAw4T0AAAAAAAAAJEx4DwAAAAAAAAAJE94DAAAAAAAAQMKE9wAAAAAAAACQMOE9AAAAAAAAACRMeA8AAAAAAAAACRPeAwAAAAAAAEDChPcAAAAAAAAAkDDhPQAAAAAAAAAkTHgPAAAAAAAAAAkT3gMAAAAAAEAxfPrpx9GnzwXx6acfJ10KUI4J7wEAAAAAACBLK1asiEGDBsbPP8+JQYMGxooVK5IuCSinhPcAAAAAAACQpeHDh8T8+fMiImL+/HkxYsSQhCsCyivhPQAAAAAAAGRh5swZMWLE0EilUhERkUqlYvjwoTFz5oyEKwPKI+E9AAAAAAAAFFEqlYrBg+9fG9yvrx1gfYT3AAAAAAAAUETTp0+LsWM/j/z8/N+05+fnx9ixn8f06dMSqgwor4T3AAAAAAAAUESNGzeJ1q3bRG7ub+O23NzcaN26bTRu3CShyoDySngPAAAAAAAARZSTkxM9epwVOTk5hWoHWB/hPQAAAAAAAGShYcNG0bVrt7VBfU5OThx5ZLdo2HDLhCsDyiPhPQAAAAAAAGTpyCOPidq160RERJ06daNr12MSrggor4T3AAAAAAAAkKUqVapEz57nRL169aNHj7OjSpUqSZcElFMVky4AAAAAAAAAyrP27TtE+/Ydki4DKOfMvAcAAAAAAACAhAnvAQAAAAAAACBhwnsAAAAAAAAASNgmsef922+/Heeee26hju3cuXPcf//9pVwRAAAAAAAAAPw/m8TM+2+++SbpEgAAAAAAAAAgo01i5v24ceMiIqJ+/fpx3333FXhsjRo1yqIkAAAAAAAAAFhrkwjvv/7664iI2HHHHWOHHXZIuBoAAAAAAAAA+K2Nftn8xYsXx+TJkyPil/AeAAAAAAAAADY0G314/80330QqlYqIMOseAAAAAAAAgA3SRh/er9nvPiJip512SrASAAAAAAAAAEhvo9/zfs1+9zVr1ozVq1fHTTfdFO+9915MmTIlKlasGC1atIgDDjggTj/99KhVq1bC1QIAAAAAAACwKdrow/s1M+/z8vKia9eukZeXt7ZvxYoVMW7cuBg3blw88sgjceedd0bHjh2TKhUAAAAAAACATdRGHd6vXLkyJk2aFBERy5cvj5o1a0bPnj1j9913j1q1asX3338fzz77bHz00Ucxb968OOuss+Kxxx6LnXfeOeHKAQAAAAAAANiUbNTh/YQJE9bOtG/ZsmXcf//90bRp07X9bdq0iW7dusW///3vuPfee2PFihVx+eWXx4gRIyI3Nzfr61asmP25AAAAAAAAAGXh17lmxYq5cs6E5aRSqVTSRZSW1atXx7Rp02Lq1KnRvHnz3wT3v5ZKpeKkk06Kzz77LCIi7r777th///2zumYqlYqcnJysawYAAAAAAAAoC8uXL49u3bpFRMTQoUOjatWqyRa0iduoZ95XqFAhmjdvHs2bNy/wuJycnPjjH/+4Nrz/4IMPsg7v8/NTsXDh0qzOBQAAAAAAACgry5cvX/vxvHlLomrV1QlWs3GqVataVKhQuBUNNurwvih22GGHtR9PmzatWGOtWpVf3HIAAAAAAAAAStWvc81Vq/LlnAmzacH/79dLQKxcuTLBSgAAAAAAAADY1GzUM+/HjRsXU6dOjZ9//jm6desW1apVy3jszz//vPbj+vXrl0V5AAAAAAAAABARG3l4P3DgwHjxxRcjIqJly5bRqVOnjMd+8sknaz/eZZddSr02AAAAAAAAAFhjo142f4899lj78dChQzMet2zZsnjiiSciIqJSpUpx8MEHl3ZpAAAAAAAAALDWRh3eH3744VG7du2IiBg2bFi8/vrr6xyTl5cXV1xxRUybNi0iIk4++eRo0KBBWZYJAAAAAAAAwCZuo142v2bNmnHdddfFX/7yl8jPz48//elPcfzxx8fBBx8cNWrUiPHjx8dDDz0U48ePj4hflsu/+OKLE64aAAAAAAAAgE3NRh3eR/wy+37lypXxt7/9be3y+GuWyP+1zp07x2233RbVqlVLoEoAAAAAAAAANmUbfXgfEdGtW7fYfffd49FHH4333nsvJk+eHCtXroz69evHLrvsEkcffXQccMABSZcJAAAAAAAAwCYqJ5VKpZIuYmOyenV+zJ27JOkyAAAAAAAAAAq0fPnyOOec0yIiYuDAh6Nq1aoJV7TxqVt3s6hQIbdQxxbuKAAAAAAAAACg1AjvAQAAAAAAACBhwnsAAAAAAAAASJjwHgAAAAAAAAASJrwHAAAAAAAAgIQJ7wEAAAAAAAAgYcJ7AAAAAAAAAEiY8B4AAAAAAAAAEia8BwAAAAAAAICECe8BAAAAAAAAIGHCewAAAAAAAABImPAeAAAAAAAAABImvAcAAAAAAACAhAnvAQAAAAAAACBhwnsAAAAAAAAASJjwHgAAAAAAAAASJrwHAAAAAAAAgIQJ7wEAAAAAAAAgYcJ7AAAAAAAAAEiY8B4AAAAAAAAAEia8BwAAAAAAAICECe8BAAAAAAAAIGHCewAAAAAAAABImPAeAAAAAAAAABImvAcAAAAAAACAhAnvAQAAAAAAACBhwnsAAAAAAAAASJjwHgAAAAAAAAASJrwHAAAAAAAAgIQJ7wEAAAAAAAAgYcJ7AAAAAAAAAEiY8B4AAAAAAAAAEia8BwAAAAAAAICECe8BAAAAAAAAIGHCewAAAAAAAABImPAeAAAAAAAAABImvAcAAAAAAACAhAnvAQAAAAAAACBhwnsAAAAAAAAASJjwHgAAAAAAAAASJrwHAAAAAAAAgIQJ7wEAAAAAAAAgYcJ7AAAAAAAAAEiY8B4AAAAAAAAAEia8BwAAAAAAAICECe8BAAAAAAAAIGHCewAAAAAAACiGTz/9OPr0uSA+/fTjpEsByjHhPQAAAAAAAGRpxYoVMWjQwPj55zkxaNDAWLFiRdIlAeWU8B4AAAAAAACyNHz4kJg/f15ERMyfPy9GjBiScEVAeSW8BwAAAAAAgCzMnDkjRowYGqlUKiIiUqlUDB8+NGbOnJFwZUB5JLwHAAAAAACAIkqlUjF48P1rg/v1tQOsj/AeAAAAAAAAimj69GkxduznkZ+f/5v2/Pz8GDv285g+fVpClQHllfAeAAAAAAAAiqhx4ybRunWbyM39bdyWm5sbrVu3jcaNmyRUGVBeCe8BAAAAAACgiHJycqJHj7MiJyenUO0A6yO8BwAAAAAAgCw0bNgounbttjaoz8nJiSOP7BYNG26ZcGVAeSS8BwAAAAAAgCwdeeQxUbt2nYiIqFOnbnTtekzCFQHllfAeAAAAAAAAslSlSpXo2fOcqFevfvTocXZUqVIl6ZKAcqpi0gUAAAAAAABAeda+fYdo375D0mUA5ZyZ9wAAAAAAAACQMOE9AAAAAAAAACRMeA8AAAAAAAAACRPeAwAAAAAAAEDChPcAAAAAAAAAkDDhPQAAAAAAAAAkTHgPAAAAAAAAAAkT3gMAAAAAAABAwoT3AAAAAAAAAJAw4T0AAAAAAAAAJEx4DwAAAAAAAAAJE94DAAAAAAAAQMKE9wAAAAAAAACQMOE9AAAAAAAAACRMeA8AAAAAAAAACRPeAwAAAAAAAEDChPcAAAAAAAAAkDDhPQAAAAAAAAAkTHgPAAAAAAAAAAkT3gMAAAAAAABAwoT3AAAAAAAAAJAw4T0AAAAAAAAUw6effhx9+lwQn376cdKlAOWY8B4AAAAAAACytGLFihg0aGD8/POcGDRoYKxYsSLpkoBySngPAAAAAAAAWRo+fEjMnz8vIiLmz58XI0YMSbgioLwS3gMAAAAAAEAWZs6cESNGDI1UKhUREalUKoYPHxozZ85IuDKgPBLeAwAAAAAAQBGlUqkYPPj+tcH9+toB1qdi0gUAAAAAAABAUaVSqUT3l58xY1qMHfv5Ou35+fkxduzn8cMP30WjRk0SqCyiSpUqkZOTk8i1gewJ7wEAAAAAAChXUqlU9O17TUyY8G3SpWR07bVXJnbt7bZrFVdf3VeAD+WMZfMBAAAAAAAod+TSwMbGzHsAAAAAAADKlZycnLj66r6JLpu/xrPPPhEvv/xCRPxS1xFHHB1HH9090Zosmw/lk/AeAAAAAACAcicnJyeqVq2adBnRtesxa8P72rXrRLdux0WVKlUSrgoojyybDwAAAAAAAFn6dVB/yik9BPdA1oT3AAAAAAAAUALatGmfdAlAOSa8BwAAAAAAAICECe8BAAAAAAAAIGHCewAAAAAAAABImPAeAAAAAAAAABImvAcAAAAAAACAhAnvAQAAAAAAACBhwnsAAAAAAAAASJjwHgAAAAAAAAASJrwHAAAAAAAAgIQJ7wEAAAAAAAAgYcJ7AAAAAAAAAEiY8B4AAAAAAAAAEia8BwAAAAAAAICECe8BAAAAAAAAIGHCewAAAAAAAABImPAeAAAAAAAAABImvAcAAAAAAACAhAnvAQAAAAAAACBhwnsAAAAAAAAASJjwHgAAAAAAAAASJrwHAAAAAAAAgIQJ7wEAAAAAAAAgYcJ7AAAAAAAAAEiY8B4AAAAAAAAAEia8BwAAAAAAAICECe8BAAAAAAAAIGHCewAAAAAAAABImPAeAAAAAAAAABImvAcAAAAAAACAhAnvAQAAAAAAACBhwnsAAAAAAAAASJjwHgAAAAAAAAASJrwHAAAAAAAAgIQJ7wEAAAAAAAAgYcJ7AAAAAAAAAEiY8B4AAAAAAAAAEia8BwAAAAAAAICECe8BAAAAAAAAIGHCewAAAAAAAABImPAeAAAAAAAAABImvAcAAAAAAACAhAnvAQAAAAAAACBhwnsAAAAAAAAASJjwHgAAAAAAAAASJrwHAAAAAAAAgIQJ7wEAAAAAAAAgYcJ7AAAAAAAAAEiY8B4AAAAAAAAAEia8BwAAAAAAAICECe8BAAAAAAAAIGHCewAAAAAAAABImPAeAAAAAAAAABImvAcAAAAAAACAhAnvAQAAAAAAACBhwnsAAAAAAAAASJjwHgAAAAAAAAASJrwHAAAAAAAAgIQJ7wEAAAAAAAAgYcJ7AAAAAAAAAEiY8B4AAAAAAAAAEia8BwAAAAAAAICECe8BAAAAAAAAIGHCewAAAAAAAABImPAeAAAAAAAAABImvAcAAAAAAACAhAnvAQAAAAAAACBhwnsAAAAAAAAASJjwHgAAAAAAAAASJrwHAAAAAAAAgIQJ7wEAAAAAAAAgYcJ7AAAAAAAAAEiY8B4AAAAAAAAAEia8BwAAAAAAAICECe8BAAAAAAAAIGHCewAAAAAAAABImPAeAAAAAAAAABImvAcAAAAAAACAhAnvAQAAAAAAACBhm3R4v3Dhwth7772jVatWcemllyZdDgAAAAAAAACbqE06vO/bt2/MmjUr6TIAAAAAAAAA2MRtsuH966+/HsOGDUu6DAAAAAAAAADYNMP7uXPnxnXXXZd0GQAAAAAAAAAQEZtoeP/3v/895syZE3Xr1k26FAAAAAAAAADY9ML7F198MV5++eXIzc2Nq6++OulyAAAAAAAAAGDTCu/nzJkT119/fURE9OzZM9q0aZNwRQAAAAAAAACwiYX31113XcybNy+22mqr6NOnT9LlAAAAAAAAAEBEbELh/dChQ+P111+P3NzcuOmmm6JKlSpJlwQAAAAAAAAAEbGJhPczZ86MG2+8MSJ+WS6/Xbt2CVcEAAAAAAAAAP9PxaQLKAtXX311LFy4MFq2bBl//vOfS/16FStuEs9EAAAAAAAAbPJ+nQtVrJgrJ6Jc8fO7Ydnow/unn3463nnnnbXL5VetWrVUr5ebmxN16mxWqtcAAAAAAABgw7B8eYW1H9eps1mpZ1FQkvz8blg26vB++vTp0a9fv4iI6NGjR7Rv377Ur5mfn4qFC5eW+nUAAAAAAABI3vLly9d+PG/ekqhadXWC1UDR+PktfbVqVYsKFQq3osFGG96nUqn4v//7v1i8eHG0bNky+vTpU2bXXrUqv8yuBQAAAAAAQHJ+nQutWpUvJ6Jc8fO7Ydlow/snn3wyPvjgg4iIOP300+P7779f55hZs2at/XjhwoXx9ddfR0RE/fr1o0GDBmVTKAAAAAAAAACbvI02vB8zZszaj6+//vr1Hv/222/H22+/HRERvXr1it69e5dWaQAAAAAAAADwG4VbXB8AAAAAAAAAKDUb7cz7fv36Rb9+/Qo8ZurUqXHAAQdERMSRRx4Z//rXv8qiNAAAAAAAAAD4DTPvAQAAAAAAACBhwnsAAAAAAAAASJjwHgAAAAAAAAASJrwHAAAAAAAAgIRVTLqAJDVt2jS+/fbbpMsAAAAAAAAAYBNn5j0AAAAAAAAAJEx4DwAAAAAAAAAJE94DAAAAAAAAQMKE9wAAAAAAAACQMOE9AAAAAAAAACRMeA8AAAAAAAAACRPeAwAAAAAAAEDChPcAAAAAAAAAkDDhPQAAAAAAAAAkTHgPAAAAAAAAAAkT3gMAAAAAAABAwoT3AAAAAAAAAJAw4T0AAAAAAJC4Tz/9OPr0uSA+/fTjpEsBgEQI7wEAAAAAgEStWLEiBg0aGD//PCcGDRoYK1asSLokAChzwnsAAAAAACBRw4cPifnz50VExPz582LEiCEJVwQAZU94DwAAAAAAJGbmzBkxYsTQSKVSERGRSqVi+PChMXPmjIQrA4CyJbwHAAAAAAASkUqlYvDg+9cG9+trB4CNmfAeAAAAAABIxPTp02Ls2M8jPz//N+35+fkxduznMX36tIQqA4CyJ7wHAAAAAAAS0bhxk2jduk3k5v42rsjNzY3WrdtG48ZNEqoMAMqe8B4AAAAAAEhETk5O9OhxVuTk5BSqHQA2ZsJ7AAAAAAAgMQ0bNoquXbutDepzcv4/9v4/TM66vhf/X/dscKIsmF+62Vm//akBGya/mqrVIKRS9cguJlKOqNWlTdBSIwavg1qF9lhs1WoFMR6tITarothYErMbT7VoQDnHqjG4WaLyo7Uf291lJcnmhAUZyM79/QOyss0ku5udzD2bfTyuK5cz79fszBNzJ5md597vO4m2tlXR1DQ/42QAUFvKewAAAAAAIFNtbatj1qzZERExe/acaG1dnXEiAKg95T0AAAAAAJCpfD4fl112ecydOy/a29dGPp/POhIA1NyMrAMAAAAAAAAsW7Y8li1bnnUMAMiMM+8BAAAAAAAAIGPOvAcAAAAAAABOaWmaRqlUyjpG3SmVHq14m9Hy+XwkSXLSX0d5DwAAAAAAAJzSSqVSXH75G7OOUdfWrbs86wh1a+PGz8XMmTNP+uvYNh8AAAAAAAAAMubMewAAAAAAAGDa+PjKd0a+4WlZx6gbaZpGRNRkW/ippDT8WLxt59/U9DWV9wAAAAAAAMC0kW94WuRnKO+pP7bNBwAAAAAAAICMKe8BAAAAAAAAIGPKewAAAAAAAADImPIeAAAAAAAAADKmvAcAAAAAAACAjCnvAQAAAAAAACBjynsAAAAAAAAAyJjyHgAAAAAAAAAyprwHAAAAAAAAgIwp7wEAAAAAAAAgY8p7AAAAAAAAAMiY8h4AAAAAAAAAMqa8BwAAAAAAAICMKe8BAAAAAAAAIGPKewAAAAAAAADImPIeAAAAAAAAADKmvAcAAAAAAACAjCnvAQAAAAAAACBjynsAAAAAAAAAyJjyHgAAAAAAAAAyprwHAAAAAAAAgIwp7wEAAAAAgMzt3r0r1q+/Inbv3pV1FADIhPIeAAAAAADIVKlUis2bN8b+/fti8+aNUSqVso4EADWnvAcAAAAAADLV2bk1BgcPRETE4OCB6OramnEiAKg95T0AAAAAAJCZgYH+6OwcXdZv3741Bgb6M0oEANlQ3gMAAAAAAJlI0zQ6OjZFuVwetV4ul6OjY1OkaZpRMgCoPeU9AAAAAACQib6+3ujp6a446+npjr6+3honAoDsKO8BAAAAAIBMNDcXorGxseKssfGMaG4u1DgRAGRHeQ8AAAAAAGSiv78vhoaGKs6Ghh6K/v6+GicCgOwo7wEAAAAAgEwUCi1RLC6OJElGrSdJEsXikigUWjJKBgC1p7wHAAAAADhF7N69K9avvyJ2796VdRQYlyRJor19TSTJ6Loil8s9uZ4c4ysB4NSjvAcAAAAAOAWUSqXYvHlj7N+/LzZv3hilUinrSDAuTU3N0da2atRaW9uqaGqan00gAMiI8h4AAAAA4BTQ2bk1Dh4cjIiIgwcHo6tra8aJYPza2lbH7NlzIiJizpy50dq6OuNEAFB7ynsAAAAAgCluYKA/urq2RZqmERGRpml0dm6LgYH+jJPB+OTz+bjssstj7tx50d6+NvL5fNaRAKDmlPcAAAAAAFNYmqbR0bFppLgfax3q1bJly+OGGz4Zy5YtzzoKAGRCeQ8AAAAAMIX19fVGT093lMvlUevlcjl6erqjr683o2QAAEyE8h4AAAAAYAorFFqiWFwcudzoj3tzuVwUi0uiUGjJKBkAABOhvAcAAAAAmMKSJIn29jUVZ+3tayJJkhonAgDgRCjvAQAAAACmuKam5njucxeMWnve8xZEU9P8jBIBADBRynsAAAAAgCluYKA/7r//vlFr999/XwwM9GeUCACAiVLeAwAAAABMYWmaRkfHpohIK66naVr5CwEAqCvKewAAAACAKayvrzd6erqjXC6PWi+Xy9HT0x19fb0ZJQMAYCKU9wAAAAAAU1ih0BLF4uLI5UZ/3JvL5aJYXBKFQktGyQAAmAjlPQAAAADAFJYkSbS3r4kkSca1DgBAfVLeAwAAAABMcU1NzdHaumqkqE+SJNraVkVT0/yMkwEAMF7KewAAAACAU0Bb2+qYNWt2RETMnj0nWltXZ5wIAICJUN4DAAAAAJwC8vl8XHbZ5TF37rxob18b+Xw+60gAAEzAjKwDAAAAAABQHcuWLY9ly5ZnHQMAgBPgzHsAAAAAAAAAyJjyHgAAAAAAAAAyprwHAAAAAAAAgIwp7wEAAAAAAAAgY8p7AAAAAAAAAMiY8h4AAAAAAAAAMqa8BwAAAAAAAICMKe8BAAAAAAAAIGPKewAAAAAAAADImPIeAAAAAAAAADKmvAcAAAAAAACAjCnvAQAAAAAAACBjynsAAAAAAAAAyJjyHgAAAAAAAAAyprwHAAAAAAAAgIwp7wEAAAAAAAAgY8p7AAAAAAAAAMiY8h4AAAAAAMjc7t27Yv36K2L37l1ZRwGATCjvAQAAAACATJVKpdi8eWPs378vNm/eGKVSKetIAFBzynsAAAAAACBTnZ1b4+DBwYiIOHhwMLq6tmacCABqT3kPAAAAAABkZmCgP7q6tkWaphERkaZpdHZui4GB/oyTAUBtKe8BAAAAAE4RW7bcEu3tr40tW27JOgqMS5qm0dGxaaS4H2sdAE5lynsAAAAAgFPAoUOHorPz1iiXy9HZeWscOnQo60gwpr6+3ujp6Y5yuTxqvVwuR09Pd/T19WaUDABqT3kPAAAAAHAK+NjHPjxq2/Ebb/xwxolgbIVCSxSLiyvOisUlUSi01DgRAGRHeQ8AAAAAMMXt3bsn7r33J6PW7rnnJ7F3756MEsH4JEkSF154UcXZhRdeFEmS1DgRAGRHeQ8AAAAAMIWVy+XYsOH6irMNG64/ajtyqCdpmsaOHduPKumTJIkdO77imvcATCvKewAAAACAKay7+64YGhqqOBsaGoru7rtqnAjG78g17/9rSZ+mqWveAzDtKO8BAAAAAKawxYuXRmNjY8VZY+MZsXjx0hongvE7cs37XG50XZHL5VzzHoBpR3kPAAAAADCF5XK5WLfuqoqzdeuuOqoUhXqSJEm0t6+puG1+pXUAOJV51wYAAAAAMMUtXLgoFiw4e9TaWWedHQsXFjNKBOPX1NQcra2rRor6JEmirW1VNDXNzzgZANSW8h4AAAAA4BTw9rdf/ZTyMxdXXnl1xolg/NraVscznnF6REScfnpjtLauzjgRANSe8h4AAAAA4BRw5plnRlvbayKXy0Vb2+o488wzs44EE/LLHfLTLGMAQGZmZB0AAAAAAIDquOSSS+OSSy7NOgZMWGfn1nj44YcjIuLhhx+Orq6tcfHFjmUAphdn3gMAAAAAAJkZGOiPrq5tkaZPnHGfpml0dm6LgYH+jJMBQG0p7wEAAAAAgEykaRodHZtGivux1gHgVKa8BwAAAAAAMtHX1xs9Pd1RLpdHrZfL5ejp6Y6+vt6MkgFA7SnvAQAAAACATBQKLVEsLo5cbnRdkcvlolhcEoVCS0bJAKD2lPcAAAAAAEAmkiSJ9vY1kSTJuNYB4FSmvAcAAAAAADLT1NQcra2rRor6JEmirW1VNDXNzzgZANSW8h4AAAAAAMhUW9vqmDVrdkREzJ49J1pbV2ecCABqT3kPAAAAAABkKp/Px7x5z4qIiLlz50U+n884EQDUnvIeAAAAAADI1L59D8Z9990TERH33XdP7Nv3YMaJAKD2lPcAAAAAAECmrrvu2lH33//+a4/xSAA4dSnvAQAAAACAzNx55+1x4MD+UWv79++PO++8PZtAAJAR5T0AAAAAAJCJ4eHhuOmmT1Wc3XTTp2J4eLjGiQAgO8p7AAAAAAAgEzt33nbMgn54eDh27rytxokAIDvKewAAAAAAIBMrV14QDQ0NFWcNDQ2xcuUFNU4EANlR3gMAAAAAAJloaGiISy65tOLskkted8xiHwBORcp7AAAAAAAgE2maxt69d1ec7d3bE2ma1jgRAGRHeQ8AAAAAAGSir683enq6K856erqjr6+3xokAIDvKewAAAAAAIBOFQksUi4sjlxtdV+RyuSgWl0Sh0JJRMgCoPeU9AAAAAACQiSRJor19TSRJMq51ADiVKe8BAAAAAIDMNDU1R2vrqpGiPkmSaGtbFU1N8zNOBgC1pbwHAAAAAAAy1da2OmbNmh0REbNnz4nW1tUZJwKA2lPeAwAAAAAAmcrn83HZZZfH3Lnzor19beTz+awjAUDNzcg6AAAAAAAAwLJly2PZsuVZxwCAzDjzHgAAAAAAAAAyprwHAAAAAAAAgIwp7wEAAAAAAAAgY8p7AAAAAAAgcx//+EfjjW+8JD7+8Y9mHQUAMqG8BwAAAAAAMrVv34Pxve99JyIivve978S+fQ9mnAgAai+T8r5cLseBAweiv78/i5cHAAAAAADqyHXXXTvq/vvff+0xHgkAp64ZtXiRQ4cOxa233hrf/e53o7u7OwYHByMiIkmS+NGPfjTyuDe+8Y1xzjnnxB/90R/Fs5/97FpEAwAAAAAAMnTnnbfHgQP7R63t378/7rzz9lix4vxsQgFABk5qeX/48OG44YYb4uabb45HH300IiLSND3m43t6emLXrl1xyy23xLve9a649NJLT2Y8AAAAAAAgQ8PDw3HTTZ+qOLvppk/F7/7uudHQ0FDjVACQjZO2bf6DDz4Yr3vd62LTpk3xi1/8YtQsSZKjHn/gwIGRgv8Xv/hFvO9974vrr7/+ZMUDAAAAAAAytnPnbTE8PFxxNjw8HDt33lbjRACQnZNS3v/iF7+It7zlLdHT0zOylqZpPP3pT49isVjx7Pv/9//+X8yYMSPSNI0kSSJN0/j0pz8d//t//++TEREAAAAAAMjYypUXHPPM+oaGhli58oIaJwKA7JyU8v7DH/5w/OhHPxop4ZcsWRKbNm2K73//+7Fly5aKX/Prv/7r8c1vfjNaW1tHFfh//dd/HY899tjJiAkAAAAAAGSooaEh1q79k4qztWuvsGU+ANNK1cv7n/3sZ/EP//API1vjX3jhhfGFL3whXvKSl4z5j+yzn/3s+MhHPhLveMc7Rs7O37dvX3z961+vdkwAAAAAAKAOrFhxfsyZM3fU2ty5c2PFivMySgQA2ah6ed/V1RWHDx+OiIhf+7Vfiw996EORy03sZd785jfH0qVLR+7ffvvt1YwIAAAAAADUkWuvvW7U/Wuuue4YjwSAU1fVy/s777xz5PbatWtjxowZJ/Q8a9asGbm9d+/eSecCAAAAAADq07x5z4oXvOB3IyLiBS/43Zg371kZJwKA2juxZv04ent7R26/5CUvOeHnef7znx8REWmaxr59+yadCwAAAAAAqF9ve9s7so4AAJmq+pn3Bw4cGLk9b968E36eZz/72SO3f/GLX0wqEwAAAAAAAADUs6qX9894xjNGbg8NDZ3w8xw6dCgiIpIkiTPOOGPSuQAAAAAAAACgXlW9vH/q2fY9PT0n/Dw/+MEPKj4nAAAAAAAAAJxqql7eL1myZOT2P/zDP5zw83zhC18Yub148eLJRAIAAAAAAACAulb18v7888+PiIg0TeO2226Lr371qxN+ji9+8YvxL//yLyP3V6xYUa14AAAAAAAAAFB3ql7ev+xlL4vf+I3fiCRJIk3TeOc73xlf/OIXx/W15XI5Pv3pT8f73//+SJIkIiJaWlri93//96sdEwAAAAAAAADqxoxqP2Eul4s/+7M/i7e85S0REXH48OH4y7/8y7j55pvjwgsvjLPPPnvU4w8cOBA/+9nP4jvf+U5s3bo1/uM//iPSNI2IiCRJ4h3veEc0NDRUOyYAAAAAAAAA1I2ql/cREeeee25cffXV8aEPfWjkDPz7778/brzxxlGPS9M0XvKSl4y6HxEjX3PZZZfFq171qpMREQAAAAAAAADqRtW3zT/ij/7oj+L9739/5PP5iIiRbfDTNI0kSUZ+pWk6qrQ/8r/r1q2Ld73rXScrHgAAAAAAUEd2794V69dfEbt378o6CgBk4qSV9xERf/AHfxBf+cpX4uKLL47TTjttpKQ/UtgfuX9kLSLi/PPPjy984Quxbt26kxkNAAAAAACoE6VSKTZv3hj79++LzZs3RqlUyjoSANTcSdk2/6l+9Vd/Nf7qr/4q3v3ud8cPfvCD2L17dzzwwANx6NChePzxx+OZz3xmzJkzJxYtWhQveMELYv78+Sc7EgAAAAAAUEc6O7fGwYODERFx8OBgdHVtjYsvvjTjVABQWye9vD/ijDPOiPPPPz/OP//8Wr0kAAAAAMC0snv3rvjsZzfFm960JpYtW551HBiXgYH+6OraNmr33s7ObbFixXnR1NSccToAqJ2Tum3+RNxzzz3x6KOPZh0DAAAAAGBKsu04U1GaptHRsWnUZXaPtw4Ap7KTXt7fdddd8e53vzuuvPLK4z7uyiuvjOXLl8e6deviBz/4wcmOBQAAAJxEu3fvivXrr4jdu3dlHQVg2qi07TjUu76+3ujp6Y5yuTxqvVwuR09Pd/T19WaUDABq76SV94cOHYorr7wyXv/618dXvvKV2LXr+N+s9/f3x/DwcHzjG9+IP/zDP4w///M/j8OHD5+seAAAAMBJ4sxPgNo71rbjAwP9GSeD4ysUWqJYXBxJkoxaT5IkisUlUSi0ZJQMAGrvpJT3Dz30UFx22WXxz//8z5GmaaRpGoODgzE0NFTx8T//+c/jscceG7mfpmls2bIl1q1bd9RP2wEAAAD1zZmfALVl23GmsiRJor19TcVZe/uao0p9ADiVnZTy/rrrrosf/ehHEREj/7CeffbZ8fDDD1d8/DOe8Yx473vfG+eee27kcrlIkiTSNI077rgjPvGJT5yMiAAAAMBJ4MxPgNqz7TinLj94AsD0UvXy/p577ont27ePlPYtLS3x2c9+NrZu3RpNTU0Vv6axsTHe+MY3xqc//en4x3/8x/j1X//1kQL/05/+dPz85z+vdkwAAACgypz5CZCNI9uO53KjP+7N5XK2HafuHXmfUGnbfO8fAJhuql7eb9u2LSKe+Ad37ty58cUvfjFe8IIXjPvrzz777PjsZz8bc+fOjYiIw4cPx5e//OVqxwQAAACqzJmfANk4su14pfLTtuPUO+8fAOCXql7e/+AHP4iIJ94Yvu1tb4tnPetZE36OefPmxeWXXz5y/zvf+U7V8gEAAAAnhzM/AbLT1NQcra2rRor6JEmirW1VNDXNzzgZHJ/3DwDwS1Uv73/2s5+N3D7//PNP+Hl+7/d+b+T2v/3bv00mEgAAAFADzvwEyFZb2+qYNWt2RETMnj0nWltXZ5wIxub9AwD8UtXL+6GhoZHb8+bNO+HnaW5ujogntt8/dOjQpHMNDAzERz7ykWhra4ulS5fG0qVL45WvfGW8//3vj3vuuWfSzw8AAAA48xMgS/l8Pi677PKYO3detLevjXw+n3UkGBfvHwDgCTOq/YT5fD4OHz4cEREHDx4cuXb9RD388MMjt5/xjGdMKtNtt90W73rXu0b9YEFExE9/+tP46U9/Gl/84hfjT/7kT+Jtb3vbpF4HAAAAeOLMz299a2cMDh5w5idAjS1btjyWLVuedQyYMO8fAOAknHlfKBRGbu/evfuEn+fuu++OiCd+wu5EfwAgIuKuu+6K9evXx9DQUDQ0NMTrXve6+OQnPxmf+9zn4s/+7M9i3rx5cfjw4diwYUN85jOfOeHXAQAAAJ7gzE8AYKK8fwCAk3DmfbFYjPvuuy8iIm6++eb4/d///RN6ni9+8YsjtxcvXnzCef7yL/8yHn/88YiIuPHGG+OCCy4Ymb3gBS+Itra2ePWrXx0PPvhgfPzjH4+LL744nvnMZ57w6wEAAADO/AQAJs77BwCmu6qfef+KV7xi5PZ3v/vd+Pu///sJP8eXv/zluO2220bun3/++SeU5e67744f/ehHI7meWtwfMXfu3FizZk1ERDzyyCNx++23n9BrAQAAAAAAAMCJqnp5/9KXvjR+9Vd/NSIi0jSNv/mbv4nrrrsuDh06NObXPvzww/G3f/u38Rd/8ReRJEkkSRK/9mu/dsJn7z/22GNxwQUXxK/8yq8c9zl+4zd+Y+R2f3//Cb0WAAAAAAAAAJyoqm+bnyRJXHvttbF27dpIkiTSNI0vfOEL8eUvfznOPffcWLRoUTznOc+JxsbGiHiisP/P//zPuPvuu+Nb3/pWPProo5GmaURENDQ0xHve857I5U7sZwyWLVsWy5YtG/Nxvb29I7ef/exnn9BrAQAAAABkbcuWW6Kra2u0tq6OSy65NOs4MCEf//hH43vf+0684AW/G2972zuyjgMANVf18j4iYsWKFfGOd7wjPvrRj0aSJBERUSqV4hvf+EZ84xvfOObXpWk6csZ9mqbxzne+M84999yTEXHEgQMH4jOf+UxERDzjGc+IlStXntTXAwAAAAA4GQ4dOhSdnbdGmqbR2XlrvOIVr4ozzzwz61gwLvv2PRjf+953IiLie9/7Tuzb92DMm/esjFMBQG1Vfdv8I9785jfHhz70oTjjjDNGSvkj0jQd9euII6X96aefHjfccEO0t7eflGylUin+9V//NT796U/HRRddFP/xH/8xsmPA7NmzT8prAgAAAACcTB/72IdHPm9N0zRuvPHDGSeC8bvuumtH3X//+689xiMB4NR1Us68P+LVr351nH/++fH5z38+tm/fHv/f//f/VXzckTeUhUIhLr744nj9619/0kr0np6e+IM/+INRa/Pnz4//+T//p7PuAQAAAIApae/ePXHvvT8ZtXbPPT+JvXv3xMKFizJKBeNz5523x4ED+0et7d+/P+688/ZYseL8bEIBQAZOankfEfHMZz4z3vrWt8Zb3/rWeOCBB+LHP/5x9PX1xdDQUCRJEmeeeWbMnTs3zjnnnGhubj7ZcaKvr++otQcffDC+9KUvxbOe9aw455xzJv0aM2actA0NAAAAAABGKZfLsWHDDRVnGzbcEH/3d5+JXM5nltSn4eHhuOmmT1Wc3XTTp+Lcc8+LhoaGGqeCiXlqLzRjRk5PVKf8vjAZtfqzfdLL+6eaP39+zJ8/v5YveZRf+7Vfi7/7u7+LOXPmxM9//vPYsWNHfPWrX42dO3fGv/zLv8THP/7xOPfcc0/4+XO5JGbPPr2KiQEAAAAAju273/1uDA09VHE2NPRQ3H//j+KFL3xhjVPB+HR1dcXw8HDF2fDwcPzLv3wrWltba5wKJubRR3/5AyazZ58eM2fOzDANx/LU3yeYqFr92a5peV8PzjrrrDjrrLNG7l9wwQWxYsWKeM973hO/+MUv4n/8j/8R3/jGN6KxsfGEnr9cTuPQoUeqFRcAAAAA4Lie+9zfisbGMyoW+GeccUY897m/FYODD2eQDMb2ohe9ND75yU9WLPAbGhriRS96qeOXuvfoo4+O3B4cfDhmzqz8Aylk66m/TzBRk/mzfeaZT4+GhvGdtT/tyvtKLr744rjjjjvia1/7Whw8eDC+9rWvxcUXX3zCz3f4cLmK6QAAAAAAjm/duvXxwQ9ed9T6W996VZTLT2ytD/UpibVr/yT+7u8+cdRk7dorIk0Tn7lT9556jB4+XHbM1qmn/r6Uhh/LMAlTxVOPk1r92VbeP+nlL395fO1rX4uIiB//+McZpwEAAAAAGL+FCxfFggVnx733/mRk7ayzzo6FC4sZpoLxWbHi/Niy5ZY4cGD/yNrcuXNjxYrzMkwFnMretvNvso4AFU24vH/+858/cjtJkvjRj350zHm1VHqd8XjooYfiZz/7Wfznf/5nvPzlL48kSY752FmzZo3cfvzxx08kJgAAAABAZt7+9qvjrW9dM3L/yiuvzjANTMy1114XV131pyP3r7nm6J0kAOBUN+HyPk3TSJIk0jQ95rxe/OVf/mVs3749IiK2bdt23B8s+NnPfjZye/78+Sc9GwAAAAAA8ISnPS1/3PsA1fTxle+MfMPTso5BnSsNP1bzXRpOyrb5xyv3a+l3fud3Rsr7L3/5y3HttddWfFy5XI4vf/nLI/dXrFhRk3wAAAAAANXysY99eNT9G2/8sLOXmTIcv0At5RueFvkZynvqz4TL+9WrVx93vmrVquNuT19Lr3rVq+KjH/1oDA4Oxpe+9KW44IIL4nd/93dHPSZN0/jrv/7r2Lt3b0REvOQlL4li0XWgAAAAAICpY+/ePaOudx8Rcc89P4m9e/fEwoWLMkoF4+P4BYAnTLi8/8AHPnDc+Qc/+METDlNtjY2N8b73vS/Wr18fjz/+ePzxH/9xXHLJJXHeeefFvHnz4qc//Wnccsstcdddd0XEE9vl//Vf/3XGqQEAAAAAxq9cLseGDddXnG3YcH184hObIpfL1TgVjI/jFwB+qerb5j/22GMREfG0p9XHVhOveMUr4sMf/nBce+218cgjj8SXvvSl+NKXvnTU484555z42Mc+5nr3AAAAAMCU0t19VwwNDVWcDQ0NRXf3XbF06W/XOBWMj+MXAH6p6j+utn379njRi14UV111VXz1q1+Nhx9+uNovMWGtra3xT//0T/GWt7wlnv/858fpp58ep512Wjz72c+OCy64IK6//vrYsmVLPOc5z8k6KgAAAADAhCxevDQaGxsrzhobz4jFi5fWOBGMn+MXAH6p6mfef/3rX49HHnkk/umf/in+6Z/+KV7/+tfHtddeW+2XmbCmpqZ4xzveEe94xzuyjgIAAAAAUDW5XC7WrbsqPvjB646arVt3lS3HqWuOXwD4par/q3f//fdHkiSRpmlERLzmNa+p9ksAAAAAAPAUCxcuijlz5o5amzt3bixcWMwoEYzfwoWLYsGCs0etnXXW2Y5fAKadqpf3+/fvH3X/N3/zN6v9EgAAAAAAPMXAQH8MDh4YtXbgwIEYGOjPKBFMzNvffnUkSRIREUmSiyuvvDrjRABQe1Uv7wuFwqj7g4OD1X4JAAAAAACelKZpdHRsGik+j0iSJDo6No3skgr17Mwzz4z585/oF+bPb44zzzwz40QAUHtVL+9f+9rXRpqmI28U//Ef/7HaLwEAAAAAwJP6+nqjp6c7yuXyqPVyuRw9Pd3R19ebUTIYv337Hoz+/ieO1f7+3ti378GMEwFA7VW9vH/Tm94Ura2tkaZppGkan/rUp2Lr1q3VfhkAAAAAACKiUGiJYnFxxTPvi8UlUSi0ZJQMxu+6664ddf/977/2GI8EgFPXjGo/YS6Xi4985CPx4he/OD7ykY/EgQMH4j3veU985jOfiXPPPTeWLl0aTU1N8cxnPjNOO+20cT/vf92OHwAAAACAJ0r6Cy+8KHp6uketp2kaF17YdlSpD/XmzjtvjwMH9o9a279/f9x55+2xYsX52YQCgAxUvbx/wxveMHJ73rx5ceDAgUjTNO677764//774+///u8n/JxJksSPfvSjasYEAAAAADglpGkaO3ZsrzjbsWN7/NZvFRX41K3h4eG46aZPVZzddNOn4nd/99xoaGiocSoAyEbVy/sf/OAHo94I/tc3hWmaVvslAQAAAACmrSPXvK/kyDXvW1qeU+NUMD47d94Ww8PDFWfDw8Oxc+dtccEFr6hxKgDIRtWveR8RI9e7r/QLAAAAAIDqaW4uRGNjY8VZY+MZ0dzskqTUr/PPf9mk5gBwKqn6mffr1q2r9lMCAAAAAHAM/f19MTQ0VHE2NPRQ9Pf3OfOeujUw8MCYc8cvANOF8h4AAAAAYAorFFqiWFwcd9+9Z9Tup0mSxDnnLI5CoSXDdHB8R47fSpd+KBaXOH4BmFZOyrb5AAAAAADURpIk0d6+JpJk9Me9uVzuyfUko2QwtiPHb0RScd3xC8B0orwHAAAAAJjimpqao61t1ai1trZV0dQ0P5tAMAFNTc3x6le/ZtTaq1/9GscvANPOpLfNHxoaiq997Wvxta99Lf793/89fv7zn8fTnva0mDdvXixdujQuuOCCWLlyZTWyAgAAAABwDC9/+ati+/ZbI03TSJIkfv/3X5V1JBi3trbV8a1v7YzBwQMxZ87caG1dnXUkAKi5SZX327Ztiw996ENx8ODBiIiR6yk9+uijcejQofjpT38at956azzvec+Lv/qrv4pisTjpwAAAAAAAHO3rX//qyGe0aZrGP//zV+Piiy/NOBWMTz6fj8suuzw++9lN8aY3rYl8Pp91JACouRPeNv9v//Zv48/+7M9icHBw5A1hkiSjfkU88Sbx3nvvjde//vXR2dlZndQAAAAAAIwYGOiPrq5to9Y6O7fFwEB/NoHgBCxbtjxuuOGTsWzZ8qyjAEAmTqi837ZtW2zcuHFk+6UkSSJN04q/jswff/zxeO973xt79uyp9n8DAAAAAMC0laZpdHRsGjnJaqx1AADq04S3zX/sscfiYx/7WETESGn/zGc+My6++OJ44QtfGIVCISIi+vr64tvf/nbceuut8cgjj0SSJPHYY4/FBz/4wfjCF75Q3f8KAAAAAIBpqq+vN3p6uo9aL5fL0dPTHX19vdHS8pwMkgEAMBETLu+/9a1vRX9//8i2+C9/+cvjAx/4QJx++umjHve85z0vzjvvvLj88svjiiuuiB//+McREXHXXXfFj3/843j+859fhfgAAAAAANNbodASxeLi2Lu3J8rl8sh6LpeLhQsXRaHQkmE6AADGa8Lb5v+f//N/Rm6fc845ccMNNxxV3D9VU1NTfPKTn4wzzjhjZO3b3/72RF8WAAAAAIAKkiSJ9vY1IydcjbUOAEB9mnB5f/fdd4/cXrt2beRyYz9FU1NTXHzxxSP3XfceAAAAAKB6mpqao7V11UhRnyRJtLWtiqam+RknAwBgvCZc3g8MDIzcLhaL4/66c889d+T2v/7rv070ZQEAAAAAOI62ttUxa9bsiIiYPXtOtLauzjgRTMzu3bti/forYvfuXVlHAYBMTLi8f+ihh0Zuz5kzZ9xft2DBgorPAQAAAADA5OXz+bjssstj7tx50d6+NvL5fNaRYNxKpVJs3rwx9u/fF5s3b4xSqZR1JACouRkT/YLHHnts5PZE3vydeeaZERGRpmkMDQ1N9GUBAAAAABjDsmXLY9my5VnHgAnr7NwaBw8ORkTEwYOD0dW1NS6++NKMUwFAbU34zPvh4eGR20eunzQeT3va00Zu+4k5AAAAAAAgImJgoD+6urZFmqYR8cRJgJ2d22JgoD/jZABQWxMu7wEAAAAAAKohTdPo6Ng0UtyPtQ4ApzLlPQAAAAAAkIm+vt7o6emOcrk8ar1cLkdPT3f09fVmlAwAak95DwAAAAAAZKJQaIlicXHkcqPrilwuF8XikigUWjJKBgC1p7wHAAAAAAAykSRJtLeviSRJxrUOAKcy5T0AAAAAAJCZpqbmaG1dNVLUJ0kSbW2roqlpfsbJAKC2lPcAAAAAAECm2tpWx6xZsyMiYvbsOdHaujrjRABQezMm88W7du2KNE1r8rW/8zu/c0KvAwAAAAAwXWzZckt0dW2N1tbVcckll2YdB8Ytn8/HZZddHp/97KZ405vWRD6fzzoSANTcCZX3SZJEmqbxxje+8YRedKJfmyRJ/OhHPzqh1wIAAAAAmA4OHToUnZ23Rpqm0dl5a7ziFa+KM888M+tYMG7Lli2PZcuWZx0DADJzwtvmHynwJ/IrSZKRXxP9WgAAAAAAju1jH/vwyGepaZrGjTd+OONEAABMxAmX9ydSqCvjAQAAAACqb+/ePXHvvT8ZtXbPPT+JvXv3ZJQIAICJmvC2+a49DwAAAABQP8rlcmzYcH3F2YYN18cnPrEpcrkTPo8LAIAamXB5/7nPfe5k5AAAAAAA4AR0d98VQ0NDFWdDQ0PR3X1XLF362zVOBQDARPlxSwAAAACAKWzx4qXR2NhYcdbYeEYsXry0xongxOzevSvWr78idu/elXUUAMiE8h4AAAAAYArL5XKxbt1VFWfr1l1ly3ymhFKpFJs3b4z9+/fF5s0bo1QqZR0JAGrOuzYAAAAAgClu4cJFsWDB2aPWzjrr7Fi4sJhRIpiYzs6tcfDgYEREHDw4GF1dWzNOBAC1p7wHAAAAADgFvP3tV0eSJBERkSS5uPLKqzNOBOMzMNAfXV3bIk3TiIhI0zQ6O7fFwEB/xskAoLaU9wAAAEDVuWYtU5njl6nqzDPPjLa210Qul4u2ttVx5plnZh0JxpSmaXR0bBop7sdaB4BT2YysAwAAAACnliPXrB0cPBCbN2+MhQuLkc/ns44F4+L4Zaq75JJL45JLLs06BoxbX19v9PR0H7VeLpejp6c7+vp6o6XlORkko5I0TaNUKmUdo+6USo9WvM1o+Xx+ZIcYoDLlPQAAAFBVla5Ze/HFiiSmBscvQG0VCi1RLC6uWOAXi0uiUGjJIBXHUiqV4vLL35h1jLq2bt3lWUeoWxs3fi5mzpyZdQyoa7bNBwAAAKrGNWuZyhy/ALWXJEm8+MUrKs5e/OKXOEsXgGnFmfcAAABAVYx1zdqrr36vD+CpW45fgGyUy+W4+eaOirObb+6IF7/4pZHLOQ+xHl33io/H0xpcWuaII+8hvF8Y7bHhUlz7tbdlHQOmDOU9AAAAUBWuWctU5vgFyEZ3910xNDRUcTY0NBTd3XfF0qW/XeNUjMfTGvKRn6G8B6gm5T0AAABQFUeuWbt3b0+Uy+WR9VwuFwsXLnLNWuqa4xeYrtI0jVKplNnrn3XW8+P00xvj4YePLvBPP70xzjrr+fHoo49mkCwin887ixqAmlLeAwAAAFWRJEm0t6+Jd73rqorrPvymnjl+gekoTdO47rpr47777sk6SkUPPzwUb3lLe2avv2DBWXHNNdf5NwCAmnGhGAAAAKBqmpqao7V11ciH3EmSRFvbqmhqmp9xMhib4xeYjvTSAFA/nHkPAAAAVFVb2+r41rd2xuDggZg9e060tq7OOhKMm+MXmE6SJIlrrrku023zj9i//8F497vfERFP5Prbv90QZ5xxZqaZbJsPQK0p7wEAAICqyufzcdlll8dnP7sp3vSmNZHP57OOBOPm+AWmmyRJYubMmVnHiLlznzVy+1WvaotnPevZGaYBgGwo7wEAAICqW7ZseSxbtjzrGHBCHL8A2Vq16pKsIwBAJlzzHgAAAAAAAAAyprwHAAAAAAAAgIwp7wEAAAAAAAAgY8p7AAAAAAAAAMiY8h4AAAAAAAAAMqa8BwAAAAAAAICMKe8BAAAAAAAAIGPKewAAAACAU8Tu3bti/forYvfuXVlHAQBggpT3AAAAAACngFKpFJs3b4z9+/fF5s0bo1QqZR0JAIAJUN4DAAAAAJwCOju3xsGDgxERcfDgYHR1bc04EQAAE6G8BwAAAACY4gYG+qOra1ukaRoREWmaRmfnthgY6M84GQAA46W8BwAAAACYwtI0jY6OTSPF/VjrAADUJ+U9AAAAAMAU1tfXGz093VEul0etl8vl6Onpjr6+3oySAQAwEcp7AAAAAIAprFBoiWJxcSRJMmo9SZIoFpdEodCSUTIAACZCeQ8AAAAAMIUlSRIXXnhRxW3zL7yw7ahSHwCA+qS8BwAAAACYwtI0jR07tlec7dix3TXvAQCmCOU9AAAAADzF7t27Yv36K2L37l1ZR4FxOXLN+0pc8x4AYOpQ3gMAAADAk0qlUmzevDH2798XmzdvjFKplHUkGFOh0BILFpxdcXbWWc93zXsAgClCeQ8AAAAAT+rs3BoHDw5GRMTBg4PR1bU140QwObbMBwCYOpT3AAAAABARAwP90dW1baTsTNM0Oju3xcBAf8bJ4Pj6+nrj3nt/UnF2770/sW0+AMAUobwHAAAAYNpL0zQ6OjYddZbysdahnhQKLVEsLq44KxaX2DYfAGCKUN4DAAAAMO319fVGT093lMvlUevlcjl6erqduUxdS5IkfuVXfrXi7Fd+5VcjSZIaJwIA4EQo7wEAAACY9o6cuZzLjf64LJfLOXOZunf48OHYsWN7xdmOHV+Jw4cP1zgRAAAnQnkPAAAAwLSXJEm0t6856gzlY61DPdm27cuTmgMAUB+U9wAAAAAQEU1NzdHaumqkqE+SJNraVkVT0/yMk8HxvfrVF09qDgBAfVDeAwAAAMCT2tpWx6xZsyMiYvbsOdHaujrjRDC2n/98YFJzAADqg/IeAAAAAJ6Uz+fj3HNXRi6XixUrzo98Pp91JBhTodASxeLiirNicUkUCi01TgQAwIlQ3gMAAADAk0qlUnz72zujXC7Ht7+9M0qlUtaRYExJkkR7+5qKs/b2NSOXggAAoL4p7wEAAADgSZ2dW+PgwcGIiDh4cDC6urZmnAjGp6mpORYsOHvU2llnnR1NTfMzSgQAwEQp7wEAAAAgIgYG+qOra1ukaRoREWmaRmfnthgY6M84GYxtYKA/7r//3lFr999/n+MXAGAKUd4DAAAAMO2laRodHZtGivux1qGeHOs4LZfLjl8AgClEeQ8AAADAtNfX1xs9Pd1RLpdHrZfL5ejp6Y6+vt6MksHYjhy/lX74xPELADB1KO8BAAAAmPYKhZYoFhdHLjf647JcLhfF4pIoFFoySgZja24uRGNjY8VZY+MZ0dxcqHEiAABOhPIeAAAAgGkvSZJob18TSZKMax3qSX9/XwwNDVWcDQ09FP39fTVOBADAiVDeAwAAAEBENDU1R2vrqpGiPkmSaGtbFU1N8zNOBsd3ZOeISuwcAQAwdSjvAQAAAOBJbW2rY9as2RERMXv2nGhtXZ1xIhhbkiRx4YUXVZxdeOFFdo4AAJgilPcAAAAA8KR8Ph+XXXZ5zJ07L9rb10Y+n886EowpTdPYsWN7xcs+7NjxlUjTNKNkAABMxIysAwAAAABAPVm2bHksW7Y86xgwbn19vdHT033Uepqm0dPTHX19vdHS8pwMkgEAMBHOvAcAAAAAmMJc8x4A4NSgvAcAAAAAmMKSJImFC8+pOFu48BzXvAcAmCKU9wAAAAAAU9jw8HBs2XJLxdmWLV+M4eHhGicCAOBEKO8BAAAAAKawnTtvO2ZBPzw8HDt33lbjRAAAnAjlPQAAAADAFLZy5QXR0NBQcdbQ0BArV15Q40QAAJwI5T0AAAAAPMXu3bti/forYvfuXVlHgXFpaGiItWv/pOJs7dorjlnsAwBQX2ZkHQAAAAAA6kWpVIrNmzfG4OCB2Lx5YyxcWIx8Pp91LBjTihXnx5Ytt8SBA/tH1ubOnRsrVpyXYSoAqE+l4ceyjlBX0jSNiIgkSTJOUl+yOE6U9wAAAADwpM7OrTE4eCAiIgYHD0RX19a4+OJLM04F43PttdfFVVf96cj9a665LsM0AFC/3rbzb7KOABXZNh8AAAAAImJgoD+2b7911Nr27VtjYKA/o0QAAMB04sx7AAAAAKa9NE2jo2PTyJahR5TL5ejo2BRXX/1e24hS96677tpR99///mvjhhs+lVEaAKgv+Xw+Nm78XNYx6k6p9GisW3d5RERs2LAx8vmZGSeqT7W6lJbyHgAAAIBpr6+vN3p6uivOenq6o6+vN1panlPjVDB+d955+6jr3UdE7N+/P+688/ZYseL8bEIBQB1JkiRmzlRMH08+P9P/RxmzbT4AAAAA015T0/xJzSFLw8PDcdNNlc+wv+mmT8Xw8HCNEwEAcCKU9wAAAABMe7ff/o1JzSFLO3fedsyCfnh4OHbuvK3GiQAAOBHKewAAAACmvZUrL4iGhoaKs4aGhli58oIaJ4Lxc/wCAJwalPcAAAAATHsNDQ2xdu2fVJytXXvFMYtRqAcNDQ3xyldeWHH2ylde6PgFAJgilPcAAAAAEBErVpwfM2c+fdTa05/+9Fix4ryMEsH4lMvluOOOb1ac3XHHN6NcLtc4EQAAJ0J5DwAAAAARMTDQH489Vhq19thjj8XAQH9GiWB8urvviqGhoYqzoaGh6O6+q8aJAAA4Ecp7AAAAAKa9NE2jo2PTMdfTNM0gFYzP4sVLo7GxseKssfGMWLx4aY0TAQBwIpT3AAAAAEx7fX290dPTfdT24uVyOXp6uqOvrzejZDC2XC4X69ZdVXG2bt1Vkcv5GBgAYCrwrg0AAACAaa9QaIlicfFRJWcul4ticUkUCi0ZJYPxWbhwUcyZM3fU2ty5c2PhwmJGiQAAmCjlPQAAAADTXpIk0d6+JpIkGdc61JuBgf4YHBwctTY4OBgDA/0ZJQIAYKKU9wAAAAAQEU1NzdHaumqkqE+SJNraVkVT0/yMk8HxpWkaHR2botLPmHR0bIo0TWsfCgCACVPeAwAAAMCT2tpWx6xZsyMiYvbsOdHaujrjRDC2vr7e6OnpjnK5PGq9XC5HT0939PX1ZpQMAICJUN4DAAAAwJPy+XxcdtnlMXfuvGhvXxv5fD7rSDCmQqElisXFkcuN/rg3l8tFsbgkCoWWjJIBADARynsAAAAAeIply5bHDTd8MpYtW551FBiXJEmivX3NyCUfxloHAKA+Ke8BAAAAAKa4pqbmaG1dNVLUJ0kSbW2roqlpfsbJAAAYL+U9AAAAAMApoK1tdcyaNTsiImbPnhOtraszTgQAwEQo7wEAAADgKXbv3hXr118Ru3fvyjoKTEg+nx+5nabpqPsAANQ/5T0AAAAAPKlUKsXmzRtj//59sXnzxiiVSllHgnH793//aQwOHoiIiMHBA/Hv//7TjBMBADARynsAAAAAeFJn59Y4eHAwIiIOHhyMrq6tGSeC8fuf//M9o+6/733vOcYjAQCoR8p7AAAAAIiIgYH+6OraFmmaRsQT2453dm6LgYH+jJPB2G655XMxPHx41Nrhw4fjlls+l1EiAAAmSnkPAAAAwLSXpml0dGwaKe7HWod68vjjj8eOHdsrznbs2B6PP/54jRMBAHAilPcAAAAATHt9fb3R09Md5XJ51Hq5XI6enu7o6+vNKBmM7fOf//tJzQEAqA/KewAAAACmvUKhJYrFxZEkyaj1JEmiWFwShUJLRslgbH/4h380qTkAAPVBeQ8AAADAtJckSbS3r6k4a29fc1SpD/XktNNOiwsvvKji7MILV8Vpp51W40QAAJwI5T0AAAAAHJfr3VP/Lr30jdHQ0DBqraFhRlx66RsySgQAwEQp7wEAAACY9tI0jY6OTRW3ze/o2BRpqsCn/q1Ycd6o++ee+9KMkgAAcCKU9wAAAABMe319vdHT0x3lcnnUerlcjp6e7ujr680oGYzPwEB/fOtbt49a+9a3bo+Bgf5sAgEAMGHKewAAAACmvUKhJYrFxRVnxeKSKBRaapwIxu/IzhFpevQPn9g5AgBg6lDeAwAAADDtJUkSCxeeU3G2cOE5R22nD/XkyM4Rldg5AgBg6lDeAwAAADDtDQ8Px5Ytt1ScbdnyxRgeHq5xIhi/+fObo6GhoeKsoaEh5s9vrnEiAABOhPIeAAAAgGlv587bjlnQDw8Px86dt9U4EYzfnj0/PO7xu2fPD2sbCACAE6K8BwAAAGDaW7nyguOeubxy5QU1TgTjt3jx0mhsbKw4a2w8IxYvXlrjRAAAnAjlPQAAAADTXkNDQ1xyyaUVZ5dc8rpjFvtQD3K5XLzhDe0VZ294Q3vkcj4GBgCYCrxrAwAAAGDaS9M09u69u+Js796eSNO0xolg/NI0jf/7f++sOPu///fbjl8AgClCeQ8AAADAtNfX1xs9Pd0VZz093dHX11vjRDB+jl8AgFOD8h4AAACoui1bbon29tfGli23ZB0FxqVQaIlicfFR24vncrkoFpdEodCSUTIY25HjtxLHLwDA1KG8BwAAAKrq0KFD0dl5a5TL5ejsvDUOHTqUdSQYU5Ik0d6+JpIkGdc61JMkSeLCCy+qOLvwwoscvwAAU4TyHgAAAKiqj33swyPXV07TNG688cMZJ4LxaWpqjtbWVSNFZ5Ik0da2Kpqa5mecDI4vTdPYsWN7xdmOHV9xzXsAgClCeQ8AAABUzd69e+Lee38yau2ee34Se/fuySgRTExb2+qYNWt2RETMnj0nWltXZ5wIxuaa9wAApwblPQAAAFAV5XI5Nmy4vuJsw4bro1wu1zgRTFw+n4/LLrs85s6dF+3tayOfz2cdCcb07Gc3TWoOAEB9UN4DAAAAVdHdfVcMDQ1VnA0NDUV39101TgQnZtmy5XHDDZ+MZcuWZx0FxuUrX/nHSc0BAKgPynsAAACgKhYvXhqNjY0VZ42NZ8TixUtrnAhgerjootdMag4AQH1Q3gMAAABVkcvlYt26qyrO1q27KnI5H0MAnAx79/ZMag4AQH3wXTMAAABQNQsXLooFC84etXbWWWfHwoXFjBIBnPoWLVoSDQ0NFWcNDQ2xaNGS2gYCAOCEKO8BAACAqnr726+OJEkiIiJJkrjyyqszTgRwanvggf4YHh6uOBseHo4HHuivcSIAAE6E8h4AAACoqnw+H/l8/qjbAJwchUJLFIuLK86KxSVRKLTUOBEAACdCeQ8AAABUVWfn1iiVShERUSqVoqtra8aJAE5tSZJEe/uairP29jUju6EAAFDflPcAAABA1QwM9EdX17ZI0zQiItI0jc7ObTEwYMtmgJNp374Hj7H+8xonAQDgRCnvAQAAgKpI0zQ6OjaNFPdjrQNQHeVyOTZsuL7ibMOG66NcLtc4EQAAJ0J5DwAAAFRFX19v9PR0H1USlcvl6Onpjr6+3oySAZzaurvviqGhoYqzoaGh6O6+q8aJAAA4Ecp7AAAAoCoKhZYoFhdHLjf644ZcLhfF4pIoFFoySgZwalu0aEk0NDRUnDU0NMSiRUtqGwgAgBOivAcAAACqIkmSaG9fE0mSjGsdgOp44IH+GB4erjgbHh6OBx7or3EiAABOhPIeAAAAqJqmpuZobV01UtQnSRJtbauiqWl+xslg/Hbv3hXr118Ru3fvyjoKjEtzcyEaGxsrzhobz4jm5kKNEwEAcCKU9wAAAEBVtbWtjlmzZkdExOzZc6K1dXXGiWD8SqVSbN68Mfbv3xebN2+MUqmUdSQYU39/33Guef9Q9Pf31TgRAAAnQnkPAAAAVFU+n4/LLrs85s6dF+3tayOfz2cdCcats3NrDA4eiIiIwcED0dW1NeNEMLZCoSWKxcUVZ8XikigUWmqcCACAE6G8BwAAAKpu2bLlccMNn4xly5ZnHQXGbWCgPzo7t41a6+zcFgMDrhdOfUuSJNrb10SSjP64N5fLPbmeZJQMAICJUN4DAAAAMO2laRodHZsiTcuj1svl8pPraUbJYHyamprjec9bMGrtec9bEE1N8zNKBADARCnvAQAAAJj2+vp6o6en+6iSPk3T6Onpjr6+3oySwfgMDPTH/fffO2rtvvvutXMEAMAUorwHAAAAYNprbi5EY2NjxVlj4xnR3FyocSIYvyM7R1Ri5wgAgKlDeQ8AAADAtNff3xdDQ0MVZ0NDD0V/f1+NE8H4Hdk5olw++rIPdo4AAJg6lPcAAAAATHuFQksUi4srzorFJVEotNQ4EYzfkeM3lxv9cW8ul3P8AgBMIcp7AAAAAKa9JEmivX1NxfKzvX1NJEmSUTIY25HjtxLHLwDA1KG8BwAAAICIaGpqjra21aPWLrpodTQ1zc8oEYxfU1NzPPe5C0atPe95Cxy/AABTiPIeAAAAAJ7U1rY6Zs+eExERc+bMjdbW1WN8BdSHgYH+uP/++0at3X//fTEw0J9RIgAAJkp5DwAAUId2794V69dfEbt378o6CsC0ks/n43nPOysiIp773AWRz+czTgRjS9M0Ojo2RURacT1N08pfCABAXVHeAwAA1JlSqRSbN2+M/fv3xebNG6NUKmUdCWDaOHToUHz/+/8SERHf//6/xKFDhzJOBGPr6+uNnp7uKJfLo9bL5XL09HRHX19vRskAAJgI5T0AAECd6ezcGgcPDkZExMGDg9HVtTXjRADTx8c+9uGRs5TTNI0bb/xwxolgbIVCSxSLiyOXG/1xby6Xi2JxSRQKLRklAwBgIqZNeb9v3774+Mc/Hq997WvjBS94QZxzzjnxohe9KN74xjfG5s2b45FHHsk6IgAAQAwM9EdX17ZRxVFn5zbXqwWogb1798S99/5k1No99/wk9u7dk1EiGJ8kSaK9fU0kSTKudQAA6tO0KO9vu+22eOUrXxkbNmyIH/7wh/H//t//i8cffzwGBwfje9/7XnzgAx+I1tbW+PGPf5x1VAAAYBo71nVpXa8W4OQrl8uxYcP1FWcbNlx/1HbkUG+ampqjtXXVSFGfJEm0ta2Kpqb5GScDAGC8Tvny/nvf+16sX78+HnrooTjttNPiDW94Q2zcuDG2bNkSN954Y6xcuTIiInp7e+OP//iPo7/f2SwAAEA2XK8WIDvd3XfF0NBQxdnQ0FB0d99V40QwcW1tq2PWrNkRETF79pxobV2dcSIAACbilC7v0zSN973vffH444/HaaedFps2bYo///M/j5e+9KWxaNGieMUrXhGf+tSn4sorr4yIiAMHDsRHPvKRjFMDAADTlevVAmRn8eKl0djYWHHW2HhGLF68tMaJYOLy+XxcdtnlMXfuvGhvXxv5fD7rSAAATMApXd7/8Ic/jPvvvz8iIi699NJ44QtfWPFxf/qnfxoLFiyIiIivf/3r8cgjj9QsIwAAwBGuVwuQnVwuF+vWXVVxtm7dVUf9YBUAAEC1ndLfdXz/+98fuf2yl73smI9LkiRe8pKXRETEY489Fv/2b/920rMBAABU4nq1ANlZuHBRLFhw9qi1s846OxYuLGaUCCamVCrF5s0bY//+fbF588YolUpZRwIAYAJO6fJ+0aJF8Sd/8iexevXq+PVf//XjPjZN05Hb3tQCAABZcr1agOy8/e1Xj7p/5ZVXH+ORUH86O7fG4OCBiIgYHDwQXV1bM04EAMBEzMg6wMn0ohe9KF70oheN67Hf/e53R263tLiOJAAAkJ0j16v97Gc3xZvetMb1agGAMQ0M9Edn5+iyvrNzW6xYcV40NTVnlAoAgIk4pc+8H6877rgjfvzjH0dExIIFC2L+fNtRAgAA2Vq2bHnccMMnY9my5VlHgROye/euWL/+iti9e1fWUWBCPvaxD4+6f+ONHz7GI6F+pGkaHR2bolwuj1ofHh6Ojo5No3YdBQCgfk378v7AgQPxF3/xFyP316xZk2EaAAAAmPpcc5mpau/ePXHvvT8ZtXbPPT+JvXv3ZJQIxqevrzd6erorznp6uqOvr7fGiQAAOBGn9Lb5Y3n44YfjiiuuiP7+/oiIeMELXhAXXXTRpJ93xoxp/zMRAAAATGO33rotDh4cjIiIgwcH46tf3RaXXPK6jFPB8ZXL5diw4YaKsw0bboi/+7vPRC7nMx/qU0tLYcy5zyypd089RmfMyDlm65TfFybDn+365O/f+jJty/uHHnoo3vzmN8cPf/jDiIiYP39+fPSjH530N2G5XBKzZ59ehYQAAAAw9fT19cX27VtHtmhO0zS2b98Wra2vikLh+OUSZOm73/1uDA09VHE2NPRQ3H//j+KFL3xhjVPB+HR1dR13/t3vfjtaW1trlAZOzKOPNozcnj379Jg5c2aGaTiWp/4+wUT5s12f/P1bX6Zlef/zn/883vzmN49c537evHnxmc98Jp71rGdN+rnL5TQOHXpk0s8DAAAAU02apnHDDTcedW3lcrkcN9xwY7z73ddEkiQZpYPje+5zfysaG8+oWOCfccYZ8dzn/lYMDj6cQTIY24te9NL45Cc/GcPDw0fNGhoa4kUveqnjl7r36KOPjtweHHw4Zs48+ngme0/9fYKJ8me7Pvn79+Q788ynR0PD+E4gn3bl/U9+8pN4y1veEg888EBEPHHG/Wc+85n4zd/8zaq9xuHD5ao9FwAAAEwVvb3/GXv2/PCo9XK5HHv2/DB+9rP/iJaW59Q+GIzTunXr44MfvO6o9be+9aool584lqE+JfHKV14YO3ZsP2ryyle2RpomPrOk7j31GD18uOyYrVN+X5gMf7brk79/68u0umjBHXfcEa973etGivvf+I3fiC984QtVLe4BAABguioUWqJYXHzUJelyuVwUi0uiUGjJKBmMz8KFi2LOnLmj1ubOnRsLFxYzSgTjUy6X4447vllxdscd3/CDJwAAU8S0OfN+69atcc0118Thw4cjImLZsmXxyU9+MmbNmpVtMAAAADhFJEkS7e1r4p3vXF9x3Zb51LuBgf4YHBwctTY4OBgDA/3R1NScUSqmgjRNo1QqZfb6e/bcFUNDQxVnQ0NDsWvXd2PRoqU1TvWEfD7v738AgHGaFuX9rbfeGu95z3tGrrn33/7bf4u/+Zu/iac97WkZJwMAAIBTS1NTc8yaNTsOHNg/sjZr1qxoapqfYSoYW5qm0dGxKZIk4smPkEZ0dGyKq69+rwKSitI0jeuuuzbuu++erKMc08c//tHMXnvBgrPimmuu8+cHAGAcTvlt87///e/HNddcM1Lc/+Ef/mFcf/31insAAAA4Cfbu3TOquI+I2L9/f+zduyejRDA+fX290dPTfdT24uVyOXp6uqOvrzejZEwFemkAAKrhlD7zfmhoKK6++uoYHh6OiIiLL744rr322oxTAQAAwKmpXC7Hhg3XV5xt2HB9fOITmyKXO+XPI2CKKhRaolhcHD093UfNisUlUSi0ZJCKqSBJkrjmmusy3Tb/iA9+8H3xr/96/8j95z3vrHjnO6/JMJFt8wEAJuKULu8///nPR39/f0REPOtZz4r//t//e/z4xz8e8+uam5tj1qxZJzkdAAAAnFq6u49/zeXu7rti6dLfrnEqGJ8kSeLCCy+qWN5feOFFykeOK0mSmDlzZtYx4q1vvSre8Y63RsQTmdavf2dd5AIAYHxO6fL+lltuGbn94IMPxmtf+9pxfd0HPvCBeM1rXnOyYgEAAMApadGiJdHQ0DCyA95TNTQ0xKJFS2ofCsYpTdPYsWN7JEkycvnFiCcK0B07vhK/9VvnKPCpe2eccebI7Ve9qi3OPPPM4zwaAIB6c8ruVXfgwIGRs+4BAACAk++BB/orFvcREcPDw/HAA75Pp34dueb9U4v7iCdKfde8ZypateqSrCMAADBBp+yZ93PmzIl77rkn6xgAAAAwbbhmOFOZ4xcAAMjaKXvmPQAAAFBbSZJEe/uayOVGf9zQ0NAQ7e1rbDlOXTtyzftKXPMeAACoBeU9AAAAUDVNTc3R1rZ61Fpb26poapqfUSIYnyPXvK9kx46vHLWdPgAAQLUp7wEAAICqamtbHbNnz4mIiDlz5kZr6+oxvgKyd+Sa95W45j0AAFALynsAAACgqvL5fJx77srI5XKxYsX5kc/ns44EY2puLkRjY2PFWWPjGdHcXKhxIgAAYLpR3gMAAABVVSqV4tvf3hnlcjm+/e2dUSqVso4EY+rv74uhoaGKs6Ghh6K/v6/GiQAAgOlGeQ8AAABUVWfn1jh4cDAiIg4eHIyurq0ZJ4KxFQotUSwurjgrFpdEodBS40QAAMB0o7wHAAAAqmZgoD+6urZFmqYREZGmaXR2bouBgf6Mk8HxJUkSCxeeU3G2cOE5kSRJjRMBAADTjfIeAAAAqIo0TaOjY9NIcT/WOtST4eHh2LLlloqzLVu+GMPDwzVOBAAATDfKewAAAKAq+vp6o6enO8rl8qj1crkcPT3d0dfXm1EyGNvOnbcds6AfHh6OnTtvq3EiAABgulHeAwAAAFVx5JrhudzojxtyuZxrhlP3Vq684Jhb4ydJEitXXlDjRAAAwHSjvAcAAACqIkmSaG9fc1QBeqx1AAAA4JeU9wAAAEDVNDU1R2vrqpGiPkmSaGtbFU1N8zNOBse3c+dtkaZpxVmaprbNBwAATjrlPQAAAFBVbW2rI5/PR0REPj8zWltXZ5wIxnb++S+b1BwAAGCylPcAAABAVZVKpSiVSk/efnTkNtSzgYEHJjUHAACYLOU9AAAAUFUf+9iHR7YfT9M0brzxwxkngrE1NxeisbGx4qyx8Yxobi7UOBEAADDdKO8BAACAqtm7d0/ce+9PRq3dc89PYu/ePRklgvHp7++LoaGhirOhoYeiv7+vxokAAIDpRnkPAAAAVEW5XI4NG66vONuw4fool8s1TgTj19Q0f1JzAACAyVLeAwAAAFXR3X3Xcc5cHoru7rtqnAjG7/bbvzGpOQAAwGQp7wEAAICqWLx46XGvGb548dIaJ4LxW7nygmhoaKg4a2hoiJUrL6hxIgAAYLpR3gMAAABVkcvlYt26qyrO1q27KnI5H0NQvxoaGmLt2j+pOFu79opjFvsAAADV4rtmAAAAoGoWLlwUCxacPWrtrLPOjoULixklgvFbseL8mDnz6aPWnv70p8eKFedllAgAAJhOZmQdAAAAADi1vP3tV8e6dWsjTdNIklxceeXVWUeCcRkY6I9HH/3FqLVf/OIXMTDQH01NzRmlAoD69NjhUtYRmAIcJzAxynsAAACgqs4888z4nd95UXzve9+J3/mdF8aZZ56ZdSQYU5qm0dGxqeKso2NTXH31eyNJkhqnAoD6de3X35Z1BIBTjm3zAQAAgKoqlUpx3333RETEfffdE6WSs22of319vdHT011x1tPTHX19vTVOBAAATDfOvAcAAACqqrNzaxw8OBgREQcPDkZX19a4+OJLM04Fxzd/fnM0NDTE8PDwUbOGhoaYP9+2+QDwVNe9/OPxtBn5rGNQ5x47XLJLA0yA8h4AAAComoGB/ujq2hZpmkbEE1uRd3ZuixUrznPNcOranj0/rFjcR0QMDw/Hnj0/jKVLf7vGqQCgfj1tRj7yynuAqrJtPgAAAFAVR64ZfqS4H2sd6sk55yya1BwAAGCylPcAAABAVRy5Zni5XB61Xi6XXTOcunfHHd+c1BwAAGCylPcAAABAVRQKLVEsLo5cbvTHDblcLorFJVEotGSUDMa2cuUF0dDQUHHW0NAQK1deUONEAADAdOOa9wAAAEBVJEkS7e1r4l3vuqriepIkGSWDsTU0NMTatX8Sf/d3nzhqtnbtFccs9gEA4ESkaRqlUinrGFEqPVrxdpby+fy0/f5ReQ8AAABUTVNTc7S2rort22+NNE0jSZJoa1sVTU3zs44GY1qx4vzo6NgUjz76yw8tZ858eqxYcV6GqQAAONWkaRrXXXdt3HffPVlHGWXdusuzjhAREQsWnBXXXHPdtCzwbZsPAAAAVFVb2+o4/fTTIyLi9NMbo7V1dcaJYHwGBvpHFfcREY8++osYGOjPKBEAAKeqadhLMw7OvAcAAACqLk2P/G+abRAYpzRN49Of/l8VZ5/+9P+Ka675y2l55g8AANWXJElcc811dbFt/hOOfN9WH+93bZsPAAAAUCWdnVvjkUcejoiIRx55OLq6tsbFF1+acSo4vt7e/4x77/1Jxdm99/4kenv/M57znP9fjVMBAHCqSpIkZs6cmXUM6oxt8wEAAICqGRjoj66ubSNn3KdpGp2d22w7DgAAAGNQ3gMAAABVkaZpdHRsOmqr/GOtQz1paXlOLFhwdsXZggXPj5aW59Q4EQAAMN0o7wEAAICq6OvrjZ6e7iiXy6PWy+Vy9PR0R19fb0bJYGxJksSyZb9dcbZs2bJpe81NAACgdpT3AAAAQFUUCi1RLC6OXG70xw25XC6KxSVRKLRklAzGNjw8HFu23FJxtmXLLTE8PFzjRAAAwHSjvAcAAACqIkmSaG9fc9QZysdah3qyc+dtxyzoh4eHY+fO22qcCAAAmG6U9wAAAEDVNDU1R2vrqpGiPkmSaGtbFU1N8zNOBsd3/vkvm9QcAABgspT3AAAAQFW1ta2OWbNmR0TE7NlzorV1dcaJYGwDAw9Mag4AADBZynsAAACgqvL5fJx77srI5XKxYsX5kc/ns44EYyoUWqJYXFxxViwuiUKhpcaJAACA6UZ5DwAAAFRVqVSKb397Z5TL5fj2t3dGqVTKOhKMKUmSePGLV1ScvfjFK0YuBQEAAHCyKO8BAACAqurs3BoHDw5GRMTBg4PR1bU140QwtnK5HDff3FFxdvPNm6NcLtc4EQAAMN3MyDoAAAAAcOoYGOiPrq5tkaZpRESkaRqdndtixYrzoqmpOeN0cGzd3XfF0NBQxdnQ0FB0d98VS5f+do1TAaeaNE3tSHMMpdKjFW/zS/l83k4wAKc45T0AAABQFWmaRkfHppHi/r+uX331e33gTN0655xFk5oDjEepVIrLL39j1jHq3rp1l2cdoS5t3Pi5mDlzZtYxADiJbJsPAAAAVEVfX2/09HQftb14uVyOnp7u6OvrzSgZjO2OO745qTkAAMBkOfMeAAAAqIpCoSWKxcWxd2/PqAI/l8vFwoWLolBoyTAdHN955/1edHTcdNw5QDW97g8/ETNm5LOOUVeO7N5jp55fOny4FF/8/FuzjgFAjSjvAQAAgKpIkiTa29fEu951VcV1H8RTz+6+e8+Yc9e8B6ppxox8nHaaLdABgF+ybT4AAABQNU1NzdHaumrUWlvbqmhqmp9NIBgn17wHAACyprwHAAAAqurlL3/VyFn2SZLE7//+qzJOBGNzzXsAACBrynsAAIA6tHv3rli//orYvXtX1lFgwr7+9a+OXLM2TdP453/+asaJYGwrV14QDQ0NFWcNDQ2xcuUFNU4EAABMN8p7AACAOlMqlWLz5o2xf/++2Lx5Y5RKpawjwbgNDPTH9u1bR61t3741Bgb6M0oE49PQ0BCXXHJpxdkll7zumMU+AABAtSjvAQAA6kxn59Y4eHAwIiIOHhyMrq6tY3wF1Ic0TaOjY1OkaXnUerlcfnI9zSgZjC1N09i79+6Ks717exy/AADASae8BwAAqCMDA/3R1bVt1JbjnZ3bnLXMlNDX1xs9Pd0VZz093dHX11vjRDB+jl8AACBrynsAAIA68cuzltNxrUO9mT+/+bjXDJ8/v7nGiWD8nv3spknNAQAAJkt5DwAAUCeOnPVZLh+95bizPpkK9uz5YQwPD1ecDQ8Px549P6xtIJiAr3zlHyc1BwAAmCzlPQAAQJ0oFFqiWFwcudzob9VyuVwUi0uiUGjJKBmMz+LFS6OxsbHirLHxjFi8eGmNE8H4vfrVF09qDgAAMFnKewAAgDqRJEm0t6+JJEnGtQ71JpfLxbp1V1WcrVt31VE/mAL15IEH+ic1BwAAmCzfNQMAANSRpqbmaG1dNVLUJ0kSbW2roqlpfsbJYHwWLlwUCxacPWrtrLPOjoULixklgvF58MGfT2oOAAAwWcp7AACAOtPWtjpmzZodERGzZ8+J1tbVGSeCiXn7269+yr0krrzy6mM+FupFsbh4UnMAAIDJUt4DAADUmXw+H5dddnnMnTsv2tvXRj6fzzoSTEg+n4+ZM2dGRMTMmXnHMFPCHXd8c1JzAACAyVLeAwAA1KFly5bHDTd8MpYtW551FJiwzs6tUSqVIiKiVCpFV9fWjBPB2FauvCAaGhoqzhoaGmLlygtqnAgAAJhulPcAAABA1QwM9EdX17ZI0zQiItI0jc7ObTEw0J9xMji+hoaGWLiwWHF2zjnFYxb7AAAA1aK8BwAAAKoiTdPo6Ng0UtyPtQ715PHHH489e35Ycdbd/cN4/PHHaxsIAACYdpT3AAAAQFX09fVGT093lMvlUevlcjl6erqjr683o2Qwts9//u8nNQcAAJgs5T0AAEAd2r17V6xff0Xs3r0r6ygwboVCSxSLiyvOisUlUSi01DgRjN8b3nDZpOYAAACTpbwHAACoM6VSKTZv3hj79++LzZs3RqlUyjoSjEuSJLFw4TkVZwsXLowkSWqcCMbvwQd/Pqk5AADAZCnvAQAA6kxn59Y4eHAwIiIOHhyMrq6tGSeC8RkeHo4tW26pONuy5ZYYHh6ucSIYv/nzm6OhoaHirKGhIebPb65xIgAAYLpR3gMAANSRgYH+6OraFmmaRkREmqbR2bktBgb6M04GY9u587ZjFvTDw8Oxc+dtNU4E47dnzw+Pe/zu2fPD2gYCAACmHeU9AABAnUjTNDo6No0U92OtQ71ZufKC4565vHLlBTVOBON3zjmLJjUHAACYLOU9AABAnejr642enu4ol8uj1svlcvT0dEdfX29GyWB8Ghoa4pJLLq04u+SS1x2z2Id6cMcd35zUHAAAYLKU9wAAAHWiUGiJYnFxJEkyaj1JkigWl0Sh0JJRMhifNE1j7967K8727u2xewR17bzzfm9ScwAAgMlS3gMAANSJJEniwgsvqrht/oUXth1V6kO9ObJ7RCV2j6De3X33nknNAQAAJkt5DwAAUCfSNI0dO7ZXnO3Ysd1Zy9S95uZCNDY2Vpw1Np4Rzc2FGieC8XPNewAAIGvKewAAgDrhrGWmuv7+vhgaGqo4Gxp6KPr7+2qcCMbPNe8BAICsKe8BAADqxJFr3udyo79Vy+VyrnnPlHDkGP6vl3hIksQxTN176UtXTmoOAAAwWcp7AACAOpEkSbS3r6lYfFZah3pzrGM1l8s5hql73/rWzknNAQAAJkt5DwAAUEeampqjtXXVSMmZJEm0ta2Kpqb5GSeD8Wlqao7nPnfBqLXnPvd5jmHq3vnnv2xScwAAgMlS3gMAANSZtrbVMWvW7IiImD17TrS2rs44EYzfwEB/3H//vaPW7rvv3hgY6M8oEYzPwMADk5oDAABM1oysAwAAADBaPp+Pyy67PD772U3xpjetiXw+n3UkGJc0TaOjY1PFWUfHprj66vfaOp+61dxciMbGxhgaGjpq1th4RjQ3FzJIBQD167HhUtYR6kqaphER3u/+F44TmBjlPQAAQB1atmx5LFu2POsYMCF9fb3R09N91Hq5XI6enu7o6+uNlpbnZJAMxtbf31exuI+IGBp6KPr7+xy/APAU137tbVlHADjl2DYfAAAAqIpCoSWKxcUVZ8XikigUWmqcCMZv/vzmaGhoqDhraGiI+fOba5wIAACYbpx5DwAAAFRFkiTx4hevqHj2/YtfvMIWotS1PXt+GMPDwxVnw8PDsWfPD2Pp0t+ucSoAqC/5fD42bvxc1jHqTqn0aKxbd3lERGzYsDHy+ZkZJ6pPLgkHY1PeAwAAAFVRLpfj5ps7Ks5uvnlzvPjF50YuZxNA6tPzn79wUnMAmA6SJImZMxXTx5PPz/T/EXDCfMcMAAAAVEV3913HuWb4UHR331XjRDB+Gzf+r0nNAQAAJkt5DwAAAFTF4sVLo7GxseKssfGMWLx4aY0Twfi1ta2e1BwAAGCylPcAAABAVeRyuVi37qqKs3XrrrJlPnWtpeU5k5oDAABMlu+aAQAAgKqZN+9Zx1ifV+MkMDFf+co/TmoOAAAwWcp7AAAAoCrSNI2Ojk0VZx0dmyJN0xongvG76KLXTGoOAAAwWcp7AAAAoCr6+nqjp6e74qynpzv6+nprnAjGb+/enknNAQAAJkt5DwAAAFRFodASxeLiSJJk1HqSJFEsLolCoSWjZDC2RYuWRENDQ8VZQ0NDLFq0pLaBAACAaUd5DwAAAFRFkiRx4YUXHbU9fpqmceGFbUeV+lBPHnigP4aHhyvOhoeH44EH+mucCAAAmG6U9wAAAEBVpGkaO3ZsrzjbsWO7a95T1+bOnTepOQAAwGQp7wEAAICqcM17prKPf/wjk5oDAABMlvIeAAAAqIqmpvmTmkOW3va2/zGpOQAAwGQp7wEAAICquP32b0xqDlnav3/fpOYAAACTpbwHAAAAquL88182qTlkyc4RAABA1pT3AAAAQFUMDDwwqTlkyc4RAABA1pT3AAAAdWj37l2xfv0VsXv3rqyjwLgVCi1RLC6uOCsWl0Sh0FLjRDB+do4AAACyprwHAACoM6VSKTZv3hj79++LzZs3RqlUyjoSjEuSJNHevqbirL19TSRJUuNEMH52jgAAALKmvAcAAKgznZ1b4+DBwYiIOHhwMLq6tmacCMavqak5GhpmjFqbMWOG64VT91zzHgAAyJryHgAAoI4MDPRHV9e2SNM0IiLSNI3Ozm0xMNCfcTIYnx07tsXw8OFRa4cPH44dO7ZlEwjGyTXvAQCArCnvAQAA6kSaptHRsWmkuB9rHerN4cOH45Zbbq44u+WWm+Pw4cMVZ1APXvSil0xqDgAAMFnKewAAgDrR19cbPT3dUS6XR62Xy+Xo6emOvr7ejJLB+Gzb9uVJzSFLH/zg+yY1BwAAmCzlPQAAQJ0oFFqiWFwcudzob9VyuVwUi0uiUGjJKBmMz0UXvWZSc8jSO9957aTmAAAAk6W8BwAAqBNJkkR7+5pIkmRc61Bv9u7tmdQcsvSP/3jLpOYAAACTpbwHAACoI01NzdHaumqkqE+SJNraVkVT0/yMk8HYFi1aEg0NDRVnDQ0NsWjRktoGggl47Wv/cFJzAACAyVLeAwAA1Jm2ttXxjGecHhERp5/eGK2tqzNOBOPzwAP9MTw8XHE2PDwcDzzQX+NEMH5f+tLnJzUHAACYLOU9AABAHfrlDvlpljFgQpqbCzFz5syKs5kznx7NzYUaJ4Lxe93r3jSpOQAAwGQp7wEAAOpMZ+fWGBoaioiIoaGh6OramnEiGJ/e3v+MRx99tOLs0Ud/Eb29/1njRDB+3/727ZOaAwAATJbyHgAAoI4MDPRHZ+e2UWudndtiYMB249S/Bx/8+aTmkKWzznr+pOYAAACTpbwHAACoE2maRkfHpkjT8qj1crn85Lot9KlvixYtmdQcsvTsZzdNag4AADBZM7IOAAAAwBP6+nqjp6f7qPU0TaOnpzv6+nqjpeU5GSSD8al0/P7X+dKlv12jNEwlaZpGqVTKNMMNN3x4zPn69VfXKM1o+Xw+kiTJ5LUBAIDaUd4DAADUiebmQjQ2No5c7/6pGhvPiObmQgapYPwWL1563GN48eKlGaSi3qVpGtddd23cd989WUc5rr1798Tll78xk9desOCsuOaa6xT4AABwirNtPgAAQJ3o7++rWHpGRAwNPRT9/X01TgQTk8vlYvnyF1ScLV/+O5HL+RiCynTSAAAAzrwHAACoG4VCSxSLiytuPV4sLolCoSWDVDB+hw8fjttv/2bF2e23fzPa2y+PGTN8FMFoSZLENddcl/m2+UdUOrt+48bPZZDkl2ybDwAA04PvmAEAAOpEkiTR3r4m3vnO9VEul0fWc7lctLevUdxQ97Zt+/KY8z/4g0trlIapJEmSmDlzZtYxIiLiHe94d3z0ox8cuf/ud/953WQDAABObfarAwAAqCNNTc3R1rZ61NpFF62Opqb5GSWC8bvootdMag714PnPXzhy+/TTT4+FC4sZpgEAAKYT5T0AAECdaWtbHbNnz4mIiDlz5kZr6+oxvgLqw969PZOaQ7254YZPZR0BAACYRpT3AAAAdSafz8dll10ec+fOi/b2tZHP57OOBONyzjmLJjUHAACA6cw17wEAAOrQsmXLY9my5VnHgAm5445vjjm/4IJX1CgNAAAATC3OvAcAAACq4oUvfPGk5gAAADCdKe8BAACAqnj/+6+Z1BwAAACmM+U9AABAHdq9e1esX39F7N69K+soMG7XXvtXk5oDAADAdOaa9wAAAHWmVCrF5s0bY3DwQGzevDEWLixGPp/POhaM6b777hlzvnTpb9coDQDUt8cfL2UdgSnAcQIwvSjvAQAA6kxn59Y4eHAwIiIOHhyMrq6tcfHFl2acCsZ2zjmLJjUHgOnklpvfmnUEAKDO2DYfAACgjgwM9EdX17ZI0zQiItI0jc7ObTEw0J9xMhjbHXd8c1JzAAAAmM6ceQ8AAFAn0jSNjo5NI8X9f12/+ur3RpIkGaWDsb30pSujo+Om484BgCdc+oZPxGmnuTQSx/f44yW7NABMI8p7AACAOtHX1xs9Pd1HrZfL5ejp6Y6+vt5oaXlOBslgfL71rZ1jzi+44BU1SgMA9e200/Jx2mkzs44BANQR2+YDAADUiUKhJYrFxZHLjf5WLZfLRbG4JAqFloySwficd97vTWoOAAAA05kz7wEAAOpEkiTR3r4m3vWuqyqu2zKfenf33XvGnC9d+ts1SgOcqtI0jVKplHWMulQqPVrxNr+Uz+e9pwIA6pbyHgAAoI40NTVHa+uq2L791kjTNJIkiba2VdHUND/raDCm5z9/4aTmAONRKpXi8svfmHWMurdu3eVZR6hLGzd+LmbOtFU9AFCfbJsPAABQZ9raVsesWbMjImL27DnR2ro640QwPjfd9L8mNQcAAIDpzJn3AAAAdSafz8dll10en/3spnjTm9ZEPp/POhKMy9q1fxrf/e53jjsHqKbT//AvIpnxtKxj1JU0TSMibA3/FOnhx+Lhz78v6xgAAGNS3gMAANShZcuWx7Jly7OOARMynmveL1/+ghqlAaaDZMbTIjnND7k9lcoeAGDqsm0+AAAAUBWDgwcmNQcAAIDpTHkPAMApa/fuXbF+/RWxe/eurKPAhDl+mYrOP/9lk5oDAADAdKa8BwDglFQqlWLz5o2xf/++2Lx5Y5RKpawjwbg5fpmqxrNtPgAAAFCZ8h4AgFNSZ+fWOHhwMCIiDh4cjK6urRkngvFz/DJVLVxYnNQcAAAApjPlPQAAp5yBgf7o6toWaZpGRESaptHZuS0GBvozTgZjc/wylW3ffuuk5gAAADCdKe8BADilpGkaHR2bRorPsdahnjh+meouvPDVk5oDAADAdKa8BwDglNLX1xs9Pd1RLpdHrZfL5ejp6Y6+vt6MksHYHL9Mdbfc8rlJzQEAAGA6U94DAHBKKRRaolhcHLnc6Le6uVwuisUlUSi0ZJQMxub4Zaq79NI3TmoOAAAA05nyHgCAU0qSJNHeviaSJBnXOtQTxy9T3Y4dX5nUHAAAAKYz5T0AAKecpqbmaG1dNVJ0JkkSbW2roqlpfsbJYGyOX6ayV73qoknNAQAAYDpT3gMAcEpqa1sds2bNjoiI2bPnRGvr6owTwfg5fpmqPvOZT01qDgAAANOZ8h4AgFNSPp+Pyy67PObOnRft7Wsjn89nHQnGLZ/Px7x5z4qIiLlz5zl+mTIuv/ytk5oDAADAdDYj6wAAAHCyLFu2PJYtW551DJiwffsejPvuuyciIu67757Yt+/BkTIf6tm+fQ+OOW9peU6N0gAAAPD/b+/O46yq6/+Bv++w3EkGFGQRUCMLzIVFcy13S1NBUdM0F0zFNNGfWqkVRkpfpa+VG2ZFJIvmLgiYmgtumZE7qSwafIEBEZRtRC4Dc39/EDfGWWGYOXdmns/Hw4fnnM/n3vua4cPl3vM+n8+hcTHzHgAAIM8MH35Nuf1f/OKaKnpCfunSZYc6tQMAAEBzpngPAACQR1588dn4+OOPyh376KOP4sUXn00mEGyGZ599uk7tAAAA0Jwp3gMAAOSJ9evXxx//+LtK2/74x9/F+vXrGzgRbJ6DDjq0Tu0AAADQnCneAwAA5ImpU5+qskC/fv36mDr1qQZOBJvnnnvG1akdAAAAmjPFewAAgDxx+OFfjxYtWlTa1qJFizj88K83cCLYPKeffnad2gEAAKA5U7wHAADIEy1atIjzz7+w0rbzz7+oysI+5IsXX3yuTu0AAADQnCneAwAA5JGDDjosCgs/V+7Y5z73OfcKp1E45JDD69QOAAAAzZniPQAAQB5ZvHhRZDJryh3LZDKxePGihBJB7T3//NQ6tQMAAEBzpngPAACQJ7LZbIwdO7rK49lsNoFUUHuHHnpEndoBAACgOVO8BwAAyBMLFxbH9OlvVijSZ7PZmD79zVi4sDihZFA7//rXW3VqBwAAgOZM8R4AACBPdO3aLYqKiiptKypqG127dmvgRLB5evfuW6d2AAAAaM4U7wEAAPLEokULo6SkpNK2kpJVsWjRwgZOBJtn+vQ369QOAAAAzZniPQAAQJ7o1KlzndohaT177lqndgAAAGjOFO8BAADyxN13j6lTOyRt+PCf1qkdAAAAmjPFewAAgDxx5pnfrVM7JO1rXzusTu0AAADQnCneAwAA5IlWrVrFcccdX2nbcccNjFatWjVwItg8Rx55VJ3aAQAAoDlTvAcAAMgjp512VrRo0bLcsZYtW8Zpp52RUCKovd/85oY6tQMAAEBzpngPAECT9cAD98agQd+OBx64N+kosFl+/vPry+0PG3Z9FT0hv1x22VV1agcAAIDmTPEeAIAmaeXKlTF58sNRVlYWkyc/HCtXrkw6EtRahw7bV7sP+erBB++pUzsAAAA0Z4r3AAA0SbfccmNks9mIiMhms3HrrTcmnAhq75Zbyo9X45fG4tRTq7+9Q03tAAAA0Jwp3gMA0OS8/fZbMWvWjHLHZs6cEW+//VZCiaD2jF8aszvv/H2d2gEAAKA5a9bF+2uuuSZ23XXXuOmmm5KOAgDAVlJWVhYjR1b++W7kyJuirKysgRNB7Rm/NHannz6oTu0AAADQnLVMOkBSnnzyybj//vuTjgEAwFb25puvR0lJSaVtJSUl8eabr8dee32lgVNB7Ri/NHY/+9mVNbbffvvoBkoDAPlt3bpM0hHyzsZbn6VSqYST5A/jBKB5aZbF++eeey4uv/zypGMAAFAP+vbdK4qKiiotgBYVtY2+ffdKIBXUjvFLY/eLX/wqLr30gmrbAYAN7rnr4qQjAAB5ptktmz9mzJi4+OKLo7S0NOkoAADUg4KCghgypPILNYcMuTwKCprdR2AakYKCgjjjjMqXFT/jjEHGL3nv6aefqFM7AAAANGfNZub93LlzY8SIETF16tSIiGjRokWsX78+4VQAANSHPfboE716fTlmzZqRO7brrl+OPfbonWAqqFk2m42XXnqx0raXXnohvva1QywhSl479tjj45FHHqq2HQCas3Q6HaNGjU86Rl7KZNbEkCGDIyJi5MhRkU4XJpwo/6TT6aQjAFDPmkXx/u67744bbrghN9v+S1/6UpxzzjkxdOjQhJMBAFBfzjvvwrjqqsty++eee2FyYaCWFi4sjunT36y0bfr0N2PhwuLo3n3HBk4FtfenP/2uxvYhQ65ooDQAkH9SqVQUFipK1ySdLvR7AqBZahZrLk6fPj1KS0ujdevW8b3vfS8efvjh2HnnnZOOBQBAPRo9unwBqaaCEuSDrl27RVFRUaVtRUVto2vXbg2cCDbPoEGD69QOAAAAzVmzmHmfTqfjlFNOiYsuuii6d++edBwAAOrZ22+/VW7J/IiImTNnxNtvvxV77NEnoVRQs0WLFkZJSUmlbSUlq2LRooVm3lOlbDYbmUwm0Qy3335zje2XXfajhgnzGel02m0nAAAAyGvNong/bNiwKChoFosMAAA0e2VlZTFy5E2Vto0ceVPcfvtonw3JW926dY/evftWunR+7979ols3FyNTuWw2G8OHXxOzZ89MOkq13n77rRg8+KxEXrtXr11j6NDhCvgAAADkrWZx1tLJWQCA5uPNN1+vZuZySbz55usNnAhqL5VKxc47f77Stp13/ryiI9UyPAAAAKBxaxYz7xtay5YuFgAASMpXvvKVKCpqGyUlqyq0tW3bNr7yla+4uJO8tW7dunj00UmVtj366CNx2mnfiZYtfY2jcj//+f8kvmz+Rt/97hkVjt15590JJPkvy+ZTW5ue12nZssB5njzkz4S68Pc6f3n/pTEzfoGtxVmfraygIBXt27dJOgYAQLP205/+JH784x9Xcvynsf32bRNIBLUzduzYatv/8peJMWjQoAZKQ+NUlHSAiIi47rrr4mc/+1luf8SIEdG16/YJJoLaW7OmRW67ffs2UVhYmGAaKrPp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IpNZU+l20tLpdKRSqaRjAAAAADRJivcAAGxVip9VU/jMb9lsNoYPvyZmz56ZdJRyhgwZnHSEnF69do2hQ4cbxwAAAAD1QPEeaLIUj6qmeJT/jN+qGb/5TfGzegqf+c8fDQAAAABJUbwHmiTFo+opHuU347d6xm/+80dDY5VKpWLo0OF5cfHUBtn//D9//lK5gAoAAACg/ijeA02W88o0ZsYvjZXiZ/UUPvNfKpWKwsLCpGMAAAAA0AylstlstuZu1Nb69WXx8cefJB0DiPxZdnwDxSM2j/FbNeMXAAAAAIDGokOHNtGiRUGt+pp5DzRZZs7RmBm/AAAAAADQvNSuxA8AAAAAAAAA1JtmM/O+rKwsJkyYEBMnToyZM2fG6tWro1OnTrH33nvHaaedFvvuu2/SEQEAAAAAAABopprFPe9XrVoV3//+92PatGmVtqdSqTjnnHPi6quvrvNruec9AAAAAAAAABHueV9ONpuNyy67LFe4P+igg+L000+Pjh07xrvvvhujRo2K4uLiuPPOO6NDhw5xwQUXJJwYAAAAAAAAgOamyc+8nzRpUvzoRz+KiIiTTjopbrjhhnLty5cvjzPOOCPee++9SKfT8de//jV22GGHLX49M+8BAAAAAAAAiNi8mfe169WI3XnnnRERUVRUFFdddVWF9u222y6uvfbaiIjIZDIxbty4Bs0HAAAAAAAAAE26eD9//vx45513IiLi8MMPj+22267Sfvvss0984QtfiIiIxx9/vKHiAQAAAAAAAEBENPHi/auvvprbPuCAA6rtu99++0VERHFxccybN69ecwEAAAAAAADAppp08f69997Lbffo0aPavjvttFNue/bs2fUVCQAAAAAAAAAqaNLF+w8++CC33a1bt2r7du3atdLHAQAAAAAAAEB9a9LF+xUrVuS227RpU23fbbbZJre9atWqessEAAAAAAAAAJ/VMukA9Wnt2rW57cLCwmr7btq+6eM2V0FBKjp0qP5CAQAAAAAAAACavoKCVK37NunifYsWLXLbqVT1v5RsNpvbLijY8gUJUqlUtGhR+z8AAAAAAAAAAGjSy+ZvuhT+mjVrqu2byWRy261bt663TAAAAAAAAADwWU26eL/pfe4//fTTavuuXr06t73tttvWWyYAAAAAAAAA+KwmXbzv3r17bnvRokXV9t20vUuXLvWWCQAAAAAAAAA+q0kX73v27JnbnjdvXrV958+fn9v+0pe+VG+ZAAAAAAAAAOCzmnTxvl+/fpFKpSIi4pVXXqm277Rp0yIiomvXrrHjjjvWezYAAAAAAAAA2KhJF++7du0a/fr1i4iIJ554IkpKSirt98orr8ScOXMiIuLoo49uqHgAAAAAAAAAEBFNvHgfEXHWWWdFRMTy5ctj2LBhUVZWVq59xYoVMWzYsIiIaNWqVZx55pkNnhEAAAAAAACA5i2VzWazSYeob+edd168+OKLERGxzz77xNlnnx1dunSJmTNnxu9///soLi6OiIgrrrgivve97yUZFQAAAAAAAIBmqFkU70tKSuLCCy+Mf/7zn1X2Oeecc+Lqq6+OVCrVgMkAAAAAAAAAoJkU7yMiysrKYuLEiTFp0qSYMWNGrFq1Ktq3bx977bVXnHHGGXHAAQckHREAAAAAAACAZqrZFO8BAAAAAAAAIF8VJB0AAAAAAAAAAJo7xXsAAAAAAAAASFjLpANAdRYvXhzjx4+P5557LhYsWBAREV26dImDDjooTjnllNh1110TTgibZ+XKlXHcccfFhx9+GAMGDIhf/epXSUeCCp577rm44IILatX3oIMOitGjR9dzIth8s2fPjnvvvTdeeuml+OCDD6KsrCy6d+8eBx98cJxzzjnRtWvXpCNCzm233RYjR47c7MedeOKJMWLEiHpIBFvm008/jfvuuy+efPLJmD17dqxevTratWsXu+++e5xwwglx7LHHRosWLZKOCZVatmxZjB8/PqZOnRrz5s2LtWvXRrdu3eKrX/1qnHnmmfHFL34x6YhQzjXXXBP3339/XHjhhXH55ZdX27esrCwmTJgQEydOjJkzZ8bq1aujU6dOsffee8dpp50W++67bwOlhv/anDG80dq1a+Pkk0+OWbNmxZ133hlf/epX6zklVLQ5Y3fp0qVxzz33xIsvvhhz5syJ1atXR1FRUfTs2TOOPPLIOPXUU2ObbbZpoOSwweaMYTW6ZCjek7eeeuqpuOqqq6KkpKTc8Tlz5sScOXPinnvuiQsvvDAuueSShBLC5hs+fHh8+OGHSceAas2YMSPpCFAnv/3tb+P222+PdevWlTv+/vvvx/vvvx8PPvhg/OY3v4lDDz00oYSwdbRq1SrpCJAzd+7cuPDCC2POnDnljn/00UfxwgsvxAsvvBD3339/jBw5MrbddtuEUkLlXnzxxbjiiitixYoV5Y7PnTs35s6dG/fff39ceeWVMWjQoIQSQnlPPvlk3H///bXqu2rVqvj+978f06ZNK3d84cKFsXDhwnj00UfjnHPOiauvvro+okKlNmcMb+rGG2+MWbNm1UMiqJ3NGbtPPfVUXH311bFq1apyx5ctWxbTpk2LadOmxbhx4+L222+P3XbbrT7iQgWbO4bV6JKheE9eev311+Oyyy6L0tLSaNGiRZx66qlxyCGHRFFRUbzzzjsxatSoWLp0aYwcOTLatGkT5557btKRoUZPPfVUTJo0KekYUKN33nknIiI6duwYf/zjH6vtW1RU1BCRoNZGjhwZt912W0REtG/fPs4999zYa6+9Yt26dfH444/H/fffHyUlJXHppZfGww8/bBYdeeG0006Lr3/96zX2W7BgQVx++eVRWloanTp1iosvvrgB0kHNVq9eHeeff37Mnz8/IiL23XffOO2006Jr164xd+7c+NOf/hTvvfdeTJs2LYYMGRLjxo2LVCqVcGrY4NVXX40LL7wwSktLIyJys4i6du0a8+bNi3HjxsVbb70V119/faxcudLJSRL33HPP1XqWcjabjcsuuyxXuD/ooIPi9NNPj44dO8a7774bo0aNiuLi4rjzzjujQ4cOtV6BDepic8bwpm655ZYYN25cPSSC2tmcsTtt2rRcfaNVq1Zx6qmnxmGHHRbbbbddLFq0KCZMmBBTp06N4uLiOPfcc+Phhx+2QiD1bnPGsBpdshTvyUvXXXdd7ovzrbfeWu5k5n777RcDBgyIE044IZYsWRK33XZbnHzyyWZvkNc+/vjjGDZsWNIxoFbefffdiIjYfffdXflLo/Luu+/GHXfcERER3bt3j7Fjx8ZOO+2Uaz/wwANj9913j5/97GexZs2auOWWW+LWW29NKi7kdOrUKTp16lRtn7Vr18ZPfvKTKC0tjYKCgvj1r38dO+ywQwMlhOrddddducL98ccfH//7v/+bK85/5StfiQEDBsT3vve9eOmll2LatGnxxBNPxDe/+c0kI0NERKxbty6uvvrq3PmHiy++OC699NJce9++feOYY46JH/zgB/H444/HHXfcEUceeWTsvvvuSUWmmRszZkz86le/yo3ZmkyePDlexdk+ywAAJZtJREFUfPHFiIg46aST4oYbbsi19evXL4455pg444wz4r333ouRI0fG8ccf7/MF9Wpzx3DEhtvyDBs2LB555JF6TAbV25yxm81m49prr80V7kePHh37779/rr1Pnz5x9NFHx+233x633nprfPzxx/GrX/0qfv3rX9fnj0Azt7nvv2p0ySpIOgB81r/+9a/crM+jjz660llI22+/fZx33nkRsWGWx7PPPtuQEWGzXXvttbF06dLo0KFD0lGgWiUlJTFv3ryICCclaXRuvfXWWLduXaRSqbj55pvLFe43+va3vx29evWKiIhnnnkm1qxZ09AxYYuMHDky9xn53HPPLXfyB5L23HPP5bavvvrqCrPqW7duHVdeeWVu/+mnn26wbFCdZ599NvfZ96tf/Wq5wv1GLVu2jOuvvz622267WL9+fdx4440NHRNytya54YYbcjPgauPOO++MiA0rpl111VUV2rfbbru49tprIyIik8mY1Uy92dIx/Pe//z2+9a1v5Qr3tX0cbC1bMnbfeOONeO+99yJiwyprVX13+/73v587P/HXv/41Vq9evfWCw39syRhWo0ue4j15Z+3atfH1r389dt555/jGN75RZb9ddtklt71o0aKGiAZb5C9/+Us8/vjjUVBQEEOHDk06DlRrxowZkc1mIyLMuqdRWbZsWbzwwgsRseGLRZ8+farse95558Wpp54a5557ri/HNAozZsyI0aNHR0TEzjvvbMlm8s7SpUsjIqJdu3ax/fbbV9rnC1/4Qm57yZIlDZILavL3v/89t3322WdX2a9Nmza51SJefvnl+Oijj+o9G2x09913R//+/WPq1KkREfGlL30pV3Cvzvz583Mn3g8//PDYbrvtKu23zz775N6jH3/88a0TGjaxpWP4Bz/4QZxzzjm5IuhRRx0VgwYNqtessKktHbv//Oc/c9tHHnlklf1SqVR87Wtfi4gNNZF///vfdUwM5W3pGFajS55l88k7e++9d+y999419isuLs5td+7cuT4jwRZbunRpXHfddRERcc4550Tfvn0TTgTV23hyJyJijz32SDAJbJ6XXnopt5xX//79q+07cODAGDhwYAOkgq1j+PDhsW7duoiIGDp0aBQWFiacCMrr3LlzzJ07N1auXBlLliyp9DYQm56MtCQz+WLT8wo1fVfr2bNnRESUlZXFG2+8Ue3JeNiapk+fHqWlpdG6dev47ne/GxdffHG88cYbNT7u1VdfzW0fcMAB1fbdb7/9Ys6cOVFcXBzz5s2LnXfeua6xIWdLx/Drr78eERtmd1555ZUxcODAuO222+o5LfzXlo7dPn36xIUXXhiLFy8udwFrZTZOoInYsAIKbE1bOobV6JKneE+j9PHHH8ef/vSniIjYZptt4vDDD084EVRu2LBhsWzZsvjCF74Ql112mVlG5L2N97tv27ZtrF+/Pm644YZ48cUXY/78+dGyZcv4/Oc/H0ceeWScffbZ0a5du4TTwn/NmDEjt73prPuysrJYsmRJfPLJJ9GlS5do06ZNEvFgiz311FPxyiuvRETE1772tTj00EMTTgQVHXnkkTFt2rSIiPj1r38dI0aMKNe+fv36+NWvfpXbP/bYYxs0H1Rl03t+brPNNtX2bdnyv6fQ5s6dW1+RoIJ0Oh2nnHJKXHTRRdG9e/daP27jbOWIiB49elTbd9PbTc2ePVvxnq1qS8dwx44d4+STT45zzjnH9zgSsaVj94ADDqjxoqmN/vGPf+S2N+c1oDa2dAzXhhpd/VK8p9HIZDKxYMGCePrpp2PcuHGxZMmSSKVScc0110T79u2TjgcVTJw4MZ566qkoKCiIG264IdLpdNKRoEYbZ96XlpZG//79y53QzGQy8c4778Q777wTd911V9x2222x7777JhUVypk9e3ZERLRq1So6d+4cS5cujdtuuy0ee+yxWLFiRURsuD/ivvvuG5dccknss88+ScaFWtt0dlFl92KGfHD66afH008/HdOmTYsJEybEokWL4tRTT42uXbvG/PnzY+zYsfH2229HxIb7fh5yyCEJJ4YNNj2X8MEHH1Rb4Nx0KVAXZdOQhg0bFgUFm3/n0w8++CC33a1bt2r7du3atdLHwdawpWP43nvv3aLHwdaypWO3tp577rncJJpevXpZnYqtbmuPYTW6hqN4T6Mwffr0+Na3vlXu2A477BA///nPXdFDXlq8eHH8z//8T0RsWC5/r732SjgR1Gzt2rXx/vvvR0TEmjVrom3btnHOOefE/vvvH+3atYs5c+bEQw89FNOmTYtly5bFeeedF3/+859jzz33TDg5RCxfvjwiIoqKiuKNN96ICy+8MHdso/Xr18fLL78c//jHP+LKK6+Mc889t+GDwmZ46aWXcqtK7LffftGvX79kA0EV0ul0jBo1KkaPHh133nlnvPzyy/Hyyy+X69OpU6e48sor4/jjj08oJVTUr1+/mDx5ckRE/PWvf40LLrigyr7PPPNMbnv16tX1ng022tKT7hsvYI2IGmctb7ryxKpVq7bo9aAqWzqGFe5JWn2OwY8//jiGDRuW2z/vvPPq7bVovrbmGFaja1j+BaRRWLhwYYVjS5Ysifvuuy/+9a9/JZAIqjd06NBYuXJl9OjRI/7f//t/SceBWpk9e3Zupn2PHj1i4sSJ8cMf/jAOPvjg6Nu3bwwcODDGjx+fO6mZyWTiyiuvjLKysiRjQ0REfPLJJxGxYVxeeOGFsWLFijjrrLPi0UcfjenTp8dzzz0XV199dWyzzTaRzWbjl7/8ZfzlL39JODVU784778xtn3/++QkmgZq999578e6771ZZ1Fy6dGk89thjuQsFIR9885vfjMLCwoiI+P3vf19umfFNjRs3LmbNmpXbX7duXYPkg7pYu3ZtbnvjOK/Kpu2bPg6Are+TTz6Jiy66KLeqz3777ecCV/KeGl3DUrynUejRo0f8/ve/jwceeCBuv/32OPbYY2P9+vUxderUOPPMM+OFF15IOiLkPPDAA/H888/nlsuv6Usy5Isvf/nL8eSTT8add94Zo0ePjh133LHSfldccUVuNYn3338/nn322QZMCZX79NNPI2LDTLjly5fH8OHDY+jQofGlL30pWrduHTvssEN897vfjTvvvDNatWoVEREjRoyITCaTZGyo0vvvv5/7jLvrrru61z157dlnn40zzjgjnnzyydh2223j5z//ebzwwgsxffr0eOKJJ+Liiy+OVq1axTPPPBPf+c53nNwhb3Ts2DG+//3vR0RESUlJfOc734nx48fHhx9+GKWlpfHvf/87fvGLX8T1118fXbp0yT1u42cJyGctWrTIbadSqWr7ZrPZ3LbZzgD1Z9WqVXH++efHG2+8EREbZi7/5je/8d5L3lOja1jeEWgUdt111zjssMOiT58+8fWvfz1uuummuP766yNiw8n6H/7wh1FSUpJwSthwBdqIESMiImLQoEGx9957J5wIaq9Fixax8847x1e/+tUqC/cRG078fPvb387tv/TSSw0RD6q16YVSBx54YJxyyimV9uvXr19uma/Fixcbv+StKVOm5E6kn3TSSQmngap9+OGHcfnll8eaNWuiffv2cd9998Xpp58enTt3jtatW0ePHj3i0ksvjT/+8Y/RqlWrWL58eVxyySUuniJvXHDBBfGd73wnIjYsM/6LX/wiDj744Nhzzz3jmGOOifHjx0f37t3j17/+de4xmy4xDvlq03G6Zs2aavtu+p7cunXressE0Jx9+OGHcdZZZ8Vrr70WERsuIvzTn/4UnTp1SjgZ1EyNrmEp3tNonXzyyXH00UdHxIb73D7xxBMJJ6K5y2az8dOf/jRKSkqiR48ecdlllyUdCerNbrvtltsuLi5OMAlsUFRUlNs+6qijqu17xBFH5LY3Xu0O+ebJJ5+MiA0XTB1zzDEJp4GqTZw4MbdU/qWXXho777xzpf3233//OOOMMyJiwwWvTz/9dINlhOqkUqkYNmxYjBw5Mnr37l1uhnKnTp1i8ODB8cgjj0S7du1yxzt27JhEVNgsm97nfuMqVVXZ9JYn2267bb1lAmiuZsyYEaecckq8++67EbFhxv24cePii1/8YsLJYMup0dWflkkHgLo46qijcm8IG//hg6Tcd999uRmcZ599dsyZM6dCnw8//DC3vXLlyty47dixo6ssaVTcE5F8s+l76A477FBt327duuW2ly1bVm+ZYEvNnTs3Zs+eHRER++yzT7mlmiHfvPXWW7ntI488stq+3/jGN2LMmDERseHiqWOPPbY+o8Fm+cY3vhHf+MY3YuXKlbFkyZJo27ZtdOrUKVfMf//993N9q1ulCvJF9+7dc9uLFi2q9vPExvsuR4TPHQBb2XPPPReXXXZZ7kKpXXbZJf74xz+We5+GxkqNrn4o3pN3Vq1aFfPmzYsFCxbEUUcdVe19ubbbbrvcdmlpaQOkg6ptOnvzuuuuq7H/c889F88991xERAwZMiQuueSS+ooGtfLOO+/EggUL4qOPPoqBAwfG5z73uSr7fvTRR7ltM4/IB7vuumv89a9/jYgNS95WZ9MLTjadRQf5YtMZyWbdk+82na3Ztm3bavtuv/32ue1Vq1bVWyaoi3bt2lX6+eD111/Pbe++++4NGQm2SM+ePXPb8+bNi379+lXZd/78+bntL33pS/UZC6BZmTBhQgwdOjTWrVsXERF777133HHHHeXqGpBv1OiSp3hP3rnuuuti0qRJEbFhCcZNl2b+rHnz5uW2a5plB0D1Ro0aFX/5y18iIqJHjx5x4IEHVtn31VdfzW336dOn3rNBTTY9Gfnqq6/GiSeeWGXfjTOaI8ycIz/985//zG3vv//+CSaBmrVv3z63PW/evPjyl79cZd/Fixfntjct5ENS5s+fHw899FB89NFHcfLJJ1dZ3Mxms7kLq3beeefYaaedGjAlbJl+/fpFKpWKbDYbr7zyShx//PFV9p02bVpERHTt2tXnY4Ct5OGHH46f/OQnkc1mI2LDhdn/+7//G61bt044GVRPjS557nlP3tl3331z2w8++GCV/crKysq1H3TQQfWaC2oyYsSImDlzZrX/bTqTbsCAAbnjZt2TDw444IDc9sSJE6vs9+mnn8a9994bERGtWrWq8f7i0BAOPPDA3NL5jz32WCxdurTKvhMmTIiIiBYtWsQRRxzRIPlgc2xczadt27bugUje22+//XLbjzzySLV9J0+enNve9HsfJKW0tDTuuOOOuP/++6v9/PuXv/wliouLIyJi4MCBDRMO6qhr1665C1KeeOKJKCkpqbTfK6+8krvt38b71gJQN//85z9j6NChucL9mWeeGTfddJPCPY2CGl3yFO/JO8cee2xu9sZ9990Xf//73yv0yWazcf3118fbb78dERFf+9rXonfv3g2aE6CpOfbYY3NLHU2aNCmeeuqpCn1KS0vjqquuyp28/M53vlPuXuOQlBYtWsR5550XERElJSXxwx/+MD755JMK/caOHZv7bPGNb3wjOnfu3KA5oSaLFy+OZcuWRURE7969q12eDvLBcccdFx06dIiIDe+xU6dOrbTf5MmT46GHHoqIDff5/NrXvtZgGaEqu+yyS/Tq1SsiNsyO23R1no1mzpwZ1157bURsWDHizDPPbNCMUBdnnXVWREQsX748hg0bFmVlZeXaV6xYEcOGDYuIDRdmG98AdVdSUhI/+tGPYv369RERcfLJJ8c111zjux2Nhhpd8iybT94pKiqKa6+9Ni677LIoLS2Nc889N0455ZQ49NBDo2PHjjFnzpy49957c/eb22GHHeL6669PODVA49e2bdsYNmxYXHHFFVFWVhaXXnppnHLKKXHUUUdFUVFRzJo1K8aNGxezZs2KiA3L5V9++eUJp4b/GjRoUDz77LPx8ssvx9///vc48cQTY9CgQbHbbrvFqlWrYtKkSTFlypSIiOjQoUP87Gc/SzgxVDR37tzc9s4775xcEKiloqKi+J//+Z+4+OKLY/369XHRRRfFcccdF8ccc0x07tw5Pvzww3jsscfi0UcfjWw2G4WFhTFixIho2dLpCPLDD37wg/je974XmUwmzjzzzBg8eHD07ds31q1bFy+++GLcfffd8emnn0aLFi3ihhtuiG233TbpyFBrxx13XDz88MPx4osvxpQpU+KDDz6Is88+O7p06RIzZ86M3//+97kLsy+55BK3hADYCu66665YtGhRRER06tQpTj311Hj33XdrfFzXrl3L3T8ckqJGlzzflslLRx99dNx4441xzTXXxOrVq+O+++6L++67r0K/PffcM2655Rb30gDYSo499thYu3Zt/PznP88tj79xifxNHXTQQXHTTTfF5z73uQRSQuUKCgri97//fVx11VXx+OOPx//93//FddddV6Ffjx494vbbb3e/ZfLSxpM8ERtO3kBjcMQRR8Stt94aV199dZSUlMSUKVNyF0ttqlOnTnHTTTdF3759E0gJlTvssMPiJz/5Sfzyl7+M5cuXx4033lihT9u2bWPEiBFx6KGHJpAQ6uaWW26JCy+8MP75z3/GK6+8Eq+88kqFPuecc05ccMEFCaQDaHo2PY+2ZMmS+Pa3v12rx91www1x0kkn1Vcs2CxqdMlSvCdv9e/fP/bdd9+4++674/nnn4958+bF2rVro3379tGnT5847rjj4pvf/GYUFLj7A8DWNHDgwNh///3j7rvvjhdffDH3/tuxY8fo06dPnHDCCXHkkUcmHRMqVVhYGLfccku89NJL8dBDD8Vrr70WS5cujbZt28bnP//56N+/fwwcODDatGmTdFSo1Ka3e/Dll8bkG9/4RnzlK1+Je+65J55//vmYM2dOfPLJJ9G2bdvo2bNnHHHEEXHqqad6/yUvDRo0KPbZZ58YN25cTJs2LZYsWRKtWrWKHj16xGGHHRZnnnmmi/5otIqKimLcuHExceLEmDRpUsyYMSNWrVoV7du3j7322ivOOOOMOOCAA5KOCdAkfPzxx+UuyIbGTI0uOalsNptNOgQAAAAAAAAANGcuhwAAAAAAAACAhCneAwAAAAAAAEDCFO8BAAAAAAAAIGGK9wAAAAAAAACQMMV7AAAAAAAAAEiY4j0AAAAAAAAAJEzxHgAAAAAAAAASpngPAAAAAAAAAAlTvAcAAAAAAACAhLVMOgAAAABQs+Li4njvvfdi4cKFUVJSEqWlpbHNNttE586dY5dddolevXpFQYFr9AEAAKCxUrwHAACAPPXOO+/EAw88EFOnTo1FixZV27dt27Zx+OGHx6mnnhr77rtvAyXMH0cccUQUFxdHRMR+++0X48ePTzgRAAAAbB7FewAAAMgz77//fvziF7+Il156qdaPWbVqVUyaNCkmTZoU+++/f/z85z+PXXbZpR5TAgAAAFuT4j0AAADkkbvuuit++ctfxtq1a8sdT6VSseeee8bOO+8cHTp0iM997nOxdOnS+L//+7944403Yv369bm+//jHP+Jb3/pW3HLLLXHwwQc39I8AAAAAbAHFewAAAMgTN998c9xxxx3ljnXq1Ckuuuii+OY3vxnbb799pY/7+OOPY8KECXHHHXfEqlWrIiLik08+iSFDhsRdd90VvXv3rvfsAAAAQN0UJB0AAAAAiFzxfVMnnXRSPPHEE3HGGWdUWbiPiOjQoUOcd9558cQTT0Tfvn1zx9esWRM/+tGPorS0tN5yAwAAAFuH4j0AAAAkbP78+TFs2LByx7773e/GDTfcEG3atKn182y//fbxxz/+sdy97ufMmRMPPvjgVssKAAAA1A/FewAAAEjYjTfeGJlMJre///77x5VXXrlFz9WuXbv4+c9/Xu7YXXfdVZd4AAAAQANQvAcAAIAEvf/++/HEE0/k9lu2bBm/+MUvoqBgy7+y77///tGvX7/c/nvvvRezZs2qS0wAAACgnrVMOgAAAAA0Z/fee2+5/eOPPz523nnnOj/vCSecEG+88UZ07949Dj300Ein0xX6nHXWWTFt2rSIiLjwwgvj8ssvj+XLl8fIkSPjr3/9a6xcuTK6dOkSffr0ieOOOy4OO+ywCs+RzWbjb3/7W7z88svx6quvxuLFi2PFihXx6aefRjqdjo4dO0bPnj3ja1/7WpxwwglRVFS0WT/HK6+8Eo888ki8+uqrsWjRoshms9GlS5fYZ5994pRTTil3kcLmWr9+fTz99NPx7LPPxhtvvBEfffRRfPLJJ9GhQ4fo3r17HHTQQdG/f//4/Oc/v8WvAQAAALWVymaz2aRDAAAAQHN18MEHx4cffpjbHz9+fOy33351ft4VK1bE4sWLo1evXlX2+Wzx/vzzz4/TTjst3nvvvQp9DzjggBg7dmy5Y08++WTcdNNN8f7779cq07bbbhtXXHFFnHbaaTX2Xbx4cQwdOjSef/75avudeuqp8dOf/jSOPfbYKC4ujoiI/fbbL8aPH1/t41544YW44YYbaszesmXLOPXUU+NHP/pRbLPNNjXmBgAAgC1l5j0AAAAkZMaMGeUK9+3atYt99tlnqzz3tttuG9tuu+1mPeYXv/hFpYX7iIijjjqq3P4dd9wRN99882Y9/4oVK2LYsGFRWloaZ511VpX95syZE2eddVYsWbKkxue8//77Y8mSJbFu3bpa57jzzjvjf//3f6OsrKzGvuvWrYs///nP8eabb8bvfve76Ny5c61fBwAAADaH4j0AAAAk5K233iq3369fvzrd674u3njjjXj55ZcrbUulUvH1r389t//888+XK9y3bt06vvOd78Q3v/nN2GWXXaKoqCjWrFkT8+fPj7/97W8xZsyYchcp/OY3v4kTTjgh2rVrV+G1Pv3007jwwgvLFe47d+4cF110URx++OGx/fbbx9KlS+O5556LO+64IxYvXhxTp06t9c/54IMPxogRI8odO/LII+Pb3/529O7dO4qKimLp0qXxt7/9Lf74xz/G3LlzIyLi7bffjosuuijuueeeaN26da1fDwAAAGpL8R4AAAAS8tkl23fZZZeEkkSucL/99tvHD3/4wzjssMMilUrF9OnTY9q0adGlS5dc3+uvvz633aJFi/jDH/4QBx54YLnna9OmTXz5y1+OL3/5y3HyySfHaaedFnPmzImIiNWrV8czzzwTAwcOrJDjd7/7Xa5gHhHRu3fvGD16dLlVBLp16xann3569O/fPwYPHhyvv/56rX7GuXPnxvDhw3P7LVu2jF/+8pfRv3//cv26desWp5xySpxwwglx9dVXx6OPPhoREf/617/i5ptvjiuvvLJWrwcAAACbI5nL+QEAAID44IMPyu137do1oSQbFBYWxtixY+Okk06KDh06RPv27eOQQw6JH/7wh7k+77zzTq4IHxHxrW99q0Lh/rO22267+N73vlfu2MyZMyv0+/TTT+Ouu+7K7bdr1y5uv/32Kpf/b9u2bfzud7+Ljh071urnGzVqVKxZsya3/5Of/KRC4X5TrVu3jhtvvDH22muv3LE///nPsXz58lq9HgAAAGwOxXsAAABIyCeffFJuv02bNgkl2eCkk06Knj17VtuntLQ0Tj311DjwwANjp512ilNPPbVWz7377ruX21+5cmWFPlOnTo2SkpLc/hlnnFFuxn9ltttuu7joootqfP2VK1fGpEmTcvtf/OIX4/TTT6/xcS1atIghQ4bk9j/99NOYMGFCjY8DAACAzWXZfAAAAEjI+vXry+1ns9laP/ass86KadOm1bp/9+7d45lnnqm2zyGHHFLj8/Tt2zf69u1b69fd6LMXJqxbt65Cn5deeqnc/jHHHFOr5x4wYEBcf/31FX6fm3r11Vdj7dq1uf1jjz02CgpqN6fhgAMOiG222SZWr14dERH/+Mc/4rvf/W6tHgsAAAC1pXgPAAAACflsQXtjcTgp/fr126rPt2TJkpg5c2a8+eab8fzzz5drKysrq9D/nXfeyW0XFhbGl770pVq9zrbbbhuf//zn49///neVfV577bVy+7vttlutnjsiomXLlvHFL34xpk+fHhERb7zxRq0fCwAAALWleA8AAAAJ6dChQ7n9pUuXJpRkw/3d27dvv9mPy2az8e6778bbb78dc+fOjfnz58eCBQtiwYIFsWLFimof91nFxcW57a5du0aLFi1qnWOXXXaptnj/wQcflNv//ve/X+vn/qxly5bFunXromVLp1UAAADYenzLBAAAgITssssu5fbnzZtX68eOHz++xj677rprrZ9v2223rXXfiA2rBIwZMybuv//+WLRoUY39W7ZsWelS+Zv65JNPcttFRUWbladt27bVtq9cuXKznq8mK1asiO23336rPicAAADNm+I9AAAAJGSPPfYot5/kcuytW7eudd/3338/vve978X8+fOr7FNYWBg9e/aMPn36xH777Rdf+MIX4vjjj98aUStVU/6aLhzYXGvWrNmqzwcAAACK9wAAAJCQfv36RVFRUZSUlERExOLFi2P27NnRs2fPhJNVbfny5XHuueeWW4Z+m222iYMPPjj69esXPXv2jC984QvRrVu3KCgoyPWpzaoCbdq0ieXLl0dExKpVqzYr16az9ivTrl27cvt/+9vfomPHjpv1GgAAAFCfCmruAgAAANSHVq1axZFHHlnu2EMPPZRQmtq54447yhXu99tvv3jyySfj1ltvjXPPPTcOPvjg2HHHHcsV7iMid4FCdXbaaafcdnFxcaxdu7bWuT57T/vP+uwS95tziwIAAABoCIr3AAAAkKAzzzyz3P59990XH374YUJpajZp0qTcdmFhYdxyyy21msE+d+7ccvvZbLZCnz333DO3XVpaGu+8806tMq1bt67Gvr179y63//e//71Wz73Rv//97/j444836zEAAACwORTvAQAAIEF9+vSJQw89NLe/evXquO666xJMVLXly5eXK2D37NkzOnToUKvH/vWvfy23X1ZWVqHPIYccUm7/4YcfrtVzT506NVavXl1tn/322y9SqVRuf8KECbFu3bpaPf/ixYvj+OOPjwMPPDD69u1b4YILAAAA2BoU7wEAACBh11xzTRQWFub2n3zyyfjVr361xc+XzWbjD3/4w9aIVuF5N7Vs2bJaPe7pp5+Oxx57rNyx0tLSCv0OOeSQ6NKlS27/4YcfjhkzZlT73GvXro1bb721xgxdu3Ytd5HE/PnzY/To0TU+LiLixhtvzOVds2ZN7L777rV6HAAAAGwOxXsAAABI2E477RQ33HBDuZnho0aNih/84AexfPnyzXquWbNmxaBBg+LXv/71Vk4Zsd1225VbIn/BggUxefLkah/zyCOPxA9/+MMKx9esWVPhWMuWLeOSSy7J7ZeWlsZFF11UYcn9TduvvPLKmDVrVq3yX3jhhVFQ8N9TITfffHP8+c9/rvYxf/jDH8r9jIWFhXHeeefV6vUAAABgcyjeAwAAQB449thj45prrilXXJ4yZUocffTRcdttt0VxcXGVj12/fn387W9/i0suuSSOP/74+Mc//lGuvaCgIAYMGFDnjKlUqsLz/PjHP44bb7wxZsyYEZlMJlavXh3//ve/Y8KECXHmmWfGlVdeWemS9iUlJZW+xre+9a1yy+cvXLgwTjzxxBg5cmTMmTMn1q5dGx999FE8+uijceKJJ+Zm9Lds2bLG/HvttVdcfPHFuf2ysrK49tprY9CgQfHEE0/E0qVLY+3atbFgwYJ48skn4/TTT69wEcSVV15ZbnUAAAAA2FpS2c+ueQcAAAAk5plnnomf/OQnlS5J/8UvfjF222236Ny5c6TT6SgpKYm5c+fGm2++GStXrqz0+fbcc8+45pprol+/fhXazjrrrJg2bVpERHTv3j2eeeaZGvOtWLEivvWtb8W8efM26+faZZddIpvNxpw5cyIiomPHjvG3v/2t0r4lJSVx/vnnx+uvv16r595rr72ie/fuMWXKlIjYcH/78ePHV9o3m83GiBEjYsyYMZuVPyLiggsuiB/84Aeb/TgAAACoDTPvAQAAII8cccQR8dhjj8W3v/3taN26dbm2999/P6ZMmRJ/+tOf4o477ojx48fHCy+8UGnhfo899oibb745HnzwwUoL91tq2223jTFjxkSfPn1q1b9Vq1YxaNCgeOihh+KrX/1q7vjSpUvjvffeq/QxRUVFMW7cuBg0aFCNM+oPOeSQ+O1vfxutWrWqVZ5UKhU//vGP4ze/+U107969Vo/p1KlT/OY3v1G4BwAAoF6ZeQ8AAAB5aunSpfHggw/G008/HdOnT4+avsL36NEjDj300Ojfv3+tiutbMvN+o/Xr18fTTz8djz32WEyfPj0++uijWLt2bbRp0yY6dOgQPXv2jH79+sVxxx0XO+ywQ0REvPzyyzFo0KByrz906NBqX+f//u//4oEHHoiXXnop5s6dG2vXro3OnTvH7rvvHgMHDowjjzwyUqlUXH311TFhwoSIqH7m/aZKS0vjySefjBdffDHefPPNWLp0aZSUlERhYWF07Ngx9txzzzj00EPjqKOOisLCwlr/bgAAAGBLKN4DAABAI7By5cqYNWtWzJ07N1atWhWrV6+OVq1aRfv27WPHHXeMXXfdNTp06JB0TAAAAGALKd4DAAAAAAAAQMLc8x4AAAAAAAAAEqZ4DwAAAAAAAAAJU7wHAAAAAAAAgIQp3gMAAAAAAABAwhTvAQAAAAAAACBhivcAAAAAAAAAkDDFewAAAAAAAABImOI9AAAAAAAAACRM8R4AAAAAAAAAEqZ4DwAAAAAAAAAJU7wHAAAAAAAAgIQp3gMAAAAAAABAwhTvAQAAAAAAACBhivcAAAAAAAAAkDDFewAAAAAAAABImOI9AAAAAAAAACTs/wMxt5C+XsAjYwAAAABJRU5ErkJggg==", "text/plain": [ - "
" + "{'duplicates': 2,\n", + " 'missing values': id 0.0\n", + " date 0.0\n", + " price 0.0\n", + " bedrooms 0.0\n", + " bathrooms 0.0\n", + " sqft_living 0.0\n", + " sqft_lot 0.0\n", + " floors 0.0\n", + " waterfront 0.0\n", + " view 0.0\n", + " condition 0.0\n", + " grade 0.0\n", + " sqft_above 0.0\n", + " sqft_basement 0.0\n", + " yr_built 0.0\n", + " zipcode 0.0\n", + " lat 0.0\n", + " long 0.0\n", + " sqft_living15 0.0\n", + " sqft_lot15 0.0\n", + " dtype: float64}" ] }, + "execution_count": 28, "metadata": {}, - "output_type": "display_data" + "output_type": "execute_result" } ], "source": [ - "#grade\n", - "plt.figure(figsize=(25,15))\n", - "sns.set(font_scale=2)\n", - "ax = sns.boxplot(x=\"grade\", y=\"price\", data=df)\n", - "ax.set_title('House Grade vs. Price', fontsize=50)\n", - "ax.set_ylabel('Price', fontsize=30)\n", - "ax.set_xlabel('Grade', fontsize=30)\n", - "ax.set_ylim(bottom=0, top=6000000);" + "identify_issues(house_data_clean)" ] }, { - "cell_type": "markdown", + "cell_type": "code", + "execution_count": 29, "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", + "
iddatepricebedroomsbathroomssqft_livingsqft_lotfloorswaterfrontviewconditiongradesqft_abovesqft_basementyr_builtzipcodelatlongsqft_living15sqft_lot15
394718250690312014550000.041.75241084472.0NOGOODGood8 Good2060350.019369807447.6499-122.088252014789
2003886489001102014555000.032.50194032112.0NONONEAverage8 Good19400.020099802747.5644-122.09318803078
\n", + "
" + ], + "text/plain": [ + " id date price bedrooms bathrooms sqft_living sqft_lot \\\n", + "3947 1825069031 2014 550000.0 4 1.75 2410 8447 \n", + "20038 8648900110 2014 555000.0 3 2.50 1940 3211 \n", + "\n", + " floors waterfront view condition grade sqft_above sqft_basement \\\n", + "3947 2.0 NO GOOD Good 8 Good 2060 350.0 \n", + "20038 2.0 NO NONE Average 8 Good 1940 0.0 \n", + "\n", + " yr_built zipcode lat long sqft_living15 sqft_lot15 \n", + "3947 1936 98074 47.6499 -122.088 2520 14789 \n", + "20038 2009 98027 47.5644 -122.093 1880 3078 " + ] + }, + "execution_count": 29, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ - "When we look at grade, we can see that as the categorical building grade designation improves, the house price does indeed rise as well. " + "house_data_clean[house_data_clean.duplicated()]" ] } ], From ce7d81d196580524a1fbf0b0df978bd49472bd9a Mon Sep 17 00:00:00 2001 From: clydeochieng <107258512+clydeochieng@users.noreply.github.com> Date: Tue, 30 Apr 2024 18:56:03 +0300 Subject: [PATCH 13/42] Update student.ipynb --- student.ipynb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/student.ipynb b/student.ipynb index 03ba5c12..ed8e6379 100644 --- a/student.ipynb +++ b/student.ipynb @@ -7,7 +7,7 @@ "## Final Project Submission\n", "\n", "Please fill out:\n", - "* Student name: Solphine Joseph, Grace Rotich, Mathew Kiprotich, Hilary Simiyu, Derrick Kiprotich, Clyde Ochieng. \n", + "* Student name: Solphine Joseph, Grace Rotich, Mathew Kiprotich, Hilary Simiyu, Clyde Ochieng. \n", "* Student pace: full time\n", "* Scheduled project review date/time: \n", "* Instructor name: Nikita \n", From 26261b768e2cc3e4d4687414bc5c2a97decea023 Mon Sep 17 00:00:00 2001 From: clydeochieng <107258512+clydeochieng@users.noreply.github.com> Date: Tue, 30 Apr 2024 18:59:34 +0300 Subject: [PATCH 14/42] Update student.ipynb --- student.ipynb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/student.ipynb b/student.ipynb index b3e32a00..59641be8 100644 --- a/student.ipynb +++ b/student.ipynb @@ -7,7 +7,7 @@ "## Final Project Submission\n", "\n", "Please fill out:\n", - "* Student name: Solphine Joseph, Grace Rotich, Mathew Kiprotich, Hilary Simiyu, Clyde Ochieng.\n", + "* Student name: Solphine Joseph, Grace Rotich, Mathew Kiprotich, Hilary Simiyu, Derrick Kiptoo Clyde Ochieng.\n", "* Student pace: full time\n", "* Scheduled project review date/time: \n", "* Instructor name: Nikita \n", @@ -105,7 +105,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.6.4" + "version": "3.10.13" } }, "nbformat": 4, From 6c8c8b7272dd2b18c70ccc37b0c3db82aed9e419 Mon Sep 17 00:00:00 2001 From: clydeochieng <107258512+clydeochieng@users.noreply.github.com> Date: Tue, 30 Apr 2024 19:02:17 +0300 Subject: [PATCH 15/42] Update student.ipynb --- student.ipynb | 38 +++++++++++++++++++------------------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/student.ipynb b/student.ipynb index ed8e6379..946abd6c 100644 --- a/student.ipynb +++ b/student.ipynb @@ -98,7 +98,7 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 1, "metadata": {}, "outputs": [], "source": [ @@ -120,7 +120,7 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 2, "metadata": {}, "outputs": [], "source": [ @@ -145,7 +145,7 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 3, "metadata": {}, "outputs": [ { @@ -549,7 +549,7 @@ "[21597 rows x 21 columns]" ] }, - "execution_count": 17, + "execution_count": 3, "metadata": {}, "output_type": "execute_result" } @@ -571,7 +571,7 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": 4, "metadata": {}, "outputs": [ { @@ -612,7 +612,7 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": 5, "metadata": {}, "outputs": [], "source": [ @@ -633,7 +633,7 @@ }, { "cell_type": "code", - "execution_count": 20, + "execution_count": 6, "metadata": {}, "outputs": [ { @@ -677,7 +677,7 @@ }, { "cell_type": "code", - "execution_count": 21, + "execution_count": 7, "metadata": {}, "outputs": [ { @@ -721,7 +721,7 @@ }, { "cell_type": "code", - "execution_count": 22, + "execution_count": 8, "metadata": {}, "outputs": [], "source": [ @@ -739,7 +739,7 @@ }, { "cell_type": "code", - "execution_count": 23, + "execution_count": 9, "metadata": {}, "outputs": [ { @@ -770,7 +770,7 @@ " dtype: float64}" ] }, - "execution_count": 23, + "execution_count": 9, "metadata": {}, "output_type": "execute_result" } @@ -795,7 +795,7 @@ }, { "cell_type": "code", - "execution_count": 24, + "execution_count": 10, "metadata": {}, "outputs": [], "source": [ @@ -804,7 +804,7 @@ }, { "cell_type": "code", - "execution_count": 25, + "execution_count": 11, "metadata": {}, "outputs": [], "source": [ @@ -834,7 +834,7 @@ }, { "cell_type": "code", - "execution_count": 26, + "execution_count": 12, "metadata": {}, "outputs": [], "source": [ @@ -851,7 +851,7 @@ }, { "cell_type": "code", - "execution_count": 27, + "execution_count": 13, "metadata": {}, "outputs": [], "source": [ @@ -871,7 +871,7 @@ }, { "cell_type": "code", - "execution_count": 28, + "execution_count": 14, "metadata": {}, "outputs": [ { @@ -901,7 +901,7 @@ " dtype: float64}" ] }, - "execution_count": 28, + "execution_count": 14, "metadata": {}, "output_type": "execute_result" } @@ -912,7 +912,7 @@ }, { "cell_type": "code", - "execution_count": 29, + "execution_count": 15, "metadata": {}, "outputs": [ { @@ -1023,7 +1023,7 @@ "20038 2009 98027 47.5644 -122.093 1880 3078 " ] }, - "execution_count": 29, + "execution_count": 15, "metadata": {}, "output_type": "execute_result" } From faab87e08b0594aa0a086bfac402e06c194be1a0 Mon Sep 17 00:00:00 2001 From: clydeochieng <107258512+clydeochieng@users.noreply.github.com> Date: Tue, 30 Apr 2024 23:00:38 +0300 Subject: [PATCH 16/42] Update student.ipynb --- student.ipynb | 1 - 1 file changed, 1 deletion(-) diff --git a/student.ipynb b/student.ipynb index 09a140ae..d18aa6f3 100644 --- a/student.ipynb +++ b/student.ipynb @@ -6,7 +6,6 @@ "source": [ "## Final Project Submission\n", "\n", - "Please fill out:\n", Clyde "* Student name: Solphine Joseph, Grace Rotich, Mathew Kiprotich, Hilary Simiyu, Clyde Ochieng. \n", From 42bea008534fe4c9531c932f1686733927c8b124 Mon Sep 17 00:00:00 2001 From: clydeochieng <107258512+clydeochieng@users.noreply.github.com> Date: Tue, 30 Apr 2024 23:08:00 +0300 Subject: [PATCH 17/42] Update student.ipynb --- student.ipynb | 72 +++++++++++++++++++++++++-------------------------- 1 file changed, 36 insertions(+), 36 deletions(-) diff --git a/student.ipynb b/student.ipynb index d18aa6f3..7d3fde3c 100644 --- a/student.ipynb +++ b/student.ipynb @@ -1,40 +1,40 @@ { - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Final Project Submission\n", - "\n", -Clyde - "* Student name: Solphine Joseph, Grace Rotich, Mathew Kiprotich, Hilary Simiyu, Clyde Ochieng. \n", - - "* Student name: Solphine Joseph, Grace Rotich, Mathew Kiprotich, Hilary Simiyu, Clyde Ochieng, Derrick Kiptoo.\n", - main - "* Student pace: full time\n", - "* Scheduled project review date/time: \n", - "* Instructor name: Nikita \n", - "* Blog post URL:\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Kings County Housing Analysis with Multiple Linear Regression" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Overview\n", - "\n", - "\n", - "A real estate agency in Kingsway seeks to determine what are the contributing factors that affect the price of houses to make improvements where necessary. They want to employ an analytical approach rather than sentimental before arriving at a decision. Multilinear regression has been used for this project to understand how various features affect their pricing to better their services." - ] - }, - { + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Final Project Submission\n", + "\n", + "* Student name: Solphine Joseph, Grace Rotich, Mathew Kiprotich, Hilary Simiyu, Clyde Ochieng. \n", + + "* Student name: Solphine Joseph, Grace Rotich, Mathew Kiprotich, Hilary Simiyu, Clyde Ochieng, Derrick Kiptoo.\n", + "* Student pace: full time\n", + "* Scheduled project review date/time: \n", + "* Instructor name: Nikita \n", + "* Blog post URL:\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Kings County Housing Analysis with Multiple Linear Regression" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Overview\n", + "\n", + "\n", + "A real estate agency in Kingsway seeks to determine what are the contributing factors that affect the price of houses to make improvements where necessary. They want to employ an analytical approach rather than sentimental before arriving at a decision. Multilinear regression has been used for this project to understand how various features affect their pricing to better their services." + ] + } + ] + } + "cell_type": "markdown", "metadata": {}, "source": [ From 872b835d4f541d0fc23995a1d9947487c482915e Mon Sep 17 00:00:00 2001 From: clydeochieng <107258512+clydeochieng@users.noreply.github.com> Date: Tue, 30 Apr 2024 23:11:24 +0300 Subject: [PATCH 18/42] Update student.ipynb --- student.ipynb | 1 - 1 file changed, 1 deletion(-) diff --git a/student.ipynb b/student.ipynb index 7d3fde3c..45f116ae 100644 --- a/student.ipynb +++ b/student.ipynb @@ -35,7 +35,6 @@ ] } - "cell_type": "markdown", "metadata": {}, "source": [ "## Business Problem\n", From d068fa1bd538aa473be4cbcba93ff4cfa58cbdbe Mon Sep 17 00:00:00 2001 From: clydeochieng <107258512+clydeochieng@users.noreply.github.com> Date: Tue, 30 Apr 2024 23:14:58 +0300 Subject: [PATCH 19/42] Update student.ipynb --- student.ipynb | 66 +++++++++++++++++++++++++-------------------------- 1 file changed, 32 insertions(+), 34 deletions(-) diff --git a/student.ipynb b/student.ipynb index 45f116ae..4593bb43 100644 --- a/student.ipynb +++ b/student.ipynb @@ -1,40 +1,38 @@ { "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Final Project Submission\n", - "\n", - "* Student name: Solphine Joseph, Grace Rotich, Mathew Kiprotich, Hilary Simiyu, Clyde Ochieng. \n", - - "* Student name: Solphine Joseph, Grace Rotich, Mathew Kiprotich, Hilary Simiyu, Clyde Ochieng, Derrick Kiptoo.\n", - "* Student pace: full time\n", - "* Scheduled project review date/time: \n", - "* Instructor name: Nikita \n", - "* Blog post URL:\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Kings County Housing Analysis with Multiple Linear Regression" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Overview\n", - "\n", - "\n", - "A real estate agency in Kingsway seeks to determine what are the contributing factors that affect the price of houses to make improvements where necessary. They want to employ an analytical approach rather than sentimental before arriving at a decision. Multilinear regression has been used for this project to understand how various features affect their pricing to better their services." - ] - } + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Final Project Submission\n", + "\n", + "* Student name: Solphine Joseph, Grace Rotich, Mathew Kiprotich, Hilary Simiyu, Clyde Ochieng. \n", + "* Student name: Solphine Joseph, Grace Rotich, Mathew Kiprotich, Hilary Simiyu, Clyde Ochieng, Derrick Kiptoo.\n", + "* Student pace: full time\n", + "* Scheduled project review date/time: \n", + "* Instructor name: Nikita \n", + "* Blog post URL:\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Kings County Housing Analysis with Multiple Linear Regression" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Overview\n", + "\n", + "A real estate agency in Kingsway seeks to determine what are the contributing factors that affect the price of houses to make improvements where necessary. They want to employ an analytical approach rather than sentimental before arriving at a decision. Multilinear regression has been used for this project to understand how various features affect their pricing to better their services." + ] + } ] - } - + } + "metadata": {}, "source": [ "## Business Problem\n", From 18077fac0082e399f6ab72625423e677fd7b8764 Mon Sep 17 00:00:00 2001 From: clydeochieng <107258512+clydeochieng@users.noreply.github.com> Date: Tue, 30 Apr 2024 23:43:40 +0300 Subject: [PATCH 20/42] Update student.ipynb --- student.ipynb | 164 +++++++++++++++++++++----------------------------- 1 file changed, 69 insertions(+), 95 deletions(-) diff --git a/student.ipynb b/student.ipynb index 4593bb43..c174e446 100644 --- a/student.ipynb +++ b/student.ipynb @@ -29,101 +29,75 @@ "\n", "A real estate agency in Kingsway seeks to determine what are the contributing factors that affect the price of houses to make improvements where necessary. They want to employ an analytical approach rather than sentimental before arriving at a decision. Multilinear regression has been used for this project to understand how various features affect their pricing to better their services." ] - } - ] - } - - "metadata": {}, - "source": [ - "## Business Problem\n", - "\n", - "In the face of market fluctuations and heightened competition within the real estate sector, our agency is grappling with pricing volatility, which poses significant challenges for our agents in devising effective business strategies. We seek strategic guidance to optimize our purchasing and selling endeavors, prioritizing informed decision-making to identify key areas of focus that promise maximum returns on investment." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Objectives\n", - "* To determine the key factors influencing house prices.\n", - "* To develop multilinear regression models to predict house prices based on relevant features.\n", - "* To use insights from the regression analysis to optimize pricing strategies for both purchasing and selling properties.\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Hypothesis\n", - "* Null Hypothesis - There is no relationship between our independent variables and our dependent variable \n", - "\n", - "* Alternative Hypothesis - There is a relationship between our independent variables and our dependent variable" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Data Understanding:\n", - "\n", - "In this project, we utilized the King County House Sales dataset, which serves as the foundational dataset for our analysis. It was sourced Kaggle.The dataset encompasses comprehensive information regarding house sales within King County, Washington, USA. It comprises a diverse array of features, including the number of bedrooms, bathrooms, square footage, as well as geographical and pricing details of the properties sold. This dataset is frequently employed in data science and machine learning endeavors, particularly for predictive modeling tasks such as regression analysis aimed at forecasting house prices based on the provided features." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "##### King County Housing Data Columns \n", - "\n", - "The column names contained in column_names.md are:\n", - "* `id`: A unique identifier for each house sale.\n", - "* `date`: The date when the house was sold.\n", - "* `price`: The sale price of the house, serving as the target variable for predictive modeling.\n", - "* `bedrooms`, `bathrooms`, `sqft_living`, `sqft_lot`: Numerical features representing the number of bedrooms and bathrooms, as well as the living area and lot area of the house, respectively.\n", - "* `floors`: The number of floors in the house.\n", - "* `waterfront`, `view`, `condition`, `grade`: Categorical features describing aspects such as waterfront availability, property view, condition, and overall grade assigned to the housing unit.\n", - "* `yr_built`, `yr_renovated`: Year of construction and renovation of the house.\n", - "* `zipcode`, `lat`, `long`: Geographical features including ZIP code, latitude, and longitude coordinates.\n", - "* `sqft_above`, `sqft_basement`, `sqft_living15`, `sqft_lot15`: Additional numerical features providing details about the house's above-ground and basement square footage, as well as living area and lot area of the nearest 15 neighboring houses." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Data Loading\n", - "\n", - "#### Import Necessary Libraries" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "import matplotlib.pyplot as plt\n", - "%matplotlib inline\n", - "import numpy as np\n", - "import pandas as pd\n", - "import scipy.stats as stats\n", - "import seaborn as sns\n", - "import statsmodels.api as sm\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Loading Data" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Business Problem\n", + "\n", + "In the face of market fluctuations and heightened competition within the real estate sector, our agency is grappling with pricing volatility, which poses significant challenges for our agents in devising effective business strategies. We seek strategic guidance to optimize our purchasing and selling endeavors, prioritizing informed decision-making to identify key areas of focus that promise maximum returns on investment." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Objectives\n", + "* To determine the key factors influencing house prices.\n", + "* To develop multilinear regression models to predict house prices based on relevant features.\n", + "* To use insights from the regression analysis to optimize pricing strategies for both purchasing and selling properties.\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Hypothesis\n", + "* Null Hypothesis - There is no relationship between our independent variables and our dependent variable \n", + "\n", + "* Alternative Hypothesis - There is a relationship between our independent variables and our dependent variable" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Data Understanding:\n", + "\n", + "In this project, we utilized the King County House Sales dataset, which serves as the foundational dataset for our analysis. It was sourced Kaggle.The dataset encompasses comprehensive information regarding house sales within King County, Washington, USA. It comprises a diverse array of features, including the number of bedrooms, bathrooms, square footage, as well as geographical and pricing details of the properties sold. This dataset is frequently employed in data science and machine learning endeavors, particularly for predictive modeling tasks such as regression analysis aimed at forecasting house prices based on the provided features." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "##### King County Housing Data Columns \n", + "\n", + "The column names contained in column_names.md are:\n", + "* `id`: A unique identifier for each house sale.\n", + "* `date`: The date when the house was sold.\n", + "* `price`: The sale price of the house, serving as the target variable for predictive modeling.\n", + "* `bedrooms`, `bathrooms`, `sqft_living`, `sqft_lot`: Numerical features representing the number of bedrooms and bathrooms, as well as the living area and lot area of the house, respectively.\n", + "* `floors`: The number of floors in the house.\n", + "* `waterfront`, `view`, `condition`, `grade`: Categorical features describing aspects such as waterfront availability, property view, condition, and overall grade assigned to the housing unit.\n", + "* `yr_built`, `yr_renovated`: Year of construction and renovation of the house.\n", + "* `zipcode`, `lat`, `long`: Geographical features including ZIP code, latitude, and longitude coordinates.\n", + "* `sqft_above`, `sqft_basement`, `sqft_living15`, `sqft_lot15`: Additional numerical features providing details about the house's above-ground and basement square footage, as well as living area and lot area of the nearest 15 neighboring houses." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Data Loading\n", + "\n" + ] + }, + { + "cell_type": "code", + "metadata": {}, + "source": [ "# Creating a function that loads data and return it in a dataframe\n", "def load_data(file_path):\n", " house_data = pd.read_csv(file_path)\n", From 457ad7cc459ba0165caa25a11e4788feddf3eda9 Mon Sep 17 00:00:00 2001 From: clydeochieng <107258512+clydeochieng@users.noreply.github.com> Date: Tue, 30 Apr 2024 23:44:41 +0300 Subject: [PATCH 21/42] Update student.ipynb --- student.ipynb | 2025 +++++++++++++++++++++++++------------------------ 1 file changed, 1013 insertions(+), 1012 deletions(-) diff --git a/student.ipynb b/student.ipynb index c174e446..cea94b8e 100644 --- a/student.ipynb +++ b/student.ipynb @@ -1,1031 +1,1032 @@ { - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Final Project Submission\n", - "\n", - "* Student name: Solphine Joseph, Grace Rotich, Mathew Kiprotich, Hilary Simiyu, Clyde Ochieng. \n", - "* Student name: Solphine Joseph, Grace Rotich, Mathew Kiprotich, Hilary Simiyu, Clyde Ochieng, Derrick Kiptoo.\n", - "* Student pace: full time\n", - "* Scheduled project review date/time: \n", - "* Instructor name: Nikita \n", - "* Blog post URL:\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Kings County Housing Analysis with Multiple Linear Regression" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Overview\n", - "\n", - "A real estate agency in Kingsway seeks to determine what are the contributing factors that affect the price of houses to make improvements where necessary. They want to employ an analytical approach rather than sentimental before arriving at a decision. Multilinear regression has been used for this project to understand how various features affect their pricing to better their services." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Business Problem\n", - "\n", - "In the face of market fluctuations and heightened competition within the real estate sector, our agency is grappling with pricing volatility, which poses significant challenges for our agents in devising effective business strategies. We seek strategic guidance to optimize our purchasing and selling endeavors, prioritizing informed decision-making to identify key areas of focus that promise maximum returns on investment." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Objectives\n", - "* To determine the key factors influencing house prices.\n", - "* To develop multilinear regression models to predict house prices based on relevant features.\n", - "* To use insights from the regression analysis to optimize pricing strategies for both purchasing and selling properties.\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Hypothesis\n", - "* Null Hypothesis - There is no relationship between our independent variables and our dependent variable \n", - "\n", - "* Alternative Hypothesis - There is a relationship between our independent variables and our dependent variable" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Data Understanding:\n", - "\n", - "In this project, we utilized the King County House Sales dataset, which serves as the foundational dataset for our analysis. It was sourced Kaggle.The dataset encompasses comprehensive information regarding house sales within King County, Washington, USA. It comprises a diverse array of features, including the number of bedrooms, bathrooms, square footage, as well as geographical and pricing details of the properties sold. This dataset is frequently employed in data science and machine learning endeavors, particularly for predictive modeling tasks such as regression analysis aimed at forecasting house prices based on the provided features." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "##### King County Housing Data Columns \n", - "\n", - "The column names contained in column_names.md are:\n", - "* `id`: A unique identifier for each house sale.\n", - "* `date`: The date when the house was sold.\n", - "* `price`: The sale price of the house, serving as the target variable for predictive modeling.\n", - "* `bedrooms`, `bathrooms`, `sqft_living`, `sqft_lot`: Numerical features representing the number of bedrooms and bathrooms, as well as the living area and lot area of the house, respectively.\n", - "* `floors`: The number of floors in the house.\n", - "* `waterfront`, `view`, `condition`, `grade`: Categorical features describing aspects such as waterfront availability, property view, condition, and overall grade assigned to the housing unit.\n", - "* `yr_built`, `yr_renovated`: Year of construction and renovation of the house.\n", - "* `zipcode`, `lat`, `long`: Geographical features including ZIP code, latitude, and longitude coordinates.\n", - "* `sqft_above`, `sqft_basement`, `sqft_living15`, `sqft_lot15`: Additional numerical features providing details about the house's above-ground and basement square footage, as well as living area and lot area of the nearest 15 neighboring houses." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Data Loading\n", - "\n" - ] - }, - { - "cell_type": "code", - "metadata": {}, - "source": [ - "# Creating a function that loads data and return it in a dataframe\n", - "def load_data(file_path):\n", - " house_data = pd.read_csv(file_path)\n", - "\n", - " #shape\n", - " shape = house_data.shape\n", - " print(f\"The dataset contains {shape[0]} houses with {shape[1]} features\")\n", - " print()\n", - " \n", - " #Data Types\n", - " data_types = house_data.dtypes\n", - " print(\"Columns and their data types:\")\n", - " for column, dtype in data_types.items():\n", - " print(f\"{column}: {dtype}\")\n", - " print()\n", - "\n", - " return house_data\n" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Final Project Submission\n", + "\n", + "* Student name: Solphine Joseph, Grace Rotich, Mathew Kiprotich, Hilary Simiyu, Clyde Ochieng. \n", + "* Student pace: full time\n", + "* Scheduled project review date/time: \n", + "* Instructor name: Nikita \n", + "* Blog post URL:\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Kings County Housing Analysis with Multiple Linear Regression" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Overview\n", + "\n", + "A real estate agency in Kingsway seeks to determine what are the contributing factors that affect the price of houses to make improvements where necessary. They want to employ an analytical approach rather than sentimental before arriving at a decision. Multilinear regression has been used for this project to understand how various features affect their pricing to better their services." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Business Problem\n", + "\n", + "In the face of market fluctuations and heightened competition within the real estate sector, our agency is grappling with pricing volatility, which poses significant challenges for our agents in devising effective business strategies. We seek strategic guidance to optimize our purchasing and selling endeavors, prioritizing informed decision-making to identify key areas of focus that promise maximum returns on investment." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Objectives\n", + "* To determine the key factors influencing house prices.\n", + "* To develop multilinear regression models to predict house prices based on relevant features.\n", + "* To use insights from the regression analysis to optimize pricing strategies for both purchasing and selling properties.\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Hypothesis\n", + "* Null Hypothesis - There is no relationship between our independent variables and our dependent variable \n", + "\n", + "* Alternative Hypothesis - There is a relationship between our independent variables and our dependent variable" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Data Understanding:\n", + "\n", + "In this project, we utilized the King County House Sales dataset, which serves as the foundational dataset for our analysis. It was sourced Kaggle.The dataset encompasses comprehensive information regarding house sales within King County, Washington, USA. It comprises a diverse array of features, including the number of bedrooms, bathrooms, square footage, as well as geographical and pricing details of the properties sold. This dataset is frequently employed in data science and machine learning endeavors, particularly for predictive modeling tasks such as regression analysis aimed at forecasting house prices based on the provided features." + ] + }, { - "name": "stdout", - "output_type": "stream", - "text": [ - "The dataset contains 21597 houses with 21 features\n", - "\n", - "Columns and their data types:\n", - "id: int64\n", - "date: object\n", - "price: float64\n", - "bedrooms: int64\n", - "bathrooms: float64\n", - "sqft_living: int64\n", - "sqft_lot: int64\n", - "floors: float64\n", - "waterfront: object\n", - "view: object\n", - "condition: object\n", - "grade: object\n", - "sqft_above: int64\n", - "sqft_basement: object\n", - "yr_built: int64\n", - "yr_renovated: float64\n", - "zipcode: int64\n", - "lat: float64\n", - "long: float64\n", - "sqft_living15: int64\n", - "sqft_lot15: int64\n", - "\n" - ] + "cell_type": "markdown", + "metadata": {}, + "source": [ + "##### King County Housing Data Columns \n", + "\n", + "The column names contained in column_names.md are:\n", + "* `id`: A unique identifier for each house sale.\n", + "* `date`: The date when the house was sold.\n", + "* `price`: The sale price of the house, serving as the target variable for predictive modeling.\n", + "* `bedrooms`, `bathrooms`, `sqft_living`, `sqft_lot`: Numerical features representing the number of bedrooms and bathrooms, as well as the living area and lot area of the house, respectively.\n", + "* `floors`: The number of floors in the house.\n", + "* `waterfront`, `view`, `condition`, `grade`: Categorical features describing aspects such as waterfront availability, property view, condition, and overall grade assigned to the housing unit.\n", + "* `yr_built`, `yr_renovated`: Year of construction and renovation of the house.\n", + "* `zipcode`, `lat`, `long`: Geographical features including ZIP code, latitude, and longitude coordinates.\n", + "* `sqft_above`, `sqft_basement`, `sqft_living15`, `sqft_lot15`: Additional numerical features providing details about the house's above-ground and basement square footage, as well as living area and lot area of the nearest 15 neighboring houses." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Data Loading\n", + "\n" + ] }, { - "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", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
iddatepricebedroomsbathroomssqft_livingsqft_lotfloorswaterfrontview...gradesqft_abovesqft_basementyr_builtyr_renovatedzipcodelatlongsqft_living15sqft_lot15
0712930052010/13/2014221900.031.00118056501.0NaNNONE...7 Average11800.019550.09817847.5112-122.25713405650
1641410019212/9/2014538000.032.25257072422.0NONONE...7 Average2170400.019511991.09812547.7210-122.31916907639
256315004002/25/2015180000.021.00770100001.0NONONE...6 Low Average7700.01933NaN9802847.7379-122.23327208062
3248720087512/9/2014604000.043.00196050001.0NONONE...7 Average1050910.019650.09813647.5208-122.39313605000
419544005102/18/2015510000.032.00168080801.0NONONE...8 Good16800.019870.09807447.6168-122.04518007503
..................................................................
215922630000185/21/2014360000.032.50153011313.0NONONE...8 Good15300.020090.09810347.6993-122.34615301509
2159366000601202/23/2015400000.042.50231058132.0NONONE...8 Good23100.020140.09814647.5107-122.36218307200
2159415233001416/23/2014402101.020.75102013502.0NONONE...7 Average10200.020090.09814447.5944-122.29910202007
215952913101001/16/2015400000.032.50160023882.0NaNNONE...8 Good16000.020040.09802747.5345-122.06914101287
21596152330015710/15/2014325000.020.75102010762.0NONONE...7 Average10200.020080.09814447.5941-122.29910201357
\n", - "

21597 rows × 21 columns

\n", - "
" + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Creating a function that loads data and return it in a dataframe\n", + "def load_data(file_path):\n", + " house_data = pd.read_csv(file_path)\n", + "\n", + " #shape\n", + " shape = house_data.shape\n", + " print(f\"The dataset contains {shape[0]} houses with {shape[1]} features\")\n", + " print()\n", + " \n", + " #Data Types\n", + " data_types = house_data.dtypes\n", + " print(\"Columns and their data types:\")\n", + " for column, dtype in data_types.items():\n", + " print(f\"{column}: {dtype}\")\n", + " print()\n", + "\n", + " return house_data\n" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The dataset contains 21597 houses with 21 features\n", + "\n", + "Columns and their data types:\n", + "id: int64\n", + "date: object\n", + "price: float64\n", + "bedrooms: int64\n", + "bathrooms: float64\n", + "sqft_living: int64\n", + "sqft_lot: int64\n", + "floors: float64\n", + "waterfront: object\n", + "view: object\n", + "condition: object\n", + "grade: object\n", + "sqft_above: int64\n", + "sqft_basement: object\n", + "yr_built: int64\n", + "yr_renovated: float64\n", + "zipcode: int64\n", + "lat: float64\n", + "long: float64\n", + "sqft_living15: int64\n", + "sqft_lot15: int64\n", + "\n" + ] + }, + { + "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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
iddatepricebedroomsbathroomssqft_livingsqft_lotfloorswaterfrontview...gradesqft_abovesqft_basementyr_builtyr_renovatedzipcodelatlongsqft_living15sqft_lot15
0712930052010/13/2014221900.031.00118056501.0NaNNONE...7 Average11800.019550.09817847.5112-122.25713405650
1641410019212/9/2014538000.032.25257072422.0NONONE...7 Average2170400.019511991.09812547.7210-122.31916907639
256315004002/25/2015180000.021.00770100001.0NONONE...6 Low Average7700.01933NaN9802847.7379-122.23327208062
3248720087512/9/2014604000.043.00196050001.0NONONE...7 Average1050910.019650.09813647.5208-122.39313605000
419544005102/18/2015510000.032.00168080801.0NONONE...8 Good16800.019870.09807447.6168-122.04518007503
..................................................................
215922630000185/21/2014360000.032.50153011313.0NONONE...8 Good15300.020090.09810347.6993-122.34615301509
2159366000601202/23/2015400000.042.50231058132.0NONONE...8 Good23100.020140.09814647.5107-122.36218307200
2159415233001416/23/2014402101.020.75102013502.0NONONE...7 Average10200.020090.09814447.5944-122.29910202007
215952913101001/16/2015400000.032.50160023882.0NaNNONE...8 Good16000.020040.09802747.5345-122.06914101287
21596152330015710/15/2014325000.020.75102010762.0NONONE...7 Average10200.020080.09814447.5941-122.29910201357
\n", + "

21597 rows × 21 columns

\n", + "
" + ], + "text/plain": [ + " id date price bedrooms bathrooms sqft_living \\\n", + "0 7129300520 10/13/2014 221900.0 3 1.00 1180 \n", + "1 6414100192 12/9/2014 538000.0 3 2.25 2570 \n", + "2 5631500400 2/25/2015 180000.0 2 1.00 770 \n", + "3 2487200875 12/9/2014 604000.0 4 3.00 1960 \n", + "4 1954400510 2/18/2015 510000.0 3 2.00 1680 \n", + "... ... ... ... ... ... ... \n", + "21592 263000018 5/21/2014 360000.0 3 2.50 1530 \n", + "21593 6600060120 2/23/2015 400000.0 4 2.50 2310 \n", + "21594 1523300141 6/23/2014 402101.0 2 0.75 1020 \n", + "21595 291310100 1/16/2015 400000.0 3 2.50 1600 \n", + "21596 1523300157 10/15/2014 325000.0 2 0.75 1020 \n", + "\n", + " sqft_lot floors waterfront view ... grade sqft_above \\\n", + "0 5650 1.0 NaN NONE ... 7 Average 1180 \n", + "1 7242 2.0 NO NONE ... 7 Average 2170 \n", + "2 10000 1.0 NO NONE ... 6 Low Average 770 \n", + "3 5000 1.0 NO NONE ... 7 Average 1050 \n", + "4 8080 1.0 NO NONE ... 8 Good 1680 \n", + "... ... ... ... ... ... ... ... \n", + "21592 1131 3.0 NO NONE ... 8 Good 1530 \n", + "21593 5813 2.0 NO NONE ... 8 Good 2310 \n", + "21594 1350 2.0 NO NONE ... 7 Average 1020 \n", + "21595 2388 2.0 NaN NONE ... 8 Good 1600 \n", + "21596 1076 2.0 NO NONE ... 7 Average 1020 \n", + "\n", + " sqft_basement yr_built yr_renovated zipcode lat long \\\n", + "0 0.0 1955 0.0 98178 47.5112 -122.257 \n", + "1 400.0 1951 1991.0 98125 47.7210 -122.319 \n", + "2 0.0 1933 NaN 98028 47.7379 -122.233 \n", + "3 910.0 1965 0.0 98136 47.5208 -122.393 \n", + "4 0.0 1987 0.0 98074 47.6168 -122.045 \n", + "... ... ... ... ... ... ... \n", + "21592 0.0 2009 0.0 98103 47.6993 -122.346 \n", + "21593 0.0 2014 0.0 98146 47.5107 -122.362 \n", + "21594 0.0 2009 0.0 98144 47.5944 -122.299 \n", + "21595 0.0 2004 0.0 98027 47.5345 -122.069 \n", + "21596 0.0 2008 0.0 98144 47.5941 -122.299 \n", + "\n", + " sqft_living15 sqft_lot15 \n", + "0 1340 5650 \n", + "1 1690 7639 \n", + "2 2720 8062 \n", + "3 1360 5000 \n", + "4 1800 7503 \n", + "... ... ... \n", + "21592 1530 1509 \n", + "21593 1830 7200 \n", + "21594 1020 2007 \n", + "21595 1410 1287 \n", + "21596 1020 1357 \n", + "\n", + "[21597 rows x 21 columns]" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } ], - "text/plain": [ - " id date price bedrooms bathrooms sqft_living \\\n", - "0 7129300520 10/13/2014 221900.0 3 1.00 1180 \n", - "1 6414100192 12/9/2014 538000.0 3 2.25 2570 \n", - "2 5631500400 2/25/2015 180000.0 2 1.00 770 \n", - "3 2487200875 12/9/2014 604000.0 4 3.00 1960 \n", - "4 1954400510 2/18/2015 510000.0 3 2.00 1680 \n", - "... ... ... ... ... ... ... \n", - "21592 263000018 5/21/2014 360000.0 3 2.50 1530 \n", - "21593 6600060120 2/23/2015 400000.0 4 2.50 2310 \n", - "21594 1523300141 6/23/2014 402101.0 2 0.75 1020 \n", - "21595 291310100 1/16/2015 400000.0 3 2.50 1600 \n", - "21596 1523300157 10/15/2014 325000.0 2 0.75 1020 \n", - "\n", - " sqft_lot floors waterfront view ... grade sqft_above \\\n", - "0 5650 1.0 NaN NONE ... 7 Average 1180 \n", - "1 7242 2.0 NO NONE ... 7 Average 2170 \n", - "2 10000 1.0 NO NONE ... 6 Low Average 770 \n", - "3 5000 1.0 NO NONE ... 7 Average 1050 \n", - "4 8080 1.0 NO NONE ... 8 Good 1680 \n", - "... ... ... ... ... ... ... ... \n", - "21592 1131 3.0 NO NONE ... 8 Good 1530 \n", - "21593 5813 2.0 NO NONE ... 8 Good 2310 \n", - "21594 1350 2.0 NO NONE ... 7 Average 1020 \n", - "21595 2388 2.0 NaN NONE ... 8 Good 1600 \n", - "21596 1076 2.0 NO NONE ... 7 Average 1020 \n", - "\n", - " sqft_basement yr_built yr_renovated zipcode lat long \\\n", - "0 0.0 1955 0.0 98178 47.5112 -122.257 \n", - "1 400.0 1951 1991.0 98125 47.7210 -122.319 \n", - "2 0.0 1933 NaN 98028 47.7379 -122.233 \n", - "3 910.0 1965 0.0 98136 47.5208 -122.393 \n", - "4 0.0 1987 0.0 98074 47.6168 -122.045 \n", - "... ... ... ... ... ... ... \n", - "21592 0.0 2009 0.0 98103 47.6993 -122.346 \n", - "21593 0.0 2014 0.0 98146 47.5107 -122.362 \n", - "21594 0.0 2009 0.0 98144 47.5944 -122.299 \n", - "21595 0.0 2004 0.0 98027 47.5345 -122.069 \n", - "21596 0.0 2008 0.0 98144 47.5941 -122.299 \n", - "\n", - " sqft_living15 sqft_lot15 \n", - "0 1340 5650 \n", - "1 1690 7639 \n", - "2 2720 8062 \n", - "3 1360 5000 \n", - "4 1800 7503 \n", - "... ... ... \n", - "21592 1530 1509 \n", - "21593 1830 7200 \n", - "21594 1020 2007 \n", - "21595 1410 1287 \n", - "21596 1020 1357 \n", - "\n", - "[21597 rows x 21 columns]" + "source": [ + "load_data('data/kc_house_data.csv') # Assuming 'data' folder is in the same directory\n", + "\n", + "\n" ] - }, - "execution_count": 3, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "load_data('data/kc_house_data.csv') # Assuming 'data' folder is in the same directory\n", - "\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The dataset contains 21 columns, each representing a distinct feature, and 21,597 rows, with each row corresponding to a specific house sale entry.\n", - "\n", - "The dataset contains a mix of data types, including integers (int64), floating-point numbers (float64), and objects (strings). For instance, numerical features such as bedrooms, bathrooms, and sqft_living are represented as integers or floating-point numbers to facilitate mathematical computations, while categorical features like waterfront and view are stored as objects to accommodate text-based categories." - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ + }, { - "name": "stdout", - "output_type": "stream", - "text": [ - "The dataset contains 21597 houses with 21 features\n", - "\n", - "Columns and their data types:\n", - "id: int64\n", - "date: object\n", - "price: float64\n", - "bedrooms: int64\n", - "bathrooms: float64\n", - "sqft_living: int64\n", - "sqft_lot: int64\n", - "floors: float64\n", - "waterfront: object\n", - "view: object\n", - "condition: object\n", - "grade: object\n", - "sqft_above: int64\n", - "sqft_basement: object\n", - "yr_built: int64\n", - "yr_renovated: float64\n", - "zipcode: int64\n", - "lat: float64\n", - "long: float64\n", - "sqft_living15: int64\n", - "sqft_lot15: int64\n", - "\n" - ] - } - ], - "source": [ - "kings_data = load_data('data/kc_house_data.csv')" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [], - "source": [ - "#create a function that takes in a column and returns the column statistics as a dictionary\n", - "def descriptive_analytics(column):\n", - " stats_dict = column.describe().to_dict()\n", - " \n", - " print(\"Descriptive Statistics for Column '{}':\".format(column.name))\n", - " print(\"The count of the column is:\", stats_dict['count'])\n", - " print(\"The mean of the column is:\", stats_dict['mean'])\n", - " print(\"The standard deviation of the column is:\", stats_dict['std'])\n", - " print(\"The minimum value of the column is:\", stats_dict['min'])\n", - " print(\"The 25th percentile of the column is:\", stats_dict['25%'])\n", - " print(\"The median of the column is:\", stats_dict['50%'])\n", - " print(\"The 75th percentile of the column is:\", stats_dict['75%'])\n", - " print(\"The maximum value of the column is:\", stats_dict['max'])" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [ + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The dataset contains 21 columns, each representing a distinct feature, and 21,597 rows, with each row corresponding to a specific house sale entry.\n", + "\n", + "The dataset contains a mix of data types, including integers (int64), floating-point numbers (float64), and objects (strings). For instance, numerical features such as bedrooms, bathrooms, and sqft_living are represented as integers or floating-point numbers to facilitate mathematical computations, while categorical features like waterfront and view are stored as objects to accommodate text-based categories." + ] + }, { - "name": "stdout", - "output_type": "stream", - "text": [ - "Descriptive Statistics for Column 'price':\n", - "The count of the column is: 21597.0\n", - "The mean of the column is: 540296.5735055795\n", - "The standard deviation of the column is: 367368.1401013936\n", - "The minimum value of the column is: 78000.0\n", - "The 25th percentile of the column is: 322000.0\n", - "The median of the column is: 450000.0\n", - "The 75th percentile of the column is: 645000.0\n", - "The maximum value of the column is: 7700000.0\n" - ] - } - ], - "source": [ - "descriptive_analytics(kings_data['price'])" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can see that the maximum price of a house is 7700000 dollars and the minimum price is 78000 dollars\n", - "\n", - "There are 21597 prices regarding to the houses in the dataset\n", - "\n", - "Average price of a house is 540296.57 dollars" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Data Preperation\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [ + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The dataset contains 21597 houses with 21 features\n", + "\n", + "Columns and their data types:\n", + "id: int64\n", + "date: object\n", + "price: float64\n", + "bedrooms: int64\n", + "bathrooms: float64\n", + "sqft_living: int64\n", + "sqft_lot: int64\n", + "floors: float64\n", + "waterfront: object\n", + "view: object\n", + "condition: object\n", + "grade: object\n", + "sqft_above: int64\n", + "sqft_basement: object\n", + "yr_built: int64\n", + "yr_renovated: float64\n", + "zipcode: int64\n", + "lat: float64\n", + "long: float64\n", + "sqft_living15: int64\n", + "sqft_lot15: int64\n", + "\n" + ] + } + ], + "source": [ + "kings_data = load_data('data/kc_house_data.csv')" + ] + }, { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n", - "RangeIndex: 21597 entries, 0 to 21596\n", - "Data columns (total 21 columns):\n", - " # Column Non-Null Count Dtype \n", - "--- ------ -------------- ----- \n", - " 0 id 21597 non-null int64 \n", - " 1 date 21597 non-null object \n", - " 2 price 21597 non-null float64\n", - " 3 bedrooms 21597 non-null int64 \n", - " 4 bathrooms 21597 non-null float64\n", - " 5 sqft_living 21597 non-null int64 \n", - " 6 sqft_lot 21597 non-null int64 \n", - " 7 floors 21597 non-null float64\n", - " 8 waterfront 19221 non-null object \n", - " 9 view 21534 non-null object \n", - " 10 condition 21597 non-null object \n", - " 11 grade 21597 non-null object \n", - " 12 sqft_above 21597 non-null int64 \n", - " 13 sqft_basement 21597 non-null object \n", - " 14 yr_built 21597 non-null int64 \n", - " 15 yr_renovated 17755 non-null float64\n", - " 16 zipcode 21597 non-null int64 \n", - " 17 lat 21597 non-null float64\n", - " 18 long 21597 non-null float64\n", - " 19 sqft_living15 21597 non-null int64 \n", - " 20 sqft_lot15 21597 non-null int64 \n", - "dtypes: float64(6), int64(9), object(6)\n", - "memory usage: 3.5+ MB\n" - ] - } - ], - "source": [ - "kings_data.info()" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [], - "source": [ - "def identify_issues(dataset):\n", - " # Identify missing values as a percentage of the whole dataset\n", - " missing_values = (dataset.isnull().sum())/len(dataset) * 100\n", - "\n", - " # Identify duplicates\n", - " duplicates = dataset.duplicated().sum()\n", - " \n", - " #return a dictionary \n", - " return {'duplicates': duplicates,\n", - " 'missing values': missing_values.round(2)} \n" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [ + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "#create a function that takes in a column and returns the column statistics as a dictionary\n", + "def descriptive_analytics(column):\n", + " stats_dict = column.describe().to_dict()\n", + " \n", + " print(\"Descriptive Statistics for Column '{}':\".format(column.name))\n", + " print(\"The count of the column is:\", stats_dict['count'])\n", + " print(\"The mean of the column is:\", stats_dict['mean'])\n", + " print(\"The standard deviation of the column is:\", stats_dict['std'])\n", + " print(\"The minimum value of the column is:\", stats_dict['min'])\n", + " print(\"The 25th percentile of the column is:\", stats_dict['25%'])\n", + " print(\"The median of the column is:\", stats_dict['50%'])\n", + " print(\"The 75th percentile of the column is:\", stats_dict['75%'])\n", + " print(\"The maximum value of the column is:\", stats_dict['max'])" + ] + }, { - "data": { - "text/plain": [ - "{'duplicates': 0,\n", - " 'missing values': id 0.00\n", - " date 0.00\n", - " price 0.00\n", - " bedrooms 0.00\n", - " bathrooms 0.00\n", - " sqft_living 0.00\n", - " sqft_lot 0.00\n", - " floors 0.00\n", - " waterfront 11.00\n", - " view 0.29\n", - " condition 0.00\n", - " grade 0.00\n", - " sqft_above 0.00\n", - " sqft_basement 0.00\n", - " yr_built 0.00\n", - " yr_renovated 17.79\n", - " zipcode 0.00\n", - " lat 0.00\n", - " long 0.00\n", - " sqft_living15 0.00\n", - " sqft_lot15 0.00\n", - " dtype: float64}" + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Descriptive Statistics for Column 'price':\n", + "The count of the column is: 21597.0\n", + "The mean of the column is: 540296.5735055795\n", + "The standard deviation of the column is: 367368.1401013936\n", + "The minimum value of the column is: 78000.0\n", + "The 25th percentile of the column is: 322000.0\n", + "The median of the column is: 450000.0\n", + "The 75th percentile of the column is: 645000.0\n", + "The maximum value of the column is: 7700000.0\n" + ] + } + ], + "source": [ + "descriptive_analytics(kings_data['price'])" ] - }, - "execution_count": 9, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "identify_issues(kings_data)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The examination indicates that there are no duplicate entries within the dataset, ensuring the integrity of the records. However, attention is warranted to address missing values present in certain columns. Specifically, the 'waterfront' feature exhibits 11% of null values, representing a negligible portion of the dataset. Similarly, the 'yr_renovated' feature shows a relatively higher percentage of missing values, accounting for approximately 17.79% of the dataset" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "##### Before making changes make a copy instead of overwriting data" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [], - "source": [ - "house_data_clean = kings_data.copy()" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [], - "source": [ - "# Changing the date to date time\n", - "house_data_clean['date'] = pd.to_datetime(house_data_clean['date'])\n", - "\n", - "# Extracting only the year from the column Date\n", - "house_data_clean.date = house_data_clean['date'].dt.year\n", - "\n", - "# Changing the dates for the year built \n", - "house_data_clean['yr_built'] = pd.to_datetime(house_data_clean['yr_built'],format='%Y').dt.year\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The above code converts the 'date' column data to only contain the year the house was sold, for the purpose of analysis we will use only the year since the changes month by month will be minor." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### Dealing with the missing values" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [], - "source": [ - "def missing_values(dataset):\n", - " # drop the rows from views\n", - " dataset.dropna(subset=['view'],inplace=True)\n", - "\n", - " # Filling the NaN values for waterfront with NO\n", - " dataset.waterfront.fillna('NO',inplace=True)\n", - " \n", - " # Dropping the yr_renovated column \n", - " dataset.drop('yr_renovated',axis=1,inplace=True)" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [], - "source": [ - "missing_values(house_data_clean)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "'yr_renovated' has the highest percentage of NaN values 17%. This will be dropped since it will not be used within our model inline with the business problem.\n", - "\n", - "'Waterfront' feature has 11% null values, this was filled with NO on the assumption that these cells were not filled since they lacked waterfronts\n", - "\n", - "For the 'View' column, the null values were dropped by row since the overall percentage impact would be minute" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [ + }, { - "data": { - "text/plain": [ - "{'duplicates': 2,\n", - " 'missing values': id 0.0\n", - " date 0.0\n", - " price 0.0\n", - " bedrooms 0.0\n", - " bathrooms 0.0\n", - " sqft_living 0.0\n", - " sqft_lot 0.0\n", - " floors 0.0\n", - " waterfront 0.0\n", - " view 0.0\n", - " condition 0.0\n", - " grade 0.0\n", - " sqft_above 0.0\n", - " sqft_basement 0.0\n", - " yr_built 0.0\n", - " zipcode 0.0\n", - " lat 0.0\n", - " long 0.0\n", - " sqft_living15 0.0\n", - " sqft_lot15 0.0\n", - " dtype: float64}" + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We can see that the maximum price of a house is 7700000 dollars and the minimum price is 78000 dollars\n", + "\n", + "There are 21597 prices regarding to the houses in the dataset\n", + "\n", + "Average price of a house is 540296.57 dollars" ] - }, - "execution_count": 14, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "identify_issues(house_data_clean)" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [ + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Data Preperation\n", + "\n" + ] + }, { - "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", - "
iddatepricebedroomsbathroomssqft_livingsqft_lotfloorswaterfrontviewconditiongradesqft_abovesqft_basementyr_builtzipcodelatlongsqft_living15sqft_lot15
394718250690312014550000.041.75241084472.0NOGOODGood8 Good2060350.019369807447.6499-122.088252014789
2003886489001102014555000.032.50194032112.0NONONEAverage8 Good19400.020099802747.5644-122.09318803078
\n", - "
" + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "RangeIndex: 21597 entries, 0 to 21596\n", + "Data columns (total 21 columns):\n", + " # Column Non-Null Count Dtype \n", + "--- ------ -------------- ----- \n", + " 0 id 21597 non-null int64 \n", + " 1 date 21597 non-null object \n", + " 2 price 21597 non-null float64\n", + " 3 bedrooms 21597 non-null int64 \n", + " 4 bathrooms 21597 non-null float64\n", + " 5 sqft_living 21597 non-null int64 \n", + " 6 sqft_lot 21597 non-null int64 \n", + " 7 floors 21597 non-null float64\n", + " 8 waterfront 19221 non-null object \n", + " 9 view 21534 non-null object \n", + " 10 condition 21597 non-null object \n", + " 11 grade 21597 non-null object \n", + " 12 sqft_above 21597 non-null int64 \n", + " 13 sqft_basement 21597 non-null object \n", + " 14 yr_built 21597 non-null int64 \n", + " 15 yr_renovated 17755 non-null float64\n", + " 16 zipcode 21597 non-null int64 \n", + " 17 lat 21597 non-null float64\n", + " 18 long 21597 non-null float64\n", + " 19 sqft_living15 21597 non-null int64 \n", + " 20 sqft_lot15 21597 non-null int64 \n", + "dtypes: float64(6), int64(9), object(6)\n", + "memory usage: 3.5+ MB\n" + ] + } ], - "text/plain": [ - " id date price bedrooms bathrooms sqft_living sqft_lot \\\n", - "3947 1825069031 2014 550000.0 4 1.75 2410 8447 \n", - "20038 8648900110 2014 555000.0 3 2.50 1940 3211 \n", - "\n", - " floors waterfront view condition grade sqft_above sqft_basement \\\n", - "3947 2.0 NO GOOD Good 8 Good 2060 350.0 \n", - "20038 2.0 NO NONE Average 8 Good 1940 0.0 \n", - "\n", - " yr_built zipcode lat long sqft_living15 sqft_lot15 \n", - "3947 1936 98074 47.6499 -122.088 2520 14789 \n", - "20038 2009 98027 47.5644 -122.093 1880 3078 " + "source": [ + "kings_data.info()" ] - }, - "execution_count": 15, - "metadata": {}, - "output_type": "execute_result" + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [], + "source": [ + "def identify_issues(dataset):\n", + " # Identify missing values as a percentage of the whole dataset\n", + " missing_values = (dataset.isnull().sum())/len(dataset) * 100\n", + "\n", + " # Identify duplicates\n", + " duplicates = dataset.duplicated().sum()\n", + " \n", + " #return a dictionary \n", + " return {'duplicates': duplicates,\n", + " 'missing values': missing_values.round(2)} \n" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'duplicates': 0,\n", + " 'missing values': id 0.00\n", + " date 0.00\n", + " price 0.00\n", + " bedrooms 0.00\n", + " bathrooms 0.00\n", + " sqft_living 0.00\n", + " sqft_lot 0.00\n", + " floors 0.00\n", + " waterfront 11.00\n", + " view 0.29\n", + " condition 0.00\n", + " grade 0.00\n", + " sqft_above 0.00\n", + " sqft_basement 0.00\n", + " yr_built 0.00\n", + " yr_renovated 17.79\n", + " zipcode 0.00\n", + " lat 0.00\n", + " long 0.00\n", + " sqft_living15 0.00\n", + " sqft_lot15 0.00\n", + " dtype: float64}" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "identify_issues(kings_data)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The examination indicates that there are no duplicate entries within the dataset, ensuring the integrity of the records. However, attention is warranted to address missing values present in certain columns. Specifically, the 'waterfront' feature exhibits 11% of null values, representing a negligible portion of the dataset. Similarly, the 'yr_renovated' feature shows a relatively higher percentage of missing values, accounting for approximately 17.79% of the dataset" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "##### Before making changes make a copy instead of overwriting data" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [], + "source": [ + "house_data_clean = kings_data.copy()" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [], + "source": [ + "# Changing the date to date time\n", + "house_data_clean['date'] = pd.to_datetime(house_data_clean['date'])\n", + "\n", + "# Extracting only the year from the column Date\n", + "house_data_clean.date = house_data_clean['date'].dt.year\n", + "\n", + "# Changing the dates for the year built \n", + "house_data_clean['yr_built'] = pd.to_datetime(house_data_clean['yr_built'],format='%Y').dt.year\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The above code converts the 'date' column data to only contain the year the house was sold, for the purpose of analysis we will use only the year since the changes month by month will be minor." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Dealing with the missing values" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [], + "source": [ + "def missing_values(dataset):\n", + " # drop the rows from views\n", + " dataset.dropna(subset=['view'],inplace=True)\n", + "\n", + " # Filling the NaN values for waterfront with NO\n", + " dataset.waterfront.fillna('NO',inplace=True)\n", + " \n", + " # Dropping the yr_renovated column \n", + " dataset.drop('yr_renovated',axis=1,inplace=True)" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [], + "source": [ + "missing_values(house_data_clean)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "'yr_renovated' has the highest percentage of NaN values 17%. This will be dropped since it will not be used within our model inline with the business problem.\n", + "\n", + "'Waterfront' feature has 11% null values, this was filled with NO on the assumption that these cells were not filled since they lacked waterfronts\n", + "\n", + "For the 'View' column, the null values were dropped by row since the overall percentage impact would be minute" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'duplicates': 2,\n", + " 'missing values': id 0.0\n", + " date 0.0\n", + " price 0.0\n", + " bedrooms 0.0\n", + " bathrooms 0.0\n", + " sqft_living 0.0\n", + " sqft_lot 0.0\n", + " floors 0.0\n", + " waterfront 0.0\n", + " view 0.0\n", + " condition 0.0\n", + " grade 0.0\n", + " sqft_above 0.0\n", + " sqft_basement 0.0\n", + " yr_built 0.0\n", + " zipcode 0.0\n", + " lat 0.0\n", + " long 0.0\n", + " sqft_living15 0.0\n", + " sqft_lot15 0.0\n", + " dtype: float64}" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "identify_issues(house_data_clean)" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "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", + "
iddatepricebedroomsbathroomssqft_livingsqft_lotfloorswaterfrontviewconditiongradesqft_abovesqft_basementyr_builtzipcodelatlongsqft_living15sqft_lot15
394718250690312014550000.041.75241084472.0NOGOODGood8 Good2060350.019369807447.6499-122.088252014789
2003886489001102014555000.032.50194032112.0NONONEAverage8 Good19400.020099802747.5644-122.09318803078
\n", + "
" + ], + "text/plain": [ + " id date price bedrooms bathrooms sqft_living sqft_lot \\\n", + "3947 1825069031 2014 550000.0 4 1.75 2410 8447 \n", + "20038 8648900110 2014 555000.0 3 2.50 1940 3211 \n", + "\n", + " floors waterfront view condition grade sqft_above sqft_basement \\\n", + "3947 2.0 NO GOOD Good 8 Good 2060 350.0 \n", + "20038 2.0 NO NONE Average 8 Good 1940 0.0 \n", + "\n", + " yr_built zipcode lat long sqft_living15 sqft_lot15 \n", + "3947 1936 98074 47.6499 -122.088 2520 14789 \n", + "20038 2009 98027 47.5644 -122.093 1880 3078 " + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "house_data_clean[house_data_clean.duplicated()]" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "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.10.13" } - ], - "source": [ - "house_data_clean[house_data_clean.duplicated()]" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "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.10.13" - } - }, - "nbformat": 4, - "nbformat_minor": 2 + "nbformat": 4, + "nbformat_minor": 2 } From e409f03f1cd19c8332e7b24b138dae76150ffc25 Mon Sep 17 00:00:00 2001 From: clydeochieng <107258512+clydeochieng@users.noreply.github.com> Date: Tue, 30 Apr 2024 23:53:19 +0300 Subject: [PATCH 22/42] Update student.ipynb --- student.ipynb | 206 ++++++++++++++++++++++++-------------------------- 1 file changed, 99 insertions(+), 107 deletions(-) diff --git a/student.ipynb b/student.ipynb index 09a140ae..e4128c3d 100644 --- a/student.ipynb +++ b/student.ipynb @@ -1,111 +1,103 @@ { - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Final Project Submission\n", - "\n", - "Please fill out:\n", -Clyde - "* Student name: Solphine Joseph, Grace Rotich, Mathew Kiprotich, Hilary Simiyu, Clyde Ochieng. \n", - - "* Student name: Solphine Joseph, Grace Rotich, Mathew Kiprotich, Hilary Simiyu, Clyde Ochieng, Derrick Kiptoo.\n", - main - "* Student pace: full time\n", - "* Scheduled project review date/time: \n", - "* Instructor name: Nikita \n", - "* Blog post URL:\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Kings County Housing Analysis with Multiple Linear Regression" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Overview\n", - "\n", - "\n", - "A real estate agency in Kingsway seeks to determine what are the contributing factors that affect the price of houses to make improvements where necessary. They want to employ an analytical approach rather than sentimental before arriving at a decision. Multilinear regression has been used for this project to understand how various features affect their pricing to better their services." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Business Problem\n", - "\n", - "In the face of market fluctuations and heightened competition within the real estate sector, our agency is grappling with pricing volatility, which poses significant challenges for our agents in devising effective business strategies. We seek strategic guidance to optimize our purchasing and selling endeavors, prioritizing informed decision-making to identify key areas of focus that promise maximum returns on investment." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Objectives\n", - "* To determine the key factors influencing house prices.\n", - "* To develop multilinear regression models to predict house prices based on relevant features.\n", - "* To use insights from the regression analysis to optimize pricing strategies for both purchasing and selling properties.\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Hypothesis\n", - "* Null Hypothesis - There is no relationship between our independent variables and our dependent variable \n", - "\n", - "* Alternative Hypothesis - There is a relationship between our independent variables and our dependent variable" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Data Understanding:\n", - "\n", - "In this project, we utilized the King County House Sales dataset, which serves as the foundational dataset for our analysis. It was sourced Kaggle.The dataset encompasses comprehensive information regarding house sales within King County, Washington, USA. It comprises a diverse array of features, including the number of bedrooms, bathrooms, square footage, as well as geographical and pricing details of the properties sold. This dataset is frequently employed in data science and machine learning endeavors, particularly for predictive modeling tasks such as regression analysis aimed at forecasting house prices based on the provided features." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "##### King County Housing Data Columns \n", - "\n", - "The column names contained in column_names.md are:\n", - "* `id`: A unique identifier for each house sale.\n", - "* `date`: The date when the house was sold.\n", - "* `price`: The sale price of the house, serving as the target variable for predictive modeling.\n", - "* `bedrooms`, `bathrooms`, `sqft_living`, `sqft_lot`: Numerical features representing the number of bedrooms and bathrooms, as well as the living area and lot area of the house, respectively.\n", - "* `floors`: The number of floors in the house.\n", - "* `waterfront`, `view`, `condition`, `grade`: Categorical features describing aspects such as waterfront availability, property view, condition, and overall grade assigned to the housing unit.\n", - "* `yr_built`, `yr_renovated`: Year of construction and renovation of the house.\n", - "* `zipcode`, `lat`, `long`: Geographical features including ZIP code, latitude, and longitude coordinates.\n", - "* `sqft_above`, `sqft_basement`, `sqft_living15`, `sqft_lot15`: Additional numerical features providing details about the house's above-ground and basement square footage, as well as living area and lot area of the nearest 15 neighboring houses." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Data Loading\n", - "\n", - "#### Import Necessary Libraries" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Final Project Submission\n", + "\n", + "* Student name: Solphine Joseph, Grace Rotich, Mathew Kiprotich, Hilary Simiyu, Clyde Ochieng. \n", + "* Student name: Solphine Joseph, Grace Rotich, Mathew Kiprotich, Hilary Simiyu, Clyde Ochieng, Derrick Kiptoo.\n", + "* Student pace: full time\n", + "* Scheduled project review date/time: \n", + "* Instructor name: Nikita \n", + "* Blog post URL:\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Kings County Housing Analysis with Multiple Linear Regression" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Overview\n", + "\n", + "A real estate agency in Kingsway seeks to determine what are the contributing factors that affect the price of houses to make improvements where necessary. They want to employ an analytical approach rather than sentimental before arriving at a decision. Multilinear regression has been used for this project to understand how various features affect their pricing to better their services." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Business Problem\n", + "\n", + "In the face of market fluctuations and heightened competition within the real estate sector, our agency is grappling with pricing volatility, which poses significant challenges for our agents in devising effective business strategies. We seek strategic guidance to optimize our purchasing and selling endeavors, prioritizing informed decision-making to identify key areas of focus that promise maximum returns on investment." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Objectives\n", + "* To determine the key factors influencing house prices.\n", + "* To develop multilinear regression models to predict house prices based on relevant features.\n", + "* To use insights from the regression analysis to optimize pricing strategies for both purchasing and selling properties.\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Hypothesis\n", + "* Null Hypothesis - There is no relationship between our independent variables and our dependent variable \n", + "\n", + "* Alternative Hypothesis - There is a relationship between our independent variables and our dependent variable" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Data Understanding:\n", + "\n", + "In this project, we utilized the King County House Sales dataset, which serves as the foundational dataset for our analysis. It was sourced Kaggle.The dataset encompasses comprehensive information regarding house sales within King County, Washington, USA. It comprises a diverse array of features, including the number of bedrooms, bathrooms, square footage, as well as geographical and pricing details of the properties sold. This dataset is frequently employed in data science and machine learning endeavors, particularly for predictive modeling tasks such as regression analysis aimed at forecasting house prices based on the provided features." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "##### King County Housing Data Columns \n", + "\n", + "The column names contained in column_names.md are:\n", + "* `id`: A unique identifier for each house sale.\n", + "* `date`: The date when the house was sold.\n", + "* `price`: The sale price of the house, serving as the target variable for predictive modeling.\n", + "* `bedrooms`, `bathrooms`, `sqft_living`, `sqft_lot`: Numerical features representing the number of bedrooms and bathrooms, as well as the living area and lot area of the house, respectively.\n", + "* `floors`: The number of floors in the house.\n", + "* `waterfront`, `view`, `condition`, `grade`: Categorical features describing aspects such as waterfront availability, property view, condition, and overall grade assigned to the housing unit.\n", + "* `yr_built`, `yr_renovated`: Year of construction and renovation of the house.\n", + "* `zipcode`, `lat`, `long`: Geographical features including ZIP code, latitude, and longitude coordinates.\n", + "* `sqft_above`, `sqft_basement`, `sqft_living15`, `sqft_lot15`: Additional numerical features providing details about the house's above-ground and basement square footage, as well as living area and lot area of the nearest 15 neighboring houses." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Data Loading\n", + "\n" + ] + }, + { + "cell_type": "code", + "metadata": {}, + "source": [ "import matplotlib.pyplot as plt\n", "%matplotlib inline\n", "import numpy as np\n", From 9824144694280c2400705fbd29f06296d7cb192d Mon Sep 17 00:00:00 2001 From: clydeochieng <107258512+clydeochieng@users.noreply.github.com> Date: Tue, 30 Apr 2024 23:55:32 +0300 Subject: [PATCH 23/42] Update student.ipynb --- student.ipynb | 2070 +++++++++++++++++++++++++------------------------ 1 file changed, 1036 insertions(+), 1034 deletions(-) diff --git a/student.ipynb b/student.ipynb index e4128c3d..3d526e43 100644 --- a/student.ipynb +++ b/student.ipynb @@ -1,1053 +1,1055 @@ { - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Final Project Submission\n", - "\n", - "* Student name: Solphine Joseph, Grace Rotich, Mathew Kiprotich, Hilary Simiyu, Clyde Ochieng. \n", - "* Student name: Solphine Joseph, Grace Rotich, Mathew Kiprotich, Hilary Simiyu, Clyde Ochieng, Derrick Kiptoo.\n", - "* Student pace: full time\n", - "* Scheduled project review date/time: \n", - "* Instructor name: Nikita \n", - "* Blog post URL:\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Kings County Housing Analysis with Multiple Linear Regression" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Overview\n", - "\n", - "A real estate agency in Kingsway seeks to determine what are the contributing factors that affect the price of houses to make improvements where necessary. They want to employ an analytical approach rather than sentimental before arriving at a decision. Multilinear regression has been used for this project to understand how various features affect their pricing to better their services." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Business Problem\n", - "\n", - "In the face of market fluctuations and heightened competition within the real estate sector, our agency is grappling with pricing volatility, which poses significant challenges for our agents in devising effective business strategies. We seek strategic guidance to optimize our purchasing and selling endeavors, prioritizing informed decision-making to identify key areas of focus that promise maximum returns on investment." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Objectives\n", - "* To determine the key factors influencing house prices.\n", - "* To develop multilinear regression models to predict house prices based on relevant features.\n", - "* To use insights from the regression analysis to optimize pricing strategies for both purchasing and selling properties.\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Hypothesis\n", - "* Null Hypothesis - There is no relationship between our independent variables and our dependent variable \n", - "\n", - "* Alternative Hypothesis - There is a relationship between our independent variables and our dependent variable" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Data Understanding:\n", - "\n", - "In this project, we utilized the King County House Sales dataset, which serves as the foundational dataset for our analysis. It was sourced Kaggle.The dataset encompasses comprehensive information regarding house sales within King County, Washington, USA. It comprises a diverse array of features, including the number of bedrooms, bathrooms, square footage, as well as geographical and pricing details of the properties sold. This dataset is frequently employed in data science and machine learning endeavors, particularly for predictive modeling tasks such as regression analysis aimed at forecasting house prices based on the provided features." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "##### King County Housing Data Columns \n", - "\n", - "The column names contained in column_names.md are:\n", - "* `id`: A unique identifier for each house sale.\n", - "* `date`: The date when the house was sold.\n", - "* `price`: The sale price of the house, serving as the target variable for predictive modeling.\n", - "* `bedrooms`, `bathrooms`, `sqft_living`, `sqft_lot`: Numerical features representing the number of bedrooms and bathrooms, as well as the living area and lot area of the house, respectively.\n", - "* `floors`: The number of floors in the house.\n", - "* `waterfront`, `view`, `condition`, `grade`: Categorical features describing aspects such as waterfront availability, property view, condition, and overall grade assigned to the housing unit.\n", - "* `yr_built`, `yr_renovated`: Year of construction and renovation of the house.\n", - "* `zipcode`, `lat`, `long`: Geographical features including ZIP code, latitude, and longitude coordinates.\n", - "* `sqft_above`, `sqft_basement`, `sqft_living15`, `sqft_lot15`: Additional numerical features providing details about the house's above-ground and basement square footage, as well as living area and lot area of the nearest 15 neighboring houses." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Data Loading\n", - "\n" - ] - }, - { - "cell_type": "code", - "metadata": {}, - "source": [ - "import matplotlib.pyplot as plt\n", - "%matplotlib inline\n", - "import numpy as np\n", - "import pandas as pd\n", - "import scipy.stats as stats\n", - "import seaborn as sns\n", - "import statsmodels.api as sm\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Loading Data" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "# Creating a function that loads data and return it in a dataframe\n", - "def load_data(file_path):\n", - " house_data = pd.read_csv(file_path)\n", - "\n", - " #shape\n", - " shape = house_data.shape\n", - " print(f\"The dataset contains {shape[0]} houses with {shape[1]} features\")\n", - " print()\n", - " \n", - " #Data Types\n", - " data_types = house_data.dtypes\n", - " print(\"Columns and their data types:\")\n", - " for column, dtype in data_types.items():\n", - " print(f\"{column}: {dtype}\")\n", - " print()\n", - "\n", - " return house_data\n" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Final Project Submission\n", + "\n", + "* Student name: Solphine Joseph, Grace Rotich, Mathew Kiprotich, Hilary Simiyu, Clyde Ochieng. \n", + "* Student name: Solphine Joseph, Grace Rotich, Mathew Kiprotich, Hilary Simiyu, Clyde Ochieng, Derrick Kiptoo.\n", + "* Student pace: full time\n", + "* Scheduled project review date/time: \n", + "* Instructor name: Nikita \n", + "* Blog post URL:\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Kings County Housing Analysis with Multiple Linear Regression" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Overview\n", + "\n", + "A real estate agency in Kingsway seeks to determine what are the contributing factors that affect the price of houses to make improvements where necessary. They want to employ an analytical approach rather than sentimental before arriving at a decision. Multilinear regression has been used for this project to understand how various features affect their pricing to better their services." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Business Problem\n", + "\n", + "In the face of market fluctuations and heightened competition within the real estate sector, our agency is grappling with pricing volatility, which poses significant challenges for our agents in devising effective business strategies. We seek strategic guidance to optimize our purchasing and selling endeavors, prioritizing informed decision-making to identify key areas of focus that promise maximum returns on investment." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Objectives\n", + "* To determine the key factors influencing house prices.\n", + "* To develop multilinear regression models to predict house prices based on relevant features.\n", + "* To use insights from the regression analysis to optimize pricing strategies for both purchasing and selling properties.\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Hypothesis\n", + "* Null Hypothesis - There is no relationship between our independent variables and our dependent variable \n", + "\n", + "* Alternative Hypothesis - There is a relationship between our independent variables and our dependent variable" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Data Understanding:\n", + "\n", + "In this project, we utilized the King County House Sales dataset, which serves as the foundational dataset for our analysis. It was sourced Kaggle.The dataset encompasses comprehensive information regarding house sales within King County, Washington, USA. It comprises a diverse array of features, including the number of bedrooms, bathrooms, square footage, as well as geographical and pricing details of the properties sold. This dataset is frequently employed in data science and machine learning endeavors, particularly for predictive modeling tasks such as regression analysis aimed at forecasting house prices based on the provided features." + ] + }, { - "name": "stdout", - "output_type": "stream", - "text": [ - "The dataset contains 21597 houses with 21 features\n", - "\n", - "Columns and their data types:\n", - "id: int64\n", - "date: object\n", - "price: float64\n", - "bedrooms: int64\n", - "bathrooms: float64\n", - "sqft_living: int64\n", - "sqft_lot: int64\n", - "floors: float64\n", - "waterfront: object\n", - "view: object\n", - "condition: object\n", - "grade: object\n", - "sqft_above: int64\n", - "sqft_basement: object\n", - "yr_built: int64\n", - "yr_renovated: float64\n", - "zipcode: int64\n", - "lat: float64\n", - "long: float64\n", - "sqft_living15: int64\n", - "sqft_lot15: int64\n", - "\n" - ] + "cell_type": "markdown", + "metadata": {}, + "source": [ + "##### King County Housing Data Columns \n", + "\n", + "The column names contained in column_names.md are:\n", + "* `id`: A unique identifier for each house sale.\n", + "* `date`: The date when the house was sold.\n", + "* `price`: The sale price of the house, serving as the target variable for predictive modeling.\n", + "* `bedrooms`, `bathrooms`, `sqft_living`, `sqft_lot`: Numerical features representing the number of bedrooms and bathrooms, as well as the living area and lot area of the house, respectively.\n", + "* `floors`: The number of floors in the house.\n", + "* `waterfront`, `view`, `condition`, `grade`: Categorical features describing aspects such as waterfront availability, property view, condition, and overall grade assigned to the housing unit.\n", + "* `yr_built`, `yr_renovated`: Year of construction and renovation of the house.\n", + "* `zipcode`, `lat`, `long`: Geographical features including ZIP code, latitude, and longitude coordinates.\n", + "* `sqft_above`, `sqft_basement`, `sqft_living15`, `sqft_lot15`: Additional numerical features providing details about the house's above-ground and basement square footage, as well as living area and lot area of the nearest 15 neighboring houses." + ] }, { - "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", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
iddatepricebedroomsbathroomssqft_livingsqft_lotfloorswaterfrontview...gradesqft_abovesqft_basementyr_builtyr_renovatedzipcodelatlongsqft_living15sqft_lot15
0712930052010/13/2014221900.031.00118056501.0NaNNONE...7 Average11800.019550.09817847.5112-122.25713405650
1641410019212/9/2014538000.032.25257072422.0NONONE...7 Average2170400.019511991.09812547.7210-122.31916907639
256315004002/25/2015180000.021.00770100001.0NONONE...6 Low Average7700.01933NaN9802847.7379-122.23327208062
3248720087512/9/2014604000.043.00196050001.0NONONE...7 Average1050910.019650.09813647.5208-122.39313605000
419544005102/18/2015510000.032.00168080801.0NONONE...8 Good16800.019870.09807447.6168-122.04518007503
..................................................................
215922630000185/21/2014360000.032.50153011313.0NONONE...8 Good15300.020090.09810347.6993-122.34615301509
2159366000601202/23/2015400000.042.50231058132.0NONONE...8 Good23100.020140.09814647.5107-122.36218307200
2159415233001416/23/2014402101.020.75102013502.0NONONE...7 Average10200.020090.09814447.5944-122.29910202007
215952913101001/16/2015400000.032.50160023882.0NaNNONE...8 Good16000.020040.09802747.5345-122.06914101287
21596152330015710/15/2014325000.020.75102010762.0NONONE...7 Average10200.020080.09814447.5941-122.29910201357
\n", - "

21597 rows × 21 columns

\n", - "
" + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Data Loading\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "import matplotlib.pyplot as plt\n", + "%matplotlib inline\n", + "import numpy as np\n", + "import pandas as pd\n", + "import scipy.stats as stats\n", + "import seaborn as sns\n", + "import statsmodels.api as sm\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Loading Data" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "# Creating a function that loads data and return it in a dataframe\n", + "def load_data(file_path):\n", + " house_data = pd.read_csv(file_path)\n", + "\n", + " #shape\n", + " shape = house_data.shape\n", + " print(f\"The dataset contains {shape[0]} houses with {shape[1]} features\")\n", + " print()\n", + " \n", + " #Data Types\n", + " data_types = house_data.dtypes\n", + " print(\"Columns and their data types:\")\n", + " for column, dtype in data_types.items():\n", + " print(f\"{column}: {dtype}\")\n", + " print()\n", + "\n", + " return house_data\n" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The dataset contains 21597 houses with 21 features\n", + "\n", + "Columns and their data types:\n", + "id: int64\n", + "date: object\n", + "price: float64\n", + "bedrooms: int64\n", + "bathrooms: float64\n", + "sqft_living: int64\n", + "sqft_lot: int64\n", + "floors: float64\n", + "waterfront: object\n", + "view: object\n", + "condition: object\n", + "grade: object\n", + "sqft_above: int64\n", + "sqft_basement: object\n", + "yr_built: int64\n", + "yr_renovated: float64\n", + "zipcode: int64\n", + "lat: float64\n", + "long: float64\n", + "sqft_living15: int64\n", + "sqft_lot15: int64\n", + "\n" + ] + }, + { + "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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
iddatepricebedroomsbathroomssqft_livingsqft_lotfloorswaterfrontview...gradesqft_abovesqft_basementyr_builtyr_renovatedzipcodelatlongsqft_living15sqft_lot15
0712930052010/13/2014221900.031.00118056501.0NaNNONE...7 Average11800.019550.09817847.5112-122.25713405650
1641410019212/9/2014538000.032.25257072422.0NONONE...7 Average2170400.019511991.09812547.7210-122.31916907639
256315004002/25/2015180000.021.00770100001.0NONONE...6 Low Average7700.01933NaN9802847.7379-122.23327208062
3248720087512/9/2014604000.043.00196050001.0NONONE...7 Average1050910.019650.09813647.5208-122.39313605000
419544005102/18/2015510000.032.00168080801.0NONONE...8 Good16800.019870.09807447.6168-122.04518007503
..................................................................
215922630000185/21/2014360000.032.50153011313.0NONONE...8 Good15300.020090.09810347.6993-122.34615301509
2159366000601202/23/2015400000.042.50231058132.0NONONE...8 Good23100.020140.09814647.5107-122.36218307200
2159415233001416/23/2014402101.020.75102013502.0NONONE...7 Average10200.020090.09814447.5944-122.29910202007
215952913101001/16/2015400000.032.50160023882.0NaNNONE...8 Good16000.020040.09802747.5345-122.06914101287
21596152330015710/15/2014325000.020.75102010762.0NONONE...7 Average10200.020080.09814447.5941-122.29910201357
\n", + "

21597 rows × 21 columns

\n", + "
" + ], + "text/plain": [ + " id date price bedrooms bathrooms sqft_living \\\n", + "0 7129300520 10/13/2014 221900.0 3 1.00 1180 \n", + "1 6414100192 12/9/2014 538000.0 3 2.25 2570 \n", + "2 5631500400 2/25/2015 180000.0 2 1.00 770 \n", + "3 2487200875 12/9/2014 604000.0 4 3.00 1960 \n", + "4 1954400510 2/18/2015 510000.0 3 2.00 1680 \n", + "... ... ... ... ... ... ... \n", + "21592 263000018 5/21/2014 360000.0 3 2.50 1530 \n", + "21593 6600060120 2/23/2015 400000.0 4 2.50 2310 \n", + "21594 1523300141 6/23/2014 402101.0 2 0.75 1020 \n", + "21595 291310100 1/16/2015 400000.0 3 2.50 1600 \n", + "21596 1523300157 10/15/2014 325000.0 2 0.75 1020 \n", + "\n", + " sqft_lot floors waterfront view ... grade sqft_above \\\n", + "0 5650 1.0 NaN NONE ... 7 Average 1180 \n", + "1 7242 2.0 NO NONE ... 7 Average 2170 \n", + "2 10000 1.0 NO NONE ... 6 Low Average 770 \n", + "3 5000 1.0 NO NONE ... 7 Average 1050 \n", + "4 8080 1.0 NO NONE ... 8 Good 1680 \n", + "... ... ... ... ... ... ... ... \n", + "21592 1131 3.0 NO NONE ... 8 Good 1530 \n", + "21593 5813 2.0 NO NONE ... 8 Good 2310 \n", + "21594 1350 2.0 NO NONE ... 7 Average 1020 \n", + "21595 2388 2.0 NaN NONE ... 8 Good 1600 \n", + "21596 1076 2.0 NO NONE ... 7 Average 1020 \n", + "\n", + " sqft_basement yr_built yr_renovated zipcode lat long \\\n", + "0 0.0 1955 0.0 98178 47.5112 -122.257 \n", + "1 400.0 1951 1991.0 98125 47.7210 -122.319 \n", + "2 0.0 1933 NaN 98028 47.7379 -122.233 \n", + "3 910.0 1965 0.0 98136 47.5208 -122.393 \n", + "4 0.0 1987 0.0 98074 47.6168 -122.045 \n", + "... ... ... ... ... ... ... \n", + "21592 0.0 2009 0.0 98103 47.6993 -122.346 \n", + "21593 0.0 2014 0.0 98146 47.5107 -122.362 \n", + "21594 0.0 2009 0.0 98144 47.5944 -122.299 \n", + "21595 0.0 2004 0.0 98027 47.5345 -122.069 \n", + "21596 0.0 2008 0.0 98144 47.5941 -122.299 \n", + "\n", + " sqft_living15 sqft_lot15 \n", + "0 1340 5650 \n", + "1 1690 7639 \n", + "2 2720 8062 \n", + "3 1360 5000 \n", + "4 1800 7503 \n", + "... ... ... \n", + "21592 1530 1509 \n", + "21593 1830 7200 \n", + "21594 1020 2007 \n", + "21595 1410 1287 \n", + "21596 1020 1357 \n", + "\n", + "[21597 rows x 21 columns]" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } ], - "text/plain": [ - " id date price bedrooms bathrooms sqft_living \\\n", - "0 7129300520 10/13/2014 221900.0 3 1.00 1180 \n", - "1 6414100192 12/9/2014 538000.0 3 2.25 2570 \n", - "2 5631500400 2/25/2015 180000.0 2 1.00 770 \n", - "3 2487200875 12/9/2014 604000.0 4 3.00 1960 \n", - "4 1954400510 2/18/2015 510000.0 3 2.00 1680 \n", - "... ... ... ... ... ... ... \n", - "21592 263000018 5/21/2014 360000.0 3 2.50 1530 \n", - "21593 6600060120 2/23/2015 400000.0 4 2.50 2310 \n", - "21594 1523300141 6/23/2014 402101.0 2 0.75 1020 \n", - "21595 291310100 1/16/2015 400000.0 3 2.50 1600 \n", - "21596 1523300157 10/15/2014 325000.0 2 0.75 1020 \n", - "\n", - " sqft_lot floors waterfront view ... grade sqft_above \\\n", - "0 5650 1.0 NaN NONE ... 7 Average 1180 \n", - "1 7242 2.0 NO NONE ... 7 Average 2170 \n", - "2 10000 1.0 NO NONE ... 6 Low Average 770 \n", - "3 5000 1.0 NO NONE ... 7 Average 1050 \n", - "4 8080 1.0 NO NONE ... 8 Good 1680 \n", - "... ... ... ... ... ... ... ... \n", - "21592 1131 3.0 NO NONE ... 8 Good 1530 \n", - "21593 5813 2.0 NO NONE ... 8 Good 2310 \n", - "21594 1350 2.0 NO NONE ... 7 Average 1020 \n", - "21595 2388 2.0 NaN NONE ... 8 Good 1600 \n", - "21596 1076 2.0 NO NONE ... 7 Average 1020 \n", - "\n", - " sqft_basement yr_built yr_renovated zipcode lat long \\\n", - "0 0.0 1955 0.0 98178 47.5112 -122.257 \n", - "1 400.0 1951 1991.0 98125 47.7210 -122.319 \n", - "2 0.0 1933 NaN 98028 47.7379 -122.233 \n", - "3 910.0 1965 0.0 98136 47.5208 -122.393 \n", - "4 0.0 1987 0.0 98074 47.6168 -122.045 \n", - "... ... ... ... ... ... ... \n", - "21592 0.0 2009 0.0 98103 47.6993 -122.346 \n", - "21593 0.0 2014 0.0 98146 47.5107 -122.362 \n", - "21594 0.0 2009 0.0 98144 47.5944 -122.299 \n", - "21595 0.0 2004 0.0 98027 47.5345 -122.069 \n", - "21596 0.0 2008 0.0 98144 47.5941 -122.299 \n", - "\n", - " sqft_living15 sqft_lot15 \n", - "0 1340 5650 \n", - "1 1690 7639 \n", - "2 2720 8062 \n", - "3 1360 5000 \n", - "4 1800 7503 \n", - "... ... ... \n", - "21592 1530 1509 \n", - "21593 1830 7200 \n", - "21594 1020 2007 \n", - "21595 1410 1287 \n", - "21596 1020 1357 \n", - "\n", - "[21597 rows x 21 columns]" + "source": [ + "load_data('data/kc_house_data.csv') # Assuming 'data' folder is in the same directory\n", + "\n", + "\n" ] - }, - "execution_count": 3, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "load_data('data/kc_house_data.csv') # Assuming 'data' folder is in the same directory\n", - "\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The dataset contains 21 columns, each representing a distinct feature, and 21,597 rows, with each row corresponding to a specific house sale entry.\n", - "\n", - "The dataset contains a mix of data types, including integers (int64), floating-point numbers (float64), and objects (strings). For instance, numerical features such as bedrooms, bathrooms, and sqft_living are represented as integers or floating-point numbers to facilitate mathematical computations, while categorical features like waterfront and view are stored as objects to accommodate text-based categories." - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ + }, { - "name": "stdout", - "output_type": "stream", - "text": [ - "The dataset contains 21597 houses with 21 features\n", - "\n", - "Columns and their data types:\n", - "id: int64\n", - "date: object\n", - "price: float64\n", - "bedrooms: int64\n", - "bathrooms: float64\n", - "sqft_living: int64\n", - "sqft_lot: int64\n", - "floors: float64\n", - "waterfront: object\n", - "view: object\n", - "condition: object\n", - "grade: object\n", - "sqft_above: int64\n", - "sqft_basement: object\n", - "yr_built: int64\n", - "yr_renovated: float64\n", - "zipcode: int64\n", - "lat: float64\n", - "long: float64\n", - "sqft_living15: int64\n", - "sqft_lot15: int64\n", - "\n" - ] - } - ], - "source": [ - "kings_data = load_data('data/kc_house_data.csv')" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [], - "source": [ - "#create a function that takes in a column and returns the column statistics as a dictionary\n", - "def descriptive_analytics(column):\n", - " stats_dict = column.describe().to_dict()\n", - " \n", - " print(\"Descriptive Statistics for Column '{}':\".format(column.name))\n", - " print(\"The count of the column is:\", stats_dict['count'])\n", - " print(\"The mean of the column is:\", stats_dict['mean'])\n", - " print(\"The standard deviation of the column is:\", stats_dict['std'])\n", - " print(\"The minimum value of the column is:\", stats_dict['min'])\n", - " print(\"The 25th percentile of the column is:\", stats_dict['25%'])\n", - " print(\"The median of the column is:\", stats_dict['50%'])\n", - " print(\"The 75th percentile of the column is:\", stats_dict['75%'])\n", - " print(\"The maximum value of the column is:\", stats_dict['max'])" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [ + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The dataset contains 21 columns, each representing a distinct feature, and 21,597 rows, with each row corresponding to a specific house sale entry.\n", + "\n", + "The dataset contains a mix of data types, including integers (int64), floating-point numbers (float64), and objects (strings). For instance, numerical features such as bedrooms, bathrooms, and sqft_living are represented as integers or floating-point numbers to facilitate mathematical computations, while categorical features like waterfront and view are stored as objects to accommodate text-based categories." + ] + }, { - "name": "stdout", - "output_type": "stream", - "text": [ - "Descriptive Statistics for Column 'price':\n", - "The count of the column is: 21597.0\n", - "The mean of the column is: 540296.5735055795\n", - "The standard deviation of the column is: 367368.1401013936\n", - "The minimum value of the column is: 78000.0\n", - "The 25th percentile of the column is: 322000.0\n", - "The median of the column is: 450000.0\n", - "The 75th percentile of the column is: 645000.0\n", - "The maximum value of the column is: 7700000.0\n" - ] - } - ], - "source": [ - "descriptive_analytics(kings_data['price'])" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can see that the maximum price of a house is 7700000 dollars and the minimum price is 78000 dollars\n", - "\n", - "There are 21597 prices regarding to the houses in the dataset\n", - "\n", - "Average price of a house is 540296.57 dollars" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Data Preperation\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [ + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The dataset contains 21597 houses with 21 features\n", + "\n", + "Columns and their data types:\n", + "id: int64\n", + "date: object\n", + "price: float64\n", + "bedrooms: int64\n", + "bathrooms: float64\n", + "sqft_living: int64\n", + "sqft_lot: int64\n", + "floors: float64\n", + "waterfront: object\n", + "view: object\n", + "condition: object\n", + "grade: object\n", + "sqft_above: int64\n", + "sqft_basement: object\n", + "yr_built: int64\n", + "yr_renovated: float64\n", + "zipcode: int64\n", + "lat: float64\n", + "long: float64\n", + "sqft_living15: int64\n", + "sqft_lot15: int64\n", + "\n" + ] + } + ], + "source": [ + "kings_data = load_data('data/kc_house_data.csv')" + ] + }, { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n", - "RangeIndex: 21597 entries, 0 to 21596\n", - "Data columns (total 21 columns):\n", - " # Column Non-Null Count Dtype \n", - "--- ------ -------------- ----- \n", - " 0 id 21597 non-null int64 \n", - " 1 date 21597 non-null object \n", - " 2 price 21597 non-null float64\n", - " 3 bedrooms 21597 non-null int64 \n", - " 4 bathrooms 21597 non-null float64\n", - " 5 sqft_living 21597 non-null int64 \n", - " 6 sqft_lot 21597 non-null int64 \n", - " 7 floors 21597 non-null float64\n", - " 8 waterfront 19221 non-null object \n", - " 9 view 21534 non-null object \n", - " 10 condition 21597 non-null object \n", - " 11 grade 21597 non-null object \n", - " 12 sqft_above 21597 non-null int64 \n", - " 13 sqft_basement 21597 non-null object \n", - " 14 yr_built 21597 non-null int64 \n", - " 15 yr_renovated 17755 non-null float64\n", - " 16 zipcode 21597 non-null int64 \n", - " 17 lat 21597 non-null float64\n", - " 18 long 21597 non-null float64\n", - " 19 sqft_living15 21597 non-null int64 \n", - " 20 sqft_lot15 21597 non-null int64 \n", - "dtypes: float64(6), int64(9), object(6)\n", - "memory usage: 3.5+ MB\n" - ] - } - ], - "source": [ - "kings_data.info()" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [], - "source": [ - "def identify_issues(dataset):\n", - " # Identify missing values as a percentage of the whole dataset\n", - " missing_values = (dataset.isnull().sum())/len(dataset) * 100\n", - "\n", - " # Identify duplicates\n", - " duplicates = dataset.duplicated().sum()\n", - " \n", - " #return a dictionary \n", - " return {'duplicates': duplicates,\n", - " 'missing values': missing_values.round(2)} \n" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [ + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "#create a function that takes in a column and returns the column statistics as a dictionary\n", + "def descriptive_analytics(column):\n", + " stats_dict = column.describe().to_dict()\n", + " \n", + " print(\"Descriptive Statistics for Column '{}':\".format(column.name))\n", + " print(\"The count of the column is:\", stats_dict['count'])\n", + " print(\"The mean of the column is:\", stats_dict['mean'])\n", + " print(\"The standard deviation of the column is:\", stats_dict['std'])\n", + " print(\"The minimum value of the column is:\", stats_dict['min'])\n", + " print(\"The 25th percentile of the column is:\", stats_dict['25%'])\n", + " print(\"The median of the column is:\", stats_dict['50%'])\n", + " print(\"The 75th percentile of the column is:\", stats_dict['75%'])\n", + " print(\"The maximum value of the column is:\", stats_dict['max'])" + ] + }, { - "data": { - "text/plain": [ - "{'duplicates': 0,\n", - " 'missing values': id 0.00\n", - " date 0.00\n", - " price 0.00\n", - " bedrooms 0.00\n", - " bathrooms 0.00\n", - " sqft_living 0.00\n", - " sqft_lot 0.00\n", - " floors 0.00\n", - " waterfront 11.00\n", - " view 0.29\n", - " condition 0.00\n", - " grade 0.00\n", - " sqft_above 0.00\n", - " sqft_basement 0.00\n", - " yr_built 0.00\n", - " yr_renovated 17.79\n", - " zipcode 0.00\n", - " lat 0.00\n", - " long 0.00\n", - " sqft_living15 0.00\n", - " sqft_lot15 0.00\n", - " dtype: float64}" + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Descriptive Statistics for Column 'price':\n", + "The count of the column is: 21597.0\n", + "The mean of the column is: 540296.5735055795\n", + "The standard deviation of the column is: 367368.1401013936\n", + "The minimum value of the column is: 78000.0\n", + "The 25th percentile of the column is: 322000.0\n", + "The median of the column is: 450000.0\n", + "The 75th percentile of the column is: 645000.0\n", + "The maximum value of the column is: 7700000.0\n" + ] + } + ], + "source": [ + "descriptive_analytics(kings_data['price'])" ] - }, - "execution_count": 9, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "identify_issues(kings_data)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The examination indicates that there are no duplicate entries within the dataset, ensuring the integrity of the records. However, attention is warranted to address missing values present in certain columns. Specifically, the 'waterfront' feature exhibits 11% of null values, representing a negligible portion of the dataset. Similarly, the 'yr_renovated' feature shows a relatively higher percentage of missing values, accounting for approximately 17.79% of the dataset" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "##### Before making changes make a copy instead of overwriting data" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [], - "source": [ - "house_data_clean = kings_data.copy()" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [], - "source": [ - "# Changing the date to date time\n", - "house_data_clean['date'] = pd.to_datetime(house_data_clean['date'])\n", - "\n", - "# Extracting only the year from the column Date\n", - "house_data_clean.date = house_data_clean['date'].dt.year\n", - "\n", - "# Changing the dates for the year built \n", - "house_data_clean['yr_built'] = pd.to_datetime(house_data_clean['yr_built'],format='%Y').dt.year\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The above code converts the 'date' column data to only contain the year the house was sold, for the purpose of analysis we will use only the year since the changes month by month will be minor." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### Dealing with the missing values" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [], - "source": [ - "def missing_values(dataset):\n", - " # drop the rows from views\n", - " dataset.dropna(subset=['view'],inplace=True)\n", - "\n", - " # Filling the NaN values for waterfront with NO\n", - " dataset.waterfront.fillna('NO',inplace=True)\n", - " \n", - " # Dropping the yr_renovated column \n", - " dataset.drop('yr_renovated',axis=1,inplace=True)" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [], - "source": [ - "missing_values(house_data_clean)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "'yr_renovated' has the highest percentage of NaN values 17%. This will be dropped since it will not be used within our model inline with the business problem.\n", - "\n", - "'Waterfront' feature has 11% null values, this was filled with NO on the assumption that these cells were not filled since they lacked waterfronts\n", - "\n", - "For the 'View' column, the null values were dropped by row since the overall percentage impact would be minute" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [ + }, { - "data": { - "text/plain": [ - "{'duplicates': 2,\n", - " 'missing values': id 0.0\n", - " date 0.0\n", - " price 0.0\n", - " bedrooms 0.0\n", - " bathrooms 0.0\n", - " sqft_living 0.0\n", - " sqft_lot 0.0\n", - " floors 0.0\n", - " waterfront 0.0\n", - " view 0.0\n", - " condition 0.0\n", - " grade 0.0\n", - " sqft_above 0.0\n", - " sqft_basement 0.0\n", - " yr_built 0.0\n", - " zipcode 0.0\n", - " lat 0.0\n", - " long 0.0\n", - " sqft_living15 0.0\n", - " sqft_lot15 0.0\n", - " dtype: float64}" + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We can see that the maximum price of a house is 7700000 dollars and the minimum price is 78000 dollars\n", + "\n", + "There are 21597 prices regarding to the houses in the dataset\n", + "\n", + "Average price of a house is 540296.57 dollars" ] - }, - "execution_count": 14, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "identify_issues(house_data_clean)" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "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", - "
iddatepricebedroomsbathroomssqft_livingsqft_lotfloorswaterfrontviewconditiongradesqft_abovesqft_basementyr_builtzipcodelatlongsqft_living15sqft_lot15
394718250690312014550000.041.75241084472.0NOGOODGood8 Good2060350.019369807447.6499-122.088252014789
2003886489001102014555000.032.50194032112.0NONONEAverage8 Good19400.020099802747.5644-122.09318803078
\n", - "
" + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Data Preperation\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "RangeIndex: 21597 entries, 0 to 21596\n", + "Data columns (total 21 columns):\n", + " # Column Non-Null Count Dtype \n", + "--- ------ -------------- ----- \n", + " 0 id 21597 non-null int64 \n", + " 1 date 21597 non-null object \n", + " 2 price 21597 non-null float64\n", + " 3 bedrooms 21597 non-null int64 \n", + " 4 bathrooms 21597 non-null float64\n", + " 5 sqft_living 21597 non-null int64 \n", + " 6 sqft_lot 21597 non-null int64 \n", + " 7 floors 21597 non-null float64\n", + " 8 waterfront 19221 non-null object \n", + " 9 view 21534 non-null object \n", + " 10 condition 21597 non-null object \n", + " 11 grade 21597 non-null object \n", + " 12 sqft_above 21597 non-null int64 \n", + " 13 sqft_basement 21597 non-null object \n", + " 14 yr_built 21597 non-null int64 \n", + " 15 yr_renovated 17755 non-null float64\n", + " 16 zipcode 21597 non-null int64 \n", + " 17 lat 21597 non-null float64\n", + " 18 long 21597 non-null float64\n", + " 19 sqft_living15 21597 non-null int64 \n", + " 20 sqft_lot15 21597 non-null int64 \n", + "dtypes: float64(6), int64(9), object(6)\n", + "memory usage: 3.5+ MB\n" + ] + } + ], + "source": [ + "kings_data.info()" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [], + "source": [ + "def identify_issues(dataset):\n", + " # Identify missing values as a percentage of the whole dataset\n", + " missing_values = (dataset.isnull().sum())/len(dataset) * 100\n", + "\n", + " # Identify duplicates\n", + " duplicates = dataset.duplicated().sum()\n", + " \n", + " #return a dictionary \n", + " return {'duplicates': duplicates,\n", + " 'missing values': missing_values.round(2)} \n" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'duplicates': 0,\n", + " 'missing values': id 0.00\n", + " date 0.00\n", + " price 0.00\n", + " bedrooms 0.00\n", + " bathrooms 0.00\n", + " sqft_living 0.00\n", + " sqft_lot 0.00\n", + " floors 0.00\n", + " waterfront 11.00\n", + " view 0.29\n", + " condition 0.00\n", + " grade 0.00\n", + " sqft_above 0.00\n", + " sqft_basement 0.00\n", + " yr_built 0.00\n", + " yr_renovated 17.79\n", + " zipcode 0.00\n", + " lat 0.00\n", + " long 0.00\n", + " sqft_living15 0.00\n", + " sqft_lot15 0.00\n", + " dtype: float64}" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } ], - "text/plain": [ - " id date price bedrooms bathrooms sqft_living sqft_lot \\\n", - "3947 1825069031 2014 550000.0 4 1.75 2410 8447 \n", - "20038 8648900110 2014 555000.0 3 2.50 1940 3211 \n", - "\n", - " floors waterfront view condition grade sqft_above sqft_basement \\\n", - "3947 2.0 NO GOOD Good 8 Good 2060 350.0 \n", - "20038 2.0 NO NONE Average 8 Good 1940 0.0 \n", - "\n", - " yr_built zipcode lat long sqft_living15 sqft_lot15 \n", - "3947 1936 98074 47.6499 -122.088 2520 14789 \n", - "20038 2009 98027 47.5644 -122.093 1880 3078 " + "source": [ + "identify_issues(kings_data)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The examination indicates that there are no duplicate entries within the dataset, ensuring the integrity of the records. However, attention is warranted to address missing values present in certain columns. Specifically, the 'waterfront' feature exhibits 11% of null values, representing a negligible portion of the dataset. Similarly, the 'yr_renovated' feature shows a relatively higher percentage of missing values, accounting for approximately 17.79% of the dataset" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "##### Before making changes make a copy instead of overwriting data" ] - }, - "execution_count": 15, - "metadata": {}, - "output_type": "execute_result" + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [], + "source": [ + "house_data_clean = kings_data.copy()" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [], + "source": [ + "# Changing the date to date time\n", + "house_data_clean['date'] = pd.to_datetime(house_data_clean['date'])\n", + "\n", + "# Extracting only the year from the column Date\n", + "house_data_clean.date = house_data_clean['date'].dt.year\n", + "\n", + "# Changing the dates for the year built \n", + "house_data_clean['yr_built'] = pd.to_datetime(house_data_clean['yr_built'],format='%Y').dt.year\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The above code converts the 'date' column data to only contain the year the house was sold, for the purpose of analysis we will use only the year since the changes month by month will be minor." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Dealing with the missing values" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [], + "source": [ + "def missing_values(dataset):\n", + " # drop the rows from views\n", + " dataset.dropna(subset=['view'],inplace=True)\n", + "\n", + " # Filling the NaN values for waterfront with NO\n", + " dataset.waterfront.fillna('NO',inplace=True)\n", + " \n", + " # Dropping the yr_renovated column \n", + " dataset.drop('yr_renovated',axis=1,inplace=True)" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [], + "source": [ + "missing_values(house_data_clean)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "'yr_renovated' has the highest percentage of NaN values 17%. This will be dropped since it will not be used within our model inline with the business problem.\n", + "\n", + "'Waterfront' feature has 11% null values, this was filled with NO on the assumption that these cells were not filled since they lacked waterfronts\n", + "\n", + "For the 'View' column, the null values were dropped by row since the overall percentage impact would be minute" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'duplicates': 2,\n", + " 'missing values': id 0.0\n", + " date 0.0\n", + " price 0.0\n", + " bedrooms 0.0\n", + " bathrooms 0.0\n", + " sqft_living 0.0\n", + " sqft_lot 0.0\n", + " floors 0.0\n", + " waterfront 0.0\n", + " view 0.0\n", + " condition 0.0\n", + " grade 0.0\n", + " sqft_above 0.0\n", + " sqft_basement 0.0\n", + " yr_built 0.0\n", + " zipcode 0.0\n", + " lat 0.0\n", + " long 0.0\n", + " sqft_living15 0.0\n", + " sqft_lot15 0.0\n", + " dtype: float64}" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "identify_issues(house_data_clean)" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "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", + "
iddatepricebedroomsbathroomssqft_livingsqft_lotfloorswaterfrontviewconditiongradesqft_abovesqft_basementyr_builtzipcodelatlongsqft_living15sqft_lot15
394718250690312014550000.041.75241084472.0NOGOODGood8 Good2060350.019369807447.6499-122.088252014789
2003886489001102014555000.032.50194032112.0NONONEAverage8 Good19400.020099802747.5644-122.09318803078
\n", + "
" + ], + "text/plain": [ + " id date price bedrooms bathrooms sqft_living sqft_lot \\\n", + "3947 1825069031 2014 550000.0 4 1.75 2410 8447 \n", + "20038 8648900110 2014 555000.0 3 2.50 1940 3211 \n", + "\n", + " floors waterfront view condition grade sqft_above sqft_basement \\\n", + "3947 2.0 NO GOOD Good 8 Good 2060 350.0 \n", + "20038 2.0 NO NONE Average 8 Good 1940 0.0 \n", + "\n", + " yr_built zipcode lat long sqft_living15 sqft_lot15 \n", + "3947 1936 98074 47.6499 -122.088 2520 14789 \n", + "20038 2009 98027 47.5644 -122.093 1880 3078 " + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "house_data_clean[house_data_clean.duplicated()]" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "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.10.13" } - ], - "source": [ - "house_data_clean[house_data_clean.duplicated()]" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "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.10.13" - } - }, - "nbformat": 4, - "nbformat_minor": 2 + "nbformat": 4, + "nbformat_minor": 2 } From b05f711c493aa16e95ed47e02c83d8d582ed1acc Mon Sep 17 00:00:00 2001 From: clydeochieng <107258512+clydeochieng@users.noreply.github.com> Date: Tue, 30 Apr 2024 23:56:31 +0300 Subject: [PATCH 24/42] Update student.ipynb --- student.ipynb | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/student.ipynb b/student.ipynb index 3d526e43..6e366080 100644 --- a/student.ipynb +++ b/student.ipynb @@ -6,8 +6,7 @@ "source": [ "## Final Project Submission\n", "\n", - "* Student name: Solphine Joseph, Grace Rotich, Mathew Kiprotich, Hilary Simiyu, Clyde Ochieng. \n", - "* Student name: Solphine Joseph, Grace Rotich, Mathew Kiprotich, Hilary Simiyu, Clyde Ochieng, Derrick Kiptoo.\n", + "* Student name: Solphine Joseph, Grace Rotich, Mathew Kiprotich, Hilary Simiyu, Clyde Ochieng.\n", "* Student pace: full time\n", "* Scheduled project review date/time: \n", "* Instructor name: Nikita \n", From 990054edf2f11aae7589f9f0b24f0079e57ea7e3 Mon Sep 17 00:00:00 2001 From: clydeochieng <107258512+clydeochieng@users.noreply.github.com> Date: Wed, 1 May 2024 10:18:15 +0300 Subject: [PATCH 25/42] Update student.ipynb --- student.ipynb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/student.ipynb b/student.ipynb index cea94b8e..bde1baf8 100644 --- a/student.ipynb +++ b/student.ipynb @@ -6,7 +6,7 @@ "source": [ "## Final Project Submission\n", "\n", - "* Student name: Solphine Joseph, Grace Rotich, Mathew Kiprotich, Hilary Simiyu, Clyde Ochieng. \n", + "* Student name: Solphine Joseph, Grace Rotich, Mathew Kiprotich, Hilary Simiyu, Clyde Ochieng, Derrick Kiptoo \n", "* Student pace: full time\n", "* Scheduled project review date/time: \n", "* Instructor name: Nikita \n", From 57e844e323b484dcd7257fad75cfa16dbc1972f1 Mon Sep 17 00:00:00 2001 From: clydeochieng <107258512+clydeochieng@users.noreply.github.com> Date: Wed, 1 May 2024 10:24:54 +0300 Subject: [PATCH 26/42] Update student.ipynb --- student.ipynb | 38 +++++++++++++++++++------------------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/student.ipynb b/student.ipynb index 6e366080..f8c41695 100644 --- a/student.ipynb +++ b/student.ipynb @@ -95,7 +95,7 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": 16, "metadata": {}, "outputs": [], "source": [ @@ -117,7 +117,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 17, "metadata": {}, "outputs": [], "source": [ @@ -142,7 +142,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 18, "metadata": {}, "outputs": [ { @@ -546,7 +546,7 @@ "[21597 rows x 21 columns]" ] }, - "execution_count": 3, + "execution_count": 18, "metadata": {}, "output_type": "execute_result" } @@ -568,7 +568,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 19, "metadata": {}, "outputs": [ { @@ -609,7 +609,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 20, "metadata": {}, "outputs": [], "source": [ @@ -630,7 +630,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 21, "metadata": {}, "outputs": [ { @@ -674,7 +674,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 22, "metadata": {}, "outputs": [ { @@ -718,7 +718,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 23, "metadata": {}, "outputs": [], "source": [ @@ -736,7 +736,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 24, "metadata": {}, "outputs": [ { @@ -767,7 +767,7 @@ " dtype: float64}" ] }, - "execution_count": 9, + "execution_count": 24, "metadata": {}, "output_type": "execute_result" } @@ -792,7 +792,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 25, "metadata": {}, "outputs": [], "source": [ @@ -801,7 +801,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 26, "metadata": {}, "outputs": [], "source": [ @@ -831,7 +831,7 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 27, "metadata": {}, "outputs": [], "source": [ @@ -848,7 +848,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 28, "metadata": {}, "outputs": [], "source": [ @@ -868,7 +868,7 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 29, "metadata": {}, "outputs": [ { @@ -898,7 +898,7 @@ " dtype: float64}" ] }, - "execution_count": 14, + "execution_count": 29, "metadata": {}, "output_type": "execute_result" } @@ -909,7 +909,7 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 30, "metadata": {}, "outputs": [ { @@ -1020,7 +1020,7 @@ "20038 2009 98027 47.5644 -122.093 1880 3078 " ] }, - "execution_count": 15, + "execution_count": 30, "metadata": {}, "output_type": "execute_result" } From aa1c14e5ff58f5b2840b8e60e2cf447ab8214c60 Mon Sep 17 00:00:00 2001 From: clydeochieng <107258512+clydeochieng@users.noreply.github.com> Date: Wed, 1 May 2024 10:34:20 +0300 Subject: [PATCH 27/42] Update student.ipynb --- student.ipynb | 138 +------------------------------------------------- 1 file changed, 1 insertion(+), 137 deletions(-) diff --git a/student.ipynb b/student.ipynb index 6fdc9263..27522862 100644 --- a/student.ipynb +++ b/student.ipynb @@ -6,148 +6,13 @@ "source": [ "## Final Project Submission\n", "\n", -Clyde - - "* Student name: Solphine Joseph, Grace Rotich, Mathew Kiprotich, Hilary Simiyu, Clyde Ochieng, Derrick Kiptoo \n", - main + "* Student name: Solphine Joseph, Grace Rotich, Mathew Kiprotich, Hilary Simiyu, Clyde Ochieng, Derrick Kiptoo. \n", "* Student pace: full time\n", "* Scheduled project review date/time: \n", "* Instructor name: Nikita \n", "* Blog post URL:\n" ] }, - Clyde - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Kings County Housing Analysis with Multiple Linear Regression" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Overview\n", - "\n", - "A real estate agency in Kingsway seeks to determine what are the contributing factors that affect the price of houses to make improvements where necessary. They want to employ an analytical approach rather than sentimental before arriving at a decision. Multilinear regression has been used for this project to understand how various features affect their pricing to better their services." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Business Problem\n", - "\n", - "In the face of market fluctuations and heightened competition within the real estate sector, our agency is grappling with pricing volatility, which poses significant challenges for our agents in devising effective business strategies. We seek strategic guidance to optimize our purchasing and selling endeavors, prioritizing informed decision-making to identify key areas of focus that promise maximum returns on investment." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Objectives\n", - "* To determine the key factors influencing house prices.\n", - "* To develop multilinear regression models to predict house prices based on relevant features.\n", - "* To use insights from the regression analysis to optimize pricing strategies for both purchasing and selling properties.\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Hypothesis\n", - "* Null Hypothesis - There is no relationship between our independent variables and our dependent variable \n", - "\n", - "* Alternative Hypothesis - There is a relationship between our independent variables and our dependent variable" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Data Understanding:\n", - "\n", - "In this project, we utilized the King County House Sales dataset, which serves as the foundational dataset for our analysis. It was sourced Kaggle.The dataset encompasses comprehensive information regarding house sales within King County, Washington, USA. It comprises a diverse array of features, including the number of bedrooms, bathrooms, square footage, as well as geographical and pricing details of the properties sold. This dataset is frequently employed in data science and machine learning endeavors, particularly for predictive modeling tasks such as regression analysis aimed at forecasting house prices based on the provided features." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "##### King County Housing Data Columns \n", - "\n", - "The column names contained in column_names.md are:\n", - "* `id`: A unique identifier for each house sale.\n", - "* `date`: The date when the house was sold.\n", - "* `price`: The sale price of the house, serving as the target variable for predictive modeling.\n", - "* `bedrooms`, `bathrooms`, `sqft_living`, `sqft_lot`: Numerical features representing the number of bedrooms and bathrooms, as well as the living area and lot area of the house, respectively.\n", - "* `floors`: The number of floors in the house.\n", - "* `waterfront`, `view`, `condition`, `grade`: Categorical features describing aspects such as waterfront availability, property view, condition, and overall grade assigned to the housing unit.\n", - "* `yr_built`, `yr_renovated`: Year of construction and renovation of the house.\n", - "* `zipcode`, `lat`, `long`: Geographical features including ZIP code, latitude, and longitude coordinates.\n", - "* `sqft_above`, `sqft_basement`, `sqft_living15`, `sqft_lot15`: Additional numerical features providing details about the house's above-ground and basement square footage, as well as living area and lot area of the nearest 15 neighboring houses." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Data Loading\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [], - "source": [ - "import matplotlib.pyplot as plt\n", - "%matplotlib inline\n", - "import numpy as np\n", - "import pandas as pd\n", - "import scipy.stats as stats\n", - "import seaborn as sns\n", - "import statsmodels.api as sm\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Loading Data" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [], - "source": [ - "# Creating a function that loads data and return it in a dataframe\n", - "def load_data(file_path):\n", - " house_data = pd.read_csv(file_path)\n", - "\n", - " #shape\n", - " shape = house_data.shape\n", - " print(f\"The dataset contains {shape[0]} houses with {shape[1]} features\")\n", - " print()\n", - " \n", - " #Data Types\n", - " data_types = house_data.dtypes\n", - " print(\"Columns and their data types:\")\n", - " for column, dtype in data_types.items():\n", - " print(f\"{column}: {dtype}\")\n", - " print()\n", - "\n", - " return house_data\n" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - { "cell_type": "markdown", "metadata": {}, @@ -256,7 +121,6 @@ Clyde { "cell_type": "code", "execution_count": 3, - main "metadata": {}, "outputs": [ { From cbb5de189d98ee4c56dc7720b876ef3fa82fabf4 Mon Sep 17 00:00:00 2001 From: clydeochieng <107258512+clydeochieng@users.noreply.github.com> Date: Wed, 1 May 2024 11:06:49 +0300 Subject: [PATCH 28/42] Update student.ipynb --- student.ipynb | 1118 ++++++++++++++++--------------------------------- 1 file changed, 352 insertions(+), 766 deletions(-) diff --git a/student.ipynb b/student.ipynb index 27522862..247e570c 100644 --- a/student.ipynb +++ b/student.ipynb @@ -342,6 +342,7 @@ " ...\n", " ...\n", " ...\n", + " ...\n", " \n", " \n", " 21592\n", @@ -425,7 +426,7 @@ " 1600\n", " 2388\n", " 2.0\n", - " NaN\n", + " NO\n", " NONE\n", " ...\n", " 8 Good\n", @@ -439,33 +440,9 @@ " 1410\n", " 1287\n", " \n", - " \n", - " 21596\n", - " 1523300157\n", - " 10/15/2014\n", - " 325000.0\n", - " 2\n", - " 0.75\n", - " 1020\n", - " 1076\n", - " 2.0\n", - " NO\n", - " NONE\n", - " ...\n", - " 7 Average\n", - " 1020\n", - " 0.0\n", - " 2008\n", - " 0.0\n", - " 98144\n", - " 47.5941\n", - " -122.299\n", - " 1020\n", - " 1357\n", - " \n", " \n", "\n", - "

21597 rows × 21 columns

\n", + "

21596 rows × 21 columns

\n", "" ], "text/plain": [ @@ -524,764 +501,373 @@ "[21597 rows x 21 columns]" ] }, -Clyde - "execution_count": 18, - - "execution_count": 3, - main + { + "cells": [ + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [], + "source": [ + "load_data('data/kc_house_data.csv') # Assuming 'data' folder is in the same directory\n", + "\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The dataset contains 21 columns, each representing a distinct feature, and 21,597 rows, with each row corresponding to a specific house sale entry.\n", + "\n", + "The dataset contains a mix of data types, including integers (int64), floating-point numbers (float64), and objects (strings). For instance, numerical features such as bedrooms, bathrooms, and sqft_living are represented as integers or floating-point numbers to facilitate mathematical computations, while categorical features like waterfront and view are stored as objects to accommodate text-based categories." + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The dataset contains 21597 houses with 21 features\n", + "\n", + "Columns and their data types:\n", + "id: int64\n", + "date: object\n", + "price: float64\n", + "bedrooms: int64\n", + "bathrooms: float64\n", + "sqft_living: int64\n", + "sqft_lot: int64\n", + "floors: float64\n", + "waterfront: object\n", + "view: object\n", + "condition: object\n", + "grade: object\n", + "sqft_above: int64\n", + "sqft_basement: object\n", + "yr_built: int64\n", + "yr_renovated: float64\n", + "zipcode: int64\n", + "lat: float64\n", + "long: float64\n", + "sqft_living15: int64\n", + "sqft_lot15: int64\n", + "\n" + ] + } + ], + "source": [ + "kings_data = load_data('data/kc_house_data.csv')" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": {}, + "outputs": [], + "source": [ + "# create a function that takes in a column and returns the column statistics as a dictionary\n", + "def descriptive_analytics(column):\n", + " stats_dict = column.describe().to_dict()\n", + " \n", + " print(\"Descriptive Statistics for Column '{}':\".format(column.name))\n", + " print(\"The count of the column is:\", stats_dict['count'])\n", + " print(\"The mean of the column is:\", stats_dict['mean'])\n", + " print(\"The standard deviation of the column is:\", stats_dict['std'])\n", + " print(\"The minimum value of the column is:\", stats_dict['min'])\n", + " print(\"The 25th percentile of the column is:\", stats_dict['25%'])\n", + " print(\"The median of the column is:\", stats_dict['50%'])\n", + " print(\"The 75th percentile of the column is:\", stats_dict['75%'])\n", + " print(\"The maximum value of the column is:\", stats_dict['max'])" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Descriptive Statistics for Column 'price':\n", + "The count of the column is: 21597.0\n", + "The mean of the column is: 540296.5735055795\n", + "The standard deviation of the column is: 367368.1401013936\n", + "The minimum value of the column is: 78000.0\n", + "The 25th percentile of the column is: 322000.0\n", + "The median of the column is: 450000.0\n", + "The 75th percentile of the column is: 645000.0\n", + "The maximum value of the column is: 7700000.0\n" + ] + } + ], + "source": [ + "descriptive_analytics(kings_data['price'])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We can see that the maximum price of a house is $7,700,000 and the minimum price is $78,000.\n", + "\n", + "There are 21,597 prices regarding the houses in the dataset.\n", + "\n", + "The average price of a house is $540,296.57." + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "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.1" + } + }, + "nbformat": 4, + "nbformat_minor": 5 + } + "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "load_data('data/kc_house_data.csv') # Assuming 'data' folder is in the same directory\n", - "\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The dataset contains 21 columns, each representing a distinct feature, and 21,597 rows, with each row corresponding to a specific house sale entry.\n", - "\n", - "The dataset contains a mix of data types, including integers (int64), floating-point numbers (float64), and objects (strings). For instance, numerical features such as bedrooms, bathrooms, and sqft_living are represented as integers or floating-point numbers to facilitate mathematical computations, while categorical features like waterfront and view are stored as objects to accommodate text-based categories." - ] - }, - { - "cell_type": "code", - Clyde - "execution_count": 19, - - "execution_count": 4, - main - "metadata": {}, - "outputs": [ + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "RangeIndex: 21597 entries, 0 to 21596\n", + "Data columns (total 21 columns):\n", + " # Column Non-Null Count Dtype \n", + "--- ------ -------------- ----- \n", + " 0 id 21597 non-null int64 \n", + " 1 date 21597 non-null object \n", + " 2 price 21597 non-null float64\n", + " 3 bedrooms 21597 non-null int64 \n", + " 4 bathrooms 21597 non-null float64\n", + " 5 sqft_living 21597 non-null int64 \n", + " 6 sqft_lot 21597 non-null int64 \n", + " 7 floors 21597 non-null float64\n", + " 8 waterfront 19221 non-null object \n", + " 9 view 21534 non-null object \n", + " 10 condition 21597 non-null object \n", + " 11 grade 21597 non-null object \n", + " 12 sqft_above 21597 non-null int64 \n", + " 13 sqft_basement 21597 non-null object \n", + " 14 yr_built 21597 non-null int64 \n", + " 15 yr_renovated 17755 non-null float64\n", + " 16 zipcode 21597 non-null int64 \n", + " 17 lat 21597 non-null float64\n", + " 18 long 21597 non-null float64\n", + " 19 sqft_living15 21597 non-null int64 \n", + " 20 sqft_lot15 21597 non-null int64 \n", + "dtypes: float64(6), int64(9), object(6)\n", + "memory usage: 3.5+ MB\n" + ] + } + ], + "source": [ + "kings_data.info()" + ] + }, { - "name": "stdout", - "output_type": "stream", - "text": [ - "The dataset contains 21597 houses with 21 features\n", + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "def identify_issues(dataset):\n", + " # Identify missing values as a percentage of the whole dataset\n", + " missing_values = (dataset.isnull().sum())/len(dataset) * 100\n", "\n", - "Columns and their data types:\n", - "id: int64\n", - "date: object\n", - "price: float64\n", - "bedrooms: int64\n", - "bathrooms: float64\n", - "sqft_living: int64\n", - "sqft_lot: int64\n", - "floors: float64\n", - "waterfront: object\n", - "view: object\n", - "condition: object\n", - "grade: object\n", - "sqft_above: int64\n", - "sqft_basement: object\n", - "yr_built: int64\n", - "yr_renovated: float64\n", - "zipcode: int64\n", - "lat: float64\n", - "long: float64\n", - "sqft_living15: int64\n", - "sqft_lot15: int64\n", - "\n" + " # Identify duplicates\n", + " duplicates = dataset.duplicated().sum()\n", + " \n", + " #return a dictionary \n", + " return {'duplicates': duplicates,\n", + " 'missing values': missing_values.round(2)} \n" ] - } - ], - "source": [ - "kings_data = load_data('data/kc_house_data.csv')" - ] - }, - { - "cell_type": "code", - Clyde - "execution_count": 20, - - "execution_count": 5, - main - "metadata": {}, - "outputs": [], - "source": [ - "#create a function that takes in a column and returns the column statistics as a dictionary\n", - "def descriptive_analytics(column):\n", - " stats_dict = column.describe().to_dict()\n", - " \n", - " print(\"Descriptive Statistics for Column '{}':\".format(column.name))\n", - " print(\"The count of the column is:\", stats_dict['count'])\n", - " print(\"The mean of the column is:\", stats_dict['mean'])\n", - " print(\"The standard deviation of the column is:\", stats_dict['std'])\n", - " print(\"The minimum value of the column is:\", stats_dict['min'])\n", - " print(\"The 25th percentile of the column is:\", stats_dict['25%'])\n", - " print(\"The median of the column is:\", stats_dict['50%'])\n", - " print(\"The 75th percentile of the column is:\", stats_dict['75%'])\n", - " print(\"The maximum value of the column is:\", stats_dict['max'])" - ] - }, - Clyde - { - "cell_type": "code", - "execution_count": 21, - "metadata": {}, - "outputs": [ + }, { - "name": "stdout", - "output_type": "stream", - "text": [ - "Descriptive Statistics for Column 'price':\n", - "The count of the column is: 21597.0\n", - "The mean of the column is: 540296.5735055795\n", - "The standard deviation of the column is: 367368.1401013936\n", - "The minimum value of the column is: 78000.0\n", - "The 25th percentile of the column is: 322000.0\n", - "The median of the column is: 450000.0\n", - "The 75th percentile of the column is: 645000.0\n", - "The maximum value of the column is: 7700000.0\n" + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'duplicates': 0,\n", + " 'missing values': id 0.00\n", + " date 0.00\n", + " price 0.00\n", + " bedrooms 0.00\n", + " bathrooms 0.00\n", + " sqft_living 0.00\n", + " sqft_lot 0.00\n", + " floors 0.00\n", + " waterfront 11.00\n", + " view 0.29\n", + " condition 0.00\n", + " grade 0.00\n", + " sqft_above 0.00\n", + " sqft_basement 0.00\n", + " yr_built 0.00\n", + " yr_renovated 17.79\n", + " zipcode 0.00\n", + " lat 0.00\n", + " long 0.00\n", + " sqft_living15 0.00\n", + " sqft_lot15 0.00\n", + " dtype: float64}" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "identify_issues(kings_data)" ] - } - ], - "source": [ - "descriptive_analytics(kings_data['price'])" - - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [ + }, { - "name": "stdout", - "output_type": "stream", - "text": [ - "Descriptive Statistics for Column 'price':\n", - "The count of the column is: 21597.0\n", - "The mean of the column is: 540296.5735055795\n", - "The standard deviation of the column is: 367368.1401013936\n", - "The minimum value of the column is: 78000.0\n", - "The 25th percentile of the column is: 322000.0\n", - "The median of the column is: 450000.0\n", - "The 75th percentile of the column is: 645000.0\n", - "The maximum value of the column is: 7700000.0\n" + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "house_data_clean = kings_data.copy()" ] - } - ], - "source": [ - "descriptive_analytics(kings_data['price'])" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can see that the maximum price of a house is 7700000 dollars and the minimum price is 78000 dollars\n", - "\n", - "There are 21597 prices regarding to the houses in the dataset\n", - "\n", - "Average price of a house is 540296.57 dollars" - main - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - Clyde - "We can see that the maximum price of a house is 7700000 dollars and the minimum price is 78000 dollars\n", - "\n", - "There are 21597 prices regarding to the houses in the dataset\n", - "\n", - "Average price of a house is 540296.57 dollars" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Data Preperation\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": 22, - - "## Data Preperation\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - main - "metadata": {}, - "outputs": [ + }, { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n", - "RangeIndex: 21597 entries, 0 to 21596\n", - "Data columns (total 21 columns):\n", - " # Column Non-Null Count Dtype \n", - "--- ------ -------------- ----- \n", - " 0 id 21597 non-null int64 \n", - " 1 date 21597 non-null object \n", - " 2 price 21597 non-null float64\n", - " 3 bedrooms 21597 non-null int64 \n", - " 4 bathrooms 21597 non-null float64\n", - " 5 sqft_living 21597 non-null int64 \n", - " 6 sqft_lot 21597 non-null int64 \n", - " 7 floors 21597 non-null float64\n", - " 8 waterfront 19221 non-null object \n", - " 9 view 21534 non-null object \n", - " 10 condition 21597 non-null object \n", - " 11 grade 21597 non-null object \n", - " 12 sqft_above 21597 non-null int64 \n", - " 13 sqft_basement 21597 non-null object \n", - " 14 yr_built 21597 non-null int64 \n", - " 15 yr_renovated 17755 non-null float64\n", - " 16 zipcode 21597 non-null int64 \n", - " 17 lat 21597 non-null float64\n", - " 18 long 21597 non-null float64\n", - " 19 sqft_living15 21597 non-null int64 \n", - " 20 sqft_lot15 21597 non-null int64 \n", - "dtypes: float64(6), int64(9), object(6)\n", - "memory usage: 3.5+ MB\n" + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "# Changing the date to date time\n", + "house_data_clean['date'] = pd.to_datetime(house_data_clean['date'])\n", + "\n", + "# Extracting only the year from the column Date\n", + "house_data_clean.date = house_data_clean['date'].dt.year\n", + "\n", + "# Changing the dates for the year built \n", + "house_data_clean['yr_built'] = pd.to_datetime(house_data_clean['yr_built'],format='%Y').dt.year\n" ] - } - ], - "source": [ - "kings_data.info()" - ] - }, - Clyde - { - "cell_type": "code", - "execution_count": 23, - "metadata": {}, - "outputs": [], - "source": [ - "def identify_issues(dataset):\n", - " # Identify missing values as a percentage of the whole dataset\n", - " missing_values = (dataset.isnull().sum())/len(dataset) * 100\n", - "\n", - " # Identify duplicates\n", - " duplicates = dataset.duplicated().sum()\n", - " \n", - " #return a dictionary \n", - " return {'duplicates': duplicates,\n", - " 'missing values': missing_values.round(2)} \n" - - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [], - "source": [ - "def identify_issues(dataset):\n", - " # Identify missing values as a percentage of the whole dataset\n", - " missing_values = (dataset.isnull().sum())/len(dataset) * 100\n", - "\n", - " # Identify duplicates\n", - " duplicates = dataset.duplicated().sum()\n", - " \n", - " #return a dictionary \n", - " return {'duplicates': duplicates,\n", - " 'missing values': missing_values.round(2)} \n" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [ + }, { - "data": { - "text/plain": [ - "{'duplicates': 0,\n", - " 'missing values': id 0.00\n", - " date 0.00\n", - " price 0.00\n", - " bedrooms 0.00\n", - " bathrooms 0.00\n", - " sqft_living 0.00\n", - " sqft_lot 0.00\n", - " floors 0.00\n", - " waterfront 11.00\n", - " view 0.29\n", - " condition 0.00\n", - " grade 0.00\n", - " sqft_above 0.00\n", - " sqft_basement 0.00\n", - " yr_built 0.00\n", - " yr_renovated 17.79\n", - " zipcode 0.00\n", - " lat 0.00\n", - " long 0.00\n", - " sqft_living15 0.00\n", - " sqft_lot15 0.00\n", - " dtype: float64}" - ] - }, - "execution_count": 9, + "cell_type": "code", + "execution_count": 6, "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "identify_issues(kings_data)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The examination indicates that there are no duplicate entries within the dataset, ensuring the integrity of the records. However, attention is warranted to address missing values present in certain columns. Specifically, the 'waterfront' feature exhibits 11% of null values, representing a negligible portion of the dataset. Similarly, the 'yr_renovated' feature shows a relatively higher percentage of missing values, accounting for approximately 17.79% of the dataset" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "##### Before making changes make a copy instead of overwriting data" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [], - "source": [ - "house_data_clean = kings_data.copy()" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [], - "source": [ - "# Changing the date to date time\n", - "house_data_clean['date'] = pd.to_datetime(house_data_clean['date'])\n", - "\n", - "# Extracting only the year from the column Date\n", - "house_data_clean.date = house_data_clean['date'].dt.year\n", - "\n", - "# Changing the dates for the year built \n", - "house_data_clean['yr_built'] = pd.to_datetime(house_data_clean['yr_built'],format='%Y').dt.year\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The above code converts the 'date' column data to only contain the year the house was sold, for the purpose of analysis we will use only the year since the changes month by month will be minor." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### Dealing with the missing values" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [], - "source": [ - "def missing_values(dataset):\n", - " # drop the rows from views\n", - " dataset.dropna(subset=['view'],inplace=True)\n", - "\n", - " # Filling the NaN values for waterfront with NO\n", - " dataset.waterfront.fillna('NO',inplace=True)\n", - " \n", - " # Dropping the yr_renovated column \n", - " dataset.drop('yr_renovated',axis=1,inplace=True)" - main - ] - }, - { - "cell_type": "code", - Clyde - "execution_count": 24, - - "execution_count": 13, - "metadata": {}, - "outputs": [], - "source": [ - "missing_values(house_data_clean)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "'yr_renovated' has the highest percentage of NaN values 17%. This will be dropped since it will not be used within our model inline with the business problem.\n", - "\n", - "'Waterfront' feature has 11% null values, this was filled with NO on the assumption that these cells were not filled since they lacked waterfronts\n", - "\n", - "For the 'View' column, the null values were dropped by row since the overall percentage impact would be minute" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - main - "metadata": {}, - "outputs": [ + "outputs": [], + "source": [ + "def missing_values(dataset):\n", + " # drop the rows from views\n", + " dataset.dropna(subset=['view'],inplace=True)\n", + "\n", + " # Filling the NaN values for waterfront with NO\n", + " dataset.waterfront.fillna('NO',inplace=True)\n", + " \n", + " # Dropping the yr_renovated column \n", + " dataset.drop('yr_renovated',axis=1,inplace=True)" + ] + }, { - "data": { - "text/plain": [ - Clyde - "{'duplicates': 0,\n", - " 'missing values': id 0.00\n", - " date 0.00\n", - " price 0.00\n", - " bedrooms 0.00\n", - " bathrooms 0.00\n", - " sqft_living 0.00\n", - " sqft_lot 0.00\n", - " floors 0.00\n", - " waterfront 11.00\n", - " view 0.29\n", - " condition 0.00\n", - " grade 0.00\n", - " sqft_above 0.00\n", - " sqft_basement 0.00\n", - " yr_built 0.00\n", - " yr_renovated 17.79\n", - " zipcode 0.00\n", - " lat 0.00\n", - " long 0.00\n", - " sqft_living15 0.00\n", - " sqft_lot15 0.00\n", - " dtype: float64}" - ] - }, - "execution_count": 24, - - "{'duplicates': 2,\n", - " 'missing values': id 0.0\n", - " date 0.0\n", - " price 0.0\n", - " bedrooms 0.0\n", - " bathrooms 0.0\n", - " sqft_living 0.0\n", - " sqft_lot 0.0\n", - " floors 0.0\n", - " waterfront 0.0\n", - " view 0.0\n", - " condition 0.0\n", - " grade 0.0\n", - " sqft_above 0.0\n", - " sqft_basement 0.0\n", - " yr_built 0.0\n", - " zipcode 0.0\n", - " lat 0.0\n", - " long 0.0\n", - " sqft_living15 0.0\n", - " sqft_lot15 0.0\n", - " dtype: float64}" - ] - }, - "execution_count": 14, - main + "cell_type": "code", + "execution_count": 7, "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - Clyde - "identify_issues(kings_data)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The examination indicates that there are no duplicate entries within the dataset, ensuring the integrity of the records. However, attention is warranted to address missing values present in certain columns. Specifically, the 'waterfront' feature exhibits 11% of null values, representing a negligible portion of the dataset. Similarly, the 'yr_renovated' feature shows a relatively higher percentage of missing values, accounting for approximately 17.79% of the dataset" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "##### Before making changes make a copy instead of overwriting data" - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "metadata": {}, - "outputs": [], - "source": [ - "house_data_clean = kings_data.copy()" - ] - }, - { - "cell_type": "code", - "execution_count": 26, - "metadata": {}, - "outputs": [], - "source": [ - "# Changing the date to date time\n", - "house_data_clean['date'] = pd.to_datetime(house_data_clean['date'])\n", - "\n", - "# Extracting only the year from the column Date\n", - "house_data_clean.date = house_data_clean['date'].dt.year\n", - "\n", - "# Changing the dates for the year built \n", - "house_data_clean['yr_built'] = pd.to_datetime(house_data_clean['yr_built'],format='%Y').dt.year\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The above code converts the 'date' column data to only contain the year the house was sold, for the purpose of analysis we will use only the year since the changes month by month will be minor." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### Dealing with the missing values" - ] - }, - { - "cell_type": "code", - "execution_count": 27, - "metadata": {}, - "outputs": [], - "source": [ - "def missing_values(dataset):\n", - " # drop the rows from views\n", - " dataset.dropna(subset=['view'],inplace=True)\n", - "\n", - " # Filling the NaN values for waterfront with NO\n", - " dataset.waterfront.fillna('NO',inplace=True)\n", - " \n", - " # Dropping the yr_renovated column \n", - " dataset.drop('yr_renovated',axis=1,inplace=True)" - ] - }, - { - "cell_type": "code", - "execution_count": 28, - "metadata": {}, - "outputs": [], - "source": [ - "missing_values(house_data_clean)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "'yr_renovated' has the highest percentage of NaN values 17%. This will be dropped since it will not be used within our model inline with the business problem.\n", - "\n", - "'Waterfront' feature has 11% null values, this was filled with NO on the assumption that these cells were not filled since they lacked waterfronts\n", - "\n", - "For the 'View' column, the null values were dropped by row since the overall percentage impact would be minute" - ] - }, - { - "cell_type": "code", - "execution_count": 29, - "metadata": {}, - "outputs": [ + "outputs": [], + "source": [ + "missing_values(house_data_clean)" + ] + }, { - "data": { - "text/plain": [ - "{'duplicates': 2,\n", - " 'missing values': id 0.0\n", - " date 0.0\n", - " price 0.0\n", - " bedrooms 0.0\n", - " bathrooms 0.0\n", - " sqft_living 0.0\n", - " sqft_lot 0.0\n", - " floors 0.0\n", - " waterfront 0.0\n", - " view 0.0\n", - " condition 0.0\n", - " grade 0.0\n", - " sqft_above 0.0\n", - " sqft_basement 0.0\n", - " yr_built 0.0\n", - " zipcode 0.0\n", - " lat 0.0\n", - " long 0.0\n", - " sqft_living15 0.0\n", - " sqft_lot15 0.0\n", - " dtype: float64}" - ] - }, - "execution_count": 29, + "cell_type": "code", + "execution_count": 8, "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "identify_issues(house_data_clean)" - ] - }, - { - "cell_type": "code", - "execution_count": 30, - - "identify_issues(house_data_clean)" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - main - "metadata": {}, - "outputs": [ + "outputs": [ + { + "data": { + "text/plain": [ + "{'duplicates': 0,\n", + " 'missing values': id 0.00\n", + " date 0.00\n", + " price 0.00\n", + " bedrooms 0.00\n", + " bathrooms 0.00\n", + " sqft_living 0.00\n", + " sqft_lot 0.00\n", + " floors 0.00\n", + " waterfront 0.00\n", + " view 0.00\n", + " condition 0.00\n", + " grade 0.00\n", + " sqft_above 0.00\n", + " sqft_basement 0.00\n", + " yr_built 0.00\n", + " zipcode 0.00\n", + " lat 0.00\n", + " long 0.00\n", + " sqft_living15 0.00\n", + " sqft_lot15 0.00\n", + " dtype: float64}" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "identify_issues(house_data_clean)" + ] + }, { - "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", - "
iddatepricebedroomsbathroomssqft_livingsqft_lotfloorswaterfrontviewconditiongradesqft_abovesqft_basementyr_builtzipcodelatlongsqft_living15sqft_lot15
394718250690312014550000.041.75241084472.0NOGOODGood8 Good2060350.019369807447.6499-122.088252014789
2003886489001102014555000.032.50194032112.0NONONEAverage8 Good19400.020099802747.5644-122.09318803078
\n", - "
" - ], - "text/plain": [ - " id date price bedrooms bathrooms sqft_living sqft_lot \\\n", - "3947 1825069031 2014 550000.0 4 1.75 2410 8447 \n", - "20038 8648900110 2014 555000.0 3 2.50 1940 3211 \n", - "\n", - " floors waterfront view condition grade sqft_above sqft_basement \\\n", - "3947 2.0 NO GOOD Good 8 Good 2060 350.0 \n", - "20038 2.0 NO NONE Average 8 Good 1940 0.0 \n", - "\n", - " yr_built zipcode lat long sqft_living15 sqft_lot15 \n", - "3947 1936 98074 47.6499 -122.088 2520 14789 \n", - "20038 2009 98027 47.5644 -122.093 1880 3078 " - ] - }, - Clyde - "execution_count": 30, - - "execution_count": 15, - main + "cell_type": "code", + "execution_count": 9, "metadata": {}, - "output_type": "execute_result" + "outputs": [], + "source": [ + "# Checking for duplicates in the dataset\n", + "house_data_clean[house_data_clean.duplicated()]" + ] } ], - "source": [ - "house_data_clean[house_data_clean.duplicated()]" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "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.8.11" + } }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.10.13" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} + "nbformat": 4, + "nbformat_minor": 5 + } \ No newline at end of file From 90359262269e6daaee8bbcd4a12e41f0a9f9a634 Mon Sep 17 00:00:00 2001 From: clydeochieng <107258512+clydeochieng@users.noreply.github.com> Date: Wed, 1 May 2024 11:09:22 +0300 Subject: [PATCH 29/42] Update student.ipynb --- student.ipynb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/student.ipynb b/student.ipynb index 247e570c..40941025 100644 --- a/student.ipynb +++ b/student.ipynb @@ -501,7 +501,7 @@ "[21597 rows x 21 columns]" ] }, - { + "cells": [ { "cell_type": "code", From da626e5a98ef9ce6374de659e6f8b27748dc2cd0 Mon Sep 17 00:00:00 2001 From: clydeochieng <107258512+clydeochieng@users.noreply.github.com> Date: Wed, 1 May 2024 11:13:05 +0300 Subject: [PATCH 30/42] Update student.ipynb --- student.ipynb | 451 +++++++++++++++++++++++++------------------------- 1 file changed, 229 insertions(+), 222 deletions(-) diff --git a/student.ipynb b/student.ipynb index 40941025..ab38df0d 100644 --- a/student.ipynb +++ b/student.ipynb @@ -645,229 +645,236 @@ "nbformat_minor": 5 } - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n", - "RangeIndex: 21597 entries, 0 to 21596\n", - "Data columns (total 21 columns):\n", - " # Column Non-Null Count Dtype \n", - "--- ------ -------------- ----- \n", - " 0 id 21597 non-null int64 \n", - " 1 date 21597 non-null object \n", - " 2 price 21597 non-null float64\n", - " 3 bedrooms 21597 non-null int64 \n", - " 4 bathrooms 21597 non-null float64\n", - " 5 sqft_living 21597 non-null int64 \n", - " 6 sqft_lot 21597 non-null int64 \n", - " 7 floors 21597 non-null float64\n", - " 8 waterfront 19221 non-null object \n", - " 9 view 21534 non-null object \n", - " 10 condition 21597 non-null object \n", - " 11 grade 21597 non-null object \n", - " 12 sqft_above 21597 non-null int64 \n", - " 13 sqft_basement 21597 non-null object \n", - " 14 yr_built 21597 non-null int64 \n", - " 15 yr_renovated 17755 non-null float64\n", - " 16 zipcode 21597 non-null int64 \n", - " 17 lat 21597 non-null float64\n", - " 18 long 21597 non-null float64\n", - " 19 sqft_living15 21597 non-null int64 \n", - " 20 sqft_lot15 21597 non-null int64 \n", - "dtypes: float64(6), int64(9), object(6)\n", - "memory usage: 3.5+ MB\n" - ] - } - ], - "source": [ - "kings_data.info()" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "def identify_issues(dataset):\n", - " # Identify missing values as a percentage of the whole dataset\n", - " missing_values = (dataset.isnull().sum())/len(dataset) * 100\n", - "\n", - " # Identify duplicates\n", - " duplicates = dataset.duplicated().sum()\n", - " \n", - " #return a dictionary \n", - " return {'duplicates': duplicates,\n", - " 'missing values': missing_values.round(2)} \n" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'duplicates': 0,\n", - " 'missing values': id 0.00\n", - " date 0.00\n", - " price 0.00\n", - " bedrooms 0.00\n", - " bathrooms 0.00\n", - " sqft_living 0.00\n", - " sqft_lot 0.00\n", - " floors 0.00\n", - " waterfront 11.00\n", - " view 0.29\n", - " condition 0.00\n", - " grade 0.00\n", - " sqft_above 0.00\n", - " sqft_basement 0.00\n", - " yr_built 0.00\n", - " yr_renovated 17.79\n", - " zipcode 0.00\n", - " lat 0.00\n", - " long 0.00\n", - " sqft_living15 0.00\n", - " sqft_lot15 0.00\n", - " dtype: float64}" + { + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "RangeIndex: 21597 entries, 0 to 21596\n", + "Data columns (total 21 columns):\n", + " # Column Non-Null Count Dtype \n", + "--- ------ -------------- ----- \n", + " 0 id 21597 non-null int64 \n", + " 1 date 21597 non-null object \n", + " 2 price 21597 non-null float64\n", + " 3 bedrooms 21597 non-null int64 \n", + " 4 bathrooms 21597 non-null float64\n", + " 5 sqft_living 21597 non-null int64 \n", + " 6 sqft_lot 21597 non-null int64 \n", + " 7 floors 21597 non-null float64\n", + " 8 waterfront 19221 non-null object \n", + " 9 view 21534 non-null object \n", + " 10 condition 21597 non-null object \n", + " 11 grade 21597 non-null object \n", + " 12 sqft_above 21597 non-null int64 \n", + " 13 sqft_basement 21597 non-null object \n", + " 14 yr_built 21597 non-null int64 \n", + " 15 yr_renovated 17755 non-null float64\n", + " 16 zipcode 21597 non-null int64 \n", + " 17 lat 21597 non-null float64\n", + " 18 long 21597 non-null float64\n", + " 19 sqft_living15 21597 non-null int64 \n", + " 20 sqft_lot15 21597 non-null int64 \n", + "dtypes: float64(6), int64(9), object(6)\n", + "memory usage: 3.5+ MB\n" + ] + } + ], + "source": [ + "kings_data.info()" ] }, - "execution_count": 3, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "identify_issues(kings_data)" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [], - "source": [ - "house_data_clean = kings_data.copy()" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [], - "source": [ - "# Changing the date to date time\n", - "house_data_clean['date'] = pd.to_datetime(house_data_clean['date'])\n", - "\n", - "# Extracting only the year from the column Date\n", - "house_data_clean.date = house_data_clean['date'].dt.year\n", - "\n", - "# Changing the dates for the year built \n", - "house_data_clean['yr_built'] = pd.to_datetime(house_data_clean['yr_built'],format='%Y').dt.year\n" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [], - "source": [ - "def missing_values(dataset):\n", - " # drop the rows from views\n", - " dataset.dropna(subset=['view'],inplace=True)\n", - "\n", - " # Filling the NaN values for waterfront with NO\n", - " dataset.waterfront.fillna('NO',inplace=True)\n", - " \n", - " # Dropping the yr_renovated column \n", - " dataset.drop('yr_renovated',axis=1,inplace=True)" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [], - "source": [ - "missing_values(house_data_clean)" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'duplicates': 0,\n", - " 'missing values': id 0.00\n", - " date 0.00\n", - " price 0.00\n", - " bedrooms 0.00\n", - " bathrooms 0.00\n", - " sqft_living 0.00\n", - " sqft_lot 0.00\n", - " floors 0.00\n", - " waterfront 0.00\n", - " view 0.00\n", - " condition 0.00\n", - " grade 0.00\n", - " sqft_above 0.00\n", - " sqft_basement 0.00\n", - " yr_built 0.00\n", - " zipcode 0.00\n", - " lat 0.00\n", - " long 0.00\n", - " sqft_living15 0.00\n", - " sqft_lot15 0.00\n", - " dtype: float64}" + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "def identify_issues(dataset):\n", + " # Identify missing values as a percentage of the whole dataset\n", + " missing_values = (dataset.isnull().sum())/len(dataset) * 100\n", + "\n", + " # Identify duplicates\n", + " duplicates = dataset.duplicated().sum()\n", + " \n", + " #return a dictionary \n", + " return {'duplicates': duplicates,\n", + " 'missing values': missing_values.round(2)} \n" ] }, - "execution_count": 8, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "identify_issues(house_data_clean)" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [], - "source": [ - "# Checking for duplicates in the dataset\n", - "house_data_clean[house_data_clean.duplicated()]" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "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.8.11" - } - }, - "nbformat": 4, - "nbformat_minor": 5 - } \ No newline at end of file + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'duplicates': 0,\n", + " 'missing values': {\n", + " 'id': 0.0,\n", + " 'date': 0.0,\n", + " 'price': 0.0,\n", + " 'bedrooms': 0.0,\n", + " 'bathrooms': 0.0,\n", + " 'sqft_living': 0.0,\n", + " 'sqft_lot': 0.0,\n", + " 'floors': 0.0,\n", + " 'waterfront': 11.0,\n", + " 'view': 0.29,\n", + " 'condition': 0.0,\n", + " 'grade': 0.0,\n", + " 'sqft_above': 0.0,\n", + " 'sqft_basement': 0.0,\n", + " 'yr_built': 0.0,\n", + " 'yr_renovated': 17.79,\n", + " 'zipcode': 0.0,\n", + " 'lat': 0.0,\n", + " 'long': 0.0,\n", + " 'sqft_living15': 0.0,\n", + " 'sqft_lot15': 0.0\n", + " }}" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "identify_issues(kings_data)" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "house_data_clean = kings_data.copy()" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "# Changing the date to date time\n", + "house_data_clean['date'] = pd.to_datetime(house_data_clean['date'])\n", + "\n", + "# Extracting only the year from the column Date\n", + "house_data_clean.date = house_data_clean['date'].dt.year\n", + "\n", + "# Changing the dates for the year built \n", + "house_data_clean['yr_built'] = pd.to_datetime(house_data_clean['yr_built'],format='%Y').dt.year\n" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "def missing_values(dataset):\n", + " # drop the rows from views\n", + " dataset.dropna(subset=['view'],inplace=True)\n", + "\n", + " # Filling the NaN values for waterfront with NO\n", + " dataset.waterfront.fillna('NO',inplace=True)\n", + " \n", + " # Dropping the yr_renovated column \n", + " dataset.drop('yr_renovated',axis=1,inplace=True)" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [], + "source": [ + "missing_values(house_data_clean)" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'duplicates': 0,\n", + " 'missing values': id 0.00\n", + " date 0.00\n", + " price 0.00\n", + " bedrooms 0.00\n", + " bathrooms 0.00\n", + " sqft_living 0.00\n", + " sqft_lot 0.00\n", + " floors 0.00\n", + " waterfront 0.00\n", + " view 0.00\n", + " condition 0.00\n", + " grade 0.00\n", + " sqft_above 0.00\n", + " sqft_basement 0.00\n", + " yr_built 0.00\n", + " zipcode 0.00\n", + " lat 0.00\n", + " long 0.00\n", + " sqft_living15 0.00\n", + " sqft_lot15 0.00\n", + " dtype: float64}" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "identify_issues(house_data_clean)" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [], + "source": [ + "# Checking for duplicates in the dataset\n", + "house_data_clean[house_data_clean.duplicated()]" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "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.8.11" + } + }, + "nbformat": 4, + "nbformat_minor": 5 + } + \ No newline at end of file From 48e99978650e729af9d4901d484b9c7babe585fb Mon Sep 17 00:00:00 2001 From: clydeochieng <107258512+clydeochieng@users.noreply.github.com> Date: Wed, 1 May 2024 11:14:21 +0300 Subject: [PATCH 31/42] Update student.ipynb --- student.ipynb | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/student.ipynb b/student.ipynb index ab38df0d..b8e4f974 100644 --- a/student.ipynb +++ b/student.ipynb @@ -644,8 +644,7 @@ "nbformat": 4, "nbformat_minor": 5 } - - { + { "cells": [ { "cell_type": "code", From 571eda3d3a01ed7d6f054fcc00212bce4d186755 Mon Sep 17 00:00:00 2001 From: clydeochieng <107258512+clydeochieng@users.noreply.github.com> Date: Wed, 1 May 2024 11:30:59 +0300 Subject: [PATCH 32/42] Update student.ipynb --- student.ipynb | 666 ++++++++++++++++++++++++-------------------------- 1 file changed, 323 insertions(+), 343 deletions(-) diff --git a/student.ipynb b/student.ipynb index b8e4f974..0893adb3 100644 --- a/student.ipynb +++ b/student.ipynb @@ -533,347 +533,327 @@ "output_type": "stream", "text": [ "The dataset contains 21597 houses with 21 features\n", - "\n", - "Columns and their data types:\n", - "id: int64\n", - "date: object\n", - "price: float64\n", - "bedrooms: int64\n", - "bathrooms: float64\n", - "sqft_living: int64\n", - "sqft_lot: int64\n", - "floors: float64\n", - "waterfront: object\n", - "view: object\n", - "condition: object\n", - "grade: object\n", - "sqft_above: int64\n", - "sqft_basement: object\n", - "yr_built: int64\n", - "yr_renovated: float64\n", - "zipcode: int64\n", - "lat: float64\n", - "long: float64\n", - "sqft_living15: int64\n", - "sqft_lot15: int64\n", - "\n" - ] - } - ], - "source": [ - "kings_data = load_data('data/kc_house_data.csv')" - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "metadata": {}, - "outputs": [], - "source": [ - "# create a function that takes in a column and returns the column statistics as a dictionary\n", - "def descriptive_analytics(column):\n", - " stats_dict = column.describe().to_dict()\n", - " \n", - " print(\"Descriptive Statistics for Column '{}':\".format(column.name))\n", - " print(\"The count of the column is:\", stats_dict['count'])\n", - " print(\"The mean of the column is:\", stats_dict['mean'])\n", - " print(\"The standard deviation of the column is:\", stats_dict['std'])\n", - " print(\"The minimum value of the column is:\", stats_dict['min'])\n", - " print(\"The 25th percentile of the column is:\", stats_dict['25%'])\n", - " print(\"The median of the column is:\", stats_dict['50%'])\n", - " print(\"The 75th percentile of the column is:\", stats_dict['75%'])\n", - " print(\"The maximum value of the column is:\", stats_dict['max'])" - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Descriptive Statistics for Column 'price':\n", - "The count of the column is: 21597.0\n", - "The mean of the column is: 540296.5735055795\n", - "The standard deviation of the column is: 367368.1401013936\n", - "The minimum value of the column is: 78000.0\n", - "The 25th percentile of the column is: 322000.0\n", - "The median of the column is: 450000.0\n", - "The 75th percentile of the column is: 645000.0\n", - "The maximum value of the column is: 7700000.0\n" - ] - } - ], - "source": [ - "descriptive_analytics(kings_data['price'])" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can see that the maximum price of a house is $7,700,000 and the minimum price is $78,000.\n", - "\n", - "There are 21,597 prices regarding the houses in the dataset.\n", - "\n", - "The average price of a house is $540,296.57." - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "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.1" - } - }, - "nbformat": 4, - "nbformat_minor": 5 - } - { - "cells": [ - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n", - "RangeIndex: 21597 entries, 0 to 21596\n", - "Data columns (total 21 columns):\n", - " # Column Non-Null Count Dtype \n", - "--- ------ -------------- ----- \n", - " 0 id 21597 non-null int64 \n", - " 1 date 21597 non-null object \n", - " 2 price 21597 non-null float64\n", - " 3 bedrooms 21597 non-null int64 \n", - " 4 bathrooms 21597 non-null float64\n", - " 5 sqft_living 21597 non-null int64 \n", - " 6 sqft_lot 21597 non-null int64 \n", - " 7 floors 21597 non-null float64\n", - " 8 waterfront 19221 non-null object \n", - " 9 view 21534 non-null object \n", - " 10 condition 21597 non-null object \n", - " 11 grade 21597 non-null object \n", - " 12 sqft_above 21597 non-null int64 \n", - " 13 sqft_basement 21597 non-null object \n", - " 14 yr_built 21597 non-null int64 \n", - " 15 yr_renovated 17755 non-null float64\n", - " 16 zipcode 21597 non-null int64 \n", - " 17 lat 21597 non-null float64\n", - " 18 long 21597 non-null float64\n", - " 19 sqft_living15 21597 non-null int64 \n", - " 20 sqft_lot15 21597 non-null int64 \n", - "dtypes: float64(6), int64(9), object(6)\n", - "memory usage: 3.5+ MB\n" - ] - } - ], - "source": [ - "kings_data.info()" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "def identify_issues(dataset):\n", - " # Identify missing values as a percentage of the whole dataset\n", - " missing_values = (dataset.isnull().sum())/len(dataset) * 100\n", - "\n", - " # Identify duplicates\n", - " duplicates = dataset.duplicated().sum()\n", - " \n", - " #return a dictionary \n", - " return {'duplicates': duplicates,\n", - " 'missing values': missing_values.round(2)} \n" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'duplicates': 0,\n", - " 'missing values': {\n", - " 'id': 0.0,\n", - " 'date': 0.0,\n", - " 'price': 0.0,\n", - " 'bedrooms': 0.0,\n", - " 'bathrooms': 0.0,\n", - " 'sqft_living': 0.0,\n", - " 'sqft_lot': 0.0,\n", - " 'floors': 0.0,\n", - " 'waterfront': 11.0,\n", - " 'view': 0.29,\n", - " 'condition': 0.0,\n", - " 'grade': 0.0,\n", - " 'sqft_above': 0.0,\n", - " 'sqft_basement': 0.0,\n", - " 'yr_built': 0.0,\n", - " 'yr_renovated': 17.79,\n", - " 'zipcode': 0.0,\n", - " 'lat': 0.0,\n", - " 'long': 0.0,\n", - " 'sqft_living15': 0.0,\n", - " 'sqft_lot15': 0.0\n", - " }}" - ] - }, - "execution_count": 3, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "identify_issues(kings_data)" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [], - "source": [ - "house_data_clean = kings_data.copy()" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [], - "source": [ - "# Changing the date to date time\n", - "house_data_clean['date'] = pd.to_datetime(house_data_clean['date'])\n", - "\n", - "# Extracting only the year from the column Date\n", - "house_data_clean.date = house_data_clean['date'].dt.year\n", - "\n", - "# Changing the dates for the year built \n", - "house_data_clean['yr_built'] = pd.to_datetime(house_data_clean['yr_built'],format='%Y').dt.year\n" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [], - "source": [ - "def missing_values(dataset):\n", - " # drop the rows from views\n", - " dataset.dropna(subset=['view'],inplace=True)\n", - "\n", - " # Filling the NaN values for waterfront with NO\n", - " dataset.waterfront.fillna('NO',inplace=True)\n", - " \n", - " # Dropping the yr_renovated column \n", - " dataset.drop('yr_renovated',axis=1,inplace=True)" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [], - "source": [ - "missing_values(house_data_clean)" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'duplicates': 0,\n", - " 'missing values': id 0.00\n", - " date 0.00\n", - " price 0.00\n", - " bedrooms 0.00\n", - " bathrooms 0.00\n", - " sqft_living 0.00\n", - " sqft_lot 0.00\n", - " floors 0.00\n", - " waterfront 0.00\n", - " view 0.00\n", - " condition 0.00\n", - " grade 0.00\n", - " sqft_above 0.00\n", - " sqft_basement 0.00\n", - " yr_built 0.00\n", - " zipcode 0.00\n", - " lat 0.00\n", - " long 0.00\n", - " sqft_living15 0.00\n", - " sqft_lot15 0.00\n", - " dtype: float64}" - ] - }, - "execution_count": 8, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "identify_issues(house_data_clean)" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [], - "source": [ - "# Checking for duplicates in the dataset\n", - "house_data_clean[house_data_clean.duplicated()]" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "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.8.11" - } - }, - "nbformat": 4, - "nbformat_minor": 5 - } +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "kings_data = load_data('data/kc_house_data.csv')" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": {}, + "outputs": [], + "source": [ + "# create a function that takes in a column and returns the column statistics as a dictionary\n", + "def descriptive_analytics(column):\n", + " stats_dict = column.describe().to_dict()\n", + " \n", + " print(\"Descriptive Statistics for Column '{}':\".format(column.name))\n", + " print(\"The count of the column is:\", stats_dict['count'])\n", + " print(\"The mean of the column is:\", stats_dict['mean'])\n", + " print(\"The standard deviation of the column is:\", stats_dict['std'])\n", + " print(\"The minimum value of the column is:\", stats_dict['min'])\n", + " print(\"The 25th percentile of the column is:\", stats_dict['25%'])\n", + " print(\"The median of the column is:\", stats_dict['50%'])\n", + " print(\"The 75th percentile of the column is:\", stats_dict['75%'])\n", + " print(\"The maximum value of the column is:\", stats_dict['max'])" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Descriptive Statistics for Column 'price':\n", + "The count of the column is: 21597.0\n", + "The mean of the column is: 540296.5735055795\n", + "The standard deviation of the column is: 367368.1401013936\n", + "The minimum value of the column is: 78000.0\n", + "The 25th percentile of the column is: 322000.0\n", + "The median of the column is: 450000.0\n", + "The 75th percentile of the column is: 645000.0\n", + "The maximum value of the column is: 7700000.0\n" + ] + } + ], + "source": [ + "descriptive_analytics(kings_data['price'])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We can see that the maximum price of a house is $7,700,000 and the minimum price is $78,000.\n", + "\n", + "There are 21,597 prices regarding the houses in the dataset.\n", + "\n", + "The average price of a house is $540,296.57." + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "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.1" + } + }, + "nbformat": 4, + "nbformat_minor": 5, +"cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "RangeIndex: 21597 entries, 0 to 21596\n", + "Data columns (total 21 columns):\n", + " # Column Non-Null Count Dtype \n", + "--- ------ -------------- ----- \n", + " 0 id 21597 non-null int64 \n", + " 1 date 21597 non-null object \n", + " 2 price 21597 non-null float64\n", + " 3 bedrooms 21597 non-null int64 \n", + " 4 bathrooms 21597 non-null float64\n", + " 5 sqft_living 21597 non-null int64 \n", + " 6 sqft_lot 21597 non-null int64 \n", + " 7 floors 21597 non-null float64\n", + " 8 waterfront 19221 non-null object \n", + " 9 view 21534 non-null object \n", + " 10 condition 21597 non-null object \n", + " 11 grade 21597 non-null object \n", + " 12 sqft_above 21597 non-null int64 \n", + " 13 sqft_basement 21597 non-null object \n", + " 14 yr_built 21597 non-null int64 \n", + " 15 yr_renovated 17755 non-null float64\n", + " 16 zipcode 21597 non-null int64 \n", + " 17 lat 21597 non-null float64\n", + " 18 long 21597 non-null float64\n", + " 19 sqft_living15 21597 non-null int64 \n", + " 20 sqft_lot15 21597 non-null int64 \n", + "dtypes: float64(6), int64(9), object(6)\n", + "memory usage: 3.5+ MB\n" + ] + } + ], + "source": [ + "kings_data.info()" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "def identify_issues(dataset):\n", + " # Identify missing values as a percentage of the whole dataset\n", + " missing_values = (dataset.isnull().sum())/len(dataset) * 100\n", + "\n", + " # Identify duplicates\n", + " duplicates = dataset.duplicated().sum()\n", + " \n", + " #return a dictionary \n", + " return {'duplicates': duplicates,\n", + " 'missing values': missing_values.round(2)} \n" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'duplicates': 0,\n", + " 'missing values': {\n", + " 'id': 0.0,\n", + " 'date': 0.0,\n", + " 'price': 0.0,\n", + " 'bedrooms': 0.0,\n", + " 'bathrooms': 0.0,\n", + " 'sqft_living': 0.0,\n", + " 'sqft_lot': 0.0,\n", + " 'floors': 0.0,\n", + " 'waterfront': 11.0,\n", + " 'view': 0.29,\n", + " 'condition': 0.0,\n", + " 'grade': 0.0,\n", + " 'sqft_above': 0.0,\n", + " 'sqft_basement': 0.0,\n", + " 'yr_built': 0.0,\n", + " 'yr_renovated': 17.79,\n", + " 'zipcode': 0.0,\n", + " 'lat': 0.0,\n", + " 'long': 0.0,\n", + " 'sqft_living15': 0.0,\n", + " 'sqft_lot15': 0.0\n", + " }}" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "identify_issues(kings_data)" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "house_data_clean = kings_data.copy()" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "# Changing the date to date time\n", + "house_data_clean['date'] = pd.to_datetime(house_data_clean['date'])\n", + "\n", + "# Extracting only the year from the column Date\n", + "house_data_clean.date = house_data_clean['date'].dt.year\n", + "\n", + "# Changing the dates for the year built \n", + "house_data_clean['yr_built'] = pd.to_datetime(house_data_clean['yr_built'],format='%Y').dt.year\n" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "def missing_values(dataset):\n", + " # drop the rows from views\n", + " dataset.dropna(subset=['view'],inplace=True)\n", + "\n", + " # Filling the NaN values for waterfront with NO\n", + " dataset.waterfront.fillna('NO',inplace=True)\n", + " \n", + " # Dropping the yr_renovated column \n", + " dataset.drop('yr_renovated',axis=1,inplace=True)" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [], + "source": [ + "missing_values(house_data_clean)" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'duplicates': 0,\n", + " 'missing values': id 0.00\n", + " date 0.00\n", + " price 0.00\n", + " bedrooms 0.00\n", + " bathrooms 0.00\n", + " sqft_living 0.00\n", + " sqft_lot 0.00\n", + " floors 0.00\n", + " waterfront 0.00\n", + " view 0.00\n", + " condition 0.00\n", + " grade 0.00\n", + " sqft_above 0.00\n", + " sqft_basement 0.00\n", + " yr_built 0.00\n", + " zipcode 0.00\n", + " lat 0.00\n", + " long 0.00\n", + " sqft_living15 0.00\n", + " sqft_lot15 0.00\n", + " dtype: float64}" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "identify_issues(house_data_clean)" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [], + "source": [ + "# Checking for duplicates in the dataset\n", + "house_data_clean[house_data_clean.duplicated()]" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "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.8.11" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} + + \ No newline at end of file From 0edfa118235af2f6329f710be238452ff730db5b Mon Sep 17 00:00:00 2001 From: clydeochieng <107258512+clydeochieng@users.noreply.github.com> Date: Wed, 1 May 2024 11:32:17 +0300 Subject: [PATCH 33/42] Update student.ipynb --- student.ipynb | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/student.ipynb b/student.ipynb index 0893adb3..c9d9d88b 100644 --- a/student.ipynb +++ b/student.ipynb @@ -853,7 +853,4 @@ }, "nbformat": 4, "nbformat_minor": 5 -} - - - \ No newline at end of file +} \ No newline at end of file From 9d605250e480b913d8a7e552b6a90206d811e08f Mon Sep 17 00:00:00 2001 From: clydeochieng <107258512+clydeochieng@users.noreply.github.com> Date: Wed, 1 May 2024 11:43:49 +0300 Subject: [PATCH 34/42] Update student.ipynb --- student.ipynb | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/student.ipynb b/student.ipynb index c9d9d88b..82d7ee49 100644 --- a/student.ipynb +++ b/student.ipynb @@ -827,11 +827,12 @@ "metadata": {}, "outputs": [], "source": [ - "# Checking for duplicates in the dataset\n", - "house_data_clean[house_data_clean.duplicated()]" - ] - } - ], + "# Checking for duplicates in the dataset\n", + "house_data_clean[house_data_clean.duplicated()]" + ] +}, +{ +"cells": [], "metadata": { "kernelspec": { "display_name": "Python 3", @@ -847,7 +848,7 @@ "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", + "pygments_lexer": "ipython3", "version": "3.8.11" } }, From 14adaad0364e6d4495b633c371b72cc1c352a3d6 Mon Sep 17 00:00:00 2001 From: clydeochieng <107258512+clydeochieng@users.noreply.github.com> Date: Wed, 1 May 2024 11:45:00 +0300 Subject: [PATCH 35/42] Update student.ipynb --- student.ipynb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/student.ipynb b/student.ipynb index 82d7ee49..7aa3d364 100644 --- a/student.ipynb +++ b/student.ipynb @@ -854,4 +854,4 @@ }, "nbformat": 4, "nbformat_minor": 5 -} \ No newline at end of file +}, \ No newline at end of file From 4275e4e074c4b71e4d9493cb2357b7011a1332cf Mon Sep 17 00:00:00 2001 From: clydeochieng <107258512+clydeochieng@users.noreply.github.com> Date: Wed, 1 May 2024 11:52:56 +0300 Subject: [PATCH 36/42] Update student.ipynb --- student.ipynb | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/student.ipynb b/student.ipynb index 6fdc9263..59bab0ab 100644 --- a/student.ipynb +++ b/student.ipynb @@ -6,24 +6,20 @@ "source": [ "## Final Project Submission\n", "\n", -Clyde - "* Student name: Solphine Joseph, Grace Rotich, Mathew Kiprotich, Hilary Simiyu, Clyde Ochieng, Derrick Kiptoo \n", - main - "* Student pace: full time\n", + "* Student pace: full time\n", "* Scheduled project review date/time: \n", "* Instructor name: Nikita \n", "* Blog post URL:\n" ] }, - Clyde { "cell_type": "markdown", "metadata": {}, "source": [ "# Kings County Housing Analysis with Multiple Linear Regression" ] - }, + } { "cell_type": "markdown", "metadata": {}, From 11616b1c966613b440f2144e2b3a8d18708bf2a3 Mon Sep 17 00:00:00 2001 From: clydeochieng <107258512+clydeochieng@users.noreply.github.com> Date: Wed, 1 May 2024 11:54:28 +0300 Subject: [PATCH 37/42] Update student.ipynb --- student.ipynb | 1515 ++++++++++++++++++------------------------------- 1 file changed, 564 insertions(+), 951 deletions(-) diff --git a/student.ipynb b/student.ipynb index 59bab0ab..4a29c2f7 100644 --- a/student.ipynb +++ b/student.ipynb @@ -6,144 +6,13 @@ "source": [ "## Final Project Submission\n", "\n", - "* Student name: Solphine Joseph, Grace Rotich, Mathew Kiprotich, Hilary Simiyu, Clyde Ochieng, Derrick Kiptoo \n", - "* Student pace: full time\n", + "* Student name: Solphine Joseph, Grace Rotich, Mathew Kiprotich, Hilary Simiyu, Clyde Ochieng. \n", + "* Student pace: full time\n", "* Scheduled project review date/time: \n", "* Instructor name: Nikita \n", "* Blog post URL:\n" ] }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Kings County Housing Analysis with Multiple Linear Regression" - ] - } - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Overview\n", - "\n", - "A real estate agency in Kingsway seeks to determine what are the contributing factors that affect the price of houses to make improvements where necessary. They want to employ an analytical approach rather than sentimental before arriving at a decision. Multilinear regression has been used for this project to understand how various features affect their pricing to better their services." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Business Problem\n", - "\n", - "In the face of market fluctuations and heightened competition within the real estate sector, our agency is grappling with pricing volatility, which poses significant challenges for our agents in devising effective business strategies. We seek strategic guidance to optimize our purchasing and selling endeavors, prioritizing informed decision-making to identify key areas of focus that promise maximum returns on investment." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Objectives\n", - "* To determine the key factors influencing house prices.\n", - "* To develop multilinear regression models to predict house prices based on relevant features.\n", - "* To use insights from the regression analysis to optimize pricing strategies for both purchasing and selling properties.\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Hypothesis\n", - "* Null Hypothesis - There is no relationship between our independent variables and our dependent variable \n", - "\n", - "* Alternative Hypothesis - There is a relationship between our independent variables and our dependent variable" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Data Understanding:\n", - "\n", - "In this project, we utilized the King County House Sales dataset, which serves as the foundational dataset for our analysis. It was sourced Kaggle.The dataset encompasses comprehensive information regarding house sales within King County, Washington, USA. It comprises a diverse array of features, including the number of bedrooms, bathrooms, square footage, as well as geographical and pricing details of the properties sold. This dataset is frequently employed in data science and machine learning endeavors, particularly for predictive modeling tasks such as regression analysis aimed at forecasting house prices based on the provided features." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "##### King County Housing Data Columns \n", - "\n", - "The column names contained in column_names.md are:\n", - "* `id`: A unique identifier for each house sale.\n", - "* `date`: The date when the house was sold.\n", - "* `price`: The sale price of the house, serving as the target variable for predictive modeling.\n", - "* `bedrooms`, `bathrooms`, `sqft_living`, `sqft_lot`: Numerical features representing the number of bedrooms and bathrooms, as well as the living area and lot area of the house, respectively.\n", - "* `floors`: The number of floors in the house.\n", - "* `waterfront`, `view`, `condition`, `grade`: Categorical features describing aspects such as waterfront availability, property view, condition, and overall grade assigned to the housing unit.\n", - "* `yr_built`, `yr_renovated`: Year of construction and renovation of the house.\n", - "* `zipcode`, `lat`, `long`: Geographical features including ZIP code, latitude, and longitude coordinates.\n", - "* `sqft_above`, `sqft_basement`, `sqft_living15`, `sqft_lot15`: Additional numerical features providing details about the house's above-ground and basement square footage, as well as living area and lot area of the nearest 15 neighboring houses." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Data Loading\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [], - "source": [ - "import matplotlib.pyplot as plt\n", - "%matplotlib inline\n", - "import numpy as np\n", - "import pandas as pd\n", - "import scipy.stats as stats\n", - "import seaborn as sns\n", - "import statsmodels.api as sm\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Loading Data" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [], - "source": [ - "# Creating a function that loads data and return it in a dataframe\n", - "def load_data(file_path):\n", - " house_data = pd.read_csv(file_path)\n", - "\n", - " #shape\n", - " shape = house_data.shape\n", - " print(f\"The dataset contains {shape[0]} houses with {shape[1]} features\")\n", - " print()\n", - " \n", - " #Data Types\n", - " data_types = house_data.dtypes\n", - " print(\"Columns and their data types:\")\n", - " for column, dtype in data_types.items():\n", - " print(f\"{column}: {dtype}\")\n", - " print()\n", - "\n", - " return house_data\n" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - { "cell_type": "markdown", "metadata": {}, @@ -252,7 +121,6 @@ { "cell_type": "code", "execution_count": 3, - main "metadata": {}, "outputs": [ { @@ -599,821 +467,566 @@ "\n", "

21597 rows × 21 columns

\n", "" - ], - "text/plain": [ - " id date price bedrooms bathrooms sqft_living \\\n", - "0 7129300520 10/13/2014 221900.0 3 1.00 1180 \n", - "1 6414100192 12/9/2014 538000.0 3 2.25 2570 \n", - "2 5631500400 2/25/2015 180000.0 2 1.00 770 \n", - "3 2487200875 12/9/2014 604000.0 4 3.00 1960 \n", - "4 1954400510 2/18/2015 510000.0 3 2.00 1680 \n", - "... ... ... ... ... ... ... \n", - "21592 263000018 5/21/2014 360000.0 3 2.50 1530 \n", - "21593 6600060120 2/23/2015 400000.0 4 2.50 2310 \n", - "21594 1523300141 6/23/2014 402101.0 2 0.75 1020 \n", - "21595 291310100 1/16/2015 400000.0 3 2.50 1600 \n", - "21596 1523300157 10/15/2014 325000.0 2 0.75 1020 \n", - "\n", - " sqft_lot floors waterfront view ... grade sqft_above \\\n", - "0 5650 1.0 NaN NONE ... 7 Average 1180 \n", - "1 7242 2.0 NO NONE ... 7 Average 2170 \n", - "2 10000 1.0 NO NONE ... 6 Low Average 770 \n", - "3 5000 1.0 NO NONE ... 7 Average 1050 \n", - "4 8080 1.0 NO NONE ... 8 Good 1680 \n", - "... ... ... ... ... ... ... ... \n", - "21592 1131 3.0 NO NONE ... 8 Good 1530 \n", - "21593 5813 2.0 NO NONE ... 8 Good 2310 \n", - "21594 1350 2.0 NO NONE ... 7 Average 1020 \n", - "21595 2388 2.0 NaN NONE ... 8 Good 1600 \n", - "21596 1076 2.0 NO NONE ... 7 Average 1020 \n", - "\n", - " sqft_basement yr_built yr_renovated zipcode lat long \\\n", - "0 0.0 1955 0.0 98178 47.5112 -122.257 \n", - "1 400.0 1951 1991.0 98125 47.7210 -122.319 \n", - "2 0.0 1933 NaN 98028 47.7379 -122.233 \n", - "3 910.0 1965 0.0 98136 47.5208 -122.393 \n", - "4 0.0 1987 0.0 98074 47.6168 -122.045 \n", - "... ... ... ... ... ... ... \n", - "21592 0.0 2009 0.0 98103 47.6993 -122.346 \n", - "21593 0.0 2014 0.0 98146 47.5107 -122.362 \n", - "21594 0.0 2009 0.0 98144 47.5944 -122.299 \n", - "21595 0.0 2004 0.0 98027 47.5345 -122.069 \n", - "21596 0.0 2008 0.0 98144 47.5941 -122.299 \n", - "\n", - " sqft_living15 sqft_lot15 \n", - "0 1340 5650 \n", - "1 1690 7639 \n", - "2 2720 8062 \n", - "3 1360 5000 \n", - "4 1800 7503 \n", - "... ... ... \n", - "21592 1530 1509 \n", - "21593 1830 7200 \n", - "21594 1020 2007 \n", - "21595 1410 1287 \n", - "21596 1020 1357 \n", - "\n", - "[21597 rows x 21 columns]" - ] - }, -Clyde - "execution_count": 18, - - "execution_count": 3, - main - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "load_data('data/kc_house_data.csv') # Assuming 'data' folder is in the same directory\n", - "\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The dataset contains 21 columns, each representing a distinct feature, and 21,597 rows, with each row corresponding to a specific house sale entry.\n", - "\n", - "The dataset contains a mix of data types, including integers (int64), floating-point numbers (float64), and objects (strings). For instance, numerical features such as bedrooms, bathrooms, and sqft_living are represented as integers or floating-point numbers to facilitate mathematical computations, while categorical features like waterfront and view are stored as objects to accommodate text-based categories." - ] - }, - { - "cell_type": "code", - Clyde - "execution_count": 19, - - "execution_count": 4, - main - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "The dataset contains 21597 houses with 21 features\n", - "\n", - "Columns and their data types:\n", - "id: int64\n", - "date: object\n", - "price: float64\n", - "bedrooms: int64\n", - "bathrooms: float64\n", - "sqft_living: int64\n", - "sqft_lot: int64\n", - "floors: float64\n", - "waterfront: object\n", - "view: object\n", - "condition: object\n", - "grade: object\n", - "sqft_above: int64\n", - "sqft_basement: object\n", - "yr_built: int64\n", - "yr_renovated: float64\n", - "zipcode: int64\n", - "lat: float64\n", - "long: float64\n", - "sqft_living15: int64\n", - "sqft_lot15: int64\n", - "\n" - ] - } - ], - "source": [ - "kings_data = load_data('data/kc_house_data.csv')" - ] - }, - { - "cell_type": "code", - Clyde - "execution_count": 20, - - "execution_count": 5, - main - "metadata": {}, - "outputs": [], - "source": [ - "#create a function that takes in a column and returns the column statistics as a dictionary\n", - "def descriptive_analytics(column):\n", - " stats_dict = column.describe().to_dict()\n", - " \n", - " print(\"Descriptive Statistics for Column '{}':\".format(column.name))\n", - " print(\"The count of the column is:\", stats_dict['count'])\n", - " print(\"The mean of the column is:\", stats_dict['mean'])\n", - " print(\"The standard deviation of the column is:\", stats_dict['std'])\n", - " print(\"The minimum value of the column is:\", stats_dict['min'])\n", - " print(\"The 25th percentile of the column is:\", stats_dict['25%'])\n", - " print(\"The median of the column is:\", stats_dict['50%'])\n", - " print(\"The 75th percentile of the column is:\", stats_dict['75%'])\n", - " print(\"The maximum value of the column is:\", stats_dict['max'])" - ] - }, - Clyde - { - "cell_type": "code", - "execution_count": 21, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Descriptive Statistics for Column 'price':\n", - "The count of the column is: 21597.0\n", - "The mean of the column is: 540296.5735055795\n", - "The standard deviation of the column is: 367368.1401013936\n", - "The minimum value of the column is: 78000.0\n", - "The 25th percentile of the column is: 322000.0\n", - "The median of the column is: 450000.0\n", - "The 75th percentile of the column is: 645000.0\n", - "The maximum value of the column is: 7700000.0\n" - ] - } - ], - "source": [ - "descriptive_analytics(kings_data['price'])" - - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Descriptive Statistics for Column 'price':\n", - "The count of the column is: 21597.0\n", - "The mean of the column is: 540296.5735055795\n", - "The standard deviation of the column is: 367368.1401013936\n", - "The minimum value of the column is: 78000.0\n", - "The 25th percentile of the column is: 322000.0\n", - "The median of the column is: 450000.0\n", - "The 75th percentile of the column is: 645000.0\n", - "The maximum value of the column is: 7700000.0\n" - ] - } - ], - "source": [ - "descriptive_analytics(kings_data['price'])" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can see that the maximum price of a house is 7700000 dollars and the minimum price is 78000 dollars\n", - "\n", - "There are 21597 prices regarding to the houses in the dataset\n", - "\n", - "Average price of a house is 540296.57 dollars" - main - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - Clyde - "We can see that the maximum price of a house is 7700000 dollars and the minimum price is 78000 dollars\n", - "\n", - "There are 21597 prices regarding to the houses in the dataset\n", - "\n", - "Average price of a house is 540296.57 dollars" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Data Preperation\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": 22, - - "## Data Preperation\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - main - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n", - "RangeIndex: 21597 entries, 0 to 21596\n", - "Data columns (total 21 columns):\n", - " # Column Non-Null Count Dtype \n", - "--- ------ -------------- ----- \n", - " 0 id 21597 non-null int64 \n", - " 1 date 21597 non-null object \n", - " 2 price 21597 non-null float64\n", - " 3 bedrooms 21597 non-null int64 \n", - " 4 bathrooms 21597 non-null float64\n", - " 5 sqft_living 21597 non-null int64 \n", - " 6 sqft_lot 21597 non-null int64 \n", - " 7 floors 21597 non-null float64\n", - " 8 waterfront 19221 non-null object \n", - " 9 view 21534 non-null object \n", - " 10 condition 21597 non-null object \n", - " 11 grade 21597 non-null object \n", - " 12 sqft_above 21597 non-null int64 \n", - " 13 sqft_basement 21597 non-null object \n", - " 14 yr_built 21597 non-null int64 \n", - " 15 yr_renovated 17755 non-null float64\n", - " 16 zipcode 21597 non-null int64 \n", - " 17 lat 21597 non-null float64\n", - " 18 long 21597 non-null float64\n", - " 19 sqft_living15 21597 non-null int64 \n", - " 20 sqft_lot15 21597 non-null int64 \n", - "dtypes: float64(6), int64(9), object(6)\n", - "memory usage: 3.5+ MB\n" - ] - } - ], - "source": [ - "kings_data.info()" - ] - }, - Clyde - { - "cell_type": "code", - "execution_count": 23, - "metadata": {}, - "outputs": [], - "source": [ - "def identify_issues(dataset):\n", - " # Identify missing values as a percentage of the whole dataset\n", - " missing_values = (dataset.isnull().sum())/len(dataset) * 100\n", - "\n", - " # Identify duplicates\n", - " duplicates = dataset.duplicated().sum()\n", - " \n", - " #return a dictionary \n", - " return {'duplicates': duplicates,\n", - " 'missing values': missing_values.round(2)} \n" - - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [], - "source": [ - "def identify_issues(dataset):\n", - " # Identify missing values as a percentage of the whole dataset\n", - " missing_values = (dataset.isnull().sum())/len(dataset) * 100\n", - "\n", - " # Identify duplicates\n", - " duplicates = dataset.duplicated().sum()\n", - " \n", - " #return a dictionary \n", - " return {'duplicates': duplicates,\n", - " 'missing values': missing_values.round(2)} \n" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'duplicates': 0,\n", - " 'missing values': id 0.00\n", - " date 0.00\n", - " price 0.00\n", - " bedrooms 0.00\n", - " bathrooms 0.00\n", - " sqft_living 0.00\n", - " sqft_lot 0.00\n", - " floors 0.00\n", - " waterfront 11.00\n", - " view 0.29\n", - " condition 0.00\n", - " grade 0.00\n", - " sqft_above 0.00\n", - " sqft_basement 0.00\n", - " yr_built 0.00\n", - " yr_renovated 17.79\n", - " zipcode 0.00\n", - " lat 0.00\n", - " long 0.00\n", - " sqft_living15 0.00\n", - " sqft_lot15 0.00\n", - " dtype: float64}" - ] - }, - "execution_count": 9, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "identify_issues(kings_data)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The examination indicates that there are no duplicate entries within the dataset, ensuring the integrity of the records. However, attention is warranted to address missing values present in certain columns. Specifically, the 'waterfront' feature exhibits 11% of null values, representing a negligible portion of the dataset. Similarly, the 'yr_renovated' feature shows a relatively higher percentage of missing values, accounting for approximately 17.79% of the dataset" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "##### Before making changes make a copy instead of overwriting data" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [], - "source": [ - "house_data_clean = kings_data.copy()" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [], - "source": [ - "# Changing the date to date time\n", - "house_data_clean['date'] = pd.to_datetime(house_data_clean['date'])\n", - "\n", - "# Extracting only the year from the column Date\n", - "house_data_clean.date = house_data_clean['date'].dt.year\n", - "\n", - "# Changing the dates for the year built \n", - "house_data_clean['yr_built'] = pd.to_datetime(house_data_clean['yr_built'],format='%Y').dt.year\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The above code converts the 'date' column data to only contain the year the house was sold, for the purpose of analysis we will use only the year since the changes month by month will be minor." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### Dealing with the missing values" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [], - "source": [ - "def missing_values(dataset):\n", - " # drop the rows from views\n", - " dataset.dropna(subset=['view'],inplace=True)\n", - "\n", - " # Filling the NaN values for waterfront with NO\n", - " dataset.waterfront.fillna('NO',inplace=True)\n", - " \n", - " # Dropping the yr_renovated column \n", - " dataset.drop('yr_renovated',axis=1,inplace=True)" - main - ] - }, - { - "cell_type": "code", - Clyde - "execution_count": 24, - - "execution_count": 13, - "metadata": {}, - "outputs": [], - "source": [ - "missing_values(house_data_clean)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "'yr_renovated' has the highest percentage of NaN values 17%. This will be dropped since it will not be used within our model inline with the business problem.\n", - "\n", - "'Waterfront' feature has 11% null values, this was filled with NO on the assumption that these cells were not filled since they lacked waterfronts\n", - "\n", - "For the 'View' column, the null values were dropped by row since the overall percentage impact would be minute" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - main - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - Clyde - "{'duplicates': 0,\n", - " 'missing values': id 0.00\n", - " date 0.00\n", - " price 0.00\n", - " bedrooms 0.00\n", - " bathrooms 0.00\n", - " sqft_living 0.00\n", - " sqft_lot 0.00\n", - " floors 0.00\n", - " waterfront 11.00\n", - " view 0.29\n", - " condition 0.00\n", - " grade 0.00\n", - " sqft_above 0.00\n", - " sqft_basement 0.00\n", - " yr_built 0.00\n", - " yr_renovated 17.79\n", - " zipcode 0.00\n", - " lat 0.00\n", - " long 0.00\n", - " sqft_living15 0.00\n", - " sqft_lot15 0.00\n", - " dtype: float64}" - ] - }, - "execution_count": 24, - - "{'duplicates': 2,\n", - " 'missing values': id 0.0\n", - " date 0.0\n", - " price 0.0\n", - " bedrooms 0.0\n", - " bathrooms 0.0\n", - " sqft_living 0.0\n", - " sqft_lot 0.0\n", - " floors 0.0\n", - " waterfront 0.0\n", - " view 0.0\n", - " condition 0.0\n", - " grade 0.0\n", - " sqft_above 0.0\n", - " sqft_basement 0.0\n", - " yr_built 0.0\n", - " zipcode 0.0\n", - " lat 0.0\n", - " long 0.0\n", - " sqft_living15 0.0\n", - " sqft_lot15 0.0\n", - " dtype: float64}" - ] - }, - "execution_count": 14, - main - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - Clyde - "identify_issues(kings_data)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The examination indicates that there are no duplicate entries within the dataset, ensuring the integrity of the records. However, attention is warranted to address missing values present in certain columns. Specifically, the 'waterfront' feature exhibits 11% of null values, representing a negligible portion of the dataset. Similarly, the 'yr_renovated' feature shows a relatively higher percentage of missing values, accounting for approximately 17.79% of the dataset" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "##### Before making changes make a copy instead of overwriting data" - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "metadata": {}, - "outputs": [], - "source": [ - "house_data_clean = kings_data.copy()" - ] - }, - { - "cell_type": "code", - "execution_count": 26, - "metadata": {}, - "outputs": [], - "source": [ - "# Changing the date to date time\n", - "house_data_clean['date'] = pd.to_datetime(house_data_clean['date'])\n", - "\n", - "# Extracting only the year from the column Date\n", - "house_data_clean.date = house_data_clean['date'].dt.year\n", - "\n", - "# Changing the dates for the year built \n", - "house_data_clean['yr_built'] = pd.to_datetime(house_data_clean['yr_built'],format='%Y').dt.year\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The above code converts the 'date' column data to only contain the year the house was sold, for the purpose of analysis we will use only the year since the changes month by month will be minor." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### Dealing with the missing values" - ] - }, - { - "cell_type": "code", - "execution_count": 27, - "metadata": {}, - "outputs": [], - "source": [ - "def missing_values(dataset):\n", - " # drop the rows from views\n", - " dataset.dropna(subset=['view'],inplace=True)\n", - "\n", - " # Filling the NaN values for waterfront with NO\n", - " dataset.waterfront.fillna('NO',inplace=True)\n", - " \n", - " # Dropping the yr_renovated column \n", - " dataset.drop('yr_renovated',axis=1,inplace=True)" - ] - }, - { - "cell_type": "code", - "execution_count": 28, - "metadata": {}, - "outputs": [], - "source": [ - "missing_values(house_data_clean)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "'yr_renovated' has the highest percentage of NaN values 17%. This will be dropped since it will not be used within our model inline with the business problem.\n", - "\n", - "'Waterfront' feature has 11% null values, this was filled with NO on the assumption that these cells were not filled since they lacked waterfronts\n", - "\n", - "For the 'View' column, the null values were dropped by row since the overall percentage impact would be minute" - ] - }, - { - "cell_type": "code", - "execution_count": 29, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'duplicates': 2,\n", - " 'missing values': id 0.0\n", - " date 0.0\n", - " price 0.0\n", - " bedrooms 0.0\n", - " bathrooms 0.0\n", - " sqft_living 0.0\n", - " sqft_lot 0.0\n", - " floors 0.0\n", - " waterfront 0.0\n", - " view 0.0\n", - " condition 0.0\n", - " grade 0.0\n", - " sqft_above 0.0\n", - " sqft_basement 0.0\n", - " yr_built 0.0\n", - " zipcode 0.0\n", - " lat 0.0\n", - " long 0.0\n", - " sqft_living15 0.0\n", - " sqft_lot15 0.0\n", - " dtype: float64}" - ] - }, - "execution_count": 29, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "identify_issues(house_data_clean)" - ] - }, - { - "cell_type": "code", - "execution_count": 30, - - "identify_issues(house_data_clean)" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - main - "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", - "
iddatepricebedroomsbathroomssqft_livingsqft_lotfloorswaterfrontviewconditiongradesqft_abovesqft_basementyr_builtzipcodelatlongsqft_living15sqft_lot15
394718250690312014550000.041.75241084472.0NOGOODGood8 Good2060350.019369807447.6499-122.088252014789
2003886489001102014555000.032.50194032112.0NONONEAverage8 Good19400.020099802747.5644-122.09318803078
\n", - "
" - ], - "text/plain": [ - " id date price bedrooms bathrooms sqft_living sqft_lot \\\n", - "3947 1825069031 2014 550000.0 4 1.75 2410 8447 \n", - "20038 8648900110 2014 555000.0 3 2.50 1940 3211 \n", - "\n", - " floors waterfront view condition grade sqft_above sqft_basement \\\n", - "3947 2.0 NO GOOD Good 8 Good 2060 350.0 \n", - "20038 2.0 NO NONE Average 8 Good 1940 0.0 \n", - "\n", - " yr_built zipcode lat long sqft_living15 sqft_lot15 \n", - "3947 1936 98074 47.6499 -122.088 2520 14789 \n", - "20038 2009 98027 47.5644 -122.093 1880 3078 " - ] - }, - Clyde - "execution_count": 30, - - "execution_count": 15, - main - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "house_data_clean[house_data_clean.duplicated()]" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "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.10.13" - } - }, - "nbformat": 4, - "nbformat_minor": 2 + ], + "text/plain": [ + " id date price bedrooms bathrooms sqft_living \\\n", + "0 7129300520 10/13/2014 221900.0 3 1.00 1180 \n", + "1 6414100192 12/9/2014 538000.0 3 2.25 2570 \n", + "2 5631500400 2/25/2015 180000.0 2 1.00 770 \n", + "3 2487200875 12/9/2014 604000.0 4 3.00 1960 \n", + "4 1954400510 2/18/2015 510000.0 3 2.00 1680 \n", + "... ... ... ... ... ... ... \n", + "21592 263000018 5/21/2014 360000.0 3 2.50 1530 \n", + "21593 6600060120 2/23/2015 400000.0 4 2.50 2310 \n", + "21594 1523300141 6/23/2014 402101.0 2 0.75 1020 \n", + "21595 291310100 1/16/2015 400000.0 3 2.50 1600 \n", + "21596 1523300157 10/15/2014 325000.0 2 0.75 1020 \n", + "\n", + " sqft_lot floors waterfront view ... grade sqft_above \\\n", + "0 5650 1.0 NaN NONE ... 7 Average 1180 \n", + "1 7242 2.0 NO NONE ... 7 Average 2170 \n", + "2 10000 1.0 NO NONE ... 6 Low Average 770 \n", + "3 5000 1.0 NO NONE ... 7 Average 1050 \n", + "4 8080 1.0 NO NONE ... 8 Good 1680 \n", + "... ... ... ... ... ... ... ... \n", + "21592 1131 3.0 NO NONE ... 8 Good 1530 \n", + "21593 5813 2.0 NO NONE ... 8 Good 2310 \n", + "21594 1350 2.0 NO NONE ... 7 Average 1020 \n", + "21595 2388 2.0 NaN NONE ... 8 Good 1600 \n", + "21596 1076 2.0 NO NONE ... 7 Average 1020 \n", + "\n", + " sqft_basement yr_built yr_renovated zipcode lat long \\\n", + "0 0.0 1955 0.0 98178 47.5112 -122.257 \n", + "1 400.0 1951 1991.0 98125 47.7210 -122.319 \n", + "2 0.0 1933 NaN 98028 47.7379 -122.233 \n", + "3 910.0 1965 0.0 98136 47.5208 -122.393 \n", + "4 0.0 1987 0.0 98074 47.6168 -122.045 \n", + "... ... ... ... ... ... ... \n", + "21592 0.0 2009 0.0 98103 47.6993 -122.346 \n", + "21593 0.0 2014 0.0 98146 47.5107 -122.362 \n", + "21594 0.0 2009 0.0 98144 47.5944 -122.299 \n", + "21595 0.0 2004 0.0 98027 47.5345 -122.069 \n", + "21596 0.0 2008 0.0 98144 47.5941 -122.299 \n", + "\n", + " sqft_living15 sqft_lot15 \n", + "0 1340 5650 \n", + "1 1690 7639 \n", + "2 2720 8062 \n", + "3 1360 5000 \n", + "4 1800 7503 \n", + "... ... ... \n", + "21592 1530 1509 \n", + "21593 1830 7200 \n", + "21594 1020 2007 \n", + "21595 1410 1287 \n", + "21596 1020 1357 \n", + "\n", + "[21597 rows x 21 columns]" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "load_data('data/kc_house_data.csv') # Assuming 'data' folder is in the same directory\n", + "\n", + "\n" + ] +}, +{ + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The dataset contains 21 columns, each representing a distinct feature, and 21,597 rows, with each row corresponding to a specific house sale entry.\n", + "\n", + "The dataset contains a mix of data types, including integers (int64), floating-point numbers (float64), and objects (strings). For instance, numerical features such as bedrooms, bathrooms, and sqft_living are represented as integers or floating-point numbers to facilitate mathematical computations, while categorical features like waterfront and view are stored as objects to accommodate text-based categories." + ] +}, +{ + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The dataset contains 21597 houses with 21 features\n", + "\n", + "Columns and their data types:\n", + "id: int64\n", + "date: object\n", + "price: float64\n", + "bedrooms: int64\n", + "bathrooms: float64\n", + "sqft_living: int64\n", + "sqft_lot: int64\n", + "floors: float64\n", + "waterfront: object\n", + "view: object\n", + "condition: object\n", + "grade: object\n", + "sqft_above: int64\n", + "sqft_basement: object\n", + "yr_built: int64\n", + "yr_renovated: float64\n", + "zipcode: int64\n", + "lat: float64\n", + "long: float64\n", + "sqft_living15: int64\n", + "sqft_lot15: int64\n", + "\n" + ] + } + ], + "source": [ + "kings_data = load_data('data/kc_house_data.csv')" + ] +}, +{ + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "#create a function that takes in a column and returns the column statistics as a dictionary\n", + "def descriptive_analytics(column):\n", + " stats_dict = column.describe().to_dict()\n", + " \n", + " print(\"Descriptive Statistics for Column '{}':\".format(column.name))\n", + " print(\"The count of the column is:\", stats_dict['count'])\n", + " print(\"The mean of the column is:\", stats_dict['mean'])\n", + " print(\"The standard deviation of the column is:\", stats_dict['std'])\n", + " print(\"The minimum value of the column is:\", stats_dict['min'])\n", + " print(\"The 25th percentile of the column is:\", stats_dict['25%'])\n", + " print(\"The median of the column is:\", stats_dict['50%'])\n", + " print(\"The 75th percentile of the column is:\", stats_dict['75%'])\n", + " print(\"The maximum value of the column is:\", stats_dict['max'])" + ] +}, +{ + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Descriptive Statistics for Column 'price':\n", + "The count of the column is: 21597.0\n", + "The mean of the column is: 540296.5735055795\n", + "The standard deviation of the column is: 367368.1401013936\n", + "The minimum value of the column is: 78000.0\n", + "The 25th percentile of the column is: 322000.0\n", + "The median of the column is: 450000.0\n", + "The 75th percentile of the column is: 645000.0\n", + "The maximum value of the column is: 7700000.0\n" + ] + } + ], + "source": [ + "descriptive_analytics(kings_data['price'])" + ] +}, +{ + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We can see that the maximum price of a house is 7700000 dollars and the minimum price is 78000 dollars\n", + "\n", + "There are 21597 prices regarding to the houses in the dataset\n", + "\n", + "Average price of a house is 540296.57 dollars" + ] +}, +{ + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Data Preperation\n", + "\n" + ] +}, +{ + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "RangeIndex: 21597 entries, 0 to 21596\n", + "Data columns (total 21 columns):\n", + " # Column Non-Null Count Dtype \n", + "--- ------ -------------- ----- \n", + " 0 id 21597 non-null int64 \n", + " 1 date 21597 non-null object \n", + " 2 price 21597 non-null float64\n", + " 3 bedrooms 21597 non-null int64 \n", + " 4 bathrooms 21597 non-null float64\n", + " 5 sqft_living 21597 non-null int64 \n", + " 6 sqft_lot 21597 non-null int64 \n", + " 7 floors 21597 non-null float64\n", + " 8 waterfront 19221 non-null object \n", + " 9 view 21534 non-null object \n", + " 10 condition 21597 non-null object \n", + " 11 grade 21597 non-null object \n", + " 12 sqft_above 21597 non-null int64 \n", + " 13 sqft_basement 21597 non-null object \n", + " 14 yr_built 21597 non-null int64 \n", + " 15 yr_renovated 17755 non-null float64\n", + " 16 zipcode 21597 non-null int64 \n", + " 17 lat 21597 non-null float64\n", + " 18 long 21597 non-null float64\n", + " 19 sqft_living15 21597 non-null int64 \n", + " 20 sqft_lot15 21597 non-null int64 \n", + "dtypes: float64(6), int64(9), object(6)\n", + "memory usage: 3.5+ MB\n" + ] + } + ], + "source": [ + "kings_data.info()" + ] +}, +{ + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [], + "source": [ + "def identify_issues(dataset):\n", + " # Identify missing values as a percentage of the whole dataset\n", + " missing_values = (dataset.isnull().sum())/len(dataset) * 100\n", + "\n", + " # Identify duplicates\n", + " duplicates = dataset.duplicated().sum()\n", + " \n", + " #return a dictionary \n", + " return {'duplicates': duplicates,\n", + " 'missing values': missing_values.round(2)} \n" + ] +}, +{ + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'duplicates': 0,\n", + " 'missing values': id 0.00\n", + " date 0.00\n", + " price 0.00\n", + " bedrooms 0.00\n", + " bathrooms 0.00\n", + " sqft_living 0.00\n", + " sqft_lot 0.00\n", + " floors 0.00\n", + " waterfront 11.00\n", + " view 0.29\n", + " condition 0.00\n", + " grade 0.00\n", + " sqft_above 0.00\n", + " sqft_basement 0.00\n", + " yr_built 0.00\n", + " yr_renovated 17.79\n", + " zipcode 0.00\n", + " lat 0.00\n", + " long 0.00\n", + " sqft_living15 0.00\n", + " sqft_lot15 0.00\n", + " dtype: float64}" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "identify_issues(kings_data)" + ] +}, +{ + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The examination indicates that there are no duplicate entries within the dataset, ensuring the integrity of the records. However, attention is warranted to address missing values present in certain columns. Specifically, the 'waterfront' feature exhibits 11% of null values, representing a negligible portion of the dataset. Similarly, the 'yr_renovated' feature shows a relatively higher percentage of missing values, accounting for approximately 17.79% of the dataset" + ] +}, +{ + "cell_type": "markdown", + "metadata": {}, + "source": [ + "##### Before making changes make a copy instead of overwriting data" + ] +}, +{ + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [], + "source": [ + "house_data_clean = kings_data.copy()" + ] +}, +{ + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [], + "source": [ + "# Changing the date to date time\n", + "house_data_clean['date'] = pd.to_datetime(house_data_clean['date'])\n", + "\n", + "# Extracting only the year from the column Date\n", + "house_data_clean.date = house_data_clean['date'].dt.year\n", + "\n", + "# Changing the dates for the year built \n", + "house_data_clean['yr_built'] = pd.to_datetime(house_data_clean['yr_built'],format='%Y').dt.year\n" + ] +}, +{ + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The above code converts the 'date' column data to only contain the year the house was sold, for the purpose of analysis we will use only the year since the changes month by month will be minor." + ] +}, +{ + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Dealing with the missing values" + ] +}, +{ + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [], + "source": [ + "def missing_values(dataset):\n", + " # drop the rows from views\n", + " dataset.dropna(subset=['view'],inplace=True)\n", + "\n", + " # Filling the NaN values for waterfront with NO\n", + " dataset.waterfront.fillna('NO',inplace=True)\n", + " \n", + " # Dropping the yr_renovated column \n", + " dataset.drop('yr_renovated',axis=1,inplace=True)" + ] +}, +{ + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [], + "source": [ + "missing_values(house_data_clean)" + ] +}, +{ + "cell_type": "markdown", + "metadata": {}, + "source": [ + "'yr_renovated' has the highest percentage of NaN values 17%. This will be dropped since it will not be used within our model inline with the business problem.\n", + "\n", + "'Waterfront' feature has 11% null values, this was filled with NO on the assumption that these cells were not filled since they lacked waterfronts\n", + "\n", + "For the 'View' column, the null values were dropped by row since the overall percentage impact would be minute" + ] +}, +{ + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'duplicates': 2,\n", + " 'missing values': id 0.0\n", + " date 0.0\n", + " price 0.0\n", + " bedrooms 0.0\n", + " bathrooms 0.0\n", + " sqft_living 0.0\n", + " sqft_lot 0.0\n", + " floors 0.0\n", + " waterfront 0.0\n", + " view 0.0\n", + " condition 0.0\n", + " grade 0.0\n", + " sqft_above 0.0\n", + " sqft_basement 0.0\n", + " yr_built 0.0\n", + " zipcode 0.0\n", + " lat 0.0\n", + " long 0.0\n", + " sqft_living15 0.0\n", + " sqft_lot15 0.0\n", + " dtype: float64}" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "identify_issues(house_data_clean)" + ] +}, +{ + "cell_type": "code", + "execution_count": 15, + "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", + "
iddatepricebedroomsbathroomssqft_livingsqft_lotfloorswaterfrontviewconditiongradesqft_abovesqft_basementyr_builtzipcodelatlongsqft_living15sqft_lot15
394718250690312014550000.041.75241084472.0NOGOODGood8 Good2060350.019369807447.6499-122.088252014789
2003886489001102014555000.032.50194032112.0NONONEAverage8 Good19400.020099802747.5644-122.09318803078
\n", + "
" + ], + "text/plain": [ + " id date price bedrooms bathrooms sqft_living sqft_lot \\\n", + "3947 1825069031 2014 550000.0 4 1.75 2410 8447 \n", + "20038 8648900110 2014 555000.0 3 2.50 1940 3211 \n", + "\n", + " floors waterfront view condition grade sqft_above sqft_basement \\\n", + "3947 2.0 NO GOOD Good 8 Good 2060 350.0 \n", + "20038 2.0 NO NONE Average 8 Good 1940 0.0 \n", + "\n", + " yr_built zipcode lat long sqft_living15 sqft_lot15 \n", + "3947 1936 98074 47.6499 -122.088 2520 14789 \n", + "20038 2009 98027 47.5644 -122.093 1880 3078 " + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "house_data_clean[house_data_clean.duplicated()]" + ] +} +], +"metadata": { +"kernelspec": { + "display_name": "Python 3", + "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.10.13" +} +}, +"nbformat": 4, +"nbformat_minor": 2 } From 7d271f1f0b6a80bf4a1fba855a89a1a60b1a94e1 Mon Sep 17 00:00:00 2001 From: clydeochieng <107258512+clydeochieng@users.noreply.github.com> Date: Wed, 1 May 2024 11:54:48 +0300 Subject: [PATCH 38/42] Update student.ipynb --- student.ipynb | 999 +++++++++++++++++++++++++++++--------------------- 1 file changed, 587 insertions(+), 412 deletions(-) diff --git a/student.ipynb b/student.ipynb index 7aa3d364..3789754d 100644 --- a/student.ipynb +++ b/student.ipynb @@ -6,7 +6,7 @@ "source": [ "## Final Project Submission\n", "\n", - "* Student name: Solphine Joseph, Grace Rotich, Mathew Kiprotich, Hilary Simiyu, Clyde Ochieng, Derrick Kiptoo. \n", + "* Student name: Solphine Joseph, Grace Rotich, Mathew Kiprotich, Hilary Simiyu, Clyde Ochieng. \n", "* Student pace: full time\n", "* Scheduled project review date/time: \n", "* Instructor name: Nikita \n", @@ -342,7 +342,6 @@ " ...\n", " ...\n", " ...\n", - " ...\n", " \n", " \n", " 21592\n", @@ -426,7 +425,7 @@ " 1600\n", " 2388\n", " 2.0\n", - " NO\n", + " NaN\n", " NONE\n", " ...\n", " 8 Good\n", @@ -440,418 +439,594 @@ " 1410\n", " 1287\n", " \n", + " \n", + " 21596\n", + " 1523300157\n", + " 10/15/2014\n", + " 325000.0\n", + " 2\n", + " 0.75\n", + " 1020\n", + " 1076\n", + " 2.0\n", + " NO\n", + " NONE\n", + " ...\n", + " 7 Average\n", + " 1020\n", + " 0.0\n", + " 2008\n", + " 0.0\n", + " 98144\n", + " 47.5941\n", + " -122.299\n", + " 1020\n", + " 1357\n", + " \n", " \n", "\n", - "

21596 rows × 21 columns

\n", + "

21597 rows × 21 columns

\n", "" - ], - "text/plain": [ - " id date price bedrooms bathrooms sqft_living \\\n", - "0 7129300520 10/13/2014 221900.0 3 1.00 1180 \n", - "1 6414100192 12/9/2014 538000.0 3 2.25 2570 \n", - "2 5631500400 2/25/2015 180000.0 2 1.00 770 \n", - "3 2487200875 12/9/2014 604000.0 4 3.00 1960 \n", - "4 1954400510 2/18/2015 510000.0 3 2.00 1680 \n", - "... ... ... ... ... ... ... \n", - "21592 263000018 5/21/2014 360000.0 3 2.50 1530 \n", - "21593 6600060120 2/23/2015 400000.0 4 2.50 2310 \n", - "21594 1523300141 6/23/2014 402101.0 2 0.75 1020 \n", - "21595 291310100 1/16/2015 400000.0 3 2.50 1600 \n", - "21596 1523300157 10/15/2014 325000.0 2 0.75 1020 \n", - "\n", - " sqft_lot floors waterfront view ... grade sqft_above \\\n", - "0 5650 1.0 NaN NONE ... 7 Average 1180 \n", - "1 7242 2.0 NO NONE ... 7 Average 2170 \n", - "2 10000 1.0 NO NONE ... 6 Low Average 770 \n", - "3 5000 1.0 NO NONE ... 7 Average 1050 \n", - "4 8080 1.0 NO NONE ... 8 Good 1680 \n", - "... ... ... ... ... ... ... ... \n", - "21592 1131 3.0 NO NONE ... 8 Good 1530 \n", - "21593 5813 2.0 NO NONE ... 8 Good 2310 \n", - "21594 1350 2.0 NO NONE ... 7 Average 1020 \n", - "21595 2388 2.0 NaN NONE ... 8 Good 1600 \n", - "21596 1076 2.0 NO NONE ... 7 Average 1020 \n", - "\n", - " sqft_basement yr_built yr_renovated zipcode lat long \\\n", - "0 0.0 1955 0.0 98178 47.5112 -122.257 \n", - "1 400.0 1951 1991.0 98125 47.7210 -122.319 \n", - "2 0.0 1933 NaN 98028 47.7379 -122.233 \n", - "3 910.0 1965 0.0 98136 47.5208 -122.393 \n", - "4 0.0 1987 0.0 98074 47.6168 -122.045 \n", - "... ... ... ... ... ... ... \n", - "21592 0.0 2009 0.0 98103 47.6993 -122.346 \n", - "21593 0.0 2014 0.0 98146 47.5107 -122.362 \n", - "21594 0.0 2009 0.0 98144 47.5944 -122.299 \n", - "21595 0.0 2004 0.0 98027 47.5345 -122.069 \n", - "21596 0.0 2008 0.0 98144 47.5941 -122.299 \n", - "\n", - " sqft_living15 sqft_lot15 \n", - "0 1340 5650 \n", - "1 1690 7639 \n", - "2 2720 8062 \n", - "3 1360 5000 \n", - "4 1800 7503 \n", - "... ... ... \n", - "21592 1530 1509 \n", - "21593 1830 7200 \n", - "21594 1020 2007 \n", - "21595 1410 1287 \n", - "21596 1020 1357 \n", - "\n", - "[21597 rows x 21 columns]" - ] - }, - - "cells": [ - { - "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [], - "source": [ - "load_data('data/kc_house_data.csv') # Assuming 'data' folder is in the same directory\n", - "\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The dataset contains 21 columns, each representing a distinct feature, and 21,597 rows, with each row corresponding to a specific house sale entry.\n", - "\n", - "The dataset contains a mix of data types, including integers (int64), floating-point numbers (float64), and objects (strings). For instance, numerical features such as bedrooms, bathrooms, and sqft_living are represented as integers or floating-point numbers to facilitate mathematical computations, while categorical features like waterfront and view are stored as objects to accommodate text-based categories." - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "The dataset contains 21597 houses with 21 features\n", + ], + "text/plain": [ + " id date price bedrooms bathrooms sqft_living \\\n", + "0 7129300520 10/13/2014 221900.0 3 1.00 1180 \n", + "1 6414100192 12/9/2014 538000.0 3 2.25 2570 \n", + "2 5631500400 2/25/2015 180000.0 2 1.00 770 \n", + "3 2487200875 12/9/2014 604000.0 4 3.00 1960 \n", + "4 1954400510 2/18/2015 510000.0 3 2.00 1680 \n", + "... ... ... ... ... ... ... \n", + "21592 263000018 5/21/2014 360000.0 3 2.50 1530 \n", + "21593 6600060120 2/23/2015 400000.0 4 2.50 2310 \n", + "21594 1523300141 6/23/2014 402101.0 2 0.75 1020 \n", + "21595 291310100 1/16/2015 400000.0 3 2.50 1600 \n", + "21596 1523300157 10/15/2014 325000.0 2 0.75 1020 \n", + "\n", + " sqft_lot floors waterfront view ... grade sqft_above \\\n", + "0 5650 1.0 NaN NONE ... 7 Average 1180 \n", + "1 7242 2.0 NO NONE ... 7 Average 2170 \n", + "2 10000 1.0 NO NONE ... 6 Low Average 770 \n", + "3 5000 1.0 NO NONE ... 7 Average 1050 \n", + "4 8080 1.0 NO NONE ... 8 Good 1680 \n", + "... ... ... ... ... ... ... ... \n", + "21592 1131 3.0 NO NONE ... 8 Good 1530 \n", + "21593 5813 2.0 NO NONE ... 8 Good 2310 \n", + "21594 1350 2.0 NO NONE ... 7 Average 1020 \n", + "21595 2388 2.0 NaN NONE ... 8 Good 1600 \n", + "21596 1076 2.0 NO NONE ... 7 Average 1020 \n", + "\n", + " sqft_basement yr_built yr_renovated zipcode lat long \\\n", + "0 0.0 1955 0.0 98178 47.5112 -122.257 \n", + "1 400.0 1951 1991.0 98125 47.7210 -122.319 \n", + "2 0.0 1933 NaN 98028 47.7379 -122.233 \n", + "3 910.0 1965 0.0 98136 47.5208 -122.393 \n", + "4 0.0 1987 0.0 98074 47.6168 -122.045 \n", + "... ... ... ... ... ... ... \n", + "21592 0.0 2009 0.0 98103 47.6993 -122.346 \n", + "21593 0.0 2014 0.0 98146 47.5107 -122.362 \n", + "21594 0.0 2009 0.0 98144 47.5944 -122.299 \n", + "21595 0.0 2004 0.0 98027 47.5345 -122.069 \n", + "21596 0.0 2008 0.0 98144 47.5941 -122.299 \n", + "\n", + " sqft_living15 sqft_lot15 \n", + "0 1340 5650 \n", + "1 1690 7639 \n", + "2 2720 8062 \n", + "3 1360 5000 \n", + "4 1800 7503 \n", + "... ... ... \n", + "21592 1530 1509 \n", + "21593 1830 7200 \n", + "21594 1020 2007 \n", + "21595 1410 1287 \n", + "21596 1020 1357 \n", + "\n", + "[21597 rows x 21 columns]" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "load_data('data/kc_house_data.csv') # Assuming 'data' folder is in the same directory\n", + "\n", + "\n" + ] +}, { - "cells": [ - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "kings_data = load_data('data/kc_house_data.csv')" - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "metadata": {}, - "outputs": [], - "source": [ - "# create a function that takes in a column and returns the column statistics as a dictionary\n", - "def descriptive_analytics(column):\n", - " stats_dict = column.describe().to_dict()\n", - " \n", - " print(\"Descriptive Statistics for Column '{}':\".format(column.name))\n", - " print(\"The count of the column is:\", stats_dict['count'])\n", - " print(\"The mean of the column is:\", stats_dict['mean'])\n", - " print(\"The standard deviation of the column is:\", stats_dict['std'])\n", - " print(\"The minimum value of the column is:\", stats_dict['min'])\n", - " print(\"The 25th percentile of the column is:\", stats_dict['25%'])\n", - " print(\"The median of the column is:\", stats_dict['50%'])\n", - " print(\"The 75th percentile of the column is:\", stats_dict['75%'])\n", - " print(\"The maximum value of the column is:\", stats_dict['max'])" - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Descriptive Statistics for Column 'price':\n", - "The count of the column is: 21597.0\n", - "The mean of the column is: 540296.5735055795\n", - "The standard deviation of the column is: 367368.1401013936\n", - "The minimum value of the column is: 78000.0\n", - "The 25th percentile of the column is: 322000.0\n", - "The median of the column is: 450000.0\n", - "The 75th percentile of the column is: 645000.0\n", - "The maximum value of the column is: 7700000.0\n" - ] - } - ], - "source": [ - "descriptive_analytics(kings_data['price'])" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can see that the maximum price of a house is $7,700,000 and the minimum price is $78,000.\n", - "\n", - "There are 21,597 prices regarding the houses in the dataset.\n", - "\n", - "The average price of a house is $540,296.57." - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "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.1" - } - }, - "nbformat": 4, - "nbformat_minor": 5, -"cells": [ - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n", - "RangeIndex: 21597 entries, 0 to 21596\n", - "Data columns (total 21 columns):\n", - " # Column Non-Null Count Dtype \n", - "--- ------ -------------- ----- \n", - " 0 id 21597 non-null int64 \n", - " 1 date 21597 non-null object \n", - " 2 price 21597 non-null float64\n", - " 3 bedrooms 21597 non-null int64 \n", - " 4 bathrooms 21597 non-null float64\n", - " 5 sqft_living 21597 non-null int64 \n", - " 6 sqft_lot 21597 non-null int64 \n", - " 7 floors 21597 non-null float64\n", - " 8 waterfront 19221 non-null object \n", - " 9 view 21534 non-null object \n", - " 10 condition 21597 non-null object \n", - " 11 grade 21597 non-null object \n", - " 12 sqft_above 21597 non-null int64 \n", - " 13 sqft_basement 21597 non-null object \n", - " 14 yr_built 21597 non-null int64 \n", - " 15 yr_renovated 17755 non-null float64\n", - " 16 zipcode 21597 non-null int64 \n", - " 17 lat 21597 non-null float64\n", - " 18 long 21597 non-null float64\n", - " 19 sqft_living15 21597 non-null int64 \n", - " 20 sqft_lot15 21597 non-null int64 \n", - "dtypes: float64(6), int64(9), object(6)\n", - "memory usage: 3.5+ MB\n" - ] - } - ], - "source": [ - "kings_data.info()" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "def identify_issues(dataset):\n", - " # Identify missing values as a percentage of the whole dataset\n", - " missing_values = (dataset.isnull().sum())/len(dataset) * 100\n", - "\n", - " # Identify duplicates\n", - " duplicates = dataset.duplicated().sum()\n", - " \n", - " #return a dictionary \n", - " return {'duplicates': duplicates,\n", - " 'missing values': missing_values.round(2)} \n" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'duplicates': 0,\n", - " 'missing values': {\n", - " 'id': 0.0,\n", - " 'date': 0.0,\n", - " 'price': 0.0,\n", - " 'bedrooms': 0.0,\n", - " 'bathrooms': 0.0,\n", - " 'sqft_living': 0.0,\n", - " 'sqft_lot': 0.0,\n", - " 'floors': 0.0,\n", - " 'waterfront': 11.0,\n", - " 'view': 0.29,\n", - " 'condition': 0.0,\n", - " 'grade': 0.0,\n", - " 'sqft_above': 0.0,\n", - " 'sqft_basement': 0.0,\n", - " 'yr_built': 0.0,\n", - " 'yr_renovated': 17.79,\n", - " 'zipcode': 0.0,\n", - " 'lat': 0.0,\n", - " 'long': 0.0,\n", - " 'sqft_living15': 0.0,\n", - " 'sqft_lot15': 0.0\n", - " }}" - ] - }, - "execution_count": 3, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "identify_issues(kings_data)" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [], - "source": [ - "house_data_clean = kings_data.copy()" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [], - "source": [ - "# Changing the date to date time\n", - "house_data_clean['date'] = pd.to_datetime(house_data_clean['date'])\n", - "\n", - "# Extracting only the year from the column Date\n", - "house_data_clean.date = house_data_clean['date'].dt.year\n", - "\n", - "# Changing the dates for the year built \n", - "house_data_clean['yr_built'] = pd.to_datetime(house_data_clean['yr_built'],format='%Y').dt.year\n" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [], - "source": [ - "def missing_values(dataset):\n", - " # drop the rows from views\n", - " dataset.dropna(subset=['view'],inplace=True)\n", - "\n", - " # Filling the NaN values for waterfront with NO\n", - " dataset.waterfront.fillna('NO',inplace=True)\n", - " \n", - " # Dropping the yr_renovated column \n", - " dataset.drop('yr_renovated',axis=1,inplace=True)" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [], - "source": [ - "missing_values(house_data_clean)" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'duplicates': 0,\n", - " 'missing values': id 0.00\n", - " date 0.00\n", - " price 0.00\n", - " bedrooms 0.00\n", - " bathrooms 0.00\n", - " sqft_living 0.00\n", - " sqft_lot 0.00\n", - " floors 0.00\n", - " waterfront 0.00\n", - " view 0.00\n", - " condition 0.00\n", - " grade 0.00\n", - " sqft_above 0.00\n", - " sqft_basement 0.00\n", - " yr_built 0.00\n", - " zipcode 0.00\n", - " lat 0.00\n", - " long 0.00\n", - " sqft_living15 0.00\n", - " sqft_lot15 0.00\n", - " dtype: float64}" - ] - }, - "execution_count": 8, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "identify_issues(house_data_clean)" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [], - "source": [ - "# Checking for duplicates in the dataset\n", - "house_data_clean[house_data_clean.duplicated()]" - ] + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The dataset contains 21 columns, each representing a distinct feature, and 21,597 rows, with each row corresponding to a specific house sale entry.\n", + "\n", + "The dataset contains a mix of data types, including integers (int64), floating-point numbers (float64), and objects (strings). For instance, numerical features such as bedrooms, bathrooms, and sqft_living are represented as integers or floating-point numbers to facilitate mathematical computations, while categorical features like waterfront and view are stored as objects to accommodate text-based categories." + ] }, { -"cells": [], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "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.8.11" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -}, \ No newline at end of file + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The dataset contains 21597 houses with 21 features\n", + "\n", + "Columns and their data types:\n", + "id: int64\n", + "date: object\n", + "price: float64\n", + "bedrooms: int64\n", + "bathrooms: float64\n", + "sqft_living: int64\n", + "sqft_lot: int64\n", + "floors: float64\n", + "waterfront: object\n", + "view: object\n", + "condition: object\n", + "grade: object\n", + "sqft_above: int64\n", + "sqft_basement: object\n", + "yr_built: int64\n", + "yr_renovated: float64\n", + "zipcode: int64\n", + "lat: float64\n", + "long: float64\n", + "sqft_living15: int64\n", + "sqft_lot15: int64\n", + "\n" + ] + } + ], + "source": [ + "kings_data = load_data('data/kc_house_data.csv')" + ] +}, +{ + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "#create a function that takes in a column and returns the column statistics as a dictionary\n", + "def descriptive_analytics(column):\n", + " stats_dict = column.describe().to_dict()\n", + " \n", + " print(\"Descriptive Statistics for Column '{}':\".format(column.name))\n", + " print(\"The count of the column is:\", stats_dict['count'])\n", + " print(\"The mean of the column is:\", stats_dict['mean'])\n", + " print(\"The standard deviation of the column is:\", stats_dict['std'])\n", + " print(\"The minimum value of the column is:\", stats_dict['min'])\n", + " print(\"The 25th percentile of the column is:\", stats_dict['25%'])\n", + " print(\"The median of the column is:\", stats_dict['50%'])\n", + " print(\"The 75th percentile of the column is:\", stats_dict['75%'])\n", + " print(\"The maximum value of the column is:\", stats_dict['max'])" + ] +}, +{ + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Descriptive Statistics for Column 'price':\n", + "The count of the column is: 21597.0\n", + "The mean of the column is: 540296.5735055795\n", + "The standard deviation of the column is: 367368.1401013936\n", + "The minimum value of the column is: 78000.0\n", + "The 25th percentile of the column is: 322000.0\n", + "The median of the column is: 450000.0\n", + "The 75th percentile of the column is: 645000.0\n", + "The maximum value of the column is: 7700000.0\n" + ] + } + ], + "source": [ + "descriptive_analytics(kings_data['price'])" + ] +}, +{ + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We can see that the maximum price of a house is 7700000 dollars and the minimum price is 78000 dollars\n", + "\n", + "There are 21597 prices regarding to the houses in the dataset\n", + "\n", + "Average price of a house is 540296.57 dollars" + ] +}, +{ + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Data Preperation\n", + "\n" + ] +}, +{ + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "RangeIndex: 21597 entries, 0 to 21596\n", + "Data columns (total 21 columns):\n", + " # Column Non-Null Count Dtype \n", + "--- ------ -------------- ----- \n", + " 0 id 21597 non-null int64 \n", + " 1 date 21597 non-null object \n", + " 2 price 21597 non-null float64\n", + " 3 bedrooms 21597 non-null int64 \n", + " 4 bathrooms 21597 non-null float64\n", + " 5 sqft_living 21597 non-null int64 \n", + " 6 sqft_lot 21597 non-null int64 \n", + " 7 floors 21597 non-null float64\n", + " 8 waterfront 19221 non-null object \n", + " 9 view 21534 non-null object \n", + " 10 condition 21597 non-null object \n", + " 11 grade 21597 non-null object \n", + " 12 sqft_above 21597 non-null int64 \n", + " 13 sqft_basement 21597 non-null object \n", + " 14 yr_built 21597 non-null int64 \n", + " 15 yr_renovated 17755 non-null float64\n", + " 16 zipcode 21597 non-null int64 \n", + " 17 lat 21597 non-null float64\n", + " 18 long 21597 non-null float64\n", + " 19 sqft_living15 21597 non-null int64 \n", + " 20 sqft_lot15 21597 non-null int64 \n", + "dtypes: float64(6), int64(9), object(6)\n", + "memory usage: 3.5+ MB\n" + ] + } + ], + "source": [ + "kings_data.info()" + ] +}, +{ + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [], + "source": [ + "def identify_issues(dataset):\n", + " # Identify missing values as a percentage of the whole dataset\n", + " missing_values = (dataset.isnull().sum())/len(dataset) * 100\n", + "\n", + " # Identify duplicates\n", + " duplicates = dataset.duplicated().sum()\n", + " \n", + " #return a dictionary \n", + " return {'duplicates': duplicates,\n", + " 'missing values': missing_values.round(2)} \n" + ] +}, +{ + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'duplicates': 0,\n", + " 'missing values': id 0.00\n", + " date 0.00\n", + " price 0.00\n", + " bedrooms 0.00\n", + " bathrooms 0.00\n", + " sqft_living 0.00\n", + " sqft_lot 0.00\n", + " floors 0.00\n", + " waterfront 11.00\n", + " view 0.29\n", + " condition 0.00\n", + " grade 0.00\n", + " sqft_above 0.00\n", + " sqft_basement 0.00\n", + " yr_built 0.00\n", + " yr_renovated 17.79\n", + " zipcode 0.00\n", + " lat 0.00\n", + " long 0.00\n", + " sqft_living15 0.00\n", + " sqft_lot15 0.00\n", + " dtype: float64}" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "identify_issues(kings_data)" + ] +}, +{ + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The examination indicates that there are no duplicate entries within the dataset, ensuring the integrity of the records. However, attention is warranted to address missing values present in certain columns. Specifically, the 'waterfront' feature exhibits 11% of null values, representing a negligible portion of the dataset. Similarly, the 'yr_renovated' feature shows a relatively higher percentage of missing values, accounting for approximately 17.79% of the dataset" + ] +}, +{ + "cell_type": "markdown", + "metadata": {}, + "source": [ + "##### Before making changes make a copy instead of overwriting data" + ] +}, +{ + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [], + "source": [ + "house_data_clean = kings_data.copy()" + ] +}, +{ + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [], + "source": [ + "# Changing the date to date time\n", + "house_data_clean['date'] = pd.to_datetime(house_data_clean['date'])\n", + "\n", + "# Extracting only the year from the column Date\n", + "house_data_clean.date = house_data_clean['date'].dt.year\n", + "\n", + "# Changing the dates for the year built \n", + "house_data_clean['yr_built'] = pd.to_datetime(house_data_clean['yr_built'],format='%Y').dt.year\n" + ] +}, +{ + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The above code converts the 'date' column data to only contain the year the house was sold, for the purpose of analysis we will use only the year since the changes month by month will be minor." + ] +}, +{ + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Dealing with the missing values" + ] +}, +{ + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [], + "source": [ + "def missing_values(dataset):\n", + " # drop the rows from views\n", + " dataset.dropna(subset=['view'],inplace=True)\n", + "\n", + " # Filling the NaN values for waterfront with NO\n", + " dataset.waterfront.fillna('NO',inplace=True)\n", + " \n", + " # Dropping the yr_renovated column \n", + " dataset.drop('yr_renovated',axis=1,inplace=True)" + ] +}, +{ + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [], + "source": [ + "missing_values(house_data_clean)" + ] +}, +{ + "cell_type": "markdown", + "metadata": {}, + "source": [ + "'yr_renovated' has the highest percentage of NaN values 17%. This will be dropped since it will not be used within our model inline with the business problem.\n", + "\n", + "'Waterfront' feature has 11% null values, this was filled with NO on the assumption that these cells were not filled since they lacked waterfronts\n", + "\n", + "For the 'View' column, the null values were dropped by row since the overall percentage impact would be minute" + ] +}, +{ + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'duplicates': 2,\n", + " 'missing values': id 0.0\n", + " date 0.0\n", + " price 0.0\n", + " bedrooms 0.0\n", + " bathrooms 0.0\n", + " sqft_living 0.0\n", + " sqft_lot 0.0\n", + " floors 0.0\n", + " waterfront 0.0\n", + " view 0.0\n", + " condition 0.0\n", + " grade 0.0\n", + " sqft_above 0.0\n", + " sqft_basement 0.0\n", + " yr_built 0.0\n", + " zipcode 0.0\n", + " lat 0.0\n", + " long 0.0\n", + " sqft_living15 0.0\n", + " sqft_lot15 0.0\n", + " dtype: float64}" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "identify_issues(house_data_clean)" + ] +}, +{ + "cell_type": "code", + "execution_count": 15, + "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", + "
iddatepricebedroomsbathroomssqft_livingsqft_lotfloorswaterfrontviewconditiongradesqft_abovesqft_basementyr_builtzipcodelatlongsqft_living15sqft_lot15
394718250690312014550000.041.75241084472.0NOGOODGood8 Good2060350.019369807447.6499-122.088252014789
2003886489001102014555000.032.50194032112.0NONONEAverage8 Good19400.020099802747.5644-122.09318803078
\n", + "
" + ], + "text/plain": [ + " id date price bedrooms bathrooms sqft_living sqft_lot \\\n", + "3947 1825069031 2014 550000.0 4 1.75 2410 8447 \n", + "20038 8648900110 2014 555000.0 3 2.50 1940 3211 \n", + "\n", + " floors waterfront view condition grade sqft_above sqft_basement \\\n", + "3947 2.0 NO GOOD Good 8 Good 2060 350.0 \n", + "20038 2.0 NO NONE Average 8 Good 1940 0.0 \n", + "\n", + " yr_built zipcode lat long sqft_living15 sqft_lot15 \n", + "3947 1936 98074 47.6499 -122.088 2520 14789 \n", + "20038 2009 98027 47.5644 -122.093 1880 3078 " + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "house_data_clean[house_data_clean.duplicated()]" + ] +} +], +"metadata": { +"kernelspec": { + "display_name": "Python 3", + "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.10.13" +} +}, +"nbformat": 4, +"nbformat_minor": 2 +} \ No newline at end of file From 100b23763477054240c5bc616607ac3214b4aece Mon Sep 17 00:00:00 2001 From: clydeochieng <107258512+clydeochieng@users.noreply.github.com> Date: Wed, 1 May 2024 11:55:26 +0300 Subject: [PATCH 39/42] Update student.ipynb --- student.ipynb | 1126 ++++++++++++++++++++++++------------------------- 1 file changed, 563 insertions(+), 563 deletions(-) diff --git a/student.ipynb b/student.ipynb index 3789754d..93177751 100644 --- a/student.ipynb +++ b/student.ipynb @@ -6,7 +6,7 @@ "source": [ "## Final Project Submission\n", "\n", - "* Student name: Solphine Joseph, Grace Rotich, Mathew Kiprotich, Hilary Simiyu, Clyde Ochieng. \n", + "* Student name: Solphine Joseph, Grace Rotich, Mathew Kiprotich, Hilary Simiyu, Clyde Ochieng, Derrick Kiptoo. \n", "* Student pace: full time\n", "* Scheduled project review date/time: \n", "* Instructor name: Nikita \n", @@ -467,566 +467,566 @@ "\n", "

21597 rows × 21 columns

\n", "" - ], - "text/plain": [ - " id date price bedrooms bathrooms sqft_living \\\n", - "0 7129300520 10/13/2014 221900.0 3 1.00 1180 \n", - "1 6414100192 12/9/2014 538000.0 3 2.25 2570 \n", - "2 5631500400 2/25/2015 180000.0 2 1.00 770 \n", - "3 2487200875 12/9/2014 604000.0 4 3.00 1960 \n", - "4 1954400510 2/18/2015 510000.0 3 2.00 1680 \n", - "... ... ... ... ... ... ... \n", - "21592 263000018 5/21/2014 360000.0 3 2.50 1530 \n", - "21593 6600060120 2/23/2015 400000.0 4 2.50 2310 \n", - "21594 1523300141 6/23/2014 402101.0 2 0.75 1020 \n", - "21595 291310100 1/16/2015 400000.0 3 2.50 1600 \n", - "21596 1523300157 10/15/2014 325000.0 2 0.75 1020 \n", - "\n", - " sqft_lot floors waterfront view ... grade sqft_above \\\n", - "0 5650 1.0 NaN NONE ... 7 Average 1180 \n", - "1 7242 2.0 NO NONE ... 7 Average 2170 \n", - "2 10000 1.0 NO NONE ... 6 Low Average 770 \n", - "3 5000 1.0 NO NONE ... 7 Average 1050 \n", - "4 8080 1.0 NO NONE ... 8 Good 1680 \n", - "... ... ... ... ... ... ... ... \n", - "21592 1131 3.0 NO NONE ... 8 Good 1530 \n", - "21593 5813 2.0 NO NONE ... 8 Good 2310 \n", - "21594 1350 2.0 NO NONE ... 7 Average 1020 \n", - "21595 2388 2.0 NaN NONE ... 8 Good 1600 \n", - "21596 1076 2.0 NO NONE ... 7 Average 1020 \n", - "\n", - " sqft_basement yr_built yr_renovated zipcode lat long \\\n", - "0 0.0 1955 0.0 98178 47.5112 -122.257 \n", - "1 400.0 1951 1991.0 98125 47.7210 -122.319 \n", - "2 0.0 1933 NaN 98028 47.7379 -122.233 \n", - "3 910.0 1965 0.0 98136 47.5208 -122.393 \n", - "4 0.0 1987 0.0 98074 47.6168 -122.045 \n", - "... ... ... ... ... ... ... \n", - "21592 0.0 2009 0.0 98103 47.6993 -122.346 \n", - "21593 0.0 2014 0.0 98146 47.5107 -122.362 \n", - "21594 0.0 2009 0.0 98144 47.5944 -122.299 \n", - "21595 0.0 2004 0.0 98027 47.5345 -122.069 \n", - "21596 0.0 2008 0.0 98144 47.5941 -122.299 \n", - "\n", - " sqft_living15 sqft_lot15 \n", - "0 1340 5650 \n", - "1 1690 7639 \n", - "2 2720 8062 \n", - "3 1360 5000 \n", - "4 1800 7503 \n", - "... ... ... \n", - "21592 1530 1509 \n", - "21593 1830 7200 \n", - "21594 1020 2007 \n", - "21595 1410 1287 \n", - "21596 1020 1357 \n", - "\n", - "[21597 rows x 21 columns]" - ] - }, - "execution_count": 3, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "load_data('data/kc_house_data.csv') # Assuming 'data' folder is in the same directory\n", - "\n", - "\n" - ] -}, -{ - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The dataset contains 21 columns, each representing a distinct feature, and 21,597 rows, with each row corresponding to a specific house sale entry.\n", - "\n", - "The dataset contains a mix of data types, including integers (int64), floating-point numbers (float64), and objects (strings). For instance, numerical features such as bedrooms, bathrooms, and sqft_living are represented as integers or floating-point numbers to facilitate mathematical computations, while categorical features like waterfront and view are stored as objects to accommodate text-based categories." - ] -}, -{ - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "The dataset contains 21597 houses with 21 features\n", - "\n", - "Columns and their data types:\n", - "id: int64\n", - "date: object\n", - "price: float64\n", - "bedrooms: int64\n", - "bathrooms: float64\n", - "sqft_living: int64\n", - "sqft_lot: int64\n", - "floors: float64\n", - "waterfront: object\n", - "view: object\n", - "condition: object\n", - "grade: object\n", - "sqft_above: int64\n", - "sqft_basement: object\n", - "yr_built: int64\n", - "yr_renovated: float64\n", - "zipcode: int64\n", - "lat: float64\n", - "long: float64\n", - "sqft_living15: int64\n", - "sqft_lot15: int64\n", - "\n" - ] - } - ], - "source": [ - "kings_data = load_data('data/kc_house_data.csv')" - ] -}, -{ - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [], - "source": [ - "#create a function that takes in a column and returns the column statistics as a dictionary\n", - "def descriptive_analytics(column):\n", - " stats_dict = column.describe().to_dict()\n", - " \n", - " print(\"Descriptive Statistics for Column '{}':\".format(column.name))\n", - " print(\"The count of the column is:\", stats_dict['count'])\n", - " print(\"The mean of the column is:\", stats_dict['mean'])\n", - " print(\"The standard deviation of the column is:\", stats_dict['std'])\n", - " print(\"The minimum value of the column is:\", stats_dict['min'])\n", - " print(\"The 25th percentile of the column is:\", stats_dict['25%'])\n", - " print(\"The median of the column is:\", stats_dict['50%'])\n", - " print(\"The 75th percentile of the column is:\", stats_dict['75%'])\n", - " print(\"The maximum value of the column is:\", stats_dict['max'])" - ] -}, -{ - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Descriptive Statistics for Column 'price':\n", - "The count of the column is: 21597.0\n", - "The mean of the column is: 540296.5735055795\n", - "The standard deviation of the column is: 367368.1401013936\n", - "The minimum value of the column is: 78000.0\n", - "The 25th percentile of the column is: 322000.0\n", - "The median of the column is: 450000.0\n", - "The 75th percentile of the column is: 645000.0\n", - "The maximum value of the column is: 7700000.0\n" - ] - } - ], - "source": [ - "descriptive_analytics(kings_data['price'])" - ] -}, -{ - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can see that the maximum price of a house is 7700000 dollars and the minimum price is 78000 dollars\n", - "\n", - "There are 21597 prices regarding to the houses in the dataset\n", - "\n", - "Average price of a house is 540296.57 dollars" - ] -}, -{ - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Data Preperation\n", - "\n" - ] -}, -{ - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n", - "RangeIndex: 21597 entries, 0 to 21596\n", - "Data columns (total 21 columns):\n", - " # Column Non-Null Count Dtype \n", - "--- ------ -------------- ----- \n", - " 0 id 21597 non-null int64 \n", - " 1 date 21597 non-null object \n", - " 2 price 21597 non-null float64\n", - " 3 bedrooms 21597 non-null int64 \n", - " 4 bathrooms 21597 non-null float64\n", - " 5 sqft_living 21597 non-null int64 \n", - " 6 sqft_lot 21597 non-null int64 \n", - " 7 floors 21597 non-null float64\n", - " 8 waterfront 19221 non-null object \n", - " 9 view 21534 non-null object \n", - " 10 condition 21597 non-null object \n", - " 11 grade 21597 non-null object \n", - " 12 sqft_above 21597 non-null int64 \n", - " 13 sqft_basement 21597 non-null object \n", - " 14 yr_built 21597 non-null int64 \n", - " 15 yr_renovated 17755 non-null float64\n", - " 16 zipcode 21597 non-null int64 \n", - " 17 lat 21597 non-null float64\n", - " 18 long 21597 non-null float64\n", - " 19 sqft_living15 21597 non-null int64 \n", - " 20 sqft_lot15 21597 non-null int64 \n", - "dtypes: float64(6), int64(9), object(6)\n", - "memory usage: 3.5+ MB\n" - ] - } - ], - "source": [ - "kings_data.info()" - ] -}, -{ - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [], - "source": [ - "def identify_issues(dataset):\n", - " # Identify missing values as a percentage of the whole dataset\n", - " missing_values = (dataset.isnull().sum())/len(dataset) * 100\n", - "\n", - " # Identify duplicates\n", - " duplicates = dataset.duplicated().sum()\n", - " \n", - " #return a dictionary \n", - " return {'duplicates': duplicates,\n", - " 'missing values': missing_values.round(2)} \n" - ] -}, -{ - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'duplicates': 0,\n", - " 'missing values': id 0.00\n", - " date 0.00\n", - " price 0.00\n", - " bedrooms 0.00\n", - " bathrooms 0.00\n", - " sqft_living 0.00\n", - " sqft_lot 0.00\n", - " floors 0.00\n", - " waterfront 11.00\n", - " view 0.29\n", - " condition 0.00\n", - " grade 0.00\n", - " sqft_above 0.00\n", - " sqft_basement 0.00\n", - " yr_built 0.00\n", - " yr_renovated 17.79\n", - " zipcode 0.00\n", - " lat 0.00\n", - " long 0.00\n", - " sqft_living15 0.00\n", - " sqft_lot15 0.00\n", - " dtype: float64}" - ] - }, - "execution_count": 9, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "identify_issues(kings_data)" - ] -}, -{ - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The examination indicates that there are no duplicate entries within the dataset, ensuring the integrity of the records. However, attention is warranted to address missing values present in certain columns. Specifically, the 'waterfront' feature exhibits 11% of null values, representing a negligible portion of the dataset. Similarly, the 'yr_renovated' feature shows a relatively higher percentage of missing values, accounting for approximately 17.79% of the dataset" - ] -}, -{ - "cell_type": "markdown", - "metadata": {}, - "source": [ - "##### Before making changes make a copy instead of overwriting data" - ] -}, -{ - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [], - "source": [ - "house_data_clean = kings_data.copy()" - ] -}, -{ - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [], - "source": [ - "# Changing the date to date time\n", - "house_data_clean['date'] = pd.to_datetime(house_data_clean['date'])\n", - "\n", - "# Extracting only the year from the column Date\n", - "house_data_clean.date = house_data_clean['date'].dt.year\n", - "\n", - "# Changing the dates for the year built \n", - "house_data_clean['yr_built'] = pd.to_datetime(house_data_clean['yr_built'],format='%Y').dt.year\n" - ] -}, -{ - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The above code converts the 'date' column data to only contain the year the house was sold, for the purpose of analysis we will use only the year since the changes month by month will be minor." - ] -}, -{ - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### Dealing with the missing values" - ] -}, -{ - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [], - "source": [ - "def missing_values(dataset):\n", - " # drop the rows from views\n", - " dataset.dropna(subset=['view'],inplace=True)\n", - "\n", - " # Filling the NaN values for waterfront with NO\n", - " dataset.waterfront.fillna('NO',inplace=True)\n", - " \n", - " # Dropping the yr_renovated column \n", - " dataset.drop('yr_renovated',axis=1,inplace=True)" - ] -}, -{ - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [], - "source": [ - "missing_values(house_data_clean)" - ] -}, -{ - "cell_type": "markdown", - "metadata": {}, - "source": [ - "'yr_renovated' has the highest percentage of NaN values 17%. This will be dropped since it will not be used within our model inline with the business problem.\n", - "\n", - "'Waterfront' feature has 11% null values, this was filled with NO on the assumption that these cells were not filled since they lacked waterfronts\n", - "\n", - "For the 'View' column, the null values were dropped by row since the overall percentage impact would be minute" - ] -}, -{ - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'duplicates': 2,\n", - " 'missing values': id 0.0\n", - " date 0.0\n", - " price 0.0\n", - " bedrooms 0.0\n", - " bathrooms 0.0\n", - " sqft_living 0.0\n", - " sqft_lot 0.0\n", - " floors 0.0\n", - " waterfront 0.0\n", - " view 0.0\n", - " condition 0.0\n", - " grade 0.0\n", - " sqft_above 0.0\n", - " sqft_basement 0.0\n", - " yr_built 0.0\n", - " zipcode 0.0\n", - " lat 0.0\n", - " long 0.0\n", - " sqft_living15 0.0\n", - " sqft_lot15 0.0\n", - " dtype: float64}" - ] - }, - "execution_count": 14, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "identify_issues(house_data_clean)" - ] -}, -{ - "cell_type": "code", - "execution_count": 15, - "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", - "
iddatepricebedroomsbathroomssqft_livingsqft_lotfloorswaterfrontviewconditiongradesqft_abovesqft_basementyr_builtzipcodelatlongsqft_living15sqft_lot15
394718250690312014550000.041.75241084472.0NOGOODGood8 Good2060350.019369807447.6499-122.088252014789
2003886489001102014555000.032.50194032112.0NONONEAverage8 Good19400.020099802747.5644-122.09318803078
\n", - "
" - ], - "text/plain": [ - " id date price bedrooms bathrooms sqft_living sqft_lot \\\n", - "3947 1825069031 2014 550000.0 4 1.75 2410 8447 \n", - "20038 8648900110 2014 555000.0 3 2.50 1940 3211 \n", - "\n", - " floors waterfront view condition grade sqft_above sqft_basement \\\n", - "3947 2.0 NO GOOD Good 8 Good 2060 350.0 \n", - "20038 2.0 NO NONE Average 8 Good 1940 0.0 \n", - "\n", - " yr_built zipcode lat long sqft_living15 sqft_lot15 \n", - "3947 1936 98074 47.6499 -122.088 2520 14789 \n", - "20038 2009 98027 47.5644 -122.093 1880 3078 " - ] - }, - "execution_count": 15, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "house_data_clean[house_data_clean.duplicated()]" - ] -} -], -"metadata": { -"kernelspec": { - "display_name": "Python 3", - "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.10.13" + ], + "text/plain": [ + " id date price bedrooms bathrooms sqft_living \\\n", + "0 7129300520 10/13/2014 221900.0 3 1.00 1180 \n", + "1 6414100192 12/9/2014 538000.0 3 2.25 2570 \n", + "2 5631500400 2/25/2015 180000.0 2 1.00 770 \n", + "3 2487200875 12/9/2014 604000.0 4 3.00 1960 \n", + "4 1954400510 2/18/2015 510000.0 3 2.00 1680 \n", + "... ... ... ... ... ... ... \n", + "21592 263000018 5/21/2014 360000.0 3 2.50 1530 \n", + "21593 6600060120 2/23/2015 400000.0 4 2.50 2310 \n", + "21594 1523300141 6/23/2014 402101.0 2 0.75 1020 \n", + "21595 291310100 1/16/2015 400000.0 3 2.50 1600 \n", + "21596 1523300157 10/15/2014 325000.0 2 0.75 1020 \n", + "\n", + " sqft_lot floors waterfront view ... grade sqft_above \\\n", + "0 5650 1.0 NaN NONE ... 7 Average 1180 \n", + "1 7242 2.0 NO NONE ... 7 Average 2170 \n", + "2 10000 1.0 NO NONE ... 6 Low Average 770 \n", + "3 5000 1.0 NO NONE ... 7 Average 1050 \n", + "4 8080 1.0 NO NONE ... 8 Good 1680 \n", + "... ... ... ... ... ... ... ... \n", + "21592 1131 3.0 NO NONE ... 8 Good 1530 \n", + "21593 5813 2.0 NO NONE ... 8 Good 2310 \n", + "21594 1350 2.0 NO NONE ... 7 Average 1020 \n", + "21595 2388 2.0 NaN NONE ... 8 Good 1600 \n", + "21596 1076 2.0 NO NONE ... 7 Average 1020 \n", + "\n", + " sqft_basement yr_built yr_renovated zipcode lat long \\\n", + "0 0.0 1955 0.0 98178 47.5112 -122.257 \n", + "1 400.0 1951 1991.0 98125 47.7210 -122.319 \n", + "2 0.0 1933 NaN 98028 47.7379 -122.233 \n", + "3 910.0 1965 0.0 98136 47.5208 -122.393 \n", + "4 0.0 1987 0.0 98074 47.6168 -122.045 \n", + "... ... ... ... ... ... ... \n", + "21592 0.0 2009 0.0 98103 47.6993 -122.346 \n", + "21593 0.0 2014 0.0 98146 47.5107 -122.362 \n", + "21594 0.0 2009 0.0 98144 47.5944 -122.299 \n", + "21595 0.0 2004 0.0 98027 47.5345 -122.069 \n", + "21596 0.0 2008 0.0 98144 47.5941 -122.299 \n", + "\n", + " sqft_living15 sqft_lot15 \n", + "0 1340 5650 \n", + "1 1690 7639 \n", + "2 2720 8062 \n", + "3 1360 5000 \n", + "4 1800 7503 \n", + "... ... ... \n", + "21592 1530 1509 \n", + "21593 1830 7200 \n", + "21594 1020 2007 \n", + "21595 1410 1287 \n", + "21596 1020 1357 \n", + "\n", + "[21597 rows x 21 columns]" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "load_data('data/kc_house_data.csv') # Assuming 'data' folder is in the same directory\n", + "\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The dataset contains 21 columns, each representing a distinct feature, and 21,597 rows, with each row corresponding to a specific house sale entry.\n", + "\n", + "The dataset contains a mix of data types, including integers (int64), floating-point numbers (float64), and objects (strings). For instance, numerical features such as bedrooms, bathrooms, and sqft_living are represented as integers or floating-point numbers to facilitate mathematical computations, while categorical features like waterfront and view are stored as objects to accommodate text-based categories." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The dataset contains 21597 houses with 21 features\n", + "\n", + "Columns and their data types:\n", + "id: int64\n", + "date: object\n", + "price: float64\n", + "bedrooms: int64\n", + "bathrooms: float64\n", + "sqft_living: int64\n", + "sqft_lot: int64\n", + "floors: float64\n", + "waterfront: object\n", + "view: object\n", + "condition: object\n", + "grade: object\n", + "sqft_above: int64\n", + "sqft_basement: object\n", + "yr_built: int64\n", + "yr_renovated: float64\n", + "zipcode: int64\n", + "lat: float64\n", + "long: float64\n", + "sqft_living15: int64\n", + "sqft_lot15: int64\n", + "\n" + ] + } + ], + "source": [ + "kings_data = load_data('data/kc_house_data.csv')" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "#create a function that takes in a column and returns the column statistics as a dictionary\n", + "def descriptive_analytics(column):\n", + " stats_dict = column.describe().to_dict()\n", + " \n", + " print(\"Descriptive Statistics for Column '{}':\".format(column.name))\n", + " print(\"The count of the column is:\", stats_dict['count'])\n", + " print(\"The mean of the column is:\", stats_dict['mean'])\n", + " print(\"The standard deviation of the column is:\", stats_dict['std'])\n", + " print(\"The minimum value of the column is:\", stats_dict['min'])\n", + " print(\"The 25th percentile of the column is:\", stats_dict['25%'])\n", + " print(\"The median of the column is:\", stats_dict['50%'])\n", + " print(\"The 75th percentile of the column is:\", stats_dict['75%'])\n", + " print(\"The maximum value of the column is:\", stats_dict['max'])" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Descriptive Statistics for Column 'price':\n", + "The count of the column is: 21597.0\n", + "The mean of the column is: 540296.5735055795\n", + "The standard deviation of the column is: 367368.1401013936\n", + "The minimum value of the column is: 78000.0\n", + "The 25th percentile of the column is: 322000.0\n", + "The median of the column is: 450000.0\n", + "The 75th percentile of the column is: 645000.0\n", + "The maximum value of the column is: 7700000.0\n" + ] + } + ], + "source": [ + "descriptive_analytics(kings_data['price'])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We can see that the maximum price of a house is 7700000 dollars and the minimum price is 78000 dollars\n", + "\n", + "There are 21597 prices regarding to the houses in the dataset\n", + "\n", + "Average price of a house is 540296.57 dollars" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Data Preperation\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "RangeIndex: 21597 entries, 0 to 21596\n", + "Data columns (total 21 columns):\n", + " # Column Non-Null Count Dtype \n", + "--- ------ -------------- ----- \n", + " 0 id 21597 non-null int64 \n", + " 1 date 21597 non-null object \n", + " 2 price 21597 non-null float64\n", + " 3 bedrooms 21597 non-null int64 \n", + " 4 bathrooms 21597 non-null float64\n", + " 5 sqft_living 21597 non-null int64 \n", + " 6 sqft_lot 21597 non-null int64 \n", + " 7 floors 21597 non-null float64\n", + " 8 waterfront 19221 non-null object \n", + " 9 view 21534 non-null object \n", + " 10 condition 21597 non-null object \n", + " 11 grade 21597 non-null object \n", + " 12 sqft_above 21597 non-null int64 \n", + " 13 sqft_basement 21597 non-null object \n", + " 14 yr_built 21597 non-null int64 \n", + " 15 yr_renovated 17755 non-null float64\n", + " 16 zipcode 21597 non-null int64 \n", + " 17 lat 21597 non-null float64\n", + " 18 long 21597 non-null float64\n", + " 19 sqft_living15 21597 non-null int64 \n", + " 20 sqft_lot15 21597 non-null int64 \n", + "dtypes: float64(6), int64(9), object(6)\n", + "memory usage: 3.5+ MB\n" + ] + } + ], + "source": [ + "kings_data.info()" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [], + "source": [ + "def identify_issues(dataset):\n", + " # Identify missing values as a percentage of the whole dataset\n", + " missing_values = (dataset.isnull().sum())/len(dataset) * 100\n", + "\n", + " # Identify duplicates\n", + " duplicates = dataset.duplicated().sum()\n", + " \n", + " #return a dictionary \n", + " return {'duplicates': duplicates,\n", + " 'missing values': missing_values.round(2)} \n" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'duplicates': 0,\n", + " 'missing values': id 0.00\n", + " date 0.00\n", + " price 0.00\n", + " bedrooms 0.00\n", + " bathrooms 0.00\n", + " sqft_living 0.00\n", + " sqft_lot 0.00\n", + " floors 0.00\n", + " waterfront 11.00\n", + " view 0.29\n", + " condition 0.00\n", + " grade 0.00\n", + " sqft_above 0.00\n", + " sqft_basement 0.00\n", + " yr_built 0.00\n", + " yr_renovated 17.79\n", + " zipcode 0.00\n", + " lat 0.00\n", + " long 0.00\n", + " sqft_living15 0.00\n", + " sqft_lot15 0.00\n", + " dtype: float64}" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "identify_issues(kings_data)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The examination indicates that there are no duplicate entries within the dataset, ensuring the integrity of the records. However, attention is warranted to address missing values present in certain columns. Specifically, the 'waterfront' feature exhibits 11% of null values, representing a negligible portion of the dataset. Similarly, the 'yr_renovated' feature shows a relatively higher percentage of missing values, accounting for approximately 17.79% of the dataset" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "##### Before making changes make a copy instead of overwriting data" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [], + "source": [ + "house_data_clean = kings_data.copy()" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [], + "source": [ + "# Changing the date to date time\n", + "house_data_clean['date'] = pd.to_datetime(house_data_clean['date'])\n", + "\n", + "# Extracting only the year from the column Date\n", + "house_data_clean.date = house_data_clean['date'].dt.year\n", + "\n", + "# Changing the dates for the year built \n", + "house_data_clean['yr_built'] = pd.to_datetime(house_data_clean['yr_built'],format='%Y').dt.year\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The above code converts the 'date' column data to only contain the year the house was sold, for the purpose of analysis we will use only the year since the changes month by month will be minor." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Dealing with the missing values" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [], + "source": [ + "def missing_values(dataset):\n", + " # drop the rows from views\n", + " dataset.dropna(subset=['view'],inplace=True)\n", + "\n", + " # Filling the NaN values for waterfront with NO\n", + " dataset.waterfront.fillna('NO',inplace=True)\n", + " \n", + " # Dropping the yr_renovated column \n", + " dataset.drop('yr_renovated',axis=1,inplace=True)" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [], + "source": [ + "missing_values(house_data_clean)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "'yr_renovated' has the highest percentage of NaN values 17%. This will be dropped since it will not be used within our model inline with the business problem.\n", + "\n", + "'Waterfront' feature has 11% null values, this was filled with NO on the assumption that these cells were not filled since they lacked waterfronts\n", + "\n", + "For the 'View' column, the null values were dropped by row since the overall percentage impact would be minute" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'duplicates': 2,\n", + " 'missing values': id 0.0\n", + " date 0.0\n", + " price 0.0\n", + " bedrooms 0.0\n", + " bathrooms 0.0\n", + " sqft_living 0.0\n", + " sqft_lot 0.0\n", + " floors 0.0\n", + " waterfront 0.0\n", + " view 0.0\n", + " condition 0.0\n", + " grade 0.0\n", + " sqft_above 0.0\n", + " sqft_basement 0.0\n", + " yr_built 0.0\n", + " zipcode 0.0\n", + " lat 0.0\n", + " long 0.0\n", + " sqft_living15 0.0\n", + " sqft_lot15 0.0\n", + " dtype: float64}" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "identify_issues(house_data_clean)" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "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", + "
iddatepricebedroomsbathroomssqft_livingsqft_lotfloorswaterfrontviewconditiongradesqft_abovesqft_basementyr_builtzipcodelatlongsqft_living15sqft_lot15
394718250690312014550000.041.75241084472.0NOGOODGood8 Good2060350.019369807447.6499-122.088252014789
2003886489001102014555000.032.50194032112.0NONONEAverage8 Good19400.020099802747.5644-122.09318803078
\n", + "
" + ], + "text/plain": [ + " id date price bedrooms bathrooms sqft_living sqft_lot \\\n", + "3947 1825069031 2014 550000.0 4 1.75 2410 8447 \n", + "20038 8648900110 2014 555000.0 3 2.50 1940 3211 \n", + "\n", + " floors waterfront view condition grade sqft_above sqft_basement \\\n", + "3947 2.0 NO GOOD Good 8 Good 2060 350.0 \n", + "20038 2.0 NO NONE Average 8 Good 1940 0.0 \n", + "\n", + " yr_built zipcode lat long sqft_living15 sqft_lot15 \n", + "3947 1936 98074 47.6499 -122.088 2520 14789 \n", + "20038 2009 98027 47.5644 -122.093 1880 3078 " + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "house_data_clean[house_data_clean.duplicated()]" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "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.10.13" + } + }, + "nbformat": 4, + "nbformat_minor": 2 } -}, -"nbformat": 4, -"nbformat_minor": 2 -} \ No newline at end of file From 2353438227239a869e32885e97d7b037bd7e9089 Mon Sep 17 00:00:00 2001 From: clydeochieng <107258512+clydeochieng@users.noreply.github.com> Date: Wed, 1 May 2024 12:00:03 +0300 Subject: [PATCH 40/42] Update student.ipynb --- student.ipynb | 1150 +++++++++++++++++++++++++------------------------ 1 file changed, 586 insertions(+), 564 deletions(-) diff --git a/student.ipynb b/student.ipynb index 4a29c2f7..24625738 100644 --- a/student.ipynb +++ b/student.ipynb @@ -6,7 +6,7 @@ "source": [ "## Final Project Submission\n", "\n", - "* Student name: Solphine Joseph, Grace Rotich, Mathew Kiprotich, Hilary Simiyu, Clyde Ochieng. \n", + "* Student name: Solphine Joseph, Grace Rotich, Mathew Kiprotich, Hilary Simiyu, Clyde Ochieng, Derrick Kiptoo. \n", "* Student pace: full time\n", "* Scheduled project review date/time: \n", "* Instructor name: Nikita \n", @@ -93,9 +93,31 @@ "\n" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Import Necessary Libraries" + ] + }, { "cell_type": "code", - "execution_count": null, + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "import matplotlib.pyplot as plt\n", + "%matplotlib inline\n", + "import numpy as np\n", + "import pandas as pd\n", + "import scipy.stats as stats\n", + "import seaborn as sns\n", + "import statsmodels.api as sm" + ] + }, + { + "cell_type": "code", + "execution_count": 2, "metadata": {}, "outputs": [], "source": [ @@ -467,566 +489,566 @@ "\n", "

21597 rows × 21 columns

\n", "" - ], - "text/plain": [ - " id date price bedrooms bathrooms sqft_living \\\n", - "0 7129300520 10/13/2014 221900.0 3 1.00 1180 \n", - "1 6414100192 12/9/2014 538000.0 3 2.25 2570 \n", - "2 5631500400 2/25/2015 180000.0 2 1.00 770 \n", - "3 2487200875 12/9/2014 604000.0 4 3.00 1960 \n", - "4 1954400510 2/18/2015 510000.0 3 2.00 1680 \n", - "... ... ... ... ... ... ... \n", - "21592 263000018 5/21/2014 360000.0 3 2.50 1530 \n", - "21593 6600060120 2/23/2015 400000.0 4 2.50 2310 \n", - "21594 1523300141 6/23/2014 402101.0 2 0.75 1020 \n", - "21595 291310100 1/16/2015 400000.0 3 2.50 1600 \n", - "21596 1523300157 10/15/2014 325000.0 2 0.75 1020 \n", - "\n", - " sqft_lot floors waterfront view ... grade sqft_above \\\n", - "0 5650 1.0 NaN NONE ... 7 Average 1180 \n", - "1 7242 2.0 NO NONE ... 7 Average 2170 \n", - "2 10000 1.0 NO NONE ... 6 Low Average 770 \n", - "3 5000 1.0 NO NONE ... 7 Average 1050 \n", - "4 8080 1.0 NO NONE ... 8 Good 1680 \n", - "... ... ... ... ... ... ... ... \n", - "21592 1131 3.0 NO NONE ... 8 Good 1530 \n", - "21593 5813 2.0 NO NONE ... 8 Good 2310 \n", - "21594 1350 2.0 NO NONE ... 7 Average 1020 \n", - "21595 2388 2.0 NaN NONE ... 8 Good 1600 \n", - "21596 1076 2.0 NO NONE ... 7 Average 1020 \n", - "\n", - " sqft_basement yr_built yr_renovated zipcode lat long \\\n", - "0 0.0 1955 0.0 98178 47.5112 -122.257 \n", - "1 400.0 1951 1991.0 98125 47.7210 -122.319 \n", - "2 0.0 1933 NaN 98028 47.7379 -122.233 \n", - "3 910.0 1965 0.0 98136 47.5208 -122.393 \n", - "4 0.0 1987 0.0 98074 47.6168 -122.045 \n", - "... ... ... ... ... ... ... \n", - "21592 0.0 2009 0.0 98103 47.6993 -122.346 \n", - "21593 0.0 2014 0.0 98146 47.5107 -122.362 \n", - "21594 0.0 2009 0.0 98144 47.5944 -122.299 \n", - "21595 0.0 2004 0.0 98027 47.5345 -122.069 \n", - "21596 0.0 2008 0.0 98144 47.5941 -122.299 \n", - "\n", - " sqft_living15 sqft_lot15 \n", - "0 1340 5650 \n", - "1 1690 7639 \n", - "2 2720 8062 \n", - "3 1360 5000 \n", - "4 1800 7503 \n", - "... ... ... \n", - "21592 1530 1509 \n", - "21593 1830 7200 \n", - "21594 1020 2007 \n", - "21595 1410 1287 \n", - "21596 1020 1357 \n", - "\n", - "[21597 rows x 21 columns]" - ] - }, - "execution_count": 3, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "load_data('data/kc_house_data.csv') # Assuming 'data' folder is in the same directory\n", - "\n", - "\n" - ] -}, -{ - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The dataset contains 21 columns, each representing a distinct feature, and 21,597 rows, with each row corresponding to a specific house sale entry.\n", - "\n", - "The dataset contains a mix of data types, including integers (int64), floating-point numbers (float64), and objects (strings). For instance, numerical features such as bedrooms, bathrooms, and sqft_living are represented as integers or floating-point numbers to facilitate mathematical computations, while categorical features like waterfront and view are stored as objects to accommodate text-based categories." - ] -}, -{ - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "The dataset contains 21597 houses with 21 features\n", - "\n", - "Columns and their data types:\n", - "id: int64\n", - "date: object\n", - "price: float64\n", - "bedrooms: int64\n", - "bathrooms: float64\n", - "sqft_living: int64\n", - "sqft_lot: int64\n", - "floors: float64\n", - "waterfront: object\n", - "view: object\n", - "condition: object\n", - "grade: object\n", - "sqft_above: int64\n", - "sqft_basement: object\n", - "yr_built: int64\n", - "yr_renovated: float64\n", - "zipcode: int64\n", - "lat: float64\n", - "long: float64\n", - "sqft_living15: int64\n", - "sqft_lot15: int64\n", - "\n" - ] - } - ], - "source": [ - "kings_data = load_data('data/kc_house_data.csv')" - ] -}, -{ - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [], - "source": [ - "#create a function that takes in a column and returns the column statistics as a dictionary\n", - "def descriptive_analytics(column):\n", - " stats_dict = column.describe().to_dict()\n", - " \n", - " print(\"Descriptive Statistics for Column '{}':\".format(column.name))\n", - " print(\"The count of the column is:\", stats_dict['count'])\n", - " print(\"The mean of the column is:\", stats_dict['mean'])\n", - " print(\"The standard deviation of the column is:\", stats_dict['std'])\n", - " print(\"The minimum value of the column is:\", stats_dict['min'])\n", - " print(\"The 25th percentile of the column is:\", stats_dict['25%'])\n", - " print(\"The median of the column is:\", stats_dict['50%'])\n", - " print(\"The 75th percentile of the column is:\", stats_dict['75%'])\n", - " print(\"The maximum value of the column is:\", stats_dict['max'])" - ] -}, -{ - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Descriptive Statistics for Column 'price':\n", - "The count of the column is: 21597.0\n", - "The mean of the column is: 540296.5735055795\n", - "The standard deviation of the column is: 367368.1401013936\n", - "The minimum value of the column is: 78000.0\n", - "The 25th percentile of the column is: 322000.0\n", - "The median of the column is: 450000.0\n", - "The 75th percentile of the column is: 645000.0\n", - "The maximum value of the column is: 7700000.0\n" - ] - } - ], - "source": [ - "descriptive_analytics(kings_data['price'])" - ] -}, -{ - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can see that the maximum price of a house is 7700000 dollars and the minimum price is 78000 dollars\n", - "\n", - "There are 21597 prices regarding to the houses in the dataset\n", - "\n", - "Average price of a house is 540296.57 dollars" - ] -}, -{ - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Data Preperation\n", - "\n" - ] -}, -{ - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n", - "RangeIndex: 21597 entries, 0 to 21596\n", - "Data columns (total 21 columns):\n", - " # Column Non-Null Count Dtype \n", - "--- ------ -------------- ----- \n", - " 0 id 21597 non-null int64 \n", - " 1 date 21597 non-null object \n", - " 2 price 21597 non-null float64\n", - " 3 bedrooms 21597 non-null int64 \n", - " 4 bathrooms 21597 non-null float64\n", - " 5 sqft_living 21597 non-null int64 \n", - " 6 sqft_lot 21597 non-null int64 \n", - " 7 floors 21597 non-null float64\n", - " 8 waterfront 19221 non-null object \n", - " 9 view 21534 non-null object \n", - " 10 condition 21597 non-null object \n", - " 11 grade 21597 non-null object \n", - " 12 sqft_above 21597 non-null int64 \n", - " 13 sqft_basement 21597 non-null object \n", - " 14 yr_built 21597 non-null int64 \n", - " 15 yr_renovated 17755 non-null float64\n", - " 16 zipcode 21597 non-null int64 \n", - " 17 lat 21597 non-null float64\n", - " 18 long 21597 non-null float64\n", - " 19 sqft_living15 21597 non-null int64 \n", - " 20 sqft_lot15 21597 non-null int64 \n", - "dtypes: float64(6), int64(9), object(6)\n", - "memory usage: 3.5+ MB\n" - ] - } - ], - "source": [ - "kings_data.info()" - ] -}, -{ - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [], - "source": [ - "def identify_issues(dataset):\n", - " # Identify missing values as a percentage of the whole dataset\n", - " missing_values = (dataset.isnull().sum())/len(dataset) * 100\n", - "\n", - " # Identify duplicates\n", - " duplicates = dataset.duplicated().sum()\n", - " \n", - " #return a dictionary \n", - " return {'duplicates': duplicates,\n", - " 'missing values': missing_values.round(2)} \n" - ] -}, -{ - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'duplicates': 0,\n", - " 'missing values': id 0.00\n", - " date 0.00\n", - " price 0.00\n", - " bedrooms 0.00\n", - " bathrooms 0.00\n", - " sqft_living 0.00\n", - " sqft_lot 0.00\n", - " floors 0.00\n", - " waterfront 11.00\n", - " view 0.29\n", - " condition 0.00\n", - " grade 0.00\n", - " sqft_above 0.00\n", - " sqft_basement 0.00\n", - " yr_built 0.00\n", - " yr_renovated 17.79\n", - " zipcode 0.00\n", - " lat 0.00\n", - " long 0.00\n", - " sqft_living15 0.00\n", - " sqft_lot15 0.00\n", - " dtype: float64}" - ] - }, - "execution_count": 9, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "identify_issues(kings_data)" - ] -}, -{ - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The examination indicates that there are no duplicate entries within the dataset, ensuring the integrity of the records. However, attention is warranted to address missing values present in certain columns. Specifically, the 'waterfront' feature exhibits 11% of null values, representing a negligible portion of the dataset. Similarly, the 'yr_renovated' feature shows a relatively higher percentage of missing values, accounting for approximately 17.79% of the dataset" - ] -}, -{ - "cell_type": "markdown", - "metadata": {}, - "source": [ - "##### Before making changes make a copy instead of overwriting data" - ] -}, -{ - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [], - "source": [ - "house_data_clean = kings_data.copy()" - ] -}, -{ - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [], - "source": [ - "# Changing the date to date time\n", - "house_data_clean['date'] = pd.to_datetime(house_data_clean['date'])\n", - "\n", - "# Extracting only the year from the column Date\n", - "house_data_clean.date = house_data_clean['date'].dt.year\n", - "\n", - "# Changing the dates for the year built \n", - "house_data_clean['yr_built'] = pd.to_datetime(house_data_clean['yr_built'],format='%Y').dt.year\n" - ] -}, -{ - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The above code converts the 'date' column data to only contain the year the house was sold, for the purpose of analysis we will use only the year since the changes month by month will be minor." - ] -}, -{ - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### Dealing with the missing values" - ] -}, -{ - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [], - "source": [ - "def missing_values(dataset):\n", - " # drop the rows from views\n", - " dataset.dropna(subset=['view'],inplace=True)\n", - "\n", - " # Filling the NaN values for waterfront with NO\n", - " dataset.waterfront.fillna('NO',inplace=True)\n", - " \n", - " # Dropping the yr_renovated column \n", - " dataset.drop('yr_renovated',axis=1,inplace=True)" - ] -}, -{ - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [], - "source": [ - "missing_values(house_data_clean)" - ] -}, -{ - "cell_type": "markdown", - "metadata": {}, - "source": [ - "'yr_renovated' has the highest percentage of NaN values 17%. This will be dropped since it will not be used within our model inline with the business problem.\n", - "\n", - "'Waterfront' feature has 11% null values, this was filled with NO on the assumption that these cells were not filled since they lacked waterfronts\n", - "\n", - "For the 'View' column, the null values were dropped by row since the overall percentage impact would be minute" - ] -}, -{ - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'duplicates': 2,\n", - " 'missing values': id 0.0\n", - " date 0.0\n", - " price 0.0\n", - " bedrooms 0.0\n", - " bathrooms 0.0\n", - " sqft_living 0.0\n", - " sqft_lot 0.0\n", - " floors 0.0\n", - " waterfront 0.0\n", - " view 0.0\n", - " condition 0.0\n", - " grade 0.0\n", - " sqft_above 0.0\n", - " sqft_basement 0.0\n", - " yr_built 0.0\n", - " zipcode 0.0\n", - " lat 0.0\n", - " long 0.0\n", - " sqft_living15 0.0\n", - " sqft_lot15 0.0\n", - " dtype: float64}" - ] - }, - "execution_count": 14, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "identify_issues(house_data_clean)" - ] -}, -{ - "cell_type": "code", - "execution_count": 15, - "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", - "
iddatepricebedroomsbathroomssqft_livingsqft_lotfloorswaterfrontviewconditiongradesqft_abovesqft_basementyr_builtzipcodelatlongsqft_living15sqft_lot15
394718250690312014550000.041.75241084472.0NOGOODGood8 Good2060350.019369807447.6499-122.088252014789
2003886489001102014555000.032.50194032112.0NONONEAverage8 Good19400.020099802747.5644-122.09318803078
\n", - "
" - ], - "text/plain": [ - " id date price bedrooms bathrooms sqft_living sqft_lot \\\n", - "3947 1825069031 2014 550000.0 4 1.75 2410 8447 \n", - "20038 8648900110 2014 555000.0 3 2.50 1940 3211 \n", - "\n", - " floors waterfront view condition grade sqft_above sqft_basement \\\n", - "3947 2.0 NO GOOD Good 8 Good 2060 350.0 \n", - "20038 2.0 NO NONE Average 8 Good 1940 0.0 \n", - "\n", - " yr_built zipcode lat long sqft_living15 sqft_lot15 \n", - "3947 1936 98074 47.6499 -122.088 2520 14789 \n", - "20038 2009 98027 47.5644 -122.093 1880 3078 " - ] - }, - "execution_count": 15, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "house_data_clean[house_data_clean.duplicated()]" - ] -} -], -"metadata": { -"kernelspec": { - "display_name": "Python 3", - "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.10.13" -} -}, -"nbformat": 4, -"nbformat_minor": 2 + ], + "text/plain": [ + " id date price bedrooms bathrooms sqft_living \\\n", + "0 7129300520 10/13/2014 221900.0 3 1.00 1180 \n", + "1 6414100192 12/9/2014 538000.0 3 2.25 2570 \n", + "2 5631500400 2/25/2015 180000.0 2 1.00 770 \n", + "3 2487200875 12/9/2014 604000.0 4 3.00 1960 \n", + "4 1954400510 2/18/2015 510000.0 3 2.00 1680 \n", + "... ... ... ... ... ... ... \n", + "21592 263000018 5/21/2014 360000.0 3 2.50 1530 \n", + "21593 6600060120 2/23/2015 400000.0 4 2.50 2310 \n", + "21594 1523300141 6/23/2014 402101.0 2 0.75 1020 \n", + "21595 291310100 1/16/2015 400000.0 3 2.50 1600 \n", + "21596 1523300157 10/15/2014 325000.0 2 0.75 1020 \n", + "\n", + " sqft_lot floors waterfront view ... grade sqft_above \\\n", + "0 5650 1.0 NaN NONE ... 7 Average 1180 \n", + "1 7242 2.0 NO NONE ... 7 Average 2170 \n", + "2 10000 1.0 NO NONE ... 6 Low Average 770 \n", + "3 5000 1.0 NO NONE ... 7 Average 1050 \n", + "4 8080 1.0 NO NONE ... 8 Good 1680 \n", + "... ... ... ... ... ... ... ... \n", + "21592 1131 3.0 NO NONE ... 8 Good 1530 \n", + "21593 5813 2.0 NO NONE ... 8 Good 2310 \n", + "21594 1350 2.0 NO NONE ... 7 Average 1020 \n", + "21595 2388 2.0 NaN NONE ... 8 Good 1600 \n", + "21596 1076 2.0 NO NONE ... 7 Average 1020 \n", + "\n", + " sqft_basement yr_built yr_renovated zipcode lat long \\\n", + "0 0.0 1955 0.0 98178 47.5112 -122.257 \n", + "1 400.0 1951 1991.0 98125 47.7210 -122.319 \n", + "2 0.0 1933 NaN 98028 47.7379 -122.233 \n", + "3 910.0 1965 0.0 98136 47.5208 -122.393 \n", + "4 0.0 1987 0.0 98074 47.6168 -122.045 \n", + "... ... ... ... ... ... ... \n", + "21592 0.0 2009 0.0 98103 47.6993 -122.346 \n", + "21593 0.0 2014 0.0 98146 47.5107 -122.362 \n", + "21594 0.0 2009 0.0 98144 47.5944 -122.299 \n", + "21595 0.0 2004 0.0 98027 47.5345 -122.069 \n", + "21596 0.0 2008 0.0 98144 47.5941 -122.299 \n", + "\n", + " sqft_living15 sqft_lot15 \n", + "0 1340 5650 \n", + "1 1690 7639 \n", + "2 2720 8062 \n", + "3 1360 5000 \n", + "4 1800 7503 \n", + "... ... ... \n", + "21592 1530 1509 \n", + "21593 1830 7200 \n", + "21594 1020 2007 \n", + "21595 1410 1287 \n", + "21596 1020 1357 \n", + "\n", + "[21597 rows x 21 columns]" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "load_data('data/kc_house_data.csv') # Assuming 'data' folder is in the same directory\n", + "\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The dataset contains 21 columns, each representing a distinct feature, and 21,597 rows, with each row corresponding to a specific house sale entry.\n", + "\n", + "The dataset contains a mix of data types, including integers (int64), floating-point numbers (float64), and objects (strings). For instance, numerical features such as bedrooms, bathrooms, and sqft_living are represented as integers or floating-point numbers to facilitate mathematical computations, while categorical features like waterfront and view are stored as objects to accommodate text-based categories." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The dataset contains 21597 houses with 21 features\n", + "\n", + "Columns and their data types:\n", + "id: int64\n", + "date: object\n", + "price: float64\n", + "bedrooms: int64\n", + "bathrooms: float64\n", + "sqft_living: int64\n", + "sqft_lot: int64\n", + "floors: float64\n", + "waterfront: object\n", + "view: object\n", + "condition: object\n", + "grade: object\n", + "sqft_above: int64\n", + "sqft_basement: object\n", + "yr_built: int64\n", + "yr_renovated: float64\n", + "zipcode: int64\n", + "lat: float64\n", + "long: float64\n", + "sqft_living15: int64\n", + "sqft_lot15: int64\n", + "\n" + ] + } + ], + "source": [ + "kings_data = load_data('data/kc_house_data.csv')" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "#create a function that takes in a column and returns the column statistics as a dictionary\n", + "def descriptive_analytics(column):\n", + " stats_dict = column.describe().to_dict()\n", + " \n", + " print(\"Descriptive Statistics for Column '{}':\".format(column.name))\n", + " print(\"The count of the column is:\", stats_dict['count'])\n", + " print(\"The mean of the column is:\", stats_dict['mean'])\n", + " print(\"The standard deviation of the column is:\", stats_dict['std'])\n", + " print(\"The minimum value of the column is:\", stats_dict['min'])\n", + " print(\"The 25th percentile of the column is:\", stats_dict['25%'])\n", + " print(\"The median of the column is:\", stats_dict['50%'])\n", + " print(\"The 75th percentile of the column is:\", stats_dict['75%'])\n", + " print(\"The maximum value of the column is:\", stats_dict['max'])" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Descriptive Statistics for Column 'price':\n", + "The count of the column is: 21597.0\n", + "The mean of the column is: 540296.5735055795\n", + "The standard deviation of the column is: 367368.1401013936\n", + "The minimum value of the column is: 78000.0\n", + "The 25th percentile of the column is: 322000.0\n", + "The median of the column is: 450000.0\n", + "The 75th percentile of the column is: 645000.0\n", + "The maximum value of the column is: 7700000.0\n" + ] + } + ], + "source": [ + "descriptive_analytics(kings_data['price'])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We can see that the maximum price of a house is 7700000 dollars and the minimum price is 78000 dollars\n", + "\n", + "There are 21597 prices regarding to the houses in the dataset\n", + "\n", + "Average price of a house is 540296.57 dollars" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Data Preperation\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "RangeIndex: 21597 entries, 0 to 21596\n", + "Data columns (total 21 columns):\n", + " # Column Non-Null Count Dtype \n", + "--- ------ -------------- ----- \n", + " 0 id 21597 non-null int64 \n", + " 1 date 21597 non-null object \n", + " 2 price 21597 non-null float64\n", + " 3 bedrooms 21597 non-null int64 \n", + " 4 bathrooms 21597 non-null float64\n", + " 5 sqft_living 21597 non-null int64 \n", + " 6 sqft_lot 21597 non-null int64 \n", + " 7 floors 21597 non-null float64\n", + " 8 waterfront 19221 non-null object \n", + " 9 view 21534 non-null object \n", + " 10 condition 21597 non-null object \n", + " 11 grade 21597 non-null object \n", + " 12 sqft_above 21597 non-null int64 \n", + " 13 sqft_basement 21597 non-null object \n", + " 14 yr_built 21597 non-null int64 \n", + " 15 yr_renovated 17755 non-null float64\n", + " 16 zipcode 21597 non-null int64 \n", + " 17 lat 21597 non-null float64\n", + " 18 long 21597 non-null float64\n", + " 19 sqft_living15 21597 non-null int64 \n", + " 20 sqft_lot15 21597 non-null int64 \n", + "dtypes: float64(6), int64(9), object(6)\n", + "memory usage: 3.5+ MB\n" + ] + } + ], + "source": [ + "kings_data.info()" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [], + "source": [ + "def identify_issues(dataset):\n", + " # Identify missing values as a percentage of the whole dataset\n", + " missing_values = (dataset.isnull().sum())/len(dataset) * 100\n", + "\n", + " # Identify duplicates\n", + " duplicates = dataset.duplicated().sum()\n", + " \n", + " #return a dictionary \n", + " return {'duplicates': duplicates,\n", + " 'missing values': missing_values.round(2)} \n" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'duplicates': 0,\n", + " 'missing values': id 0.00\n", + " date 0.00\n", + " price 0.00\n", + " bedrooms 0.00\n", + " bathrooms 0.00\n", + " sqft_living 0.00\n", + " sqft_lot 0.00\n", + " floors 0.00\n", + " waterfront 11.00\n", + " view 0.29\n", + " condition 0.00\n", + " grade 0.00\n", + " sqft_above 0.00\n", + " sqft_basement 0.00\n", + " yr_built 0.00\n", + " yr_renovated 17.79\n", + " zipcode 0.00\n", + " lat 0.00\n", + " long 0.00\n", + " sqft_living15 0.00\n", + " sqft_lot15 0.00\n", + " dtype: float64}" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "identify_issues(kings_data)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The examination indicates that there are no duplicate entries within the dataset, ensuring the integrity of the records. However, attention is warranted to address missing values present in certain columns. Specifically, the 'waterfront' feature exhibits 11% of null values, representing a negligible portion of the dataset. Similarly, the 'yr_renovated' feature shows a relatively higher percentage of missing values, accounting for approximately 17.79% of the dataset" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "##### Before making changes make a copy instead of overwriting data" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [], + "source": [ + "house_data_clean = kings_data.copy()" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [], + "source": [ + "# Changing the date to date time\n", + "house_data_clean['date'] = pd.to_datetime(house_data_clean['date'])\n", + "\n", + "# Extracting only the year from the column Date\n", + "house_data_clean.date = house_data_clean['date'].dt.year\n", + "\n", + "# Changing the dates for the year built \n", + "house_data_clean['yr_built'] = pd.to_datetime(house_data_clean['yr_built'],format='%Y').dt.year\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The above code converts the 'date' column data to only contain the year the house was sold, for the purpose of analysis we will use only the year since the changes month by month will be minor." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Dealing with the missing values" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [], + "source": [ + "def missing_values(dataset):\n", + " # drop the rows from views\n", + " dataset.dropna(subset=['view'],inplace=True)\n", + "\n", + " # Filling the NaN values for waterfront with NO\n", + " dataset.waterfront.fillna('NO',inplace=True)\n", + " \n", + " # Dropping the yr_renovated column \n", + " dataset.drop('yr_renovated',axis=1,inplace=True)" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [], + "source": [ + "missing_values(house_data_clean)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "'yr_renovated' has the highest percentage of NaN values 17%. This will be dropped since it will not be used within our model inline with the business problem.\n", + "\n", + "'Waterfront' feature has 11% null values, this was filled with NO on the assumption that these cells were not filled since they lacked waterfronts\n", + "\n", + "For the 'View' column, the null values were dropped by row since the overall percentage impact would be minute" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'duplicates': 2,\n", + " 'missing values': id 0.0\n", + " date 0.0\n", + " price 0.0\n", + " bedrooms 0.0\n", + " bathrooms 0.0\n", + " sqft_living 0.0\n", + " sqft_lot 0.0\n", + " floors 0.0\n", + " waterfront 0.0\n", + " view 0.0\n", + " condition 0.0\n", + " grade 0.0\n", + " sqft_above 0.0\n", + " sqft_basement 0.0\n", + " yr_built 0.0\n", + " zipcode 0.0\n", + " lat 0.0\n", + " long 0.0\n", + " sqft_living15 0.0\n", + " sqft_lot15 0.0\n", + " dtype: float64}" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "identify_issues(house_data_clean)" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "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", + "
iddatepricebedroomsbathroomssqft_livingsqft_lotfloorswaterfrontviewconditiongradesqft_abovesqft_basementyr_builtzipcodelatlongsqft_living15sqft_lot15
394718250690312014550000.041.75241084472.0NOGOODGood8 Good2060350.019369807447.6499-122.088252014789
2003886489001102014555000.032.50194032112.0NONONEAverage8 Good19400.020099802747.5644-122.09318803078
\n", + "
" + ], + "text/plain": [ + " id date price bedrooms bathrooms sqft_living sqft_lot \\\n", + "3947 1825069031 2014 550000.0 4 1.75 2410 8447 \n", + "20038 8648900110 2014 555000.0 3 2.50 1940 3211 \n", + "\n", + " floors waterfront view condition grade sqft_above sqft_basement \\\n", + "3947 2.0 NO GOOD Good 8 Good 2060 350.0 \n", + "20038 2.0 NO NONE Average 8 Good 1940 0.0 \n", + "\n", + " yr_built zipcode lat long sqft_living15 sqft_lot15 \n", + "3947 1936 98074 47.6499 -122.088 2520 14789 \n", + "20038 2009 98027 47.5644 -122.093 1880 3078 " + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "house_data_clean[house_data_clean.duplicated()]" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "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.10.13" + } + }, + "nbformat": 4, + "nbformat_minor": 2 } From 045ce6159d1527b5878aa4faf6feebcf0c14ebab Mon Sep 17 00:00:00 2001 From: clydeochieng <107258512+clydeochieng@users.noreply.github.com> Date: Wed, 1 May 2024 12:16:48 +0300 Subject: [PATCH 41/42] Update student.ipynb --- student.ipynb | 1152 ++++++++++++++++++++++++------------------------- 1 file changed, 564 insertions(+), 588 deletions(-) diff --git a/student.ipynb b/student.ipynb index 6216aa63..4a29c2f7 100644 --- a/student.ipynb +++ b/student.ipynb @@ -6,7 +6,7 @@ "source": [ "## Final Project Submission\n", "\n", - "* Student name: Solphine Joseph, Grace Rotich, Mathew Kiprotich, Hilary Simiyu, Clyde Ochieng, Derrick Kiptoo. \n", + "* Student name: Solphine Joseph, Grace Rotich, Mathew Kiprotich, Hilary Simiyu, Clyde Ochieng. \n", "* Student pace: full time\n", "* Scheduled project review date/time: \n", "* Instructor name: Nikita \n", @@ -91,35 +91,11 @@ "source": [ "## Data Loading\n", "\n" - Clyde - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### Import Necessary Libraries" ] }, { "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "import matplotlib.pyplot as plt\n", - "%matplotlib inline\n", - "import numpy as np\n", - "import pandas as pd\n", - "import scipy.stats as stats\n", - "import seaborn as sns\n", - "import statsmodels.api as sm" - - ] - }, - { - "cell_type": "code", - "execution_count": 2, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -491,566 +467,566 @@ "\n", "

21597 rows × 21 columns

\n", "" - ], - "text/plain": [ - " id date price bedrooms bathrooms sqft_living \\\n", - "0 7129300520 10/13/2014 221900.0 3 1.00 1180 \n", - "1 6414100192 12/9/2014 538000.0 3 2.25 2570 \n", - "2 5631500400 2/25/2015 180000.0 2 1.00 770 \n", - "3 2487200875 12/9/2014 604000.0 4 3.00 1960 \n", - "4 1954400510 2/18/2015 510000.0 3 2.00 1680 \n", - "... ... ... ... ... ... ... \n", - "21592 263000018 5/21/2014 360000.0 3 2.50 1530 \n", - "21593 6600060120 2/23/2015 400000.0 4 2.50 2310 \n", - "21594 1523300141 6/23/2014 402101.0 2 0.75 1020 \n", - "21595 291310100 1/16/2015 400000.0 3 2.50 1600 \n", - "21596 1523300157 10/15/2014 325000.0 2 0.75 1020 \n", - "\n", - " sqft_lot floors waterfront view ... grade sqft_above \\\n", - "0 5650 1.0 NaN NONE ... 7 Average 1180 \n", - "1 7242 2.0 NO NONE ... 7 Average 2170 \n", - "2 10000 1.0 NO NONE ... 6 Low Average 770 \n", - "3 5000 1.0 NO NONE ... 7 Average 1050 \n", - "4 8080 1.0 NO NONE ... 8 Good 1680 \n", - "... ... ... ... ... ... ... ... \n", - "21592 1131 3.0 NO NONE ... 8 Good 1530 \n", - "21593 5813 2.0 NO NONE ... 8 Good 2310 \n", - "21594 1350 2.0 NO NONE ... 7 Average 1020 \n", - "21595 2388 2.0 NaN NONE ... 8 Good 1600 \n", - "21596 1076 2.0 NO NONE ... 7 Average 1020 \n", - "\n", - " sqft_basement yr_built yr_renovated zipcode lat long \\\n", - "0 0.0 1955 0.0 98178 47.5112 -122.257 \n", - "1 400.0 1951 1991.0 98125 47.7210 -122.319 \n", - "2 0.0 1933 NaN 98028 47.7379 -122.233 \n", - "3 910.0 1965 0.0 98136 47.5208 -122.393 \n", - "4 0.0 1987 0.0 98074 47.6168 -122.045 \n", - "... ... ... ... ... ... ... \n", - "21592 0.0 2009 0.0 98103 47.6993 -122.346 \n", - "21593 0.0 2014 0.0 98146 47.5107 -122.362 \n", - "21594 0.0 2009 0.0 98144 47.5944 -122.299 \n", - "21595 0.0 2004 0.0 98027 47.5345 -122.069 \n", - "21596 0.0 2008 0.0 98144 47.5941 -122.299 \n", - "\n", - " sqft_living15 sqft_lot15 \n", - "0 1340 5650 \n", - "1 1690 7639 \n", - "2 2720 8062 \n", - "3 1360 5000 \n", - "4 1800 7503 \n", - "... ... ... \n", - "21592 1530 1509 \n", - "21593 1830 7200 \n", - "21594 1020 2007 \n", - "21595 1410 1287 \n", - "21596 1020 1357 \n", - "\n", - "[21597 rows x 21 columns]" - ] - }, - "execution_count": 3, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "load_data('data/kc_house_data.csv') # Assuming 'data' folder is in the same directory\n", - "\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The dataset contains 21 columns, each representing a distinct feature, and 21,597 rows, with each row corresponding to a specific house sale entry.\n", - "\n", - "The dataset contains a mix of data types, including integers (int64), floating-point numbers (float64), and objects (strings). For instance, numerical features such as bedrooms, bathrooms, and sqft_living are represented as integers or floating-point numbers to facilitate mathematical computations, while categorical features like waterfront and view are stored as objects to accommodate text-based categories." - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "The dataset contains 21597 houses with 21 features\n", - "\n", - "Columns and their data types:\n", - "id: int64\n", - "date: object\n", - "price: float64\n", - "bedrooms: int64\n", - "bathrooms: float64\n", - "sqft_living: int64\n", - "sqft_lot: int64\n", - "floors: float64\n", - "waterfront: object\n", - "view: object\n", - "condition: object\n", - "grade: object\n", - "sqft_above: int64\n", - "sqft_basement: object\n", - "yr_built: int64\n", - "yr_renovated: float64\n", - "zipcode: int64\n", - "lat: float64\n", - "long: float64\n", - "sqft_living15: int64\n", - "sqft_lot15: int64\n", - "\n" - ] - } - ], - "source": [ - "kings_data = load_data('data/kc_house_data.csv')" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [], - "source": [ - "#create a function that takes in a column and returns the column statistics as a dictionary\n", - "def descriptive_analytics(column):\n", - " stats_dict = column.describe().to_dict()\n", - " \n", - " print(\"Descriptive Statistics for Column '{}':\".format(column.name))\n", - " print(\"The count of the column is:\", stats_dict['count'])\n", - " print(\"The mean of the column is:\", stats_dict['mean'])\n", - " print(\"The standard deviation of the column is:\", stats_dict['std'])\n", - " print(\"The minimum value of the column is:\", stats_dict['min'])\n", - " print(\"The 25th percentile of the column is:\", stats_dict['25%'])\n", - " print(\"The median of the column is:\", stats_dict['50%'])\n", - " print(\"The 75th percentile of the column is:\", stats_dict['75%'])\n", - " print(\"The maximum value of the column is:\", stats_dict['max'])" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Descriptive Statistics for Column 'price':\n", - "The count of the column is: 21597.0\n", - "The mean of the column is: 540296.5735055795\n", - "The standard deviation of the column is: 367368.1401013936\n", - "The minimum value of the column is: 78000.0\n", - "The 25th percentile of the column is: 322000.0\n", - "The median of the column is: 450000.0\n", - "The 75th percentile of the column is: 645000.0\n", - "The maximum value of the column is: 7700000.0\n" - ] - } - ], - "source": [ - "descriptive_analytics(kings_data['price'])" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can see that the maximum price of a house is 7700000 dollars and the minimum price is 78000 dollars\n", - "\n", - "There are 21597 prices regarding to the houses in the dataset\n", - "\n", - "Average price of a house is 540296.57 dollars" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Data Preperation\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n", - "RangeIndex: 21597 entries, 0 to 21596\n", - "Data columns (total 21 columns):\n", - " # Column Non-Null Count Dtype \n", - "--- ------ -------------- ----- \n", - " 0 id 21597 non-null int64 \n", - " 1 date 21597 non-null object \n", - " 2 price 21597 non-null float64\n", - " 3 bedrooms 21597 non-null int64 \n", - " 4 bathrooms 21597 non-null float64\n", - " 5 sqft_living 21597 non-null int64 \n", - " 6 sqft_lot 21597 non-null int64 \n", - " 7 floors 21597 non-null float64\n", - " 8 waterfront 19221 non-null object \n", - " 9 view 21534 non-null object \n", - " 10 condition 21597 non-null object \n", - " 11 grade 21597 non-null object \n", - " 12 sqft_above 21597 non-null int64 \n", - " 13 sqft_basement 21597 non-null object \n", - " 14 yr_built 21597 non-null int64 \n", - " 15 yr_renovated 17755 non-null float64\n", - " 16 zipcode 21597 non-null int64 \n", - " 17 lat 21597 non-null float64\n", - " 18 long 21597 non-null float64\n", - " 19 sqft_living15 21597 non-null int64 \n", - " 20 sqft_lot15 21597 non-null int64 \n", - "dtypes: float64(6), int64(9), object(6)\n", - "memory usage: 3.5+ MB\n" - ] - } - ], - "source": [ - "kings_data.info()" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [], - "source": [ - "def identify_issues(dataset):\n", - " # Identify missing values as a percentage of the whole dataset\n", - " missing_values = (dataset.isnull().sum())/len(dataset) * 100\n", - "\n", - " # Identify duplicates\n", - " duplicates = dataset.duplicated().sum()\n", - " \n", - " #return a dictionary \n", - " return {'duplicates': duplicates,\n", - " 'missing values': missing_values.round(2)} \n" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'duplicates': 0,\n", - " 'missing values': id 0.00\n", - " date 0.00\n", - " price 0.00\n", - " bedrooms 0.00\n", - " bathrooms 0.00\n", - " sqft_living 0.00\n", - " sqft_lot 0.00\n", - " floors 0.00\n", - " waterfront 11.00\n", - " view 0.29\n", - " condition 0.00\n", - " grade 0.00\n", - " sqft_above 0.00\n", - " sqft_basement 0.00\n", - " yr_built 0.00\n", - " yr_renovated 17.79\n", - " zipcode 0.00\n", - " lat 0.00\n", - " long 0.00\n", - " sqft_living15 0.00\n", - " sqft_lot15 0.00\n", - " dtype: float64}" - ] - }, - "execution_count": 9, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "identify_issues(kings_data)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The examination indicates that there are no duplicate entries within the dataset, ensuring the integrity of the records. However, attention is warranted to address missing values present in certain columns. Specifically, the 'waterfront' feature exhibits 11% of null values, representing a negligible portion of the dataset. Similarly, the 'yr_renovated' feature shows a relatively higher percentage of missing values, accounting for approximately 17.79% of the dataset" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "##### Before making changes make a copy instead of overwriting data" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [], - "source": [ - "house_data_clean = kings_data.copy()" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [], - "source": [ - "# Changing the date to date time\n", - "house_data_clean['date'] = pd.to_datetime(house_data_clean['date'])\n", - "\n", - "# Extracting only the year from the column Date\n", - "house_data_clean.date = house_data_clean['date'].dt.year\n", - "\n", - "# Changing the dates for the year built \n", - "house_data_clean['yr_built'] = pd.to_datetime(house_data_clean['yr_built'],format='%Y').dt.year\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The above code converts the 'date' column data to only contain the year the house was sold, for the purpose of analysis we will use only the year since the changes month by month will be minor." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### Dealing with the missing values" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [], - "source": [ - "def missing_values(dataset):\n", - " # drop the rows from views\n", - " dataset.dropna(subset=['view'],inplace=True)\n", - "\n", - " # Filling the NaN values for waterfront with NO\n", - " dataset.waterfront.fillna('NO',inplace=True)\n", - " \n", - " # Dropping the yr_renovated column \n", - " dataset.drop('yr_renovated',axis=1,inplace=True)" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [], - "source": [ - "missing_values(house_data_clean)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "'yr_renovated' has the highest percentage of NaN values 17%. This will be dropped since it will not be used within our model inline with the business problem.\n", - "\n", - "'Waterfront' feature has 11% null values, this was filled with NO on the assumption that these cells were not filled since they lacked waterfronts\n", - "\n", - "For the 'View' column, the null values were dropped by row since the overall percentage impact would be minute" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'duplicates': 2,\n", - " 'missing values': id 0.0\n", - " date 0.0\n", - " price 0.0\n", - " bedrooms 0.0\n", - " bathrooms 0.0\n", - " sqft_living 0.0\n", - " sqft_lot 0.0\n", - " floors 0.0\n", - " waterfront 0.0\n", - " view 0.0\n", - " condition 0.0\n", - " grade 0.0\n", - " sqft_above 0.0\n", - " sqft_basement 0.0\n", - " yr_built 0.0\n", - " zipcode 0.0\n", - " lat 0.0\n", - " long 0.0\n", - " sqft_living15 0.0\n", - " sqft_lot15 0.0\n", - " dtype: float64}" - ] - }, - "execution_count": 14, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "identify_issues(house_data_clean)" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "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", - "
iddatepricebedroomsbathroomssqft_livingsqft_lotfloorswaterfrontviewconditiongradesqft_abovesqft_basementyr_builtzipcodelatlongsqft_living15sqft_lot15
394718250690312014550000.041.75241084472.0NOGOODGood8 Good2060350.019369807447.6499-122.088252014789
2003886489001102014555000.032.50194032112.0NONONEAverage8 Good19400.020099802747.5644-122.09318803078
\n", - "
" - ], - "text/plain": [ - " id date price bedrooms bathrooms sqft_living sqft_lot \\\n", - "3947 1825069031 2014 550000.0 4 1.75 2410 8447 \n", - "20038 8648900110 2014 555000.0 3 2.50 1940 3211 \n", - "\n", - " floors waterfront view condition grade sqft_above sqft_basement \\\n", - "3947 2.0 NO GOOD Good 8 Good 2060 350.0 \n", - "20038 2.0 NO NONE Average 8 Good 1940 0.0 \n", - "\n", - " yr_built zipcode lat long sqft_living15 sqft_lot15 \n", - "3947 1936 98074 47.6499 -122.088 2520 14789 \n", - "20038 2009 98027 47.5644 -122.093 1880 3078 " - ] - }, - "execution_count": 15, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "house_data_clean[house_data_clean.duplicated()]" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "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.10.13" - } - }, - "nbformat": 4, - "nbformat_minor": 2 + ], + "text/plain": [ + " id date price bedrooms bathrooms sqft_living \\\n", + "0 7129300520 10/13/2014 221900.0 3 1.00 1180 \n", + "1 6414100192 12/9/2014 538000.0 3 2.25 2570 \n", + "2 5631500400 2/25/2015 180000.0 2 1.00 770 \n", + "3 2487200875 12/9/2014 604000.0 4 3.00 1960 \n", + "4 1954400510 2/18/2015 510000.0 3 2.00 1680 \n", + "... ... ... ... ... ... ... \n", + "21592 263000018 5/21/2014 360000.0 3 2.50 1530 \n", + "21593 6600060120 2/23/2015 400000.0 4 2.50 2310 \n", + "21594 1523300141 6/23/2014 402101.0 2 0.75 1020 \n", + "21595 291310100 1/16/2015 400000.0 3 2.50 1600 \n", + "21596 1523300157 10/15/2014 325000.0 2 0.75 1020 \n", + "\n", + " sqft_lot floors waterfront view ... grade sqft_above \\\n", + "0 5650 1.0 NaN NONE ... 7 Average 1180 \n", + "1 7242 2.0 NO NONE ... 7 Average 2170 \n", + "2 10000 1.0 NO NONE ... 6 Low Average 770 \n", + "3 5000 1.0 NO NONE ... 7 Average 1050 \n", + "4 8080 1.0 NO NONE ... 8 Good 1680 \n", + "... ... ... ... ... ... ... ... \n", + "21592 1131 3.0 NO NONE ... 8 Good 1530 \n", + "21593 5813 2.0 NO NONE ... 8 Good 2310 \n", + "21594 1350 2.0 NO NONE ... 7 Average 1020 \n", + "21595 2388 2.0 NaN NONE ... 8 Good 1600 \n", + "21596 1076 2.0 NO NONE ... 7 Average 1020 \n", + "\n", + " sqft_basement yr_built yr_renovated zipcode lat long \\\n", + "0 0.0 1955 0.0 98178 47.5112 -122.257 \n", + "1 400.0 1951 1991.0 98125 47.7210 -122.319 \n", + "2 0.0 1933 NaN 98028 47.7379 -122.233 \n", + "3 910.0 1965 0.0 98136 47.5208 -122.393 \n", + "4 0.0 1987 0.0 98074 47.6168 -122.045 \n", + "... ... ... ... ... ... ... \n", + "21592 0.0 2009 0.0 98103 47.6993 -122.346 \n", + "21593 0.0 2014 0.0 98146 47.5107 -122.362 \n", + "21594 0.0 2009 0.0 98144 47.5944 -122.299 \n", + "21595 0.0 2004 0.0 98027 47.5345 -122.069 \n", + "21596 0.0 2008 0.0 98144 47.5941 -122.299 \n", + "\n", + " sqft_living15 sqft_lot15 \n", + "0 1340 5650 \n", + "1 1690 7639 \n", + "2 2720 8062 \n", + "3 1360 5000 \n", + "4 1800 7503 \n", + "... ... ... \n", + "21592 1530 1509 \n", + "21593 1830 7200 \n", + "21594 1020 2007 \n", + "21595 1410 1287 \n", + "21596 1020 1357 \n", + "\n", + "[21597 rows x 21 columns]" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "load_data('data/kc_house_data.csv') # Assuming 'data' folder is in the same directory\n", + "\n", + "\n" + ] +}, +{ + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The dataset contains 21 columns, each representing a distinct feature, and 21,597 rows, with each row corresponding to a specific house sale entry.\n", + "\n", + "The dataset contains a mix of data types, including integers (int64), floating-point numbers (float64), and objects (strings). For instance, numerical features such as bedrooms, bathrooms, and sqft_living are represented as integers or floating-point numbers to facilitate mathematical computations, while categorical features like waterfront and view are stored as objects to accommodate text-based categories." + ] +}, +{ + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The dataset contains 21597 houses with 21 features\n", + "\n", + "Columns and their data types:\n", + "id: int64\n", + "date: object\n", + "price: float64\n", + "bedrooms: int64\n", + "bathrooms: float64\n", + "sqft_living: int64\n", + "sqft_lot: int64\n", + "floors: float64\n", + "waterfront: object\n", + "view: object\n", + "condition: object\n", + "grade: object\n", + "sqft_above: int64\n", + "sqft_basement: object\n", + "yr_built: int64\n", + "yr_renovated: float64\n", + "zipcode: int64\n", + "lat: float64\n", + "long: float64\n", + "sqft_living15: int64\n", + "sqft_lot15: int64\n", + "\n" + ] + } + ], + "source": [ + "kings_data = load_data('data/kc_house_data.csv')" + ] +}, +{ + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "#create a function that takes in a column and returns the column statistics as a dictionary\n", + "def descriptive_analytics(column):\n", + " stats_dict = column.describe().to_dict()\n", + " \n", + " print(\"Descriptive Statistics for Column '{}':\".format(column.name))\n", + " print(\"The count of the column is:\", stats_dict['count'])\n", + " print(\"The mean of the column is:\", stats_dict['mean'])\n", + " print(\"The standard deviation of the column is:\", stats_dict['std'])\n", + " print(\"The minimum value of the column is:\", stats_dict['min'])\n", + " print(\"The 25th percentile of the column is:\", stats_dict['25%'])\n", + " print(\"The median of the column is:\", stats_dict['50%'])\n", + " print(\"The 75th percentile of the column is:\", stats_dict['75%'])\n", + " print(\"The maximum value of the column is:\", stats_dict['max'])" + ] +}, +{ + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Descriptive Statistics for Column 'price':\n", + "The count of the column is: 21597.0\n", + "The mean of the column is: 540296.5735055795\n", + "The standard deviation of the column is: 367368.1401013936\n", + "The minimum value of the column is: 78000.0\n", + "The 25th percentile of the column is: 322000.0\n", + "The median of the column is: 450000.0\n", + "The 75th percentile of the column is: 645000.0\n", + "The maximum value of the column is: 7700000.0\n" + ] + } + ], + "source": [ + "descriptive_analytics(kings_data['price'])" + ] +}, +{ + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We can see that the maximum price of a house is 7700000 dollars and the minimum price is 78000 dollars\n", + "\n", + "There are 21597 prices regarding to the houses in the dataset\n", + "\n", + "Average price of a house is 540296.57 dollars" + ] +}, +{ + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Data Preperation\n", + "\n" + ] +}, +{ + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "RangeIndex: 21597 entries, 0 to 21596\n", + "Data columns (total 21 columns):\n", + " # Column Non-Null Count Dtype \n", + "--- ------ -------------- ----- \n", + " 0 id 21597 non-null int64 \n", + " 1 date 21597 non-null object \n", + " 2 price 21597 non-null float64\n", + " 3 bedrooms 21597 non-null int64 \n", + " 4 bathrooms 21597 non-null float64\n", + " 5 sqft_living 21597 non-null int64 \n", + " 6 sqft_lot 21597 non-null int64 \n", + " 7 floors 21597 non-null float64\n", + " 8 waterfront 19221 non-null object \n", + " 9 view 21534 non-null object \n", + " 10 condition 21597 non-null object \n", + " 11 grade 21597 non-null object \n", + " 12 sqft_above 21597 non-null int64 \n", + " 13 sqft_basement 21597 non-null object \n", + " 14 yr_built 21597 non-null int64 \n", + " 15 yr_renovated 17755 non-null float64\n", + " 16 zipcode 21597 non-null int64 \n", + " 17 lat 21597 non-null float64\n", + " 18 long 21597 non-null float64\n", + " 19 sqft_living15 21597 non-null int64 \n", + " 20 sqft_lot15 21597 non-null int64 \n", + "dtypes: float64(6), int64(9), object(6)\n", + "memory usage: 3.5+ MB\n" + ] + } + ], + "source": [ + "kings_data.info()" + ] +}, +{ + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [], + "source": [ + "def identify_issues(dataset):\n", + " # Identify missing values as a percentage of the whole dataset\n", + " missing_values = (dataset.isnull().sum())/len(dataset) * 100\n", + "\n", + " # Identify duplicates\n", + " duplicates = dataset.duplicated().sum()\n", + " \n", + " #return a dictionary \n", + " return {'duplicates': duplicates,\n", + " 'missing values': missing_values.round(2)} \n" + ] +}, +{ + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'duplicates': 0,\n", + " 'missing values': id 0.00\n", + " date 0.00\n", + " price 0.00\n", + " bedrooms 0.00\n", + " bathrooms 0.00\n", + " sqft_living 0.00\n", + " sqft_lot 0.00\n", + " floors 0.00\n", + " waterfront 11.00\n", + " view 0.29\n", + " condition 0.00\n", + " grade 0.00\n", + " sqft_above 0.00\n", + " sqft_basement 0.00\n", + " yr_built 0.00\n", + " yr_renovated 17.79\n", + " zipcode 0.00\n", + " lat 0.00\n", + " long 0.00\n", + " sqft_living15 0.00\n", + " sqft_lot15 0.00\n", + " dtype: float64}" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "identify_issues(kings_data)" + ] +}, +{ + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The examination indicates that there are no duplicate entries within the dataset, ensuring the integrity of the records. However, attention is warranted to address missing values present in certain columns. Specifically, the 'waterfront' feature exhibits 11% of null values, representing a negligible portion of the dataset. Similarly, the 'yr_renovated' feature shows a relatively higher percentage of missing values, accounting for approximately 17.79% of the dataset" + ] +}, +{ + "cell_type": "markdown", + "metadata": {}, + "source": [ + "##### Before making changes make a copy instead of overwriting data" + ] +}, +{ + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [], + "source": [ + "house_data_clean = kings_data.copy()" + ] +}, +{ + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [], + "source": [ + "# Changing the date to date time\n", + "house_data_clean['date'] = pd.to_datetime(house_data_clean['date'])\n", + "\n", + "# Extracting only the year from the column Date\n", + "house_data_clean.date = house_data_clean['date'].dt.year\n", + "\n", + "# Changing the dates for the year built \n", + "house_data_clean['yr_built'] = pd.to_datetime(house_data_clean['yr_built'],format='%Y').dt.year\n" + ] +}, +{ + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The above code converts the 'date' column data to only contain the year the house was sold, for the purpose of analysis we will use only the year since the changes month by month will be minor." + ] +}, +{ + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Dealing with the missing values" + ] +}, +{ + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [], + "source": [ + "def missing_values(dataset):\n", + " # drop the rows from views\n", + " dataset.dropna(subset=['view'],inplace=True)\n", + "\n", + " # Filling the NaN values for waterfront with NO\n", + " dataset.waterfront.fillna('NO',inplace=True)\n", + " \n", + " # Dropping the yr_renovated column \n", + " dataset.drop('yr_renovated',axis=1,inplace=True)" + ] +}, +{ + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [], + "source": [ + "missing_values(house_data_clean)" + ] +}, +{ + "cell_type": "markdown", + "metadata": {}, + "source": [ + "'yr_renovated' has the highest percentage of NaN values 17%. This will be dropped since it will not be used within our model inline with the business problem.\n", + "\n", + "'Waterfront' feature has 11% null values, this was filled with NO on the assumption that these cells were not filled since they lacked waterfronts\n", + "\n", + "For the 'View' column, the null values were dropped by row since the overall percentage impact would be minute" + ] +}, +{ + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'duplicates': 2,\n", + " 'missing values': id 0.0\n", + " date 0.0\n", + " price 0.0\n", + " bedrooms 0.0\n", + " bathrooms 0.0\n", + " sqft_living 0.0\n", + " sqft_lot 0.0\n", + " floors 0.0\n", + " waterfront 0.0\n", + " view 0.0\n", + " condition 0.0\n", + " grade 0.0\n", + " sqft_above 0.0\n", + " sqft_basement 0.0\n", + " yr_built 0.0\n", + " zipcode 0.0\n", + " lat 0.0\n", + " long 0.0\n", + " sqft_living15 0.0\n", + " sqft_lot15 0.0\n", + " dtype: float64}" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "identify_issues(house_data_clean)" + ] +}, +{ + "cell_type": "code", + "execution_count": 15, + "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", + "
iddatepricebedroomsbathroomssqft_livingsqft_lotfloorswaterfrontviewconditiongradesqft_abovesqft_basementyr_builtzipcodelatlongsqft_living15sqft_lot15
394718250690312014550000.041.75241084472.0NOGOODGood8 Good2060350.019369807447.6499-122.088252014789
2003886489001102014555000.032.50194032112.0NONONEAverage8 Good19400.020099802747.5644-122.09318803078
\n", + "
" + ], + "text/plain": [ + " id date price bedrooms bathrooms sqft_living sqft_lot \\\n", + "3947 1825069031 2014 550000.0 4 1.75 2410 8447 \n", + "20038 8648900110 2014 555000.0 3 2.50 1940 3211 \n", + "\n", + " floors waterfront view condition grade sqft_above sqft_basement \\\n", + "3947 2.0 NO GOOD Good 8 Good 2060 350.0 \n", + "20038 2.0 NO NONE Average 8 Good 1940 0.0 \n", + "\n", + " yr_built zipcode lat long sqft_living15 sqft_lot15 \n", + "3947 1936 98074 47.6499 -122.088 2520 14789 \n", + "20038 2009 98027 47.5644 -122.093 1880 3078 " + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "house_data_clean[house_data_clean.duplicated()]" + ] +} +], +"metadata": { +"kernelspec": { + "display_name": "Python 3", + "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.10.13" +} +}, +"nbformat": 4, +"nbformat_minor": 2 } From 89189c4f5e4bd353c9fe4c3db76a4319e4554327 Mon Sep 17 00:00:00 2001 From: clydeochieng <107258512+clydeochieng@users.noreply.github.com> Date: Wed, 1 May 2024 12:22:29 +0300 Subject: [PATCH 42/42] Update student.ipynb --- student.ipynb | 1152 +++++++++++++++++++++++++------------------------ 1 file changed, 588 insertions(+), 564 deletions(-) diff --git a/student.ipynb b/student.ipynb index 4a29c2f7..37939df3 100644 --- a/student.ipynb +++ b/student.ipynb @@ -6,7 +6,7 @@ "source": [ "## Final Project Submission\n", "\n", - "* Student name: Solphine Joseph, Grace Rotich, Mathew Kiprotich, Hilary Simiyu, Clyde Ochieng. \n", + "* Student name: Solphine Joseph, Grace Rotich, Mathew Kiprotich, Hilary Simiyu, Clyde Ochieng, Derrick Kiptoo. \n", "* Student pace: full time\n", "* Scheduled project review date/time: \n", "* Instructor name: Nikita \n", @@ -93,9 +93,33 @@ "\n" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Data Loading\n", + "\n", + "#### Import Necessary Libraries\n" + ] + }, { "cell_type": "code", - "execution_count": null, + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "import matplotlib.pyplot as plt\n", + "%matplotlib inline\n", + "import numpy as np\n", + "import pandas as pd\n", + "import scipy.stats as stats\n", + "import seaborn as sns\n", + "import statsmodels.api as sm" + ] + }, + { + "cell_type": "code", + "execution_count": 2, "metadata": {}, "outputs": [], "source": [ @@ -467,566 +491,566 @@ "\n", "

21597 rows × 21 columns

\n", "" - ], - "text/plain": [ - " id date price bedrooms bathrooms sqft_living \\\n", - "0 7129300520 10/13/2014 221900.0 3 1.00 1180 \n", - "1 6414100192 12/9/2014 538000.0 3 2.25 2570 \n", - "2 5631500400 2/25/2015 180000.0 2 1.00 770 \n", - "3 2487200875 12/9/2014 604000.0 4 3.00 1960 \n", - "4 1954400510 2/18/2015 510000.0 3 2.00 1680 \n", - "... ... ... ... ... ... ... \n", - "21592 263000018 5/21/2014 360000.0 3 2.50 1530 \n", - "21593 6600060120 2/23/2015 400000.0 4 2.50 2310 \n", - "21594 1523300141 6/23/2014 402101.0 2 0.75 1020 \n", - "21595 291310100 1/16/2015 400000.0 3 2.50 1600 \n", - "21596 1523300157 10/15/2014 325000.0 2 0.75 1020 \n", - "\n", - " sqft_lot floors waterfront view ... grade sqft_above \\\n", - "0 5650 1.0 NaN NONE ... 7 Average 1180 \n", - "1 7242 2.0 NO NONE ... 7 Average 2170 \n", - "2 10000 1.0 NO NONE ... 6 Low Average 770 \n", - "3 5000 1.0 NO NONE ... 7 Average 1050 \n", - "4 8080 1.0 NO NONE ... 8 Good 1680 \n", - "... ... ... ... ... ... ... ... \n", - "21592 1131 3.0 NO NONE ... 8 Good 1530 \n", - "21593 5813 2.0 NO NONE ... 8 Good 2310 \n", - "21594 1350 2.0 NO NONE ... 7 Average 1020 \n", - "21595 2388 2.0 NaN NONE ... 8 Good 1600 \n", - "21596 1076 2.0 NO NONE ... 7 Average 1020 \n", - "\n", - " sqft_basement yr_built yr_renovated zipcode lat long \\\n", - "0 0.0 1955 0.0 98178 47.5112 -122.257 \n", - "1 400.0 1951 1991.0 98125 47.7210 -122.319 \n", - "2 0.0 1933 NaN 98028 47.7379 -122.233 \n", - "3 910.0 1965 0.0 98136 47.5208 -122.393 \n", - "4 0.0 1987 0.0 98074 47.6168 -122.045 \n", - "... ... ... ... ... ... ... \n", - "21592 0.0 2009 0.0 98103 47.6993 -122.346 \n", - "21593 0.0 2014 0.0 98146 47.5107 -122.362 \n", - "21594 0.0 2009 0.0 98144 47.5944 -122.299 \n", - "21595 0.0 2004 0.0 98027 47.5345 -122.069 \n", - "21596 0.0 2008 0.0 98144 47.5941 -122.299 \n", - "\n", - " sqft_living15 sqft_lot15 \n", - "0 1340 5650 \n", - "1 1690 7639 \n", - "2 2720 8062 \n", - "3 1360 5000 \n", - "4 1800 7503 \n", - "... ... ... \n", - "21592 1530 1509 \n", - "21593 1830 7200 \n", - "21594 1020 2007 \n", - "21595 1410 1287 \n", - "21596 1020 1357 \n", - "\n", - "[21597 rows x 21 columns]" - ] - }, - "execution_count": 3, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "load_data('data/kc_house_data.csv') # Assuming 'data' folder is in the same directory\n", - "\n", - "\n" - ] -}, -{ - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The dataset contains 21 columns, each representing a distinct feature, and 21,597 rows, with each row corresponding to a specific house sale entry.\n", - "\n", - "The dataset contains a mix of data types, including integers (int64), floating-point numbers (float64), and objects (strings). For instance, numerical features such as bedrooms, bathrooms, and sqft_living are represented as integers or floating-point numbers to facilitate mathematical computations, while categorical features like waterfront and view are stored as objects to accommodate text-based categories." - ] -}, -{ - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "The dataset contains 21597 houses with 21 features\n", - "\n", - "Columns and their data types:\n", - "id: int64\n", - "date: object\n", - "price: float64\n", - "bedrooms: int64\n", - "bathrooms: float64\n", - "sqft_living: int64\n", - "sqft_lot: int64\n", - "floors: float64\n", - "waterfront: object\n", - "view: object\n", - "condition: object\n", - "grade: object\n", - "sqft_above: int64\n", - "sqft_basement: object\n", - "yr_built: int64\n", - "yr_renovated: float64\n", - "zipcode: int64\n", - "lat: float64\n", - "long: float64\n", - "sqft_living15: int64\n", - "sqft_lot15: int64\n", - "\n" - ] - } - ], - "source": [ - "kings_data = load_data('data/kc_house_data.csv')" - ] -}, -{ - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [], - "source": [ - "#create a function that takes in a column and returns the column statistics as a dictionary\n", - "def descriptive_analytics(column):\n", - " stats_dict = column.describe().to_dict()\n", - " \n", - " print(\"Descriptive Statistics for Column '{}':\".format(column.name))\n", - " print(\"The count of the column is:\", stats_dict['count'])\n", - " print(\"The mean of the column is:\", stats_dict['mean'])\n", - " print(\"The standard deviation of the column is:\", stats_dict['std'])\n", - " print(\"The minimum value of the column is:\", stats_dict['min'])\n", - " print(\"The 25th percentile of the column is:\", stats_dict['25%'])\n", - " print(\"The median of the column is:\", stats_dict['50%'])\n", - " print(\"The 75th percentile of the column is:\", stats_dict['75%'])\n", - " print(\"The maximum value of the column is:\", stats_dict['max'])" - ] -}, -{ - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Descriptive Statistics for Column 'price':\n", - "The count of the column is: 21597.0\n", - "The mean of the column is: 540296.5735055795\n", - "The standard deviation of the column is: 367368.1401013936\n", - "The minimum value of the column is: 78000.0\n", - "The 25th percentile of the column is: 322000.0\n", - "The median of the column is: 450000.0\n", - "The 75th percentile of the column is: 645000.0\n", - "The maximum value of the column is: 7700000.0\n" - ] - } - ], - "source": [ - "descriptive_analytics(kings_data['price'])" - ] -}, -{ - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can see that the maximum price of a house is 7700000 dollars and the minimum price is 78000 dollars\n", - "\n", - "There are 21597 prices regarding to the houses in the dataset\n", - "\n", - "Average price of a house is 540296.57 dollars" - ] -}, -{ - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Data Preperation\n", - "\n" - ] -}, -{ - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n", - "RangeIndex: 21597 entries, 0 to 21596\n", - "Data columns (total 21 columns):\n", - " # Column Non-Null Count Dtype \n", - "--- ------ -------------- ----- \n", - " 0 id 21597 non-null int64 \n", - " 1 date 21597 non-null object \n", - " 2 price 21597 non-null float64\n", - " 3 bedrooms 21597 non-null int64 \n", - " 4 bathrooms 21597 non-null float64\n", - " 5 sqft_living 21597 non-null int64 \n", - " 6 sqft_lot 21597 non-null int64 \n", - " 7 floors 21597 non-null float64\n", - " 8 waterfront 19221 non-null object \n", - " 9 view 21534 non-null object \n", - " 10 condition 21597 non-null object \n", - " 11 grade 21597 non-null object \n", - " 12 sqft_above 21597 non-null int64 \n", - " 13 sqft_basement 21597 non-null object \n", - " 14 yr_built 21597 non-null int64 \n", - " 15 yr_renovated 17755 non-null float64\n", - " 16 zipcode 21597 non-null int64 \n", - " 17 lat 21597 non-null float64\n", - " 18 long 21597 non-null float64\n", - " 19 sqft_living15 21597 non-null int64 \n", - " 20 sqft_lot15 21597 non-null int64 \n", - "dtypes: float64(6), int64(9), object(6)\n", - "memory usage: 3.5+ MB\n" - ] - } - ], - "source": [ - "kings_data.info()" - ] -}, -{ - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [], - "source": [ - "def identify_issues(dataset):\n", - " # Identify missing values as a percentage of the whole dataset\n", - " missing_values = (dataset.isnull().sum())/len(dataset) * 100\n", - "\n", - " # Identify duplicates\n", - " duplicates = dataset.duplicated().sum()\n", - " \n", - " #return a dictionary \n", - " return {'duplicates': duplicates,\n", - " 'missing values': missing_values.round(2)} \n" - ] -}, -{ - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'duplicates': 0,\n", - " 'missing values': id 0.00\n", - " date 0.00\n", - " price 0.00\n", - " bedrooms 0.00\n", - " bathrooms 0.00\n", - " sqft_living 0.00\n", - " sqft_lot 0.00\n", - " floors 0.00\n", - " waterfront 11.00\n", - " view 0.29\n", - " condition 0.00\n", - " grade 0.00\n", - " sqft_above 0.00\n", - " sqft_basement 0.00\n", - " yr_built 0.00\n", - " yr_renovated 17.79\n", - " zipcode 0.00\n", - " lat 0.00\n", - " long 0.00\n", - " sqft_living15 0.00\n", - " sqft_lot15 0.00\n", - " dtype: float64}" - ] - }, - "execution_count": 9, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "identify_issues(kings_data)" - ] -}, -{ - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The examination indicates that there are no duplicate entries within the dataset, ensuring the integrity of the records. However, attention is warranted to address missing values present in certain columns. Specifically, the 'waterfront' feature exhibits 11% of null values, representing a negligible portion of the dataset. Similarly, the 'yr_renovated' feature shows a relatively higher percentage of missing values, accounting for approximately 17.79% of the dataset" - ] -}, -{ - "cell_type": "markdown", - "metadata": {}, - "source": [ - "##### Before making changes make a copy instead of overwriting data" - ] -}, -{ - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [], - "source": [ - "house_data_clean = kings_data.copy()" - ] -}, -{ - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [], - "source": [ - "# Changing the date to date time\n", - "house_data_clean['date'] = pd.to_datetime(house_data_clean['date'])\n", - "\n", - "# Extracting only the year from the column Date\n", - "house_data_clean.date = house_data_clean['date'].dt.year\n", - "\n", - "# Changing the dates for the year built \n", - "house_data_clean['yr_built'] = pd.to_datetime(house_data_clean['yr_built'],format='%Y').dt.year\n" - ] -}, -{ - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The above code converts the 'date' column data to only contain the year the house was sold, for the purpose of analysis we will use only the year since the changes month by month will be minor." - ] -}, -{ - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### Dealing with the missing values" - ] -}, -{ - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [], - "source": [ - "def missing_values(dataset):\n", - " # drop the rows from views\n", - " dataset.dropna(subset=['view'],inplace=True)\n", - "\n", - " # Filling the NaN values for waterfront with NO\n", - " dataset.waterfront.fillna('NO',inplace=True)\n", - " \n", - " # Dropping the yr_renovated column \n", - " dataset.drop('yr_renovated',axis=1,inplace=True)" - ] -}, -{ - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [], - "source": [ - "missing_values(house_data_clean)" - ] -}, -{ - "cell_type": "markdown", - "metadata": {}, - "source": [ - "'yr_renovated' has the highest percentage of NaN values 17%. This will be dropped since it will not be used within our model inline with the business problem.\n", - "\n", - "'Waterfront' feature has 11% null values, this was filled with NO on the assumption that these cells were not filled since they lacked waterfronts\n", - "\n", - "For the 'View' column, the null values were dropped by row since the overall percentage impact would be minute" - ] -}, -{ - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'duplicates': 2,\n", - " 'missing values': id 0.0\n", - " date 0.0\n", - " price 0.0\n", - " bedrooms 0.0\n", - " bathrooms 0.0\n", - " sqft_living 0.0\n", - " sqft_lot 0.0\n", - " floors 0.0\n", - " waterfront 0.0\n", - " view 0.0\n", - " condition 0.0\n", - " grade 0.0\n", - " sqft_above 0.0\n", - " sqft_basement 0.0\n", - " yr_built 0.0\n", - " zipcode 0.0\n", - " lat 0.0\n", - " long 0.0\n", - " sqft_living15 0.0\n", - " sqft_lot15 0.0\n", - " dtype: float64}" - ] - }, - "execution_count": 14, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "identify_issues(house_data_clean)" - ] -}, -{ - "cell_type": "code", - "execution_count": 15, - "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", - "
iddatepricebedroomsbathroomssqft_livingsqft_lotfloorswaterfrontviewconditiongradesqft_abovesqft_basementyr_builtzipcodelatlongsqft_living15sqft_lot15
394718250690312014550000.041.75241084472.0NOGOODGood8 Good2060350.019369807447.6499-122.088252014789
2003886489001102014555000.032.50194032112.0NONONEAverage8 Good19400.020099802747.5644-122.09318803078
\n", - "
" - ], - "text/plain": [ - " id date price bedrooms bathrooms sqft_living sqft_lot \\\n", - "3947 1825069031 2014 550000.0 4 1.75 2410 8447 \n", - "20038 8648900110 2014 555000.0 3 2.50 1940 3211 \n", - "\n", - " floors waterfront view condition grade sqft_above sqft_basement \\\n", - "3947 2.0 NO GOOD Good 8 Good 2060 350.0 \n", - "20038 2.0 NO NONE Average 8 Good 1940 0.0 \n", - "\n", - " yr_built zipcode lat long sqft_living15 sqft_lot15 \n", - "3947 1936 98074 47.6499 -122.088 2520 14789 \n", - "20038 2009 98027 47.5644 -122.093 1880 3078 " - ] - }, - "execution_count": 15, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "house_data_clean[house_data_clean.duplicated()]" - ] -} -], -"metadata": { -"kernelspec": { - "display_name": "Python 3", - "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.10.13" -} -}, -"nbformat": 4, -"nbformat_minor": 2 + ], + "text/plain": [ + " id date price bedrooms bathrooms sqft_living \\\n", + "0 7129300520 10/13/2014 221900.0 3 1.00 1180 \n", + "1 6414100192 12/9/2014 538000.0 3 2.25 2570 \n", + "2 5631500400 2/25/2015 180000.0 2 1.00 770 \n", + "3 2487200875 12/9/2014 604000.0 4 3.00 1960 \n", + "4 1954400510 2/18/2015 510000.0 3 2.00 1680 \n", + "... ... ... ... ... ... ... \n", + "21592 263000018 5/21/2014 360000.0 3 2.50 1530 \n", + "21593 6600060120 2/23/2015 400000.0 4 2.50 2310 \n", + "21594 1523300141 6/23/2014 402101.0 2 0.75 1020 \n", + "21595 291310100 1/16/2015 400000.0 3 2.50 1600 \n", + "21596 1523300157 10/15/2014 325000.0 2 0.75 1020 \n", + "\n", + " sqft_lot floors waterfront view ... grade sqft_above \\\n", + "0 5650 1.0 NaN NONE ... 7 Average 1180 \n", + "1 7242 2.0 NO NONE ... 7 Average 2170 \n", + "2 10000 1.0 NO NONE ... 6 Low Average 770 \n", + "3 5000 1.0 NO NONE ... 7 Average 1050 \n", + "4 8080 1.0 NO NONE ... 8 Good 1680 \n", + "... ... ... ... ... ... ... ... \n", + "21592 1131 3.0 NO NONE ... 8 Good 1530 \n", + "21593 5813 2.0 NO NONE ... 8 Good 2310 \n", + "21594 1350 2.0 NO NONE ... 7 Average 1020 \n", + "21595 2388 2.0 NaN NONE ... 8 Good 1600 \n", + "21596 1076 2.0 NO NONE ... 7 Average 1020 \n", + "\n", + " sqft_basement yr_built yr_renovated zipcode lat long \\\n", + "0 0.0 1955 0.0 98178 47.5112 -122.257 \n", + "1 400.0 1951 1991.0 98125 47.7210 -122.319 \n", + "2 0.0 1933 NaN 98028 47.7379 -122.233 \n", + "3 910.0 1965 0.0 98136 47.5208 -122.393 \n", + "4 0.0 1987 0.0 98074 47.6168 -122.045 \n", + "... ... ... ... ... ... ... \n", + "21592 0.0 2009 0.0 98103 47.6993 -122.346 \n", + "21593 0.0 2014 0.0 98146 47.5107 -122.362 \n", + "21594 0.0 2009 0.0 98144 47.5944 -122.299 \n", + "21595 0.0 2004 0.0 98027 47.5345 -122.069 \n", + "21596 0.0 2008 0.0 98144 47.5941 -122.299 \n", + "\n", + " sqft_living15 sqft_lot15 \n", + "0 1340 5650 \n", + "1 1690 7639 \n", + "2 2720 8062 \n", + "3 1360 5000 \n", + "4 1800 7503 \n", + "... ... ... \n", + "21592 1530 1509 \n", + "21593 1830 7200 \n", + "21594 1020 2007 \n", + "21595 1410 1287 \n", + "21596 1020 1357 \n", + "\n", + "[21597 rows x 21 columns]" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "load_data('data/kc_house_data.csv') # Assuming 'data' folder is in the same directory\n", + "\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The dataset contains 21 columns, each representing a distinct feature, and 21,597 rows, with each row corresponding to a specific house sale entry.\n", + "\n", + "The dataset contains a mix of data types, including integers (int64), floating-point numbers (float64), and objects (strings). For instance, numerical features such as bedrooms, bathrooms, and sqft_living are represented as integers or floating-point numbers to facilitate mathematical computations, while categorical features like waterfront and view are stored as objects to accommodate text-based categories." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The dataset contains 21597 houses with 21 features\n", + "\n", + "Columns and their data types:\n", + "id: int64\n", + "date: object\n", + "price: float64\n", + "bedrooms: int64\n", + "bathrooms: float64\n", + "sqft_living: int64\n", + "sqft_lot: int64\n", + "floors: float64\n", + "waterfront: object\n", + "view: object\n", + "condition: object\n", + "grade: object\n", + "sqft_above: int64\n", + "sqft_basement: object\n", + "yr_built: int64\n", + "yr_renovated: float64\n", + "zipcode: int64\n", + "lat: float64\n", + "long: float64\n", + "sqft_living15: int64\n", + "sqft_lot15: int64\n", + "\n" + ] + } + ], + "source": [ + "kings_data = load_data('data/kc_house_data.csv')" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "#create a function that takes in a column and returns the column statistics as a dictionary\n", + "def descriptive_analytics(column):\n", + " stats_dict = column.describe().to_dict()\n", + " \n", + " print(\"Descriptive Statistics for Column '{}':\".format(column.name))\n", + " print(\"The count of the column is:\", stats_dict['count'])\n", + " print(\"The mean of the column is:\", stats_dict['mean'])\n", + " print(\"The standard deviation of the column is:\", stats_dict['std'])\n", + " print(\"The minimum value of the column is:\", stats_dict['min'])\n", + " print(\"The 25th percentile of the column is:\", stats_dict['25%'])\n", + " print(\"The median of the column is:\", stats_dict['50%'])\n", + " print(\"The 75th percentile of the column is:\", stats_dict['75%'])\n", + " print(\"The maximum value of the column is:\", stats_dict['max'])" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Descriptive Statistics for Column 'price':\n", + "The count of the column is: 21597.0\n", + "The mean of the column is: 540296.5735055795\n", + "The standard deviation of the column is: 367368.1401013936\n", + "The minimum value of the column is: 78000.0\n", + "The 25th percentile of the column is: 322000.0\n", + "The median of the column is: 450000.0\n", + "The 75th percentile of the column is: 645000.0\n", + "The maximum value of the column is: 7700000.0\n" + ] + } + ], + "source": [ + "descriptive_analytics(kings_data['price'])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We can see that the maximum price of a house is 7700000 dollars and the minimum price is 78000 dollars\n", + "\n", + "There are 21597 prices regarding to the houses in the dataset\n", + "\n", + "Average price of a house is 540296.57 dollars" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Data Preperation\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "RangeIndex: 21597 entries, 0 to 21596\n", + "Data columns (total 21 columns):\n", + " # Column Non-Null Count Dtype \n", + "--- ------ -------------- ----- \n", + " 0 id 21597 non-null int64 \n", + " 1 date 21597 non-null object \n", + " 2 price 21597 non-null float64\n", + " 3 bedrooms 21597 non-null int64 \n", + " 4 bathrooms 21597 non-null float64\n", + " 5 sqft_living 21597 non-null int64 \n", + " 6 sqft_lot 21597 non-null int64 \n", + " 7 floors 21597 non-null float64\n", + " 8 waterfront 19221 non-null object \n", + " 9 view 21534 non-null object \n", + " 10 condition 21597 non-null object \n", + " 11 grade 21597 non-null object \n", + " 12 sqft_above 21597 non-null int64 \n", + " 13 sqft_basement 21597 non-null object \n", + " 14 yr_built 21597 non-null int64 \n", + " 15 yr_renovated 17755 non-null float64\n", + " 16 zipcode 21597 non-null int64 \n", + " 17 lat 21597 non-null float64\n", + " 18 long 21597 non-null float64\n", + " 19 sqft_living15 21597 non-null int64 \n", + " 20 sqft_lot15 21597 non-null int64 \n", + "dtypes: float64(6), int64(9), object(6)\n", + "memory usage: 3.5+ MB\n" + ] + } + ], + "source": [ + "kings_data.info()" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [], + "source": [ + "def identify_issues(dataset):\n", + " # Identify missing values as a percentage of the whole dataset\n", + " missing_values = (dataset.isnull().sum())/len(dataset) * 100\n", + "\n", + " # Identify duplicates\n", + " duplicates = dataset.duplicated().sum()\n", + " \n", + " #return a dictionary \n", + " return {'duplicates': duplicates,\n", + " 'missing values': missing_values.round(2)} \n" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'duplicates': 0,\n", + " 'missing values': id 0.00\n", + " date 0.00\n", + " price 0.00\n", + " bedrooms 0.00\n", + " bathrooms 0.00\n", + " sqft_living 0.00\n", + " sqft_lot 0.00\n", + " floors 0.00\n", + " waterfront 11.00\n", + " view 0.29\n", + " condition 0.00\n", + " grade 0.00\n", + " sqft_above 0.00\n", + " sqft_basement 0.00\n", + " yr_built 0.00\n", + " yr_renovated 17.79\n", + " zipcode 0.00\n", + " lat 0.00\n", + " long 0.00\n", + " sqft_living15 0.00\n", + " sqft_lot15 0.00\n", + " dtype: float64}" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "identify_issues(kings_data)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The examination indicates that there are no duplicate entries within the dataset, ensuring the integrity of the records. However, attention is warranted to address missing values present in certain columns. Specifically, the 'waterfront' feature exhibits 11% of null values, representing a negligible portion of the dataset. Similarly, the 'yr_renovated' feature shows a relatively higher percentage of missing values, accounting for approximately 17.79% of the dataset" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "##### Before making changes make a copy instead of overwriting data" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [], + "source": [ + "house_data_clean = kings_data.copy()" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [], + "source": [ + "# Changing the date to date time\n", + "house_data_clean['date'] = pd.to_datetime(house_data_clean['date'])\n", + "\n", + "# Extracting only the year from the column Date\n", + "house_data_clean.date = house_data_clean['date'].dt.year\n", + "\n", + "# Changing the dates for the year built \n", + "house_data_clean['yr_built'] = pd.to_datetime(house_data_clean['yr_built'],format='%Y').dt.year\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The above code converts the 'date' column data to only contain the year the house was sold, for the purpose of analysis we will use only the year since the changes month by month will be minor." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Dealing with the missing values" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [], + "source": [ + "def missing_values(dataset):\n", + " # drop the rows from views\n", + " dataset.dropna(subset=['view'],inplace=True)\n", + "\n", + " # Filling the NaN values for waterfront with NO\n", + " dataset.waterfront.fillna('NO',inplace=True)\n", + " \n", + " # Dropping the yr_renovated column \n", + " dataset.drop('yr_renovated',axis=1,inplace=True)" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [], + "source": [ + "missing_values(house_data_clean)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "'yr_renovated' has the highest percentage of NaN values 17%. This will be dropped since it will not be used within our model inline with the business problem.\n", + "\n", + "'Waterfront' feature has 11% null values, this was filled with NO on the assumption that these cells were not filled since they lacked waterfronts\n", + "\n", + "For the 'View' column, the null values were dropped by row since the overall percentage impact would be minute" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'duplicates': 2,\n", + " 'missing values': id 0.0\n", + " date 0.0\n", + " price 0.0\n", + " bedrooms 0.0\n", + " bathrooms 0.0\n", + " sqft_living 0.0\n", + " sqft_lot 0.0\n", + " floors 0.0\n", + " waterfront 0.0\n", + " view 0.0\n", + " condition 0.0\n", + " grade 0.0\n", + " sqft_above 0.0\n", + " sqft_basement 0.0\n", + " yr_built 0.0\n", + " zipcode 0.0\n", + " lat 0.0\n", + " long 0.0\n", + " sqft_living15 0.0\n", + " sqft_lot15 0.0\n", + " dtype: float64}" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "identify_issues(house_data_clean)" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "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", + "
iddatepricebedroomsbathroomssqft_livingsqft_lotfloorswaterfrontviewconditiongradesqft_abovesqft_basementyr_builtzipcodelatlongsqft_living15sqft_lot15
394718250690312014550000.041.75241084472.0NOGOODGood8 Good2060350.019369807447.6499-122.088252014789
2003886489001102014555000.032.50194032112.0NONONEAverage8 Good19400.020099802747.5644-122.09318803078
\n", + "
" + ], + "text/plain": [ + " id date price bedrooms bathrooms sqft_living sqft_lot \\\n", + "3947 1825069031 2014 550000.0 4 1.75 2410 8447 \n", + "20038 8648900110 2014 555000.0 3 2.50 1940 3211 \n", + "\n", + " floors waterfront view condition grade sqft_above sqft_basement \\\n", + "3947 2.0 NO GOOD Good 8 Good 2060 350.0 \n", + "20038 2.0 NO NONE Average 8 Good 1940 0.0 \n", + "\n", + " yr_built zipcode lat long sqft_living15 sqft_lot15 \n", + "3947 1936 98074 47.6499 -122.088 2520 14789 \n", + "20038 2009 98027 47.5644 -122.093 1880 3078 " + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "house_data_clean[house_data_clean.duplicated()]" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "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.10.13" + } + }, + "nbformat": 4, + "nbformat_minor": 2 }