Understanding Climate Change Using Data Science
  • Home
  • Research
  • AI Literacy
  • Twitter
  • Facebook
  1. What Can We Do? Personal Action, Mitigation and Resilience
  2. 18  A Collaborative Call for Action

  • FRONT MATTER
    • Welcome
    • Preface
    • About the Book
    • About the Authors

  • Programming and Visualization Primer
    • 1  Setup and Installation
    • 2  Python Primer
    • 3  Pandas

  • 2024 (v1) / 2026 (v2) Climate Dashboard
    • 4  Introduction
    • 5  U.S. and Global Temperatures
    • 6  Seasonal Temperature
    • 7  High and Low Temperatures
    • 8  Temperature and Heat
    • 9  Arctic and Antarctic Ice
    • 10  Oceans
    • 11  Sea Level Rise (SLR)
    • 12  Part 1: Conclusion

  • Are We Responsible? Anthropocene Effect?
    • 13  Are We Responsible for Climate Change? Introduction
    • 14  Greenhouse Gas Emissions

  • Anthropocene? Why Should We Care About Climate Change?
    • 15  Why Do We Care?
    • 16  NOAA Climate Indicators: Droughts
    • 17  Disaster Declarations by FEMA

  • What Can We Do? Personal Action, Mitigation and Resilience
    • 18  A Collaborative Call for Action

Table of contents

  • 18.1 Thinking in Costs and Benefits
  • 18.2 Add Your Proposal
  • 18.3 What Happens to Your Proposal? Let Us Look at the Pipeline
  • 18.4 Counting the Votes
  • 18.5 The Leaderboard
  • 18.6 Effort vs Impact: the Chart That Starts Arguments
  • 18.7 The Fine Print (Because We Analyze Data Honestly)
  • 18.8 Exercises
  • Edit this page
  • Report an issue
  • View source
  1. What Can We Do? Personal Action, Mitigation and Resilience
  2. 18  A Collaborative Call for Action

18  A Collaborative Call for Action

We have spent this whole book looking at the evidence together: higher temperatures and the warming planet, melting glaciers and ice sheets, warming oceans, the droughts and extreme events.

So now comes the question we have been building toward the entire time.

What can we actually do to mitigate the effects of global warming?

Here is the honest answer: we don’t have a complete list. Nobody does. What we do have is you - every reader of this book, each with different skills, budgets, neighborhoods and ideas. So instead of writing this chapter alone, we decided to write it with you.

TipLearning Objectives: Climate and Data
  1. Think about climate actions the way we have analyzed climate data: with evidence, costs AND benefits.
  2. Contribute your own proposal to our shared list.
  3. Vote on the proposals you would actually do.
  4. Learn how a live, crowd-sourced dataset can be read and visualized with the exact same Python we have used all book long.

18.1 Thinking in Costs and Benefits

Every action has a cost — money, time, effort, convenience — and a benefit. Some benefits are direct (less electricity used every day), some are slower but bigger (a city that builds bike lanes changes thousands of trips at once), and some are sneaky-cheap but powerful (just talking about climate, with data, costs nothing and is how ideas spread).

The key issue is that there are going to be different opinions on which actions to take, how much do they cost, whether they have any impact or not. If there are no disagreements, no costs and the measurement and impact is clear, then many of these actions would have been aleady taken!

When you propose an action below, we will ask you to rate it on two simple scales:

  • Effort (1–5): how hard is it, really? Be honest.

    • 1 = you could do it today;
    • 5 = this needs organizing, persistence and probably some meetings.
  • Impact (1–5): how much difference does it make if it actually happens?

    • 1 = small but real;
    • 5 = changes things for many people at once.

These ratings are opinions, not measurements — and that is fine! Reasonable people will disagree, and that disagreement is exactly what the voting is for. This is a different kind of data than the temperature records we have been downloading. It is data that we create together. Our analysis can shed light on what the readers collectively think about the issues and where the disagreements are.

18.2 Add Your Proposal

Have an idea? Put it on the record — this form goes straight to us for review:

Here is the live proposal list — the shared sheet itself, embedded in the page. When a new proposal is approved, it shows up here with no rebuild needed:

And the raw votes as they arrive — a proposal number and a first name, which is all we ever ask for:

The pipeline below now reads that live sheet — which, today, holds our own starter proposals, so you can see exactly what happens to yours once it lands. Yes, we seeded the list with our own ideas and our own votes. Somebody has to go first!

18.3 What Happens to Your Proposal? Let Us Look at the Pipeline

Your form answers land in a shared spreadsheet, and that spreadsheet can be published as a CSV file with a URL. And what do we know how to do really, really well by now? Read a CSV from a URL!

We wrote the code below the way we learned to in the Arctic ice chapter: try the live source first, and fall back to a local copy if the live one is not reachable. Our data sources chapter taught us the hard way that servers move — so this time we planned for it from day one.

import pandas as pd

# The live crowd-sourced sheets, published as CSV (manifest id: reader-proposals).
# If a live read fails — or comes back empty — we fall back to the seed files.
# gid=0 pins the moderated Sheet1 tab, not the form's raw-responses tab.
PROPOSALS_URL = "https://docs.google.com/spreadsheets/d/e/2PACX-1vTf_knTvKKUBjMWfcjk-vqOwqEOUcusy4tutTXZWf12n0MaP_rov-FBAPJQDWqyUCv5KEaAs-qaraCL/pub?gid=0&single=true&output=csv"
VOTES_URL = "https://docs.google.com/spreadsheets/d/e/2PACX-1vSidZU3R6B32rp6XpzV-tF-AqDomRvpasYufb7yb1V4C43CupKmbQcz-ZJxnKU5-qBV-uxRUWXjbteY/pub?gid=0&single=true&output=csv"

try:
    if not PROPOSALS_URL:
        raise ValueError("live proposals sheet not wired up yet")
    proposals = pd.read_csv(PROPOSALS_URL)
    if len(proposals) == 0:
        raise ValueError("live sheet exists but has no rows yet")
    proposals_source = "the live reader sheet"
except Exception:
    proposals = pd.read_csv("../../data/proposals_seed.csv")
    proposals_source = "our seed file (could not read the live sheet)"

try:
    if not VOTES_URL:
        raise ValueError("live votes sheet not wired up yet")
    votes = pd.read_csv(VOTES_URL)
    if len(votes) == 0:
        raise ValueError("live sheet exists but has no votes yet")
    votes_source = "the live voting sheet"
except Exception:
    votes = pd.read_csv("../../data/votes_seed.csv")
    votes_source = "our seed votes (could not read the live sheet)"

print(f"Read {len(proposals)} proposals from {proposals_source}.")
print(f"Read {len(votes)} votes from {votes_source}.")
Read 9 proposals from the live reader sheet.
Read 6 votes from the live voting sheet.

What did we do?

  1. We put the live URLs in variables at the top — when the sheets went live, we changed exactly two lines and nothing else.
  2. The try/except pattern attempts the live read and falls back to the local seed CSVs in the book’s data/ folder if anything goes wrong — including a live sheet with no rows in it yet. No mysterious crashes for readers running this at home.
  3. We recorded which source we actually read — so the graphs below can say so honestly.
proposals
id action scale effort_1to5 impact_1to5 cost_note benefit_note submitted_by
0 1 Switch home lighting to LED and fix draft leaks individual 1 2 small upfront cost, pays for itself in the pow... less electricity used every single day authors (seed)
1 2 Walk, bike or take the bus for trips under 2 m... individual 2 2 a little planning and sometimes sweat no fuel burned, and it is healthy authors (seed)
2 3 Eat more plant-based meals each week individual 2 3 trying new recipes, some meals cost less food is a big slice of a household's footprint authors (seed)
3 4 Fly less; make video calls or take the train w... individual 3 4 longer travel time, less convenience one avoided flight outweighs many small savings authors (seed)
4 5 Start or join a school/community energy audit community 3 3 organizing time, permission from the school finds the cheapest savings first, and teaches ... authors (seed)
5 6 Plant and care for local trees with a communit... community 3 2 ongoing care, not just planting day shade, cooler streets, and carbon uptake over ... authors (seed)
6 7 Talk about climate with family and friends usi... individual 1 3 courage! conversations can be awkward the cheapest action of all, and how ideas spread authors (seed)
7 8 Ask your city for safe bike lanes and better t... policy 4 5 letters, meetings, patience — change is slow one policy change moves thousands of trips at ... authors (seed)
8 9 install solar panels Community 4 4 depends on the state and subsidies lower emissions, resiliency and lower costs s

Each row is one proposed action, its scale (individual, community or policy), the effort and impact ratings, and — most importantly — the proposer’s own words on costs and benefits.

18.4 Counting the Votes

Voting works the same way: a tiny form that asks one question (“which proposal number would you actually do?” — plus your first name), a sheet, a CSV.

Cast yours right here:

Counting votes is a one-liner we have used since the FEMA chapter — groupby and count.

vote_counts = votes.groupby("proposal_id").size().reset_index(name="votes")

results = proposals.merge(vote_counts, left_on="id", right_on="proposal_id", how="left")
results["votes"] = results["votes"].fillna(0).astype(int)

results[["id", "action", "scale", "votes"]].sort_values("votes", ascending=False)
id action scale votes
7 8 Ask your city for safe bike lanes and better t... policy 2
6 7 Talk about climate with family and friends usi... individual 2
1 2 Walk, bike or take the bus for trips under 2 m... individual 1
2 3 Eat more plant-based meals each week individual 1
0 1 Switch home lighting to LED and fix draft leaks individual 0
4 5 Start or join a school/community energy audit community 0
3 4 Fly less; make video calls or take the train w... individual 0
5 6 Plant and care for local trees with a communit... community 0
8 9 install solar panels Community 0

We merged the vote counts onto the proposals (a left merge, so proposals with zero votes stay in the table — zero votes is information too!) and sorted.

18.5 The Leaderboard

import plotly.express as px

top = results.sort_values("votes", ascending=True).tail(8)

fig = px.bar(top, x="votes", y="action", orientation="h", color="scale",
             color_discrete_map={"individual": "#2166ac", "community": "#67a9cf", "policy": "#b2182b"},
             labels={"votes": "Votes", "action": "", "scale": "Scale"})
fig.update_layout(
    title=f"Top proposals by votes (from {votes_source})",
    title_x=0.5,
    legend=dict(x=0.65, y=0.1)
)
fig.show()

The colors carry meaning: blues for individual and community actions, red for policy asks — the same colorblind-friendly palette family as our warming stripes.

18.6 Effort vs Impact: the Chart That Starts Arguments

This is our favorite figure in the whole chapter. Every proposal lands in one of four corners:

fig = px.scatter(results, x="effort_1to5", y="impact_1to5",
                 size=results["votes"] + 1, color="scale", text="id",
                 color_discrete_map={"individual": "#2166ac", "community": "#67a9cf", "policy": "#b2182b"},
                 labels={"effort_1to5": "Effort (1 = easy, 5 = hard)",
                         "impact_1to5": "Impact (1 = small, 5 = big)", "scale": "Scale"})
fig.update_traces(textposition="top center")
fig.update_layout(
    title="Effort vs impact — proposer's own ratings (point size = votes)",
    title_x=0.5,
    xaxis=dict(range=[0.5, 5.5], dtick=1),
    yaxis=dict(range=[0.5, 5.5], dtick=1)
)
fig.show()

How to read it:

  1. Bottom-left (low effort, low impact): easy little habits. Do them — they add up, and they get you started.
  2. Top-left (low effort, high impact): the easy wins. If you find something here, tell everyone.
  3. Top-right (high effort, high impact): the big projects — bike lanes, energy audits, policy. These need groups, not heroes.
  4. Bottom-right (high effort, low impact): think twice! Sometimes an action feels virtuous but the numbers do not follow. This corner is why we ask about costs AND benefits.

Remember: the positions are the proposers’ own honest guesses, and the votes are yours. If you think proposal 8 is rated wrong — vote, or better, submit a sharper version of it.

18.7 The Fine Print (Because We Analyze Data Honestly)

NoteThis is opinion data — treat it that way

The temperature records in Part 1 were measurements. This chapter’s data is people’s judgments: self-rated effort and impact, votes from whoever showed up. That means selection bias (voters are readers of this book!), round numbers, and enthusiasm spikes. We are fine with all of that — it is a starting point for conversations and experiments, not a scientific ranking. But notice how naturally you just thought about data quality. That is the real lesson of this book.

A practical note on safety: submissions show up publicly once we refresh the book, so first names or nicknames only, no contact details, and be kind — we review submissions before they go into the published sheet.

18.8 Exercises

  1. Submit a proposal! Rate it honestly on both scales.
  2. Pick one proposal from the leaderboard and try it for a week. Did the effort rating match your experience? Vote accordingly.
  3. For coders: the seed CSVs live in the book’s data/ folder. Add a region column idea — how would the charts change if we could compare proposals from different places?
  4. Harder: our vote counter allows anyone to vote many times. How would you detect that in the data? (Hint: we never ask for anything personal — so what can you check?)

Sloka Chava and Sahasra Chava

 
  • Edit this page
  • Report an issue
  • View source

NextGen360.