K-Means Cluster Analysis
Cluster analysis is an unsupervised machine learning method that partitions the observations in a data set into a smaller set of clusters where each observation belongs to only one cluster. The goal of cluster analysis is to group, or cluster, observations into subsets based on their similarity of responses on multiple variables. Clustering variables should be primarily quantitative variables, but binary variables may also be included.
Data were randomly split into a training set that included 70% of the observations (N=3201) and a test set that included 30% of the observations (N=1701). Categorical Variables are kept as it is and standard scaling performed on quantitative variables. Clustering is performed on a range from 1 to 10 number of clusters and their accuracy measured.
Code for KMeans:-
from google.colab import drive,files from sklearn.decomposition import PCA import pandas as pd import numpy as np import matplotlib.pyplot as plt import os import pydotplus import io from IPython.display import Image from sklearn.cluster import KMeans from sklearn.metrics import confusion_matrix from sklearn.metrics import accuracy_score from sklearn.model_selection import train_test_split from sklearn.preprocessing import scale drive.mount('/content/gdrive') corpusName ="_d21b2085472fd467f689f21cd421b13b_tree_addhealth.csv" folderPath = "/content/gdrive/My Drive/MachineLearningForDataAnalysis" corpus = os.path.join(folderPath, corpusName) df_train = pd.read_csv(corpus) print("Dataset shape = ") print(df_train.shape)
Output: Dataset shape = (6504, 25)
# print(df_train.head(10)) # print(df_train.info()) df_train.dropna(inplace=True) non_categorical_columns = [] for col in df_train.drop("TREG1",axis=1).columns: if df_train[col].nunique() > 10: df_train[col]=scale(df_train[col]) x_train,x_test,y_train,y_test = train_test_split(df_train.drop("TREG1",axis=1),df_train.TREG1,train_size=0.8,random_state=42) from scipy.spatial.distance import cdist clusters=range(1,10) accuracy=np.zeros(len(clusters)) meandist=[] for k in clusters: model=KMeans(n_clusters=k,random_state=42) model.fit(x_train,y_train) clusassign=model.predict(x_test) meandist.append(sum(np.min(cdist(x_train, model.cluster_centers_, 'euclidean'), axis=1)) / x_train.shape[0]) accuracy[k-1]=accuracy_score(y_test, clusassign) plt.xlabel("Number of Estimators") plt.ylabel("Accuracy") plt.plot(clusters, accuracy) plt.savefig(folderPath+'/KMeans.png') plt.show() model2=KMeans(n_clusters=2,random_state=42) model2.fit(x_train,y_train) print("Accuracy = {}".format(accuracy_score(y_test,model2.predict(x_test))))
Output: Accuracy = 0.7289617486338797
plt.plot(clusters, meandist) plt.xlabel('Number of clusters') plt.ylabel('Average distance') plt.title('Selecting k with the Elbow Method') plt.savefig(folderPath+'/KMeans_Elbow.png') plt.show()
pca_2 = PCA(2) plot_columns = pca_2.fit_transform(x_train) plt.scatter(x=plot_columns[:,0], y=plot_columns[:,1], c=model2.labels_,) plt.xlabel('Canonical variable 1') plt.ylabel('Canonical variable 2') plt.title('Scatterplot of Canonical Variables for 2 Clusters') plt.savefig(folderPath+'/KMeans_groups.png') plt.show()
Elbow method has been used to determine the number of clusters best for the model. As per the first image the elbow can be observed on k=2. Model gives the accuracy of 72% approx. Principal Component Analysis(PCA) was used to scale down 24 dimensional input to 2 dimensional space with two classes 0 and 1 for visualization.










