11# The Anatomy of Scent
22
3- An interactive data visualization exploring what makes a perfume attractive, how composition influences popularity, and what trends define modern perfumery.
3+ An interactive scrollytelling data visualization exploring what makes a perfume attractive, how composition influences popularity, and what trends define modern perfumery.
44
55** Live site** : [ com-480-dataviz.vercel.app] ( https://com-480-dataviz.vercel.app )
66
@@ -17,42 +17,36 @@ This project analyzes 24,063 perfumes from the Fragrantica dataset and 2,000+ eB
1717
1818## Visualizations
1919
20- | Visualization | Type | Data Source |
21- | --- | --- | --- |
22- | Note Frequency | Force-directed beeswarm | notes_stats.json |
23- | Gender Comparison | Dual radar charts | notes_stats.json |
24- | Rating vs Popularity | Scatter/bubble chart | notes_stats.json |
25- | Temporal Trends | Stacked area chart | temporal_trends.json |
26- | Price Analysis | Strip/beeswarm plot | price_data.json |
27- | Note Connections | Chord diagram | chord_data.json |
28- | Note Flow | Sankey diagram | sankey_data.json |
29- | Accord Heatmap | Interactive heatmap | accords_data.json |
20+ | # | Visualization | Type | Data Source |
21+ | --- | --- | --- | --- |
22+ | 1 | The Building Blocks | Force-directed beeswarm | notes_stats.json |
23+ | 2 | His & Hers | Dual radar charts | notes_stats.json |
24+ | 3 | The Ratings Game | Scatter/bubble chart | notes_stats.json |
25+ | 4 | Fifty Years of Fragrance | Stacked area chart | temporal_trends.json |
26+ | 5 | The Price of Scent | Beeswarm strip plot | price_data.json |
27+ | 6a | Note Connections | Chord diagram | chord_data.json |
28+ | 6b | Flow of Fragrance | Sankey diagram | sankey_data.json |
29+ | 7 | The Full Picture | Interactive heatmap | accords_data.json |
3030
3131## Technical Setup
3232
3333### Prerequisites
3434
3535- A modern web browser (Chrome, Firefox, Safari, Edge)
36- - Python 3.8+ (only for data preprocessing)
37- - A local HTTP server (Python built-in or similar)
36+ - Python 3.8+ (only needed if regenerating data from raw CSVs)
3837
3938### Running locally
4039
4140``` bash
42- # Clone the repository
4341git clone https://github.com/com-480-data-visualization/MSV.git
44- cd MSV
45-
46- # Start a local server in the website directory
47- cd docs
42+ cd MSV/docs
4843python3 -m http.server 8000
49-
50- # Open http://localhost:8000 in your browser
44+ # Open http://localhost:8000
5145```
5246
5347### Data preprocessing (optional)
5448
55- The processed JSON files are already included in ` docs/data/ ` . To regenerate from raw CSVs:
49+ The processed JSON files are already included in ` docs/data/ ` . To regenerate from raw CSVs, download the datasets from Kaggle (links below) and place them in ` data/ ` , then :
5650
5751``` bash
5852cd src
@@ -63,31 +57,30 @@ python3 compute_advanced_data.py
6357## Project Structure
6458
6559```
66- docs/ # Deployable website
67- index.html # Main page with scrollytelling structure
68- css/style.css # Dark luxury theme styles
60+ docs/ # Deployable website (served by Vercel)
61+ index.html # Scrollytelling main page
62+ css/style.css # Dark luxury theme (Cormorant Garamond + DM Sans)
6963 js/main.js # Scrollama setup, navigation, shared utilities
70- js/visualizations/ # One file per D3.js visualization
71- data/ # Processed JSON files for D3.js
72- data/ # Raw datasets
73- fragrantica/ # Fragrantica perfume dataset (24K entries)
74- perfume-ecommerce/ # eBay pricing dataset
75- json/ # Processed JSON (canonical copies)
76- milestones/ # Course milestone documents
64+ js/visualizations/ # One module per D3.js visualization (8 files)
65+ data/ # Pre-processed JSON files for D3.js
66+ data/ # Raw datasets (not tracked — download from Kaggle)
67+ milestones/ # Milestone reports + process book
7768src/ # Python preprocessing scripts
7869```
7970
8071## Tech Stack
8172
82- - ** D3.js v7** for all visualizations
83- - ** Scrollama** for scroll-driven interactions (IntersectionObserver)
84- - ** Lenis ** for smooth momentum scrolling
85- - ** Vanilla HTML/CSS/JS** ( no build tools , no framework)
86- - ** Python + pandas** for data preprocessing
87- - ** GitHub Pages ** for hosting
73+ - ** D3.js v7** — all 8 interactive visualizations
74+ - ** Scrollama** — scroll-driven narrative transitions (IntersectionObserver)
75+ - ** d3-sankey ** — Sankey diagram layout
76+ - ** Vanilla HTML/CSS/JS** — no framework , no build step
77+ - ** Python + pandas** — data preprocessing pipeline
78+ - ** Vercel ** — static deployment from ` /docs `
8879
8980## Data Sources
9081
82+ Raw datasets are not included in the repository (too large). Download from Kaggle:
83+
9184- [ Fragrantica Fragrance Dataset] ( https://www.kaggle.com/datasets/olgagmiufana1/fragrantica-com-fragrance-dataset ) (~ 24K perfumes with notes, ratings, accords, gender, year)
9285- [ Perfume E-Commerce Dataset 2024] ( https://www.kaggle.com/datasets/kanchana1990/perfume-e-commerce-dataset-2024 ) (~ 2K eBay listings with pricing)
9386
@@ -103,11 +96,12 @@ See [milestones/Milestone1.md](milestones/Milestone1.md) for the full report inc
10396
10497See [ milestones/Milestone2.md] ( milestones/Milestone2.md ) for the project goal, visualization sketches, tools, and MVP breakdown.
10598
106- ## Milestone 3 (30th May, 5pm)
99+ ## Milestone 3 (29th May, 5pm)
107100
108101** 80% of the final grade**
109102
110- Process book: [ milestones/ProcessBook.pdf] ( milestones/ProcessBook.pdf )
103+ - ** Process book** : [ milestones/ProcessBook.pdf] ( milestones/ProcessBook.pdf )
104+ - ** Screencast** : * TODO — add link*
111105
112106## Late policy
113107
0 commit comments