{
  "slug": "data-clusterer",
  "name": "gizza-ai/data-clusterer",
  "version": "0.1.0",
  "title": "Data Clusterer — KMeans, DBSCAN & Hierarchical Clustering to SVG — gizza.ai",
  "description": "Paste CSV data and cluster it with KMeans, DBSCAN, or hierarchical methods, then export an SVG scatter plot, labeled CSV, or JSON report.",
  "tags": [
    "data clustering tool",
    "kmeans calculator",
    "dbscan online",
    "hierarchical clustering",
    "cluster analysis",
    "csv clustering",
    "scatter plot clusters",
    "silhouette score"
  ],
  "category": "utilities",
  "urls": {
    "page": "https://gizza.ai/tools/data-clusterer/",
    "markdown": "https://gizza.ai/tools/data-clusterer/index.md",
    "descriptor": "https://gizza.ai/tools/data-clusterer/tool.json",
    "deep_link_example": "https://gizza.ai/tools/data-clusterer/?data=height%2Cweight%0A150%2C52%0A160%2C61%0A165%2C64%0A170%2C70%0A182%2C84%0A188%2C92%0A191%2C99&method=kmeans&clusters=3&eps=1.0&min_samples=4&linkage=average&columns=height%2Cweight&normalize=true&output=chart&title=Customer%20segments&width=700&height=500"
  },
  "cli": "gizza tool data-clusterer \"height,weight\n150,52\n160,61\n165,64\n170,70\n182,84\n188,92\n191,99\"",
  "tool": {
    "description": "Cluster the numeric columns of a CSV/tabular dataset and visualize the result — entirely in the browser, nothing uploaded. Choose KMeans (k groups by nearest centroid), DBSCAN (density-based, with automatic outlier/noise detection via eps and min_samples), or hierarchical/agglomerative clustering (merged down to a target count, with average/complete/single/Ward linkage). Feature columns are chosen by header name or 1-based index, or auto-detected (every fully-numeric column); non-numeric rows are skipped. Features can be z-score standardized so mixed-scale columns compare fairly. Output is a self-contained SVG scatter plot coloured by cluster (with centroid markers and a legend; datasets with more than two features are projected to 2D with PCA), a CSV of each row plus its cluster label, or a JSON report with cluster sizes, centroids, and the silhouette quality score. Distance is Euclidean; results are deterministic.",
    "parameters": {
      "additionalProperties": false,
      "properties": {
        "clusters": {
          "default": 3,
          "description": "Number of clusters: k for KMeans, or the target cluster count for hierarchical. Ignored by DBSCAN (which discovers the count). Default 3.",
          "maximum": 50,
          "minimum": 1,
          "type": "integer"
        },
        "columns": {
          "default": "",
          "description": "Comma-separated feature columns to cluster on: header names (case-insensitive) or 1-based indices (e.g. `height,weight` or `2,3`). Blank uses every fully-numeric column. Distance is Euclidean.",
          "type": "string"
        },
        "data": {
          "description": "The tabular data to cluster, as CSV text. Include a header row when you can (e.g. `height,weight`); a first row that is not entirely numeric is treated as headers. Quoted fields with embedded commas are handled.",
          "type": "string"
        },
        "eps": {
          "default": 1.0,
          "description": "DBSCAN only: neighbourhood radius. Two points are neighbours when their distance is ≤ eps (in standardized units when normalize is on). Larger eps merges more points. Default 1.0.",
          "type": "number"
        },
        "height": {
          "default": 500,
          "description": "Chart height in pixels (150–4000). Default 500.",
          "maximum": 4000,
          "minimum": 150,
          "type": "integer"
        },
        "linkage": {
          "default": "average",
          "description": "Hierarchical only: how cluster distances are combined when merging — 'average' (UPGMA), 'complete' (max), 'single' (min), or 'ward' (minimum variance). Default average.",
          "enum": [
            "average",
            "complete",
            "single",
            "ward"
          ],
          "type": "string"
        },
        "method": {
          "default": "kmeans",
          "description": "Clustering algorithm: 'kmeans' (partition into `clusters` groups by nearest centroid), 'dbscan' (density-based; finds clusters via `eps`/`min_samples` and marks outliers as noise), or 'hierarchical' (agglomerative merging down to `clusters` groups). Default kmeans.",
          "enum": [
            "kmeans",
            "dbscan",
            "hierarchical"
          ],
          "type": "string"
        },
        "min_samples": {
          "default": 4,
          "description": "DBSCAN only: minimum neighbourhood size (including the point itself) for a core point. Higher values require denser regions and label more points as noise. Default 4.",
          "minimum": 1,
          "type": "integer"
        },
        "normalize": {
          "default": true,
          "description": "Standardize each feature to zero mean and unit variance before clustering so columns on different scales contribute comparably. Default true.",
          "type": "boolean"
        },
        "output": {
          "default": "chart",
          "description": "Result format: 'chart' (an SVG scatter plot coloured by cluster, with centroids and a legend; 2 features plot directly, more than 2 are projected to 2D via PCA), 'csv' (each row plus its cluster label), or 'json' (cluster sizes, centroids, and the silhouette score). Default chart.",
          "enum": [
            "chart",
            "csv",
            "json"
          ],
          "type": "string"
        },
        "title": {
          "default": "",
          "description": "Optional chart title drawn above the plot (chart output only).",
          "type": "string"
        },
        "width": {
          "default": 700,
          "description": "Chart width in pixels (200–4000). Default 700.",
          "maximum": 4000,
          "minimum": 200,
          "type": "integer"
        }
      },
      "required": [
        "data"
      ],
      "type": "object"
    }
  }
}