{"spec_id":"coefficient-confidence","library":"altair","language":"python","code":"\"\"\" anyplot.ai\ncoefficient-confidence: Coefficient Plot with Confidence Intervals\nLibrary: altair 6.1.0 | Python 3.13.13\nQuality: 88/100 | Updated: 2026-05-18\n\"\"\"\n\nimport altair as alt\nimport numpy as np\nimport pandas as pd\n\n\n# Data - regression coefficients for housing price prediction\nnp.random.seed(42)\n\nvariables = [\n    \"Living Area (sqft)\",\n    \"Number of Bedrooms\",\n    \"Number of Bathrooms\",\n    \"Lot Size (acres)\",\n    \"Year Built\",\n    \"Garage Capacity\",\n    \"Distance to Downtown (mi)\",\n    \"School Rating\",\n    \"Property Tax Rate (%)\",\n    \"Basement Area (sqft)\",\n    \"Pool\",\n    \"Central Air\",\n]\n\n# Coefficients with varying effect sizes and significance\ncoefficients = [45.2, 12.5, 28.7, 8.3, 0.85, 15.4, -22.1, 18.9, -5.2, 12.1, 35.6, 8.7]\nstd_errors = [3.2, 5.8, 4.1, 3.9, 0.42, 4.2, 3.8, 2.9, 4.1, 2.8, 6.2, 3.1]\n\n# Calculate 95% confidence intervals\nci_lower = [c - 1.96 * se for c, se in zip(coefficients, std_errors, strict=True)]\nci_upper = [c + 1.96 * se for c, se in zip(coefficients, std_errors, strict=True)]\n\n# Determine significance (CI doesn't cross zero)\nsignificant = [(lo > 0 or hi < 0) for lo, hi in zip(ci_lower, ci_upper, strict=True)]\n\ndf = pd.DataFrame(\n    {\n        \"variable\": variables,\n        \"coefficient\": coefficients,\n        \"ci_lower\": ci_lower,\n        \"ci_upper\": ci_upper,\n        \"significant\": significant,\n    }\n)\n\n# Sort by coefficient magnitude for better visualization\ndf = df.sort_values(\"coefficient\", ascending=True).reset_index(drop=True)\ndf[\"variable\"] = pd.Categorical(df[\"variable\"], categories=df[\"variable\"].tolist(), ordered=True)\n\n# Create the coefficient plot\n# Error bars (confidence intervals)\nerror_bars = (\n    alt.Chart(df)\n    .mark_rule(strokeWidth=3)\n    .encode(\n        x=alt.X(\"ci_lower:Q\", title=\"Coefficient Estimate (Effect on Price in $1000s)\"),\n        x2=\"ci_upper:Q\",\n        y=alt.Y(\"variable:N\", title=\"Predictor Variable\", sort=None),\n        color=alt.condition(\n            alt.datum.significant,\n            alt.value(\"#306998\"),  # Python Blue for significant\n            alt.value(\"#999999\"),  # Gray for non-significant\n        ),\n    )\n)\n\n# Points (coefficient estimates)\npoints = (\n    alt.Chart(df)\n    .mark_point(size=300, filled=True)\n    .encode(\n        x=\"coefficient:Q\",\n        y=alt.Y(\"variable:N\", sort=None),\n        color=alt.condition(\n            alt.datum.significant,\n            alt.value(\"#306998\"),  # Python Blue for significant\n            alt.value(\"#999999\"),  # Gray for non-significant\n        ),\n        tooltip=[\n            alt.Tooltip(\"variable:N\", title=\"Variable\"),\n            alt.Tooltip(\"coefficient:Q\", title=\"Coefficient\", format=\".2f\"),\n            alt.Tooltip(\"ci_lower:Q\", title=\"CI Lower\", format=\".2f\"),\n            alt.Tooltip(\"ci_upper:Q\", title=\"CI Upper\", format=\".2f\"),\n            alt.Tooltip(\"significant:N\", title=\"Significant\"),\n        ],\n    )\n)\n\n# Vertical reference line at zero\nzero_line = (\n    alt.Chart(pd.DataFrame({\"x\": [0]})).mark_rule(strokeDash=[8, 6], strokeWidth=2, color=\"#333333\").encode(x=\"x:Q\")\n)\n\n# Combine layers\nchart = (\n    (zero_line + error_bars + points)\n    .properties(\n        width=1400,\n        height=800,\n        title=alt.Title(\"coefficient-confidence · altair · pyplots.ai\", fontSize=28, anchor=\"middle\"),\n    )\n    .configure_axis(labelFontSize=18, titleFontSize=22, labelLimit=400)\n    .configure_view(strokeWidth=0)\n)\n\n# Save as PNG and HTML\nchart.save(\"plot.png\", scale_factor=3.0)\nchart.save(\"plot.html\")\n"}