Sample dataset · CC0
Listings where the price is not random.
Thirteen columns of property listing across twelve cities. Asking price is built from the city's own price per square foot, the size of the place and how old it is, so a regression against this file finds a real relationship rather than noise.
13 columns · 100 or 1,000 rows as a file · up to 1,000,000 rows generated here · CSV, JSON, JSONL, Excel, Parquet
Take a file
The 1,000-row file is the one to use for anything statistical. A hundred rows across twelve cities is too few per city to say much.
| Format | Small | Standard |
|---|---|---|
| CSV | 100 rows (8.0 KB) | 1,000 rows (79.6 KB) |
| JSON | 100 rows (24.3 KB) | 1,000 rows (243.3 KB) |
| JSONL | 100 rows (24.0 KB) | 1,000 rows (240.4 KB) |
| Excel | 100 rows (23.8 KB) | 1,000 rows (158.4 KB) |
| Parquet | 100 rows (5.9 KB) | 1,000 rows (30.3 KB) |
A bigger sample
Larger sizes keep the same twelve cities and the same price levels, so the relationship holds while the sample size grows. A hundred thousand listings is a good size for demonstrating that a coefficient stops moving.
The first eight rows
The first eight rows of the 1,000-row file. Every condo has an empty lot_sqft, which is correct rather than missing.
| listing_id | listed_date | city | state | property_type | bedrooms | bathrooms | sqft | lot_sqft | year_built | list_price | price_per_sqft | status |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| LST-000001 | 2025-01-02 | Boston | MA | Duplex | 4 | 3.5 | 1577 | 4340 | 1983 | 1093000 | 693.09 | sold |
| LST-000002 | 2025-01-03 | Denver | CO | House | 4 | 3.5 | 1925 | 5177 | 1920 | 550000 | 285.71 | active |
| LST-000003 | 2025-01-03 | Columbus | OH | Townhouse | 2 | 2.0 | 1075 | 2939 | 1962 | 159000 | 147.91 | active |
| LST-000004 | 2025-01-04 | Portland | OR | House | 5 | 4.5 | 1896 | 5126 | 1997 | 680000 | 358.65 | active |
| LST-000005 | 2025-01-05 | Columbus | OH | Duplex | 1 | 1.5 | 1052 | 4092 | 1924 | 147000 | 139.73 | active |
| LST-000006 | 2025-01-06 | Miami | FL | House | 5 | 4.0 | 2772 | 12427 | 2025 | 1142000 | 411.98 | sold |
| LST-000007 | 2025-01-06 | Chicago | IL | House | 6 | 4.5 | 3284 | 5443 | 1965 | 745000 | 226.86 | active |
| LST-000008 | 2025-01-07 | Boston | MA | House | 6 | 4.5 | 3331 | 14587 | 2008 | 1978000 | 593.82 | pending |
Thirteen columns, and what each one holds
| Column | Type | What it holds | Example |
|---|---|---|---|
| listing_id | text | LST-000001 upward. | LST-000001 |
| listed_date | date | Date the listing went live, ascending through the file. | 2025-01-02 |
| city | text | One of twelve cities, each with its own price level. | Boston |
| state | text | Two letter state code for the city. | MA |
| property_type | text | House, Condo, Townhouse or Duplex. | Duplex |
| bedrooms | integer | 1 to 6. | 4 |
| bathrooms | decimal | 1 to 4.5 in half steps, so the column is a decimal and not an integer. | 3.5 |
| sqft | integer | Interior area. Tracks bedroom count. | 1577 |
| lot_sqft | integer | Lot size. Blank for condos, which is a null that means something. | 4340 |
| year_built | integer | 1918 to 2025. | 1983 |
| list_price | integer | Asking price in whole dollars, driven by city, size, age and type. | 1093000 |
| price_per_sqft | decimal | list_price divided by sqft, two decimals. Consistent on every row. | 693.09 |
| status | text | active, pending, sold or withdrawn. | sold |
What it models
A listings table of the kind a portal exports: where the property is, what sort it is, how big, how old, what it is being asked for and what stage the listing is at. There are no addresses, because a sample dataset with street addresses in it is a bad idea even when the addresses are invented, and because the city is the only geography the analysis needs.
Twelve cities carry their own price per square foot, from Columbus at the bottom to San Diego at the top. That spread is what makes the file useful for anything comparative: a national average price is a meaningless number here, exactly as it is in reality, and getting somebody to notice that is half the point of a geography column.
How the price is built
Asking price is square footage times the city's price per square foot, times an age factor that discounts older buildings by up to 22 percent, times a spread between 0.82 and 1.24, rounded to the nearest thousand because that is how asking prices are quoted. Square footage itself follows bedroom count, so the whole chain hangs together.
The result is a dataset where a linear regression of price on square footage recovers a real coefficient, adding city as a factor improves the fit substantially, and adding year built improves it a little more. That is a complete teaching arc in one file, and it is only possible because the columns were generated from a model rather than independently.
price_per_sqft is the division of the two columns, to two decimals, so it is exact and can be used to check a calculated column. Group by city and average it and you will read back something close to each city's underlying rate, blurred by the age factor and the spread.
The blank that means something
lot_sqft is empty for every condo and populated for every house, townhouse and duplex, because a condo does not have a lot. It is the cleanest structural null in the collection: the value is not missing, it does not exist.
That distinction matters when somebody imputes. Filling the blank lot sizes with the column mean is a defensible move on a missing-data column and an obviously wrong one here, and having a file where the difference is unarguable makes the conversation short. Any model that treats lot size as a predictor has to handle the property type first.
What people use it for
- Regression practice, on a file where price genuinely depends on size, city and age.
- Scatter plots with a trend line and a visible per-city offset.
- Teaching the difference between a missing value and a value that cannot exist.
- Comparing medians across twelve markets with very different price levels.
- Checking a calculated column against price_per_sqft, which is already exact.
Open it somewhere useful
This is the dataset for a scatter plot and a trend line, so the chart builder in the full app is where it belongs.
License, and the people in it
This dataset is dedicated to the public domain under CC0 1.0. Put it in a course, a paid product, a test suite, a bug report, a screenshot, a conference talk or a book. There is nothing to ask for, nothing to sign and no attribution required. A link back is welcome and is not a condition.
No real property, address, agent or sale appears in this file. Listings carry a city and a state but no street address, and every price is generated from a model rather than taken from a listing service.
Questions people ask about this file
Why is lot_sqft blank on some rows?
Because those rows are condos, and a condo has no lot. It is a structural null rather than a missing measurement, which is the distinction the column exists to make. Imputing the column mean into those cells would be defensible on missing data and is plainly wrong here, and having an unarguable example makes that a short conversation.
Will a regression actually find something?
Yes. Price is generated as square footage times a city rate times an age factor times a spread, so a regression of price on square footage recovers a real coefficient, adding city improves the fit substantially, and adding year built improves it a little more. That is a full teaching sequence in one file, which random price data cannot support.
Are these real listings?
None of them. There are no street addresses, no agents and no transaction records, only a city, a state and generated attributes. The twelve cities are real places with roughly plausible relative price levels, but the absolute numbers are model output and should not be quoted as market data.
Is price_per_sqft consistent with the other columns?
Exactly. It is list_price divided by sqft, to two decimal places, computed from the values on the same row. Add the same calculated column in your own tool and compare: any difference is a rounding policy difference, which is a useful thing to discover about a tool before you rely on it.
More sample data
All twenty datasets · Messy files and every other format · Build your own schema