{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Clustering for dataset exploration\n", "> A Summary of lecture \"Unsupervised Learning with scikit-learn\", via datacamp\n", "\n", "- toc: true \n", "- badges: true\n", "- comments: true\n", "- author: Chanseok Kang\n", "- categories: [Python, Datacamp, Machine_Learning]\n", "- image: images/kmeans-centroid.png" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import pandas as pd\n", "import numpy as np\n", "import matplotlib.pyplot as plt\n", "import seaborn as sns" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Unsupervised Learning\n", "- Unsupervised Learning\n", " - Finds patterns in data (E.g., clustering customers by their purchase)\n", " - Compressing the data using purchase patterns (dimension reduction)\n", "- Supervised vs unsupervised learning\n", " - Supervised learning finds patterns for a prediction task \n", " \n", " e.g., classify tumors as benign or cancerous (labels)\n", " - Unsupervised learning finds patterns in data, but without a specific prediction task in mind\n", "- K-means clustering\n", " - Finds clusters of samples\n", " - Number of clusters must be specified\n", "- Cluster labels for new samples\n", " - New samples can be assigned to existing clusters\n", " - k-means remembers the mean of each cluster (the \"centroids\")\n", " - Finds the nearest centroid to each new sample" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### How many clusters?" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "points = np.array([[ 0.06544649, -0.76866376],\n", " [-1.52901547, -0.42953079],\n", " [ 1.70993371, 0.69885253],\n", " [ 1.16779145, 1.01262638],\n", " [-1.80110088, -0.31861296],\n", " [-1.63567888, -0.02859535],\n", " [ 1.21990375, 0.74643463],\n", " [-0.26175155, -0.62492939],\n", " [-1.61925804, -0.47983949],\n", " [-1.84329582, -0.16694431],\n", " [ 1.35999602, 0.94995827],\n", " [ 0.42291856, -0.7349534 ],\n", " [-1.68576139, 0.10686728],\n", " [ 0.90629995, 1.09105162],\n", " [-1.56478322, -0.84675394],\n", " [-0.0257849 , -1.18672539],\n", " [ 0.83027324, 1.14504612],\n", " [ 1.22450432, 1.35066759],\n", " [-0.15394596, -0.71704301],\n", " [ 0.86358809, 1.06824613],\n", " [-1.43386366, -0.2381297 ],\n", " [ 0.03844769, -0.74635022],\n", " [-1.58567922, 0.08499354],\n", " [ 0.6359888 , -0.58477698],\n", " [ 0.24417242, -0.53172465],\n", " [-2.19680359, 0.49473677],\n", " [ 1.0323503 , -0.55688 ],\n", " [-0.28858067, -0.39972528],\n", " [ 0.20597008, -0.80171536],\n", " [-1.2107308 , -0.34924109],\n", " [ 1.33423684, 0.7721489 ],\n", " [ 1.19480152, 1.04788556],\n", " [ 0.9917477 , 0.89202008],\n", " [-1.8356219 , -0.04839732],\n", " [ 0.08415721, -0.71564326],\n", " [-1.48970175, -0.19299604],\n", " [ 0.38782418, -0.82060119],\n", " [-0.01448044, -0.9779841 ],\n", " [-2.0521341 , -0.02129125],\n", " [ 0.10331194, -0.82162781],\n", " [-0.44189315, -0.65710974],\n", " [ 1.10390926, 1.02481182],\n", " [-1.59227759, -0.17374038],\n", " [-1.47344152, -0.02202853],\n", " [-1.35514704, 0.22971067],\n", " [ 0.0412337 , -1.23776622],\n", " [ 0.4761517 , -1.13672124],\n", " [ 1.04335676, 0.82345905],\n", " [-0.07961882, -0.85677394],\n", " [ 0.87065059, 1.08052841],\n", " [ 1.40267313, 1.07525119],\n", " [ 0.80111157, 1.28342825],\n", " [-0.16527516, -1.23583804],\n", " [-0.33779221, -0.59194323],\n", " [ 0.80610749, -0.73752159],\n", " [-1.43590032, -0.56384446],\n", " [ 0.54868895, -0.95143829],\n", " [ 0.46803131, -0.74973907],\n", " [-1.5137129 , -0.83914323],\n", " [ 0.9138436 , 1.51126532],\n", " [-1.97233903, -0.41155375],\n", " [ 0.5213406 , -0.88654894],\n", " [ 0.62759494, -1.18590477],\n", " [ 0.94163014, 1.35399335],\n", " [ 0.56994768, 1.07036606],\n", " [-1.87663382, 0.14745773],\n", " [ 0.90612186, 0.91084011],\n", " [-1.37481454, 0.28428395],\n", " [-1.80564029, -0.96710574],\n", " [ 0.34307757, -0.79999275],\n", " [ 0.70380566, 1.00025804],\n", " [-1.68489862, -0.30564595],\n", " [ 1.31473221, 0.98614978],\n", " [ 0.26151216, -0.26069251],\n", " [ 0.9193121 , 0.82371485],\n", " [-1.21795929, -0.20219674],\n", " [-0.17722723, -1.02665245],\n", " [ 0.64824862, -0.66822881],\n", " [ 0.41206786, -0.28783784],\n", " [ 1.01568202, 1.13481667],\n", " [ 0.67900254, -0.91489502],\n", " [-1.05182747, -0.01062376],\n", " [ 0.61306599, 1.78210384],\n", " [-1.50219748, -0.52308922],\n", " [-1.72717293, -0.46173916],\n", " [-1.60995631, -0.1821007 ],\n", " [-1.09111021, -0.0781398 ],\n", " [-0.01046978, -0.80913034],\n", " [ 0.32782303, -0.80734754],\n", " [ 1.22038503, 1.1959793 ],\n", " [-1.33328681, -0.30001937],\n", " [ 0.87959517, 1.11566491],\n", " [-1.14829098, -0.30400762],\n", " [-0.58019755, -1.19996018],\n", " [-0.01161159, -0.78468854],\n", " [ 0.17359724, -0.63398145],\n", " [ 1.32738556, 0.67759969],\n", " [-1.93467327, 0.30572472],\n", " [-1.57761893, -0.27726365],\n", " [ 0.47639 , 1.21422648],\n", " [-1.65237509, -0.6803981 ],\n", " [-0.12609976, -1.04327457],\n", " [-1.89607082, -0.70085502],\n", " [ 0.57466899, 0.74878369],\n", " [-0.16660312, -0.83110295],\n", " [ 0.8013355 , 1.22244435],\n", " [ 1.18455426, 1.4346467 ],\n", " [ 1.08864428, 0.64667112],\n", " [-1.61158505, 0.22805725],\n", " [-1.57512205, -0.09612576],\n", " [ 0.0721357 , -0.69640328],\n", " [-1.40054298, 0.16390598],\n", " [ 1.09607713, 1.16804691],\n", " [-2.54346204, -0.23089822],\n", " [-1.34544875, 0.25151126],\n", " [-1.35478629, -0.19103317],\n", " [ 0.18368113, -1.15827725],\n", " [-1.31368677, -0.376357 ],\n", " [ 0.09990129, 1.22500491],\n", " [ 1.17225574, 1.30835143],\n", " [ 0.0865397 , -0.79714371],\n", " [-0.21053923, -1.13421511],\n", " [ 0.26496024, -0.94760742],\n", " [-0.2557591 , -1.06266022],\n", " [-0.26039757, -0.74774225],\n", " [-1.91787359, 0.16434571],\n", " [ 0.93021139, 0.49436331],\n", " [ 0.44770467, -0.72877918],\n", " [-1.63802869, -0.58925528],\n", " [-1.95712763, -0.10125137],\n", " [ 0.9270337 , 0.88251423],\n", " [ 1.25660093, 0.60828073],\n", " [-1.72818632, 0.08416887],\n", " [ 0.3499788 , -0.30490298],\n", " [-1.51696082, -0.50913109],\n", " [ 0.18763605, -0.55424924],\n", " [ 0.89609809, 0.83551508],\n", " [-1.54968857, -0.17114782],\n", " [ 1.2157457 , 1.23317728],\n", " [ 0.20307745, -1.03784906],\n", " [ 0.84589086, 1.03615273],\n", " [ 0.53237919, 1.47362884],\n", " [-0.05319044, -1.36150553],\n", " [ 1.38819743, 1.11729915],\n", " [ 1.00696304, 1.0367721 ],\n", " [ 0.56681869, -1.09637176],\n", " [ 0.86888296, 1.05248874],\n", " [-1.16286609, -0.55875245],\n", " [ 0.27717768, -0.83844015],\n", " [ 0.16563267, -0.80306607],\n", " [ 0.38263303, -0.42683241],\n", " [ 1.14519807, 0.89659026],\n", " [ 0.81455857, 0.67533667],\n", " [-1.8603152 , -0.09537561],\n", " [ 0.965641 , 0.90295579],\n", " [-1.49897451, -0.33254044],\n", " [-0.1335489 , -0.80727582],\n", " [ 0.12541527, -1.13354906],\n", " [ 1.06062436, 1.28816358],\n", " [-1.49154578, -0.2024641 ],\n", " [ 1.16189032, 1.28819877],\n", " [ 0.54282033, 0.75203524],\n", " [ 0.89221065, 0.99211624],\n", " [-1.49932011, -0.32430667],\n", " [ 0.3166647 , -1.34482915],\n", " [ 0.13972469, -1.22097448],\n", " [-1.5499724 , -0.10782584],\n", " [ 1.23846858, 1.37668804],\n", " [ 1.25558954, 0.72026098],\n", " [ 0.25558689, -1.28529763],\n", " [ 0.45168933, -0.55952093],\n", " [ 1.06202057, 1.03404604],\n", " [ 0.67451908, -0.54970299],\n", " [ 0.22759676, -1.02729468],\n", " [-1.45835281, -0.04951074],\n", " [ 0.23273501, -0.70849262],\n", " [ 1.59679589, 1.11395076],\n", " [ 0.80476105, 0.544627 ],\n", " [ 1.15492521, 1.04352191],\n", " [ 0.59632776, -1.19142897],\n", " [ 0.02839068, -0.43829366],\n", " [ 1.13451584, 0.5632633 ],\n", " [ 0.21576204, -1.04445753],\n", " [ 1.41048987, 1.02830719],\n", " [ 1.12289302, 0.58029441],\n", " [ 0.25200688, -0.82588436],\n", " [-1.28566081, -0.07390909],\n", " [ 1.52849815, 1.11822469],\n", " [-0.23907858, -0.70541972],\n", " [-0.25792784, -0.81825035],\n", " [ 0.59367818, -0.45239915],\n", " [ 0.07931909, -0.29233213],\n", " [-1.27256815, 0.11630577],\n", " [ 0.66930129, 1.00731481],\n", " [ 0.34791546, -1.20822877],\n", " [-2.11283993, -0.66897935],\n", " [-1.6293824 , -0.32718222],\n", " [-1.53819139, -0.01501972],\n", " [-0.11988545, -0.6036339 ],\n", " [-1.54418956, -0.30389844],\n", " [ 0.30026614, -0.77723173],\n", " [ 0.00935449, -0.53888192],\n", " [-1.33424393, -0.11560431],\n", " [ 0.47504489, 0.78421384],\n", " [ 0.59313264, 1.232239 ],\n", " [ 0.41370369, -1.35205857],\n", " [ 0.55840948, 0.78831053],\n", " [ 0.49855018, -0.789949 ],\n", " [ 0.35675809, -0.81038693],\n", " [-1.86197825, -0.59071305],\n", " [-1.61977671, -0.16076687],\n", " [ 0.80779295, -0.73311294],\n", " [ 1.62745775, 0.62787163],\n", " [-1.56993593, -0.08467567],\n", " [ 1.02558561, 0.89383302],\n", " [ 0.24293461, -0.6088253 ],\n", " [ 1.23130242, 1.00262186],\n", " [-1.9651013 , -0.15886289],\n", " [ 0.42795032, -0.70384432],\n", " [-1.58306818, -0.19431923],\n", " [-1.57195922, 0.01413469],\n", " [-0.98145373, 0.06132285],\n", " [-1.48637844, -0.5746531 ],\n", " [ 0.98745828, 0.69188053],\n", " [ 1.28619721, 1.28128821],\n", " [ 0.85850596, 0.95541481],\n", " [ 0.19028286, -0.82112942],\n", " [ 0.26561046, -0.04255239],\n", " [-1.61897897, 0.00862372],\n", " [ 0.24070183, -0.52664209],\n", " [ 1.15220993, 0.43916694],\n", " [-1.21967812, -0.2580313 ],\n", " [ 0.33412533, -0.86117761],\n", " [ 0.17131003, -0.75638965],\n", " [-1.19828397, -0.73744665],\n", " [-0.12245932, -0.45648879],\n", " [ 1.51200698, 0.88825741],\n", " [ 1.10338866, 0.92347479],\n", " [ 1.30972095, 0.59066989],\n", " [ 0.19964876, 1.14855889],\n", " [ 0.81460515, 0.84538972],\n", " [-1.6422739 , -0.42296206],\n", " [ 0.01224351, -0.21247816],\n", " [ 0.33709102, -0.74618065],\n", " [ 0.47301054, 0.72712075],\n", " [ 0.34706626, 1.23033757],\n", " [-0.00393279, -0.97209694],\n", " [-1.64303119, 0.05276337],\n", " [ 1.44649625, 1.14217033],\n", " [-1.93030087, -0.40026146],\n", " [-2.37296135, -0.72633645],\n", " [ 0.45860122, -1.06048953],\n", " [ 0.4896361 , -1.18928313],\n", " [-1.02335902, -0.17520578],\n", " [-1.32761107, -0.93963549],\n", " [-1.50987909, -0.09473658],\n", " [ 0.02723057, -0.79870549],\n", " [ 1.0169412 , 1.26461701],\n", " [ 0.47733527, -0.9898471 ],\n", " [-1.27784224, -0.547416 ],\n", " [ 0.49898802, -0.6237259 ],\n", " [ 1.06004731, 0.86870008],\n", " [ 1.00207501, 1.38293512],\n", " [ 1.31161394, 0.62833956],\n", " [ 1.13428443, 1.18346542],\n", " [ 1.27671346, 0.96632878],\n", " [-0.63342885, -0.97768251],\n", " [ 0.12698779, -0.93142317],\n", " [-1.34510812, -0.23754226],\n", " [-0.53162278, -1.25153594],\n", " [ 0.21959934, -0.90269938],\n", " [-1.78997479, -0.12115748],\n", " [ 1.23197473, -0.07453764],\n", " [ 1.4163536 , 1.21551752],\n", " [-1.90280976, -0.1638976 ],\n", " [-0.22440081, -0.75454248],\n", " [ 0.59559412, 0.92414553],\n", " [ 1.21930773, 1.08175284],\n", " [-1.99427535, -0.37587799],\n", " [-1.27818474, -0.52454551],\n", " [ 0.62352689, -1.01430108],\n", " [ 0.14024251, -0.428266 ],\n", " [-0.16145713, -1.16359731],\n", " [-1.74795865, -0.06033101],\n", " [-1.16659791, 0.0902393 ],\n", " [ 0.41110408, -0.8084249 ],\n", " [ 1.14757168, 0.77804528],\n", " [-1.65590748, -0.40105446],\n", " [-1.15306865, 0.00858699],\n", " [ 0.60892121, 0.68974833],\n", " [-0.08434138, -0.97615256],\n", " [ 0.19170053, -0.42331438],\n", " [ 0.29663162, -1.13357399],\n", " [-1.36893628, -0.25052124],\n", " [-0.08037807, -0.56784155],\n", " [ 0.35695011, -1.15064408],\n", " [ 0.02482179, -0.63594828],\n", " [-1.49075558, -0.2482507 ],\n", " [-1.408588 , 0.25635431],\n", " [-1.98274626, -0.54584475]])" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "xs = points[:, 0]\n", "ys = points[:, 1]\n", "\n", "plt.scatter(xs, ys)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Clustering 2D points\n", "From the scatter plot of the previous exercise, you saw that the points seem to separate into 3 clusters. You'll now create a KMeans model to find 3 clusters, and fit it to the data points from the previous exercise. After the model has been fit, you'll obtain the cluster labels for some new points using the ```.predict()``` method." ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "new_points = np.array([[ 4.00233332e-01, -1.26544471e+00],\n", " [ 8.03230370e-01, 1.28260167e+00],\n", " [-1.39507552e+00, 5.57292921e-02],\n", " [-3.41192677e-01, -1.07661994e+00],\n", " [ 1.54781747e+00, 1.40250049e+00],\n", " [ 2.45032018e-01, -4.83442328e-01],\n", " [ 1.20706886e+00, 8.88752605e-01],\n", " [ 1.25132628e+00, 1.15555395e+00],\n", " [ 1.81004415e+00, 9.65530731e-01],\n", " [-1.66963401e+00, -3.08103509e-01],\n", " [-7.17482105e-02, -9.37939700e-01],\n", " [ 6.82631927e-01, 1.10258160e+00],\n", " [ 1.09039598e+00, 1.43899529e+00],\n", " [-1.67645414e+00, -5.04557049e-01],\n", " [-1.84447804e+00, 4.52539544e-02],\n", " [ 1.24234851e+00, 1.02088661e+00],\n", " [-1.86147041e+00, 6.38645811e-03],\n", " [-1.46044943e+00, 1.53252383e-01],\n", " [ 4.98981817e-01, 8.98006058e-01],\n", " [ 9.83962244e-01, 1.04369375e+00],\n", " [-1.83136742e+00, -1.63632835e-01],\n", " [ 1.30622617e+00, 1.07658717e+00],\n", " [ 3.53420328e-01, -7.51320218e-01],\n", " [ 1.13957970e+00, 1.54503860e+00],\n", " [ 2.93995694e-01, -1.26135005e+00],\n", " [-1.14558225e+00, -3.78709636e-02],\n", " [ 1.18716105e+00, 6.00240663e-01],\n", " [-2.23211946e+00, 2.30475094e-01],\n", " [-1.28320430e+00, -3.93314568e-01],\n", " [ 4.94296696e-01, -8.83972009e-01],\n", " [ 6.31834930e-02, -9.11952228e-01],\n", " [ 9.35759539e-01, 8.66820685e-01],\n", " [ 1.58014721e+00, 1.03788392e+00],\n", " [ 1.06304960e+00, 1.02706082e+00],\n", " [-1.39732536e+00, -5.05162249e-01],\n", " [-1.09935240e-01, -9.08113619e-01],\n", " [ 1.17346758e+00, 9.47501092e-01],\n", " [ 9.20084511e-01, 1.45767672e+00],\n", " [ 5.82658956e-01, -9.00086832e-01],\n", " [ 9.52772328e-01, 8.99042386e-01],\n", " [-1.37266956e+00, -3.17878215e-02],\n", " [ 2.12706760e-02, -7.07614194e-01],\n", " [ 3.27049052e-01, -5.55998107e-01],\n", " [-1.71590267e+00, 2.15222266e-01],\n", " [ 5.12516209e-01, -7.60128245e-01],\n", " [ 1.13023469e+00, 7.22451122e-01],\n", " [-1.43074310e+00, -3.42787511e-01],\n", " [-1.82724625e+00, 1.17657775e-01],\n", " [ 1.41801350e+00, 1.11455080e+00],\n", " [ 1.26897304e+00, 1.41925971e+00],\n", " [ 8.04076494e-01, 1.63988557e+00],\n", " [ 8.34567752e-01, 1.09956689e+00],\n", " [-1.24714732e+00, -2.23522320e-01],\n", " [-1.29422537e+00, 8.18770024e-02],\n", " [-2.27378316e-01, -4.13331387e-01],\n", " [ 2.18830387e-01, -4.68183120e-01],\n", " [-1.22593414e+00, 2.55599147e-01],\n", " [-1.31294033e+00, -4.28892070e-01],\n", " [-1.33532382e+00, 6.52053776e-01],\n", " [-3.01100233e-01, -1.25156451e+00],\n", " [ 2.02778356e-01, -9.05277445e-01],\n", " [ 1.01357784e+00, 1.12378981e+00],\n", " [ 8.18324394e-01, 8.60841257e-01],\n", " [ 1.26181556e+00, 1.46613744e+00],\n", " [ 4.64867724e-01, -7.97212459e-01],\n", " [ 3.60908898e-01, 8.44106720e-01],\n", " [-2.15098310e+00, -3.69583937e-01],\n", " [ 1.05005281e+00, 8.74181364e-01],\n", " [ 1.06580074e-01, -7.49268153e-01],\n", " [-1.73945723e+00, 2.52183577e-01],\n", " [-1.12017687e-01, -6.52469788e-01],\n", " [ 5.16618951e-01, -6.41267582e-01],\n", " [ 3.26621787e-01, -8.80608015e-01],\n", " [ 1.09017759e+00, 1.10952558e+00],\n", " [ 3.64459576e-01, -6.94215622e-01],\n", " [-1.90779318e+00, 1.87383674e-01],\n", " [-1.95601829e+00, 1.39959126e-01],\n", " [ 3.18541701e-01, -4.05271704e-01],\n", " [ 7.36512699e-01, 1.76416255e+00],\n", " [-1.44175162e+00, -5.72320429e-02],\n", " [ 3.21757168e-01, -5.34283821e-01],\n", " [-1.37317305e+00, 4.64484644e-02],\n", " [ 6.87225910e-02, -1.10522944e+00],\n", " [ 9.59314218e-01, 6.52316210e-01],\n", " [-1.62641919e+00, -5.62423280e-01],\n", " [ 1.06788305e+00, 7.29260482e-01],\n", " [-1.79643547e+00, -9.88307418e-01],\n", " [-9.88628377e-02, -6.81198092e-02],\n", " [-1.05135700e-01, 1.17022143e+00],\n", " [ 8.79964699e-01, 1.25340317e+00],\n", " [ 9.80753407e-01, 1.15486539e+00],\n", " [-8.33224966e-02, -9.24844368e-01],\n", " [ 8.48759673e-01, 1.09397425e+00],\n", " [ 1.32941649e+00, 1.13734563e+00],\n", " [ 3.23788068e-01, -7.49732451e-01],\n", " [-1.52610970e+00, -2.49016929e-01],\n", " [-1.48598116e+00, -2.68828608e-01],\n", " [-1.80479553e+00, 1.87052700e-01],\n", " [-2.01907347e+00, -4.49511651e-01],\n", " [ 2.87202402e-01, -6.55487415e-01],\n", " [ 8.22295102e-01, 1.38443234e+00],\n", " [-3.56997036e-02, -8.01825807e-01],\n", " [-1.66955440e+00, -1.38258505e-01],\n", " [-1.78226821e+00, 2.93353033e-01],\n", " [ 7.25837138e-01, -6.23374024e-01],\n", " [ 3.88432593e-01, -7.61283497e-01],\n", " [ 1.49002783e+00, 7.95678671e-01],\n", " [ 6.55423228e-04, -7.40580702e-01],\n", " [-1.34533116e+00, -4.75629937e-01],\n", " [-8.03845106e-01, -3.09943013e-01],\n", " [-2.49041295e-01, -1.00662418e+00],\n", " [-1.41095118e+00, -7.06744127e-02],\n", " [-1.75119594e+00, -3.00491336e-01],\n", " [-1.27942724e+00, 1.73774600e-01],\n", " [ 3.35028183e-01, 6.24761151e-01],\n", " [ 1.16819649e+00, 1.18902251e+00],\n", " [ 7.15210457e-01, 9.26077419e-01],\n", " [ 1.30057278e+00, 9.16349565e-01],\n", " [-1.21697008e+00, 1.10039477e-01],\n", " [-1.70707935e+00, -5.99659536e-02],\n", " [ 1.20730655e+00, 1.05480463e+00],\n", " [ 1.86896009e-01, -9.58047234e-01],\n", " [ 8.03463471e-01, 3.86133140e-01],\n", " [-1.73486790e+00, -1.49831913e-01],\n", " [ 1.31261499e+00, 1.11802982e+00],\n", " [ 4.04993148e-01, -5.10900347e-01],\n", " [-1.93267968e+00, 2.20764694e-01],\n", " [ 6.56004799e-01, 9.61887161e-01],\n", " [-1.40588215e+00, 1.17134403e-01],\n", " [-1.74306264e+00, -7.47473959e-02],\n", " [ 5.43745412e-01, 1.47209224e+00],\n", " [-1.97331669e+00, -2.27124493e-01],\n", " [ 1.53901171e+00, 1.36049081e+00],\n", " [-1.48323452e+00, -4.90302063e-01],\n", " [ 3.86748484e-01, -1.26173400e+00],\n", " [ 1.17015716e+00, 1.18549415e+00],\n", " [-8.05381721e-02, -3.21923627e-01],\n", " [-6.82273156e-02, -8.52825887e-01],\n", " [ 7.13500028e-01, 1.27868520e+00],\n", " [-1.85014378e+00, -5.03490558e-01],\n", " [ 6.36085266e-02, -1.41257040e+00],\n", " [ 1.52966062e+00, 9.66056572e-01],\n", " [ 1.62165714e-01, -1.37374843e+00],\n", " [-3.23474497e-01, -7.06620269e-01],\n", " [-1.51768993e+00, 1.87658302e-01],\n", " [ 8.88895911e-01, 7.62237161e-01],\n", " [ 4.83164032e-01, 8.81931869e-01],\n", " [-5.52997766e-02, -7.11305016e-01],\n", " [-1.57966441e+00, -6.29220313e-01],\n", " [ 5.51308645e-02, -8.47206763e-01],\n", " [-2.06001582e+00, 5.87697787e-02],\n", " [ 1.11810855e+00, 1.30254175e+00],\n", " [ 4.87016164e-01, -9.90143937e-01],\n", " [-1.65518042e+00, -1.69386383e-01],\n", " [-1.44349738e+00, 1.90299243e-01],\n", " [-1.70074547e-01, -8.26736022e-01],\n", " [-1.82433979e+00, -3.07814626e-01],\n", " [ 1.03093485e+00, 1.26457691e+00],\n", " [ 1.64431169e+00, 1.27773115e+00],\n", " [-1.47617693e+00, 2.60783872e-02],\n", " [ 1.00953067e+00, 1.14270181e+00],\n", " [-1.45285636e+00, -2.55216207e-01],\n", " [-1.74092917e+00, -8.34443177e-02],\n", " [ 1.22038299e+00, 1.28699961e+00],\n", " [ 9.16925397e-01, 7.32070275e-01],\n", " [-1.60754185e-03, -7.26375571e-01],\n", " [ 8.93841238e-01, 8.41146643e-01],\n", " [ 6.33791961e-01, 1.00915134e+00],\n", " [-1.47927075e+00, -6.99781936e-01],\n", " [ 5.44799374e-02, -1.06441970e+00],\n", " [-1.51935568e+00, -4.89276929e-01],\n", " [ 2.89939026e-01, -7.73145523e-01],\n", " [-9.68154061e-03, -1.13302207e+00],\n", " [ 1.13474639e+00, 9.71541744e-01],\n", " [ 5.36421406e-01, -8.47906388e-01],\n", " [ 1.14759864e+00, 6.89915205e-01],\n", " [ 5.73291902e-01, 7.90802710e-01],\n", " [ 2.12377397e-01, -6.07569808e-01],\n", " [ 5.26579548e-01, -8.15930264e-01],\n", " [-2.01831641e+00, 6.78650740e-02],\n", " [-2.35512624e-01, -1.08205132e+00],\n", " [ 1.59274780e-01, -6.00717261e-01],\n", " [ 2.28120356e-01, -1.16003549e+00],\n", " [-1.53658378e+00, 8.40798808e-02],\n", " [ 1.13954609e+00, 6.31782001e-01],\n", " [ 1.01119255e+00, 1.04360805e+00],\n", " [-1.42039867e-01, -4.81230337e-01],\n", " [-2.23120182e+00, 8.49162905e-02],\n", " [ 1.25554811e-01, -1.01794793e+00],\n", " [-1.72493509e+00, -6.94426177e-01],\n", " [-1.60434630e+00, 4.45550868e-01],\n", " [ 7.37153979e-01, 9.26560744e-01],\n", " [ 6.72905271e-01, 1.13366030e+00],\n", " [ 1.20066456e+00, 7.26273093e-01],\n", " [ 7.58747209e-02, -9.83378326e-01],\n", " [ 1.28783262e+00, 1.18088601e+00],\n", " [ 1.06521930e+00, 1.00714746e+00],\n", " [ 1.05871698e+00, 1.12956519e+00],\n", " [-1.12643410e+00, 1.66787744e-01],\n", " [-1.10157218e+00, -3.64137806e-01],\n", " [ 2.35118217e-01, -1.39769949e-01],\n", " [ 1.13853795e+00, 1.01018519e+00],\n", " [ 5.31205654e-01, -8.81990792e-01],\n", " [ 4.33085936e-01, -7.64059042e-01],\n", " [-4.48926156e-03, -1.30548411e+00],\n", " [-1.76348589e+00, -4.97430739e-01],\n", " [ 1.36485681e+00, 5.83404699e-01],\n", " [ 5.66923900e-01, 1.51391963e+00],\n", " [ 1.35736826e+00, 6.70915318e-01],\n", " [ 1.07173397e+00, 6.11990884e-01],\n", " [ 1.00106915e+00, 8.93815326e-01],\n", " [ 1.33091007e+00, 8.79773879e-01],\n", " [-1.79603740e+00, -3.53883973e-02],\n", " [-1.27222979e+00, 4.00156642e-01],\n", " [ 8.47480603e-01, 1.17032364e+00],\n", " [-1.50989129e+00, -7.12318330e-01],\n", " [-1.24953576e+00, -5.57859730e-01],\n", " [-1.27717973e+00, -5.99350550e-01],\n", " [-1.81946743e+00, 7.37057673e-01],\n", " [ 1.19949867e+00, 1.56969386e+00],\n", " [-1.25543847e+00, -2.33892826e-01],\n", " [-1.63052058e+00, 1.61455865e-01],\n", " [ 1.10611305e+00, 7.39698224e-01],\n", " [ 6.70193192e-01, 8.70567001e-01],\n", " [ 3.69670156e-01, -6.94645306e-01],\n", " [-1.26362293e+00, -6.99249285e-01],\n", " [-3.66687507e-01, -1.35310260e+00],\n", " [ 2.44032147e-01, -6.59470793e-01],\n", " [-1.27679142e+00, -4.85453412e-01],\n", " [ 3.77473612e-02, -6.99251605e-01],\n", " [-2.19148539e+00, -4.91199500e-01],\n", " [-2.93277777e-01, -5.89488212e-01],\n", " [-1.65737397e+00, -2.98337786e-01],\n", " [ 7.36638861e-01, 5.78037057e-01],\n", " [ 1.13709081e+00, 1.30119754e+00],\n", " [-1.44146601e+00, 3.13934680e-02],\n", " [ 5.92360708e-01, 1.22545114e+00],\n", " [ 6.51719414e-01, 4.92674894e-01],\n", " [ 5.94559139e-01, 8.25637315e-01],\n", " [-1.87900722e+00, -5.21899626e-01],\n", " [ 2.15225041e-01, -1.28269851e+00],\n", " [ 4.99145965e-01, -6.70268634e-01],\n", " [-1.82954176e+00, -3.39269731e-01],\n", " [ 7.92721403e-01, 1.33785606e+00],\n", " [ 9.54363372e-01, 9.80396626e-01],\n", " [-1.35359846e+00, 1.03976340e-01],\n", " [ 1.05595062e+00, 8.07031927e-01],\n", " [-1.94311010e+00, -1.18976964e-01],\n", " [-1.39604137e+00, -3.10095976e-01],\n", " [ 1.28977624e+00, 1.01753365e+00],\n", " [-1.59503139e+00, -5.40574609e-01],\n", " [-1.41994046e+00, -3.81032569e-01],\n", " [-2.35569801e-02, -1.10133702e+00],\n", " [-1.26038568e+00, -6.93273886e-01],\n", " [ 9.60215981e-01, -8.11553694e-01],\n", " [ 5.51803308e-01, -1.01793176e+00],\n", " [ 3.70185085e-01, -1.06885468e+00],\n", " [ 8.25529207e-01, 8.77007060e-01],\n", " [-1.87032595e+00, 2.87507199e-01],\n", " [-1.56260769e+00, -1.89196712e-01],\n", " [-1.26346548e+00, -7.74725237e-01],\n", " [-6.33800421e-02, -7.59400611e-01],\n", " [ 8.85298280e-01, 8.85620519e-01],\n", " [-1.43324686e-01, -1.16083678e+00],\n", " [-1.83908725e+00, -3.26655515e-01],\n", " [ 2.74709229e-01, -1.04546829e+00],\n", " [-1.45703573e+00, -2.91842036e-01],\n", " [-1.59048842e+00, 1.66063031e-01],\n", " [ 9.25549284e-01, 7.41406406e-01],\n", " [ 1.97245469e-01, -7.80703225e-01],\n", " [ 2.88401697e-01, -8.32425551e-01],\n", " [ 7.24141618e-01, -7.99149200e-01],\n", " [-1.62658639e+00, -1.80005543e-01],\n", " [ 5.84481588e-01, 1.13195640e+00],\n", " [ 1.02146732e+00, 4.59657799e-01],\n", " [ 8.65050554e-01, 9.57714887e-01],\n", " [ 3.98717766e-01, -1.24273147e+00],\n", " [ 8.62234892e-01, 1.10955561e+00],\n", " [-1.35999430e+00, 2.49942654e-02],\n", " [-1.19178505e+00, -3.82946323e-02],\n", " [ 1.29392424e+00, 1.10320509e+00],\n", " [ 1.25679630e+00, -7.79857582e-01],\n", " [ 9.38040302e-02, -5.53247258e-01],\n", " [-1.73512175e+00, -9.76271667e-02],\n", " [ 2.23153587e-01, -9.43474351e-01],\n", " [ 4.01989100e-01, -1.10963051e+00],\n", " [-1.42244158e+00, 1.81914703e-01],\n", " [ 3.92476267e-01, -8.78426277e-01],\n", " [ 1.25181875e+00, 6.93614996e-01],\n", " [ 1.77481317e-02, -7.20304235e-01],\n", " [-1.87752521e+00, -2.63870424e-01],\n", " [-1.58063602e+00, -5.50456344e-01],\n", " [-1.59589493e+00, -1.53932892e-01],\n", " [-1.01829770e+00, 3.88542370e-02],\n", " [ 1.24819659e+00, 6.60041803e-01],\n", " [-1.25551377e+00, -2.96172009e-02],\n", " [-1.41864559e+00, -3.58230179e-01],\n", " [ 5.25758326e-01, 8.70500543e-01],\n", " [ 5.55599988e-01, 1.18765072e+00],\n", " [ 2.81344439e-02, -6.99111314e-01]])" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[0 1 2 0 1 0 1 1 1 2 0 1 1 2 2 1 2 2 1 1 2 1 0 1 0 2 1 2 2 0 0 1 1 1 2 0 1\n", " 1 0 1 2 0 0 2 0 1 2 2 1 1 1 1 2 2 0 0 2 2 2 0 0 1 1 1 0 1 2 1 0 2 0 0 0 1\n", " 0 2 2 0 1 2 0 2 0 1 2 1 2 0 1 1 1 0 1 1 0 2 2 2 2 0 1 0 2 2 0 0 1 0 2 2 0\n", " 2 2 2 1 1 1 1 2 2 1 0 1 2 1 0 2 1 2 2 1 2 1 2 0 1 0 0 1 2 0 1 0 0 2 1 1 0\n", " 2 0 2 1 0 2 2 0 2 1 1 2 1 2 2 1 1 0 1 1 2 0 2 0 0 1 0 1 1 0 0 2 0 0 0 2 1\n", " 1 0 2 0 2 2 1 1 1 0 1 1 1 2 2 0 1 0 0 0 2 1 1 1 1 1 1 2 2 1 2 2 2 2 1 2 2\n", " 1 1 0 2 0 0 2 0 2 0 2 1 1 2 1 1 1 2 0 0 2 1 1 2 1 2 2 1 2 2 0 2 0 0 0 1 2\n", " 2 2 0 1 0 2 0 2 2 1 0 0 0 2 1 1 1 0 1 2 2 1 0 0 2 0 0 2 0 1 0 2 2 2 2 1 2\n", " 2 1 1 0]\n" ] } ], "source": [ "from sklearn.cluster import KMeans\n", "\n", "# Create a KMeans instance with 3 clusters: model\n", "model = KMeans(n_clusters=3)\n", "\n", "# Fit model to points\n", "model.fit(points)\n", "\n", "# Determine the cluster labels of new_points: labels\n", "labels = model.predict(new_points)\n", "\n", "# Print cluster labels of new_points\n", "print(labels)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Inspect your clustering\n", "Let's now inspect the clustering you performed in the previous exercise!\n", "\n" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# Assign the columns of new_points: xs and ys\n", "xs = new_points[:, 0]\n", "ys = new_points[:, 1]\n", "\n", "# Make a scatter plot of xs and ys, using labels to define the colors\n", "plt.scatter(xs, ys, c=labels, alpha=0.5)\n", "\n", "# Assign the cluster centers: centroids\n", "centroids = model.cluster_centers_\n", "\n", "# Assign the columns of centroids: centroids_x, centroids_y\n", "centroids_x = centroids[:, 0]\n", "centroids_y = centroids[:, 1]\n", "\n", "# Make a scatter plot of centroids_x and centroids_y\n", "plt.scatter(centroids_x, centroids_y, marker='D', s=50, color='red')\n", "plt.savefig('../images/kmeans-centroid.png')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Evaluating a clustering\n", "- Evaluating a clustering\n", " - Can check correspondence with e.g. iris species, but what if there are no species to check against?\n", " - Measure quality of a clustering\n", " - Informs choice of how many clusters to look for\n", "- Cross-tabulation with pandas\n", " - Clusters vs species is a \"cross-tabulation\"\n", "- Measuring clustering quality\n", " - Using only samples and their cluster labels\n", " - A good clustering has tight clusters\n", " - Samples in each cluster bunched together\n", "- Inertia measures clustering quality\n", " - Measures how spread out the clusters are (lower is better)\n", " - Distance from each sample to centroid of its cluster\n", " - k-means attempts to minimize the inertia when choosing clusters\n", "- How many clusters to choose?\n", " - Choose an \"elbow\" in the inertia plot\n", " - Where inertia begins to decrease more slowly" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### How many clusters of grain?\n", "In the video, you learned how to choose a good number of clusters for a dataset using the k-means inertia graph. You are given an array ```samples``` containing the measurements (such as area, perimeter, length, and several others) of samples of grain. What's a good number of clusters in this case?" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Preprocess" ] }, { "cell_type": "code", "execution_count": 20, "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", "
01234567
015.2614.840.87105.7633.3122.2215.220Kama wheat
114.8814.570.88115.5543.3331.0184.956Kama wheat
214.2914.090.90505.2913.3372.6994.825Kama wheat
313.8413.940.89555.3243.3792.2594.805Kama wheat
416.1414.990.90345.6583.5621.3555.175Kama wheat
\n", "
" ], "text/plain": [ " 0 1 2 3 4 5 6 7\n", "0 15.26 14.84 0.8710 5.763 3.312 2.221 5.220 Kama wheat\n", "1 14.88 14.57 0.8811 5.554 3.333 1.018 4.956 Kama wheat\n", "2 14.29 14.09 0.9050 5.291 3.337 2.699 4.825 Kama wheat\n", "3 13.84 13.94 0.8955 5.324 3.379 2.259 4.805 Kama wheat\n", "4 16.14 14.99 0.9034 5.658 3.562 1.355 5.175 Kama wheat" ] }, "execution_count": 20, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df = pd.read_csv('./dataset/seeds.csv', header=None)\n", "df[7] = df[7].map({1:'Kama wheat', 2:'Rosa wheat', 3:'Canadian wheat'})\n", "df.head()" ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [], "source": [ "samples = df.iloc[:, :-1].values\n", "varieties = df.iloc[:, -1].values" ] }, { "cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "([,\n", " ,\n", " ,\n", " ,\n", " ],\n", " )" ] }, "execution_count": 24, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "ks = range(1,6)\n", "inertias = []\n", "\n", "for k in ks:\n", " # Create a KMeans instance with k clusters: model\n", " model = KMeans(n_clusters=k)\n", " \n", " # Fit model to samples\n", " model.fit(samples)\n", " \n", " # Append the inertia to the list of inertias\n", " inertias.append(model.inertia_)\n", " \n", "# Plot ks vs inertias\n", "plt.plot(ks, inertias, '-o')\n", "plt.xlabel('number of clusters, k')\n", "plt.ylabel('inertia')\n", "plt.xticks(ks)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Evaluating the grain clustering\n", "In the previous exercise, you observed from the inertia plot that 3 is a good number of clusters for the grain data. In fact, the grain samples come from a mix of 3 different grain varieties: \"Kama\", \"Rosa\" and \"Canadian\". In this exercise, cluster the grain samples into three clusters, and compare the clusters to the grain varieties using a cross-tabulation.\n" ] }, { "cell_type": "code", "execution_count": 25, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "varieties Canadian wheat Kama wheat Rosa wheat\n", "labels \n", "0 2 60 10\n", "1 0 1 60\n", "2 68 9 0\n" ] } ], "source": [ "# Create a KMeans model with 3 clusters: model\n", "model = KMeans(n_clusters=3)\n", "\n", "# Use fit_predict to fit model and obtain cluster labels: labels\n", "labels = model.fit_predict(samples)\n", "\n", "# Create a DataFrame with labels and varieties as columns: df\n", "df = pd.DataFrame({'labels': labels, 'varieties': varieties})\n", "\n", "# Create crosstab: ct\n", "ct = pd.crosstab(df['labels'], df['varieties'])\n", "\n", "# Display ct\n", "print(ct)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Transforming features for better clusterings\n", "- StandardScaler\n", " - In kmeans, feature variance = feature influence\n", " - ```StandardScaler``` transforms each feature to have mean 0 and variance 1\n", " - Features are said to be \"standardized\"\n", "- StandardScaler, then KMeans\n", " - Need to perform two steps: ```StandardScaler```, then ```KMeans```\n", " - Use ```sklearn``` pipeline to combine multiple steps\n", " - Data flows from one step into the next" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Scaling fish data for clustering\n", "You are given an array ```samples``` giving measurements of fish. Each row represents an individual fish. The measurements, such as weight in grams, length in centimeters, and the percentage ratio of height to length, have very different scales. In order to cluster this data effectively, you'll need to standardize these features first. In this exercise, you'll build a pipeline to standardize and cluster the data.\n", "\n", "These fish measurement data were sourced from the [Journal of Statistics Education](http://ww2.amstat.org/publications/jse/jse_data_archive.htm)." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Preprocess" ] }, { "cell_type": "code", "execution_count": 27, "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", "
0123456
0Bream242.023.225.430.038.413.4
1Bream290.024.026.331.240.013.8
2Bream340.023.926.531.139.815.1
3Bream363.026.329.033.538.013.3
4Bream430.026.529.034.036.615.1
\n", "
" ], "text/plain": [ " 0 1 2 3 4 5 6\n", "0 Bream 242.0 23.2 25.4 30.0 38.4 13.4\n", "1 Bream 290.0 24.0 26.3 31.2 40.0 13.8\n", "2 Bream 340.0 23.9 26.5 31.1 39.8 15.1\n", "3 Bream 363.0 26.3 29.0 33.5 38.0 13.3\n", "4 Bream 430.0 26.5 29.0 34.0 36.6 15.1" ] }, "execution_count": 27, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df = pd.read_csv('./dataset/fish.csv', header=None)\n", "df.head()" ] }, { "cell_type": "code", "execution_count": 30, "metadata": {}, "outputs": [], "source": [ "samples = df.iloc[:, 1:].values\n", "species = df.iloc[:, 0].values" ] }, { "cell_type": "code", "execution_count": 29, "metadata": {}, "outputs": [], "source": [ "from sklearn.pipeline import make_pipeline\n", "from sklearn.preprocessing import StandardScaler\n", "from sklearn.cluster import KMeans\n", "\n", "# Create scaler: scaler\n", "scaler = StandardScaler()\n", "\n", "# Create KMeans instance: kmeans\n", "kmeans = KMeans(n_clusters=4)\n", "\n", "# Create pipeline: pipeline\n", "pipeline = make_pipeline(scaler, kmeans)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Clustering the fish data\n", "You'll now use your standardization and clustering pipeline from the previous exercise to cluster the fish by their measurements, and then create a cross-tabulation to compare the cluster labels with the fish species." ] }, { "cell_type": "code", "execution_count": 31, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "species Bream Pike Roach Smelt\n", "labels \n", "0 33 0 1 0\n", "1 0 17 0 0\n", "2 0 0 0 13\n", "3 1 0 19 1\n" ] } ], "source": [ "# Fit the pipeline to samples\n", "pipeline.fit(samples)\n", "\n", "# Calculate the cluster labels: labels\n", "labels = pipeline.predict(samples)\n", "\n", "# Create a DataFrame with labels and species as columns: df\n", "df = pd.DataFrame({'labels': labels, 'species': species})\n", "\n", "# Create crosstab: ct\n", "ct = pd.crosstab(df['labels'], df['species'])\n", "\n", "# Display ct\n", "print(ct)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Clustering stocks using KMeans\n", "In this exercise, you'll cluster companies using their daily stock price movements (i.e. the dollar difference between the closing and opening prices for each trading day). You are given a NumPy array ```movements``` of daily price movements from 2010 to 2015 (obtained from Yahoo! Finance), where each row corresponds to a company, and each column corresponds to a trading day.\n", "\n", "Some stocks are more expensive than others. To account for this, include a ```Normalizer``` at the beginning of your pipeline. The Normalizer will separately transform each company's stock price to a relative scale before the clustering begins.\n", "\n", "Note that ```Normalizer()``` is different to ```StandardScaler()```, which you used in the previous exercise. While ```StandardScaler()``` standardizes features (such as the features of the fish data from the previous exercise) by removing the mean and scaling to unit variance, ```Normalizer()``` rescales each sample - here, each company's stock price - independently of the other." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Preprocess" ] }, { "cell_type": "code", "execution_count": 33, "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", "
2010-01-042010-01-052010-01-062010-01-072010-01-082010-01-112010-01-122010-01-132010-01-142010-01-15...2013-10-162013-10-172013-10-182013-10-212013-10-222013-10-232013-10-242013-10-252013-10-282013-10-29
Apple0.580000-0.220005-3.409998-1.1700001.680011-2.689994-1.4699942.779997-0.680003-4.999995...0.3200084.5199972.8999879.590019-6.5400165.9599766.910011-5.3599620.840019-19.589981
AIG-0.640002-0.650000-0.210001-0.4200000.710001-0.200001-1.1300010.069999-0.119999-0.500000...0.9199980.7099990.119999-0.4800000.010002-0.279998-0.190003-0.040001-0.4000020.660000
Amazon-2.3500061.260009-2.350006-2.0099952.960006-2.309997-1.6400071.209999-1.790001-2.039994...2.1099853.6999829.570008-3.4500134.820008-4.0799862.5799864.790009-1.7600093.740021
American express0.1099970.0000000.2600020.7200020.190003-0.2700010.7500000.3000040.639999-0.130001...0.6800012.2900010.409996-0.0699990.1000060.0699990.1300051.8499990.0400010.540001
Boeing0.4599991.7700001.5499992.6900030.059997-1.0800020.3600000.5499990.530002-0.709999...1.5599972.4800030.019997-1.2200010.4800033.020004-0.0299991.9400021.1300050.309998
\n", "

5 rows × 963 columns

\n", "
" ], "text/plain": [ " 2010-01-04 2010-01-05 2010-01-06 2010-01-07 2010-01-08 \\\n", "Apple 0.580000 -0.220005 -3.409998 -1.170000 1.680011 \n", "AIG -0.640002 -0.650000 -0.210001 -0.420000 0.710001 \n", "Amazon -2.350006 1.260009 -2.350006 -2.009995 2.960006 \n", "American express 0.109997 0.000000 0.260002 0.720002 0.190003 \n", "Boeing 0.459999 1.770000 1.549999 2.690003 0.059997 \n", "\n", " 2010-01-11 2010-01-12 2010-01-13 2010-01-14 2010-01-15 \\\n", "Apple -2.689994 -1.469994 2.779997 -0.680003 -4.999995 \n", "AIG -0.200001 -1.130001 0.069999 -0.119999 -0.500000 \n", "Amazon -2.309997 -1.640007 1.209999 -1.790001 -2.039994 \n", "American express -0.270001 0.750000 0.300004 0.639999 -0.130001 \n", "Boeing -1.080002 0.360000 0.549999 0.530002 -0.709999 \n", "\n", " ... 2013-10-16 2013-10-17 2013-10-18 2013-10-21 \\\n", "Apple ... 0.320008 4.519997 2.899987 9.590019 \n", "AIG ... 0.919998 0.709999 0.119999 -0.480000 \n", "Amazon ... 2.109985 3.699982 9.570008 -3.450013 \n", "American express ... 0.680001 2.290001 0.409996 -0.069999 \n", "Boeing ... 1.559997 2.480003 0.019997 -1.220001 \n", "\n", " 2013-10-22 2013-10-23 2013-10-24 2013-10-25 2013-10-28 \\\n", "Apple -6.540016 5.959976 6.910011 -5.359962 0.840019 \n", "AIG 0.010002 -0.279998 -0.190003 -0.040001 -0.400002 \n", "Amazon 4.820008 -4.079986 2.579986 4.790009 -1.760009 \n", "American express 0.100006 0.069999 0.130005 1.849999 0.040001 \n", "Boeing 0.480003 3.020004 -0.029999 1.940002 1.130005 \n", "\n", " 2013-10-29 \n", "Apple -19.589981 \n", "AIG 0.660000 \n", "Amazon 3.740021 \n", "American express 0.540001 \n", "Boeing 0.309998 \n", "\n", "[5 rows x 963 columns]" ] }, "execution_count": 33, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df = pd.read_csv('./dataset/company-stock-movements-2010-2015-incl.csv', index_col=0)\n", "df.head()" ] }, { "cell_type": "code", "execution_count": 37, "metadata": {}, "outputs": [], "source": [ "movements = df.values\n", "companies = df.index.values" ] }, { "cell_type": "code", "execution_count": 36, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Pipeline(memory=None,\n", " steps=[('normalizer', Normalizer(copy=True, norm='l2')),\n", " ('kmeans',\n", " KMeans(algorithm='auto', copy_x=True, init='k-means++',\n", " max_iter=300, n_clusters=10, n_init=10, n_jobs=None,\n", " precompute_distances='auto', random_state=None,\n", " tol=0.0001, verbose=0))],\n", " verbose=False)" ] }, "execution_count": 36, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from sklearn.preprocessing import Normalizer\n", "\n", "# Create a normalizer: normalizer\n", "normalizer = Normalizer()\n", "\n", "# Create a KMeans model with 10 clusters: kmeans\n", "kmeans = KMeans(n_clusters=10)\n", "\n", "# Make a pipeline chaining normalizer and kmeans: pipeline\n", "pipeline = make_pipeline(normalizer, kmeans)\n", "\n", "# Fit pipeline to the daily price movements\n", "pipeline.fit(movements)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Which stocks move together?\n", "In the previous exercise, you clustered companies by their daily stock price movements. So which company have stock prices that tend to change in the same way? You'll now inspect the cluster labels from your clustering to find out." ] }, { "cell_type": "code", "execution_count": 38, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " labels companies\n", "42 0 Royal Dutch Shell\n", "39 0 Pfizer\n", "52 0 Unilever\n", "37 0 Novartis\n", "6 0 British American Tobacco\n", "46 0 Sanofi-Aventis\n", "49 0 Total\n", "19 0 GlaxoSmithKline\n", "22 1 HP\n", "14 1 Dell\n", "34 2 Mitsubishi\n", "45 2 Sony\n", "48 2 Toyota\n", "15 2 Ford\n", "21 2 Honda\n", "7 2 Canon\n", "55 3 Wells Fargo\n", "26 3 JPMorgan Chase\n", "3 3 American express\n", "5 3 Bank of America\n", "18 3 Goldman Sachs\n", "16 3 General Electrics\n", "1 3 AIG\n", "10 4 ConocoPhillips\n", "35 4 Navistar\n", "8 4 Caterpillar\n", "53 4 Valero Energy\n", "57 4 Exxon\n", "44 4 Schlumberger\n", "12 4 Chevron\n", "38 5 Pepsi\n", "40 5 Procter Gamble\n", "28 5 Coca Cola\n", "9 5 Colgate-Palmolive\n", "41 5 Philip Morris\n", "56 5 Wal-Mart\n", "27 5 Kimberly-Clark\n", "33 6 Microsoft\n", "24 6 Intel\n", "11 6 Cisco\n", "51 7 Texas instruments\n", "50 7 Taiwan Semiconductor Manufacturing\n", "47 7 Symantec\n", "59 7 Yahoo\n", "32 7 3M\n", "31 7 McDonalds\n", "30 7 MasterCard\n", "58 7 Xerox\n", "25 7 Johnson & Johnson\n", "23 7 IBM\n", "20 7 Home Depot\n", "13 7 DuPont de Nemours\n", "2 7 Amazon\n", "43 7 SAP\n", "54 7 Walgreen\n", "0 8 Apple\n", "17 8 Google/Alphabet\n", "4 9 Boeing\n", "36 9 Northrop Grumman\n", "29 9 Lookheed Martin\n" ] } ], "source": [ "# Predict the cluster labels: labels\n", "labels = pipeline.predict(movements)\n", "\n", "# Create a DataFrame aligning labels and companies: df\n", "df = pd.DataFrame({'labels': labels, 'companies': companies})\n", "\n", "# Display df sorted by cluster label\n", "print(df.sort_values('labels'))" ] } ], "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.7.6" } }, "nbformat": 4, "nbformat_minor": 4 }