Customer Satisfaction Survey dataset
Survey answers on a five-point scale, an NPS score from 0 to 10 and short written comments.
About this dataset
Responses to a fictional online store's satisfaction survey: age group, gender and city, five questions answered from 'Very dissatisfied' to 'Very satisfied', the 0–10 'how likely are you to recommend us' score used for Net Promoter Score (NPS), and an optional comment.
Survey data teaches skills you need everywhere: turning text answers into numbers, handling blanks, calculating NPS correctly, and reading comments to find the reason behind a score.
Good for practising: Survey analysis, NPS, Encoding categories, Text basics.
What's built into the data
The rows are random, but they follow rules, so there is something real to find. These are the patterns to look for:
- Someone who is happy in one area is usually happy in the others, so the five questions are correlated.
- The NPS score follows the same underlying satisfaction as the five questions.
- About 40% of people leave no comment.
- Comments match the score band: praise from promoters (9–10), mixed remarks from passives (7–8), complaints from detractors (0–6).
Columns
| Column | Type | Description |
|---|---|---|
response_id | ID (text) | Response number. |
submitted_on | Date | Date the survey was submitted. |
age_group | Category | 18-24, 25-34, 35-44, 45-54 or 55+. |
gender | Category | Male or Female. |
city | Category | City. |
product_quality | Category | Five-point answer. |
delivery_experience | Category | Five-point answer. |
customer_support | Category | Five-point answer. |
value_for_money | Category | Five-point answer. |
ease_of_use | Category | Five-point answer. |
nps_score | Whole number | 0 to 10: how likely to recommend. |
comment | Text | Optional free-text comment; often empty. |
Preview: the first 8 rows
A sample with seed 2026. Your download will have different values but the same columns and patterns.
| response_id | submitted_on | age_group | gender | city | product_quality | delivery_experience | customer_support | value_for_money | ease_of_use | nps_score | comment |
|---|---|---|---|---|---|---|---|---|---|---|---|
| R000001 | 2024-06-14 | 35-44 | Female | Pune | Neutral | Satisfied | Satisfied | Satisfied | Satisfied | 6 | |
| R000002 | 2024-06-26 | 18-24 | Male | Udaipur | Very satisfied | Very dissatisfied | Satisfied | Satisfied | Satisfied | 10 | Easy to use app, checkout took a minute. |
| R000003 | 2024-09-10 | 45-54 | Female | Bhopal | Very satisfied | Satisfied | Very satisfied | Satisfied | Very satisfied | 10 | Packaging was neat and nothing was damaged. |
| R000004 | 2025-04-02 | 55+ | Female | Chandigarh | Dissatisfied | Neutral | Dissatisfied | Neutral | Dissatisfied | 7 | |
| R000005 | 2025-04-09 | 55+ | Female | Jaipur | Neutral | Satisfied | Dissatisfied | Satisfied | Satisfied | 6 | |
| R000006 | 2025-05-12 | 18-24 | Female | Nashik | Dissatisfied | Very dissatisfied | Very dissatisfied | Dissatisfied | Dissatisfied | 5 | Order arrived late and nobody updated me. |
| R000007 | 2025-06-13 | 25-34 | Female | Hyderabad | Neutral | Neutral | Dissatisfied | Neutral | Dissatisfied | 5 | Product quality was not as described. |
| R000008 | 2025-12-19 | 25-34 | Male | Pune | Dissatisfied | Very satisfied | Very satisfied | Satisfied | Satisfied | 9 | Easy to use app, checkout took a minute. |
Practice exercises
- Calculate NPS: % promoters (9–10) minus % detractors (0–6). Then break it down by age group.
- Map the five-point answers to 1–5 and find the average for each question. Which area is weakest?
- Make a stacked bar chart of answers for each question (a 'Likert chart').
- Correlate each question with the NPS score. Which one matters most for recommendations?
- Group the comments into themes (delivery, price, support, app) using keywords, then count complaints by theme.
Stuck on one? Each exercise uses ideas from the lessons below, and trying it with the messy option on turns it into a cleaning exercise as well.
Load it straight into Python
You don't have to download first. Pandas can read the link directly, in Jupyter, Google Colab or a script. Keep the seed so you get the same data every time you run the notebook:
import pandas as pd
url = "https://beeprotonai.info/resources/datasets/customer-survey/download/?rows=1000&seed=42"
df = pd.read_csv(url, parse_dates=["submitted_on"])
df.head()
For SQL practice, download the SQL format and run it against an empty database, for example sqlite3 practice.db < customer-survey-1000-rows-seed42.sql or mysql -u root -p practice < customer-survey-1000-rows-seed42.sql (use your file's name). It creates a table called customer_survey and fills it.
About the data
Everything in this file is invented. Names are random pairings of common first names and surnames, email addresses use example.com (reserved for examples, so it can never reach anyone), and phone numbers start with +91 00, which no real Indian mobile number does. Any resemblance to a real person or business is coincidence. Dates run from 1 April 2024 to 31 March 2026 unless a column says otherwise. Use it freely for learning, teaching and projects, including commercial ones, with no attribution required (CC0).
Lessons that go with it
More datasets
Two years of orders from a fictional chain of Indian sweet shops, with Diwali …
Employee & Attrition RecordsAn HR file of employees with salary, satisfaction, overtime and whether they left: built …
Student Exam ResultsMarks in five subjects with attendance and study hours, plus totals, percentage, result and …
Customer List (CRM)Customer records with contact details, segment, orders and spend: ideal for cleaning, deduplication and …
Stock Register (Inventory)Monthly stock register for five warehouses: opening, received, issued, closing, reorder level and value.
Website Traffic (Analytics)Daily sessions, users, bounce rate and conversions by page, traffic source and device.