Art 5: Data science for art market research

Lesson video · Data science for art market research (3:54)

View study sheet (PDF) View SQL cheat sheet (PDF)

Teaching this module? A facilitator guide adds a preparation checklist, timing cues, discussion guidance, slides, and a printable PDF.

This session teaches the quantitative methods behind rigorous art market research, applied to real auction transaction data rather than to a textbook example. Where Art 3 treated the art market as a business and built the artifacts a saleroom or a gallery director reads, this module steps back to the method itself: how a researcher builds a defensible comparable set, constructs an artist-level market index and reads it honestly, looks for demand signals that do not depend on price at all, and compares several artists at once without mistaking noise for a finding. The dataset records what buyers actually paid at more than 850 vendors with history back to 1949, and every method in this session is built entirely from documented fields, so students leave able to defend each step of an analysis, including its limits, to a skeptical reader. This is the art-market-specific application of the Data track (SQL, visualization, machine learning, and time series), not a repeat of those modules.

Target course(s) and level

Art market research methods, art business analytics, or a quantitative methods elective inside an art market studies or arts administration program. Suitable for graduate students who have already taken Art 1–3 (or are concurrently taking Art 3), and for analysts who need to defend a market analysis to a client or an editorial board. Some comfort reading numbers and tables is assumed; no heavy math is required and no statistics prerequisite is assumed beyond the idea of a median.

Learning objectives

By the end of this session, students will be able to:

  1. Define a comparable set for an art market question, explain why it is the atomic unit of the analysis, and state the filters (artist, date range, status) that constitute one.
  2. Construct an artist-level market index from the median of realized price by period, and explain why the index tracks method and the changing composition of what sold in each period, not pure appreciation of the artist's work.
  3. Apply hedonic thinking, price as a function of observable characteristics, honestly against a dataset with few documented characteristic fields, using a keyword drawn from item_title as a rough and imperfect proxy rather than a true attribute.
  4. Read demand signals that do not depend on price at all, specifically sell-through and the bought-in (unsold) rate, and explain what each adds beyond a price index.
  5. Run a cohort or comparative analysis across several artists at once with a minimum-lot threshold, and explain why the threshold exists and what it protects against.
  6. Practice point-in-time discipline, using sale_date rather than any ingestion or load date to define a period, and state the recency and secondary-market-only caveats that qualify every result in this session.
  7. (Extension) Retrieve one artist's sold-lot records programmatically via the production API and build the median-by-year index client-side in pandas, reproducing in code what the SQL editor computed server-side.

Prerequisites

Art 3 (the business of the art market) or equivalent familiarity with the fine art data table's documented fields and vocabulary of estimate, realized price, and sell-through. Art 1 is strongly recommended. Comfort with basic SQL aggregation (GROUP BY, COUNT, a percentile function) is helpful but not required, since the session is sandbox-first. The optional code extension assumes basic Python and pandas familiarity.

Materials and access needed

  • Sandbox access at sandbox.altfndata.com, self-registered with a work or school email, auto-approved.
  • Projector or screen share for the instructor demo.
  • The coverage browser tab, used before the demo to confirm how a chosen artist appears in the designer field and to check roughly how many sold lots that artist has, since the whole session depends on comparable sets large enough to be read with confidence.
  • The schema browser tab, or the GET /v1/tables documentation at docs.altfndata.com, used to confirm the exact documented field names before writing any filter.
  • For the optional extension only: an instructor class API key requested from info@altfndata.com, and the downloadable Python client (altfndata_client.py) or tutorials notebook (altfndata_tutorials.ipynb) at docs.altfndata.com.

Session outline (90 minutes)

  • 0 to 12 min: What makes art market research rigorous. Introduce the comparable set as the atomic unit of the analysis and preview the four methods the class will build: an index, a hedonic-style split, demand signals, and a cohort comparison.
  • 12 to 22 min: Sandbox and schema orientation. Confirm students can open the fine art data table and locate designer, item_title, sale_date, usd_price_decimal, sale_estimates_high_usd_price, status, and vendor in the schema browser, and confirm one artist's lot count is large enough to support an index.
  • 22 to 42 min: Guided demo, build an artist-level market index from median realized price by year, with lot count shown alongside every period.
  • 42 to 55 min: Guided demo, demand signals independent of price: sell-through and bought-in rate for the same artist, plus a rough hedonic split using an item_title keyword.
  • 55 to 70 min: Guided demo, cohort comparison across several artists at once with a minimum-lot threshold, read as a comparative table rather than one artist studied alone.
  • 70 to 82 min: Small-group exercise, students pick a different artist or a small cohort and reproduce the index and the demand signals, then flag which of their own recent periods should be treated with caution.
  • 82 to 90 min: Class discussion and wrap-up, groups report what their index and demand signals show, and the instructor assigns the homework.

In-class demo (sandbox-first, no code)

  1. Open sandbox.altfndata.com, sign in, and select the fine art data table from the SQL editor dropdown.
  2. Open the coverage browser tab and confirm how a well-known artist is written in the designer field, and confirm roughly how many sold lots that artist has. An artist with too few lots cannot support a reliable index or a comparative table.
  3. Return to the SQL editor and run the first guided query, the artist-level market index, which groups median realized price by year alongside the count of lots sold that year.
  4. Read the index aloud with the class and point to the count column first. Explain that the index moves for two reasons at once, the mix of works that happened to sell that year and any genuine shift in the artist's market, and that the count column is how a reader tells the two apart.
  5. State the recency caveat before anyone reads the newest one or two periods as a signal: those periods are still being ingested, lot counts there are understated, and a median computed on an incomplete period is not comparable to a median computed on a complete one. Treat the newest one or two periods as provisional, not as the current trend.
  6. Run the second guided query, sell-through and bought-in rate for the same artist, and explain that these numbers depend on nothing about price at all, only on how many offered lots found a buyer, so they are a useful check against a price index that might be moved by a handful of results.
  7. Run the third guided query, a rough hedonic-style split using a medium keyword pulled from item_title, and be explicit that this is an imperfect proxy built from free text, not a documented characteristic field, and that it will misclassify some lots.
  8. Run the fourth guided query, the cohort comparison across several artists at once with a minimum-lot threshold (HAVING COUNT(*) >= a chosen number), and explain that the threshold exists to keep a low-volume artist's noisy figure out of a table meant to be read side by side with others. State the secondary-market-only caveat: none of the four queries say anything about primary or gallery sales, only about what happened at auction.

Datasets and queries used

Dataset: fine art data (documented fields only: designer, model, item_title, sale_date, usd_price_decimal, sale_estimates_high_usd_price, status, vendor, stock_ticker). Table all_fine_art_data; a comparable table, all_works_of_art_data, exists for works of art outside the fine art scope and is not used in this session. In the fine art data the designer field holds the artist or maker name, and the vendor field holds the auction house. Confirm exact field names in the schema browser or via GET /v1/tables before writing a filter, since a misspelled or misremembered field name will silently return zero rows rather than an error in some clients.

Query 1, artist-level market index by year, median realized price with lot count shown alongside:

SELECT DATE_TRUNC('year', sale_date) AS period,
       approx_percentile(usd_price_decimal, 0.5) AS median_realized_usd,
       COUNT(*) AS sold_lots
FROM all_fine_art_data
WHERE status = 'sold'
  AND designer LIKE '%Warhol%'
GROUP BY DATE_TRUNC('year', sale_date)
ORDER BY period;

Query 2, sell-through and bought-in rate for the same artist, a demand signal that does not depend on price:

SELECT designer AS artist,
       COUNT(*) FILTER (WHERE status = 'sold') AS sold_lots,
       COUNT(*) AS offered_lots,
       COUNT(*) FILTER (WHERE status = 'sold') * 1.0 / COUNT(*) AS sell_through,
       1.0 - (COUNT(*) FILTER (WHERE status = 'sold') * 1.0 / COUNT(*)) AS bought_in_rate
FROM all_fine_art_data
WHERE designer LIKE '%Warhol%'
GROUP BY designer;

Query 3, a rough hedonic-style split using a medium keyword drawn from item_title as an imperfect characteristic proxy:

SELECT CASE WHEN item_title LIKE '%print%' THEN 'print'
            WHEN item_title LIKE '%photograph%' THEN 'photograph'
            WHEN item_title LIKE '%painting%' THEN 'painting'
            ELSE 'other or unspecified' END AS medium_keyword,
       approx_percentile(usd_price_decimal, 0.5) AS median_realized_usd,
       COUNT(*) AS sold_lots
FROM all_fine_art_data
WHERE status = 'sold'
  AND designer LIKE '%Warhol%'
GROUP BY CASE WHEN item_title LIKE '%print%' THEN 'print'
              WHEN item_title LIKE '%photograph%' THEN 'photograph'
              WHEN item_title LIKE '%painting%' THEN 'painting'
              ELSE 'other or unspecified' END
ORDER BY sold_lots DESC;

Query 4, cohort comparison across several artists at once with a minimum-lot threshold:

SELECT designer AS artist,
       COUNT(*) FILTER (WHERE status = 'sold') AS sold_lots,
       COUNT(*) AS offered_lots,
       COUNT(*) FILTER (WHERE status = 'sold') * 1.0 / COUNT(*) AS sell_through,
       approx_percentile(usd_price_decimal, 0.5) AS median_realized_usd
FROM all_fine_art_data
WHERE designer IN ('Andy Warhol', 'Roy Lichtenstein', 'Jean-Michel Basquiat')
GROUP BY designer
HAVING COUNT(*) >= 100
ORDER BY median_realized_usd DESC;

Optional API extension, retrieve one artist's sold lots to build the median-by-year index client-side (POST /v1/tables/all_fine_art_data/query, header X-API-Key). The API returns rows rather than server-side aggregates, so the year grouping and the median are computed in pandas after paginating on offset:

{
  "fields": ["designer", "item_title", "sale_date", "usd_price_decimal"],
  "filters": [
    {"field": "designer", "op": "contains", "value": "Warhol"},
    {"field": "status", "op": "eq", "value": "sold"}
  ],
  "sort": [{"field": "sale_date", "direction": "asc"}],
  "limit": 1000
}

Discussion questions

  1. A comparable set is defined by an artist filter, a date range, and a status filter. What happens to an index or a demand signal if any one of those three is loosely defined, and how would you know it had gone wrong?
  2. The market index moves from one year to the next. What are the two distinct reasons it can move, and why does showing the lot count next to the median help a reader tell them apart?
  3. Why does an index built from median realized price measure method and the composition of what sold, and not the pure appreciation of an artist's work, and what would it take to separate the two?
  4. Sell-through and bought-in rate depend on nothing about price. What can these two signals tell you about an artist's market that a price index cannot, and what can they not tell you?
  5. The hedonic-style split in Query 3 uses a keyword from item_title as a proxy for medium. What kinds of lots would this keyword approach misclassify, and how would you check how much error it introduces?
  6. Why does the cohort comparison in Query 4 require a minimum-lot threshold before an artist appears in the table, and what would you say to a client who wanted to see every artist regardless of lot count?
  7. Why should the newest one or two periods in an index be treated as provisional rather than as evidence of a current trend, and what would you tell a client who asked for "this year's number" specifically?
  8. Auction data captures the secondary market only. Name one question about an artist's market that this dataset, on its own, cannot answer, and explain what other source you would need.

Homework assignment

Each student selects one artist represented in the fine art data with at least 150 sold lots and produces a short methods memo, as if for a research director reviewing a junior analyst's first market study. The memo defines the comparable set used, builds the artist's market index by year with lot counts shown, reports sell-through and bought-in rate, attempts the hedonic-style keyword split and states its limitations, and places the artist in a cohort table alongside at least two other artists using the minimum-lot threshold from class. The memo must include the SQL queries used as an appendix, explicitly flag which of the artist's own recent periods are provisional due to ongoing ingestion, and close with a limitations section addressing the secondary-market-only nature of the data and the fact that the median index reflects composition and method as much as it reflects the artist's market. Grading criteria: correct construction of the comparable set and the index with lot counts shown (25 percent), correct computation and honest interpretation of the demand signals (25 percent), reasonable and appropriately caveated use of the hedonic-style keyword split (20 percent), quality and rigor of the cohort comparison (15 percent), and honest treatment of the recency and secondary-market-only limitations (15 percent).


Going deeper

Key terms

  • Comparable set: the group of lots, defined by an artist filter, a date range, and a status filter, that forms the atomic unit of an art market analysis.
  • Market index: a period-by-period summary statistic, here the median of realized price, used to track a market's movement over time.
  • Composition effect: the change in an index caused by a shift in which works happened to sell in a given period, rather than by a genuine change in the market.
  • Hedonic thinking: treating price as a function of observable characteristics, applied here loosely because few characteristic fields are documented beyond item_title text.
  • Demand signal: a measure of market activity, such as sell-through or bought-in rate, that does not depend on the price level at all.
  • Bought-in rate: the share of offered lots that failed to find a buyer and were returned to the consignor, the complement of sell-through.
  • Cohort analysis: a comparison of a market measure across several artists or groups at once, read side by side rather than one at a time.
  • Minimum-lot threshold: a HAVING clause requirement that a group have at least a set number of lots before it appears in a comparative table, protecting against conclusions drawn from too few observations.
  • Point-in-time correctness: defining a period strictly by sale_date, never by any date the record happened to be loaded or ingested.

Common pitfalls

  1. Reading a rising median index as proof that an artist's market is appreciating, without checking whether the lot count for that period shows the mix of works has simply changed.
  2. Treating the newest one or two periods in an index as the current trend, when those periods are still being ingested and their lot counts and medians are not yet complete.
  3. Filtering by any date field other than sale_date to define a period, which breaks point-in-time correctness and can silently mix periods together.
  4. Treating an item_title keyword match as a true characteristic field, rather than an imperfect proxy that will miss or misclassify some lots.
  5. Building a cohort table without a minimum-lot threshold, letting a low-volume artist's noisy figure sit next to a well-supported one as if the two were equally reliable.
  6. Reading sell-through or bought-in rate on its own as a complete demand picture, without also considering that a low sell-through can reflect poor consignment quality rather than weak demand.
  7. Drawing a conclusion about an artist's overall market from auction data alone, without noting that the analysis is silent on primary or gallery sales.

Additional queries to explore

  1. A quarterly rather than yearly index for the same artist, grouping by DATE_TRUNC('quarter', sale_date) instead of year, to see whether a finer period reveals more or simply more noise given the lot count in each quarter.
  2. A vendor-level breakdown of the same artist's comparable set, grouping by designer and vendor together, to see whether the index or the demand signals differ meaningfully by which auction house sold the work.
  3. A second hedonic-style split using a different item_title keyword, such as a size or edition term, compared against the medium split used in class, to build intuition for how much a proxy characteristic can shift a median once the comparable set is subdivided.
  4. A cohort comparison restricted to a single vendor, using the same minimum-lot threshold, to see whether the same artists are ranked differently across auction houses.

Extension activities

  1. Have a group repeat the API extension for a second artist and compare the two median-by-year indices as assembled client-side in pandas, checking that the totals match what the SQL editor produced.
  2. Ask students to sketch how they would visualize the index, the demand signals, and the cohort table together on one page, as a preview of Data 2 (visualization).
  3. Have students research one artist's primary market or gallery representation for comparison against what the auction-based index alone shows, to make the secondary-market limitation concrete rather than abstract.
  4. Ask a group to re-run the cohort comparison with a lower minimum-lot threshold than the one used in class, and describe in their own words how the table's reliability changes as the threshold drops.

Connections to other modules

Previous in this track: Art 1–4 build the vocabulary, house mechanics, market view, and theory this session turns into research method. Art 3's league tables and pricing power / sell-through figures are the business-reader version of what this module rebuilds as index, demand signals, and cohort comparison. This is the last module in the Art track. Cross-track: Data 2 for presenting the index; Data 3 for fuller predictive models beyond a keyword proxy; Data 4 for more rigorous treatment of period-by-period indices and the newest periods.