{
  "interval_mass": 0.9,
  "seasons": [
    "2023-24",
    "2024-25",
    "2025-26",
    "2026-27"
  ],
  "current_squads_only": true,
  "no_composite_note": "The three axes are published separately and must never be averaged: season-to-season reliability ranges from 0.72 down to below zero, and a composite manufactures precision.",
  "channels": {
    "cross_intervention": {
      "metric": "cross intervention rate",
      "n_fitted": 50,
      "what": "How often the keeper claims or punches a cross faced. Not 'command of the area' — it does not distinguish a commanding catcher from a punch-happy keeper.",
      "separable": 12,
      "expected_false_positives": 4.7,
      "split_half": 0.57,
      "teammate_r": -0.097,
      "season_to_season": 0.038,
      "travels_note": "No keeper changed clubs between consecutive seasons at ≥10 matches, so whether the rating travels with the keeper is untested.",
      "ships": true,
      "ranking": [
        {
          "rank": 1,
          "keeper": "Lucão",
          "keeper_id": 981586,
          "team": "Gil Vicente",
          "minutes": 1530.0,
          "y": 27.0,
          "n": 259.0,
          "theta": 0.3399,
          "theta_lo": 0.0418,
          "theta_hi": 0.6435,
          "p_above_average": 0.97,
          "separable": true,
          "implied": 0.0879,
          "implied_lo": 0.0664,
          "implied_hi": 0.1136
        },
        {
          "rank": 2,
          "keeper": "Ivan Zlobin",
          "keeper_id": 788203,
          "team": "Famalicao",
          "minutes": 1440.0,
          "y": 29.0,
          "n": 276.0,
          "theta": 0.3014,
          "theta_lo": 0.0232,
          "theta_hi": 0.5838,
          "p_above_average": 0.961,
          "separable": true,
          "implied": 0.0847,
          "implied_lo": 0.0645,
          "implied_hi": 0.1082
        },
        {
          "rank": 3,
          "keeper": "Charles",
          "keeper_id": 155985,
          "team": "Vitoria SC",
          "minutes": 2340.0,
          "y": 33.0,
          "n": 384.0,
          "theta": 0.226,
          "theta_lo": -0.0339,
          "theta_hi": 0.4841,
          "p_above_average": 0.921,
          "separable": false,
          "implied": 0.079,
          "implied_lo": 0.0616,
          "implied_hi": 0.0986
        },
        {
          "rank": 4,
          "keeper": "Ennio Van Der Gouw",
          "keeper_id": 1005270,
          "team": "Rio Ave",
          "minutes": 1440.0,
          "y": 27.0,
          "n": 322.0,
          "theta": 0.213,
          "theta_lo": -0.074,
          "theta_hi": 0.5073,
          "p_above_average": 0.883,
          "separable": false,
          "implied": 0.0782,
          "implied_lo": 0.0595,
          "implied_hi": 0.1002
        },
        {
          "rank": 5,
          "keeper": "Jhonatan",
          "keeper_id": 798688,
          "team": "Alverca",
          "minutes": 3060.0,
          "y": 59.0,
          "n": 701.0,
          "theta": 0.1838,
          "theta_lo": -0.0253,
          "theta_hi": 0.3926,
          "p_above_average": 0.926,
          "separable": false,
          "implied": 0.0757,
          "implied_lo": 0.062,
          "implied_hi": 0.0901
        },
        {
          "rank": 6,
          "keeper": "Lucas França",
          "keeper_id": 832672,
          "team": "Santa Clara",
          "minutes": 4140.0,
          "y": 70.0,
          "n": 877.0,
          "theta": 0.1804,
          "theta_lo": -0.0155,
          "theta_hi": 0.3844,
          "p_above_average": 0.933,
          "separable": false,
          "implied": 0.0754,
          "implied_lo": 0.0629,
          "implied_hi": 0.0893
        },
        {
          "rank": 7,
          "keeper": "Ignacio de Arruabarrena",
          "keeper_id": 789933,
          "team": "Arouca",
          "minutes": 5040.0,
          "y": 83.0,
          "n": 1082.0,
          "theta": 0.1575,
          "theta_lo": -0.0302,
          "theta_hi": 0.3489,
          "p_above_average": 0.918,
          "separable": false,
          "implied": 0.0737,
          "implied_lo": 0.0621,
          "implied_hi": 0.0867
        },
        {
          "rank": 8,
          "keeper": "Diogo Costa",
          "keeper_id": 843115,
          "team": "Porto",
          "minutes": 9497.0,
          "y": 100.0,
          "n": 1382.0,
          "theta": 0.1123,
          "theta_lo": -0.0645,
          "theta_hi": 0.2846,
          "p_above_average": 0.862,
          "separable": false,
          "implied": 0.0707,
          "implied_lo": 0.0603,
          "implied_hi": 0.0816
        },
        {
          "rank": 9,
          "keeper": "Anatoliy Trubin",
          "keeper_id": 966616,
          "team": "Benfica",
          "minutes": 8280.0,
          "y": 82.0,
          "n": 1125.0,
          "theta": 0.1099,
          "theta_lo": -0.0715,
          "theta_hi": 0.2937,
          "p_above_average": 0.838,
          "separable": false,
          "implied": 0.0705,
          "implied_lo": 0.0596,
          "implied_hi": 0.0825
        },
        {
          "rank": 10,
          "keeper": "Patrick Sequeira",
          "keeper_id": 821628,
          "team": "Casa Pia",
          "minutes": 5400.0,
          "y": 84.0,
          "n": 1185.0,
          "theta": 0.1073,
          "theta_lo": -0.0793,
          "theta_hi": 0.2933,
          "p_above_average": 0.829,
          "separable": false,
          "implied": 0.0704,
          "implied_lo": 0.0592,
          "implied_hi": 0.0826
        },
        {
          "rank": 11,
          "keeper": "Cezary Miszta",
          "keeper_id": 938292,
          "team": "Rio Ave",
          "minutes": 4306.0,
          "y": 69.0,
          "n": 1023.0,
          "theta": 0.0633,
          "theta_lo": -0.1381,
          "theta_hi": 0.2677,
          "p_above_average": 0.698,
          "separable": false,
          "implied": 0.0676,
          "implied_lo": 0.0558,
          "implied_hi": 0.0806
        },
        {
          "rank": 12,
          "keeper": "Rui Silva",
          "keeper_id": 253809,
          "team": "Sporting CP",
          "minutes": 5137.0,
          "y": 46.0,
          "n": 719.0,
          "theta": 0.0254,
          "theta_lo": -0.2118,
          "theta_hi": 0.2552,
          "p_above_average": 0.582,
          "separable": false,
          "implied": 0.0654,
          "implied_lo": 0.0523,
          "implied_hi": 0.0798
        },
        {
          "rank": 13,
          "keeper": "Samuel Soares",
          "keeper_id": 983550,
          "team": "Benfica",
          "minutes": 1530.0,
          "y": 13.0,
          "n": 206.0,
          "theta": -0.0063,
          "theta_lo": -0.3319,
          "theta_hi": 0.3094,
          "p_above_average": 0.492,
          "separable": false,
          "implied": 0.064,
          "implied_lo": 0.0466,
          "implied_hi": 0.0848
        },
        {
          "rank": 14,
          "keeper": "André Gomes",
          "keeper_id": 1139990,
          "team": "Casa Pia",
          "minutes": 2610.0,
          "y": 31.0,
          "n": 554.0,
          "theta": -0.0411,
          "theta_lo": -0.304,
          "theta_hi": 0.2117,
          "p_above_average": 0.402,
          "separable": false,
          "implied": 0.0616,
          "implied_lo": 0.0476,
          "implied_hi": 0.0768
        },
        {
          "rank": 15,
          "keeper": "Matheus Mendes",
          "keeper_id": 1018555,
          "team": "Alverca",
          "minutes": 1626.0,
          "y": 18.0,
          "n": 329.0,
          "theta": -0.0609,
          "theta_lo": -0.3523,
          "theta_hi": 0.2163,
          "p_above_average": 0.366,
          "separable": false,
          "implied": 0.0606,
          "implied_lo": 0.0455,
          "implied_hi": 0.0771
        },
        {
          "rank": 16,
          "keeper": "Nico Mantl",
          "keeper_id": 888592,
          "team": "Arouca",
          "minutes": 3330.0,
          "y": 42.0,
          "n": 701.0,
          "theta": -0.0633,
          "theta_lo": -0.2958,
          "theta_hi": 0.1572,
          "p_above_average": 0.324,
          "separable": false,
          "implied": 0.0602,
          "implied_lo": 0.0482,
          "implied_hi": 0.0733
        },
        {
          "rank": 17,
          "keeper": "Joel Robles",
          "keeper_id": 93796,
          "team": "Estoril",
          "minutes": 6210.0,
          "y": 63.0,
          "n": 1191.0,
          "theta": -0.1411,
          "theta_lo": -0.3363,
          "theta_hi": 0.0513,
          "p_above_average": 0.11,
          "separable": false,
          "implied": 0.0558,
          "implied_lo": 0.0464,
          "implied_hi": 0.0661
        },
        {
          "rank": 18,
          "keeper": "João Gonçalves",
          "keeper_id": 987596,
          "team": "Nacional",
          "minutes": 3960.0,
          "y": 46.0,
          "n": 835.0,
          "theta": -0.1506,
          "theta_lo": -0.3757,
          "theta_hi": 0.0657,
          "p_above_average": 0.134,
          "separable": false,
          "implied": 0.0554,
          "implied_lo": 0.0444,
          "implied_hi": 0.0674
        },
        {
          "rank": 19,
          "keeper": "Ricardo Batista",
          "keeper_id": 9668,
          "team": "Casa Pia",
          "minutes": 3146.0,
          "y": 39.0,
          "n": 739.0,
          "theta": -0.1822,
          "theta_lo": -0.4202,
          "theta_hi": 0.0345,
          "p_above_average": 0.086,
          "separable": false,
          "implied": 0.0538,
          "implied_lo": 0.0426,
          "implied_hi": 0.0659
        },
        {
          "rank": 20,
          "keeper": "André Ferreira",
          "keeper_id": 788197,
          "team": "Moreirense",
          "minutes": 2790.0,
          "y": 31.0,
          "n": 681.0,
          "theta": -0.1927,
          "theta_lo": -0.4475,
          "theta_hi": 0.0478,
          "p_above_average": 0.098,
          "separable": false,
          "implied": 0.0533,
          "implied_lo": 0.0417,
          "implied_hi": 0.0659
        },
        {
          "rank": 21,
          "keeper": "Juan Castillo",
          "keeper_id": 1175004,
          "team": "Vitoria SC",
          "minutes": 1350.0,
          "y": 8.0,
          "n": 224.0,
          "theta": -0.2025,
          "theta_lo": -0.5484,
          "theta_hi": 0.1179,
          "p_above_average": 0.156,
          "separable": false,
          "implied": 0.0533,
          "implied_lo": 0.0375,
          "implied_hi": 0.0713
        },
        {
          "rank": 22,
          "keeper": "Lazar Carević",
          "keeper_id": 886204,
          "team": "Famalicao",
          "minutes": 5497.0,
          "y": 41.0,
          "n": 1018.0,
          "theta": -0.3308,
          "theta_lo": -0.5598,
          "theta_hi": -0.1072,
          "p_above_average": 0.005,
          "separable": true,
          "implied": 0.0467,
          "implied_lo": 0.0373,
          "implied_hi": 0.0573
        },
        {
          "rank": 23,
          "keeper": "João Costa",
          "keeper_id": 788365,
          "team": "Santa Clara",
          "minutes": 1260.0,
          "y": 5.0,
          "n": 223.0,
          "theta": -0.3735,
          "theta_lo": -0.7462,
          "theta_hi": -0.0362,
          "p_above_average": 0.031,
          "separable": true,
          "implied": 0.0455,
          "implied_lo": 0.0308,
          "implied_hi": 0.0619
        }
      ]
    },
    "sweeping": {
      "metric": "sweeping volume per 90",
      "style_axis": true,
      "what": "How often the keeper leaves the box — a style, not a quality: a third of its persistence is the club's defensive line height (teammate r 0.239).",
      "ships": true,
      "ranking": [
        {
          "rank": 1,
          "keeper": "Matheus Mendes",
          "keeper_id": 1018555,
          "team": "Alverca",
          "minutes": 1626.0,
          "y": 23.0,
          "n": 1626.0,
          "theta": 0.6591,
          "theta_lo": 0.2836,
          "theta_hi": 1.0256,
          "p_above_average": 0.998,
          "separable": true,
          "implied": 0.9905,
          "implied_lo": 0.6737,
          "implied_hi": 1.3554
        },
        {
          "rank": 2,
          "keeper": "Ignacio de Arruabarrena",
          "keeper_id": 789933,
          "team": "Arouca",
          "minutes": 5040.0,
          "y": 48.0,
          "n": 5040.0,
          "theta": 0.4804,
          "theta_lo": 0.2238,
          "theta_hi": 0.7359,
          "p_above_average": 0.998,
          "separable": true,
          "implied": 0.8185,
          "implied_lo": 0.6415,
          "implied_hi": 1.0243
        },
        {
          "rank": 3,
          "keeper": "Joel Robles",
          "keeper_id": 93796,
          "team": "Estoril",
          "minutes": 6210.0,
          "y": 58.0,
          "n": 6210.0,
          "theta": 0.4556,
          "theta_lo": 0.211,
          "theta_hi": 0.7006,
          "p_above_average": 0.999,
          "separable": true,
          "implied": 0.7971,
          "implied_lo": 0.6374,
          "implied_hi": 0.9731
        },
        {
          "rank": 4,
          "keeper": "Nico Mantl",
          "keeper_id": 888592,
          "team": "Arouca",
          "minutes": 3330.0,
          "y": 29.0,
          "n": 3330.0,
          "theta": 0.3897,
          "theta_lo": 0.0566,
          "theta_hi": 0.701,
          "p_above_average": 0.973,
          "separable": true,
          "implied": 0.7525,
          "implied_lo": 0.5402,
          "implied_hi": 0.9959
        },
        {
          "rank": 5,
          "keeper": "Ennio Van Der Gouw",
          "keeper_id": 1005270,
          "team": "Rio Ave",
          "minutes": 1440.0,
          "y": 12.0,
          "n": 1440.0,
          "theta": 0.2043,
          "theta_lo": -0.2187,
          "theta_hi": 0.6193,
          "p_above_average": 0.788,
          "separable": false,
          "implied": 0.6342,
          "implied_lo": 0.4018,
          "implied_hi": 0.915
        },
        {
          "rank": 6,
          "keeper": "André Ferreira",
          "keeper_id": 788197,
          "team": "Moreirense",
          "minutes": 2790.0,
          "y": 21.0,
          "n": 2790.0,
          "theta": 0.1703,
          "theta_lo": -0.1728,
          "theta_hi": 0.5083,
          "p_above_average": 0.802,
          "separable": false,
          "implied": 0.6057,
          "implied_lo": 0.4271,
          "implied_hi": 0.8161
        },
        {
          "rank": 7,
          "keeper": "Rui Silva",
          "keeper_id": 253809,
          "team": "Sporting CP",
          "minutes": 5137.0,
          "y": 36.0,
          "n": 5137.0,
          "theta": 0.1651,
          "theta_lo": -0.1351,
          "theta_hi": 0.4448,
          "p_above_average": 0.829,
          "separable": false,
          "implied": 0.5991,
          "implied_lo": 0.4495,
          "implied_hi": 0.7666
        },
        {
          "rank": 8,
          "keeper": "Diogo Costa",
          "keeper_id": 843115,
          "team": "Porto",
          "minutes": 9497.0,
          "y": 61.0,
          "n": 9497.0,
          "theta": 0.1406,
          "theta_lo": -0.0903,
          "theta_hi": 0.368,
          "p_above_average": 0.844,
          "separable": false,
          "implied": 0.5813,
          "implied_lo": 0.4683,
          "implied_hi": 0.7031
        },
        {
          "rank": 9,
          "keeper": "Lucas França",
          "keeper_id": 832672,
          "team": "Santa Clara",
          "minutes": 4140.0,
          "y": 23.0,
          "n": 4140.0,
          "theta": -0.0013,
          "theta_lo": -0.3339,
          "theta_hi": 0.3261,
          "p_above_average": 0.497,
          "separable": false,
          "implied": 0.5096,
          "implied_lo": 0.3641,
          "implied_hi": 0.6801
        },
        {
          "rank": 10,
          "keeper": "Patrick Sequeira",
          "keeper_id": 821628,
          "team": "Casa Pia",
          "minutes": 5400.0,
          "y": 28.0,
          "n": 5400.0,
          "theta": -0.0649,
          "theta_lo": -0.3674,
          "theta_hi": 0.2346,
          "p_above_average": 0.36,
          "separable": false,
          "implied": 0.4774,
          "implied_lo": 0.3484,
          "implied_hi": 0.625
        },
        {
          "rank": 11,
          "keeper": "João Costa",
          "keeper_id": 788365,
          "team": "Santa Clara",
          "minutes": 1260.0,
          "y": 6.0,
          "n": 1260.0,
          "theta": -0.0736,
          "theta_lo": -0.6006,
          "theta_hi": 0.4021,
          "p_above_average": 0.424,
          "separable": false,
          "implied": 0.4873,
          "implied_lo": 0.2758,
          "implied_hi": 0.7521
        },
        {
          "rank": 12,
          "keeper": "Lazar Carević",
          "keeper_id": 886204,
          "team": "Famalicao",
          "minutes": 5497.0,
          "y": 29.0,
          "n": 5497.0,
          "theta": -0.0819,
          "theta_lo": -0.3887,
          "theta_hi": 0.2194,
          "p_above_average": 0.324,
          "separable": false,
          "implied": 0.4689,
          "implied_lo": 0.3466,
          "implied_hi": 0.6105
        },
        {
          "rank": 13,
          "keeper": "Jhonatan",
          "keeper_id": 798688,
          "team": "Alverca",
          "minutes": 3060.0,
          "y": 14.0,
          "n": 3060.0,
          "theta": -0.1026,
          "theta_lo": -0.5033,
          "theta_hi": 0.2712,
          "p_above_average": 0.336,
          "separable": false,
          "implied": 0.4645,
          "implied_lo": 0.3063,
          "implied_hi": 0.6535
        },
        {
          "rank": 14,
          "keeper": "Lucão",
          "keeper_id": 981586,
          "team": "Gil Vicente",
          "minutes": 1530.0,
          "y": 8.0,
          "n": 1530.0,
          "theta": -0.1051,
          "theta_lo": -0.5611,
          "theta_hi": 0.3232,
          "p_above_average": 0.357,
          "separable": false,
          "implied": 0.4674,
          "implied_lo": 0.2895,
          "implied_hi": 0.6919
        },
        {
          "rank": 15,
          "keeper": "Cezary Miszta",
          "keeper_id": 938292,
          "team": "Rio Ave",
          "minutes": 4306.0,
          "y": 20.0,
          "n": 4306.0,
          "theta": -0.1499,
          "theta_lo": -0.5058,
          "theta_hi": 0.1787,
          "p_above_average": 0.246,
          "separable": false,
          "implied": 0.4403,
          "implied_lo": 0.3029,
          "implied_hi": 0.5976
        },
        {
          "rank": 16,
          "keeper": "Ricardo Batista",
          "keeper_id": 9668,
          "team": "Casa Pia",
          "minutes": 3146.0,
          "y": 13.0,
          "n": 3146.0,
          "theta": -0.1824,
          "theta_lo": -0.5859,
          "theta_hi": 0.2122,
          "p_above_average": 0.235,
          "separable": false,
          "implied": 0.4301,
          "implied_lo": 0.2789,
          "implied_hi": 0.6145
        },
        {
          "rank": 17,
          "keeper": "André Gomes",
          "keeper_id": 1139990,
          "team": "Casa Pia",
          "minutes": 2610.0,
          "y": 12.0,
          "n": 2610.0,
          "theta": -0.1929,
          "theta_lo": -0.5948,
          "theta_hi": 0.1878,
          "p_above_average": 0.211,
          "separable": false,
          "implied": 0.4249,
          "implied_lo": 0.2775,
          "implied_hi": 0.6021
        },
        {
          "rank": 18,
          "keeper": "Ivan Zlobin",
          "keeper_id": 788203,
          "team": "Famalicao",
          "minutes": 1440.0,
          "y": 4.0,
          "n": 1440.0,
          "theta": -0.3138,
          "theta_lo": -0.8564,
          "theta_hi": 0.1711,
          "p_above_average": 0.147,
          "separable": false,
          "implied": 0.3838,
          "implied_lo": 0.2125,
          "implied_hi": 0.5913
        },
        {
          "rank": 19,
          "keeper": "Charles",
          "keeper_id": 155985,
          "team": "Vitoria SC",
          "minutes": 2340.0,
          "y": 8.0,
          "n": 2340.0,
          "theta": -0.3336,
          "theta_lo": -0.7845,
          "theta_hi": 0.0798,
          "p_above_average": 0.097,
          "separable": false,
          "implied": 0.3716,
          "implied_lo": 0.2288,
          "implied_hi": 0.5411
        },
        {
          "rank": 20,
          "keeper": "Samuel Soares",
          "keeper_id": 983550,
          "team": "Benfica",
          "minutes": 1530.0,
          "y": 4.0,
          "n": 1530.0,
          "theta": -0.3961,
          "theta_lo": -0.9147,
          "theta_hi": 0.0735,
          "p_above_average": 0.088,
          "separable": false,
          "implied": 0.3529,
          "implied_lo": 0.1986,
          "implied_hi": 0.5414
        },
        {
          "rank": 21,
          "keeper": "Juan Castillo",
          "keeper_id": 1175004,
          "team": "Vitoria SC",
          "minutes": 1350.0,
          "y": 3.0,
          "n": 1350.0,
          "theta": -0.4377,
          "theta_lo": -0.9741,
          "theta_hi": 0.0614,
          "p_above_average": 0.075,
          "separable": false,
          "implied": 0.3397,
          "implied_lo": 0.187,
          "implied_hi": 0.5314
        },
        {
          "rank": 22,
          "keeper": "João Gonçalves",
          "keeper_id": 987596,
          "team": "Nacional",
          "minutes": 3960.0,
          "y": 11.0,
          "n": 3960.0,
          "theta": -0.4553,
          "theta_lo": -0.8501,
          "theta_hi": -0.0736,
          "p_above_average": 0.024,
          "separable": true,
          "implied": 0.3272,
          "implied_lo": 0.211,
          "implied_hi": 0.4637
        },
        {
          "rank": 23,
          "keeper": "Anatoliy Trubin",
          "keeper_id": 966616,
          "team": "Benfica",
          "minutes": 8280.0,
          "y": 21.0,
          "n": 8280.0,
          "theta": -0.6207,
          "theta_lo": -0.9513,
          "theta_hi": -0.3132,
          "p_above_average": 0.0,
          "separable": true,
          "implied": 0.2743,
          "implied_lo": 0.195,
          "implied_hi": 0.3646
        }
      ]
    },
    "shot_stopping": {
      "metric": "goals prevented vs post-shot xG (reconstructed)",
      "n_fitted": 50,
      "mean_sot_faced": 154,
      "separable": 0,
      "expected_separators_precomputed": 3.1,
      "season_to_season_theta": -0.088,
      "ships": false,
      "null_statement": "0 of 50 keepers separate from average at 90% over 4 seasons (~154 shots on target each) — shot-stopping differences between Liga keepers are real but too small to rank reliably. This is the properly-powered version of ADR-020's 0-of-23, on several times the shots.",
      "ranking": null
    }
  }
}