Introduction and the development of social movements
Take the survey at https://forms.gle/iXweLEsJ7VTANrmGA
Can you understand me?
Read the syllabus!
protests through 8 October 2026
| Date | Class | Lecture |
|---|---|---|
| 2026-10-12 | 1 | Introduction and the development of social movements (SMs) |
| 2026-10-19 | 2 | SM theories: collective behaviour, resource mobilisation, political processes |
| 2026-10-26 | 3 | SM theories: framing, civil society |
| 2026-11-02 | 4 | Mobilisation, recruitment, participation |
| 2026-11-09 | 5 | Collective identity and emotions |
| 2026-11-16 | 6 | Organisation, strategies and tactics |
| 2026-11-23 | 7 | SMs and the media |
| 2026-11-30 | 8 | SM coalitions |
| 2026-12-07 | 9 | State responses |
| 2026-12-14 | 10 | Counter-mobilisation and countermovements |
| 2026-12-21 | 11 | SMs online |
| 2027-01-11 | 12 | SM impact |
| 2027-01-18 | 13 | Demobilisation |
| 2027-01-25 | 14 | Contemporary social movements and beyond: climate, migration |
| 2027-02-01 | 15 | NO CLASS MEETING TODAY |
| Studiengang | Belegung | Leistungsnachweis(e) | Klausurinhalte |
| BA Hauptfach | VL (Vorlesung BRD) und GK (Grundkurs) | Klausur (90 Min.) | 3/5 Wissensfragen und 1/3 Essayfrage |
| BA Nebenfach 60 ECTS | VL und GK | Klausur (90 Min.) | 3/5 Wissensfragen und 1/3 Essayfrage |
| Lehramt Unterrichtsfach | VL und GK | Klausur (90 Min.) & Referat | 3/5 Wissensfragen und 1/3 Essayfrage |
| BA Nebenfach 30 ECTS | nur VL | Klausur (90 Min.) | 3/5 Wissensfragen kein Essay |
| Lehramt Didaktikfach | nur VL | Klausur (60 Min.) | 2/5 Wissensfragen kein Essay |
| Austauschstudierende für VL | VL | Klausur (90 Min.) | 3/5 Wissensfragen kein Essay |
| Austauschstudierende für GK | GK | Festgelegt durch GK Dozent | N/A |
Die Sprache der Essayfragen (Deutsch oder Englisch) richtet sich nach der Sprache des jeweiligen GKs. Unabhängig von der Sprache der Fragestellung (oder Teil der Veranstaltung) können Studierende je nach Präferenz auf Deutsch oder Englisch antworten.
Kontakt für prüfungsrechtliche Fragen, Kursanmeldung, - wechsel, - abmeldung, Fragen zur Anmeldung zur Prüfung: studienbuero@gsi.uni-muenchen.de
| Participation | Presentation | Essay | Klausur | |
| BA Hauptfach | X | X | ||
| BA Nebenfach (60 ECTS) | X | X | ||
| Lehramt Unterrichtsfach | X | X | X | |
| BA Nebenfach (30 ECTS) | X | X (nur VL) | ||
| Lehramt Didaktikfach | X | X (nur VL, 60 Min., 2 Wissensfragen) | ||
| Austauschstudierende für VL | X | X (nur VL) | ||
| Austauschstudierende für GK | X | X | X |
submit all assignments by email: m.zeller@lmu.de
Patriotta, G. (2017). Crafting papers for publication: Novelty and convention in academic writing. Journal of Management Studies, 54(5), 747-759.
Throughout, we will use cases to link theory to real-world events
since lower indoor C02 improves cognition… we will air before class and (unless it is way too cold) at least tilt a window during class
Q & A
import { liveGoogleSheet } from "@jimjamslam/live-google-sheet";
import { aq, op } from "@uwdata/arquero";
// UPDATE THE LINK FOR A NEW POLL
surveyResults = liveGoogleSheet(
"https://docs.google.com/spreadsheets/d/e/" +
"2PACX-1vTYpr3h8MBAj2Le1HRxZZiPQlgEbiBa4I66jzpx-2x90Fy0gdEHKMDFd2B-_Q80iG3DFPFdLrhT5HZM/" +
"pub?gid=1839178496&single=true&output=csv",
10000, 1, 6); // adjust the last number to select all relevant columns
respondentCount = surveyResults.length;function PieChart(data, {
name = ([x]) => x, // given d in data, returns the (ordinal) label
value = ([, y]) => y, // given d in data, returns the (quantitative) value
title, // given d in data, returns the title text
width = 640, // outer width, in pixels
height = 400, // outer height, in pixels
innerRadius = 0, // inner radius of pie, in pixels (non-zero for donut)
outerRadius = Math.min(width, height) / 2, // outer radius of pie, in pixels
labelRadius = (innerRadius * 0.5 + outerRadius * 0.5), // center radius of labels
format = ",", // a format specifier for values (in the label)
names, // array of names (the domain of the color scale)
colors, // array of colors for names
stroke = innerRadius > 0 ? "none" : "white", // stroke separating widths
strokeWidth = 1, // width of stroke separating wedges
strokeLinejoin = "round", // line join of stroke separating wedges
padAngle = stroke === "none" ? 1 / outerRadius : 0, // angular separation between wedges, in radians
} = {}) {
// Compute values.
const N = d3.map(data, name);
const V = d3.map(data, value);
const I = d3.range(N.length).filter(i => !isNaN(V[i]));
// Unique the names.
if (names === undefined) names = N;
names = new d3.InternSet(names);
// Chose a default color scheme based on cardinality.
if (colors === undefined) colors = d3.schemeSpectral[names.size];
if (colors === undefined) colors = d3.quantize(t => d3.interpolateSpectral(t * 0.8 + 0.1), names.size);
// Construct scales.
const color = d3.scaleOrdinal(names, colors);
// Compute titles.
if (title === undefined) {
const formatValue = d3.format(format);
title = i => `${N[i]}\n${formatValue(V[i])}`;
} else {
const O = d3.map(data, d => d);
const T = title;
title = i => T(O[i], i, data);
}
// Construct arcs.
const arcs = d3.pie().padAngle(padAngle).sort(null).value(i => V[i])(I);
const arc = d3.arc().innerRadius(innerRadius).outerRadius(outerRadius);
const arcLabel = d3.arc().innerRadius(labelRadius).outerRadius(labelRadius);
const svg = d3.create("svg")
.attr("width", width)
.attr("height", height)
.attr("viewBox", [-width / 2, -height / 2, width, height])
.attr("style", "max-width: 100%; height: auto; height: intrinsic;");
svg.append("g")
.attr("stroke", stroke)
.attr("stroke-width", strokeWidth)
.attr("stroke-linejoin", strokeLinejoin)
.selectAll("path")
.data(arcs)
.join("path")
.attr("fill", d => color(N[d.data]))
.attr("d", arc)
.append("title")
.text(d => title(d.data));
svg.append("g")
.attr("font-family", "sans-serif")
.attr("font-size", 100)
.attr("text-anchor", "middle")
.selectAll("text")
.data(arcs)
.join("text")
.attr("transform", d => `translate(${arcLabel.centroid(d)})`)
.selectAll("tspan")
.data(d => {
const lines = `${title(d.data)}`.split(/\n/);
return (d.endAngle - d.startAngle) > 0.25 ? lines : lines.slice(0, 1);
})
.join("tspan")
.attr("x", 0)
.attr("y", (_, i) => `${i * 1.1}em`)
.attr("font-weight", (_, i) => i ? null : "bold")
.text(d => d);
return Object.assign(svg.node(), {scales: {color}});
}Prior methods class
methodsCounts = aq.from(surveyResults)
.select("methods")
.derive({ methods: d => (d.methods && d.methods.trim() !== "" ? d.methods : "NA") })
.groupby("methods")
.count()
.rename({ count: 'value', methods: 'name' }) // Rename for D3 pie chart
.objects() // convert to array for D3
methodsChart = PieChart(methodsCounts, {
name: d => d.name,
value: d => d.value,
names: ["Yes", "No", "NA"], // ordering
colors: ["#4CAF50", "#F44336", "#CCCCCC"], // green 'yes', red 'no', grey 'NA'
width,
height: 800
})Prior analytical software use
softwareCounts = aq.from(surveyResults)
.select("software")
.derive({ software: d => (d.software && d.software.trim() !== "" ? d.software : "NA") })
.groupby("software")
.count()
.rename({ count: 'value', software: 'name' }) // Rename for D3 pie chart
.objects() // convert to array for D3
softwareChart = PieChart(softwareCounts, {
name: d => d.name,
value: d => d.value,
names: ["Yes", "No", "NA"], // ordering
colors: ["#4CAF50", "#F44336", "#CCCCCC"], // green 'yes', red 'no', grey 'NA'
width,
height: 800
})Most influential in success of a social movement?
influence_successCounts = aq.from(surveyResults)
.select("influence_success")
.groupby("influence_success")
.count()
.derive({ measure: d => "" })
// Calculate the maximum count from your dataset
influence_success_maxCountRE = Math.max(...influence_successCounts.objects().map(d => d.count));
plot_influence_success = Plot.plot({
marks: [
Plot.barY(influence_successCounts, {
x: "influence_success",
y: "count",
fill: "influence_success",
stroke: "black",
strokeWidth: 1
}),
Plot.ruleY([respondentCount], { stroke: "#ffffff99" })
],
color: {
domain: [
"media coverage",
"public support",
"mass participation",
"elite alliances",
"ability to disrupt",
"coalition building",
"other"
],
range: [
"darkred",
"darkorange",
"goldenrod",
"forestgreen",
"blue",
"indigo",
"violet"
]
},
marginBottom: 300,
x: { label: "", tickSize: 2, tickRotate: -35, padding: 0.3,
domain: ["media coverage", "public support", "mass participation", "elite alliances", "ability to disrupt", "coalition building", "other"]
},
y: {
label: "",
tickSize: 10,
tickFormat: d => d,
tickValues: Array.from(
new Set(influence_successCounts.objects().map(d => d.count))
).sort((a, b) => a - b),
domain: [0, influence_success_maxCountRE]
},
facet: { data: influence_successCounts, x: "measure", label: "" },
marginLeft: 70,
style: {
width: 1600,
height: 500,
fontSize: 40,
},
});Any particular politically violent group you want to learn more about?
concernCounts = aq.from(surveyResults)
.select("concern")
.groupby("concern")
.count()
.derive({ measure: d => "" })
// Calculate the maximum count from your dataset
concern_maxCountRE = Math.max(...concernCounts.objects().map(d => d.count));
plot_concern = Plot.plot({
marks: [
Plot.barY(concernCounts, {
x: "concern",
y: "count",
fill: "concern",
stroke: "black",
strokeWidth: 1
}),
Plot.ruleY([respondentCount], { stroke: "#ffffff99" })
],
color: {
domain: [
"Participating in class discussions",
"Passing the Klausur",
"Studying and discussing in English",
"Talking about politics and political views (about movements)",
"Understanding abstract concepts"
],
range: [
"darkred",
"darkorange",
"goldenrod",
"forestgreen",
"blue"
]
},
marginBottom: 600,
x: { label: "", tickSize: 2, tickRotate: -35, padding: 0.3,
domain: ["Participating in class discussions", "Passing the Klausur", "Studying and discussing in English", "Talking about politics and political views (about movements)", "Understanding abstract concepts"]
},
y: {
label: "",
tickSize: 10,
tickFormat: d => d,
tickValues: Array.from(
new Set(concernCounts.objects().map(d => d.count))
).sort((a, b) => a - b),
domain: [0, concern_maxCountRE]
},
facet: { data: concernCounts, x: "measure", label: "" },
marginLeft: 70,
style: {
width: 1600,
height: 500,
fontSize: 40,
},
});Classical concept (all criteria)
Radial concept (all share ‘female’)
Family resemblance: no criterion shared by all (e.g., games)
Contentious politics is triggered when changing political opportunities and constraints create incentives to take action for actors who lack resources on their own. People contend through known repertoires of contention and expand them by creating innovations at their margins. When backed by well-structured social networks and galvanized by culturally resonant, action-oriented symbols, contentious politics leads to sustained interaction with opponents – to social movements.
COLLECTIVE ACTION
COLLECTIVE ACTION
Contentious collective action
COLLECTIVE ACTION
Contentious collective action
↓
COLLECTIVE ACTION
Contentious collective action
↓
includes social movements
COLLECTIVE ACTION
Contentious collective action
↓
includes social movements
COLLECTIVE ACTION
Contentious collective action
↓
includes social movements
COLLECTIVE ACTION
Contentious collective action
↓
includes social movements
COLLECTIVE ACTION
Contentious collective action
↓
includes social movements
COLLECTIVE ACTION
Contentious collective action
↓
includes social movements
COLLECTIVE ACTION
Contentious collective action
→
Contentious politics
↓
includes social movements
| Parent Scholarship | Social Movement Studies (SMS) |
|---|---|
| Marx and Engels, class conflict | Collective behaviour theory |
| structuralist (leaves little room for the mechanisms that actually draw individuals in collective action) | (grievances, [relative] deprivation) |
| legacy for SMS: class forces and other cleavages spurring collective action | |
| Lenin and resource mobilisation | Resource mobilisation theory |
| vanguardism | |
| legacy for SMS: focus on leaders/organisers (mobilising interests) and organisations | leadership, organisations, and various resources |
| Gramsci and cultural hegemony | Framing and Collective identity theories |
| counterculture of working class can overcome bourgeois hegemonic culture | 'cultural turn' (from anthropology, sociology) |
| legacy for SMS: constructivism, prefiguration, and movement impact on culture | forming consensus in movements |
| Tilly's Polity Model | Political process theory |
| the structure of the state/polity | opportunities, constraints, and the structure of contentious politics |
| legacy for SMS: repertoires of contention, WUNC (worthiness, unity, numbers, committed) |
What cases are you familiar with?
What do you know about them?
How can we categorise them?
Anonymous feedback here: https://forms.gle/AjHt6fcnwZxkSg4X8
Alternatively, please send me an email: m.zeller@lmu.de
Social movements in contention (Tarrow 2011, 33)