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.

Dataset: the General Social Survey 2024: 3,986 U.S. adults, 989 variables, as the SPSS .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.

Weighted mosaic plot of happiness by satisfaction with financial situation, GSS 2024
Happiness by satisfaction with financial situation (weighted): 39% "very happy" among the satisfied, 14% among the not satisfied at all.

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 happy reads "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.
The GSS 2024 .sav open in Stratum, with variable labels, value labels and dimmed missing codes
The .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:

VariableMean, codes excludedMean, codes left in as numbers
Hours worked last week39.3−23.1
Hours per day watching TV3.4−32.8
Number of children1.70.7
Age49.044.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.)

Column Definition sheet, Missing section, showing how many values the missing rule excludes
The missing-values readout answers "did I just delete my data?" before you click Apply.

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.

Weight Cases sheet with wtssnrps_as selected and Weight type set to Sampling
Data ▸ Weight Cases…: one dataset-level setting, honored by every report after it.
General happiness (Frequencies)UnweightedWeighted
Very happy20.2%23.0%
Pretty happy58.2%56.1%
Not too happy21.6%20.9%
What the weight changes. Every report now shows the banner Weighted by wtssnrps_as (sampling weights) and lists N (weighted) next to N (unweighted). χ² and ANOVA F are marked approximate, and regressions switch to robust (HC1) standard errors automatically. Stratum doesn't model strata and clusters, so for fully design-based standard errors you still need survey software.

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 satisfactionVery happyPretty happyNot too happy
Pretty well satisfied38.6%51.9%9.5%
More or less satisfied21.4%62.3%16.3%
Not satisfied at all13.9%50.2%35.9%
Weighted contingency table of financial satisfaction by happiness with row percentages, chi-square and Cramér's V
χ² ≈ 364 (approximate under sampling weights), df = 4, p ≈ 10⁻⁷⁷, Cramér's V = 0.22. The value labels name every row and column.

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.

Weighted mosaic plot of financial satisfaction by happiness
The whole table as one picture: widths are weighted group sizes, bands are shares of each happiness level.

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:

PredictorCramér's VDetail
Financial satisfaction0.21539% vs 14% very happy
Health0.208poor health: 50% not too happy; excellent: 14%
Marital status0.192married: 32% very happy, the highest group; separated: 10%
Subjective class0.158
Opinion of family income0.146
Highest degree0.105
Sex0.019 (p = 0.48)men and women are equally happy
Weighted contingency table of health by happiness
Health is a close second (V = 0.21): half of people in poor health are "not too 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:

HappinessWeighted 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.
Weighted one-way ANOVA of family income by happiness with Welch's ANOVA and Games-Howell sections
Welch's ANOVA and Games–Howell stack below the classical table, the SPSS "robust tests" layout.

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 ratio95% CI
Not satisfied at all (vs pretty well satisfied)0.370.25–0.55
Fair health (vs excellent)0.200.13–0.30
Poor health (vs excellent)0.270.11–0.67
Never married (vs married)0.370.25–0.55
Income, per $10,0000.970.94–1.00, p = 0.06
Age, per year1.00p = 0.90
Weighted logistic regression of very happy on income, age, financial satisfaction, health and marital status, with odds ratios and robust standard errors
Labelled codes become labelled dummy terms. Once the rest is in, income's odds ratio drops below one.

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.

The GSS is free from NORC, and so is the trial. Download Stratum for Mac or Windows, open your own .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).

case-study spss survey-data chi-square welch-anova logistic-regression survey-weights