j1-template 2022.2.2 → 2022.3.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (149) hide show
  1. checksums.yaml +4 -4
  2. data/_includes/themes/j1/blocks/footer/boxes/contacts_box.proc +46 -18
  3. data/_includes/themes/j1/blocks/footer/boxes/links_box.proc +1 -0
  4. data/assets/data/fab.html +2 -2
  5. data/assets/data/footer.html +2 -2
  6. data/assets/themes/j1/adapter/js/analytics.js +13 -13
  7. data/assets/themes/j1/adapter/js/cookieConsent.js +1 -1
  8. data/assets/themes/j1/adapter/js/nbinteract.js +366 -120
  9. data/assets/themes/j1/core/css/themes/unodark/bootstrap.css +30 -40
  10. data/assets/themes/j1/core/css/themes/unodark/bootstrap.min.css +1 -1
  11. data/assets/themes/j1/core/css/themes/unolight/bootstrap.css +85 -216
  12. data/assets/themes/j1/core/css/themes/unolight/bootstrap.min.css +2 -2
  13. data/assets/themes/j1/core/js/template.js +1 -1
  14. data/assets/themes/j1/core/js/template.min.js +1 -1
  15. data/assets/themes/j1/core/js/template.min.js.map +1 -1
  16. data/assets/themes/j1/modules/carousel/css/theme/uno.css +5 -0
  17. data/assets/themes/j1/modules/carousel/css/theme/uno.min.css +1 -1
  18. data/assets/themes/j1/modules/cookieConsent/js/cookieConsent.js +1 -0
  19. data/assets/themes/j1/modules/justifiedGallery/css/justifiedGallery.css +6 -0
  20. data/assets/themes/j1/modules/justifiedGallery/css/justifiedGallery.min.css +1 -1
  21. data/assets/themes/j1/modules/mmenuLight/css/mmenu-light.css +2 -2
  22. data/assets/themes/j1/modules/mmenuLight/css/mmenu-light.min.css +1 -2
  23. data/assets/themes/j1/modules/nbInteract/README.md +169 -0
  24. data/assets/themes/j1/modules/nbInteract/css/nbinteract-core.css +4 -0
  25. data/assets/themes/j1/modules/nbInteract/css/nbinteract-core.min.css +4 -0
  26. data/assets/themes/j1/modules/nbInteract/css/theme/uno/nbinteract-core.css +33 -33
  27. data/assets/themes/j1/modules/nbInteract/css/theme/uno/nbinteract-core.min.css +1 -1
  28. data/assets/themes/j1/modules/nbInteract/js/requireJS/require.js +2068 -0
  29. data/assets/themes/j1/modules/nbInteract/js/requireJS/require.min.js +36 -0
  30. data/assets/themes/j1/modules/plotly/LICENSE +21 -0
  31. data/assets/themes/j1/modules/plotly/README.md +32 -0
  32. data/assets/themes/j1/modules/plotly/js/plotly.js +265345 -0
  33. data/assets/themes/j1/modules/plotly/js/plotly.min.js +65 -0
  34. data/assets/themes/j1/modules/requirejs/LICENSE +45 -0
  35. data/assets/themes/j1/modules/requirejs/README.md +79 -0
  36. data/assets/themes/j1/modules/requirejs/js/require.js +2068 -0
  37. data/assets/themes/j1/modules/requirejs/js/require.min.js +36 -0
  38. data/lib/j1/version.rb +1 -1
  39. data/lib/starter_web/Gemfile +1 -1
  40. data/lib/starter_web/_config.yml +1 -1
  41. data/lib/starter_web/_data/blocks/defaults/footer.yml +25 -17
  42. data/lib/starter_web/_data/blocks/footer.yml +78 -65
  43. data/lib/starter_web/_data/modules/analytics.yml +8 -23
  44. data/lib/starter_web/_data/modules/defaults/analytics.yml +1 -1
  45. data/lib/starter_web/_data/modules/defaults/cookieconsent.yml +4 -1
  46. data/lib/starter_web/_data/modules/justifiedGallery.yml +14 -8
  47. data/lib/starter_web/_data/modules/navigator_menu.yml +6 -3
  48. data/lib/starter_web/_data/modules/nbinteract.yml +12 -48
  49. data/lib/starter_web/_data/resources.yml +52 -18
  50. data/lib/starter_web/_includes/attributes.asciidoc +25 -0
  51. data/lib/starter_web/_plugins/lunr_index.rb +1 -1
  52. data/lib/starter_web/assets/images/pages/nbinteract/mandelbrot-menge-1920x1200.jpg +0 -0
  53. data/lib/starter_web/assets/images/pages/nbinteract/mandelbrot-menge.png +0 -0
  54. data/lib/starter_web/assets/images/pages/nbinteract/manual/nbi_bar.jpg +0 -0
  55. data/lib/starter_web/assets/images/pages/nbinteract/manual/nbi_hist.jpg +0 -0
  56. data/lib/starter_web/assets/images/pages/nbinteract/manual/nbi_line.jpg +0 -0
  57. data/lib/starter_web/assets/images/pages/nbinteract/manual/nbi_multiple_choice.jpg +0 -0
  58. data/lib/starter_web/assets/images/pages/nbinteract/manual/nbi_scatter.jpg +0 -0
  59. data/lib/starter_web/assets/images/pages/nbinteract/manual/nbi_scatter_drag.jpg +0 -0
  60. data/lib/starter_web/assets/images/pages/nbinteract/manual/nbi_short_answer.jpg +0 -0
  61. data/lib/starter_web/assets/images/pages/nbinteract/nbi-textbook-example.jpg +0 -0
  62. data/lib/starter_web/assets/videos/gallery/kick-it-old-school-poster.jpg +0 -0
  63. data/lib/starter_web/assets/videos/gallery/nye-party-shop-poster.jpg +0 -0
  64. data/lib/starter_web/assets/videos/gallery/stay-colorful-poster.jpg +0 -0
  65. data/lib/starter_web/collections/posts/public/series/_posts/2020-01-01-post-wiki-series.adoc +1 -0
  66. data/lib/starter_web/collections/posts/public/series/_posts/2020-01-02-post-wiki-series.adoc +1 -0
  67. data/lib/starter_web/collections/posts/public/series/_posts/2020-01-03-post-wiki-series.adoc +1 -0
  68. data/lib/starter_web/package.json +1 -2
  69. data/lib/starter_web/pages/public/jupyter/docs/_includes/documents/j1_docs_example_static.asciidoc +232 -232
  70. data/lib/starter_web/pages/public/jupyter/docs/j1-nbinteract-doc.adoc +165 -149
  71. data/lib/starter_web/pages/public/jupyter/docs/nbi-widget-manual.adoc +156 -11
  72. data/lib/starter_web/pages/public/jupyter/docs/nbinteract-doc.adoc +11 -6
  73. data/lib/starter_web/pages/public/jupyter/examples/j1-circular-times-table.adoc +136 -0
  74. data/lib/starter_web/pages/public/jupyter/examples/j1-interactive-widgets.adoc +9 -5
  75. data/lib/starter_web/pages/public/jupyter/examples/j1-odes-in-python.adoc +16 -7
  76. data/lib/starter_web/pages/public/jupyter/examples/j1-testing-plotly.adoc +95 -0
  77. data/lib/starter_web/pages/public/jupyter/examples/j1_climate-change-forecast.adoc +4 -4
  78. data/lib/starter_web/pages/public/jupyter/notebooks/j1/.ipynb_checkpoints/{algebra_with_sympy-checkpoint.ipynb → j1_circular_times_table-checkpoint.ipynb} +5190 -7291
  79. data/lib/starter_web/pages/public/jupyter/notebooks/j1/.ipynb_checkpoints/j1_climate_change_forecast-checkpoint.ipynb +2 -2
  80. data/lib/starter_web/pages/public/jupyter/notebooks/j1/.ipynb_checkpoints/j1_docs_example_dynamic-checkpoint.ipynb +1 -1
  81. data/lib/starter_web/pages/public/jupyter/notebooks/j1/.ipynb_checkpoints/j1_interactive_widgets-checkpoint.ipynb +170 -15
  82. data/lib/starter_web/pages/public/jupyter/notebooks/j1/.ipynb_checkpoints/j1_ode_selected-checkpoint.ipynb +1 -1
  83. data/lib/starter_web/pages/public/jupyter/notebooks/j1/.ipynb_checkpoints/j1_odes_in_python-checkpoint.ipynb +520 -111
  84. data/lib/starter_web/pages/public/jupyter/notebooks/j1/factor_by_factor.mp4 +0 -0
  85. data/lib/starter_web/pages/public/jupyter/notebooks/j1/{.ipynb_checkpoints/j1_algebra_with_sympy-checkpoint.ipynb → j1_circular_times_table.ipynb} +5178 -7308
  86. data/lib/starter_web/pages/public/jupyter/notebooks/j1/j1_climate_change_forecast.ipynb +2 -2
  87. data/lib/starter_web/pages/public/jupyter/notebooks/j1/j1_docs_example_dynamic.ipynb +1 -1
  88. data/lib/starter_web/pages/public/jupyter/notebooks/j1/j1_interactive_widgets.ipynb +170 -15
  89. data/lib/starter_web/pages/public/jupyter/notebooks/j1/{j1_ode_selected.ipynb → j1_odes_in_python.ipynb} +783 -34
  90. data/lib/starter_web/pages/public/jupyter/notebooks/j1/line_by_line.mp4 +0 -0
  91. data/lib/starter_web/pages/public/jupyter/notebooks/j1/point_by_point.mp4 +0 -0
  92. data/lib/starter_web/pages/public/jupyter/notebooks/nbi-docs/.ipynb_checkpoints/nbi_docs_recipes_interactive_questions-checkpoint.ipynb +185 -0
  93. data/lib/starter_web/pages/public/jupyter/notebooks/nbi-docs/.ipynb_checkpoints/nbi_docs_tutorial_interact-checkpoint.ipynb +254 -0
  94. data/lib/starter_web/pages/public/jupyter/notebooks/nbi-docs/.ipynb_checkpoints/nbi_docs_tutorial_monty_hall-checkpoint.ipynb +732 -0
  95. data/lib/starter_web/pages/public/jupyter/notebooks/nbi-docs/nbi_docs_recipes_interactive_questions.ipynb +19 -22
  96. data/lib/starter_web/pages/public/jupyter/notebooks/nbi-docs/nbi_docs_tutorial_monty_hall.ipynb +25 -26
  97. data/lib/starter_web/pages/public/jupyter/notebooks/textbooks/j1_circular_times_table.html +746 -0
  98. data/lib/starter_web/pages/public/jupyter/notebooks/textbooks/j1_climate_change_forecast.html +2 -2
  99. data/lib/starter_web/pages/public/jupyter/notebooks/textbooks/j1_interactive_widgets.html +217 -0
  100. data/lib/starter_web/pages/public/jupyter/notebooks/textbooks/j1_odes_in_python.html +955 -0
  101. data/lib/starter_web/pages/public/jupyter/notebooks/textbooks/nbi_docs_recipes_interactive_questions.html +1 -2
  102. data/lib/starter_web/pages/public/jupyter/{apis/binderhub-api.adoc → services/binderhub.adoc} +25 -28
  103. data/lib/starter_web/pages/public/jupyter/{apis/jupyterhub-api.adoc → services/jupyterhub.adoc} +8 -9
  104. data/lib/starter_web/pages/public/learn/roundtrip/100_present_images.adoc +1 -1
  105. data/lib/starter_web/pages/public/learn/roundtrip/100_present_videos.adoc +9 -15
  106. data/lib/starter_web/pages/public/learn/roundtrip/200_typography.adoc +1 -1
  107. data/lib/starter_web/pages/public/learn/roundtrip/300_icon_fonts.adoc +12 -1
  108. data/lib/starter_web/pages/public/learn/roundtrip/400_asciidoc_extensions.adoc +1 -1
  109. data/lib/starter_web/pages/public/learn/roundtrip/410_bs_modals_extentions.adoc +1 -1
  110. data/lib/starter_web/pages/public/learn/roundtrip/420_responsive_tables_extensions.adoc +1 -1
  111. data/lib/starter_web/pages/public/legal/en/300_privacy.adoc +117 -12
  112. data/lib/starter_web/pages/public/se/se-fake.adoc +47 -0
  113. data/lib/starter_web/utilsrv/_defaults/package.json +1 -1
  114. data/lib/starter_web/utilsrv/package.json +1 -1
  115. metadata +41 -41
  116. data/lib/starter_web/_data/_resources.yml +0 -1668
  117. data/lib/starter_web/assets/images/pages/nbinteract/binderhub-architecture.png +0 -0
  118. data/lib/starter_web/assets/videos/gallery/adriana-lima-poster.jpg +0 -0
  119. data/lib/starter_web/pages/public/jupyter/notebooks/binder/binder-launches.ipynb +0 -385
  120. data/lib/starter_web/pages/public/jupyter/notebooks/j1/.ipynb_checkpoints/Untitled-checkpoint.ipynb +0 -6
  121. data/lib/starter_web/pages/public/jupyter/notebooks/j1/.ipynb_checkpoints/binder-launches-checkpoint.ipynb +0 -385
  122. data/lib/starter_web/pages/public/jupyter/notebooks/j1/.ipynb_checkpoints/climate-change-forecast-checkpoint.ipynb +0 -916
  123. data/lib/starter_web/pages/public/jupyter/notebooks/j1/.ipynb_checkpoints/google_altair-checkpoint.ipynb +0 -33
  124. data/lib/starter_web/pages/public/jupyter/notebooks/j1/.ipynb_checkpoints/ipympl_test_plots-checkpoint.ipynb +0 -14517
  125. data/lib/starter_web/pages/public/jupyter/notebooks/j1/.ipynb_checkpoints/j1_altair_interactive-checkpoint.ipynb +0 -16493
  126. data/lib/starter_web/pages/public/jupyter/notebooks/j1/.ipynb_checkpoints/j1_altair_interactive_test-checkpoint.ipynb +0 -14697
  127. data/lib/starter_web/pages/public/jupyter/notebooks/j1/.ipynb_checkpoints/j1_altair_visualization-checkpoint.ipynb +0 -15358
  128. data/lib/starter_web/pages/public/jupyter/notebooks/j1/.ipynb_checkpoints/j1_altair_visualization_full-checkpoint.ipynb +0 -2576
  129. data/lib/starter_web/pages/public/jupyter/notebooks/j1/.ipynb_checkpoints/j1_climate_change_forecast.ipynb +0 -1060
  130. data/lib/starter_web/pages/public/jupyter/notebooks/j1/.ipynb_checkpoints/j1_docs_hist-checkpoint.ipynb +0 -98
  131. data/lib/starter_web/pages/public/jupyter/notebooks/j1/.ipynb_checkpoints/j1_interactive-checkpoint.ipynb +0 -560
  132. data/lib/starter_web/pages/public/jupyter/notebooks/j1/.ipynb_checkpoints/j1_ipympl_test_plots-checkpoint.ipynb +0 -14511
  133. data/lib/starter_web/pages/public/jupyter/notebooks/j1/.ipynb_checkpoints/j1_pandas_creating_reading_and_writing-checkpoint.ipynb +0 -328
  134. data/lib/starter_web/pages/public/jupyter/notebooks/j1/.ipynb_checkpoints/j1_recipes_layout-checkpoint.ipynb +0 -341
  135. data/lib/starter_web/pages/public/jupyter/notebooks/j1/.ipynb_checkpoints/nbi_docs_recipes_graphing-checkpoint.ipynb +0 -98
  136. data/lib/starter_web/pages/public/jupyter/notebooks/j1/binder-launches.ipynb +0 -411
  137. data/lib/starter_web/pages/public/jupyter/notebooks/nbi-docs/.ipynb_checkpoints/nbi_docs_examples_correlation-checkpoint.ipynb +0 -651
  138. data/lib/starter_web/pages/public/jupyter/notebooks/textbooks/binder-launches.html +0 -546
  139. data/lib/starter_web/pages/public/jupyter/notebooks/textbooks/j1_ode_selected.html +0 -186
  140. data/lib/starter_web/pages/public/jupyter/notebooks/themes/altair/excel.py +0 -55
  141. data/lib/starter_web/pages/public/jupyter/notebooks/themes/altair/ggplot.py +0 -108
  142. data/lib/starter_web/pages/public/jupyter/notebooks/themes/altair/ggplot2.py +0 -108
  143. data/lib/starter_web/pages/public/jupyter/notebooks/themes/altair/husky.py +0 -121
  144. data/lib/starter_web/pages/public/jupyter/notebooks/themes/altair/latimes.py +0 -149
  145. data/lib/starter_web/pages/public/jupyter/notebooks/themes/altair/pcolor.py +0 -6
  146. data/lib/starter_web/pages/public/jupyter/notebooks/themes/altair/quartz.py +0 -55
  147. data/lib/starter_web/pages/public/jupyter/notebooks/themes/altair/spacy_base.py +0 -94
  148. data/lib/starter_web/pages/public/jupyter/notebooks/themes/altair/spacy_mono.py +0 -158
  149. data/lib/starter_web/pages/public/jupyter/notebooks/themes/altair/sunsentinel.py +0 -125
@@ -1,651 +0,0 @@
1
- {
2
- "cells": [
3
- {
4
- "cell_type": "code",
5
- "execution_count": 1,
6
- "metadata": {},
7
- "outputs": [],
8
- "source": [
9
- "# HIDDEN\n",
10
- "from datascience import *\n",
11
- "%matplotlib inline\n",
12
- "import matplotlib.pyplot as plots\n",
13
- "plots.style.use('fivethirtyeight')\n",
14
- "import math\n",
15
- "import numpy as np\n",
16
- "from scipy import stats\n",
17
- "from ipywidgets import interact, interactive, fixed, interact_manual\n",
18
- "import ipywidgets as widgets\n",
19
- "import nbinteract as nbi"
20
- ]
21
- },
22
- {
23
- "cell_type": "markdown",
24
- "metadata": {},
25
- "source": [
26
- "### Correlation\n",
27
- "In this section we will develop a measure of how tightly clustered a scatter diagram is about a straight line. Formally, this is called measuring *linear association*."
28
- ]
29
- },
30
- {
31
- "cell_type": "markdown",
32
- "metadata": {},
33
- "source": [
34
- "#### The correlation coefficient\n",
35
- "\n",
36
- "The *correlation coefficient* measures the strength of the linear relationship between two variables. Graphically, it measures how clustered the scatter diagram is around a straight line.\n",
37
- "\n",
38
- "The term *correlation coefficient* is a quite long word, so usually the term shortened to *correlation* and denoted by $r$.\n",
39
- "\n",
40
- "Here are some mathematical facts about $r$ that we will just observe by simulation.\n",
41
- "\n",
42
- "- The correlation coefficient $r$ is a number between -1 and 1.\n",
43
- "- $r$ measures the extent to which the scatter plot clusters around a straight line.\n",
44
- "- $r$ = 1 if the scatter diagram is a perfect straight line sloping upwards, and $r$ = -1 if the scatter diagram is a perfect straight line sloping downwards."
45
- ]
46
- },
47
- {
48
- "cell_type": "markdown",
49
- "metadata": {},
50
- "source": [
51
- "The function ``r_scatter`` takes a value of $r$ as its argument and simulates a scatter plot with a correlation very close to $r$. Because of randomness in the simulation, the correlation is not expected to be exactly equal to $r$.\n",
52
- "\n",
53
- "Call ``r_scatter`` a few times, with different values of $r$ as the argument, and see how the scatter plot changes. \n",
54
- "\n",
55
- "When $r$ = 1 the scatter plot is perfectly linear and slopes upward. When $r$ = -1, the scatter plot is perfectly linear and slopes downward. When $r$ = 0, the scatter plot is a formless cloud around the horizontal axis, and the variables are said to be *uncorrelated*."
56
- ]
57
- },
58
- {
59
- "cell_type": "code",
60
- "execution_count": 2,
61
- "metadata": {},
62
- "outputs": [
63
- {
64
- "data": {
65
- "application/vnd.jupyter.widget-view+json": {
66
- "model_id": "d40394e76601418f9eaad00c672f41d1",
67
- "version_major": 2,
68
- "version_minor": 0
69
- },
70
- "text/plain": [
71
- "VBox(children=(interactive(children=(FloatSlider(value=0.0, description='r', max=1.0, min=-1.0, step=0.05), Ou…"
72
- ]
73
- },
74
- "metadata": {},
75
- "output_type": "display_data"
76
- }
77
- ],
78
- "source": [
79
- "z = np.random.normal(0, 1, 500)\n",
80
- "def r_scatter(xs, r):\n",
81
- " \"\"\"\n",
82
- " Generate y-values for a scatter plot with correlation approximately r\n",
83
- " \"\"\"\n",
84
- " return r*xs + (np.sqrt(1-r**2))*z\n",
85
- "\n",
86
- "corr_opts = {\n",
87
- " 'aspect_ratio': 1,\n",
88
- " 'xlim': (-3.5, 3.5),\n",
89
- " 'ylim': (-3.5, 3.5),\n",
90
- "}\n",
91
- "\n",
92
- "nbi.scatter(np.random.normal(size=500), r_scatter, options=corr_opts, r=(-1, 1, 0.05))"
93
- ]
94
- },
95
- {
96
- "cell_type": "markdown",
97
- "metadata": {},
98
- "source": [
99
- "#### Calculating the correlation\n",
100
- "\n",
101
- "The formula for $r$ is not apparent from our observations so far. It has a mathematical basis that is outside the scope of this class. However, as you will see, the calculation is straightforward and helps us understand several of the properties of $r$.\n",
102
- "\n",
103
- "**Formula** for $r$:\n",
104
- "\n",
105
- "$r$ is the **average of the products of the two variables**, when both variables are measured in standard units.\n",
106
- "\n",
107
- "Here are the steps in the calculation. We will apply the steps to a simple table of values of **x** and **y**."
108
- ]
109
- },
110
- {
111
- "cell_type": "code",
112
- "execution_count": 3,
113
- "metadata": {},
114
- "outputs": [
115
- {
116
- "data": {
117
- "text/html": [
118
- "<table border=\"1\" class=\"dataframe\">\n",
119
- " <thead>\n",
120
- " <tr>\n",
121
- " <th>x</th> <th>y</th>\n",
122
- " </tr>\n",
123
- " </thead>\n",
124
- " <tbody>\n",
125
- " <tr>\n",
126
- " <td>1 </td> <td>2 </td>\n",
127
- " </tr>\n",
128
- " <tr>\n",
129
- " <td>2 </td> <td>3 </td>\n",
130
- " </tr>\n",
131
- " <tr>\n",
132
- " <td>3 </td> <td>1 </td>\n",
133
- " </tr>\n",
134
- " <tr>\n",
135
- " <td>4 </td> <td>5 </td>\n",
136
- " </tr>\n",
137
- " <tr>\n",
138
- " <td>5 </td> <td>2 </td>\n",
139
- " </tr>\n",
140
- " <tr>\n",
141
- " <td>6 </td> <td>7 </td>\n",
142
- " </tr>\n",
143
- " </tbody>\n",
144
- "</table>"
145
- ],
146
- "text/plain": [
147
- "x | y\n",
148
- "1 | 2\n",
149
- "2 | 3\n",
150
- "3 | 1\n",
151
- "4 | 5\n",
152
- "5 | 2\n",
153
- "6 | 7"
154
- ]
155
- },
156
- "execution_count": 3,
157
- "metadata": {},
158
- "output_type": "execute_result"
159
- }
160
- ],
161
- "source": [
162
- "x = np.arange(1, 7, 1)\n",
163
- "y = make_array(2, 3, 1, 5, 2, 7)\n",
164
- "t = Table().with_columns(\n",
165
- " 'x', x,\n",
166
- " 'y', y\n",
167
- " )\n",
168
- "t"
169
- ]
170
- },
171
- {
172
- "cell_type": "markdown",
173
- "metadata": {},
174
- "source": [
175
- "Based on the scatter diagram, we expect that $r$ will be positive but not equal to 1."
176
- ]
177
- },
178
- {
179
- "cell_type": "code",
180
- "execution_count": 4,
181
- "metadata": {},
182
- "outputs": [
183
- {
184
- "data": {
185
- "application/vnd.jupyter.widget-view+json": {
186
- "model_id": "562201223b3e4e31846c056f1b44b96e",
187
- "version_major": 2,
188
- "version_minor": 0
189
- },
190
- "text/plain": [
191
- "VBox(children=(interactive(children=(Output(),), _dom_classes=('widget-interact',)), Figure(axes=[Axis(scale=L…"
192
- ]
193
- },
194
- "metadata": {},
195
- "output_type": "display_data"
196
- }
197
- ],
198
- "source": [
199
- "nbi.scatter(t.column(0), t.column(1), options={'aspect_ratio': 1})"
200
- ]
201
- },
202
- {
203
- "cell_type": "markdown",
204
- "metadata": {},
205
- "source": [
206
- "**Step 1.** Convert each variable to standard units."
207
- ]
208
- },
209
- {
210
- "cell_type": "code",
211
- "execution_count": 5,
212
- "metadata": {},
213
- "outputs": [],
214
- "source": [
215
- "def standard_units(nums):\n",
216
- " return (nums - np.mean(nums)) / np.std(nums)"
217
- ]
218
- },
219
- {
220
- "cell_type": "code",
221
- "execution_count": 6,
222
- "metadata": {},
223
- "outputs": [
224
- {
225
- "data": {
226
- "text/html": [
227
- "<table border=\"1\" class=\"dataframe\">\n",
228
- " <thead>\n",
229
- " <tr>\n",
230
- " <th>x</th> <th>y</th> <th>x (standard units)</th> <th>y (standard units)</th>\n",
231
- " </tr>\n",
232
- " </thead>\n",
233
- " <tbody>\n",
234
- " <tr>\n",
235
- " <td>1 </td> <td>2 </td> <td>-1.46385 </td> <td>-0.648886 </td>\n",
236
- " </tr>\n",
237
- " <tr>\n",
238
- " <td>2 </td> <td>3 </td> <td>-0.87831 </td> <td>-0.162221 </td>\n",
239
- " </tr>\n",
240
- " <tr>\n",
241
- " <td>3 </td> <td>1 </td> <td>-0.29277 </td> <td>-1.13555 </td>\n",
242
- " </tr>\n",
243
- " <tr>\n",
244
- " <td>4 </td> <td>5 </td> <td>0.29277 </td> <td>0.811107 </td>\n",
245
- " </tr>\n",
246
- " <tr>\n",
247
- " <td>5 </td> <td>2 </td> <td>0.87831 </td> <td>-0.648886 </td>\n",
248
- " </tr>\n",
249
- " <tr>\n",
250
- " <td>6 </td> <td>7 </td> <td>1.46385 </td> <td>1.78444 </td>\n",
251
- " </tr>\n",
252
- " </tbody>\n",
253
- "</table>"
254
- ],
255
- "text/plain": [
256
- "x | y | x (standard units) | y (standard units)\n",
257
- "1 | 2 | -1.46385 | -0.648886\n",
258
- "2 | 3 | -0.87831 | -0.162221\n",
259
- "3 | 1 | -0.29277 | -1.13555\n",
260
- "4 | 5 | 0.29277 | 0.811107\n",
261
- "5 | 2 | 0.87831 | -0.648886\n",
262
- "6 | 7 | 1.46385 | 1.78444"
263
- ]
264
- },
265
- "execution_count": 6,
266
- "metadata": {},
267
- "output_type": "execute_result"
268
- }
269
- ],
270
- "source": [
271
- "t_su = t.with_columns(\n",
272
- " 'x (standard units)', standard_units(x),\n",
273
- " 'y (standard units)', standard_units(y)\n",
274
- " )\n",
275
- "t_su"
276
- ]
277
- },
278
- {
279
- "cell_type": "markdown",
280
- "metadata": {},
281
- "source": [
282
- "**Step 2.** Multiply each pair of standard units."
283
- ]
284
- },
285
- {
286
- "cell_type": "code",
287
- "execution_count": 7,
288
- "metadata": {},
289
- "outputs": [
290
- {
291
- "data": {
292
- "text/html": [
293
- "<table border=\"1\" class=\"dataframe\">\n",
294
- " <thead>\n",
295
- " <tr>\n",
296
- " <th>x</th> <th>y</th> <th>x (standard units)</th> <th>y (standard units)</th> <th>product of standard units</th>\n",
297
- " </tr>\n",
298
- " </thead>\n",
299
- " <tbody>\n",
300
- " <tr>\n",
301
- " <td>1 </td> <td>2 </td> <td>-1.46385 </td> <td>-0.648886 </td> <td>0.949871 </td>\n",
302
- " </tr>\n",
303
- " <tr>\n",
304
- " <td>2 </td> <td>3 </td> <td>-0.87831 </td> <td>-0.162221 </td> <td>0.142481 </td>\n",
305
- " </tr>\n",
306
- " <tr>\n",
307
- " <td>3 </td> <td>1 </td> <td>-0.29277 </td> <td>-1.13555 </td> <td>0.332455 </td>\n",
308
- " </tr>\n",
309
- " <tr>\n",
310
- " <td>4 </td> <td>5 </td> <td>0.29277 </td> <td>0.811107 </td> <td>0.237468 </td>\n",
311
- " </tr>\n",
312
- " <tr>\n",
313
- " <td>5 </td> <td>2 </td> <td>0.87831 </td> <td>-0.648886 </td> <td>-0.569923 </td>\n",
314
- " </tr>\n",
315
- " <tr>\n",
316
- " <td>6 </td> <td>7 </td> <td>1.46385 </td> <td>1.78444 </td> <td>2.61215 </td>\n",
317
- " </tr>\n",
318
- " </tbody>\n",
319
- "</table>"
320
- ],
321
- "text/plain": [
322
- "x | y | x (standard units) | y (standard units) | product of standard units\n",
323
- "1 | 2 | -1.46385 | -0.648886 | 0.949871\n",
324
- "2 | 3 | -0.87831 | -0.162221 | 0.142481\n",
325
- "3 | 1 | -0.29277 | -1.13555 | 0.332455\n",
326
- "4 | 5 | 0.29277 | 0.811107 | 0.237468\n",
327
- "5 | 2 | 0.87831 | -0.648886 | -0.569923\n",
328
- "6 | 7 | 1.46385 | 1.78444 | 2.61215"
329
- ]
330
- },
331
- "execution_count": 7,
332
- "metadata": {},
333
- "output_type": "execute_result"
334
- }
335
- ],
336
- "source": [
337
- "t_product = t_su.with_column('product of standard units', t_su.column(2) * t_su.column(3))\n",
338
- "t_product"
339
- ]
340
- },
341
- {
342
- "cell_type": "markdown",
343
- "metadata": {},
344
- "source": [
345
- "**Step 3.** $r$ is the average of the products computed in Step 2."
346
- ]
347
- },
348
- {
349
- "cell_type": "code",
350
- "execution_count": 8,
351
- "metadata": {},
352
- "outputs": [
353
- {
354
- "data": {
355
- "text/plain": [
356
- "0.6174163971897709"
357
- ]
358
- },
359
- "execution_count": 8,
360
- "metadata": {},
361
- "output_type": "execute_result"
362
- }
363
- ],
364
- "source": [
365
- "# r is the average of the products of standard units\n",
366
- "\n",
367
- "r = np.mean(t_product.column(4))\n",
368
- "r"
369
- ]
370
- },
371
- {
372
- "cell_type": "markdown",
373
- "metadata": {},
374
- "source": [
375
- "As expected, $r$ is positive but not equal to 1."
376
- ]
377
- },
378
- {
379
- "cell_type": "markdown",
380
- "metadata": {},
381
- "source": [
382
- "#### Properties of $r$\n",
383
- "\n",
384
- "The calculation shows that:\n",
385
- "\n",
386
- "- $r$ is a pure number. It has no units. This is because $r$ is based on standard units.\n",
387
- "- $r$ is unaffected by changing the units on either axis. This too is because $r$ is based on standard units.\n",
388
- "- $r$ is unaffected by switching the axes. Algebraically, this is because the product of standard units does not depend on which variable is called **x** and which **y**. Geometrically, switching axes reflects the scatter plot about the line **y = x**, but does not change the amount of clustering nor the sign of the association."
389
- ]
390
- },
391
- {
392
- "cell_type": "code",
393
- "execution_count": 9,
394
- "metadata": {},
395
- "outputs": [
396
- {
397
- "data": {
398
- "application/vnd.jupyter.widget-view+json": {
399
- "model_id": "7373845f9f4c4826a8b60afd4df3cbc6",
400
- "version_major": 2,
401
- "version_minor": 0
402
- },
403
- "text/plain": [
404
- "VBox(children=(interactive(children=(Output(),), _dom_classes=('widget-interact',)), Figure(axes=[Axis(scale=L…"
405
- ]
406
- },
407
- "metadata": {},
408
- "output_type": "display_data"
409
- }
410
- ],
411
- "source": [
412
- "nbi.scatter(t.column(1), t.column(0), options={'aspect_ratio': 1})"
413
- ]
414
- },
415
- {
416
- "cell_type": "markdown",
417
- "metadata": {},
418
- "source": [
419
- "#### The correlation function\n",
420
- "We are going to be calculating correlations repeatedly, so it will help to define a function that computes it by performing all the steps described above. Let's define a function ``correlation`` that takes a table and the labels of two columns in the table. The function returns $r$, the mean of the products of those column values in standard units."
421
- ]
422
- },
423
- {
424
- "cell_type": "code",
425
- "execution_count": 10,
426
- "metadata": {},
427
- "outputs": [],
428
- "source": [
429
- "def correlation(t, x, y):\n",
430
- " return np.mean(standard_units(t.column(x))*standard_units(t.column(y)))"
431
- ]
432
- },
433
- {
434
- "cell_type": "code",
435
- "execution_count": 11,
436
- "metadata": {},
437
- "outputs": [
438
- {
439
- "data": {
440
- "application/vnd.jupyter.widget-view+json": {
441
- "model_id": "a229a4df59044f0887272fa2fa7cf8d2",
442
- "version_major": 2,
443
- "version_minor": 0
444
- },
445
- "text/plain": [
446
- "interactive(children=(ToggleButtons(description='x-axis', options=('x', 'y'), value='x'), ToggleButtons(descri…"
447
- ]
448
- },
449
- "metadata": {},
450
- "output_type": "display_data"
451
- },
452
- {
453
- "data": {
454
- "text/plain": [
455
- "<function __main__.correlation(t, x, y)>"
456
- ]
457
- },
458
- "execution_count": 11,
459
- "metadata": {},
460
- "output_type": "execute_result"
461
- }
462
- ],
463
- "source": [
464
- "interact(correlation, t=fixed(t),\n",
465
- " x=widgets.ToggleButtons(options=['x', 'y'], description='x-axis'),\n",
466
- " y=widgets.ToggleButtons(options=['x', 'y'], description='y-axis'))"
467
- ]
468
- },
469
- {
470
- "cell_type": "markdown",
471
- "metadata": {},
472
- "source": [
473
- "Let's call the function on the ``x`` and ``y`` columns of ``t``. The function returns the same answer to the correlation between $x$ and $y$ as we got by direct application of the formula for $r$. "
474
- ]
475
- },
476
- {
477
- "cell_type": "code",
478
- "execution_count": 12,
479
- "metadata": {},
480
- "outputs": [
481
- {
482
- "data": {
483
- "text/plain": [
484
- "0.6174163971897709"
485
- ]
486
- },
487
- "execution_count": 12,
488
- "metadata": {},
489
- "output_type": "execute_result"
490
- }
491
- ],
492
- "source": [
493
- "correlation(t, 'x', 'y')"
494
- ]
495
- },
496
- {
497
- "cell_type": "markdown",
498
- "metadata": {},
499
- "source": [
500
- "As we noticed, the order in which the variables are specified doesn't matter."
501
- ]
502
- },
503
- {
504
- "cell_type": "code",
505
- "execution_count": 13,
506
- "metadata": {},
507
- "outputs": [
508
- {
509
- "data": {
510
- "text/plain": [
511
- "0.6174163971897709"
512
- ]
513
- },
514
- "execution_count": 13,
515
- "metadata": {},
516
- "output_type": "execute_result"
517
- }
518
- ],
519
- "source": [
520
- "correlation(t, 'y', 'x')"
521
- ]
522
- },
523
- {
524
- "cell_type": "markdown",
525
- "metadata": {},
526
- "source": [
527
- "Calling ``correlation`` on columns of the table ``suv`` gives us the correlation between price and mileage as well as the correlation between price and acceleration."
528
- ]
529
- },
530
- {
531
- "cell_type": "code",
532
- "execution_count": 14,
533
- "metadata": {},
534
- "outputs": [
535
- {
536
- "data": {
537
- "application/vnd.jupyter.widget-view+json": {
538
- "model_id": "c82ed7aaa9184cf083050fe0e369211b",
539
- "version_major": 2,
540
- "version_minor": 0
541
- },
542
- "text/plain": [
543
- "interactive(children=(ToggleButtons(description='x-axis', options=('mpg', 'msrp', 'acceleration'), value='mpg'…"
544
- ]
545
- },
546
- "metadata": {},
547
- "output_type": "display_data"
548
- },
549
- {
550
- "data": {
551
- "text/plain": [
552
- "<function __main__.correlation(t, x, y)>"
553
- ]
554
- },
555
- "execution_count": 14,
556
- "metadata": {},
557
- "output_type": "execute_result"
558
- }
559
- ],
560
- "source": [
561
- "suv = (Table.read_table('https://raw.githubusercontent.com/data-8/materials-fa17/master/lec/hybrid.csv')\n",
562
- " .where('class', 'SUV'))\n",
563
- "\n",
564
- "interact(correlation, t=fixed(suv),\n",
565
- " x=widgets.ToggleButtons(options=['mpg', 'msrp', 'acceleration'],\n",
566
- " description='x-axis'),\n",
567
- " y=widgets.ToggleButtons(options=['mpg', 'msrp', 'acceleration'],\n",
568
- " description='y-axis'))"
569
- ]
570
- },
571
- {
572
- "cell_type": "code",
573
- "execution_count": 15,
574
- "metadata": {},
575
- "outputs": [
576
- {
577
- "data": {
578
- "text/plain": [
579
- "-0.6667143635709919"
580
- ]
581
- },
582
- "execution_count": 15,
583
- "metadata": {},
584
- "output_type": "execute_result"
585
- }
586
- ],
587
- "source": [
588
- "correlation(suv, 'mpg', 'msrp')"
589
- ]
590
- },
591
- {
592
- "cell_type": "code",
593
- "execution_count": 16,
594
- "metadata": {},
595
- "outputs": [
596
- {
597
- "data": {
598
- "text/plain": [
599
- "0.48699799279959155"
600
- ]
601
- },
602
- "execution_count": 16,
603
- "metadata": {},
604
- "output_type": "execute_result"
605
- }
606
- ],
607
- "source": [
608
- "correlation(suv, 'acceleration', 'msrp')"
609
- ]
610
- },
611
- {
612
- "cell_type": "markdown",
613
- "metadata": {},
614
- "source": [
615
- "These values confirm what we had observed: \n",
616
- "\n",
617
- "- There is a negative association between price and efficiency, whereas the association between price and acceleration is positive.\n",
618
- "- The linear relation between price and acceleration is a little weaker (correlation about 0.5) than between price and mileage (correlation about -0.67). "
619
- ]
620
- },
621
- {
622
- "cell_type": "markdown",
623
- "metadata": {},
624
- "source": [
625
- "Correlation is a simple and powerful concept, but it is sometimes misused. Before using $r$, it is important to be aware of what correlation does and does not measure."
626
- ]
627
- }
628
- ],
629
- "metadata": {
630
- "anaconda-cloud": {},
631
- "kernelspec": {
632
- "display_name": "Python 3",
633
- "language": "python",
634
- "name": "python3"
635
- },
636
- "language_info": {
637
- "codemirror_mode": {
638
- "name": "ipython",
639
- "version": 3
640
- },
641
- "file_extension": ".py",
642
- "mimetype": "text/x-python",
643
- "name": "python",
644
- "nbconvert_exporter": "python",
645
- "pygments_lexer": "ipython3",
646
- "version": "3.7.9"
647
- }
648
- },
649
- "nbformat": 4,
650
- "nbformat_minor": 1
651
- }