Beginner12 columnsUp to 10,000 rows Fictional data

Customer Satisfaction Survey dataset

Survey answers on a five-point scale, an NPS score from 0 to 10 and short written comments.

Made the moment you click and sent straight to you. Nothing is saved on our server.

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

ColumnTypeDescription
response_idID (text)Response number.
submitted_onDateDate the survey was submitted.
age_groupCategory18-24, 25-34, 35-44, 45-54 or 55+.
genderCategoryMale or Female.
cityCategoryCity.
product_qualityCategoryFive-point answer.
delivery_experienceCategoryFive-point answer.
customer_supportCategoryFive-point answer.
value_for_moneyCategoryFive-point answer.
ease_of_useCategoryFive-point answer.
nps_scoreWhole number0 to 10: how likely to recommend.
commentTextOptional 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_idsubmitted_onage_groupgendercityproduct_qualitydelivery_experiencecustomer_supportvalue_for_moneyease_of_usenps_scorecomment
R0000012024-06-1435-44FemalePuneNeutralSatisfiedSatisfiedSatisfiedSatisfied6
R0000022024-06-2618-24MaleUdaipurVery satisfiedVery dissatisfiedSatisfiedSatisfiedSatisfied10Easy to use app, checkout took a minute.
R0000032024-09-1045-54FemaleBhopalVery satisfiedSatisfiedVery satisfiedSatisfiedVery satisfied10Packaging was neat and nothing was damaged.
R0000042025-04-0255+FemaleChandigarhDissatisfiedNeutralDissatisfiedNeutralDissatisfied7
R0000052025-04-0955+FemaleJaipurNeutralSatisfiedDissatisfiedSatisfiedSatisfied6
R0000062025-05-1218-24FemaleNashikDissatisfiedVery dissatisfiedVery dissatisfiedDissatisfiedDissatisfied5Order arrived late and nobody updated me.
R0000072025-06-1325-34FemaleHyderabadNeutralNeutralDissatisfiedNeutralDissatisfied5Product quality was not as described.
R0000082025-12-1925-34MalePuneDissatisfiedVery satisfiedVery satisfiedSatisfiedSatisfied9Easy to use app, checkout took a minute.

Practice exercises

  1. Calculate NPS: % promoters (9–10) minus % detractors (0–6). Then break it down by age group.
  2. Map the five-point answers to 1–5 and find the average for each question. Which area is weakest?
  3. Make a stacked bar chart of answers for each question (a 'Likert chart').
  4. Correlate each question with the NPS score. Which one matters most for recommendations?
  5. 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

See all 14 datasets →