Price discrimination means charging different prices for the same good based on the buyer's willingness to pay. It comes in three degrees: perfect (unique price per buyer), quantity-based (bulk discounts), and segment-based (student tickets, senior discounts). The seller captures more of the surplus that would otherwise go to consumers.
First degree: perfect price discrimination
The seller charges each buyer their exact maximum willingness to pay. All consumer surplus is captured. In practice this is rare, but personalized pricing algorithms approximate it. Auctions are a close real-world mechanism.
Scheme
; First degree: charge each buyer their max willingness to pay; Buyers have different reservation prices
(define buyers '(504035252015))
(define cost 10)
; Uniform pricing at $25
(define uniform-price 25)
(define (uniform-profit buyers price cost)
(let ((sold (filter (lambda (b) (>= b price)) buyers)))
(* (length sold) (- price cost))))
(display "Uniform price $25, profit: $")
(display (uniform-profit buyers uniform-price cost))
(newline)
; Perfect discrimination: charge each buyer their reservation price
(define (perfect-profit buyers cost)
(apply + (map (lambda (b) (if (>= b cost) (- b cost) 0)) buyers)))
(display "Perfect discrimination, profit: $")
(display (perfect-profit buyers cost))
(newline)
; Consumer surplus under each regime
(define (consumer-surplus buyers price)
(apply + (map (lambda (b) (if (>= b price) (- b price) 0)) buyers)))
(display "Consumer surplus (uniform): $")
(display (consumer-surplus buyers uniform-price))
(newline)
(display "Consumer surplus (perfect): $0")
Python
# First degree price discrimination
buyers = [50, 40, 35, 25, 20, 15]
cost = 10# Uniform pricing
price = 25
sold = [b for b in buyers if b >= price]
uniform_profit = len(sold) * (price - cost)
print("Uniform price $" + str(price) + ", profit: $" + str(uniform_profit))
# Perfect discrimination
perfect_profit = sum(b - cost for b in buyers if b >= cost)
print("Perfect discrimination, profit: $" + str(perfect_profit))
# Consumer surplus
cs_uniform = sum(b - price for b in buyers if b >= price)
print("Consumer surplus (uniform): $" + str(cs_uniform))
print("Consumer surplus (perfect): $0")
Second degree: quantity discounts
The seller offers different price-quantity packages. Buyers self-select into tiers. Think bulk discounts, software licensing tiers, or phone data plans. The seller doesn't need to know each buyer's type; the menu is designed so each type prefers the package meant for them.
The seller divides buyers into identifiable groups and charges each group a different price. Student discounts, senior pricing, geographic pricing, matinee tickets. The requirement: the seller must be able to identify group membership and prevent resale between groups.
Scheme
; Airline pricing: third degree price discrimination; Same seat, different prices by segment
(define segments
'(("Business"800200.3) ; (name price quantity elasticity)
("Regular"350801.0)
("Student"150402.5)))
(define cost-per-seat 100)
(define (segment-profit seg)
(let ((price (cadr seg))
(qty (caddr seg)))
(* qty (- price cost-per-seat))))
(define (show-segment seg)
(display (car seg))
(display ": ")
(display (cadr seg))
(display " x ")
(display (caddr seg))
(display " = $")
(display (segment-profit seg))
(newline))
(for-each show-segment segments)
(define total (apply + (map segment-profit segments)))
(display "Total profit: $")
(display total)
(newline)
; Compare to uniform price of $350
(define uniform-qty 100) ; lose some business, gain some students
(define uniform-profit (* uniform-qty (- 350 cost-per-seat)))
(display "Uniform at $350 (100 seats): $")
(display uniform-profit)