A data-driven approach to identifying optimal locations for Quick Service Restaurant (QSR) expansion in Maharashtra, India.
This project combines pincode-level census data with Point of Interest (POI) competition data to identify high-potential areas for QSR expansion across Maharashtra. The analysis uses demographic indicators, population density, and competitive landscape mapping to score and rank potential sites.
- Data Integration: Merge multiple data layers (census, POI, competition data) at pincode granularity
- Market Analysis: Identify underserved markets with high population density
- Competition Mapping: Assess competitive intensity across different pincodes
- Site Scoring: Develop a multi-factor scoring system for site selection
- Actionable Insights: Generate ranked recommendations for expansion
- Source: Census demographic data
- Granularity: Pincode level
- Key Fields:
- Pincode
- District
- Population/Households
- State information
- Source: Points of Interest database
- Granularity: Pincode level
- Key Fields:
- Pincode
- POI locations (restaurants, competitors, etc.)
- Competition density
Place the following CSV files in your working directory:
5c2f62fe-5afa-4119-a499-fec9d604d5bd.csv- Pincode/Census dataconsolidated_pincode_census.csv- POI/Competition data
maharashtra-qsr-site-selection/
│
├── README.md
├── requirements.txt
├── data/
│ ├── raw/
│ │ ├── pincode_census.csv
│ │ └── poi_competition.csv
│
├── notebooks/
│ ├── 01_qsr_model.ipynb
│
│
│
└── outputs/
├── reports/
Key Steps:
- Load raw datasets
- Filter Maharashtra records (pincode prefix '4')
- Standardize pincode format (6-digit strings)
- Remove invalid/missing pincodes
- Merge datasets on pincode
Output: Clean master dataset with standardized pincodes
- Demographic Features: Population density, household counts
- Competition Features: POI density, competitive intensity
- Market Features: Population-to-POI ratio, market saturation
- Geographic Features: District-level aggregations
Multi-factor scoring based on:
- Population potential (40% weight)
- Competition intensity (30% weight)
- Market gaps (20% weight)
- Accessibility indicators (10% weight)
- Heatmaps of opportunity scores
- District-level comparisons
- Top-N site recommendations
- Interactive dashboards
| Metric | Description | Calculation |
|---|---|---|
| Population Density | People per pincode area | Total Population / Area |
| POI Density | Competition concentration | POI Count / Pincode |
| Market Gap Score | Underserved market indicator | Population / POI_Count |
| Opportunity Score | Overall site potential | Weighted combination |
Rank | Pincode | District | Population | POI_Count | Opportunity_Score
-----|---------|-----------|------------|-----------|------------------
1 | 400001 | Mumbai | 125,000 | 15 | 92.5
2 | 411014 | Pune | 98,000 | 12 | 88.3
3 | 422001 | Nashik | 87,500 | 8 | 85.7
...
def standardize_pincode(df, pincode_col):
"""Standardize pincode to 6-digit string format"""
df[pincode_col] = df[pincode_col].astype(str).str.replace('.0', '', regex=False)
df[pincode_col] = df[pincode_col].str.strip()
df[pincode_col] = df[pincode_col].apply(
lambda x: x if len(x) == 6 and x.isdigit() else np.nan
)
return df.dropna(subset=[pincode_col])# Aggregate by pincode
df_master = df_pincode.groupby('Pincode').agg({
'District': 'first',
'Population': 'sum',
'POI_Count': 'sum'
}).reset_index()✓ Pincode format validation (6 digits)
✓ State filtering (Maharashtra only)
✓ Duplicate removal
✓ Missing value handling
✓ Data type consistency
✓ Outlier detection
- QSR Chain Expansion: Identify next 10-50 locations for expansion
- Market Entry Strategy: Prioritize districts for new market entry
- Competitive Analysis: Understand market saturation by area
- Investment Planning: Allocate resources based on opportunity scores
- Performance Benchmarking: Compare actual vs. predicted performance
- Pincode Prefix: Maharashtra pincodes start with '4'
- Population Estimation: When unavailable, estimated at 5,000 people per post office
- POI Count: Missing values filled with 0 (assumes no competition)
- Geographic Scope: Analysis limited to Maharashtra state
- Data Currency: Results depend on data freshness; recommend quarterly updates
This is an analytical framework. To adapt for your needs:
- Update file paths to match your data sources
- Adjust scoring weights based on business priorities
- Add additional data layers (income, traffic, real estate)
- Customize visualization preferences
- Extend feature engineering based on domain knowledge
For questions about the methodology or implementation:
- Review the code comments for detailed explanations
- Check data quality reports in the outputs folder
- Consult domain experts for market-specific insights
This project is designed for internal business analysis and site selection purposes which i took as a problem statement.
Last Updated: February 2026