Analyze an SPSS .sav File Without SPSS: Does Money Buy Happiness?
The 2024 General Social Survey, opened directly from NORC's .sav with every label and missing-value code intact. Weight it with NORC's survey weight, then a chi-square test, a mosaic, a Welch ANOVA and a logistic regression answer the oldest question in the survey. No SPSS, no code.
.sav file NORC publishes. The GSS is a project of the independent research organization NORC at the University of Chicago, with principal funding from the National Science Foundation.
Download the 2024 SPSS file from NORC (free) and follow along. Every figure below is a real screenshot from this file. From Step 3 on, all results are weighted by NORC's wtssnrps_as.
Every two years the General Social Survey asks thousands of Americans how happy they are (very happy, pretty happy, or not too happy), and it also asks what they earn. So the 2024 file can take on the oldest question in social science, does money buy happiness?, with real numbers.
It's also a good test of any tool that claims to read SPSS files. NORC's .sav has 989 variables, a variable label on every one, value labels on 972, and a declared user-missing range on all 989. It's also a weighted survey. If the codes slip through as numbers, or the weights are ignored, the analysis is wrong before it starts.
Step 1: Open the .sav directly
File ▸ Import File… and pick GSS2024.sav. There's no import wizard and no CSV export from SPSS first. Stratum reads the SPSS dictionary itself and loads 989 variables × 3,986 respondents:
- Variable labels become a Label row in the header band, so
happyreads "General happiness". Every column picker shows and searches those labels. - Value labels appear in cells, legends and report tables, so you see "very happy", not
1. Levels list in code order, the way SPSS lists them, so there's nothing to reorder. - User-missing codes ("iap", "don't know", "no answer", "skipped on web") stay in the data, drawn dimmed, and are excluded from every statistic.
.sav as it lands: labels in the header band, value labels in the cells, user-missing codes dimmed.With 989 columns, don't scroll. The column rail lists every variable, and typing happ into its filter finds General happiness by name or label. The Navigator (Stratum's Variable View) shows each column's Values and Missing rule. Missing reads −100 to −10, "From dataset": the file declares the same range on all 989 variables, so Stratum keeps it as one rule for the file rather than 989 copies.
Step 2: Half the file is missing codes, so get them right
Of the 3.9 million cells in this file, 2,008,267 (50.9%) are user-missing codes. That's normal for the GSS: most questions go to only part of the sample, and everyone else is coded "inapplicable". It also means one careless export ruins everything:
| Variable | Mean, codes excluded | Mean, codes left in as numbers |
|---|---|---|
| Hours worked last week | 39.3 | −23.1 |
| Hours per day watching TV | 3.4 | −32.8 |
| Number of children | 1.7 | 0.7 |
| Age | 49.0 | 44.3 |
You can watch this happen. Open Column Definition… ▸ Missing on hours worked and switch it to "No missing values". The readout warns that this would put back 1,785 of 3,986 values (44.8%). Apply it and the mean drops to −23. Undo. (These means are unweighted. The weights go on in the next step.)
Step 3: Apply the survey weight
The 2024 GSS adds an oversample of 677 Black, Hispanic and Asian American / Pacific Islander respondents to its 3,309-person cross-section, and NORC supplies weights to restore population proportions. Open Data ▸ Weight Cases…, set Weight cases by: to wtssnrps_as and Weight type: to Sampling.
Choose the weight carefully. The core cross-section weights (wtssps, wtssnrps) are coded "iap" for every oversample respondent, and the sheet's footnote says it plainly: rows with a missing, zero or negative weight are excluded. Weighting by them would drop the 677. wtssnrps_as is positive on all 3,986 rows and is NORC's weight for analyzing the two samples together.
| General happiness (Frequencies) | Unweighted | Weighted |
|---|---|---|
| Very happy | 20.2% | 23.0% |
| Pretty happy | 58.2% | 56.1% |
| Not too happy | 21.6% | 20.9% |
Step 4: Feelings about money vs happiness
Start with the most direct money question the survey asks: how satisfied are you with your financial situation? Analyze ▸ Contingency Table, rows = financial satisfaction, columns = General happiness, Percentages = % of row:
| Financial satisfaction | Very happy | Pretty happy | Not too happy |
|---|---|---|---|
| Pretty well satisfied | 38.6% | 51.9% | 9.5% |
| More or less satisfied | 21.4% | 62.3% | 16.3% |
| Not satisfied at all | 13.9% | 50.2% | 35.9% |
People satisfied with their finances are nearly three times as likely to be very happy as people who aren't. A mosaic plot (Charts ▸ Counts & Composition ▸ Mosaic) shows both things at once. Column widths are the weighted group sizes, and the "very happy" band shrinks from left to right.
Notice the question we asked, though. It was "how do you feel about your money", not "how much do you earn". That difference matters in Step 7.
Step 5: What else predicts happiness?
Keep the same table and swap the row variable. Weighted Cramér's V against happiness:
| Predictor | Cramér's V | Detail |
|---|---|---|
| Financial satisfaction | 0.215 | 39% vs 14% very happy |
| Health | 0.208 | poor health: 50% not too happy; excellent: 14% |
| Marital status | 0.192 | married: 32% very happy, the highest group; separated: 10% |
| Subjective class | 0.158 | |
| Opinion of family income | 0.146 | |
| Highest degree | 0.105 | |
| Sex | 0.019 (p = 0.48) | men and women are equally happy |
The top three are how you feel about your money, your health, and who you go home to. Education barely registers, and sex doesn't register at all.
Step 6: Actual income, by happiness (Welch ANOVA)
The survey also records family income in constant dollars. Run a one-way ANOVA (Analyze ▸ ANOVA ▸ One-Way ANOVA) with response = income and sub-groups = happiness. Income is skewed and the group spreads differ, so turn on Welch's ANOVA and Games–Howell in Sections:
| Happiness | Weighted mean family income |
|---|---|
| Very happy | $62,410 |
| Pretty happy | $56,141 |
| Not too happy | $42,107 |
- Welch's test is decisive. Unhappier people do earn less, by about $20,000.
- Games–Howell lists the pairs in code order. Very vs pretty happy differ by about $6,300, and pretty vs not too happy by $14,000. Most of the money gap is at the bottom.
- η² ≈ 0.024. Happiness group accounts for under 3% of the variation in income.
Is income doing the work, or standing in for things that come with it?
Step 7: Logistic regression: does income still matter?
Two formula columns (Data ▸ Add Column…): very_happy = [happy] == 1 (1 = very happy, 0 = everyone else; formulas read the codes, and missing codes stay missing) and income_10k = [coninc] / 10000.
Income alone (Analyze ▸ Logistic Regression, Response = very_happy, Event = 1): odds ratio 1.05 per $10,000 (95% CI 1.02–1.08), p ≈ 0.0004, McFadden R² = 0.008. The effect is significant but weak.
Add financial satisfaction, health and marital status as categorical predictors, plus age. Stratum dummy-codes the labelled codes, names each level by its label, takes the first level as the reference, and drops incomplete rows listwise (n = 3,450). McFadden R² rises to 0.106:
| Term (vs reference) | Odds ratio | 95% CI |
|---|---|---|
| Not satisfied at all (vs pretty well satisfied) | 0.37 | 0.25–0.55 |
| Fair health (vs excellent) | 0.20 | 0.13–0.30 |
| Poor health (vs excellent) | 0.27 | 0.11–0.67 |
| Never married (vs married) | 0.37 | 0.25–0.55 |
| Income, per $10,000 | 0.97 | 0.94–1.00, p = 0.06 |
| Age, per year | 1.00 | p = 0.90 |
The robust test puts income at p = 0.06. The Effect Tests section's likelihood-ratio χ² reads lower (p = 0.003), but that test treats sampling weights as though they were counts. With survey weights, quote the robust test. Either way, the answer is the same: once you know how people feel about their money, their health and whether they're married, more income does not raise the odds of being very happy. If anything, it points the other way. With financial satisfaction as the only control, income's odds ratio is already 1.01 (p = 0.33).
What we actually did
We opened an SPSS file without SPSS: 989 variables with labels, value labels, and a missing-value rule covering half the file, applied in every statistic. We weighted it with the weight built for the oversample. Then we ran a contingency table with χ² and Cramér's V, a mosaic, a Welch ANOVA with Games–Howell comparisons, and a logistic regression with odds ratios, labelled dummy codes and robust standard errors. If you only need the two-minute version of the import, see Open an SPSS .sav File.
The answer: in 2024, people satisfied with their finances were nearly three times as likely to be very happy. Income alone barely moves the odds, though. Once health, marriage and that feeling about money are in the model, more income buys no extra odds of being very happy. Money matters at the bottom of the scale. Above that, what counts is how you feel about it.
.sav, and see what's in it.
Data: General Social Survey 2024 (Davern, Bautista, Freese, Herd & Morgan). The GSS is a project of the independent research organization NORC at the University of Chicago, with principal funding from the National Science Foundation. Analyses and interpretation are ours. Results weighted by wtssnrps_as (sampling weights, robust standard errors; not a full strata/cluster design).