mcpField
C
carbon-footprint-tracking

carbon-footprint-tracking

github.com/kishorkukrejaデータ・データベース8456 回インストール3 週間前に更新
リポジトリ

carbon-footprint-tracking について

組織の炭素会計とサプライチェーンの脱炭素化を扱うスキルです。排出スコープ、活動量と排出係数による計算、サプライヤー追跡、削減分析、報告を支援します。

主な機能

  1. 01排出スコープと境界の設定
  2. 02活動量と排出係数による計算
  3. 03サプライヤー排出データの追跡
  4. 04削減機会の分析
  5. 05炭素レポートの構成

活用シーン

  1. 01Scope 1・2・3の排出インベントリ作成
  2. 02サプライヤーデータ品質の評価
  3. 03削減目標と施策の進捗追跡

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/kishorkukreja/awesome-supply-chain --skill carbon-footprint-tracking

インストール後、Claude Code で/carbon-footprint-trackingを入力して読み込まれたか確認します。

詳細

カーボンフットプリントの追跡

カーボンフットプリントの測定とサプライチェーンの脱炭素化に関する専門家として、組織がサプライチェーン業務全体にわたる温室効果ガス(GHG)排出量を正確に測定、追跡、報告、削減できるよう支援します。

初期評価

カーボン追跡を導入する前に、以下を把握してください。

  1. 組織の背景

    • カーボン追跡を推進する要因は何ですか?(コンプライアンス、報告、削減目標)
    • 現在の炭素会計の成熟度はどの程度ですか?
    • ネットゼロまたは炭素削減のコミットメントはありますか?
    • 規制要件はありますか?(CDP、TCFD、SEC Climate Rule)
  2. 測定範囲

    • どの排出スコープを追跡しますか?(Scope 1、2、3)
    • 対象となる地理的範囲はどこですか?(施設、地域、全世界)
    • サプライチェーンの対象範囲はどこまでですか?(Tier 1、複数階層)
    • 製品レベルと企業レベルのどちらのフットプリントですか?
  3. データの利用可能性

    • エネルギー消費データを利用できますか?
    • 輸送データを追跡していますか?
    • サプライヤーの排出量データにアクセスできますか?
    • 活動データの品質と完全性はどの程度ですか?
  4. 報告要件

    • 内部目標と KPI はありますか?
    • 外部報告フレームワークはありますか?(GRI、CDP、SASB)
    • ステークホルダーの期待は何ですか?(投資家、顧客、従業員)
    • 検証と保証のニーズはありますか?

GHG プロトコルのフレームワーク

排出スコープ

Scope 1:直接排出

  • 自社所有の車両および設備
  • 敷地内での燃料燃焼
  • 製造プロセス
  • 漏洩排出(冷媒、漏れ)

Scope 2:間接エネルギー排出

  • 購入電力
  • 購入した暖房および冷房
  • 購入した蒸気

Scope 3:バリューチェーン排出

  • 上流:
    • 購入した製品およびサービス
    • 資本財
    • 輸送および配送(上流)
    • 出張
    • 従業員の通勤
    • 廃棄物処理
    • リース資産(上流)
  • 下流:
    • 輸送および配送(下流)
    • 製品の使用
    • 使用後の処理
    • フランチャイズ
    • 投資
排出カテゴリの優先順位
カテゴリ総排出量に占める一般的な割合測定の複雑さ優先度
Scope 3:購入した製品40-70%高最優先
Scope 3:上流輸送10-20%中高
Scope 2:電力5-15%低高
Scope 1:施設5-10%低中
Scope 3:製品の使用10-30%高中
Scope 3:使用後の処理2-5%中低

カーボン計算の方法論

排出係数アプローチ

基本式:

CO2e Emissions = Activity Data × Emission Factor

Where:
  Activity Data = Quantity of activity (kWh, liters, kg, tkm, etc.)
  Emission Factor = Emissions per unit (kgCO2e per unit)
  CO2e = Carbon dioxide equivalent (includes all GHGs)

Python の実装:

import pandas as pd
import numpy as np

class CarbonFootprintCalculator:
    """Comprehensive carbon footprint calculator"""

    def __init__(self):
        self.emission_factors = self._load_emission_factors()
        self.gwp_factors = {
            'CO2': 1,
            'CH4': 25,      # Methane (100-year GWP)
            'N2O': 298,     # Nitrous oxide
            'HFCs': 1430,   # Hydrofluorocarbons (avg)
            'PFCs': 7390,   # Perfluorocarbons (avg)
            'SF6': 22800    # Sulfur hexafluoride
        }

    def _load_emission_factors(self):
        """Load standard emission factors database"""
        # Based on EPA, DEFRA, and other sources
        return {
            # Energy (kgCO2e per kWh)
            'electricity_us_grid': 0.417,
            'electricity_eu_grid': 0.295,
            'electricity_renewable': 0.000,
            'natural_gas': 0.202,  # per kWh

            # Fuels (kgCO2e per liter)
            'diesel': 2.68,
            'gasoline': 2.31,
            'jet_fuel': 2.50,

            # Transportation (kgCO2e per tonne-km)
            'truck_full_truckload': 0.062,
            'truck_less_than_truckload': 0.091,
            'rail': 0.022,
            'ocean_shipping': 0.008,
            'air_freight': 0.602,

            # Materials (kgCO2e per kg)
            'steel': 1.85,
            'aluminum': 8.24,
            'plastic_pet': 2.15,
            'cardboard': 0.95,
            'glass': 0.85,
            'concrete': 0.11,

            # Manufacturing (kgCO2e per unit - examples)
            'electronics_assembly': 50,
            'textile_production': 15,
            'food_processing': 2.5
        }

    def calculate_scope1_facilities(self, fuel_consumption):
        """
        Calculate Scope 1 emissions from facility fuel use

        fuel_consumption: dict with fuel types and quantities
        Example: {'diesel_liters': 10000, 'natural_gas_kwh': 50000}
        """
        emissions = 0
        breakdown = []

        # Diesel/gasoline combustion
        if 'diesel_liters' in fuel_consumption:
            diesel_co2 = fuel_consumption['diesel_liters'] * self.emission_factors['diesel']
            emissions += diesel_co2
            breakdown.append({
                'source': 'Diesel combustion',
                'activity': fuel_consumption['diesel_liters'],
                'unit': 'liters',
                'emissions_kgco2e': diesel_co2
            })

        if 'gasoline_liters' in fuel_consumption:
            gas_co2 = fuel_consumption['gasoline_liters'] * self.emission_factors['gasoline']
            emissions += gas_co2
            breakdown.append({
                'source': 'Gasoline combustion',
                'activity': fuel_consumption['gasoline_liters'],
                'unit': 'liters',
                'emissions_kgco2e': gas_co2
            })

        # Natural gas (converted to kWh)
        if 'natural_gas_kwh' in fuel_consumption:
            ng_co2 = fuel_consumption['natural_gas_kwh'] * self.emission_factors['natural_gas']
            emissions += ng_co2
            breakdown.append({
                'source': 'Natural gas',
                'activity': fuel_consumption['natural_gas_kwh'],
                'unit': 'kWh',
                'emissions_kgco2e': ng_co2
            })

        return {
            'scope': 'Scope 1',
            'total_emissions_kgco2e': round(emissions, 2),
            'total_emissions_tco2e': round(emissions / 1000, 2),
            'breakdown': breakdown
        }

    def calculate_scope1_fleet(self, vehicle_data):
        """
        Calculate Scope 1 emissions from company fleet

        vehicle_data: list of dicts with vehicle info
        Example: [{'type': 'diesel', 'distance_km': 50000, 'fuel_efficiency_l_per_100km': 8}]
        """
        emissions = 0
        breakdown = []

        for vehicle in vehicle_data:
            distance = vehicle['distance_km']
            fuel_efficiency = vehicle['fuel_efficiency_l_per_100km']
            fuel_type = vehicle['type']

            # Calculate fuel consumed
            fuel_consumed = (distance / 100) * fuel_efficiency

            # Get emission factor
            if fuel_type in ['diesel']:
                ef = self.emission_factors['diesel']
            elif fuel_type in ['gasoline', 'petrol']:
                ef = self.emission_factors['gasoline']
            else:
                ef = 2.5  # default

            vehicle_emissions = fuel_consumed * ef
            emissions += vehicle_emissions

            breakdown.append({
                'vehicle_id': vehicle.get('id', 'Unknown'),
                'fuel_type': fuel_type,
                'distance_km': distance,
                'fuel_consumed_liters': round(fuel_consumed, 2),
                'emissions_kgco2e': round(vehicle_emissions, 2)
            })

        return {
            'scope': 'Scope 1 - Fleet',
            'total_emissions_kgco2e': round(emissions, 2),
            'total_emissions_tco2e': round(emissions / 1000, 2),
            'breakdown': breakdown
        }

    def calculate_scope2_electricity(self, electricity_consumption, region='us', renewable_pct=0):
        """
        Calculate Scope 2 emissions from electricity

        electricity_consumption: kWh consumed
        region: 'us', 'eu', or custom
        renewable_pct: percentage of renewable energy (0-1)
        """

        # Select emission factor based on region
        if region == 'us':
            ef = self.emission_factors['electricity_us_grid']
        elif region == 'eu':
            ef = self.emission_factors['electricity_eu_grid']
        else:
            ef = 0.40  # global average

        # Adjust for renewable percentage
        grid_electricity = electricity_consumption * (1 - renewable_pct)
        renewable_electricity = electricity_consumption * renewable_pct

        emissions_grid = grid_electricity * ef
        emissions_renewable = renewable_electricity * self.emission_factors['electricity_renewable']

        total_emissions = emissions_grid + emissions_renewable

        return {
            'scope': 'Scope 2',
            'total_electricity_kwh': electricity_consumption,
            'grid_electricity_kwh': grid_electricity,
            'renewable_electricity_kwh': renewable_electricity,
            'emission_factor_kgco2e_per_kwh': ef,
            'total_emissions_kgco2e': round(total_emissions, 2),
            'total_emissions_tco2e': round(total_emissions / 1000, 2)
        }

    def calculate_scope3_transportation(self, shipments):
        """
        Calculate Scope 3 emissions from transportation

        shipments: list of dicts
        Example: [{'mode': 'truck_ftl', 'distance_km': 500, 'weight_tonnes': 20}]
        """
        emissions = 0
        breakdown = []

        for shipment in shipments:
            mode = shipment['mode']
            distance = shipment['distance_km']
            weight = shipment['weight_tonnes']

            # Calculate tonne-kilometers
            tkm = distance * weight

            # Get emission factor
            mode_map = {
                'truck_ftl': 'truck_full_truckload',
                'truck_ltl': 'truck_less_than_truckload',
                'rail': 'rail',
                'ocean': 'ocean_shipping',
                'air': 'air_freight'
            }

            ef_key = mode_map.get(mode, 'truck_full_truckload')
            ef = self.emission_factors[ef_key]

            shipment_emissions = tkm * ef
            emissions += shipment_emissions

            breakdown.append({
                'shipment_id': shipment.get('id', 'Unknown'),
                'mode': mode,
                'distance_km': distance,
                'weight_tonnes': weight,
                'tonne_km': tkm,
                'emission_factor': ef,
                'emissions_kgco2e': round(shipment_emissions, 2)
            })

        return {
            'scope': 'Scope 3 - Transportation',
            'total_emissions_kgco2e': round(emissions, 2),
            'total_emissions_tco2e': round(emissions / 1000, 2),
            'breakdown': breakdown
        }

    def calculate_scope3_materials(self, materials_purchased):
        """
        Calculate Scope 3 emissions from purchased materials

        materials_purchased: dict with material types and quantities (kg)
        Example: {'steel': 10000, 'plastic_pet': 5000}
        """
        emissions = 0
        breakdown = []

        for material, quantity_kg in materials_purchased.items():
            if material in self.emission_factors:
                ef = self.emission_factors[material]
                material_emissions = quantity_kg * ef
                emissions += material_emissions

                breakdown.append({
                    'material': material,
                    'quantity_kg': quantity_kg,
                    'emission_factor': ef,
                    'emissions_kgco2e': round(material_emissions, 2)
                })

        return {
            'scope': 'Scope 3 - Materials',
            'total_emissions_kgco2e': round(emissions, 2),
            'total_emissions_tco2e': round(emissions / 1000, 2),
            'breakdown': breakdown
        }

    def calculate_product_carbon_footprint(self, product_data):
        """
        Calculate product-level carbon footprint (cradle-to-gate)

        product_data: dict with all product lifecycle data
        """
        total_emissions = 0
        lifecycle_breakdown = {}

        # Materials extraction and processing
        if 'materials' in product_data:
            materials_result = self.calculate_scope3_materials(product_data['materials'])
            lifecycle_breakdown['materials'] = materials_result
            total_emissions += materials_result['total_emissions_kgco2e']

        # Manufacturing
        if 'manufacturing' in product_data:
            mfg_energy = product_data['manufacturing'].get('energy_kwh', 0)
            mfg_result = self.calculate_scope2_electricity(
                mfg_energy,
                region=product_data['manufacturing'].get('region', 'us')
            )
            lifecycle_breakdown['manufacturing'] = mfg_result
            total_emissions += mfg_result['total_emissions_kgco2e']

        # Transportation to customer
        if 'transportation' in product_data:
            transport_result = self.calculate_scope3_transportation(
                product_data['transportation']
            )
            lifecycle_breakdown['transportation'] = transport_result
            total_emissions += transport_result['total_emissions_kgco2e']

        # Use phase (if applicable)
        if 'use_phase' in product_data:
            use_emissions = product_data['use_phase'].get('emissions_kgco2e', 0)
            lifecycle_breakdown['use_phase'] = {
                'emissions_kgco2e': use_emissions
            }
            total_emissions += use_emissions

        # End of life
        if 'end_of_life' in product_data:
            eol_emissions = product_data['end_of_life'].get('emissions_kgco2e', 0)
            lifecycle_breakdown['end_of_life'] = {
                'emissions_kgco2e': eol_emissions
            }
            total_emissions += eol_emissions

        return {
            'product_id': product_data.get('product_id', 'Unknown'),
            'total_carbon_footprint_kgco2e': round(total_emissions, 2),
            'lifecycle_breakdown': lifecycle_breakdown,
            'per_unit_emissions': round(total_emissions / product_data.get('units', 1), 2)
        }

    def calculate_emissions_by_scope(self, scope1_data, scope2_data, scope3_data):
        """Generate comprehensive emissions inventory by scope"""

        scope1_result = self.calculate_scope1_facilities(scope1_data['facilities'])
        scope1_fleet = self.calculate_scope1_fleet(scope1_data['fleet'])

        scope2_result = self.calculate_scope2_electricity(
            scope2_data['electricity_kwh'],
            region=scope2_data.get('region', 'us'),
            renewable_pct=scope2_data.get('renewable_pct', 0)
        )

        scope3_transport = self.calculate_scope3_transportation(scope3_data['shipments'])
        scope3_materials = self.calculate_scope3_materials(scope3_data['materials'])

        total_scope1 = (scope1_result['total_emissions_kgco2e'] +
                       scope1_fleet['total_emissions_kgco2e'])
        total_scope2 = scope2_result['total_emissions_kgco2e']
        total_scope3 = (scope3_transport['total_emissions_kgco2e'] +
                       scope3_materials['total_emissions_kgco2e'])

        total_emissions = total_scope1 + total_scope2 + total_scope3

        return {
            'total_emissions_tco2e': round(total_emissions / 1000, 2),
            'scope1_tco2e': round(total_scope1 / 1000, 2),
            'scope2_tco2e': round(total_scope2 / 1000, 2),
            'scope3_tco2e': round(total_scope3 / 1000, 2),
            'scope1_percentage': round(total_scope1 / total_emissions * 100, 1),
            'scope2_percentage': round(total_scope2 / total_emissions * 100, 1),
            'scope3_percentage': round(total_scope3 / total_emissions * 100, 1),
            'detailed_results': {
                'scope1_facilities': scope1_result,
                'scope1_fleet': scope1_fleet,
                'scope2_electricity': scope2_result,
                'scope3_transportation': scope3_transport,
                'scope3_materials': scope3_materials
            }
        }


# Example usage
calculator = CarbonFootprintCalculator()

# Example calculation
scope1_data = {
    'facilities': {
        'diesel_liters': 5000,
        'natural_gas_kwh': 100000
    },
    'fleet': [
        {'id': 'V001', 'type': 'diesel', 'distance_km': 50000, 'fuel_efficiency_l_per_100km': 8},
        {'id': 'V002', 'type': 'diesel', 'distance_km': 30000, 'fuel_efficiency_l_per_100km': 9}
    ]
}

scope2_data = {
    'electricity_kwh': 500000,
    'region': 'us',
    'renewable_pct': 0.20  # 20% renewable
}

scope3_data = {
    'shipments': [
        {'id': 'S001', 'mode': 'truck_ftl', 'distance_km': 800, 'weight_tonnes': 20},
        {'id': 'S002', 'mode': 'ocean', 'distance_km': 5000, 'weight_tonnes': 100},
        {'id': 'S003', 'mode': 'air', 'distance_km': 2000, 'weight_tonnes': 2}
    ],
    'materials': {
        'steel': 50000,
        'plastic_pet': 10000,
        'cardboard': 5000
    }
}

results = calculator.calculate_emissions_by_scope(scope1_data, scope2_data, scope3_data)

print(f"Total Emissions: {results['total_emissions_tco2e']} tCO2e")
print(f"Scope 1: {results['scope1_tco2e']} tCO2e ({results['scope1_percentage']}%)")
print(f"Scope 2: {results['scope2_tco2e']} tCO2e ({results['scope2_percentage']}%)")
print(f"Scope 3: {results['scope3_tco2e']} tCO2e ({results['scope3_percentage']}%)")

サプライヤー排出量の追跡

一次データの収集
class SupplierEmissionsTracker:
    """Track and manage supplier carbon footprint data"""

    def __init__(self):
        self.suppliers = {}
        self.data_quality_tiers = {
            'tier1_primary': 1.0,      # Supplier-specific verified data
            'tier2_secondary': 0.8,    # Industry averages
            'tier3_estimated': 0.5     # Spend-based estimates
        }

    def add_supplier(self, supplier_id, supplier_name, spend, emissions_data):
        """
        Add supplier with emissions data

        emissions_data: dict with emissions info and data quality
        """
        self.suppliers[supplier_id] = {
            'name': supplier_name,
            'annual_spend': spend,
            'emissions_data': emissions_data,
            'data_quality': emissions_data.get('data_quality', 'tier3_estimated'),
            'last_updated': pd.Timestamp.now()
        }

    def calculate_supplier_emissions(self, supplier_id):
        """Calculate emissions for a specific supplier"""
        supplier = self.suppliers[supplier_id]
        emissions_data = supplier['emissions_data']

        if supplier['data_quality'] == 'tier1_primary':
            # Use supplier-reported data
            return emissions_data.get('reported_emissions_tco2e', 0)

        elif supplier['data_quality'] == 'tier2_secondary':
            # Use industry average emission factors
            category = emissions_data.get('category', 'general_manufacturing')
            revenue = emissions_data.get('revenue', 1000000)

            # Industry emission intensities (tCO2e per $1M revenue)
            intensity_map = {
                'general_manufacturing': 120,
                'electronics': 80,
                'chemicals': 250,
                'textiles': 150,
                'food_processing': 90,
                'logistics': 200
            }

            intensity = intensity_map.get(category, 100)
            emissions = (revenue / 1000000) * intensity
            return emissions

        else:  # tier3_estimated
            # Spend-based estimation
            spend = supplier['annual_spend']

            # Average emission factor: tCO2e per $1000 spend
            spend_emission_factor = 0.5

            emissions = (spend / 1000) * spend_emission_factor
            return emissions

    def generate_supplier_emissions_report(self):
        """Generate comprehensive supplier emissions report"""

        report_data = []

        for supplier_id, supplier in self.suppliers.items():
            emissions = self.calculate_supplier_emissions(supplier_id)

            data_quality = supplier['data_quality']
            quality_score = self.data_quality_tiers[data_quality]

            report_data.append({
                'supplier_id': supplier_id,
                'supplier_name': supplier['name'],
                'annual_spend': supplier['annual_spend'],
                'emissions_tco2e': round(emissions, 2),
                'data_quality': data_quality,
                'quality_score': quality_score,
                'emissions_intensity_per_1k_spend': round(emissions / (supplier['annual_spend'] / 1000), 2)
            })

        df = pd.DataFrame(report_data)

        # Sort by emissions descending
        df = df.sort_values('emissions_tco2e', ascending=False)

        # Calculate cumulative percentage
        total_emissions = df['emissions_tco2e'].sum()
        df['cumulative_pct'] = df['emissions_tco2e'].cumsum() / total_emissions * 100

        # Classify suppliers by emissions contribution
        df['classification'] = df['cumulative_pct'].apply(
            lambda x: 'A (High)' if x <= 80 else ('B (Medium)' if x <= 95 else 'C (Low)')
        )

        return df

    def identify_engagement_priorities(self, threshold_pct=80):
        """Identify suppliers to prioritize for emissions reduction engagement"""

        df = self.generate_supplier_emissions_report()

        # Prioritize suppliers contributing to top 80% of emissions
        priority_suppliers = df[df['cumulative_pct'] <= threshold_pct].copy()

        # Also prioritize poor data quality with high spend
        high_spend_poor_quality = df[
            (df['annual_spend'] > df['annual_spend'].quantile(0.75)) &
            (df['quality_score'] < 0.7)
        ]

        # Combine
        priority_list = pd.concat([priority_suppliers, high_spend_poor_quality]).drop_duplicates()

        return priority_list.sort_values('emissions_tco2e', ascending=False)


# Example usage
tracker = SupplierEmissionsTracker()

# Add suppliers
tracker.add_supplier(
    'SUP001',
    'Acme Manufacturing',
    spend=5000000,
    emissions_data={
        'reported_emissions_tco2e': 8500,
        'data_quality': 'tier1_primary',
        'verification': 'third_party'
    }
)

tracker.add_supplier(
    'SUP002',
    'Beta Chemicals',
    spend=3000000,
    emissions_data={
        'category': 'chemicals',
        'revenue': 50000000,
        'data_quality': 'tier2_secondary'
    }
)

tracker.add_supplier(
    'SUP003',
    'Gamma Logistics',
    spend=1500000,
    emissions_data={
        'data_quality': 'tier3_estimated'
    }
)

# Generate report
report = tracker.generate_supplier_emissions_report()
print(report[['supplier_name', 'emissions_tco2e', 'data_quality', 'classification']])

# Identify priorities
priorities = tracker.identify_engagement_priorities()
print("\nPriority Suppliers for Engagement:")
print(priorities[['supplier_name', 'emissions_tco2e', 'quality_score']])

カーボン削減戦略

削減機会の分析
class CarbonReductionPlanner:
    """Identify and prioritize carbon reduction opportunities"""

    def __init__(self, baseline_emissions):
        self.baseline_emissions = baseline_emissions
        self.reduction_initiatives = []

    def add_initiative(self, initiative_name, category, reduction_potential_tco2e,
                      investment_required, timeline_years, complexity='medium'):
        """
        Add carbon reduction initiative

        complexity: 'low', 'medium', 'high'
        """

        # Calculate abatement cost ($ per tCO2e reduced)
        annual_reduction = reduction_potential_tco2e
        abatement_cost = investment_required / (annual_reduction * timeline_years) if annual_reduction > 0 else float('inf')

        self.reduction_initiatives.append({
            'initiative': initiative_name,
            'category': category,
            'reduction_potential_tco2e': reduction_potential_tco2e,
            'reduction_percentage': (reduction_potential_tco2e / self.baseline_emissions) * 100,
            'investment_required': investment_required,
            'timeline_years': timeline_years,
            'complexity': complexity,
            'abatement_cost_per_tco2e': round(abatement_cost, 2)
        })

    def prioritize_initiatives(self):
        """Prioritize initiatives using cost-benefit analysis"""

        df = pd.DataFrame(self.reduction_initiatives)

        # Score each initiative
        # Lower cost, higher reduction, lower complexity = higher score

        # Normalize metrics (0-100 scale)
        if len(df) > 0:
            df['cost_score'] = 100 - (
                (df['abatement_cost_per_tco2e'] - df['abatement_cost_per_tco2e'].min()) /
                (df['abatement_cost_per_tco2e'].max() - df['abatement_cost_per_tco2e'].min() + 0.01) * 100
            )

            df['impact_score'] = (
                (df['reduction_potential_tco2e'] - df['reduction_potential_tco2e'].min()) /
                (df['reduction_potential_tco2e'].max() - df['reduction_potential_tco2e'].min() + 0.01) * 100
            )

            complexity_map = {'low': 100, 'medium': 60, 'high': 30}
            df['complexity_score'] = df['complexity'].map(complexity_map)

            # Overall priority score (weighted)
            df['priority_score'] = (
                df['impact_score'] * 0.4 +
                df['cost_score'] * 0.35 +
                df['complexity_score'] * 0.25
            )

            # Classify priority
            df['priority'] = pd.cut(
                df['priority_score'],
                bins=[0, 40, 70, 100],
                labels=['Low', 'Medium', 'High']
            )

            df = df.sort_values('priority_score', ascending=False)

        return df

    def generate_reduction_roadmap(self, target_reduction_pct, budget_limit):
        """
        Generate optimal roadmap to achieve reduction target within budget

        Uses greedy algorithm to select best initiatives
        """

        df = self.prioritize_initiatives()

        # Sort by priority score
        df = df.sort_values('priority_score', ascending=False)

        target_reduction_tco2e = self.baseline_emissions * (target_reduction_pct / 100)

        selected_initiatives = []
        total_reduction = 0
        total_investment = 0

        for idx, initiative in df.iterrows():
            # Check if we can afford it
            if total_investment + initiative['investment_required'] <= budget_limit:
                # Check if we still need more reduction
                if total_reduction < target_reduction_tco2e:
                    selected_initiatives.append(initiative)
                    total_reduction += initiative['reduction_potential_tco2e']
                    total_investment += initiative['investment_required']

        achievement_pct = (total_reduction / self.baseline_emissions) * 100

        return {
            'selected_initiatives': pd.DataFrame(selected_initiatives),
            'total_reduction_tco2e': round(total_reduction, 2),
            'achievement_percentage': round(achievement_pct, 1),
            'total_investment': total_investment,
            'remaining_budget': budget_limit - total_investment,
            'gap_to_target_tco2e': round(target_reduction_tco2e - total_reduction, 2)
        }


# Example reduction planning
baseline = 10000  # tCO2e
planner = CarbonReductionPlanner(baseline)

# Add various initiatives
planner.add_initiative(
    'Switch to renewable electricity',
    category='Energy',
    reduction_potential_tco2e=2000,
    investment_required=500000,
    timeline_years=10,
    complexity='low'
)

planner.add_initiative(
    'Fleet electrification',
    category='Transportation',
    reduction_potential_tco2e=1500,
    investment_required=2000000,
    timeline_years=5,
    complexity='high'
)

planner.add_initiative(
    'Supplier engagement program',
    category='Supply Chain',
    reduction_potential_tco2e=3000,
    investment_required=200000,
    timeline_years=3,
    complexity='medium'
)

planner.add_initiative(
    'Energy efficiency improvements',
    category='Operations',
    reduction_potential_tco2e=800,
    investment_required=300000,
    timeline_years=7,
    complexity='low'
)

planner.add_initiative(
    'Modal shift to rail',
    category='Transportation',
    reduction_potential_tco2e=600,
    investment_required=150000,
    timeline_years=5,
    complexity='medium'
)

# Prioritize all initiatives
priorities = planner.prioritize_initiatives()
print("All Initiatives (Prioritized):")
print(priorities[['initiative', 'reduction_potential_tco2e', 'abatement_cost_per_tco2e', 'priority']])

# Generate roadmap
roadmap = planner.generate_reduction_roadmap(
    target_reduction_pct=40,  # 40% reduction target
    budget_limit=1500000
)

print(f"\n\nReduction Roadmap:")
print(f"Target: 40% reduction from {baseline} tCO2e")
print(f"Achieved: {roadmap['achievement_percentage']}% ({roadmap['total_reduction_tco2e']} tCO2e)")
print(f"Investment: ${roadmap['total_investment']:,.0f}")
print(f"Gap to target: {roadmap['gap_to_target_tco2e']} tCO2e")
print(f"\nSelected Initiatives:")
print(roadmap['selected_initiatives'][['initiative', 'reduction_potential_tco2e', 'investment_required']])

ツールとライブラリ

Python ライブラリ

カーボン計算:

  • pandas:データの操作と分析
  • numpy:数値計算
  • scipy:統計分析

データ収集:

  • requests:排出係数の API 統合
  • beautifulsoup4:データの Web スクレイピング
  • sqlalchemy:データベース管理

可視化:

  • matplotlib、seaborn:排出量のグラフ
  • plotly:インタラクティブなダッシュボード
  • folium:地理的な排出量マップ

専門ツール:

  • brightway2:ライフサイクルアセスメント(LCA)
  • openLCA:オープンソースの LCA フレームワーク
  • carbon-footprint:カーボン計算ユーティリティ
商用ソフトウェア

炭素会計プラットフォーム:

  • Watershed:企業向け炭素会計
  • Persefoni:気候管理と会計
  • Plan A:炭素管理プラットフォーム
  • Normative:企業向け炭素会計
  • Sweep:炭素の測定と削減
  • CarbonChain:サプライチェーンの炭素追跡

サステナビリティプラットフォーム:

  • SAP Product Footprint Management:製品単位の炭素排出量
  • Enablon:ESGとサステナビリティ管理
  • Sphera:サステナビリティパフォーマンス管理
  • thinkstep (Sphera):LCA ソフトウェア

レポートプラットフォーム:

  • Workiva:ESG レポート
  • Emitwise:炭素会計とレポート
  • FigBytes:ネットゼロ計画
排出係数データベース
  • EPA Emission Factors:米国 EPA のデータ
  • DEFRA:英国政府の換算係数
  • Ecoinvent:グローバル LCA データベース
  • GHG Protocol:算定ツールとガイダンス
  • Carbon Trust:カーボンフットプリントツール
  • GLEC Framework:物流の排出量

よくある課題と解決策

課題:スコープ 3 データの収集

問題:

  • サプライヤーが排出量データの共有に消極的
  • データ品質に一貫性がない
  • Tier 1 サプライヤーを超える範囲の可視性が限られている

解決策:

  • 段階的なデータ品質の改善(支出ベース → 業界平均 → 一次データ)
  • インセンティブを設けたサプライヤーエンゲージメントプログラム
  • 業界横断の共同イニシアチブ
  • サードパーティのデータプロバイダー(CDP Supply Chain、EcoVadis)
  • 排出量の開示に関する契約上の要件
  • サプライヤー向けの標準化されたテンプレートとツール
課題:排出係数の選定

問題:

  • 複数の排出係数ソースが利用可能
  • 地域別係数とグローバル係数
  • 算定における不確実性
  • 係数を最新の状態に保つこと

解決策:

  • 方法論と係数のソースを文書化する
  • 利用可能な最も具体的な係数を使用する(サプライヤー固有 > 業界別 > 汎用)
  • 傾向分析のため、経時的な一貫性を保つ
  • 係数を毎年見直して更新する
  • 主要な前提条件について感度分析を行う
  • GHG Protocol のガイダンスに従う
課題:データの品質と完全性

問題:

  • 活動データが欠落している
  • データ形式に一貫性がない
  • データ収集の自動化が不足している
  • 手作業のプロセスでエラーが発生しやすい

解決策:

  • データガバナンスのフレームワークを導入する
  • 可能な場合はデータ収集を自動化する
  • ERP、TMS、WMS システムと統合する
  • 定期的にデータ品質を監査する
  • 欠落を推定方法で補う(前提条件を文書化する)
  • 重要な排出源のデータ収集を優先する
課題:ベースラインの設定

問題:

  • 過去のデータを入手できない
  • 事業の変化(買収、事業売却)
  • 基準年の選定
  • 再計算のトリガー

解決策:

  • データ品質が最も高い年を基準年に選ぶ
  • ベースラインの範囲を明確に文書化する
  • 再計算ポリシーを定める(通常、5%を超える変化があれば再計算する)
  • 絶対量と原単位の指標を両方追跡する
  • 正規化した指標を使用する(売上高あたり、製品生産量あたり)
課題:削減効果の帰属

問題:

  • 個別の取り組みの影響を測定することが難しい
  • 事業の成長と効率改善の区別
  • 外部要因(電力網の脱炭素化)

解決策:

  • 原単位の指標を追跡する(製品生産量あたりの排出量)
  • 測定・検証(M&V)プロトコルを整備する
  • 可能な場合は対照群を使用する
  • ベースラインと変化を慎重に文書化する
  • 自然減と事業の変化を区別する
  • 明確な KPI を設定し、定期的に進捗を確認する
課題:コストと精度のバランス

問題:

  • 完璧な測定にはコストがかかる
  • データ品質向上の効果は逓減する
  • リソースが限られている

解決策:

  • 重要性の原則を適用する(重要な排出源に重点を置く)
  • 段階的なアプローチを採用する(スコープ 1 と 2 は詳細に、一部のスコープ 3 は推定する)
  • 最大の排出源についてデータ品質を優先する
  • 少量の排出源については推定を許容する
  • データ品質の評価を文書化する
  • 時間をかけて継続的に改善する

出力形式

カーボンフットプリントレポート

エグゼクティブサマリー:

  • カーボンフットプリントの合計(tCO2e)
  • 前年比の変化
  • 削減目標に対する進捗
  • 主な排出源
  • 主要な取り組みとその効果

スコープ別排出量インベントリ:

スコープカテゴリー排出量(tCO2e)合計に占める割合前年比
スコープ1施設8508.5%-5%
スコープ1車両1,20012.0%-2%
スコープ2電力1,50015.0%-12%
スコープ3購入商品4,20042.0%+3%
スコープ3輸送1,80018.0%-8%
スコープ3その他4504.5%-1%
合計10,000100%-3%

事業部門別排出量:

事業部門排出量(tCO2e)排出原単位(tCO2e/売上$M)目標状況
製造5,500220200遅延
流通2,800180190順調
小売1,7008590前倒し

サプライヤー排出量:

サプライヤー支出($M)排出量(tCO2e)データ品質優先度
サプライヤー A5.02,100一次データA
サプライヤー B3.51,800業界平均A
サプライヤー C2.0300推定値B

削減の取り組み:

取り組み状況削減量(tCO2e/年)投資額スケジュールROI
再生可能エネルギー導入済み1,200$500K完了4.2年
車両の最適化実施中400$150K2026年第3四半期2.8年
サプライヤープログラム計画中800$200K2027年未定

データ品質評価:

スコープカバー率一次データの割合推定値の割合品質スコア
スコープ1100%100%0%高
スコープ2100%95%5%高
スコープ385%30%70%中

質問事項

さらに詳しい情報が必要な場合:

  1. カーボン排出量の追跡を始めた目的は何ですか?(報告、削減、コンプライアンス)
  2. どの排出スコープを測定する必要がありますか?(スコープ1、2、3、または特定のカテゴリー)
  3. 現在、どのようなデータを利用できますか?(エネルギー料金の請求書、輸送記録、サプライヤーデータ)
  4. 既存のカーボン削減目標やコミットメントはありますか?
  5. どの報告フレームワークに準拠する必要がありますか?(GHG Protocol、CDP、GRI、TCFD)
  6. 組織の境界はどのように定められていますか?(拠点、事業部門、地理的地域)
  7. 製品レベルのカーボンフットプリント算定は必要ですか?
  8. 望ましいデータ品質と精度の水準はどの程度ですか?
  9. 検証または保証に関する要件はありますか?
  10. どのようなシステムを使用していますか?(ERP、TMS、エネルギー管理システム)

関連スキル

  • circular-economy:クローズドループや廃棄物削減の戦略向け
  • sustainable-sourcing:環境に配慮した調達向け
  • compliance-management:規制要件と報告向け
  • risk-mitigation:気候関連のサプライチェーンリスク向け
  • supplier-selection:調達におけるカーボン基準の導入向け
  • network-design:排出量削減に向けたサプライチェーン構成の最適化向け
  • route-optimization:輸送時の排出量削減向け
  • demand-forecasting:廃棄物を最小限に抑えるための正確な生産計画向け

コメント