Skip to content

Instantly share code, notes, and snippets.

@digitalWestie
Last active October 30, 2019 12:00
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 digitalWestie/ea468aa340722c5b985eba17d21e27a3 to your computer and use it in GitHub Desktop.
Save digitalWestie/ea468aa340722c5b985eba17d21e27a3 to your computer and use it in GitHub Desktop.
Basic clustering for UrbanTide analytics
Display the source blob
Display the rendered blob
Raw
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Display the source blob
Display the rendered blob
Raw
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Display the source blob
Display the rendered blob
Raw
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
import pandas as pd
import io
import requests
from sklearn.cluster import KMeans
#Download datasets
url = "https://gist.githubusercontent.com/digitalWestie/b68b86cae1d893d4d3d3b01aca59be8d/raw/28908e0d394802181762dc7429f67c0f79fb9fad/Make%2520Model%2520Data%25202016-edited.csv"
s=requests.get(url).content
dataset=pd.read_csv(io.StringIO(s.decode('windows-1252')))
dataset.iloc[:3,:]
# Only include specified columns:
subset = dataset.loc[:, ['Label', 'Engine, Noise and Exhaust %', 'Chassis and Body %']]
subset
#Discard label columns (we only want to feed numeric values to algorithm)
subset_data=subset.iloc[:, 1:]
#Run clustering (4 clusters)
kmeans = KMeans(n_clusters=4).fit(subset_data)
y_kmeans = kmeans.predict(subset_data)
y_kmeans
#Draw graph of cluster
from matplotlib import pyplot as plt
plt.scatter(subset_data.iloc[:,0], subset_data.iloc[:,1], c=y_kmeans, s=50, cmap='viridis')
centers = kmeans.cluster_centers_
plt.scatter(centers[:, 0], centers[:, 1], c='black', s=200, alpha=0.5);
#Combine labels with groups
result = pd.crosstab(subset.iloc[:,0], y_kmeans)
result
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [
{
"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>X</th>\n",
" <th>y</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>5.910131</td>\n",
" <td>4.714615</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>2.500393</td>\n",
" <td>2.076238</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>3.946845</td>\n",
" <td>2.548811</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>7.102233</td>\n",
" <td>4.615368</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>6.168895</td>\n",
" <td>3.264107</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" X y\n",
"0 5.910131 4.714615\n",
"1 2.500393 2.076238\n",
"2 3.946845 2.548811\n",
"3 7.102233 4.615368\n",
"4 6.168895 3.264107"
]
},
"execution_count": 1,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"import pandas as pd\n",
"import numpy as np\n",
"from matplotlib import pyplot as plt\n",
"\n",
"# Generate 'random' data\n",
"np.random.seed(0)\n",
"X = 2.5 * np.random.randn(100) + 1.5 # Array of 100 values with mean = 1.5, stddev = 2.5\n",
"res = 0.5 * np.random.randn(100) # Generate 100 residual terms\n",
"y = 2 + 0.3 * X + res # Actual values of Y\n",
"\n",
"# Create pandas dataframe to store our X and y values\n",
"df = pd.DataFrame(\n",
" {'X': X,\n",
" 'y': y}\n",
")\n",
"\n",
"# Show the first five rows of our dataframe\n",
"df.head()\n"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"alpha = 2.0031670124623426\n",
"beta = 0.3229396867092763\n"
]
}
],
"source": [
"# Calculate the mean of X and y\n",
"xmean = np.mean(X)\n",
"ymean = np.mean(y)\n",
"\n",
"# Calculate the terms needed for the numator and denominator of beta\n",
"df['xycov'] = (df['X'] - xmean) * (df['y'] - ymean)\n",
"df['xvar'] = (df['X'] - xmean)**2\n",
"\n",
"# Calculate beta and alpha\n",
"beta = df['xycov'].sum() / df['xvar'].sum()\n",
"alpha = ymean - (beta * xmean)\n",
"print(f'alpha = {alpha}')\n",
"print(f'beta = {beta}')\n"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [],
"source": [
"#Great, we now have an estimate for alpha and beta! \n",
"#Our model can be written as Yₑ = 2.003 + 0.323 X,​ and we can make predictions:\n",
"ypred = alpha + beta * X\n",
"\n"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 864x432 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"# Plot regression against actual data\n",
"plt.figure(figsize=(12, 6))\n",
"plt.plot(X, ypred) # regression line\n",
"plt.plot(X, y, 'ro') # scatter plot showing actual data\n",
"plt.title('Actual vs Predicted')\n",
"plt.xlabel('X')\n",
"plt.ylabel('y')\n",
"\n",
"plt.show()\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"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.6.7"
}
},
"nbformat": 4,
"nbformat_minor": 2
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment