Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Robin-Lord/c7826161937d3448a316be5d3cd8f431 to your computer and use it in GitHub Desktop.
Save Robin-Lord/c7826161937d3448a316be5d3cd8f431 to your computer and use it in GitHub Desktop.
K-means clustering with variable dimensions
Display the source blob
Display the rendered blob
Raw
{
"nbformat": 4,
"nbformat_minor": 0,
"metadata": {
"colab": {
"name": "K-means clustering with variable dimensions",
"provenance": [],
"collapsed_sections": [],
"authorship_tag": "ABX9TyPj3jBnrjbKT/G51QlqbYW2",
"include_colab_link": true
},
"kernelspec": {
"name": "python3",
"display_name": "Python 3"
}
},
"cells": [
{
"cell_type": "markdown",
"metadata": {
"id": "view-in-github",
"colab_type": "text"
},
"source": [
"<a href=\"https://colab.research.google.com/gist/Robin-Lord/c7826161937d3448a316be5d3cd8f431/k-means-clustering-with-variable-dimensions.ipynb\" target=\"_parent\"><img src=\"https://colab.research.google.com/assets/colab-badge.svg\" alt=\"Open In Colab\"/></a>"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "tNiB7IIb7ueX",
"colab_type": "text"
},
"source": [
"# K-means clustering data\n",
"\n",
"This notebook will help you use K-means clustering to group data, it goes with [this explanatory blog post](http://www.therobinlord.com/what-is-k-means-clustering?/) on www.therobinlord.com so if you want to know more about what actually happens in K-means clustering - go there.\n",
"\n",
"==========================================="
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "oSGTOtHd9fX-",
"colab_type": "text"
},
"source": [
"**First we need to get our data**, for the sake of consistency with [my blog post](http://www.therobinlord.com/what-is-k-means-clustering?/) we'll get the same data we're using there so first we need to get the **gspread** library to access that data."
]
},
{
"cell_type": "code",
"metadata": {
"id": "i5samlRhoQIr",
"colab_type": "code",
"colab": {}
},
"source": [
"# Lets us interact with Google Sheets\n",
"import gspread\n",
"\n",
"# Handles authorisation for you\n",
"from google.colab import auth\n",
"auth.authenticate_user()\n",
"from oauth2client.client import GoogleCredentials\n",
"\n",
"# Handles DataFrames for us\n",
"import pandas as pd\n",
"from gspread_dataframe import get_as_dataframe"
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "fb7WT3l1olpM",
"colab_type": "text"
},
"source": [
"**Next we get the data we were working with.**\n"
]
},
{
"cell_type": "code",
"metadata": {
"id": "AcOz-mwKoklT",
"colab_type": "code",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 728
},
"outputId": "5920844a-cb74-4bf6-ae47-4d8d1d7d64b2"
},
"source": [
"# Opening up the data\n",
"gc = gspread.authorize(GoogleCredentials.get_application_default())\n",
"data = gc.open_by_url('https://docs.google.com/spreadsheets/d/18I8wyQlXrYELMoZhNf-tI5lqdq2VDjoI-jqFoi0hDow/edit?usp=sharing')\n",
"\n",
"sandwich_data = get_as_dataframe(data.worksheet(\"Sandwich_data\"), usecols=[0,1], skiprows=5, headers=1)\n",
"\n",
"# Removing the rows without data\n",
"sandwich_data = sandwich_data.dropna(axis=0, how='any')\n",
"sandwich_data"
],
"execution_count": 2,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>Sandwich width</th>\n",
" <th>Sandwich height</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>6.038829</td>\n",
" <td>0.353439</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>7.889089</td>\n",
" <td>2.277203</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>7.398768</td>\n",
" <td>8.508832</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>5.801256</td>\n",
" <td>0.497134</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>3.507875</td>\n",
" <td>8.790705</td>\n",
" </tr>\n",
" <tr>\n",
" <th>5</th>\n",
" <td>7.386901</td>\n",
" <td>1.855061</td>\n",
" </tr>\n",
" <tr>\n",
" <th>6</th>\n",
" <td>0.994364</td>\n",
" <td>9.797447</td>\n",
" </tr>\n",
" <tr>\n",
" <th>7</th>\n",
" <td>9.676991</td>\n",
" <td>5.807232</td>\n",
" </tr>\n",
" <tr>\n",
" <th>8</th>\n",
" <td>8.666751</td>\n",
" <td>8.651484</td>\n",
" </tr>\n",
" <tr>\n",
" <th>9</th>\n",
" <td>9.145326</td>\n",
" <td>8.437393</td>\n",
" </tr>\n",
" <tr>\n",
" <th>10</th>\n",
" <td>1.425847</td>\n",
" <td>8.356830</td>\n",
" </tr>\n",
" <tr>\n",
" <th>11</th>\n",
" <td>6.435144</td>\n",
" <td>0.710601</td>\n",
" </tr>\n",
" <tr>\n",
" <th>12</th>\n",
" <td>3.545293</td>\n",
" <td>2.274556</td>\n",
" </tr>\n",
" <tr>\n",
" <th>13</th>\n",
" <td>0.367717</td>\n",
" <td>3.276266</td>\n",
" </tr>\n",
" <tr>\n",
" <th>14</th>\n",
" <td>5.661727</td>\n",
" <td>4.815616</td>\n",
" </tr>\n",
" <tr>\n",
" <th>15</th>\n",
" <td>1.203977</td>\n",
" <td>0.557554</td>\n",
" </tr>\n",
" <tr>\n",
" <th>16</th>\n",
" <td>9.903634</td>\n",
" <td>1.678977</td>\n",
" </tr>\n",
" <tr>\n",
" <th>17</th>\n",
" <td>2.124293</td>\n",
" <td>6.249030</td>\n",
" </tr>\n",
" <tr>\n",
" <th>18</th>\n",
" <td>7.988251</td>\n",
" <td>0.003995</td>\n",
" </tr>\n",
" <tr>\n",
" <th>19</th>\n",
" <td>2.198211</td>\n",
" <td>9.541700</td>\n",
" </tr>\n",
" <tr>\n",
" <th>20</th>\n",
" <td>7.828862</td>\n",
" <td>8.659528</td>\n",
" </tr>\n",
" <tr>\n",
" <th>21</th>\n",
" <td>3.735076</td>\n",
" <td>6.404364</td>\n",
" </tr>\n",
" <tr>\n",
" <th>22</th>\n",
" <td>5.220134</td>\n",
" <td>1.558261</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" Sandwich width Sandwich height\n",
"0 6.038829 0.353439\n",
"1 7.889089 2.277203\n",
"2 7.398768 8.508832\n",
"3 5.801256 0.497134\n",
"4 3.507875 8.790705\n",
"5 7.386901 1.855061\n",
"6 0.994364 9.797447\n",
"7 9.676991 5.807232\n",
"8 8.666751 8.651484\n",
"9 9.145326 8.437393\n",
"10 1.425847 8.356830\n",
"11 6.435144 0.710601\n",
"12 3.545293 2.274556\n",
"13 0.367717 3.276266\n",
"14 5.661727 4.815616\n",
"15 1.203977 0.557554\n",
"16 9.903634 1.678977\n",
"17 2.124293 6.249030\n",
"18 7.988251 0.003995\n",
"19 2.198211 9.541700\n",
"20 7.828862 8.659528\n",
"21 3.735076 6.404364\n",
"22 5.220134 1.558261"
]
},
"metadata": {
"tags": []
},
"execution_count": 2
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "Ii3gH7M27mE1",
"colab_type": "text"
},
"source": [
"**Next we import our clustering library**, [Scikit Learn](http://scikit-learn.org/stable/modules/generated/sklearn.cluster.KMeans.html) has a KMeans clustering function that does a lot of the heavy lifting for us. Pandas is how we'll work with our data."
]
},
{
"cell_type": "code",
"metadata": {
"id": "IKQWNLMr7DGH",
"colab_type": "code",
"colab": {}
},
"source": [
"from sklearn.cluster import KMeans"
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "lduyg7RV9gEp",
"colab_type": "text"
},
"source": [
"We can give KMeans a number of different settings, for instance how many clusters we want to include or how many times to try before we just go with our best attempt. If you want to see more about it and you're working in Google Colab, you can just write *KMeans?* in a cell"
]
},
{
"cell_type": "code",
"metadata": {
"id": "CUZNQL4MmQyI",
"colab_type": "code",
"cellView": "form",
"colab": {}
},
"source": [
"#@title Want more information about KMeans? Tick the box, then run this cell.\n",
"more_info = False #@param {type:\"boolean\"}\n",
"\n",
"if more_info:\n",
" KMeans?"
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "lXAYmMOYwXAz",
"colab_type": "text"
},
"source": [
"**Next we set the parameters for our clustering** - we need to choose how many clusters we want (K) and how many times we want to try the process before we decide on which was the best result "
]
},
{
"cell_type": "code",
"metadata": {
"id": "xbEdVBeywlP2",
"colab_type": "code",
"cellView": "form",
"colab": {}
},
"source": [
"#@title Choose the number of clusters and repeats, then run this cell\n",
"\n",
"#@markdown Set number of clusters (K)\n",
"K = 5 #@param {type:\"number\"}\n",
"\n",
"\n",
"\n",
"\n",
"#@markdown Set number of times to try (repeats)\n",
"repeats = 300 #@param {type:\"number\"}"
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "fKyIf2xmyDEC",
"colab_type": "text"
},
"source": [
"**Next we get KMeans to group our data** - it will return an object. In that object will be a list - one item for every row in our data. Each item in the list will be a number that corresponds to the group that datapoint has ended up in."
]
},
{
"cell_type": "code",
"metadata": {
"id": "dZ438gmTwr9J",
"colab_type": "code",
"colab": {}
},
"source": [
"# Get labels from KMeans\n",
"kmeans_result = KMeans(n_clusters=K, n_init=repeats ,random_state=0).fit(sandwich_data)"
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "JizkYXe-8RJ-",
"colab_type": "text"
},
"source": [
"Here we get the cluster centers it eventually landed on and turn that into a table. These points are also known as \"centroids\". This stage isn't necessary but it's interesting for us to see as we learn the process."
]
},
{
"cell_type": "code",
"metadata": {
"id": "p9QEr06b79GP",
"colab_type": "code",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 195
},
"outputId": "94aa1339-e532-441c-ae4d-4b49c8acd24a"
},
"source": [
"list_of_centers = kmeans_result.cluster_centers_\n",
"\n",
"kmeans_clusters = pd.DataFrame(list_of_centers,columns=[\"Sandwich width\",\"Sandwich height\"])\n",
"\n",
"kmeans_clusters"
],
"execution_count": 7,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>Sandwich width</th>\n",
" <th>Sandwich height</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>7.082905</td>\n",
" <td>1.116834</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>2.031574</td>\n",
" <td>9.121671</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>8.543339</td>\n",
" <td>8.012894</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>1.705662</td>\n",
" <td>2.036126</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>3.840365</td>\n",
" <td>5.823004</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" Sandwich width Sandwich height\n",
"0 7.082905 1.116834\n",
"1 2.031574 9.121671\n",
"2 8.543339 8.012894\n",
"3 1.705662 2.036126\n",
"4 3.840365 5.823004"
]
},
"metadata": {
"tags": []
},
"execution_count": 7
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "d1IE7SpLx3L4",
"colab_type": "text"
},
"source": [
"Here we're turning our list of labels into a table and displaying that table so we can look at it."
]
},
{
"cell_type": "code",
"metadata": {
"id": "UCp4WeWmzbY2",
"colab_type": "code",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 728
},
"outputId": "57a418e6-1f3b-46c5-8441-0f1721d05062"
},
"source": [
"# Show the list of labels we've created\n",
"\n",
"list_of_labels = kmeans_result.labels_\n",
"\n",
"kmeans_labels = pd.DataFrame(list_of_labels,columns=[\"Group\"])\n",
"\n",
"kmeans_labels"
],
"execution_count": 8,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>Group</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>2</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>5</th>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>6</th>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>7</th>\n",
" <td>2</td>\n",
" </tr>\n",
" <tr>\n",
" <th>8</th>\n",
" <td>2</td>\n",
" </tr>\n",
" <tr>\n",
" <th>9</th>\n",
" <td>2</td>\n",
" </tr>\n",
" <tr>\n",
" <th>10</th>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>11</th>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>12</th>\n",
" <td>3</td>\n",
" </tr>\n",
" <tr>\n",
" <th>13</th>\n",
" <td>3</td>\n",
" </tr>\n",
" <tr>\n",
" <th>14</th>\n",
" <td>4</td>\n",
" </tr>\n",
" <tr>\n",
" <th>15</th>\n",
" <td>3</td>\n",
" </tr>\n",
" <tr>\n",
" <th>16</th>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>17</th>\n",
" <td>4</td>\n",
" </tr>\n",
" <tr>\n",
" <th>18</th>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>19</th>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>20</th>\n",
" <td>2</td>\n",
" </tr>\n",
" <tr>\n",
" <th>21</th>\n",
" <td>4</td>\n",
" </tr>\n",
" <tr>\n",
" <th>22</th>\n",
" <td>0</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" Group\n",
"0 0\n",
"1 0\n",
"2 2\n",
"3 0\n",
"4 1\n",
"5 0\n",
"6 1\n",
"7 2\n",
"8 2\n",
"9 2\n",
"10 1\n",
"11 0\n",
"12 3\n",
"13 3\n",
"14 4\n",
"15 3\n",
"16 0\n",
"17 4\n",
"18 0\n",
"19 1\n",
"20 2\n",
"21 4\n",
"22 0"
]
},
"metadata": {
"tags": []
},
"execution_count": 8
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "kG6bkZSSz1Ln",
"colab_type": "text"
},
"source": [
"**Now we add our labels to our original data so that we can use them**"
]
},
{
"cell_type": "code",
"metadata": {
"id": "U1Mlz7QNziqJ",
"colab_type": "code",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 728
},
"outputId": "c58df1cd-e2f2-47d2-82ad-f241453dd6b6"
},
"source": [
"grouped_sandwiches = sandwich_data.join(kmeans_labels)\n",
"grouped_sandwiches"
],
"execution_count": 9,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>Sandwich width</th>\n",
" <th>Sandwich height</th>\n",
" <th>Group</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>6.038829</td>\n",
" <td>0.353439</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>7.889089</td>\n",
" <td>2.277203</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>7.398768</td>\n",
" <td>8.508832</td>\n",
" <td>2</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>5.801256</td>\n",
" <td>0.497134</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>3.507875</td>\n",
" <td>8.790705</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>5</th>\n",
" <td>7.386901</td>\n",
" <td>1.855061</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>6</th>\n",
" <td>0.994364</td>\n",
" <td>9.797447</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>7</th>\n",
" <td>9.676991</td>\n",
" <td>5.807232</td>\n",
" <td>2</td>\n",
" </tr>\n",
" <tr>\n",
" <th>8</th>\n",
" <td>8.666751</td>\n",
" <td>8.651484</td>\n",
" <td>2</td>\n",
" </tr>\n",
" <tr>\n",
" <th>9</th>\n",
" <td>9.145326</td>\n",
" <td>8.437393</td>\n",
" <td>2</td>\n",
" </tr>\n",
" <tr>\n",
" <th>10</th>\n",
" <td>1.425847</td>\n",
" <td>8.356830</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>11</th>\n",
" <td>6.435144</td>\n",
" <td>0.710601</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>12</th>\n",
" <td>3.545293</td>\n",
" <td>2.274556</td>\n",
" <td>3</td>\n",
" </tr>\n",
" <tr>\n",
" <th>13</th>\n",
" <td>0.367717</td>\n",
" <td>3.276266</td>\n",
" <td>3</td>\n",
" </tr>\n",
" <tr>\n",
" <th>14</th>\n",
" <td>5.661727</td>\n",
" <td>4.815616</td>\n",
" <td>4</td>\n",
" </tr>\n",
" <tr>\n",
" <th>15</th>\n",
" <td>1.203977</td>\n",
" <td>0.557554</td>\n",
" <td>3</td>\n",
" </tr>\n",
" <tr>\n",
" <th>16</th>\n",
" <td>9.903634</td>\n",
" <td>1.678977</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>17</th>\n",
" <td>2.124293</td>\n",
" <td>6.249030</td>\n",
" <td>4</td>\n",
" </tr>\n",
" <tr>\n",
" <th>18</th>\n",
" <td>7.988251</td>\n",
" <td>0.003995</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>19</th>\n",
" <td>2.198211</td>\n",
" <td>9.541700</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>20</th>\n",
" <td>7.828862</td>\n",
" <td>8.659528</td>\n",
" <td>2</td>\n",
" </tr>\n",
" <tr>\n",
" <th>21</th>\n",
" <td>3.735076</td>\n",
" <td>6.404364</td>\n",
" <td>4</td>\n",
" </tr>\n",
" <tr>\n",
" <th>22</th>\n",
" <td>5.220134</td>\n",
" <td>1.558261</td>\n",
" <td>0</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" Sandwich width Sandwich height Group\n",
"0 6.038829 0.353439 0\n",
"1 7.889089 2.277203 0\n",
"2 7.398768 8.508832 2\n",
"3 5.801256 0.497134 0\n",
"4 3.507875 8.790705 1\n",
"5 7.386901 1.855061 0\n",
"6 0.994364 9.797447 1\n",
"7 9.676991 5.807232 2\n",
"8 8.666751 8.651484 2\n",
"9 9.145326 8.437393 2\n",
"10 1.425847 8.356830 1\n",
"11 6.435144 0.710601 0\n",
"12 3.545293 2.274556 3\n",
"13 0.367717 3.276266 3\n",
"14 5.661727 4.815616 4\n",
"15 1.203977 0.557554 3\n",
"16 9.903634 1.678977 0\n",
"17 2.124293 6.249030 4\n",
"18 7.988251 0.003995 0\n",
"19 2.198211 9.541700 1\n",
"20 7.828862 8.659528 2\n",
"21 3.735076 6.404364 4\n",
"22 5.220134 1.558261 0"
]
},
"metadata": {
"tags": []
},
"execution_count": 9
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "kgjGRkgf0eXM",
"colab_type": "text"
},
"source": [
"I want to be able to see our data in a colour-coordinated graph like we did in GSheets so **next we take our DataFrame, create a smaller version for each of our groups, and plot each of those in turn.**"
]
},
{
"cell_type": "code",
"metadata": {
"id": "173A2mC1ycRR",
"colab_type": "code",
"cellView": "both",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 367
},
"outputId": "ee8863f2-e668-4007-fdef-56ed72fe92a5"
},
"source": [
"# Choosing which colours we want for each group\n",
"colour_map=[\"#ea4335\",\"#fbbc04\",\"#34a853\",\"#ff6d01\",\"#46bdc6\"]\n",
"\n",
"\n",
"# Counting out our number of groups\n",
"group_list = [num for num in range(K)]\n",
"\n",
"# Initially plotting each of our centroids points on the graph\n",
"# we don't have to do this but we're making it line up with our GSheets graph\n",
"ax = kmeans_clusters.plot(kind='scatter', x='Sandwich width', y='Sandwich height',color=\"Black\",label=\"Clusters\");\n",
"\n",
"\n",
"# Now we're labelling each of the centroids we added to the graph.\n",
"# Again this isn't necessary but it's good for us to see and lines up with\n",
"# our GSheets process.\n",
"for num in group_list:\n",
" # Create a unique label\n",
" mylabel = 'Group '+str(num)\n",
"\n",
" # Add an annotation at the relevant point on the graph\n",
" width = list_of_centers[num][0]\n",
" height = list_of_centers[num][1]\n",
" ax.annotate(mylabel, (width, height))\n",
"\n",
"# For each of our groups\n",
"for num in group_list:\n",
" # Create a temporary dataframe which is the same as\n",
" # grouped_sandwiches filtered to just the rows where\n",
" # 'Group' is the same as our number\n",
" temp_df = grouped_sandwiches[(grouped_sandwiches['Group']==num)]\n",
"\n",
" # Getting our colour for this group\n",
" group_colour = colour_map[num]\n",
"\n",
" # Create a new label for this data\n",
" mylabel = 'Group '+str(num)\n",
"\n",
" # If we're not doing this for the last time\n",
" if num<K-1:\n",
"\n",
" # Add this series to the object we already created\n",
" ax = temp_df.plot(kind='scatter', x='Sandwich width', y='Sandwich height',color=group_colour,label=mylabel, ax=ax);\n",
"\n",
" \n",
"\n",
" # If we ARE doing this for the last time\n",
" else:\n",
" print (\"Higher than K\")\n",
" # Create our graph\n",
" scatter = temp_df.plot(title=\"Clustered sandwich sizes\", kind='scatter', x='Sandwich width', y='Sandwich height',color=group_colour,label=mylabel, ax=ax, figsize=(10,5));\n",
" # Format the legend label\n",
" col, lab = ax.get_legend_handles_labels()\n",
" ax.legend(col, lab, bbox_to_anchor=(1, 1))\n",
" fig = scatter.get_figure()\n",
"fig.savefig(\"scatter.png\")"
],
"execution_count": 10,
"outputs": [
{
"output_type": "stream",
"text": [
"Higher than K\n"
],
"name": "stdout"
},
{
"output_type": "display_data",
"data": {
"image/png": "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\nB9nafHFHHNPoAAAAAElFTkSuQmCC\n",
"text/plain": [
"<Figure size 720x360 with 1 Axes>"
]
},
"metadata": {
"tags": []
}
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "BQpdOyGInFRt",
"colab_type": "code",
"colab": {}
},
"source": [
""
],
"execution_count": 0,
"outputs": []
}
]
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment