Cross-Tabulation Survey Analysis: How to Read a Crosstab Without Fooling Yourself

How to read a survey crosstab: banners and stubs, column vs row percentages, a worked chi-square test, column z-tests and minimum cell sizes.

In shortA cross-tabulation splits one survey question by another, such as purchase intent by age. Groups sit in columns (the banner) and answers in rows (the stub). Compare groups with column percentages, test for any difference with chi-square, then find which pairs differ with column z-tests. Check cell counts first.

Fig.A research report under a magnifier
Contents

A Crosstab Answers One Question: Do Groups Answer Differently?

A single survey result such as "37% would buy" hides the groups behind it. A cross-tabulation breaks that 37% into age bands, cities or users and non-users, so you can see who is driving the number.

Most errors in reading crosstabs come from three places: reading the wrong percentage, treating every gap as real, and trusting cells with too few people. This guide builds one crosstab from scratch and tests it. For a wider map of which test fits which job, see our statistical significance testing guide.

What Are the Banner and the Stub in a Crosstab?

Tabulation vocabulary is consistent across most research firms. Greenbook's "Anatomy of a Crosstab" says the banner (or header) "consists of the subgroups for data analysis" and that the stub "contains the table rows", usually the answer options plus summary rows, nets and statistics (Greenbook).

PartWhat it holdsExample
Banner (columns)The groups you compareAge 18-24, 25-34, 35-44
Stub (rows)The answers to the questionYes, not sure, no
NetAnswer options combined into one rowTop-2 and bottom-2 box on a rating scale
BaseThe number of people each column percentage is built on120 respondents aged 18-24

Keep the banner short. Every extra column adds comparisons, and every comparison adds a chance of a false alarm.

Column Percentages or Row Percentages: Which Should You Read?

The two differ only in the denominator. A column percentage divides each cell by its column total. A row percentage divides each cell by its row total. Sawtooth Software defines both this way in its crosstab help (Sawtooth).

Use column percentages when the banner holds the groups you want to compare: "Of people aged 18-24, how many said yes?" Use row percentages when you want to profile an answer: "Of those who said yes, how many are aged 18-24?" The University of Oregon's banner-table guide says statements "should be phrased in terms of the denominator", for example "of all 280 people who said..." (University of Oregon). Its tables put the answer categories in the columns and the groups in the rows, the reverse of the layout here, so what matters is the denominator, not the direction.

Check what your tool shows by default. Sawtooth shows counts and column percentages first, and other tools may default to row percentages, so the same table can be read two ways without anyone noticing.

Multi-select questions need extra care. One person can appear in several rows, so rows do not add to the column total, and a chi-square test (below) is not valid on such a table without adjustment.

Worked Example: Purchase Intent by Age Group (Illustrative)

The counts below are invented to show the arithmetic. They are not survey results. Imagine 350 category buyers asked: "Would you buy this new pack?"

Answer (stub)Age 18-24Age 25-34Age 35-44Row total
Yes544620120
Not sure364034110
No303456120
Column total (base)120120110350

Column percentages for "Yes" are 45.0% (18-24), 38.3% (25-34) and 18.2% (35-44). The row percentage for "Yes" in the 18-24 column is also 45.0% here, but only because the row and column totals happen to match at 120. In the 35-44 column the row percentage is 16.7%, so the two readings answer different questions.

The younger groups look more positive. Is that real or noise?

Is There Any Difference at All? The Chi-Square Test of Independence

The chi-square test of independence asks whether the answer and the group are unrelated. For each cell, the expected count under independence is row total × column total ÷ grand total. The statistic is the sum of (observed − expected)² ÷ expected over all cells, with (rows − 1) × (columns − 1) degrees of freedom (Wikipedia, chi-squared test).

For the "Yes" row in our example, the expected counts are 120 × 120 ÷ 350 = 41.14, 41.14 and 37.71. Summing all nine cells gives a chi-square of 26.26 with (3 − 1) × (3 − 1) = 4 degrees of freedom. The upper-tail 5% critical value for 4 degrees of freedom is 9.488 (NIST critical values table). Because 26.26 is well above 9.488, the data are inconsistent with age and answer being unrelated.

That is all the test says. It does not say which age groups differ, nor by how much, and a large sample can make a trivial gap significant.

Which Columns Differ? Column Proportion Z-Tests

To compare one answer between two columns, use a two-proportion z-test. Pool the two groups: p = (x₁ + x₂) ÷ (n₁ + n₂). The standard error is √[p(1 − p)(1/n₁ + 1/n₂)] and z is the difference in proportions divided by it (Wikipedia, two-proportion z-test). Tabulation software prints the result as letters under the cells.

Comparison ("Yes")Differencez
18-24 vs 35-4445.0% vs 18.2% = 26.8 points4.35
25-34 vs 35-4438.3% vs 18.2% = 20.1 points3.37
18-24 vs 25-3445.0% vs 38.3% = 6.7 points1.05

At the usual 5% level a two-sided test needs |z| above 1.96. The first two pass and the third does not. We ran three comparisons, though, and the chance of at least one false positive across m independent tests is 1 − (1 − α)^m, which is 1 − 0.95³ = 14.3% here (Wikipedia, multiple comparisons). The Bonferroni correction tests each comparison at α ÷ m, so 0.05 ÷ 3 = 0.0167, which needs |z| above about 2.39. Our first two still pass.

In a big table, treat isolated "significant" letters as leads to check, not findings.

How Many Respondents Does a Cell Need?

No single number is right for every table, and we have not found an authoritative universal rule. The published guidance is about expected and observed counts:

  • Chi-square: the test can mislead when expected frequencies are very small, and a minimum expected count of at least 5 is often recommended (Wikipedia, chi-squared test, above). Our smallest expected count was 34.57.
  • Two-proportion z-test: Wikipedia states the conditions as n₁p̂₁, n₁(1 − p̂₁), n₂p̂₂ and n₂(1 − p̂₂) all above 10, and recommends exact tests such as Fisher's when counts fall below 5.
  • Percentages on a small base: a percentage built on a handful of people moves a lot with one answer. Decide before analysis the smallest base you will report, and flag anything below it.

Plan for this at design stage: quotas must be large enough for the cell, not just the total. Our sample size guide shows how margins shrink with base size.

A Five-Step Routine for Reading Any Crosstab

  1. Find the base under each column and note any that are small.
  2. Confirm whether the percentages are column or row, and say the base aloud in each sentence.
  3. Run the overall test (chi-square) before hunting for pairs.
  4. Test only the comparisons you chose before looking, and correct for how many you ran.
  5. Report the size of the gap, not only the letters. A significant 3-point gap may not change a decision.

Next Step

If you want crosstabs without building them by hand: Poseidon, the Hercules analytics engine, produces cross-tabs, significance tests and coded open-ended answers from the cleaned responses (panel methodology). Whichever tool you use, apply the checks above to what it prints. The Free plan includes 30 responses, enough to test a questionnaire and see the table layout before you plan banner columns.

Start free with 30 responses

Frequently asked questions

What is a cross-tabulation in a survey?

A cross-tabulation is a table that splits one question's answers by another variable, such as age group or city. Columns hold the groups (the banner) and rows hold the answer options (the stub).

What is the difference between column and row percentages?

Column percentages divide each cell by its column total, so they compare groups on an answer. Row percentages divide by the row total, so they show who gave an answer. Always state the base.

When should I use a chi-square test on a crosstab?

Use it to ask whether the answer and the group are related at all, on single-answer questions with adequate expected counts. It does not show which groups differ, so follow it with column comparisons.

What is the minimum cell size for a crosstab?

There is no universal figure. For chi-square, an expected count of at least 5 per cell is often recommended. For z-tests, counts above 10 are one stated condition. Set a reporting minimum for bases before you analyse.

Why do I get significant results that disappear when I repeat the study?

Running many comparisons raises the chance of a false positive. With 3 comparisons at 5% it is about 14%, and it climbs quickly with larger tables. Pre-select comparisons and correct for the number run.

Can I run a chi-square test on a multi-select question?

Not directly. One respondent appears in several rows, which breaks the independence the test assumes. Test each option separately as a yes or no, with a correction for the number of options.

Ready to get real consumer insights?

2 crore Indian respondents. Free to start.