{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "*This notebook contains material from [cbe67701-uncertainty-quantification](https://ndcbe.github.io/cbe67701-uncertainty-quantification);\n", "content is available [on Github](https://github.com/ndcbe/cbe67701-uncertainty-quantification.git).*" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "< [3.1 Copulas](https://ndcbe.github.io/cbe67701-uncertainty-quantification/03.01-Contributed-Example.html) | [Contents](toc.html) | [4.0 Local Sensitivity Analysis Based on Derivative Approximations](https://ndcbe.github.io/cbe67701-uncertainty-quantification/04.00-Local-Sensitivity-Analysis-Based-on-Derivative-Approximations.html)
"
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "FOk6y691JBW8",
"nbpages": {
"level": 1,
"link": "[3.2 Principal Component Analysis](https://ndcbe.github.io/cbe67701-uncertainty-quantification/03.02-Contributed-Example.html#3.2-Principal-Component-Analysis)",
"section": "3.2 Principal Component Analysis"
}
},
"source": [
"# 3.2 Principal Component Analysis"
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "8BV1D7qRa07S",
"nbpages": {
"level": 1,
"link": "[3.2 Principal Component Analysis](https://ndcbe.github.io/cbe67701-uncertainty-quantification/03.02-Contributed-Example.html#3.2-Principal-Component-Analysis)",
"section": "3.2 Principal Component Analysis"
}
},
"source": [
"Stephen Adams (sadams22@nd.edu)\n",
"6/18/2020"
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "JCQR8b7RbCn3",
"nbpages": {
"level": 1,
"link": "[3.2 Principal Component Analysis](https://ndcbe.github.io/cbe67701-uncertainty-quantification/03.02-Contributed-Example.html#3.2-Principal-Component-Analysis)",
"section": "3.2 Principal Component Analysis"
}
},
"source": [
"The following example shows an application of principal component analysis (PCA), also known as random variable reduction, the Hotelling transform, or proper orthogonal decomposition (see page 76 of textbook). PCA is commonly used in machine learning to reduce the number of components, thereby speeding up machine learning algorithms.\n",
"\n",
"In this example, a scree plot will be generated. A scree plot shows how much of the variance in a data set can be attributed to each principal component (see Fig. 3.14 in the textbook)."
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"nbpages": {
"level": 1,
"link": "[3.2 Principal Component Analysis](https://ndcbe.github.io/cbe67701-uncertainty-quantification/03.02-Contributed-Example.html#3.2-Principal-Component-Analysis)",
"section": "3.2 Principal Component Analysis"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Checking for data/quarterbacks3.csv\n",
"\tFile found!\n"
]
}
],
"source": [
"## Dowload data from GitHub\n",
"import os, requests, urllib\n",
"\n",
"# GitHub pages url\n",
"url = \"https://ndcbe.github.io/cbe67701-uncertainty-quantification/\"\n",
"\n",
"# relative file paths to download\n",
"# this is the only line of code you need to change\n",
"file_paths = ['data/quarterbacks3.csv']\n",
"\n",
"# loop over all files to download\n",
"for file_path in file_paths:\n",
" print(\"Checking for\",file_path)\n",
" # split each file_path into a folder and filename\n",
" stem, filename = os.path.split(file_path)\n",
" \n",
" # check if the folder name is not empty\n",
" if stem:\n",
" # check if the folder exists\n",
" if not os.path.exists(stem):\n",
" print(\"\\tCreating folder\",stem)\n",
" # if the folder does not exist, create it\n",
" os.mkdir(stem)\n",
" # if the file does not exist, create it by downloading from GitHub pages\n",
" if not os.path.isfile(file_path):\n",
" file_url = urllib.parse.urljoin(url,\n",
" urllib.request.pathname2url(file_path))\n",
" print(\"\\tDownloading\",file_url)\n",
" with open(file_path, 'wb') as f:\n",
" f.write(requests.get(file_url).content)\n",
" else:\n",
" print(\"\\tFile found!\")"
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "LEoniqyVfpQw",
"nbpages": {
"level": 1,
"link": "[3.2 Principal Component Analysis](https://ndcbe.github.io/cbe67701-uncertainty-quantification/03.02-Contributed-Example.html#3.2-Principal-Component-Analysis)",
"section": "3.2 Principal Component Analysis"
}
},
"source": [
"The data set being analyzed is the statistics of the starting quarterbacks for all 32 NFL teams in the 2019 season. The statistics can be found at https://www.pro-football-reference.com/years/2019/passing.htm. The salaries were also included and can be found at https://www.spotrac.com/nfl/rankings/2019/average/quarterback/."
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 153
},
"colab_type": "code",
"id": "JC_sAcaEHPM8",
"nbpages": {
"level": 1,
"link": "[3.2 Principal Component Analysis](https://ndcbe.github.io/cbe67701-uncertainty-quantification/03.02-Contributed-Example.html#3.2-Principal-Component-Analysis)",
"section": "3.2 Principal Component Analysis"
},
"outputId": "91293a06-a022-4d3c-946a-bd92ef0b430b"
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
" Data Player Team Age Games Games Started Wins Losses \\\n",
"0 1 Jared Goff LAR 25 16 16 9 7 \n",
"1 2 Jameis Winston TAM 25 16 16 7 9 \n",
"2 3 Matt Ryan ATL 34 15 15 7 8 \n",
"3 4 Tom Brady NWE 42 16 16 12 4 \n",
"4 5 Carson Wentz PHI 27 16 16 9 7 \n",
"\n",
" Salary Completions ... Yards/Cmp Yards/Game Rating Sacks \\\n",
"0 33500000 394 ... 11.8 289.9 86.5 22 \n",
"1 6337819 380 ... 13.4 319.3 84.3 47 \n",
"2 30000000 408 ... 10.9 297.7 92.1 48 \n",
"3 23000000 373 ... 10.9 253.6 88.0 27 \n",
"4 32000000 388 ... 10.4 252.4 93.1 37 \n",
"\n",
" Sack Yards Net Yards/Attempt Adjusted NY/A Sack% 4th Quarter Comeback \\\n",
"0 170 6.90 6.46 3.4 1.0 \n",
"1 282 7.17 6.15 7.0 2.0 \n",
"2 316 6.25 6.08 7.2 3.0 \n",
"3 185 6.05 6.24 4.2 1.0 \n",
"4 230 5.91 6.26 5.7 2.0 \n",
"\n",
" Game Winning Drive \n",
"0 2 \n",
"1 2 \n",
"2 2 \n",
"3 1 \n",
"4 4 \n",
"\n",
"[5 rows x 31 columns]\n"
]
}
],
"source": [
"# Import all libraries\n",
"import pandas as pd\n",
"import io\n",
"import numpy as np\n",
"from sklearn.decomposition import PCA\n",
"from sklearn import preprocessing\n",
"import matplotlib.pyplot as plt\n",
"\n",
"# Put data into array\n",
"qb_data = pd.read_csv('./data/quarterbacks3.csv',delimiter=\"\\t\")\n",
"# Preview\n",
"print (qb_data.head())"
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "pqTmFjs7i6eS",
"nbpages": {
"level": 1,
"link": "[3.2 Principal Component Analysis](https://ndcbe.github.io/cbe67701-uncertainty-quantification/03.02-Contributed-Example.html#3.2-Principal-Component-Analysis)",
"section": "3.2 Principal Component Analysis"
}
},
"source": [
"Now perform PCA on the data set.\n",
"\n"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 295
},
"colab_type": "code",
"id": "g7agRpq0yAXc",
"nbpages": {
"level": 1,
"link": "[3.2 Principal Component Analysis](https://ndcbe.github.io/cbe67701-uncertainty-quantification/03.02-Contributed-Example.html#3.2-Principal-Component-Analysis)",
"section": "3.2 Principal Component Analysis"
},
"outputId": "673ef9ed-4bc0-49f7-b682-0aa6cab0d04e"
},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"/anaconda3/lib/python3.7/site-packages/ipykernel_launcher.py:7: DataConversionWarning: Data with input dtype int64, float64 were all converted to float64 by the scale function.\n",
" import sys\n"
]
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"
"
]
}
],
"metadata": {
"colab": {
"authorship_tag": "ABX9TyOu19Zi7O5/wlDu9Kl/3tjP",
"collapsed_sections": [],
"include_colab_link": true,
"name": "03_02_Contributed_Example.ipynb",
"provenance": [],
"toc_visible": true
},
"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.7.3"
}
},
"nbformat": 4,
"nbformat_minor": 1
}