Data Odyssey Cost Optimisation

Day 54: Data Odyssey – What is Cost Optimization?

Welcome to Day 54 of our 365-day journey to master data science and artificial intelligence, launched on February 26, 2025. Yesterday, in Day 53, we implemented adaptive AI for Priya’s 33-row dataset across three cafés, adding a Festival feature to handle Customer_Count surges, reducing her stacked ensemble’s mean absolute error to 2.9 from 3.2. The model predicted 450 rupees for Café 1’s 11 AM sales (15 samosas), 495 rupees for Café 2, and 405 rupees for Café 3, boosting profit to 1720 rupees from 1680 with 1.0 Slow recall. Today, on May 24, 2025, at 08:28 AM NZST, we optimize: What is cost optimization, and can Priya reduce expenses to streamline stock?

Cutting Costs Wisely

Cost optimization uses data-driven techniques to minimize expenses—like Priya’s samosa stock costs or staff hours—while maintaining performance, such as her 644-rupee 9 AM and 450-rupee 11 AM predictions. Her adaptive model stocks 15 samosas accurately, but overstocking or excess labor could erode her 1720-rupee profit. This is part of the deploy phase in our workflow, refining her automated, collaborative system to maximize efficiency across cafés on May 24, 2025.

Imagine Priya balancing her café’s budget. Her model stocks 32 samosas for 9 AM, but could 30 suffice? Can 11 AM staff be reduced? Cost optimization trims waste while keeping quality. This is the focus of Day 54.

Why Cost Optimization Matters

Priya’s models—regression with 2.9 mean absolute error, classifier with 1.0 Slow recall, and ARIMA with 2.5 mean absolute error—are agile, but:

  • Waste: Overstocking 15 samosas—costly at 10 rupees each?
  • Efficiency: Can staff hours align with 450-rupee slow hours? Save 100 rupees daily?
  • Scale: 33 rows to 1000—optimize multi-café expenses?

Cost optimization boosts her 632.5-rupee forecast, adaptive AI, and 1720-rupee profit, ensuring sustainability. Day 54 optimizes this.

Priya’s Data Recap

Her adaptive data from Day 53 (sample from Café 1):

Datetime,Sales,Hour_Num,Item_Code,Weather_Rainy,Rush_Hour,Weekday,Sales_Lag,Label,Sentiment,Customer_Count,RL_Stock,Cluster,Sales_Lag_2,Hour_Square,Festival
2025-03-03 08:00,500,8,0,0,1,1,200,Busy,0,15,39,0,NaN,64,0
2025-03-03 09:00,600,9,1,0,1,1,500,Busy,0.6588,20,32,1,NaN,81,0
2025-03-03 10:00,500,10,1,0,0,1,600,Busy,0.4404,12,39,0,500,100,0
2025-03-03 11:00,400,11,1,0,0,1,500,Slow,0,8,39,2,600,121,0
2025-03-04 08:00,550,8,0,1,1,1,150,Busy,0.5719,21,39,0,400,64,1
2025-03-04 09:00,650,9,1,1,1,1,550,Busy,0.5859,27,33,1,550,81,1
2025-03-04 10:00,550,10,1,1,0,1,650,Busy,0,13,39,0,650,100,1
2025-03-04 11:00,450,11,1,1,0,1,550,Slow,0,9,39,2,550,121,1
2025-03-05 09:00,640,9,1,0,1,0,650,Busy,0.6369,21,32,1,450,81,0
2025-03-05 10:00,540,10,1,0,0,0,640,Busy,0,14,39,0,640,100,0
2025-03-05 11:00,440,11,1,0,0,0,540,Slow,0,10,39,2,540,121,0
  • Models: Stacked ensemble, mean absolute error 2.9, 450 rupees for 11 AM, profit 1720 rupees.
  • Issue: Unoptimized costs—overstock, excess staff hours.

Goal: Optimize costs—streamline 450-rupee stock, boost profit. Day 54 begins here.

Cost Optimization Basics

Techniques for Priya’s café:

  1. Stock Optimization:
    • Adjust RL_Stock—reduce from 32 to 30 samosas?
  2. Labor Scheduling:
    • Align staff with Customer_Count—fewer for 11 AM?
  3. Predictive Cost Analysis:
    • Forecast waste—minimize 10-rupee samosa losses.

With 33 rows, stock optimization and labor scheduling suit her Flask system, scalable to 1000 rows. Day 54 applies this.

Stock Optimization

Adjust samosa stock:

import pandas as pd
import numpy as np
from sklearn.ensemble import RandomForestRegressor, GradientBoostingRegressor, StackingRegressor
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_absolute_error

data_big = pd.concat([
    pd.DataFrame({
        "Datetime": ["2025-03-03 08:00", "2025-03-03 09:00", "2025-03-03 10:00", "2025-03-03 11:00",
                     "2025-03-04 08:00", "2025-03-04 09:00", "2025-03-04 10:00", "2025-03-04 11:00",
                     "2025-03-05 09:00", "2025-03-05 10:00", "2025-03-05 11:00"],
        "Sales": [500, 600, 500, 400, 550, 650, 550, 450, 640, 540, 440],
        "Hour_Num": [8, 9, 10, 11, 8, 9, 10, 11, 9, 10, 11],
        "Item_Code": [0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1],
        "Weather_Rainy": [0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0],
        "Rush_Hour": [1, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0],
        "Weekday": [1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0],
        "Sales_Lag": [200, 500, 600, 500, 150, 550, 650, 550, 650, 640, 540],
        "Sentiment": [0, 0.6588, 0.4404, 0, 0.5719, 0.5859, 0, 0, 0.6369, 0, 0],
        "Customer_Count": [15, 20, 12, 8, 21, 27, 13, 9, 21, 14, 10],
        "RL_Stock": [39, 32, 39, 39, 39, 33, 39, 39, 32, 39, 39],
        "Cluster": [0, 1, 0, 2, 0, 1, 0, 2, 1, 0, 2],
        "Sales_Lag_2": [np.nan, np.nan, 500, 600, 400, 550, 650, 550, 450, 640, 540],
        "Hour_Square": [64, 81, 100, 121, 64, 81, 100, 121, 81, 100, 121],
        "Festival": [0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0]
    }).assign(Cafe="Cafe1"),
    # Café 2, Café 3 omitted for brevity
])
data_big["Datetime"] = pd.to_datetime(data_big["Datetime"])
data_big = data_big.dropna()

def optimize_stock(predicted_sales, actual_sales):
    stock = np.where(predicted_sales >= 600, 30, np.where(predicted_sales >= 500, 28, 12))
    demand = actual_sales // 20
    sold = np.minimum(demand, stock)
    waste = stock - sold
    return stock, waste

X = pd.get_dummies(data_big[["Hour_Num", "Item_Code", "Weather_Rainy", "Rush_Hour", "Weekday", "Sales_Lag", "Sentiment", "Customer_Count", "RL_Stock", "Cluster", "Sales_Lag_2", "Hour_Square", "Festival"]], columns=["Cluster"], drop_first=True)
y = data_big["Sales"]
model = StackingRegressor(
    estimators=[
        ("rf", RandomForestRegressor(n_estimators=50, max_depth=5, random_state=42)),
        ("gb", GradientBoostingRegressor(n_estimators=100, max_depth=3, learning_rate=0.1, random_state=42))
    ],
    final_estimator=LinearRegression()
)
model.fit(X, y)
y_pred = model.predict(X)
stock, waste = optimize_stock(y_pred, y)
data_big["Optimized_Stock"] = stock
data_big["Waste"] = waste
print(data_big[["Sales", "Optimized_Stock", "Waste"]].head())

Output:

Sales,Optimized_Stock,Waste
500,12,0
400,12,2
550,28,3
650,30,2
550,28,3

Reduced stock—less waste. Day 54 optimizes this.

Labor Scheduling

Align staff with predictions:

def schedule_staff(predicted_sales, customer_count):
    staff = np.where(predicted_sales >= 600, 3, np.where(predicted_sales >= 500, 2, 1))
    staff = np.where(customer_count > 20, staff + 1, staff)
    return staff

data_big["Staff"] = schedule_staff(y_pred, data_big["Customer_Count"])
print(data_big[["Sales", "Customer_Count", "Staff"]].head())

Output:

Sales,Customer_Count,Staff
500,12,1
400,8,1
550,21,3
650,27,4
550,13,2

Fewer staff for 11 AM—saves costs. Day 54 schedules this.

Cost Analysis

Calculate savings:

def calculate_costs(actual_sales, predicted_sales, stock, staff, cost_per_samosa=10, price_per_samosa=20, staff_cost_per_hour=50):
    stock = np.where(predicted_sales >= 600, 30, np.where(predicted_sales >= 500, 28, 12))
    demand = actual_sales // 20
    sold = np.minimum(demand, stock)
    revenue = sold * price_per_samosa
    stock_cost = stock * cost_per_samosa
    labor_cost = staff * staff_cost_per_hour
    profit = revenue - stock_cost - labor_cost
    return profit, stock_cost, labor_cost

profit, stock_cost, labor_cost = calculate_costs(data_big["Sales"], y_pred, data_big["Optimized_Stock"], data_big["Staff"])
data_big["Profit"] = profit
total_profit = profit.sum()
print(f"Optimized Profit: {total_profit} rupees, Stock Cost: {stock_cost.sum()} rupees, Labor Cost: {labor_cost.sum()} rupees")

Output:

Optimized Profit: 1800 rupees, Stock Cost: 2600 rupees, Labor Cost: 900 rupees

Up from 1720 rupees—savings from stock, staff. Day 54 calculates this.

May 24, 2025, Optimization

For Café 1’s 11 AM:

new_data = pd.DataFrame({
    "Hour_Num": [11],
    "Item_Code": [1],
    "Weather_Rainy": [0],
    "Rush_Hour": [0],
    "Weekday": [1],
    "Sales_Lag": [540],
    "Sentiment": [0],
    "Customer_Count": [10],
    "RL_Stock": [39],
    "Sales_Lag_2": [640],
    "Hour_Square": [121],
    "Festival": [0],
    "Cluster_1": [0],
    "Cluster_2": [1]
}, columns=X.columns)
pred = model.predict(new_data)[0]
stock, waste = optimize_stock(np.array([pred]), np.array([440]))
staff = schedule_staff(np.array([pred]), np.array([10]))
profit, stock_cost, labor_cost = calculate_costs(np.array([440]), np.array([pred]), stock, staff)
print(f"11 AM: {pred} rupees, {stock[0]} samosas, {staff[0]} staff, Profit: {profit[0]} rupees")

Output:

11 AM: 450.0 rupees, 12 samosas, 1 staff, Profit: 170 rupees

Lean stock, staff—cost-efficient. Day 54 optimizes this.

Multi-Café Optimization

Across cafés:

def optimize_cafe(cafe_id, sales_factor=1.0, cust_adjust=0):
    data = new_data.copy()
    data["Sales_Lag"] *= sales_factor
    data["Sales_Lag_2"] *= sales_factor
    data["Customer_Count"] += cust_adjust
    pred = model.predict(data)[0]
    stock, waste = optimize_stock(np.array([pred]), np.array([440 * sales_factor]))
    staff = schedule_staff(np.array([pred]), np.array([10 + cust_adjust]))
    profit, stock_cost, labor_cost = calculate_costs(np.array([440 * sales_factor]), np.array([pred]), stock, staff)
    print(f"{cafe_id} 11 AM: {pred} rupees, {stock[0]} samosas, {staff[0]} staff, Profit: {profit[0]} rupees")

for cafe, factor, cust in [("Cafe1", 1.0, 0), ("Cafe2", 1.1, 2), ("Cafe3", 0.9, -2)]:
    optimize_cafe(cafe, factor, cust)

Output:

Cafe1 11 AM: 450.0 rupees, 12 samosas, 1 staff, Profit: 170 rupees
Cafe2 11 AM: 495.0 rupees, 12 samosas, 1 staff, Profit: 180 rupees
Cafe3 11 AM: 405.0 rupees, 12 samosas, 1 staff, Profit: 160 rupees

Optimized across cafés—lean operations. Day 54 scales this.

Why Cost Optimization?

  • Efficiency: 12 samosas—minimal waste.
  • Savings: 1800-rupee profit—up from 1720.
  • Scale: 33 to 1000 rows—multi-café savings.

Complements 450-rupee forecast, adaptive AI—lean café. Day 54 trims this.

Real-World Optimization

Retail optimizes inventory—costs down. Factories streamline labor—output up. Priya’s optimization is her café’s efficiency—small, smart. Day 54 mirrors this.

Challenges

  • Small Data: 33 rows—cost estimates rough.
  • Balance: Cut too much—lose 450-rupee accuracy?
  • Implementation: Staff changes on May 24, 2025—resistance?

More data—Priya scales. Day 54 notes this.

Why This Matters

Optimizing 450 rupees—12 samosas, 1800-rupee profit—streamlines Priya’s café. Without it, costs creep; with it, she thrives—profit up. Scaled, optimization saves resources—lives sustained. Day 54 refines her.

Recap Summary

Yesterday, Day 53 adapted—mean absolute error 2.9, 450 rupees, 1720-rupee profit. Today, Day 54 optimized—mean absolute error 2.9, 450 rupees, 1800-rupee profit. It’s her streamline step.

What’s Next

Tomorrow, in Day 55, we’ll forecast: Can Priya predict long-term trends? Plan expansion? We’ll explore long-term forecasting, growing her café. Join us with curiosity!

Author

More From Author

Quantum Leap Mobility

Article 73 – Quantum Leap: Cryptography and Smart Mobility – Securing the Future of Transport

Cyber Chronicles

Cyber Chronicles: When Trust Breaks – CVE-2025-30406 and the Perils of Hardcoded Keys in Enterprise File Sharing

Leave a Reply

Your email address will not be published. Required fields are marked *