docs: def silhouette_n_clusters(data, k_min, k_max, distance='euclidean'):
          """
          Computes and plot the silhouette score vs number of clusters graph to help selecting the number of clusters visually
  
          :param data: The data object
          :param k_min: lowerbound of the cluster range
          :param k_max: upperbound of the cluster range
          :param distance: the distance metric, 'euclidean' by default
          :return:
          """
          k_range = range(k_min, k_max)
  
          k_means_var = [Clustering.kmeans(k).fit(data) for k in k_range]
  
          silhouette_scores = [obj.silhouette_score(data=data, metric=distance) for obj in k_means_var]
  
          fig = plt.figure()
          ax = fig.add_subplot(111)
          ax.plot(k_range, silhouette_scores, 'b*-')
          ax.set_ylim((-1, 1))
          plt.grid(True)
          plt.xlabel('n_clusters')
          plt.ylabel('The silhouette score')
          plt.title('Silhouette score vs. k')
          plt.show()