Once a survey is in, the business rarely asks what everyone said. It asks how younger customers differ from older ones, or whether one region wants something different from another. Cross tabulation answers those questions: it lays one survey question across another and shows whether the answers change from group to group. This guide walks through cross tabulation analysis from start to finish, with a full worked example. For the basics of the table itself, start with our guide to what a crosstab is and how one-way and two-way tables differ.
Key takeaways
- Cross tabulation counts how often each combination of categories occurs in two (or more) categorical variables and shows the result as a table.
- Put the variable you think explains the difference in the columns and read column percentages down each column.
- The chi-square test of independence tells you whether the pattern is larger than chance; Cramer’s V tells you how strong it is.
- Adding a third variable can weaken, strengthen or even reverse a relationship, so check the obvious control variables before you report.
- A cross tabulation shows association, not causation.
What is cross tabulation?
Cross tabulation is the process of counting respondents in every combination of categories for two variables. The output is a contingency table: categories of one variable down the side, categories of the other across the top, and a count in each cell.
Crosstab, cross tab, cross-tabulation, crosstabulation and contingency table all name the same thing. “Contingency table” is the statistics term and “crosstab” is what researchers say day to day. “Cross tabulation analysis” usually means building the table plus testing and interpreting it.
When should you use cross tabulation analysis?
Use cross tabulation when both variables are categorical, or can be sensibly banded. In survey work that means:
- Comparing groups: purchase intent by age band, satisfaction by region.
- Profiling: the age mix of people who prefer chat.
- Checking a sample: whether the achieved sample matches quotas by region and gender.
It is the wrong tool when both variables are continuous, such as spend and number of visits, because banding throws information away. Use correlation analysis instead.
How do you do cross tabulation, step by step?
Here is how to do cross tabulation, from the business question to a finding you can defend.
- State the question. “Does preferred contact channel differ by age?” is testable. “Look at age” is not.
- Place the variables. Put the independent variable (here age) in the columns and the dependent variable, the outcome (here channel), in the rows.
- Build the count table. Count respondents in each cell and add row and column totals.
- Add column percentages. Divide each cell by its column total so groups of different sizes can be compared.
- Check the bases. A percentage on 30 people moves far more than one on 300.
- Test for independence. Run a chi-square test to see whether the pattern could plausibly be chance.
- Interpret. Say which groups differ, in which direction and by how much.
- Add a layer. Split the table by a third variable that could explain the pattern.
Cross tabulation example: does preferred contact channel differ by age?
The numbers in this example are illustrative. A company surveyed 500 customers and asked which channel they prefer for customer service: email, phone or chat.
Step 1: Counts and column percentages
| Preferred channel | 18-34 | 35-54 | 55+ | Total |
|---|---|---|---|---|
| 60 (30%) | 70 (40%) | 50 (40%) | 180 (36.0%) | |
| Phone | 40 (20%) | 49 (28%) | 50 (40%) | 139 (27.8%) |
| Chat | 100 (50%) | 56 (32%) | 25 (20%) | 181 (36.2%) |
| Base | 200 | 175 | 125 | 500 |
Reading down the columns, chat preference falls with age (50%, 32%, 20%) and phone preference rises (20%, 28%, 40%). Every base is above 100, so the percentages are reasonably stable.
Step 2: Expected counts
If age and channel were unrelated, each age group would split the same way as the total. The expected count for a cell is:
Expected = (row total × column total) ÷ grand total
- Email, 18-34: (180 × 200) ÷ 500 = 72. The observed count is 60, so 12 fewer than expected.
- Chat, 18-34: (181 × 200) ÷ 500 = 72.4. The observed count is 100, so 27.6 more than expected.
Step 3: The chi-square statistic
Each cell contributes (observed − expected)² ÷ expected:
- Email, 18-34: (60 − 72)² ÷ 72 = 144 ÷ 72 = 2.00
- Chat, 18-34: (100 − 72.4)² ÷ 72.4 = 761.76 ÷ 72.4 = 10.52
Doing the same for all nine cells gives:
| Contribution | 18-34 | 35-54 | 55+ |
|---|---|---|---|
| 2.00 | 0.78 | 0.56 | |
| Phone | 4.38 | 0.00 | 6.69 |
| Chat | 10.52 | 0.85 | 9.06 |
The chi-square statistic is the sum: 34.84. Degrees of freedom are (rows − 1) × (columns − 1) = (3 − 1) × (3 − 1) = 4.
Step 4: Read the p-value
With 4 degrees of freedom, the chi-square value needed for significance at the 5% level is 9.49. Our 34.84 is far above it, and the p-value is below 0.001: if age and channel were unrelated, a pattern this strong would almost never appear by chance. The contributions show where the difference sits. Customers aged 18-34 over-index on chat; those aged 55+ over-index on phone and under-index on chat. For what a p-value does and does not mean, see what statistical significance is.
Step 5: Measure the strength with Cramer’s V
A large sample makes small differences significant, so measure strength separately. Cramer’s V is:
V = √(χ² ÷ (n × (k − 1))), where k is the smaller of the number of rows and columns.
V = √(34.84 ÷ (500 × 2)) = √0.0348 = 0.19
V runs from 0 (no association) to 1 (perfect association). At 0.19, age shapes channel preference, but modestly; it is far from the whole story.
What happens when you add a third variable?
Layering means repeating the cross tabulation within each category of a third, control variable. In the example, you might split by new versus existing customers, since new customers may skew young and also prefer chat. If the age pattern holds in both groups, the finding is sturdier. If it disappears, tenure was doing the work.
Sometimes the relationship reverses, which is Simpson’s paradox. In this illustrative support example, layered by issue type:
| Issue type | Chat resolved | Phone resolved |
|---|---|---|
| Simple | 180 of 200 (90%) | 47 of 50 (94%) |
| Complex | 15 of 50 (30%) | 80 of 200 (40%) |
| All issues | 195 of 250 (78%) | 127 of 250 (50.8%) |
Overall, chat resolves far more issues, yet phone does better within each issue type. Chat handles mostly simple issues and phone mostly complex ones. Without the layer, you would draw the wrong conclusion.
Which cross tabulation table format should you show?
The same counts can be percentaged four ways. Using the chat, 18-34 cell from the example:
| Format | Cell divided by | Answers | Example value |
|---|---|---|---|
| Counts | Nothing | How many people? | 100 |
| Column % | Column total | Among 18-34s, what share prefer chat? | 100 ÷ 200 = 50% |
| Row % | Row total | Among chat fans, what share are 18-34? | 100 ÷ 181 = 55.2% |
| Total % | Grand total | What share of everyone are 18-34 chat fans? | 100 ÷ 500 = 20% |
Column percentages are the default when groups sit in the columns; row percentages suit profiling. Our guide on how to read a crosstab covers each format in detail.
What are the limits of cross tabulation analysis?
- Association is not causation. The table shows that age and channel move together, not that age causes the preference.
- Small cells are unstable. When expected counts drop below about 5, the chi-square test becomes unreliable.
- Too many categories dilute the table. A 10 × 8 table spreads 500 people across 80 cells. Merge similar categories.
- One test covers the whole table. A significant chi-square says something differs, not which groups. That needs significance testing on individual crosstab cells.
What are the common mistakes?
- Percentaging the wrong way. Age in the columns read with row percentages answers a different question from the one you asked.
- Hiding the bases. A 20-point gap on a column of 25 people can be noise. Show the base under each column.
- Reporting significance without strength. With thousands of respondents, a 2-point difference can be significant and still not matter.
- Fishing. At the 5% level, about 1 in 20 tests of unrelated variables comes out significant by chance, so running dozens of tables and reporting the hits misleads.
- Skipping the control variable. If an obvious third variable could explain the pattern, layer it before you present.
What should you do next?
Write down the two or three group comparisons the business cares about and build those cross tabulations first, each with column percentages, bases and a significance test. Our guide to building survey crosstabs helps you plan the banner. To run the same tables across many questions or waves, see crosstabs and banner tables with weighting, significance testing and interactive report pages. For quick follow-ups, you can ask your own research in plain language and see the source behind each answer.