{
  "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.545,
      "teammate_r": -0.101,
      "season_to_season": 0.011,
      "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": "Ivan Zlobin",
          "keeper_id": 788203,
          "team": "Famalicao",
          "minutes": 1440.0,
          "y": 29.0,
          "n": 276.0,
          "theta": 0.3053,
          "theta_lo": 0.0289,
          "theta_hi": 0.592,
          "p_above_average": 0.964,
          "separable": true,
          "implied": 0.0827,
          "implied_lo": 0.0632,
          "implied_hi": 0.1057
        },
        {
          "rank": 2,
          "keeper": "Lucão",
          "keeper_id": 981586,
          "team": "Gil Vicente",
          "minutes": 990.0,
          "y": 15.0,
          "n": 156.0,
          "theta": 0.2351,
          "theta_lo": -0.109,
          "theta_hi": 0.5848,
          "p_above_average": 0.871,
          "separable": false,
          "implied": 0.078,
          "implied_lo": 0.0556,
          "implied_hi": 0.1053
        },
        {
          "rank": 3,
          "keeper": "Charles",
          "keeper_id": 155985,
          "team": "Vitoria SC",
          "minutes": 2340.0,
          "y": 33.0,
          "n": 384.0,
          "theta": 0.225,
          "theta_lo": -0.0403,
          "theta_hi": 0.4806,
          "p_above_average": 0.921,
          "separable": false,
          "implied": 0.0767,
          "implied_lo": 0.0595,
          "implied_hi": 0.0964
        },
        {
          "rank": 4,
          "keeper": "Ennio Van Der Gouw",
          "keeper_id": 1005270,
          "team": "Rio Ave",
          "minutes": 1260.0,
          "y": 23.0,
          "n": 275.0,
          "theta": 0.2169,
          "theta_lo": -0.0742,
          "theta_hi": 0.5138,
          "p_above_average": 0.886,
          "separable": false,
          "implied": 0.0763,
          "implied_lo": 0.0577,
          "implied_hi": 0.0985
        },
        {
          "rank": 5,
          "keeper": "Lucas França",
          "keeper_id": 832672,
          "team": "Santa Clara",
          "minutes": 3780.0,
          "y": 67.0,
          "n": 816.0,
          "theta": 0.2107,
          "theta_lo": 0.0062,
          "theta_hi": 0.4137,
          "p_above_average": 0.956,
          "separable": true,
          "implied": 0.0754,
          "implied_lo": 0.0621,
          "implied_hi": 0.09
        },
        {
          "rank": 6,
          "keeper": "Jhonatan",
          "keeper_id": 798688,
          "team": "Alverca",
          "minutes": 3060.0,
          "y": 59.0,
          "n": 701.0,
          "theta": 0.1831,
          "theta_lo": -0.0444,
          "theta_hi": 0.4121,
          "p_above_average": 0.913,
          "separable": false,
          "implied": 0.0736,
          "implied_lo": 0.0591,
          "implied_hi": 0.0899
        },
        {
          "rank": 7,
          "keeper": "Ignacio de Arruabarrena",
          "keeper_id": 789933,
          "team": "Arouca",
          "minutes": 4590.0,
          "y": 75.0,
          "n": 1007.0,
          "theta": 0.1372,
          "theta_lo": -0.064,
          "theta_hi": 0.3293,
          "p_above_average": 0.873,
          "separable": false,
          "implied": 0.0704,
          "implied_lo": 0.0585,
          "implied_hi": 0.0832
        },
        {
          "rank": 8,
          "keeper": "Patrick Sequeira",
          "keeper_id": 821628,
          "team": "Casa Pia",
          "minutes": 5310.0,
          "y": 82.0,
          "n": 1155.0,
          "theta": 0.1142,
          "theta_lo": -0.076,
          "theta_hi": 0.3035,
          "p_above_average": 0.834,
          "separable": false,
          "implied": 0.0689,
          "implied_lo": 0.0574,
          "implied_hi": 0.0816
        },
        {
          "rank": 9,
          "keeper": "Diogo Costa",
          "keeper_id": 843115,
          "team": "Porto",
          "minutes": 9137.0,
          "y": 96.0,
          "n": 1339.0,
          "theta": 0.1114,
          "theta_lo": -0.0631,
          "theta_hi": 0.2873,
          "p_above_average": 0.86,
          "separable": false,
          "implied": 0.0687,
          "implied_lo": 0.0582,
          "implied_hi": 0.0799
        },
        {
          "rank": 10,
          "keeper": "Anatoliy Trubin",
          "keeper_id": 966616,
          "team": "Benfica",
          "minutes": 8280.0,
          "y": 82.0,
          "n": 1125.0,
          "theta": 0.1112,
          "theta_lo": -0.0802,
          "theta_hi": 0.293,
          "p_above_average": 0.84,
          "separable": false,
          "implied": 0.0687,
          "implied_lo": 0.0574,
          "implied_hi": 0.0809
        },
        {
          "rank": 11,
          "keeper": "Cezary Miszta",
          "keeper_id": 938292,
          "team": "Rio Ave",
          "minutes": 4306.0,
          "y": 69.0,
          "n": 1023.0,
          "theta": 0.0679,
          "theta_lo": -0.1242,
          "theta_hi": 0.263,
          "p_above_average": 0.717,
          "separable": false,
          "implied": 0.066,
          "implied_lo": 0.0544,
          "implied_hi": 0.0787
        },
        {
          "rank": 12,
          "keeper": "Rui Silva",
          "keeper_id": 253809,
          "team": "Sporting CP",
          "minutes": 4770.0,
          "y": 43.0,
          "n": 662.0,
          "theta": 0.0455,
          "theta_lo": -0.1868,
          "theta_hi": 0.2804,
          "p_above_average": 0.63,
          "separable": false,
          "implied": 0.0648,
          "implied_lo": 0.0516,
          "implied_hi": 0.0797
        },
        {
          "rank": 13,
          "keeper": "André Gomes",
          "keeper_id": 1139990,
          "team": "Casa Pia",
          "minutes": 2610.0,
          "y": 31.0,
          "n": 554.0,
          "theta": -0.031,
          "theta_lo": -0.2876,
          "theta_hi": 0.221,
          "p_above_average": 0.417,
          "separable": false,
          "implied": 0.0604,
          "implied_lo": 0.0468,
          "implied_hi": 0.0757
        },
        {
          "rank": 14,
          "keeper": "Samuel Soares",
          "keeper_id": 983550,
          "team": "Benfica",
          "minutes": 1080.0,
          "y": 8.0,
          "n": 145.0,
          "theta": -0.0577,
          "theta_lo": -0.4091,
          "theta_hi": 0.2852,
          "p_above_average": 0.392,
          "separable": false,
          "implied": 0.0595,
          "implied_lo": 0.0415,
          "implied_hi": 0.0806
        },
        {
          "rank": 15,
          "keeper": "Nico Mantl",
          "keeper_id": 888592,
          "team": "Arouca",
          "minutes": 3330.0,
          "y": 42.0,
          "n": 701.0,
          "theta": -0.0614,
          "theta_lo": -0.2906,
          "theta_hi": 0.1619,
          "p_above_average": 0.33,
          "separable": false,
          "implied": 0.0586,
          "implied_lo": 0.0467,
          "implied_hi": 0.0721
        },
        {
          "rank": 16,
          "keeper": "Joel Robles",
          "keeper_id": 93796,
          "team": "Estoril",
          "minutes": 5760.0,
          "y": 61.0,
          "n": 1122.0,
          "theta": -0.1079,
          "theta_lo": -0.317,
          "theta_hi": 0.0874,
          "p_above_average": 0.18,
          "separable": false,
          "implied": 0.056,
          "implied_lo": 0.046,
          "implied_hi": 0.0673
        },
        {
          "rank": 17,
          "keeper": "Matheus Mendes",
          "keeper_id": 1018555,
          "team": "Alverca",
          "minutes": 1170.0,
          "y": 11.0,
          "n": 249.0,
          "theta": -0.1301,
          "theta_lo": -0.4522,
          "theta_hi": 0.1803,
          "p_above_average": 0.247,
          "separable": false,
          "implied": 0.0554,
          "implied_lo": 0.0396,
          "implied_hi": 0.073
        },
        {
          "rank": 18,
          "keeper": "João Gonçalves",
          "keeper_id": 987596,
          "team": "Nacional",
          "minutes": 3960.0,
          "y": 46.0,
          "n": 835.0,
          "theta": -0.146,
          "theta_lo": -0.3798,
          "theta_hi": 0.069,
          "p_above_average": 0.142,
          "separable": false,
          "implied": 0.0541,
          "implied_lo": 0.0429,
          "implied_hi": 0.0658
        },
        {
          "rank": 19,
          "keeper": "Ricardo Batista",
          "keeper_id": 9668,
          "team": "Casa Pia",
          "minutes": 3146.0,
          "y": 39.0,
          "n": 739.0,
          "theta": -0.1796,
          "theta_lo": -0.4173,
          "theta_hi": 0.053,
          "p_above_average": 0.102,
          "separable": false,
          "implied": 0.0525,
          "implied_lo": 0.0413,
          "implied_hi": 0.065
        },
        {
          "rank": 20,
          "keeper": "André Ferreira",
          "keeper_id": 788197,
          "team": "Moreirense",
          "minutes": 2340.0,
          "y": 24.0,
          "n": 561.0,
          "theta": -0.1979,
          "theta_lo": -0.4603,
          "theta_hi": 0.0544,
          "p_above_average": 0.1,
          "separable": false,
          "implied": 0.0517,
          "implied_lo": 0.0396,
          "implied_hi": 0.0649
        },
        {
          "rank": 21,
          "keeper": "Juan Castillo",
          "keeper_id": 1175004,
          "team": "Vitoria SC",
          "minutes": 1350.0,
          "y": 8.0,
          "n": 224.0,
          "theta": -0.1995,
          "theta_lo": -0.5471,
          "theta_hi": 0.118,
          "p_above_average": 0.16,
          "separable": false,
          "implied": 0.052,
          "implied_lo": 0.0363,
          "implied_hi": 0.0689
        },
        {
          "rank": 22,
          "keeper": "Lazar Carević",
          "keeper_id": 886204,
          "team": "Famalicao",
          "minutes": 5040.0,
          "y": 38.0,
          "n": 931.0,
          "theta": -0.3035,
          "theta_lo": -0.5396,
          "theta_hi": -0.0747,
          "p_above_average": 0.013,
          "separable": true,
          "implied": 0.0466,
          "implied_lo": 0.0369,
          "implied_hi": 0.0578
        },
        {
          "rank": 23,
          "keeper": "João Costa",
          "keeper_id": 788365,
          "team": "Santa Clara",
          "minutes": 1260.0,
          "y": 5.0,
          "n": 223.0,
          "theta": -0.3674,
          "theta_lo": -0.7436,
          "theta_hi": -0.0155,
          "p_above_average": 0.04,
          "separable": true,
          "implied": 0.0445,
          "implied_lo": 0.03,
          "implied_hi": 0.0607
        }
      ]
    },
    "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": 1170.0,
          "y": 15.0,
          "n": 1170.0,
          "theta": 0.5278,
          "theta_lo": 0.1136,
          "theta_hi": 0.9401,
          "p_above_average": 0.983,
          "separable": true,
          "implied": 0.8571,
          "implied_lo": 0.5551,
          "implied_hi": 1.2291
        },
        {
          "rank": 2,
          "keeper": "Ignacio de Arruabarrena",
          "keeper_id": 789933,
          "team": "Arouca",
          "minutes": 4590.0,
          "y": 43.0,
          "n": 4590.0,
          "theta": 0.4751,
          "theta_lo": 0.2112,
          "theta_hi": 0.7247,
          "p_above_average": 0.998,
          "separable": true,
          "implied": 0.7985,
          "implied_lo": 0.6155,
          "implied_hi": 1.0018
        },
        {
          "rank": 3,
          "keeper": "Joel Robles",
          "keeper_id": 93796,
          "team": "Estoril",
          "minutes": 5760.0,
          "y": 53.0,
          "n": 5760.0,
          "theta": 0.4405,
          "theta_lo": 0.19,
          "theta_hi": 0.6921,
          "p_above_average": 0.997,
          "separable": true,
          "implied": 0.7706,
          "implied_lo": 0.6059,
          "implied_hi": 0.9564
        },
        {
          "rank": 4,
          "keeper": "Nico Mantl",
          "keeper_id": 888592,
          "team": "Arouca",
          "minutes": 3330.0,
          "y": 29.0,
          "n": 3330.0,
          "theta": 0.3888,
          "theta_lo": 0.0841,
          "theta_hi": 0.6924,
          "p_above_average": 0.977,
          "separable": true,
          "implied": 0.7366,
          "implied_lo": 0.5348,
          "implied_hi": 0.9786
        },
        {
          "rank": 5,
          "keeper": "André Ferreira",
          "keeper_id": 788197,
          "team": "Moreirense",
          "minutes": 2340.0,
          "y": 19.0,
          "n": 2340.0,
          "theta": 0.2279,
          "theta_lo": -0.123,
          "theta_hi": 0.5776,
          "p_above_average": 0.854,
          "separable": false,
          "implied": 0.6299,
          "implied_lo": 0.4375,
          "implied_hi": 0.8551
        },
        {
          "rank": 6,
          "keeper": "Rui Silva",
          "keeper_id": 253809,
          "team": "Sporting CP",
          "minutes": 4770.0,
          "y": 35.0,
          "n": 4770.0,
          "theta": 0.2086,
          "theta_lo": -0.0814,
          "theta_hi": 0.4966,
          "p_above_average": 0.878,
          "separable": false,
          "implied": 0.6138,
          "implied_lo": 0.4587,
          "implied_hi": 0.7953
        },
        {
          "rank": 7,
          "keeper": "Diogo Costa",
          "keeper_id": 843115,
          "team": "Porto",
          "minutes": 9137.0,
          "y": 60.0,
          "n": 9137.0,
          "theta": 0.1662,
          "theta_lo": -0.0681,
          "theta_hi": 0.3958,
          "p_above_average": 0.881,
          "separable": false,
          "implied": 0.5848,
          "implied_lo": 0.4675,
          "implied_hi": 0.7123
        },
        {
          "rank": 8,
          "keeper": "Ennio Van Der Gouw",
          "keeper_id": 1005270,
          "team": "Rio Ave",
          "minutes": 1260.0,
          "y": 9.0,
          "n": 1260.0,
          "theta": 0.0977,
          "theta_lo": -0.3624,
          "theta_hi": 0.5426,
          "p_above_average": 0.647,
          "separable": false,
          "implied": 0.5618,
          "implied_lo": 0.3409,
          "implied_hi": 0.8417
        },
        {
          "rank": 9,
          "keeper": "Lucas França",
          "keeper_id": 832672,
          "team": "Santa Clara",
          "minutes": 3780.0,
          "y": 21.0,
          "n": 3780.0,
          "theta": 0.0119,
          "theta_lo": -0.3395,
          "theta_hi": 0.351,
          "p_above_average": 0.528,
          "separable": false,
          "implied": 0.5075,
          "implied_lo": 0.3515,
          "implied_hi": 0.6909
        },
        {
          "rank": 10,
          "keeper": "Lucão",
          "keeper_id": 981586,
          "team": "Gil Vicente",
          "minutes": 990.0,
          "y": 6.0,
          "n": 990.0,
          "theta": -0.0044,
          "theta_lo": -0.5343,
          "theta_hi": 0.4747,
          "p_above_average": 0.508,
          "separable": false,
          "implied": 0.5114,
          "implied_lo": 0.2894,
          "implied_hi": 0.7836
        },
        {
          "rank": 11,
          "keeper": "João Costa",
          "keeper_id": 788365,
          "team": "Santa Clara",
          "minutes": 1260.0,
          "y": 6.0,
          "n": 1260.0,
          "theta": -0.0679,
          "theta_lo": -0.5653,
          "theta_hi": 0.3951,
          "p_above_average": 0.418,
          "separable": false,
          "implied": 0.479,
          "implied_lo": 0.2794,
          "implied_hi": 0.7323
        },
        {
          "rank": 12,
          "keeper": "Jhonatan",
          "keeper_id": 798688,
          "team": "Alverca",
          "minutes": 3060.0,
          "y": 14.0,
          "n": 3060.0,
          "theta": -0.0977,
          "theta_lo": -0.4781,
          "theta_hi": 0.2708,
          "p_above_average": 0.336,
          "separable": false,
          "implied": 0.4571,
          "implied_lo": 0.3031,
          "implied_hi": 0.6429
        },
        {
          "rank": 13,
          "keeper": "Patrick Sequeira",
          "keeper_id": 821628,
          "team": "Casa Pia",
          "minutes": 5310.0,
          "y": 26.0,
          "n": 5310.0,
          "theta": -0.1129,
          "theta_lo": -0.4303,
          "theta_hi": 0.1876,
          "p_above_average": 0.274,
          "separable": false,
          "implied": 0.4463,
          "implied_lo": 0.323,
          "implied_hi": 0.5895
        },
        {
          "rank": 14,
          "keeper": "Lazar Carević",
          "keeper_id": 886204,
          "team": "Famalicao",
          "minutes": 5040.0,
          "y": 25.0,
          "n": 5040.0,
          "theta": -0.1207,
          "theta_lo": -0.4297,
          "theta_hi": 0.1778,
          "p_above_average": 0.254,
          "separable": false,
          "implied": 0.4424,
          "implied_lo": 0.3215,
          "implied_hi": 0.5795
        },
        {
          "rank": 15,
          "keeper": "Cezary Miszta",
          "keeper_id": 938292,
          "team": "Rio Ave",
          "minutes": 4306.0,
          "y": 20.0,
          "n": 4306.0,
          "theta": -0.1503,
          "theta_lo": -0.4887,
          "theta_hi": 0.1801,
          "p_above_average": 0.243,
          "separable": false,
          "implied": 0.4314,
          "implied_lo": 0.3019,
          "implied_hi": 0.586
        },
        {
          "rank": 16,
          "keeper": "Ricardo Batista",
          "keeper_id": 9668,
          "team": "Casa Pia",
          "minutes": 3146.0,
          "y": 13.0,
          "n": 3146.0,
          "theta": -0.1651,
          "theta_lo": -0.5586,
          "theta_hi": 0.2116,
          "p_above_average": 0.251,
          "separable": false,
          "implied": 0.4281,
          "implied_lo": 0.2803,
          "implied_hi": 0.6039
        },
        {
          "rank": 17,
          "keeper": "André Gomes",
          "keeper_id": 1139990,
          "team": "Casa Pia",
          "minutes": 2610.0,
          "y": 12.0,
          "n": 2610.0,
          "theta": -0.189,
          "theta_lo": -0.5823,
          "theta_hi": 0.1894,
          "p_above_average": 0.214,
          "separable": false,
          "implied": 0.4179,
          "implied_lo": 0.2731,
          "implied_hi": 0.5921
        },
        {
          "rank": 18,
          "keeper": "Samuel Soares",
          "keeper_id": 983550,
          "team": "Benfica",
          "minutes": 1080.0,
          "y": 3.0,
          "n": 1080.0,
          "theta": -0.2796,
          "theta_lo": -0.8302,
          "theta_hi": 0.2276,
          "p_above_average": 0.195,
          "separable": false,
          "implied": 0.3911,
          "implied_lo": 0.211,
          "implied_hi": 0.6181
        },
        {
          "rank": 19,
          "keeper": "Ivan Zlobin",
          "keeper_id": 788203,
          "team": "Famalicao",
          "minutes": 1440.0,
          "y": 4.0,
          "n": 1440.0,
          "theta": -0.3011,
          "theta_lo": -0.8174,
          "theta_hi": 0.1753,
          "p_above_average": 0.161,
          "separable": false,
          "implied": 0.3812,
          "implied_lo": 0.2147,
          "implied_hi": 0.5899
        },
        {
          "rank": 20,
          "keeper": "Charles",
          "keeper_id": 155985,
          "team": "Vitoria SC",
          "minutes": 2340.0,
          "y": 8.0,
          "n": 2340.0,
          "theta": -0.3285,
          "theta_lo": -0.7756,
          "theta_hi": 0.0891,
          "p_above_average": 0.106,
          "separable": false,
          "implied": 0.3666,
          "implied_lo": 0.2213,
          "implied_hi": 0.5423
        },
        {
          "rank": 21,
          "keeper": "Juan Castillo",
          "keeper_id": 1175004,
          "team": "Vitoria SC",
          "minutes": 1350.0,
          "y": 3.0,
          "n": 1350.0,
          "theta": -0.4319,
          "theta_lo": -0.9378,
          "theta_hi": 0.034,
          "p_above_average": 0.071,
          "separable": false,
          "implied": 0.3343,
          "implied_lo": 0.1893,
          "implied_hi": 0.5149
        },
        {
          "rank": 22,
          "keeper": "João Gonçalves",
          "keeper_id": 987596,
          "team": "Nacional",
          "minutes": 3960.0,
          "y": 11.0,
          "n": 3960.0,
          "theta": -0.4461,
          "theta_lo": -0.8519,
          "theta_hi": -0.0648,
          "p_above_average": 0.025,
          "separable": true,
          "implied": 0.3234,
          "implied_lo": 0.2102,
          "implied_hi": 0.4575
        },
        {
          "rank": 23,
          "keeper": "Anatoliy Trubin",
          "keeper_id": 966616,
          "team": "Benfica",
          "minutes": 8280.0,
          "y": 21.0,
          "n": 8280.0,
          "theta": -0.62,
          "theta_lo": -0.9443,
          "theta_hi": -0.3069,
          "p_above_average": 0.0,
          "separable": true,
          "implied": 0.2691,
          "implied_lo": 0.1925,
          "implied_hi": 0.3593
        }
      ]
    },
    "shot_stopping": {
      "metric": "goals prevented vs post-shot xG (reconstructed)",
      "n_fitted": 50,
      "mean_sot_faced": 150,
      "separable": 0,
      "expected_separators_precomputed": 3.1,
      "season_to_season_theta": -0.213,
      "ships": false,
      "null_statement": "0 of 50 keepers separate from average at 90% over 4 seasons (~150 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
    }
  }
}